mirror of https://github.com/Wilfred/difftastic/
Unvendor tree-sitter-sfapex parser
parent
63cfdd2f82
commit
7cc43998a7
@ -1,302 +0,0 @@
|
|||||||
;; attempting to match concepts represented here:
|
|
||||||
;; https://code.visualstudio.com/api/language-extensions/semantic-highlight-guide
|
|
||||||
|
|
||||||
[
|
|
||||||
"["
|
|
||||||
"]"
|
|
||||||
"{"
|
|
||||||
"}"
|
|
||||||
"?"
|
|
||||||
";"
|
|
||||||
] @punctuation
|
|
||||||
|
|
||||||
;; Methods
|
|
||||||
|
|
||||||
(method_declaration
|
|
||||||
name: (identifier) @method)
|
|
||||||
(method_declaration
|
|
||||||
type: (type_identifier) @type)
|
|
||||||
|
|
||||||
(method_invocation
|
|
||||||
name: (identifier) @method)
|
|
||||||
(argument_list
|
|
||||||
(identifier) @variable)
|
|
||||||
(super) @function.defaultLibrary
|
|
||||||
|
|
||||||
(explicit_constructor_invocation
|
|
||||||
arguments: (argument_list
|
|
||||||
(identifier) @variable ))
|
|
||||||
|
|
||||||
;; Annotations
|
|
||||||
|
|
||||||
(annotation
|
|
||||||
name: (identifier) @decorator)
|
|
||||||
|
|
||||||
"@" @operator
|
|
||||||
|
|
||||||
(annotation_key_value
|
|
||||||
(identifier) @variable)
|
|
||||||
|
|
||||||
|
|
||||||
;; Types
|
|
||||||
|
|
||||||
(interface_declaration
|
|
||||||
name: (identifier) @interface)
|
|
||||||
(class_declaration
|
|
||||||
name: (identifier) @class)
|
|
||||||
(class_declaration
|
|
||||||
(superclass) @class)
|
|
||||||
(enum_declaration
|
|
||||||
name: (identifier) @enum)
|
|
||||||
(enum_constant
|
|
||||||
name: (identifier) @enumMember)
|
|
||||||
|
|
||||||
(interfaces
|
|
||||||
(type_list
|
|
||||||
(type_identifier) @interface ))
|
|
||||||
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier) @type )
|
|
||||||
|
|
||||||
( expression_statement (_ (identifier)) @variable)
|
|
||||||
|
|
||||||
(type_arguments "<" @punctuation)
|
|
||||||
(type_arguments ">" @punctuation)
|
|
||||||
|
|
||||||
; (identifier) @variable
|
|
||||||
|
|
||||||
((field_access
|
|
||||||
object: (identifier) @type)) ;; don't know what type of thing it is
|
|
||||||
|
|
||||||
(generic_type
|
|
||||||
(type_identifier) @type)
|
|
||||||
(type_arguments (type_identifier) @type)
|
|
||||||
|
|
||||||
(field_access
|
|
||||||
field: (identifier) @property)
|
|
||||||
|
|
||||||
((scoped_identifier
|
|
||||||
scope: (identifier) @type)
|
|
||||||
(#match? @type "^[A-Z]"))
|
|
||||||
((method_invocation
|
|
||||||
object: (identifier) @type)
|
|
||||||
(#match? @type "^[A-Z]"))
|
|
||||||
|
|
||||||
|
|
||||||
(field_declaration
|
|
||||||
type: (type_identifier) @type)
|
|
||||||
|
|
||||||
(method_declaration
|
|
||||||
(formal_parameters
|
|
||||||
(formal_parameter
|
|
||||||
name: (identifier) @parameter)))
|
|
||||||
|
|
||||||
(formal_parameter
|
|
||||||
type: (type_identifier) @type
|
|
||||||
(identifier) @variable)
|
|
||||||
|
|
||||||
(enhanced_for_statement
|
|
||||||
type: (type_identifier) @type
|
|
||||||
name: (identifier) @variable )
|
|
||||||
|
|
||||||
(enhanced_for_statement
|
|
||||||
value: (identifier) @variable)
|
|
||||||
|
|
||||||
(enhanced_for_statement
|
|
||||||
name: (identifier) @variable)
|
|
||||||
|
|
||||||
(object_creation_expression
|
|
||||||
type: (type_identifier) @type)
|
|
||||||
|
|
||||||
(array_creation_expression
|
|
||||||
type: (type_identifier) @type)
|
|
||||||
|
|
||||||
(array_type
|
|
||||||
element: (type_identifier) @type)
|
|
||||||
|
|
||||||
(catch_formal_parameter
|
|
||||||
(type_identifier) @type
|
|
||||||
name: (identifier) @variable)
|
|
||||||
|
|
||||||
(return_statement
|
|
||||||
(identifier) @variable)
|
|
||||||
|
|
||||||
(local_variable_declaration
|
|
||||||
(variable_declarator
|
|
||||||
name: (identifier) @variable ))
|
|
||||||
|
|
||||||
(for_statement
|
|
||||||
condition: (binary_expression
|
|
||||||
(identifier) @variable))
|
|
||||||
|
|
||||||
(for_statement
|
|
||||||
update: (update_expression
|
|
||||||
(identifier) @variable))
|
|
||||||
|
|
||||||
(constructor_declaration
|
|
||||||
name: (identifier) @class)
|
|
||||||
|
|
||||||
(dml_type) @function.defaultLibrary
|
|
||||||
|
|
||||||
(bound_apex_expression
|
|
||||||
(identifier) @variable)
|
|
||||||
|
|
||||||
(assignment_operator) @operator
|
|
||||||
|
|
||||||
(update_expression ["++" "--"] @operator)
|
|
||||||
|
|
||||||
(instanceof_expression
|
|
||||||
left: (identifier) @variable
|
|
||||||
right: (type_identifier) @type )
|
|
||||||
|
|
||||||
(cast_expression
|
|
||||||
type: (type_identifier) @type
|
|
||||||
value: (identifier) @variable)
|
|
||||||
|
|
||||||
(switch_expression
|
|
||||||
condition: (identifier) @variable)
|
|
||||||
|
|
||||||
(switch_label
|
|
||||||
(type_identifier) @type
|
|
||||||
(identifier) @variable )
|
|
||||||
|
|
||||||
(switch_rule
|
|
||||||
(switch_label
|
|
||||||
(identifier) @enumMember ))
|
|
||||||
|
|
||||||
(trigger_declaration
|
|
||||||
name: (identifier) @type
|
|
||||||
object: (identifier) @type
|
|
||||||
(trigger_event) @keyword
|
|
||||||
("," (trigger_event) @keyword)*)
|
|
||||||
|
|
||||||
(binary_expression
|
|
||||||
operator: [
|
|
||||||
">"
|
|
||||||
"<"
|
|
||||||
">="
|
|
||||||
"<="
|
|
||||||
"=="
|
|
||||||
"==="
|
|
||||||
"!="
|
|
||||||
"!=="
|
|
||||||
"&&"
|
|
||||||
"||"
|
|
||||||
"+"
|
|
||||||
"-"
|
|
||||||
"*"
|
|
||||||
"/"
|
|
||||||
"&"
|
|
||||||
"|"
|
|
||||||
"^"
|
|
||||||
"%"
|
|
||||||
"<<"
|
|
||||||
">>"
|
|
||||||
">>>"] @operator)
|
|
||||||
|
|
||||||
(binary_expression
|
|
||||||
(identifier) @variable)
|
|
||||||
|
|
||||||
(unary_expression
|
|
||||||
operator: [
|
|
||||||
"+"
|
|
||||||
"-"
|
|
||||||
"!"
|
|
||||||
"~"
|
|
||||||
]) @operator
|
|
||||||
|
|
||||||
(map_initializer "=>" @operator)
|
|
||||||
|
|
||||||
[
|
|
||||||
(boolean_type)
|
|
||||||
(void_type)
|
|
||||||
] @type.defaultLibrary
|
|
||||||
|
|
||||||
; Variables
|
|
||||||
|
|
||||||
(field_declaration
|
|
||||||
(modifiers (modifier ["final" "static"])(modifier ["final" "static"]))
|
|
||||||
(variable_declarator
|
|
||||||
name: (identifier) @variable.readonly))
|
|
||||||
|
|
||||||
(variable_declarator
|
|
||||||
(identifier) @property)
|
|
||||||
|
|
||||||
;; because itendifying it when declared doesn't carry to use
|
|
||||||
;; leans on the convention that "screaming snake case" is a const
|
|
||||||
((identifier) @variable.readonly
|
|
||||||
(#match? @variable.readonly "^_*[A-Z][A-Z\\d_]+$"))
|
|
||||||
|
|
||||||
|
|
||||||
(this) @variable.defaultLibrary
|
|
||||||
|
|
||||||
; Literals
|
|
||||||
|
|
||||||
[
|
|
||||||
(int)
|
|
||||||
] @number
|
|
||||||
|
|
||||||
[
|
|
||||||
(string_literal)
|
|
||||||
] @string
|
|
||||||
|
|
||||||
[
|
|
||||||
(line_comment)
|
|
||||||
(block_comment)
|
|
||||||
] @comment
|
|
||||||
|
|
||||||
;; ;; Keywords
|
|
||||||
|
|
||||||
[
|
|
||||||
"abstract"
|
|
||||||
"break"
|
|
||||||
"catch"
|
|
||||||
"class"
|
|
||||||
"continue"
|
|
||||||
"default"
|
|
||||||
"do"
|
|
||||||
"else"
|
|
||||||
"enum"
|
|
||||||
"extends"
|
|
||||||
"final"
|
|
||||||
"finally"
|
|
||||||
"for"
|
|
||||||
"get"
|
|
||||||
"global"
|
|
||||||
"if"
|
|
||||||
"implements"
|
|
||||||
"instanceof"
|
|
||||||
"interface"
|
|
||||||
"new"
|
|
||||||
"on"
|
|
||||||
"private"
|
|
||||||
"protected"
|
|
||||||
"public"
|
|
||||||
"return"
|
|
||||||
"set"
|
|
||||||
"static"
|
|
||||||
"switch"
|
|
||||||
"testMethod"
|
|
||||||
"throw"
|
|
||||||
"transient"
|
|
||||||
"try"
|
|
||||||
"trigger"
|
|
||||||
"virtual"
|
|
||||||
"when"
|
|
||||||
"while"
|
|
||||||
"with_sharing"
|
|
||||||
"without_sharing"
|
|
||||||
"inherited_sharing"
|
|
||||||
] @keyword
|
|
||||||
|
|
||||||
(assignment_expression
|
|
||||||
left: (identifier) @variable)
|
|
||||||
|
|
||||||
; (type_identifier) @type ;; not respecting precedence...
|
|
||||||
;; I don't love this but couldn't break them up right now
|
|
||||||
;; can't figure out how to let that be special without conflicting
|
|
||||||
;; in the grammar
|
|
||||||
"System.runAs" @method.defaultLibrary
|
|
||||||
|
|
||||||
(scoped_type_identifier
|
|
||||||
(type_identifier) @type)
|
|
||||||
@ -1 +0,0 @@
|
|||||||
tree-sitter-sfapex/apex/src
|
|
||||||
@ -1,64 +0,0 @@
|
|||||||
# https://github.com/TryGhost/node-sqlite3/blob/master/.github/workflows/ci.yml
|
|
||||||
name: CI
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- "*"
|
|
||||||
env:
|
|
||||||
FORCE_COLOR: 1
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
os:
|
|
||||||
- macos-latest
|
|
||||||
- ubuntu-latest
|
|
||||||
- windows-latest
|
|
||||||
host:
|
|
||||||
- x64
|
|
||||||
target:
|
|
||||||
- x64
|
|
||||||
node:
|
|
||||||
- 14
|
|
||||||
- 16
|
|
||||||
- 18
|
|
||||||
# include:
|
|
||||||
# - os: macos-m1
|
|
||||||
# node: 16
|
|
||||||
# host: arm64
|
|
||||||
# target: arm64
|
|
||||||
name: ${{ matrix.os }} (node=${{ matrix.node }}, host=${{ matrix.host }}, target=${{ matrix.target }})
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
node-version: ${{ matrix.node }}
|
|
||||||
architecture: ${{ matrix.host }}
|
|
||||||
|
|
||||||
- name: Npm install tree-sitter
|
|
||||||
run: |
|
|
||||||
npm i tree-sitter
|
|
||||||
- name: Tree-sitter build
|
|
||||||
run: |
|
|
||||||
npm run build
|
|
||||||
- name: Npm install/compile
|
|
||||||
run: |
|
|
||||||
npm install
|
|
||||||
|
|
||||||
- name: Configure build
|
|
||||||
run: npx node-pre-gyp configure --target_arch=${{ matrix.target }}
|
|
||||||
|
|
||||||
- name: Build binaries
|
|
||||||
run: npx node-pre-gyp build --target_arch=${{ matrix.target }}
|
|
||||||
|
|
||||||
- name: Package prebuilt binaries
|
|
||||||
run: npx node-pre-gyp package --target_arch=${{ matrix.target }}
|
|
||||||
|
|
||||||
- name: Upload binaries to GitHub Release
|
|
||||||
run: node ./scripts/ghPublish.mjs
|
|
||||||
if: startsWith(github.ref, 'refs/tags/')
|
|
||||||
env:
|
|
||||||
NODE_PRE_GYP_GITHUB_TOKEN: ${{ github.token }}
|
|
||||||
@ -1,37 +0,0 @@
|
|||||||
name: Test full
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
- name: Use Node.js
|
|
||||||
uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
node-version: 16
|
|
||||||
- name: Npm install tree-sitter
|
|
||||||
run: |
|
|
||||||
npm i tree-sitter
|
|
||||||
- name: Tree-sitter build
|
|
||||||
run: |
|
|
||||||
npm run build
|
|
||||||
- name: Npm install/compile
|
|
||||||
run: |
|
|
||||||
npm install
|
|
||||||
- name: Unit tests
|
|
||||||
run: |
|
|
||||||
npm test
|
|
||||||
@ -1,22 +0,0 @@
|
|||||||
Cargo.lock
|
|
||||||
node_modules
|
|
||||||
.node-version
|
|
||||||
target
|
|
||||||
build
|
|
||||||
*.log
|
|
||||||
/test.ts
|
|
||||||
examples/desktop
|
|
||||||
examples/redux
|
|
||||||
examples/vscode
|
|
||||||
log.html
|
|
||||||
|
|
||||||
# These files would be generated by 'tree-sitter generate' with the default
|
|
||||||
# settings. We don't want them because there's already a copy at the root.
|
|
||||||
# discarding generated files as they will be rebuilt as needed (will be added back by installer)
|
|
||||||
*.wasm
|
|
||||||
/*/Cargo.toml
|
|
||||||
/*/binding.gyp
|
|
||||||
/*/bindings
|
|
||||||
**/parser.exp
|
|
||||||
**/parser.lib
|
|
||||||
**/parser.obj
|
|
||||||
@ -1,26 +0,0 @@
|
|||||||
[package]
|
|
||||||
name = "tree-sitter-apex"
|
|
||||||
description = "apex grammar for the tree-sitter parsing library"
|
|
||||||
version = "0.0.1"
|
|
||||||
keywords = ["incremental", "parsing", "apex"]
|
|
||||||
categories = ["parsing", "text-editors"]
|
|
||||||
repository = "https://github.com/aheber/tree-sitter-apex"
|
|
||||||
edition = "2018"
|
|
||||||
license = "MIT"
|
|
||||||
|
|
||||||
build = "bindings/rust/build.rs"
|
|
||||||
include = [
|
|
||||||
"bindings/rust/*",
|
|
||||||
"grammar.js",
|
|
||||||
"queries/*",
|
|
||||||
"src/*",
|
|
||||||
]
|
|
||||||
|
|
||||||
[lib]
|
|
||||||
path = "bindings/rust/lib.rs"
|
|
||||||
|
|
||||||
[dependencies]
|
|
||||||
tree-sitter = "~0.20"
|
|
||||||
|
|
||||||
[build-dependencies]
|
|
||||||
cc = "1.0"
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2012 Anthony Heber
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
@ -1,60 +0,0 @@
|
|||||||
# tree-sitter-sfapex
|
|
||||||
|
|
||||||
Salesforce grammars for [tree-sitter](https://github.com/tree-sitter/tree-sitter), including Apex, SOQL, and SOSL languages.
|
|
||||||
|
|
||||||
Try it out using our [playground](https://aheber.github.io/tree-sitter-sfapex/playground/)
|
|
||||||
|
|
||||||
If you are a Neo-vim user, the parsers and syntax highlights are part of nvim-treesitter
|
|
||||||
plugin already, [guidance](nvim-treesitter-setup.md).
|
|
||||||
|
|
||||||
## Status
|
|
||||||
|
|
||||||
Most of the parsers are built and tested on large corpus of Apex, I still intend to write automated tests that parse large Apex libraries as part of evaluating the grammar.
|
|
||||||
|
|
||||||
### Apex
|
|
||||||
|
|
||||||
- [x] grammar
|
|
||||||
- [x] grammar tests
|
|
||||||
- [x] highlighting queries
|
|
||||||
- [x] highlighting tests
|
|
||||||
- [x] tags queries
|
|
||||||
- [x] tags tests (could use more)
|
|
||||||
- [x] locals queries
|
|
||||||
- [x] locals tests (using highlighting)
|
|
||||||
|
|
||||||
### Anonymous Apex
|
|
||||||
|
|
||||||
- [ ] grammar
|
|
||||||
- [ ] grammar tests
|
|
||||||
- [ ] highlighting queries
|
|
||||||
- [ ] highlighting tests
|
|
||||||
- [ ] tags queries
|
|
||||||
- [ ] tags tests (could use more)
|
|
||||||
- [ ] locals queries
|
|
||||||
- [ ] locals tests (using highlighting)
|
|
||||||
|
|
||||||
_This won't be difficult, I just haven't tackled it yet, will largely reuse the Apex grammar with some different construction rules._
|
|
||||||
|
|
||||||
### SOQL
|
|
||||||
|
|
||||||
- [x] grammar
|
|
||||||
- [x] grammar tests
|
|
||||||
- [x] highlighting queries
|
|
||||||
- [x] highlighting tests
|
|
||||||
|
|
||||||
### SOSL
|
|
||||||
|
|
||||||
- [x] grammar
|
|
||||||
- [x] grammar tests
|
|
||||||
- [x] highlighting queries
|
|
||||||
- [x] highlighting tests
|
|
||||||
|
|
||||||
(not sure tags and locals are relevant to query grammars)
|
|
||||||
|
|
||||||
## Questions/Issues
|
|
||||||
|
|
||||||
Please open an issue on this repo and we'll work through it.
|
|
||||||
|
|
||||||
## Contributing
|
|
||||||
|
|
||||||
Still figuring this out. By far the most useful contributions would be tests, if you have a scenario that doesn't work you can just provide the example or open a PR with a new failing test and I can figure out what to do about it.
|
|
||||||
@ -1,931 +0,0 @@
|
|||||||
// Adapted from https://github.com/tree-sitter/tree-sitter-java/blob/master/grammar.js
|
|
||||||
const {
|
|
||||||
ci,
|
|
||||||
commaJoined,
|
|
||||||
commaJoined1,
|
|
||||||
joined,
|
|
||||||
} = require("../common/common.js");
|
|
||||||
|
|
||||||
const LANG = "apex";
|
|
||||||
|
|
||||||
// SOSL includes SOQL as a sub-type
|
|
||||||
const soslGrammar = require("../common/sosl-grammar.js")(LANG);
|
|
||||||
|
|
||||||
const DIGITS = token(joined(/_+/, /[0-9]+/));
|
|
||||||
const PREC = {
|
|
||||||
// https://introcs.cs.princeton.edu/java/11precedence/
|
|
||||||
COMMENT: 0, // // /* */
|
|
||||||
ASSIGN: 1, // = += -= *= /= %= &= ^= |= <<= >>= >>>=
|
|
||||||
SWITCH_EXP: 1, // always prefer to parse switch as expression over statement
|
|
||||||
DECL: 2,
|
|
||||||
ELEMENT_VAL: 2,
|
|
||||||
TERNARY: 3, // ?:
|
|
||||||
OR: 4, // ||
|
|
||||||
AND: 5, // &&
|
|
||||||
BIT_OR: 6, // |
|
|
||||||
BIT_XOR: 7, // ^
|
|
||||||
BIT_AND: 8, // &
|
|
||||||
EQUALITY: 9, // == != <>
|
|
||||||
GENERIC: 10,
|
|
||||||
REL: 10, // < <= > >= instanceof
|
|
||||||
SHIFT: 11, // << >> >>>
|
|
||||||
ADD: 12, // + -
|
|
||||||
MULT: 13, // * / %
|
|
||||||
CAST: 14, // (Type)
|
|
||||||
OBJ_INST: 14, // new
|
|
||||||
UNARY: 15, // ++a --a a++ a-- + - ! ~
|
|
||||||
ARRAY: 16, // [Index]
|
|
||||||
OBJ_ACCESS: 16, // .
|
|
||||||
PARENS: 16, // (Expression)
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = grammar({
|
|
||||||
name: LANG,
|
|
||||||
|
|
||||||
extras: ($) => [$.line_comment, $.block_comment, /\s/],
|
|
||||||
|
|
||||||
supertypes: ($) => [
|
|
||||||
$.expression,
|
|
||||||
$.declaration,
|
|
||||||
$.statement,
|
|
||||||
$.primary_expression,
|
|
||||||
$._literal,
|
|
||||||
$._type,
|
|
||||||
$._simple_type,
|
|
||||||
$._unannotated_type,
|
|
||||||
$.comment,
|
|
||||||
],
|
|
||||||
|
|
||||||
inline: ($) => [
|
|
||||||
$._name,
|
|
||||||
$._simple_type,
|
|
||||||
$._class_body_declaration,
|
|
||||||
$._variable_initializer,
|
|
||||||
],
|
|
||||||
|
|
||||||
word: ($) => $.identifier,
|
|
||||||
|
|
||||||
conflicts: ($) => [
|
|
||||||
[$._unannotated_type, $.primary_expression],
|
|
||||||
[$._unannotated_type, $.primary_expression, $.scoped_type_identifier],
|
|
||||||
[$._unannotated_type, $.scoped_type_identifier],
|
|
||||||
[$._unannotated_type, $.generic_type],
|
|
||||||
[$._unannotated_type, $.type_parameter],
|
|
||||||
[$.generic_type, $.primary_expression],
|
|
||||||
[$._property_navigation, $.explicit_constructor_invocation],
|
|
||||||
[$.field_access, $.method_invocation, $.expression],
|
|
||||||
[$.map_initializer, $.array_initializer],
|
|
||||||
[$.function_name, $.count_expression],
|
|
||||||
[$.switch_label, $.primary_expression],
|
|
||||||
],
|
|
||||||
|
|
||||||
rules: {
|
|
||||||
//////////////////////////
|
|
||||||
parser_output: ($) => repeat($.statement),
|
|
||||||
|
|
||||||
// Expressions
|
|
||||||
|
|
||||||
expression: ($) =>
|
|
||||||
choice(
|
|
||||||
$.assignment_expression,
|
|
||||||
$.binary_expression,
|
|
||||||
$.instanceof_expression,
|
|
||||||
$.ternary_expression,
|
|
||||||
$.update_expression,
|
|
||||||
$.primary_expression,
|
|
||||||
$.unary_expression,
|
|
||||||
$.cast_expression,
|
|
||||||
$.dml_expression,
|
|
||||||
prec(PREC.SWITCH_EXP, $.switch_expression)
|
|
||||||
),
|
|
||||||
|
|
||||||
soql_query: ($) => seq($.soql_query_body),
|
|
||||||
sosl_query: ($) => seq($.sosl_query_body),
|
|
||||||
|
|
||||||
query_expression: ($) => seq("[", choice($.soql_query, $.sosl_query), "]"),
|
|
||||||
dml_expression: ($) =>
|
|
||||||
prec.right(
|
|
||||||
choice(
|
|
||||||
seq($.dml_type, $.expression),
|
|
||||||
seq(
|
|
||||||
alias(ci("upsert"), $.dml_type),
|
|
||||||
$.expression,
|
|
||||||
optional($._unannotated_type)
|
|
||||||
),
|
|
||||||
seq(alias(ci("merge"), $.dml_type), $.expression, " ", $.expression)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
dml_type: ($) =>
|
|
||||||
choice(ci("insert"), ci("update"), ci("delete"), ci("undelete")),
|
|
||||||
cast_expression: ($) =>
|
|
||||||
prec(
|
|
||||||
PREC.CAST,
|
|
||||||
seq("(", field("type", $._type), ")", field("value", $.expression))
|
|
||||||
),
|
|
||||||
|
|
||||||
assignment_expression: ($) =>
|
|
||||||
prec.right(
|
|
||||||
PREC.ASSIGN,
|
|
||||||
seq(
|
|
||||||
field("left", choice($.identifier, $.field_access, $.array_access)),
|
|
||||||
field(
|
|
||||||
"operator",
|
|
||||||
alias(
|
|
||||||
choice(
|
|
||||||
"=",
|
|
||||||
"+=",
|
|
||||||
"-=",
|
|
||||||
"*=",
|
|
||||||
"/=",
|
|
||||||
"&=",
|
|
||||||
"|=",
|
|
||||||
"^=",
|
|
||||||
"%=",
|
|
||||||
"<<=",
|
|
||||||
">>=",
|
|
||||||
">>>="
|
|
||||||
),
|
|
||||||
$.assignment_operator
|
|
||||||
)
|
|
||||||
),
|
|
||||||
field("right", $.expression)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
|
|
||||||
binary_expression: ($) =>
|
|
||||||
choice(
|
|
||||||
...[
|
|
||||||
[">", PREC.REL],
|
|
||||||
["<", PREC.REL],
|
|
||||||
[">=", PREC.REL],
|
|
||||||
["<=", PREC.REL],
|
|
||||||
["==", PREC.EQUALITY],
|
|
||||||
["===", PREC.EQUALITY],
|
|
||||||
["!=", PREC.EQUALITY],
|
|
||||||
["<>", PREC.EQUALITY],
|
|
||||||
["!==", PREC.EQUALITY],
|
|
||||||
["&&", PREC.AND],
|
|
||||||
["||", PREC.OR],
|
|
||||||
["+", PREC.ADD],
|
|
||||||
["-", PREC.ADD],
|
|
||||||
["*", PREC.MULT],
|
|
||||||
["/", PREC.MULT],
|
|
||||||
["&", PREC.BIT_AND],
|
|
||||||
["|", PREC.BIT_OR],
|
|
||||||
["^", PREC.BIT_XOR],
|
|
||||||
["%", PREC.MULT],
|
|
||||||
["<<", PREC.SHIFT],
|
|
||||||
[">>", PREC.SHIFT],
|
|
||||||
[">>>", PREC.SHIFT],
|
|
||||||
].map(([operator, precedence]) =>
|
|
||||||
prec.left(
|
|
||||||
precedence,
|
|
||||||
seq(
|
|
||||||
field("left", $.expression),
|
|
||||||
field("operator", operator),
|
|
||||||
field("right", $.expression)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
|
|
||||||
instanceof_expression: ($) =>
|
|
||||||
prec(
|
|
||||||
PREC.REL,
|
|
||||||
seq(
|
|
||||||
field("left", $.expression),
|
|
||||||
ci("instanceof"),
|
|
||||||
field("right", $._type)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
|
|
||||||
inferred_parameters: ($) => seq("(", commaJoined1($.identifier), ")"),
|
|
||||||
|
|
||||||
ternary_expression: ($) =>
|
|
||||||
prec.right(
|
|
||||||
PREC.TERNARY,
|
|
||||||
seq(
|
|
||||||
field("condition", $.expression),
|
|
||||||
"?",
|
|
||||||
field("consequence", $.expression),
|
|
||||||
":",
|
|
||||||
field("alternative", $.expression)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
|
|
||||||
unary_expression: ($) =>
|
|
||||||
choice(
|
|
||||||
...[
|
|
||||||
["+", PREC.UNARY],
|
|
||||||
["-", PREC.UNARY],
|
|
||||||
["!", PREC.UNARY],
|
|
||||||
["~", PREC.UNARY],
|
|
||||||
].map(([operator, precedence]) =>
|
|
||||||
prec.left(
|
|
||||||
precedence,
|
|
||||||
seq(field("operator", operator), field("operand", $.expression))
|
|
||||||
)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
|
|
||||||
update_expression: ($) =>
|
|
||||||
prec.left(
|
|
||||||
PREC.UNARY,
|
|
||||||
choice(
|
|
||||||
// Post (in|de)crement is evaluated before pre (in|de)crement
|
|
||||||
seq($.expression, "++"),
|
|
||||||
seq($.expression, "--"),
|
|
||||||
seq("++", $.expression),
|
|
||||||
seq("--", $.expression)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
|
|
||||||
primary_expression: ($) =>
|
|
||||||
choice(
|
|
||||||
$._literal,
|
|
||||||
$.class_literal,
|
|
||||||
$.this,
|
|
||||||
$.identifier,
|
|
||||||
$.parenthesized_expression,
|
|
||||||
$.object_creation_expression,
|
|
||||||
$.field_access,
|
|
||||||
$.array_access,
|
|
||||||
$.method_invocation,
|
|
||||||
$.array_creation_expression,
|
|
||||||
$.map_creation_expression,
|
|
||||||
$.query_expression
|
|
||||||
),
|
|
||||||
|
|
||||||
array_creation_expression: ($) =>
|
|
||||||
prec.right(
|
|
||||||
seq(
|
|
||||||
ci("new"),
|
|
||||||
field("type", $._simple_type),
|
|
||||||
choice(
|
|
||||||
seq(
|
|
||||||
field("dimensions", repeat1($.dimensions_expr)),
|
|
||||||
field("dimensions", optional($.dimensions))
|
|
||||||
),
|
|
||||||
seq(
|
|
||||||
field("dimensions", $.dimensions),
|
|
||||||
field("value", $.array_initializer)
|
|
||||||
),
|
|
||||||
seq(field("value", $.array_initializer))
|
|
||||||
)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
|
|
||||||
map_creation_expression: ($) =>
|
|
||||||
prec.right(
|
|
||||||
seq(
|
|
||||||
ci("new"),
|
|
||||||
field("type", $._simple_type),
|
|
||||||
seq(field("value", $.map_initializer))
|
|
||||||
)
|
|
||||||
),
|
|
||||||
|
|
||||||
dimensions_expr: ($) => seq("[", $.expression, "]"),
|
|
||||||
|
|
||||||
parenthesized_expression: ($) => seq("(", $.expression, ")"),
|
|
||||||
|
|
||||||
class_literal: ($) => seq($._unannotated_type, ".", ci("class")),
|
|
||||||
|
|
||||||
object_creation_expression: ($) =>
|
|
||||||
$._unqualified_object_creation_expression,
|
|
||||||
|
|
||||||
_unqualified_object_creation_expression: ($) =>
|
|
||||||
prec.right(
|
|
||||||
seq(
|
|
||||||
ci("new"),
|
|
||||||
field("type_arguments", optional($.type_arguments)),
|
|
||||||
field("type", $._simple_type),
|
|
||||||
field("arguments", $.argument_list),
|
|
||||||
optional($.class_body)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
|
|
||||||
field_access: ($) =>
|
|
||||||
seq(
|
|
||||||
field("object", choice($.primary_expression, $.super)),
|
|
||||||
optional(seq($._property_navigation, $.super)),
|
|
||||||
$._property_navigation,
|
|
||||||
field("field", choice($.identifier, $.this))
|
|
||||||
),
|
|
||||||
|
|
||||||
_property_navigation: ($) => seq(optional("?"), "."),
|
|
||||||
|
|
||||||
array_access: ($) =>
|
|
||||||
seq(
|
|
||||||
field("array", $.primary_expression),
|
|
||||||
"[",
|
|
||||||
field("index", $.expression),
|
|
||||||
"]"
|
|
||||||
),
|
|
||||||
|
|
||||||
method_invocation: ($) =>
|
|
||||||
seq(
|
|
||||||
choice(
|
|
||||||
field("name", $.identifier),
|
|
||||||
seq(
|
|
||||||
field("object", choice($.primary_expression, $.super)),
|
|
||||||
$._property_navigation,
|
|
||||||
optional(seq($.super, $._property_navigation)),
|
|
||||||
field("type_arguments", optional($.type_arguments)),
|
|
||||||
field("name", $.identifier)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
field("arguments", $.argument_list)
|
|
||||||
),
|
|
||||||
|
|
||||||
argument_list: ($) => seq("(", commaJoined($.expression), ")"),
|
|
||||||
|
|
||||||
type_arguments: ($) => seq("<", commaJoined($._type), ">"),
|
|
||||||
|
|
||||||
dimensions: ($) => prec.right(repeat1(seq("[", "]"))),
|
|
||||||
|
|
||||||
switch_expression: ($) =>
|
|
||||||
seq(
|
|
||||||
ci("switch"),
|
|
||||||
ci("on"),
|
|
||||||
field("condition", $.expression),
|
|
||||||
field("body", $.switch_block)
|
|
||||||
),
|
|
||||||
|
|
||||||
switch_block: ($) => seq("{", repeat1($.switch_rule), "}"),
|
|
||||||
|
|
||||||
switch_rule: ($) => seq($.switch_label, $.block),
|
|
||||||
|
|
||||||
switch_label: ($) =>
|
|
||||||
seq(
|
|
||||||
ci("when"),
|
|
||||||
choice(
|
|
||||||
// SObject type var syntax
|
|
||||||
prec.right(
|
|
||||||
commaJoined1(seq(optional($._unannotated_type), $.identifier))
|
|
||||||
),
|
|
||||||
commaJoined1($.expression),
|
|
||||||
ci("else")
|
|
||||||
)
|
|
||||||
),
|
|
||||||
|
|
||||||
// Statements
|
|
||||||
|
|
||||||
statement: ($) =>
|
|
||||||
choice(
|
|
||||||
$.declaration,
|
|
||||||
$.expression_statement,
|
|
||||||
$.labeled_statement,
|
|
||||||
$.if_statement,
|
|
||||||
$.while_statement,
|
|
||||||
$.for_statement,
|
|
||||||
$.enhanced_for_statement,
|
|
||||||
$.block,
|
|
||||||
";",
|
|
||||||
$.do_statement,
|
|
||||||
$.break_statement,
|
|
||||||
$.continue_statement,
|
|
||||||
$.return_statement,
|
|
||||||
$.switch_expression, //switch statements and expressions are identical
|
|
||||||
$.local_variable_declaration,
|
|
||||||
$.throw_statement,
|
|
||||||
$.try_statement,
|
|
||||||
$.run_as_statement
|
|
||||||
),
|
|
||||||
|
|
||||||
block: ($) => seq("{", repeat($.statement), "}"),
|
|
||||||
|
|
||||||
expression_statement: ($) => seq($.expression, ";"),
|
|
||||||
|
|
||||||
labeled_statement: ($) => seq($.identifier, ":", $.statement),
|
|
||||||
|
|
||||||
do_statement: ($) =>
|
|
||||||
seq(
|
|
||||||
ci("do"),
|
|
||||||
field("body", $.statement),
|
|
||||||
ci("while"),
|
|
||||||
field("condition", $.parenthesized_expression),
|
|
||||||
";"
|
|
||||||
),
|
|
||||||
|
|
||||||
break_statement: ($) => seq(ci("break"), optional($.identifier), ";"),
|
|
||||||
|
|
||||||
continue_statement: ($) => seq(ci("continue"), optional($.identifier), ";"),
|
|
||||||
|
|
||||||
return_statement: ($) => seq(ci("return"), optional($.expression), ";"),
|
|
||||||
|
|
||||||
throw_statement: ($) => seq(ci("throw"), $.expression, ";"),
|
|
||||||
|
|
||||||
try_statement: ($) =>
|
|
||||||
seq(
|
|
||||||
ci("try"),
|
|
||||||
field("body", $.block),
|
|
||||||
choice(
|
|
||||||
repeat1($.catch_clause),
|
|
||||||
seq(repeat($.catch_clause), $.finally_clause)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
|
|
||||||
catch_clause: ($) =>
|
|
||||||
seq(
|
|
||||||
ci("catch"),
|
|
||||||
"(",
|
|
||||||
$.catch_formal_parameter,
|
|
||||||
")",
|
|
||||||
field("body", $.block)
|
|
||||||
),
|
|
||||||
|
|
||||||
catch_formal_parameter: ($) =>
|
|
||||||
seq(
|
|
||||||
optional($.modifiers),
|
|
||||||
$._unannotated_type,
|
|
||||||
$._variable_declarator_id
|
|
||||||
),
|
|
||||||
|
|
||||||
finally_clause: ($) => seq(ci("finally"), $.block),
|
|
||||||
|
|
||||||
if_statement: ($) =>
|
|
||||||
prec.right(
|
|
||||||
seq(
|
|
||||||
ci("if"),
|
|
||||||
field("condition", $.parenthesized_expression),
|
|
||||||
field("consequence", $.statement),
|
|
||||||
optional(seq(ci("else"), field("alternative", $.statement)))
|
|
||||||
)
|
|
||||||
),
|
|
||||||
|
|
||||||
while_statement: ($) =>
|
|
||||||
seq(
|
|
||||||
ci("while"),
|
|
||||||
field("condition", $.parenthesized_expression),
|
|
||||||
field("body", $.statement)
|
|
||||||
),
|
|
||||||
|
|
||||||
for_statement: ($) =>
|
|
||||||
seq(
|
|
||||||
ci("for"),
|
|
||||||
"(",
|
|
||||||
choice(
|
|
||||||
field("init", $.local_variable_declaration),
|
|
||||||
seq(commaJoined(field("init", $.expression)), ";")
|
|
||||||
),
|
|
||||||
field("condition", optional($.expression)),
|
|
||||||
";",
|
|
||||||
commaJoined(field("update", $.expression)),
|
|
||||||
")",
|
|
||||||
field("body", $.statement)
|
|
||||||
),
|
|
||||||
|
|
||||||
enhanced_for_statement: ($) =>
|
|
||||||
seq(
|
|
||||||
ci("for"),
|
|
||||||
"(",
|
|
||||||
optional($.modifiers),
|
|
||||||
field("type", $._unannotated_type),
|
|
||||||
$._variable_declarator_id,
|
|
||||||
":",
|
|
||||||
field("value", $.expression),
|
|
||||||
")",
|
|
||||||
field("body", $.statement)
|
|
||||||
),
|
|
||||||
|
|
||||||
run_as_statement: ($) =>
|
|
||||||
// TODO: there might be a better generic way to express this
|
|
||||||
seq(
|
|
||||||
ci("System.runAs"),
|
|
||||||
field("user", $.parenthesized_expression),
|
|
||||||
$.block
|
|
||||||
),
|
|
||||||
|
|
||||||
annotation: ($) =>
|
|
||||||
seq(
|
|
||||||
"@",
|
|
||||||
field("name", $._name),
|
|
||||||
optional(field("arguments", $.annotation_argument_list))
|
|
||||||
),
|
|
||||||
|
|
||||||
annotation_argument_list: ($) =>
|
|
||||||
seq(
|
|
||||||
"(",
|
|
||||||
choice(
|
|
||||||
field("value", $._element_value),
|
|
||||||
joined(optional(","), $.annotation_key_value)
|
|
||||||
),
|
|
||||||
")"
|
|
||||||
),
|
|
||||||
annotation_key_value: ($) =>
|
|
||||||
seq(
|
|
||||||
field("key", $.identifier),
|
|
||||||
alias("=", $.assignment_operator),
|
|
||||||
field("value", $._element_value)
|
|
||||||
),
|
|
||||||
|
|
||||||
_element_value: ($) =>
|
|
||||||
prec(
|
|
||||||
PREC.ELEMENT_VAL,
|
|
||||||
choice($.expression, $.element_value_array_initializer, $.annotation)
|
|
||||||
),
|
|
||||||
|
|
||||||
element_value_array_initializer: ($) =>
|
|
||||||
seq("{", commaJoined($._element_value), optional(","), "}"),
|
|
||||||
|
|
||||||
// Declarations
|
|
||||||
|
|
||||||
declaration: ($) =>
|
|
||||||
prec(
|
|
||||||
PREC.DECL,
|
|
||||||
choice(
|
|
||||||
$.class_declaration,
|
|
||||||
$.trigger_declaration,
|
|
||||||
$.interface_declaration,
|
|
||||||
$.enum_declaration,
|
|
||||||
$.method_declaration
|
|
||||||
)
|
|
||||||
),
|
|
||||||
|
|
||||||
enum_declaration: ($) =>
|
|
||||||
seq(
|
|
||||||
optional($.modifiers),
|
|
||||||
ci("enum"),
|
|
||||||
field("name", $.identifier),
|
|
||||||
field("interfaces", optional($.interfaces)),
|
|
||||||
field("body", $.enum_body)
|
|
||||||
),
|
|
||||||
|
|
||||||
enum_body: ($) => seq("{", commaJoined($.enum_constant), "}"),
|
|
||||||
|
|
||||||
enum_constant: ($) =>
|
|
||||||
seq(optional($.modifiers), field("name", $.identifier)),
|
|
||||||
|
|
||||||
class_declaration: ($) =>
|
|
||||||
seq(
|
|
||||||
optional($.modifiers),
|
|
||||||
ci("class"),
|
|
||||||
field("name", $.identifier),
|
|
||||||
optional(field("type_parameters", $.type_parameters)),
|
|
||||||
optional(field("superclass", $.superclass)),
|
|
||||||
optional(field("interfaces", $.interfaces)),
|
|
||||||
field("body", $.class_body)
|
|
||||||
),
|
|
||||||
|
|
||||||
trigger_declaration: ($) =>
|
|
||||||
seq(
|
|
||||||
ci("trigger"),
|
|
||||||
field("name", $.identifier),
|
|
||||||
ci("on"),
|
|
||||||
field("object", $.identifier),
|
|
||||||
"(",
|
|
||||||
field("events", commaJoined1($.trigger_event)),
|
|
||||||
")",
|
|
||||||
field("body", $.trigger_body)
|
|
||||||
),
|
|
||||||
|
|
||||||
trigger_event: ($) =>
|
|
||||||
choice(
|
|
||||||
seq(ci("before"), ci("insert")),
|
|
||||||
seq(ci("before"), ci("update")),
|
|
||||||
seq(ci("before"), ci("delete")),
|
|
||||||
seq(ci("after"), ci("insert")),
|
|
||||||
seq(ci("after"), ci("update")),
|
|
||||||
seq(ci("after"), ci("delete")),
|
|
||||||
seq(ci("after"), ci("undelete"))
|
|
||||||
),
|
|
||||||
|
|
||||||
trigger_body: ($) => $.block,
|
|
||||||
|
|
||||||
modifiers: ($) => repeat1(choice($.annotation, $.modifier)),
|
|
||||||
|
|
||||||
modifier: ($) =>
|
|
||||||
choice(
|
|
||||||
ci("global"),
|
|
||||||
ci("public"),
|
|
||||||
ci("testMethod"),
|
|
||||||
ci("protected"),
|
|
||||||
ci("override"),
|
|
||||||
ci("private"),
|
|
||||||
ci("virtual"),
|
|
||||||
ci("abstract"),
|
|
||||||
ci("static"),
|
|
||||||
ci("final"),
|
|
||||||
ci("transient"),
|
|
||||||
ci("with sharing"),
|
|
||||||
ci("without sharing"),
|
|
||||||
ci("inherited sharing")
|
|
||||||
),
|
|
||||||
|
|
||||||
type_parameters: ($) => seq("<", commaJoined1($.type_parameter), ">"),
|
|
||||||
|
|
||||||
type_parameter: ($) =>
|
|
||||||
seq(
|
|
||||||
repeat($.annotation),
|
|
||||||
alias($.identifier, $.type_identifier),
|
|
||||||
optional($.type_bound)
|
|
||||||
),
|
|
||||||
|
|
||||||
// TODO: do we need this?
|
|
||||||
type_bound: ($) => seq(ci("extends"), $._type, repeat(seq("&", $._type))),
|
|
||||||
|
|
||||||
superclass: ($) => seq(ci("extends"), $._type),
|
|
||||||
|
|
||||||
interfaces: ($) => seq(ci("implements"), $.type_list),
|
|
||||||
|
|
||||||
type_list: ($) => seq($._type, repeat(seq(",", $._type))),
|
|
||||||
|
|
||||||
class_body: ($) => seq("{", repeat($._class_body_declaration), "}"),
|
|
||||||
|
|
||||||
_class_body_declaration: ($) =>
|
|
||||||
choice(
|
|
||||||
$.field_declaration,
|
|
||||||
$.method_declaration,
|
|
||||||
$.class_declaration,
|
|
||||||
$.interface_declaration,
|
|
||||||
$.enum_declaration,
|
|
||||||
$.block,
|
|
||||||
$.static_initializer,
|
|
||||||
$.constructor_declaration,
|
|
||||||
";"
|
|
||||||
),
|
|
||||||
|
|
||||||
static_initializer: ($) => seq(ci("static"), $.block),
|
|
||||||
|
|
||||||
constructor_declaration: ($) =>
|
|
||||||
seq(
|
|
||||||
optional($.modifiers),
|
|
||||||
$._constructor_declarator,
|
|
||||||
field("body", $.constructor_body)
|
|
||||||
),
|
|
||||||
|
|
||||||
_constructor_declarator: ($) =>
|
|
||||||
seq(
|
|
||||||
field("type_parameters", optional($.type_parameters)),
|
|
||||||
field("name", $.identifier),
|
|
||||||
field("parameters", $.formal_parameters)
|
|
||||||
),
|
|
||||||
|
|
||||||
constructor_body: ($) =>
|
|
||||||
seq(
|
|
||||||
"{",
|
|
||||||
optional($.explicit_constructor_invocation),
|
|
||||||
repeat($.statement),
|
|
||||||
"}"
|
|
||||||
),
|
|
||||||
|
|
||||||
explicit_constructor_invocation: ($) =>
|
|
||||||
seq(
|
|
||||||
choice(
|
|
||||||
seq(
|
|
||||||
field("type_arguments", optional($.type_arguments)),
|
|
||||||
field("constructor", choice($.this, $.super))
|
|
||||||
),
|
|
||||||
seq(
|
|
||||||
field("object", choice($.primary_expression)),
|
|
||||||
".",
|
|
||||||
field("type_arguments", optional($.type_arguments)),
|
|
||||||
field("constructor", $.super)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
field("arguments", $.argument_list),
|
|
||||||
";"
|
|
||||||
),
|
|
||||||
|
|
||||||
_name: ($) => choice($.identifier, $.scoped_identifier),
|
|
||||||
|
|
||||||
scoped_identifier: ($) =>
|
|
||||||
seq(field("scope", $._name), ".", field("name", $.identifier)),
|
|
||||||
|
|
||||||
field_declaration: ($) =>
|
|
||||||
seq(
|
|
||||||
optional($.modifiers),
|
|
||||||
field("type", $._unannotated_type),
|
|
||||||
$._variable_declarator_list,
|
|
||||||
choice($.accessor_list, ";")
|
|
||||||
),
|
|
||||||
|
|
||||||
_default_value: ($) => seq("default", field("value", $._element_value)),
|
|
||||||
|
|
||||||
interface_declaration: ($) =>
|
|
||||||
seq(
|
|
||||||
optional($.modifiers),
|
|
||||||
ci("interface"),
|
|
||||||
field("name", $.identifier),
|
|
||||||
field("type_parameters", optional($.type_parameters)),
|
|
||||||
optional($.extends_interfaces),
|
|
||||||
field("body", $.interface_body)
|
|
||||||
),
|
|
||||||
|
|
||||||
extends_interfaces: ($) => seq(ci("extends"), $.type_list),
|
|
||||||
|
|
||||||
interface_body: ($) =>
|
|
||||||
seq(
|
|
||||||
"{",
|
|
||||||
repeat(
|
|
||||||
choice(
|
|
||||||
$.constant_declaration,
|
|
||||||
$.enum_declaration,
|
|
||||||
$.method_declaration,
|
|
||||||
$.class_declaration,
|
|
||||||
$.interface_declaration,
|
|
||||||
";"
|
|
||||||
)
|
|
||||||
),
|
|
||||||
"}"
|
|
||||||
),
|
|
||||||
|
|
||||||
constant_declaration: ($) =>
|
|
||||||
seq(
|
|
||||||
optional($.modifiers),
|
|
||||||
field("type", $._unannotated_type),
|
|
||||||
$._variable_declarator_list,
|
|
||||||
";"
|
|
||||||
),
|
|
||||||
|
|
||||||
_variable_declarator_list: ($) =>
|
|
||||||
commaJoined1(field("declarator", $.variable_declarator)),
|
|
||||||
|
|
||||||
variable_declarator: ($) =>
|
|
||||||
seq(
|
|
||||||
$._variable_declarator_id,
|
|
||||||
optional(
|
|
||||||
seq(
|
|
||||||
alias("=", $.assignment_operator),
|
|
||||||
field("value", $._variable_initializer)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
|
|
||||||
_variable_declarator_id: ($) =>
|
|
||||||
seq(
|
|
||||||
field("name", $.identifier),
|
|
||||||
field("dimensions", optional($.dimensions))
|
|
||||||
),
|
|
||||||
|
|
||||||
_variable_initializer: ($) => choice($.expression, $.array_initializer),
|
|
||||||
|
|
||||||
_map_initializer: ($) => seq($.expression, "=>", $.expression),
|
|
||||||
|
|
||||||
array_initializer: ($) =>
|
|
||||||
seq("{", commaJoined($._variable_initializer), "}"),
|
|
||||||
|
|
||||||
map_initializer: ($) => seq("{", commaJoined($._map_initializer), "}"),
|
|
||||||
|
|
||||||
// Types
|
|
||||||
|
|
||||||
_type: ($) => choice($._unannotated_type, $.annotated_type),
|
|
||||||
|
|
||||||
_unannotated_type: ($) => choice($._simple_type, $.array_type),
|
|
||||||
|
|
||||||
void_type: ($) => ci("void"),
|
|
||||||
_simple_type: ($) =>
|
|
||||||
choice(
|
|
||||||
$.void_type,
|
|
||||||
$.boolean_type,
|
|
||||||
alias($.identifier, $.type_identifier),
|
|
||||||
$.scoped_type_identifier,
|
|
||||||
$.generic_type
|
|
||||||
),
|
|
||||||
|
|
||||||
annotated_type: ($) => seq(repeat1($.annotation), $._unannotated_type),
|
|
||||||
|
|
||||||
scoped_type_identifier: ($) =>
|
|
||||||
seq(
|
|
||||||
choice(
|
|
||||||
alias($.identifier, $.type_identifier),
|
|
||||||
$.scoped_type_identifier,
|
|
||||||
$.generic_type
|
|
||||||
),
|
|
||||||
".",
|
|
||||||
repeat($.annotation),
|
|
||||||
alias($.identifier, $.type_identifier)
|
|
||||||
),
|
|
||||||
|
|
||||||
generic_type: ($) =>
|
|
||||||
prec.dynamic(
|
|
||||||
PREC.GENERIC,
|
|
||||||
seq(
|
|
||||||
choice(
|
|
||||||
alias($.identifier, $.type_identifier),
|
|
||||||
$.scoped_type_identifier
|
|
||||||
),
|
|
||||||
$.type_arguments
|
|
||||||
)
|
|
||||||
),
|
|
||||||
|
|
||||||
array_type: ($) =>
|
|
||||||
seq(
|
|
||||||
field("element", $._unannotated_type),
|
|
||||||
field("dimensions", $.dimensions)
|
|
||||||
),
|
|
||||||
|
|
||||||
boolean_type: ($) => "boolean",
|
|
||||||
|
|
||||||
_method_header: ($) =>
|
|
||||||
seq(
|
|
||||||
optional(
|
|
||||||
seq(field("type_parameters", $.type_parameters), repeat($.annotation))
|
|
||||||
),
|
|
||||||
field("type", $._unannotated_type),
|
|
||||||
$._method_declarator
|
|
||||||
),
|
|
||||||
|
|
||||||
_method_declarator: ($) =>
|
|
||||||
seq(
|
|
||||||
field("name", $.identifier),
|
|
||||||
field("parameters", $.formal_parameters),
|
|
||||||
field("dimensions", optional($.dimensions))
|
|
||||||
),
|
|
||||||
|
|
||||||
formal_parameters: ($) => seq("(", commaJoined($.formal_parameter), ")"),
|
|
||||||
|
|
||||||
formal_parameter: ($) =>
|
|
||||||
seq(
|
|
||||||
optional($.modifiers),
|
|
||||||
field("type", $._unannotated_type),
|
|
||||||
$._variable_declarator_id
|
|
||||||
),
|
|
||||||
|
|
||||||
local_variable_declaration: ($) =>
|
|
||||||
seq(
|
|
||||||
optional($.modifiers),
|
|
||||||
field("type", $._unannotated_type),
|
|
||||||
$._variable_declarator_list,
|
|
||||||
";"
|
|
||||||
),
|
|
||||||
|
|
||||||
method_declaration: ($) =>
|
|
||||||
seq(
|
|
||||||
optional($.modifiers),
|
|
||||||
$._method_header,
|
|
||||||
choice(field("body", $.block), ";")
|
|
||||||
),
|
|
||||||
|
|
||||||
this: ($) => ci("this"),
|
|
||||||
|
|
||||||
super: ($) => ci("super"),
|
|
||||||
|
|
||||||
// http://stackoverflow.com/questions/13014947/regex-to-match-a-c-style-multiline-comment/36328890#36328890
|
|
||||||
comment: ($) => choice($.line_comment, $.block_comment),
|
|
||||||
|
|
||||||
line_comment: ($) => token(prec(PREC.COMMENT, seq("//", /[^\n]*/))),
|
|
||||||
|
|
||||||
block_comment: ($) =>
|
|
||||||
token(prec(PREC.COMMENT, seq("/*", /[^*]*\*+([^/*][^*]*\*+)*/, "/"))),
|
|
||||||
|
|
||||||
accessor_list: ($) => seq("{", repeat1($.accessor_declaration), "}"),
|
|
||||||
|
|
||||||
accessor_declaration: ($) =>
|
|
||||||
seq(
|
|
||||||
optional($.modifiers),
|
|
||||||
choice(ci("get"), ci("set")),
|
|
||||||
choice($.block, ";")
|
|
||||||
),
|
|
||||||
|
|
||||||
...soslGrammar.rules,
|
|
||||||
// https://docs.oracle.com/javase/specs/jls/se8/html/jls-3.html#jls-IdentifierChars
|
|
||||||
identifier: ($) => /[\p{L}_$][\p{L}\p{Nd}_$]*/,
|
|
||||||
|
|
||||||
// Literals
|
|
||||||
|
|
||||||
_literal: ($) =>
|
|
||||||
choice(
|
|
||||||
$.int,
|
|
||||||
$.decimal_floating_point_literal,
|
|
||||||
$.boolean,
|
|
||||||
$.string_literal,
|
|
||||||
$.null_literal
|
|
||||||
),
|
|
||||||
|
|
||||||
int: ($) => token(seq(DIGITS, optional(choice("l", "L")))),
|
|
||||||
|
|
||||||
decimal_floating_point_literal: ($) =>
|
|
||||||
token(
|
|
||||||
choice(
|
|
||||||
seq(
|
|
||||||
DIGITS,
|
|
||||||
".",
|
|
||||||
optional(DIGITS),
|
|
||||||
optional(seq(/[eE]/, optional(choice("-", "+")), DIGITS)),
|
|
||||||
optional(/[fFdD]/)
|
|
||||||
),
|
|
||||||
seq(
|
|
||||||
".",
|
|
||||||
DIGITS,
|
|
||||||
optional(seq(/[eE]/, optional(choice("-", "+")), DIGITS)),
|
|
||||||
optional(/[fFdD]/)
|
|
||||||
),
|
|
||||||
seq(
|
|
||||||
DIGITS,
|
|
||||||
/[eEpP]/,
|
|
||||||
optional(choice("-", "+")),
|
|
||||||
DIGITS,
|
|
||||||
optional(/[fFdD]/)
|
|
||||||
),
|
|
||||||
seq(
|
|
||||||
DIGITS,
|
|
||||||
optional(seq(/[eE]/, optional(choice("-", "+")), DIGITS)),
|
|
||||||
/[fFdD]/
|
|
||||||
)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
|
|
||||||
string_literal: ($) => /'(\\[nNrRtTbBfFuU"'_%\\]|[^\\'])*'/,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
{
|
|
||||||
"main": "../bindings/node/apex",
|
|
||||||
"tree-sitter": [
|
|
||||||
{
|
|
||||||
"scope": "source.apex",
|
|
||||||
"file-types": [
|
|
||||||
"cls",
|
|
||||||
"trigger",
|
|
||||||
"apex"
|
|
||||||
],
|
|
||||||
"highlights": [
|
|
||||||
"../soql/queries/highlights.scm",
|
|
||||||
"../sosl/queries/highlights.scm",
|
|
||||||
"queries/highlights.scm"
|
|
||||||
],
|
|
||||||
"tags": [
|
|
||||||
"queries/tags.scm"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -1,302 +0,0 @@
|
|||||||
;; attempting to match concepts represented here:
|
|
||||||
;; https://code.visualstudio.com/api/language-extensions/semantic-highlight-guide
|
|
||||||
|
|
||||||
[
|
|
||||||
"["
|
|
||||||
"]"
|
|
||||||
"{"
|
|
||||||
"}"
|
|
||||||
"?"
|
|
||||||
";"
|
|
||||||
] @punctuation
|
|
||||||
|
|
||||||
;; Methods
|
|
||||||
|
|
||||||
(method_declaration
|
|
||||||
name: (identifier) @method)
|
|
||||||
(method_declaration
|
|
||||||
type: (type_identifier) @type)
|
|
||||||
|
|
||||||
(method_invocation
|
|
||||||
name: (identifier) @method)
|
|
||||||
(argument_list
|
|
||||||
(identifier) @variable)
|
|
||||||
(super) @function.defaultLibrary
|
|
||||||
|
|
||||||
(explicit_constructor_invocation
|
|
||||||
arguments: (argument_list
|
|
||||||
(identifier) @variable ))
|
|
||||||
|
|
||||||
;; Annotations
|
|
||||||
|
|
||||||
(annotation
|
|
||||||
name: (identifier) @decorator)
|
|
||||||
|
|
||||||
"@" @operator
|
|
||||||
|
|
||||||
(annotation_key_value
|
|
||||||
(identifier) @variable)
|
|
||||||
|
|
||||||
|
|
||||||
;; Types
|
|
||||||
|
|
||||||
(interface_declaration
|
|
||||||
name: (identifier) @interface)
|
|
||||||
(class_declaration
|
|
||||||
name: (identifier) @class)
|
|
||||||
(class_declaration
|
|
||||||
(superclass) @class)
|
|
||||||
(enum_declaration
|
|
||||||
name: (identifier) @enum)
|
|
||||||
(enum_constant
|
|
||||||
name: (identifier) @enumMember)
|
|
||||||
|
|
||||||
(interfaces
|
|
||||||
(type_list
|
|
||||||
(type_identifier) @interface ))
|
|
||||||
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier) @type )
|
|
||||||
|
|
||||||
( expression_statement (_ (identifier)) @variable)
|
|
||||||
|
|
||||||
(type_arguments "<" @punctuation)
|
|
||||||
(type_arguments ">" @punctuation)
|
|
||||||
|
|
||||||
; (identifier) @variable
|
|
||||||
|
|
||||||
((field_access
|
|
||||||
object: (identifier) @type)) ;; don't know what type of thing it is
|
|
||||||
|
|
||||||
(generic_type
|
|
||||||
(type_identifier) @type)
|
|
||||||
(type_arguments (type_identifier) @type)
|
|
||||||
|
|
||||||
(field_access
|
|
||||||
field: (identifier) @property)
|
|
||||||
|
|
||||||
((scoped_identifier
|
|
||||||
scope: (identifier) @type)
|
|
||||||
(#match? @type "^[A-Z]"))
|
|
||||||
((method_invocation
|
|
||||||
object: (identifier) @type)
|
|
||||||
(#match? @type "^[A-Z]"))
|
|
||||||
|
|
||||||
|
|
||||||
(field_declaration
|
|
||||||
type: (type_identifier) @type)
|
|
||||||
|
|
||||||
(method_declaration
|
|
||||||
(formal_parameters
|
|
||||||
(formal_parameter
|
|
||||||
name: (identifier) @parameter)))
|
|
||||||
|
|
||||||
(formal_parameter
|
|
||||||
type: (type_identifier) @type
|
|
||||||
(identifier) @variable)
|
|
||||||
|
|
||||||
(enhanced_for_statement
|
|
||||||
type: (type_identifier) @type
|
|
||||||
name: (identifier) @variable )
|
|
||||||
|
|
||||||
(enhanced_for_statement
|
|
||||||
value: (identifier) @variable)
|
|
||||||
|
|
||||||
(enhanced_for_statement
|
|
||||||
name: (identifier) @variable)
|
|
||||||
|
|
||||||
(object_creation_expression
|
|
||||||
type: (type_identifier) @type)
|
|
||||||
|
|
||||||
(array_creation_expression
|
|
||||||
type: (type_identifier) @type)
|
|
||||||
|
|
||||||
(array_type
|
|
||||||
element: (type_identifier) @type)
|
|
||||||
|
|
||||||
(catch_formal_parameter
|
|
||||||
(type_identifier) @type
|
|
||||||
name: (identifier) @variable)
|
|
||||||
|
|
||||||
(return_statement
|
|
||||||
(identifier) @variable)
|
|
||||||
|
|
||||||
(local_variable_declaration
|
|
||||||
(variable_declarator
|
|
||||||
name: (identifier) @variable ))
|
|
||||||
|
|
||||||
(for_statement
|
|
||||||
condition: (binary_expression
|
|
||||||
(identifier) @variable))
|
|
||||||
|
|
||||||
(for_statement
|
|
||||||
update: (update_expression
|
|
||||||
(identifier) @variable))
|
|
||||||
|
|
||||||
(constructor_declaration
|
|
||||||
name: (identifier) @class)
|
|
||||||
|
|
||||||
(dml_type) @function.defaultLibrary
|
|
||||||
|
|
||||||
(bound_apex_expression
|
|
||||||
(identifier) @variable)
|
|
||||||
|
|
||||||
(assignment_operator) @operator
|
|
||||||
|
|
||||||
(update_expression ["++" "--"] @operator)
|
|
||||||
|
|
||||||
(instanceof_expression
|
|
||||||
left: (identifier) @variable
|
|
||||||
right: (type_identifier) @type )
|
|
||||||
|
|
||||||
(cast_expression
|
|
||||||
type: (type_identifier) @type
|
|
||||||
value: (identifier) @variable)
|
|
||||||
|
|
||||||
(switch_expression
|
|
||||||
condition: (identifier) @variable)
|
|
||||||
|
|
||||||
(switch_label
|
|
||||||
(type_identifier) @type
|
|
||||||
(identifier) @variable )
|
|
||||||
|
|
||||||
(switch_rule
|
|
||||||
(switch_label
|
|
||||||
(identifier) @enumMember ))
|
|
||||||
|
|
||||||
(trigger_declaration
|
|
||||||
name: (identifier) @type
|
|
||||||
object: (identifier) @type
|
|
||||||
(trigger_event) @keyword
|
|
||||||
("," (trigger_event) @keyword)*)
|
|
||||||
|
|
||||||
(binary_expression
|
|
||||||
operator: [
|
|
||||||
">"
|
|
||||||
"<"
|
|
||||||
">="
|
|
||||||
"<="
|
|
||||||
"=="
|
|
||||||
"==="
|
|
||||||
"!="
|
|
||||||
"!=="
|
|
||||||
"&&"
|
|
||||||
"||"
|
|
||||||
"+"
|
|
||||||
"-"
|
|
||||||
"*"
|
|
||||||
"/"
|
|
||||||
"&"
|
|
||||||
"|"
|
|
||||||
"^"
|
|
||||||
"%"
|
|
||||||
"<<"
|
|
||||||
">>"
|
|
||||||
">>>"] @operator)
|
|
||||||
|
|
||||||
(binary_expression
|
|
||||||
(identifier) @variable)
|
|
||||||
|
|
||||||
(unary_expression
|
|
||||||
operator: [
|
|
||||||
"+"
|
|
||||||
"-"
|
|
||||||
"!"
|
|
||||||
"~"
|
|
||||||
]) @operator
|
|
||||||
|
|
||||||
(map_initializer "=>" @operator)
|
|
||||||
|
|
||||||
[
|
|
||||||
(boolean_type)
|
|
||||||
(void_type)
|
|
||||||
] @type.defaultLibrary
|
|
||||||
|
|
||||||
; Variables
|
|
||||||
|
|
||||||
(field_declaration
|
|
||||||
(modifiers (modifier ["final" "static"])(modifier ["final" "static"]))
|
|
||||||
(variable_declarator
|
|
||||||
name: (identifier) @variable.readonly))
|
|
||||||
|
|
||||||
(variable_declarator
|
|
||||||
(identifier) @property)
|
|
||||||
|
|
||||||
;; because itendifying it when declared doesn't carry to use
|
|
||||||
;; leans on the convention that "screaming snake case" is a const
|
|
||||||
((identifier) @variable.readonly
|
|
||||||
(#match? @variable.readonly "^_*[A-Z][A-Z\\d_]+$"))
|
|
||||||
|
|
||||||
|
|
||||||
(this) @variable.defaultLibrary
|
|
||||||
|
|
||||||
; Literals
|
|
||||||
|
|
||||||
[
|
|
||||||
(int)
|
|
||||||
] @number
|
|
||||||
|
|
||||||
[
|
|
||||||
(string_literal)
|
|
||||||
] @string
|
|
||||||
|
|
||||||
[
|
|
||||||
(line_comment)
|
|
||||||
(block_comment)
|
|
||||||
] @comment
|
|
||||||
|
|
||||||
;; ;; Keywords
|
|
||||||
|
|
||||||
[
|
|
||||||
"abstract"
|
|
||||||
"break"
|
|
||||||
"catch"
|
|
||||||
"class"
|
|
||||||
"continue"
|
|
||||||
"default"
|
|
||||||
"do"
|
|
||||||
"else"
|
|
||||||
"enum"
|
|
||||||
"extends"
|
|
||||||
"final"
|
|
||||||
"finally"
|
|
||||||
"for"
|
|
||||||
"get"
|
|
||||||
"global"
|
|
||||||
"if"
|
|
||||||
"implements"
|
|
||||||
"instanceof"
|
|
||||||
"interface"
|
|
||||||
"new"
|
|
||||||
"on"
|
|
||||||
"private"
|
|
||||||
"protected"
|
|
||||||
"public"
|
|
||||||
"return"
|
|
||||||
"set"
|
|
||||||
"static"
|
|
||||||
"switch"
|
|
||||||
"testMethod"
|
|
||||||
"throw"
|
|
||||||
"transient"
|
|
||||||
"try"
|
|
||||||
"trigger"
|
|
||||||
"virtual"
|
|
||||||
"when"
|
|
||||||
"while"
|
|
||||||
"with_sharing"
|
|
||||||
"without_sharing"
|
|
||||||
"inherited_sharing"
|
|
||||||
] @keyword
|
|
||||||
|
|
||||||
(assignment_expression
|
|
||||||
left: (identifier) @variable)
|
|
||||||
|
|
||||||
; (type_identifier) @type ;; not respecting precedence...
|
|
||||||
;; I don't love this but couldn't break them up right now
|
|
||||||
;; can't figure out how to let that be special without conflicting
|
|
||||||
;; in the grammar
|
|
||||||
"System.runAs" @method.defaultLibrary
|
|
||||||
|
|
||||||
(scoped_type_identifier
|
|
||||||
(type_identifier) @type)
|
|
||||||
@ -1,16 +0,0 @@
|
|||||||
; locals.scm
|
|
||||||
|
|
||||||
(method_declaration) @local.scope
|
|
||||||
(do_statement) @local.scope
|
|
||||||
|
|
||||||
(method_declaration
|
|
||||||
(formal_parameters (formal_parameter (identifier) @local.definition)))
|
|
||||||
|
|
||||||
(variable_declarator . (identifier) @local.definition)
|
|
||||||
|
|
||||||
(enum_declaration
|
|
||||||
name: (identifier) @local.definition)
|
|
||||||
(enum_constant
|
|
||||||
name: (identifier) @local.definition)
|
|
||||||
|
|
||||||
(identifier) @local.reference
|
|
||||||
@ -1,24 +0,0 @@
|
|||||||
(class_declaration
|
|
||||||
name: (identifier) @name) @definition.class
|
|
||||||
|
|
||||||
(interface_declaration
|
|
||||||
name: (identifier) @name) @definition.interface
|
|
||||||
|
|
||||||
(enum_declaration
|
|
||||||
name: (identifier) @name) @definition.enum
|
|
||||||
|
|
||||||
(method_invocation
|
|
||||||
name: (identifier) @name) @reference.call
|
|
||||||
|
|
||||||
(method_declaration
|
|
||||||
name: (identifier) @name) @definition.method
|
|
||||||
|
|
||||||
(interfaces
|
|
||||||
(type_list
|
|
||||||
(type_identifier ) @name)) @reference.implementation
|
|
||||||
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier) @name ) @reference.class
|
|
||||||
|
|
||||||
(object_creation_expression
|
|
||||||
type: (type_identifier) @name) @reference.class
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,224 +0,0 @@
|
|||||||
#ifndef TREE_SITTER_PARSER_H_
|
|
||||||
#define TREE_SITTER_PARSER_H_
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#define ts_builtin_sym_error ((TSSymbol)-1)
|
|
||||||
#define ts_builtin_sym_end 0
|
|
||||||
#define TREE_SITTER_SERIALIZATION_BUFFER_SIZE 1024
|
|
||||||
|
|
||||||
typedef uint16_t TSStateId;
|
|
||||||
|
|
||||||
#ifndef TREE_SITTER_API_H_
|
|
||||||
typedef uint16_t TSSymbol;
|
|
||||||
typedef uint16_t TSFieldId;
|
|
||||||
typedef struct TSLanguage TSLanguage;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
TSFieldId field_id;
|
|
||||||
uint8_t child_index;
|
|
||||||
bool inherited;
|
|
||||||
} TSFieldMapEntry;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint16_t index;
|
|
||||||
uint16_t length;
|
|
||||||
} TSFieldMapSlice;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
bool visible;
|
|
||||||
bool named;
|
|
||||||
bool supertype;
|
|
||||||
} TSSymbolMetadata;
|
|
||||||
|
|
||||||
typedef struct TSLexer TSLexer;
|
|
||||||
|
|
||||||
struct TSLexer {
|
|
||||||
int32_t lookahead;
|
|
||||||
TSSymbol result_symbol;
|
|
||||||
void (*advance)(TSLexer *, bool);
|
|
||||||
void (*mark_end)(TSLexer *);
|
|
||||||
uint32_t (*get_column)(TSLexer *);
|
|
||||||
bool (*is_at_included_range_start)(const TSLexer *);
|
|
||||||
bool (*eof)(const TSLexer *);
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
TSParseActionTypeShift,
|
|
||||||
TSParseActionTypeReduce,
|
|
||||||
TSParseActionTypeAccept,
|
|
||||||
TSParseActionTypeRecover,
|
|
||||||
} TSParseActionType;
|
|
||||||
|
|
||||||
typedef union {
|
|
||||||
struct {
|
|
||||||
uint8_t type;
|
|
||||||
TSStateId state;
|
|
||||||
bool extra;
|
|
||||||
bool repetition;
|
|
||||||
} shift;
|
|
||||||
struct {
|
|
||||||
uint8_t type;
|
|
||||||
uint8_t child_count;
|
|
||||||
TSSymbol symbol;
|
|
||||||
int16_t dynamic_precedence;
|
|
||||||
uint16_t production_id;
|
|
||||||
} reduce;
|
|
||||||
uint8_t type;
|
|
||||||
} TSParseAction;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint16_t lex_state;
|
|
||||||
uint16_t external_lex_state;
|
|
||||||
} TSLexMode;
|
|
||||||
|
|
||||||
typedef union {
|
|
||||||
TSParseAction action;
|
|
||||||
struct {
|
|
||||||
uint8_t count;
|
|
||||||
bool reusable;
|
|
||||||
} entry;
|
|
||||||
} TSParseActionEntry;
|
|
||||||
|
|
||||||
struct TSLanguage {
|
|
||||||
uint32_t version;
|
|
||||||
uint32_t symbol_count;
|
|
||||||
uint32_t alias_count;
|
|
||||||
uint32_t token_count;
|
|
||||||
uint32_t external_token_count;
|
|
||||||
uint32_t state_count;
|
|
||||||
uint32_t large_state_count;
|
|
||||||
uint32_t production_id_count;
|
|
||||||
uint32_t field_count;
|
|
||||||
uint16_t max_alias_sequence_length;
|
|
||||||
const uint16_t *parse_table;
|
|
||||||
const uint16_t *small_parse_table;
|
|
||||||
const uint32_t *small_parse_table_map;
|
|
||||||
const TSParseActionEntry *parse_actions;
|
|
||||||
const char * const *symbol_names;
|
|
||||||
const char * const *field_names;
|
|
||||||
const TSFieldMapSlice *field_map_slices;
|
|
||||||
const TSFieldMapEntry *field_map_entries;
|
|
||||||
const TSSymbolMetadata *symbol_metadata;
|
|
||||||
const TSSymbol *public_symbol_map;
|
|
||||||
const uint16_t *alias_map;
|
|
||||||
const TSSymbol *alias_sequences;
|
|
||||||
const TSLexMode *lex_modes;
|
|
||||||
bool (*lex_fn)(TSLexer *, TSStateId);
|
|
||||||
bool (*keyword_lex_fn)(TSLexer *, TSStateId);
|
|
||||||
TSSymbol keyword_capture_token;
|
|
||||||
struct {
|
|
||||||
const bool *states;
|
|
||||||
const TSSymbol *symbol_map;
|
|
||||||
void *(*create)(void);
|
|
||||||
void (*destroy)(void *);
|
|
||||||
bool (*scan)(void *, TSLexer *, const bool *symbol_whitelist);
|
|
||||||
unsigned (*serialize)(void *, char *);
|
|
||||||
void (*deserialize)(void *, const char *, unsigned);
|
|
||||||
} external_scanner;
|
|
||||||
const TSStateId *primary_state_ids;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Lexer Macros
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define START_LEXER() \
|
|
||||||
bool result = false; \
|
|
||||||
bool skip = false; \
|
|
||||||
bool eof = false; \
|
|
||||||
int32_t lookahead; \
|
|
||||||
goto start; \
|
|
||||||
next_state: \
|
|
||||||
lexer->advance(lexer, skip); \
|
|
||||||
start: \
|
|
||||||
skip = false; \
|
|
||||||
lookahead = lexer->lookahead;
|
|
||||||
|
|
||||||
#define ADVANCE(state_value) \
|
|
||||||
{ \
|
|
||||||
state = state_value; \
|
|
||||||
goto next_state; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define SKIP(state_value) \
|
|
||||||
{ \
|
|
||||||
skip = true; \
|
|
||||||
state = state_value; \
|
|
||||||
goto next_state; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define ACCEPT_TOKEN(symbol_value) \
|
|
||||||
result = true; \
|
|
||||||
lexer->result_symbol = symbol_value; \
|
|
||||||
lexer->mark_end(lexer);
|
|
||||||
|
|
||||||
#define END_STATE() return result;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Parse Table Macros
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define SMALL_STATE(id) id - LARGE_STATE_COUNT
|
|
||||||
|
|
||||||
#define STATE(id) id
|
|
||||||
|
|
||||||
#define ACTIONS(id) id
|
|
||||||
|
|
||||||
#define SHIFT(state_value) \
|
|
||||||
{{ \
|
|
||||||
.shift = { \
|
|
||||||
.type = TSParseActionTypeShift, \
|
|
||||||
.state = state_value \
|
|
||||||
} \
|
|
||||||
}}
|
|
||||||
|
|
||||||
#define SHIFT_REPEAT(state_value) \
|
|
||||||
{{ \
|
|
||||||
.shift = { \
|
|
||||||
.type = TSParseActionTypeShift, \
|
|
||||||
.state = state_value, \
|
|
||||||
.repetition = true \
|
|
||||||
} \
|
|
||||||
}}
|
|
||||||
|
|
||||||
#define SHIFT_EXTRA() \
|
|
||||||
{{ \
|
|
||||||
.shift = { \
|
|
||||||
.type = TSParseActionTypeShift, \
|
|
||||||
.extra = true \
|
|
||||||
} \
|
|
||||||
}}
|
|
||||||
|
|
||||||
#define REDUCE(symbol_val, child_count_val, ...) \
|
|
||||||
{{ \
|
|
||||||
.reduce = { \
|
|
||||||
.type = TSParseActionTypeReduce, \
|
|
||||||
.symbol = symbol_val, \
|
|
||||||
.child_count = child_count_val, \
|
|
||||||
__VA_ARGS__ \
|
|
||||||
}, \
|
|
||||||
}}
|
|
||||||
|
|
||||||
#define RECOVER() \
|
|
||||||
{{ \
|
|
||||||
.type = TSParseActionTypeRecover \
|
|
||||||
}}
|
|
||||||
|
|
||||||
#define ACCEPT_INPUT() \
|
|
||||||
{{ \
|
|
||||||
.type = TSParseActionTypeAccept \
|
|
||||||
}}
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // TREE_SITTER_PARSER_H_
|
|
||||||
@ -1,159 +0,0 @@
|
|||||||
================================================================================
|
|
||||||
ANNOTATIONS name only
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
@Annotation
|
|
||||||
public class Me {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(annotation
|
|
||||||
(identifier))
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body)))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
ANNOTATIONS name with one bool parameter
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
@Annotation(param1=false)
|
|
||||||
public class Me {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(annotation
|
|
||||||
(identifier)
|
|
||||||
(annotation_argument_list
|
|
||||||
(annotation_key_value
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(boolean))))
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body)))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
ANNOTATIONS name with one string parameter
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
@Annotation(param1='world')
|
|
||||||
public class Me {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(annotation
|
|
||||||
(identifier)
|
|
||||||
(annotation_argument_list
|
|
||||||
(annotation_key_value
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(string_literal))))
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body)))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
ANNOTATIONS name with multiple parameters
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
@Annotation(param1=false, param2='hello')
|
|
||||||
public class Me {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(annotation
|
|
||||||
(identifier)
|
|
||||||
(annotation_argument_list
|
|
||||||
(annotation_key_value
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(boolean))
|
|
||||||
(annotation_key_value
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(string_literal))))
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body)))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
ANNOTATIONS name with string
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
@Annotation('this is a test of \' strings')
|
|
||||||
public class Me {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(annotation
|
|
||||||
(identifier)
|
|
||||||
(annotation_argument_list
|
|
||||||
(string_literal)))
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body)))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
ANNOTATIONS space separated
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public without sharing class Me {
|
|
||||||
{
|
|
||||||
@InvocableVariable(required=true label='Old User')
|
|
||||||
public Id oldUserId;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier)
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(modifiers
|
|
||||||
(annotation
|
|
||||||
(identifier)
|
|
||||||
(annotation_argument_list
|
|
||||||
(annotation_key_value
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(boolean))
|
|
||||||
(annotation_key_value
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(string_literal))))
|
|
||||||
(modifier))
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)))))))
|
|
||||||
@ -1,163 +0,0 @@
|
|||||||
================================================================================
|
|
||||||
ANONYMOUS Simple
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
String test = 'hello';
|
|
||||||
System.debug(test);
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(string_literal)))
|
|
||||||
(expression_statement
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(identifier)
|
|
||||||
(argument_list
|
|
||||||
(identifier)))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
ANONYMOUS with Methods
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
Integer int1 = 0;
|
|
||||||
|
|
||||||
void myProcedure1() {
|
|
||||||
myProcedure2();
|
|
||||||
}
|
|
||||||
|
|
||||||
void myProcedure2() {
|
|
||||||
int1++;
|
|
||||||
}
|
|
||||||
|
|
||||||
myProcedure1();
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(int)))
|
|
||||||
(method_declaration
|
|
||||||
(void_type)
|
|
||||||
(identifier)
|
|
||||||
(formal_parameters)
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(argument_list)))))
|
|
||||||
(method_declaration
|
|
||||||
(void_type)
|
|
||||||
(identifier)
|
|
||||||
(formal_parameters)
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(update_expression
|
|
||||||
(identifier)))))
|
|
||||||
(expression_statement
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(argument_list))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
ANONYMOUS with Methods
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
Integer int1 = 0;
|
|
||||||
|
|
||||||
void myProcedure1() {
|
|
||||||
myProcedure2();
|
|
||||||
}
|
|
||||||
|
|
||||||
void myProcedure2() {
|
|
||||||
int1++;
|
|
||||||
}
|
|
||||||
|
|
||||||
myProcedure1();
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(int)))
|
|
||||||
(method_declaration
|
|
||||||
(void_type)
|
|
||||||
(identifier)
|
|
||||||
(formal_parameters)
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(argument_list)))))
|
|
||||||
(method_declaration
|
|
||||||
(void_type)
|
|
||||||
(identifier)
|
|
||||||
(formal_parameters)
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(update_expression
|
|
||||||
(identifier)))))
|
|
||||||
(expression_statement
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(argument_list))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
ANONYMOUS with Methods
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class foo {
|
|
||||||
public void bar() {
|
|
||||||
system.debug('\n\n#### FOO BAR ####\n\n');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
foo f = new foo();
|
|
||||||
f.bar();
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(method_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(void_type)
|
|
||||||
(identifier)
|
|
||||||
(formal_parameters)
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(identifier)
|
|
||||||
(argument_list
|
|
||||||
(string_literal))))))))
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(object_creation_expression
|
|
||||||
(type_identifier)
|
|
||||||
(argument_list))))
|
|
||||||
(expression_statement
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(identifier)
|
|
||||||
(argument_list))))
|
|
||||||
@ -1,174 +0,0 @@
|
|||||||
================================================================================
|
|
||||||
COMMENTS line comment above
|
|
||||||
================================================================================
|
|
||||||
// test comment
|
|
||||||
public class Me {}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(line_comment)
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body)))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
COMMENTS line comment after
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {} // test comment
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body))
|
|
||||||
(line_comment))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
COMMENTS line comment below
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {}
|
|
||||||
// test comment
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body))
|
|
||||||
(line_comment))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
COMMENTS block comment before
|
|
||||||
================================================================================
|
|
||||||
/* test comment */
|
|
||||||
public class Me {}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(block_comment)
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body)))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
COMMENTS block comment inside
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {/* test comment */}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block_comment))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
COMMENTS block comment after
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {}/* test comment */
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body))
|
|
||||||
(block_comment))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
COMMENTS block comment below
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {}
|
|
||||||
/* test comment */
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body))
|
|
||||||
(block_comment))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
COMMENTS block comment empty
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
/**/
|
|
||||||
public class Me {}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(block_comment)
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body)))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
COMMENTS block comment multi line
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
/* line 1
|
|
||||||
line 2
|
|
||||||
line 3 */
|
|
||||||
public class Me {}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(block_comment)
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body)))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
COMMENTS block comment more control chars
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
/***/
|
|
||||||
/* **/
|
|
||||||
/** */
|
|
||||||
/* * /*/
|
|
||||||
/*/ /* *-/**/
|
|
||||||
public class Me {}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(block_comment)
|
|
||||||
(block_comment)
|
|
||||||
(block_comment)
|
|
||||||
(block_comment)
|
|
||||||
(block_comment)
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body)))
|
|
||||||
@ -1,171 +0,0 @@
|
|||||||
================================================================================
|
|
||||||
CONSTRUCTOR Multiple
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class TestObject2 {
|
|
||||||
|
|
||||||
private static final Integer DEFAULT_SIZE = 10;
|
|
||||||
|
|
||||||
Integer size;
|
|
||||||
|
|
||||||
//Constructor with no arguments
|
|
||||||
public TestObject2() {
|
|
||||||
this(DEFAULT_SIZE); // Using this(...) calls the one argument constructor
|
|
||||||
}
|
|
||||||
|
|
||||||
// Constructor with one argument
|
|
||||||
public TestObject2(Integer ObjectSize) {
|
|
||||||
size = ObjectSize;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(field_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier)
|
|
||||||
(modifier)
|
|
||||||
(modifier))
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(int)))
|
|
||||||
(field_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)))
|
|
||||||
(line_comment)
|
|
||||||
(constructor_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(formal_parameters)
|
|
||||||
(constructor_body
|
|
||||||
(explicit_constructor_invocation
|
|
||||||
(this)
|
|
||||||
(argument_list
|
|
||||||
(identifier)))
|
|
||||||
(line_comment)))
|
|
||||||
(line_comment)
|
|
||||||
(constructor_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(formal_parameters
|
|
||||||
(formal_parameter
|
|
||||||
(type_identifier)
|
|
||||||
(identifier)))
|
|
||||||
(constructor_body
|
|
||||||
(expression_statement
|
|
||||||
(assignment_expression
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(identifier))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
CONSTRUCTOR private
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class TestObject2 {
|
|
||||||
|
|
||||||
private static final Integer DEFAULT_SIZE = 10;
|
|
||||||
|
|
||||||
Integer size;
|
|
||||||
|
|
||||||
private TestObject2() {
|
|
||||||
this(DEFAULT_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Constructor with one argument
|
|
||||||
private TestObject2(Integer ObjectSize) {
|
|
||||||
size = ObjectSize;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(field_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier)
|
|
||||||
(modifier)
|
|
||||||
(modifier))
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(int)))
|
|
||||||
(field_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)))
|
|
||||||
(constructor_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(formal_parameters)
|
|
||||||
(constructor_body
|
|
||||||
(explicit_constructor_invocation
|
|
||||||
(this)
|
|
||||||
(argument_list
|
|
||||||
(identifier)))))
|
|
||||||
(line_comment)
|
|
||||||
(constructor_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(formal_parameters
|
|
||||||
(formal_parameter
|
|
||||||
(type_identifier)
|
|
||||||
(identifier)))
|
|
||||||
(constructor_body
|
|
||||||
(expression_statement
|
|
||||||
(assignment_expression
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(identifier))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
CONSTRUCTOR super
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Subclass extends Superclass {
|
|
||||||
public Subclass() {
|
|
||||||
super('Madam', 'Brenda', 'Clapentrap');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(superclass
|
|
||||||
(type_identifier))
|
|
||||||
(class_body
|
|
||||||
(constructor_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(formal_parameters)
|
|
||||||
(constructor_body
|
|
||||||
(explicit_constructor_invocation
|
|
||||||
(super)
|
|
||||||
(argument_list
|
|
||||||
(string_literal)
|
|
||||||
(string_literal)
|
|
||||||
(string_literal))))))))
|
|
||||||
@ -1,429 +0,0 @@
|
|||||||
================================================================================
|
|
||||||
CONTROL if with braces
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
if(true){
|
|
||||||
Integer i = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(if_statement
|
|
||||||
(parenthesized_expression
|
|
||||||
(boolean))
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(int)))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
CONTROL if without braces
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
if(true)
|
|
||||||
Integer i = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(if_statement
|
|
||||||
(parenthesized_expression
|
|
||||||
(boolean))
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(int))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
CONTROL if else with braces
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
if(true) {
|
|
||||||
Integer i = 1;
|
|
||||||
} else {
|
|
||||||
Integer j = 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(if_statement
|
|
||||||
(parenthesized_expression
|
|
||||||
(boolean))
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(int))))
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(int)))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
CONTROL if else without braces
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
if(true)
|
|
||||||
Integer i = 1;
|
|
||||||
else
|
|
||||||
Integer j = 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(if_statement
|
|
||||||
(parenthesized_expression
|
|
||||||
(boolean))
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(int)))
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(int))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
CONTROL if else without braces
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
if(true)
|
|
||||||
Integer i = 1;
|
|
||||||
else if(false)
|
|
||||||
Integer l = 3;
|
|
||||||
else
|
|
||||||
Integer j = 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(if_statement
|
|
||||||
(parenthesized_expression
|
|
||||||
(boolean))
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(int)))
|
|
||||||
(if_statement
|
|
||||||
(parenthesized_expression
|
|
||||||
(boolean))
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(int)))
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(int)))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
CONTROL else if
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
if(true) {
|
|
||||||
Integer i = 1;
|
|
||||||
} else if(false) {
|
|
||||||
Integer l = 3;
|
|
||||||
} else {
|
|
||||||
Integer j = 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(if_statement
|
|
||||||
(parenthesized_expression
|
|
||||||
(boolean))
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(int))))
|
|
||||||
(if_statement
|
|
||||||
(parenthesized_expression
|
|
||||||
(boolean))
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(int))))
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(int))))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
CONTROL do while
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
do {
|
|
||||||
Integer i = 1;
|
|
||||||
} while(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(do_statement
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(int))))
|
|
||||||
(parenthesized_expression
|
|
||||||
(boolean)))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
CONTROL while
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
while (true) {
|
|
||||||
Integer i = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(while_statement
|
|
||||||
(parenthesized_expression
|
|
||||||
(boolean))
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(int)))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
CONTROL for loop with steps
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
for(Integer i = 0; i < 3; i++){
|
|
||||||
System.debug(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(for_statement
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(int)))
|
|
||||||
(binary_expression
|
|
||||||
(identifier)
|
|
||||||
(int))
|
|
||||||
(update_expression
|
|
||||||
(identifier))
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(identifier)
|
|
||||||
(argument_list
|
|
||||||
(identifier))))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
CONTROL for loop with iterator
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
List<Account> accs = new List<Account>();
|
|
||||||
for(Account a : accs){
|
|
||||||
System.debug(a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(generic_type
|
|
||||||
(type_identifier)
|
|
||||||
(type_arguments
|
|
||||||
(type_identifier)))
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(object_creation_expression
|
|
||||||
(generic_type
|
|
||||||
(type_identifier)
|
|
||||||
(type_arguments
|
|
||||||
(type_identifier)))
|
|
||||||
(argument_list))))
|
|
||||||
(enhanced_for_statement
|
|
||||||
(type_identifier)
|
|
||||||
(identifier)
|
|
||||||
(identifier)
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(identifier)
|
|
||||||
(argument_list
|
|
||||||
(identifier))))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
CONTROL runAs
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
System.runAs(new User(Id = UserInfo.getUserId())) {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(run_as_statement
|
|
||||||
(parenthesized_expression
|
|
||||||
(object_creation_expression
|
|
||||||
(type_identifier)
|
|
||||||
(argument_list
|
|
||||||
(assignment_expression
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(identifier)
|
|
||||||
(argument_list))))))
|
|
||||||
(block))))))
|
|
||||||
@ -1,328 +0,0 @@
|
|||||||
================================================================================
|
|
||||||
DML KEYWORD Insert
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
insert a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(dml_expression
|
|
||||||
(dml_type)
|
|
||||||
(identifier)))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
DML KEYWORD upsert
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
upsert a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(dml_expression
|
|
||||||
(dml_type)
|
|
||||||
(identifier)))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
DML KEYWORD upsert with field
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
upsert a Account.External_Id__c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(dml_expression
|
|
||||||
(dml_type)
|
|
||||||
(identifier)
|
|
||||||
(scoped_type_identifier
|
|
||||||
(type_identifier)
|
|
||||||
(type_identifier))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
DML KEYWORD update
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
update a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(dml_expression
|
|
||||||
(dml_type)
|
|
||||||
(identifier)))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
DML KEYWORD delete
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
delete a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(dml_expression
|
|
||||||
(dml_type)
|
|
||||||
(identifier)))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
DML KEYWORD undelete
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
undelete a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(dml_expression
|
|
||||||
(dml_type)
|
|
||||||
(identifier)))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
DML KEYWORD merge
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
merge a b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(dml_expression
|
|
||||||
(dml_type)
|
|
||||||
(identifier)
|
|
||||||
(identifier)))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
DML KEYWORD merge from array
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
merge accounts[0] accounts[1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(dml_expression
|
|
||||||
(dml_type)
|
|
||||||
(array_access
|
|
||||||
(identifier)
|
|
||||||
(int))
|
|
||||||
(array_access
|
|
||||||
(identifier)
|
|
||||||
(int))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
DML KEYWORD merge new list
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
merge masterContact new List<Contact>{oldContact1, oldContact2};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(dml_expression
|
|
||||||
(dml_type)
|
|
||||||
(identifier)
|
|
||||||
(array_creation_expression
|
|
||||||
(generic_type
|
|
||||||
(type_identifier)
|
|
||||||
(type_arguments
|
|
||||||
(type_identifier)))
|
|
||||||
(array_initializer
|
|
||||||
(identifier)
|
|
||||||
(identifier)))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
DML KEYWORD upsert from method with field reference
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
upsert contacts.values() Schema.Contact.External_Id__c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(dml_expression
|
|
||||||
(dml_type)
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(identifier)
|
|
||||||
(argument_list))
|
|
||||||
(scoped_type_identifier
|
|
||||||
(scoped_type_identifier
|
|
||||||
(type_identifier)
|
|
||||||
(type_identifier))
|
|
||||||
(type_identifier))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
DML KEYWORD upsert from method with field reference
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
insert new List<Account>{ a1, a2 };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(dml_expression
|
|
||||||
(dml_type)
|
|
||||||
(array_creation_expression
|
|
||||||
(generic_type
|
|
||||||
(type_identifier)
|
|
||||||
(type_arguments
|
|
||||||
(type_identifier)))
|
|
||||||
(array_initializer
|
|
||||||
(identifier)
|
|
||||||
(identifier)))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
DML KEYWORD insert assigned
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
insert accMG = new Account(Name='matching gift company');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(dml_expression
|
|
||||||
(dml_type)
|
|
||||||
(assignment_expression
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(object_creation_expression
|
|
||||||
(type_identifier)
|
|
||||||
(argument_list
|
|
||||||
(assignment_expression
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(string_literal)))))))))))
|
|
||||||
@ -1,48 +0,0 @@
|
|||||||
================================================================================
|
|
||||||
ENUM declare
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
public enum Season {WINTER, SPRING, SUMMER, FALL}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(enum_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(enum_body
|
|
||||||
(enum_constant
|
|
||||||
(identifier))
|
|
||||||
(enum_constant
|
|
||||||
(identifier))
|
|
||||||
(enum_constant
|
|
||||||
(identifier))
|
|
||||||
(enum_constant
|
|
||||||
(identifier)))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
ENUM class
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public enum MyEnumClass { X, Y }
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(enum_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(enum_body
|
|
||||||
(enum_constant
|
|
||||||
(identifier))
|
|
||||||
(enum_constant
|
|
||||||
(identifier)))))
|
|
||||||
@ -1,187 +0,0 @@
|
|||||||
================================================================================
|
|
||||||
EXCEPTION full
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
Account a = new Account(Name='Acme');
|
|
||||||
try {
|
|
||||||
insert a;
|
|
||||||
} catch(DmlException e) {
|
|
||||||
// Process exception here
|
|
||||||
Boolean failed = true;
|
|
||||||
} catch(Exception e) {
|
|
||||||
// Process exception here
|
|
||||||
Boolean failed = true;
|
|
||||||
} finally {
|
|
||||||
Boolean finallyRan = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(object_creation_expression
|
|
||||||
(type_identifier)
|
|
||||||
(argument_list
|
|
||||||
(assignment_expression
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(string_literal))))))
|
|
||||||
(try_statement
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(dml_expression
|
|
||||||
(dml_type)
|
|
||||||
(identifier))))
|
|
||||||
(catch_clause
|
|
||||||
(catch_formal_parameter
|
|
||||||
(type_identifier)
|
|
||||||
(identifier))
|
|
||||||
(block
|
|
||||||
(line_comment)
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(boolean)))))
|
|
||||||
(catch_clause
|
|
||||||
(catch_formal_parameter
|
|
||||||
(type_identifier)
|
|
||||||
(identifier))
|
|
||||||
(block
|
|
||||||
(line_comment)
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(boolean)))))
|
|
||||||
(finally_clause
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(boolean))))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
EXCEPTION catch
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
Account a = new Account(Name='Acme');
|
|
||||||
try {
|
|
||||||
insert a;
|
|
||||||
} catch(DmlException e) {
|
|
||||||
// Process exception here
|
|
||||||
Boolean failed = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(object_creation_expression
|
|
||||||
(type_identifier)
|
|
||||||
(argument_list
|
|
||||||
(assignment_expression
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(string_literal))))))
|
|
||||||
(try_statement
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(dml_expression
|
|
||||||
(dml_type)
|
|
||||||
(identifier))))
|
|
||||||
(catch_clause
|
|
||||||
(catch_formal_parameter
|
|
||||||
(type_identifier)
|
|
||||||
(identifier))
|
|
||||||
(block
|
|
||||||
(line_comment)
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(boolean))))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
EXCEPTION finally
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
Account a = new Account(Name='Acme');
|
|
||||||
try {
|
|
||||||
insert a;
|
|
||||||
} finally {
|
|
||||||
Boolean finallyRan = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(object_creation_expression
|
|
||||||
(type_identifier)
|
|
||||||
(argument_list
|
|
||||||
(assignment_expression
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(string_literal))))))
|
|
||||||
(try_statement
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(dml_expression
|
|
||||||
(dml_type)
|
|
||||||
(identifier))))
|
|
||||||
(finally_clause
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(boolean))))))))))
|
|
||||||
@ -1,53 +0,0 @@
|
|||||||
================================================================================
|
|
||||||
EXPRESSIONS Trigger.New
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
TestType evt = Trigger.New;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(field_access
|
|
||||||
(identifier)
|
|
||||||
(identifier))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
EXPRESSIONS Double Class
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
double.valueOf(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(identifier)
|
|
||||||
(argument_list
|
|
||||||
(int))))))))
|
|
||||||
@ -1,47 +0,0 @@
|
|||||||
================================================================================
|
|
||||||
INSTANCEOF
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
SObject a = new Account();
|
|
||||||
if (a instanceof Account) {
|
|
||||||
Account = (Account)a;
|
|
||||||
} else {
|
|
||||||
// something else...
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(object_creation_expression
|
|
||||||
(type_identifier)
|
|
||||||
(argument_list))))
|
|
||||||
(if_statement
|
|
||||||
(parenthesized_expression
|
|
||||||
(instanceof_expression
|
|
||||||
(identifier)
|
|
||||||
(type_identifier)))
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(assignment_expression
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(cast_expression
|
|
||||||
(type_identifier)
|
|
||||||
(identifier)))))
|
|
||||||
(block
|
|
||||||
(line_comment)))))))
|
|
||||||
@ -1,175 +0,0 @@
|
|||||||
================================================================================
|
|
||||||
METHOD public
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
public void method1(String param1, Integer param2){
|
|
||||||
param1 = '1';
|
|
||||||
param2 = 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(method_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(void_type)
|
|
||||||
(identifier)
|
|
||||||
(formal_parameters
|
|
||||||
(formal_parameter
|
|
||||||
(type_identifier)
|
|
||||||
(identifier))
|
|
||||||
(formal_parameter
|
|
||||||
(type_identifier)
|
|
||||||
(identifier)))
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(assignment_expression
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(string_literal)))
|
|
||||||
(expression_statement
|
|
||||||
(assignment_expression
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(int))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
METHOD private return
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
private Integer method1(Integer param1){
|
|
||||||
return param1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(method_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(type_identifier)
|
|
||||||
(identifier)
|
|
||||||
(formal_parameters
|
|
||||||
(formal_parameter
|
|
||||||
(type_identifier)
|
|
||||||
(identifier)))
|
|
||||||
(block
|
|
||||||
(return_statement
|
|
||||||
(identifier)))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
METHOD global static
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
global static Integer method1(Integer param1){
|
|
||||||
return param1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(method_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier)
|
|
||||||
(modifier))
|
|
||||||
(type_identifier)
|
|
||||||
(identifier)
|
|
||||||
(formal_parameters
|
|
||||||
(formal_parameter
|
|
||||||
(type_identifier)
|
|
||||||
(identifier)))
|
|
||||||
(block
|
|
||||||
(return_statement
|
|
||||||
(identifier)))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
METHOD Modifier on parameter
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
public void helloWorld(final Integer i){
|
|
||||||
System.debug(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(method_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(void_type)
|
|
||||||
(identifier)
|
|
||||||
(formal_parameters
|
|
||||||
(formal_parameter
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(type_identifier)
|
|
||||||
(identifier)))
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(identifier)
|
|
||||||
(argument_list
|
|
||||||
(identifier)))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
METHOD testMethod modifier
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
public testMethod void helloWorld(){
|
|
||||||
System.debug(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(method_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier)
|
|
||||||
(modifier))
|
|
||||||
(void_type)
|
|
||||||
(identifier)
|
|
||||||
(formal_parameters)
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(identifier)
|
|
||||||
(argument_list
|
|
||||||
(identifier)))))))))
|
|
||||||
File diff suppressed because it is too large
Load Diff
@ -1,2 +0,0 @@
|
|||||||
TODO...
|
|
||||||
https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/langCon_apex_expressions_operators_precedence.htm
|
|
||||||
@ -1,302 +0,0 @@
|
|||||||
================================================================================
|
|
||||||
PROPERTY Class full
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
public transient final static Integer TEST = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(field_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier)
|
|
||||||
(modifier)
|
|
||||||
(modifier)
|
|
||||||
(modifier))
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(int))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
PROPERTY Class security
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
public Integer test1;
|
|
||||||
private Integer test1;
|
|
||||||
protected Integer test1;
|
|
||||||
global Integer test1;
|
|
||||||
Integer test1;
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(field_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)))
|
|
||||||
(field_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)))
|
|
||||||
(field_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)))
|
|
||||||
(field_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)))
|
|
||||||
(field_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
PROPERTY Class modifiers
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
final Integer test1;
|
|
||||||
static Integer test1;
|
|
||||||
transient Integer test1;
|
|
||||||
static transient Integer test1;
|
|
||||||
final static Integer test1;
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(field_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)))
|
|
||||||
(field_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)))
|
|
||||||
(field_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)))
|
|
||||||
(field_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier)
|
|
||||||
(modifier))
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)))
|
|
||||||
(field_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier)
|
|
||||||
(modifier))
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
PROPERTY automatic properties
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
public integer MyReadOnlyProp { get; }
|
|
||||||
public double MyReadWriteProp { get; set; }
|
|
||||||
public string MyWriteOnlyProp { set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(field_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier))
|
|
||||||
(accessor_list
|
|
||||||
(accessor_declaration)))
|
|
||||||
(field_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier))
|
|
||||||
(accessor_list
|
|
||||||
(accessor_declaration)
|
|
||||||
(accessor_declaration)))
|
|
||||||
(field_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier))
|
|
||||||
(accessor_list
|
|
||||||
(accessor_declaration))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
PROPERTY Access Modifiers
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
global virtual class Me {
|
|
||||||
// X is private for read and public for write
|
|
||||||
public integer X { private get; set; }
|
|
||||||
// Y can be globally read but only written within a class
|
|
||||||
global integer Y { get; public set; }
|
|
||||||
// Z can be read within the class but only subclasses can set it
|
|
||||||
public integer Z { get; protected set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier)
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(line_comment)
|
|
||||||
(field_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier))
|
|
||||||
(accessor_list
|
|
||||||
(accessor_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier)))
|
|
||||||
(accessor_declaration)))
|
|
||||||
(line_comment)
|
|
||||||
(field_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier))
|
|
||||||
(accessor_list
|
|
||||||
(accessor_declaration)
|
|
||||||
(accessor_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier)))))
|
|
||||||
(line_comment)
|
|
||||||
(field_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier))
|
|
||||||
(accessor_list
|
|
||||||
(accessor_declaration)
|
|
||||||
(accessor_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
PROPERTY declared
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
public integer prop {
|
|
||||||
get { return prop; }
|
|
||||||
set { prop = value; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(field_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier))
|
|
||||||
(accessor_list
|
|
||||||
(accessor_declaration
|
|
||||||
(block
|
|
||||||
(return_statement
|
|
||||||
(identifier))))
|
|
||||||
(accessor_declaration
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(assignment_expression
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(identifier))))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
PROPERTY mixed
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
public integer prop {
|
|
||||||
get { return prop; }
|
|
||||||
set;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(field_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier))
|
|
||||||
(accessor_list
|
|
||||||
(accessor_declaration
|
|
||||||
(block
|
|
||||||
(return_statement
|
|
||||||
(identifier))))
|
|
||||||
(accessor_declaration))))))
|
|
||||||
@ -1,822 +0,0 @@
|
|||||||
================================================================================
|
|
||||||
QUERIES SOQL Simple Bound
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
List<Account> accs = [SELECT Id FROM Account
|
|
||||||
WHERE Name = :var1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(generic_type
|
|
||||||
(type_identifier)
|
|
||||||
(type_arguments
|
|
||||||
(type_identifier)))
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(query_expression
|
|
||||||
(soql_query
|
|
||||||
(soql_query_body
|
|
||||||
(select_clause
|
|
||||||
(field_identifier
|
|
||||||
(identifier)))
|
|
||||||
(from_clause
|
|
||||||
(storage_identifier
|
|
||||||
(identifier)))
|
|
||||||
(where_clause
|
|
||||||
(comparison_expression
|
|
||||||
(field_identifier
|
|
||||||
(identifier))
|
|
||||||
(value_comparison_operator)
|
|
||||||
(bound_apex_expression
|
|
||||||
(identifier)))))))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
QUERIES SOQL Arithmatic in binding
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
List<Account> accs = [SELECT Id FROM Account
|
|
||||||
WHERE Name = :('x' + 'xx')];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(generic_type
|
|
||||||
(type_identifier)
|
|
||||||
(type_arguments
|
|
||||||
(type_identifier)))
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(query_expression
|
|
||||||
(soql_query
|
|
||||||
(soql_query_body
|
|
||||||
(select_clause
|
|
||||||
(field_identifier
|
|
||||||
(identifier)))
|
|
||||||
(from_clause
|
|
||||||
(storage_identifier
|
|
||||||
(identifier)))
|
|
||||||
(where_clause
|
|
||||||
(comparison_expression
|
|
||||||
(field_identifier
|
|
||||||
(identifier))
|
|
||||||
(value_comparison_operator)
|
|
||||||
(bound_apex_expression
|
|
||||||
(parenthesized_expression
|
|
||||||
(binary_expression
|
|
||||||
(string_literal)
|
|
||||||
(string_literal)))))))))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
QUERIES SOQL Nested Query Expression
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
List<Account> accs = [
|
|
||||||
SELECT Id FROM Account
|
|
||||||
WHERE Name = :[SELECT Name FROM Account
|
|
||||||
WHERE Id = :A.Id].Name];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(generic_type
|
|
||||||
(type_identifier)
|
|
||||||
(type_arguments
|
|
||||||
(type_identifier)))
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(query_expression
|
|
||||||
(soql_query
|
|
||||||
(soql_query_body
|
|
||||||
(select_clause
|
|
||||||
(field_identifier
|
|
||||||
(identifier)))
|
|
||||||
(from_clause
|
|
||||||
(storage_identifier
|
|
||||||
(identifier)))
|
|
||||||
(where_clause
|
|
||||||
(comparison_expression
|
|
||||||
(field_identifier
|
|
||||||
(identifier))
|
|
||||||
(value_comparison_operator)
|
|
||||||
(bound_apex_expression
|
|
||||||
(field_access
|
|
||||||
(query_expression
|
|
||||||
(soql_query
|
|
||||||
(soql_query_body
|
|
||||||
(select_clause
|
|
||||||
(field_identifier
|
|
||||||
(identifier)))
|
|
||||||
(from_clause
|
|
||||||
(storage_identifier
|
|
||||||
(identifier)))
|
|
||||||
(where_clause
|
|
||||||
(comparison_expression
|
|
||||||
(field_identifier
|
|
||||||
(identifier))
|
|
||||||
(value_comparison_operator)
|
|
||||||
(bound_apex_expression
|
|
||||||
(field_access
|
|
||||||
(identifier)
|
|
||||||
(identifier))))))))
|
|
||||||
(identifier))))))))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
QUERIES SOQL array access
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
String name = [SELECT Name FROM Account
|
|
||||||
WHERE Id = :A.Id][0].Name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(field_access
|
|
||||||
(array_access
|
|
||||||
(query_expression
|
|
||||||
(soql_query
|
|
||||||
(soql_query_body
|
|
||||||
(select_clause
|
|
||||||
(field_identifier
|
|
||||||
(identifier)))
|
|
||||||
(from_clause
|
|
||||||
(storage_identifier
|
|
||||||
(identifier)))
|
|
||||||
(where_clause
|
|
||||||
(comparison_expression
|
|
||||||
(field_identifier
|
|
||||||
(identifier))
|
|
||||||
(value_comparison_operator)
|
|
||||||
(bound_apex_expression
|
|
||||||
(field_access
|
|
||||||
(identifier)
|
|
||||||
(identifier))))))))
|
|
||||||
(int))
|
|
||||||
(identifier))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
QUERIES SOQL property access
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
String name = [SELECT Name FROM Account
|
|
||||||
WHERE Id = :A.Id].Name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(field_access
|
|
||||||
(query_expression
|
|
||||||
(soql_query
|
|
||||||
(soql_query_body
|
|
||||||
(select_clause
|
|
||||||
(field_identifier
|
|
||||||
(identifier)))
|
|
||||||
(from_clause
|
|
||||||
(storage_identifier
|
|
||||||
(identifier)))
|
|
||||||
(where_clause
|
|
||||||
(comparison_expression
|
|
||||||
(field_identifier
|
|
||||||
(identifier))
|
|
||||||
(value_comparison_operator)
|
|
||||||
(bound_apex_expression
|
|
||||||
(field_access
|
|
||||||
(identifier)
|
|
||||||
(identifier))))))))
|
|
||||||
(identifier))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
QUERIES SOQL Bound Limit
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
Integer i = 1;
|
|
||||||
List<Account> accs = [SELECT Id FROM Account LIMIT :i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(int)))
|
|
||||||
(local_variable_declaration
|
|
||||||
(generic_type
|
|
||||||
(type_identifier)
|
|
||||||
(type_arguments
|
|
||||||
(type_identifier)))
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(query_expression
|
|
||||||
(soql_query
|
|
||||||
(soql_query_body
|
|
||||||
(select_clause
|
|
||||||
(field_identifier
|
|
||||||
(identifier)))
|
|
||||||
(from_clause
|
|
||||||
(storage_identifier
|
|
||||||
(identifier)))
|
|
||||||
(limit_clause
|
|
||||||
(bound_apex_expression
|
|
||||||
(identifier))))))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
QUERIES SOQL Bound Offset
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
Integer i = 1;
|
|
||||||
List<Account> accs = [SELECT Id FROM Account OFFSET :i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(int)))
|
|
||||||
(local_variable_declaration
|
|
||||||
(generic_type
|
|
||||||
(type_identifier)
|
|
||||||
(type_arguments
|
|
||||||
(type_identifier)))
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(query_expression
|
|
||||||
(soql_query
|
|
||||||
(soql_query_body
|
|
||||||
(select_clause
|
|
||||||
(field_identifier
|
|
||||||
(identifier)))
|
|
||||||
(from_clause
|
|
||||||
(storage_identifier
|
|
||||||
(identifier)))
|
|
||||||
(offset_clause
|
|
||||||
(bound_apex_expression
|
|
||||||
(identifier))))))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
QUERIES SOQL ALL ROWS
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
Integer i = 1;
|
|
||||||
Integer cnt = [SELECT COUNT() FROM Contact ALL ROWS];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(int)))
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(query_expression
|
|
||||||
(soql_query
|
|
||||||
(soql_query_body
|
|
||||||
(select_clause
|
|
||||||
(count_expression
|
|
||||||
(function_name)))
|
|
||||||
(from_clause
|
|
||||||
(storage_identifier
|
|
||||||
(identifier)))
|
|
||||||
(all_rows_clause))))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
QUERIES SOQL Complex bound expression without parens
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
String a = 'A';
|
|
||||||
List<Account> accs = [SELECT Id FROM Account WHERE Name = :'N'+a+'M'+'E' AND Name = 'NOPE'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(string_literal)))
|
|
||||||
(local_variable_declaration
|
|
||||||
(generic_type
|
|
||||||
(type_identifier)
|
|
||||||
(type_arguments
|
|
||||||
(type_identifier)))
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(query_expression
|
|
||||||
(soql_query
|
|
||||||
(soql_query_body
|
|
||||||
(select_clause
|
|
||||||
(field_identifier
|
|
||||||
(identifier)))
|
|
||||||
(from_clause
|
|
||||||
(storage_identifier
|
|
||||||
(identifier)))
|
|
||||||
(where_clause
|
|
||||||
(and_expression
|
|
||||||
(comparison_expression
|
|
||||||
(field_identifier
|
|
||||||
(identifier))
|
|
||||||
(value_comparison_operator)
|
|
||||||
(bound_apex_expression
|
|
||||||
(binary_expression
|
|
||||||
(binary_expression
|
|
||||||
(binary_expression
|
|
||||||
(string_literal)
|
|
||||||
(identifier))
|
|
||||||
(string_literal))
|
|
||||||
(string_literal))))
|
|
||||||
(comparison_expression
|
|
||||||
(field_identifier
|
|
||||||
(identifier))
|
|
||||||
(value_comparison_operator)
|
|
||||||
(string_literal)))))))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
QUERIES SOQL
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
List<Account> accs = [SELECT Id, Name FROM Account];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(generic_type
|
|
||||||
(type_identifier)
|
|
||||||
(type_arguments
|
|
||||||
(type_identifier)))
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(query_expression
|
|
||||||
(soql_query
|
|
||||||
(soql_query_body
|
|
||||||
(select_clause
|
|
||||||
(field_identifier
|
|
||||||
(identifier))
|
|
||||||
(field_identifier
|
|
||||||
(identifier)))
|
|
||||||
(from_clause
|
|
||||||
(storage_identifier
|
|
||||||
(identifier))))))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
QUERIES SOQL iterator
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
for(Account a : [SELECT Id FROM Account]){
|
|
||||||
System.debug(a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(enhanced_for_statement
|
|
||||||
(type_identifier)
|
|
||||||
(identifier)
|
|
||||||
(query_expression
|
|
||||||
(soql_query
|
|
||||||
(soql_query_body
|
|
||||||
(select_clause
|
|
||||||
(field_identifier
|
|
||||||
(identifier)))
|
|
||||||
(from_clause
|
|
||||||
(storage_identifier
|
|
||||||
(identifier))))))
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(identifier)
|
|
||||||
(argument_list
|
|
||||||
(identifier))))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
QUERIES SOQL For Collection
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
for(List<Account> accs : [SELECT Id FROM Account]){
|
|
||||||
for(Account a : accs){
|
|
||||||
System.debug(a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(enhanced_for_statement
|
|
||||||
(generic_type
|
|
||||||
(type_identifier)
|
|
||||||
(type_arguments
|
|
||||||
(type_identifier)))
|
|
||||||
(identifier)
|
|
||||||
(query_expression
|
|
||||||
(soql_query
|
|
||||||
(soql_query_body
|
|
||||||
(select_clause
|
|
||||||
(field_identifier
|
|
||||||
(identifier)))
|
|
||||||
(from_clause
|
|
||||||
(storage_identifier
|
|
||||||
(identifier))))))
|
|
||||||
(block
|
|
||||||
(enhanced_for_statement
|
|
||||||
(type_identifier)
|
|
||||||
(identifier)
|
|
||||||
(identifier)
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(identifier)
|
|
||||||
(argument_list
|
|
||||||
(identifier))))))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
QUERIES SOSL Term
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
List<List<SObject>> res =
|
|
||||||
[FIND 'hello' RETURNING Account];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(generic_type
|
|
||||||
(type_identifier)
|
|
||||||
(type_arguments
|
|
||||||
(generic_type
|
|
||||||
(type_identifier)
|
|
||||||
(type_arguments
|
|
||||||
(type_identifier)))))
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(query_expression
|
|
||||||
(sosl_query
|
|
||||||
(sosl_query_body
|
|
||||||
(find_clause
|
|
||||||
(term_separator_start)
|
|
||||||
(term)
|
|
||||||
(term_separator_end))
|
|
||||||
(returning_clause
|
|
||||||
(sobject_return
|
|
||||||
(identifier))))))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
QUERIES SOSL Bindings
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
List<List<SObject>> res =
|
|
||||||
[FIND :myString1 IN ALL FIELDS
|
|
||||||
RETURNING
|
|
||||||
Account (Id, Name WHERE Name LIKE :myString2
|
|
||||||
LIMIT :myInt3),
|
|
||||||
Contact,
|
|
||||||
Opportunity,
|
|
||||||
Lead
|
|
||||||
WITH DIVISION =:myString4
|
|
||||||
LIMIT :myInt5];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(generic_type
|
|
||||||
(type_identifier)
|
|
||||||
(type_arguments
|
|
||||||
(generic_type
|
|
||||||
(type_identifier)
|
|
||||||
(type_arguments
|
|
||||||
(type_identifier)))))
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(query_expression
|
|
||||||
(sosl_query
|
|
||||||
(sosl_query_body
|
|
||||||
(find_clause
|
|
||||||
(bound_apex_expression
|
|
||||||
(identifier)))
|
|
||||||
(in_clause
|
|
||||||
(in_type))
|
|
||||||
(returning_clause
|
|
||||||
(sobject_return
|
|
||||||
(identifier)
|
|
||||||
(selected_fields
|
|
||||||
(field_identifier
|
|
||||||
(identifier))
|
|
||||||
(field_identifier
|
|
||||||
(identifier)))
|
|
||||||
(where_clause
|
|
||||||
(comparison_expression
|
|
||||||
(field_identifier
|
|
||||||
(identifier))
|
|
||||||
(value_comparison_operator)
|
|
||||||
(bound_apex_expression
|
|
||||||
(identifier))))
|
|
||||||
(limit_clause
|
|
||||||
(bound_apex_expression
|
|
||||||
(identifier))))
|
|
||||||
(sobject_return
|
|
||||||
(identifier))
|
|
||||||
(sobject_return
|
|
||||||
(identifier))
|
|
||||||
(sobject_return
|
|
||||||
(identifier)))
|
|
||||||
(with_clause
|
|
||||||
(with_type
|
|
||||||
(with_division_expression
|
|
||||||
(bound_apex_expression
|
|
||||||
(identifier)))))
|
|
||||||
(limit_clause
|
|
||||||
(bound_apex_expression
|
|
||||||
(identifier))))))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
QUERIES SOQL Includes with Parens
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
[
|
|
||||||
SELECT Body__c
|
|
||||||
FROM Banner__c
|
|
||||||
WHERE
|
|
||||||
Language__c = :langCode
|
|
||||||
AND Visible__c = TRUE
|
|
||||||
AND Channel__c INCLUDES (:channel)
|
|
||||||
AND Market__c INCLUDES (:marketCode)
|
|
||||||
ORDER BY Order__c
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(query_expression
|
|
||||||
(soql_query
|
|
||||||
(soql_query_body
|
|
||||||
(select_clause
|
|
||||||
(field_identifier
|
|
||||||
(identifier)))
|
|
||||||
(from_clause
|
|
||||||
(storage_identifier
|
|
||||||
(identifier)))
|
|
||||||
(where_clause
|
|
||||||
(and_expression
|
|
||||||
(comparison_expression
|
|
||||||
(field_identifier
|
|
||||||
(identifier))
|
|
||||||
(value_comparison_operator)
|
|
||||||
(bound_apex_expression
|
|
||||||
(identifier)))
|
|
||||||
(comparison_expression
|
|
||||||
(field_identifier
|
|
||||||
(identifier))
|
|
||||||
(value_comparison_operator)
|
|
||||||
(boolean))
|
|
||||||
(comparison_expression
|
|
||||||
(field_identifier
|
|
||||||
(identifier))
|
|
||||||
(set_comparison_operator)
|
|
||||||
(bound_apex_expression
|
|
||||||
(identifier)))
|
|
||||||
(comparison_expression
|
|
||||||
(field_identifier
|
|
||||||
(identifier))
|
|
||||||
(set_comparison_operator)
|
|
||||||
(bound_apex_expression
|
|
||||||
(identifier)))))
|
|
||||||
(order_by_clause
|
|
||||||
(order_expression
|
|
||||||
(field_identifier
|
|
||||||
(identifier))))))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
QUERIES SOQL Date Literal With Param
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
List<Account> accounts = [
|
|
||||||
SELECT Id
|
|
||||||
FROM Account
|
|
||||||
WHERE CreatedDate = LAST_N_DAYS:60
|
|
||||||
];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(generic_type
|
|
||||||
(type_identifier)
|
|
||||||
(type_arguments
|
|
||||||
(type_identifier)))
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(query_expression
|
|
||||||
(soql_query
|
|
||||||
(soql_query_body
|
|
||||||
(select_clause
|
|
||||||
(field_identifier
|
|
||||||
(identifier)))
|
|
||||||
(from_clause
|
|
||||||
(storage_identifier
|
|
||||||
(identifier)))
|
|
||||||
(where_clause
|
|
||||||
(comparison_expression
|
|
||||||
(field_identifier
|
|
||||||
(identifier))
|
|
||||||
(value_comparison_operator)
|
|
||||||
(date_literal_with_param
|
|
||||||
(date_literal)
|
|
||||||
(int)))))))))))))
|
|
||||||
@ -1,489 +0,0 @@
|
|||||||
================================================================================
|
|
||||||
SWITCH
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
Integer i = 0;
|
|
||||||
|
|
||||||
switch on i {
|
|
||||||
when 2 {
|
|
||||||
System.debug('when block 2');
|
|
||||||
}
|
|
||||||
when null {
|
|
||||||
System.debug('bad integer');
|
|
||||||
}
|
|
||||||
when else {
|
|
||||||
System.debug('default ' + i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(int)))
|
|
||||||
(switch_expression
|
|
||||||
(identifier)
|
|
||||||
(switch_block
|
|
||||||
(switch_rule
|
|
||||||
(switch_label
|
|
||||||
(int))
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(identifier)
|
|
||||||
(argument_list
|
|
||||||
(string_literal))))))
|
|
||||||
(switch_rule
|
|
||||||
(switch_label
|
|
||||||
(null_literal))
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(identifier)
|
|
||||||
(argument_list
|
|
||||||
(string_literal))))))
|
|
||||||
(switch_rule
|
|
||||||
(switch_label)
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(identifier)
|
|
||||||
(argument_list
|
|
||||||
(binary_expression
|
|
||||||
(string_literal)
|
|
||||||
(identifier)))))))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
SWITCH multiple
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
Integer i = 0;
|
|
||||||
|
|
||||||
switch on i {
|
|
||||||
when 2, 3, 4 {
|
|
||||||
System.debug('when block 2 and 3 and 4');
|
|
||||||
}
|
|
||||||
when 5, 6 {
|
|
||||||
System.debug('when block 5 and 6');
|
|
||||||
}
|
|
||||||
when 7 {
|
|
||||||
System.debug('when block 7');
|
|
||||||
}
|
|
||||||
when else {
|
|
||||||
System.debug('default');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(int)))
|
|
||||||
(switch_expression
|
|
||||||
(identifier)
|
|
||||||
(switch_block
|
|
||||||
(switch_rule
|
|
||||||
(switch_label
|
|
||||||
(int)
|
|
||||||
(int)
|
|
||||||
(int))
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(identifier)
|
|
||||||
(argument_list
|
|
||||||
(string_literal))))))
|
|
||||||
(switch_rule
|
|
||||||
(switch_label
|
|
||||||
(int)
|
|
||||||
(int))
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(identifier)
|
|
||||||
(argument_list
|
|
||||||
(string_literal))))))
|
|
||||||
(switch_rule
|
|
||||||
(switch_label
|
|
||||||
(int))
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(identifier)
|
|
||||||
(argument_list
|
|
||||||
(string_literal))))))
|
|
||||||
(switch_rule
|
|
||||||
(switch_label)
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(identifier)
|
|
||||||
(argument_list
|
|
||||||
(string_literal))))))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
SWITCH method results
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
Integer i = 0;
|
|
||||||
|
|
||||||
switch on someInteger(i) {
|
|
||||||
when 2 {
|
|
||||||
System.debug('when block 2');
|
|
||||||
}
|
|
||||||
when 3 {
|
|
||||||
System.debug('when block 3');
|
|
||||||
}
|
|
||||||
when else {
|
|
||||||
System.debug('default');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(int)))
|
|
||||||
(switch_expression
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(argument_list
|
|
||||||
(identifier)))
|
|
||||||
(switch_block
|
|
||||||
(switch_rule
|
|
||||||
(switch_label
|
|
||||||
(int))
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(identifier)
|
|
||||||
(argument_list
|
|
||||||
(string_literal))))))
|
|
||||||
(switch_rule
|
|
||||||
(switch_label
|
|
||||||
(int))
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(identifier)
|
|
||||||
(argument_list
|
|
||||||
(string_literal))))))
|
|
||||||
(switch_rule
|
|
||||||
(switch_label)
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(identifier)
|
|
||||||
(argument_list
|
|
||||||
(string_literal))))))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
SWITCH sObject
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
SObject s = new Account();
|
|
||||||
|
|
||||||
switch on s {
|
|
||||||
when Account a {
|
|
||||||
System.debug('account ' + a);
|
|
||||||
}
|
|
||||||
when Contact c {
|
|
||||||
System.debug('contact ' + c);
|
|
||||||
}
|
|
||||||
when null {
|
|
||||||
System.debug('null');
|
|
||||||
}
|
|
||||||
when else {
|
|
||||||
System.debug('default');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(object_creation_expression
|
|
||||||
(type_identifier)
|
|
||||||
(argument_list))))
|
|
||||||
(switch_expression
|
|
||||||
(identifier)
|
|
||||||
(switch_block
|
|
||||||
(switch_rule
|
|
||||||
(switch_label
|
|
||||||
(type_identifier)
|
|
||||||
(identifier))
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(identifier)
|
|
||||||
(argument_list
|
|
||||||
(binary_expression
|
|
||||||
(string_literal)
|
|
||||||
(identifier)))))))
|
|
||||||
(switch_rule
|
|
||||||
(switch_label
|
|
||||||
(type_identifier)
|
|
||||||
(identifier))
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(identifier)
|
|
||||||
(argument_list
|
|
||||||
(binary_expression
|
|
||||||
(string_literal)
|
|
||||||
(identifier)))))))
|
|
||||||
(switch_rule
|
|
||||||
(switch_label
|
|
||||||
(null_literal))
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(identifier)
|
|
||||||
(argument_list
|
|
||||||
(string_literal))))))
|
|
||||||
(switch_rule
|
|
||||||
(switch_label)
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(identifier)
|
|
||||||
(argument_list
|
|
||||||
(string_literal))))))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
SWITCH Enum
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
SObject s = new Account();
|
|
||||||
|
|
||||||
switch on season {
|
|
||||||
when WINTER {
|
|
||||||
System.debug('boots');
|
|
||||||
}
|
|
||||||
when SPRING, SUMMER {
|
|
||||||
System.debug('sandals');
|
|
||||||
}
|
|
||||||
when else {
|
|
||||||
System.debug('none of the above');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(object_creation_expression
|
|
||||||
(type_identifier)
|
|
||||||
(argument_list))))
|
|
||||||
(switch_expression
|
|
||||||
(identifier)
|
|
||||||
(switch_block
|
|
||||||
(switch_rule
|
|
||||||
(switch_label
|
|
||||||
(identifier))
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(identifier)
|
|
||||||
(argument_list
|
|
||||||
(string_literal))))))
|
|
||||||
(switch_rule
|
|
||||||
(switch_label
|
|
||||||
(identifier)
|
|
||||||
(identifier))
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(identifier)
|
|
||||||
(argument_list
|
|
||||||
(string_literal))))))
|
|
||||||
(switch_rule
|
|
||||||
(switch_label)
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(method_invocation
|
|
||||||
(identifier)
|
|
||||||
(identifier)
|
|
||||||
(argument_list
|
|
||||||
(string_literal))))))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
SWITCH With Parens
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
switch on (x) {
|
|
||||||
when 1 { return 1; }
|
|
||||||
when ((2)) { return 2; }
|
|
||||||
when (3), (4) { return 3; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(switch_expression
|
|
||||||
(parenthesized_expression
|
|
||||||
(identifier))
|
|
||||||
(switch_block
|
|
||||||
(switch_rule
|
|
||||||
(switch_label
|
|
||||||
(int))
|
|
||||||
(block
|
|
||||||
(return_statement
|
|
||||||
(int))))
|
|
||||||
(switch_rule
|
|
||||||
(switch_label
|
|
||||||
(parenthesized_expression
|
|
||||||
(parenthesized_expression
|
|
||||||
(int))))
|
|
||||||
(block
|
|
||||||
(return_statement
|
|
||||||
(int))))
|
|
||||||
(switch_rule
|
|
||||||
(switch_label
|
|
||||||
(parenthesized_expression
|
|
||||||
(int))
|
|
||||||
(parenthesized_expression
|
|
||||||
(int)))
|
|
||||||
(block
|
|
||||||
(return_statement
|
|
||||||
(int))))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
SWITCH on values
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
switch on monthsSinceFiscalStart {
|
|
||||||
when 1, 2, 3, -9, -10, -11 {
|
|
||||||
fiscalQuarter = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(switch_expression
|
|
||||||
(identifier)
|
|
||||||
(switch_block
|
|
||||||
(switch_rule
|
|
||||||
(switch_label
|
|
||||||
(int)
|
|
||||||
(int)
|
|
||||||
(int)
|
|
||||||
(unary_expression
|
|
||||||
(int))
|
|
||||||
(unary_expression
|
|
||||||
(int))
|
|
||||||
(unary_expression
|
|
||||||
(int)))
|
|
||||||
(block
|
|
||||||
(expression_statement
|
|
||||||
(assignment_expression
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(int)))))))))))
|
|
||||||
@ -1,36 +0,0 @@
|
|||||||
================================================================================
|
|
||||||
TRIGGER with all events
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
trigger myAccountTrigger on Account (
|
|
||||||
before insert,
|
|
||||||
before update,
|
|
||||||
before delete,
|
|
||||||
after insert,
|
|
||||||
after update,
|
|
||||||
after delete,
|
|
||||||
after undelete) {
|
|
||||||
Integer i = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(trigger_declaration
|
|
||||||
(identifier)
|
|
||||||
(identifier)
|
|
||||||
(trigger_event)
|
|
||||||
(trigger_event)
|
|
||||||
(trigger_event)
|
|
||||||
(trigger_event)
|
|
||||||
(trigger_event)
|
|
||||||
(trigger_event)
|
|
||||||
(trigger_event)
|
|
||||||
(trigger_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(int)))))))
|
|
||||||
@ -1,428 +0,0 @@
|
|||||||
================================================================================
|
|
||||||
VARIABLE list initialized with new list
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
List<Integer> ints = new List<Integer>();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(generic_type
|
|
||||||
(type_identifier)
|
|
||||||
(type_arguments
|
|
||||||
(type_identifier)))
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(object_creation_expression
|
|
||||||
(generic_type
|
|
||||||
(type_identifier)
|
|
||||||
(type_arguments
|
|
||||||
(type_identifier)))
|
|
||||||
(argument_list))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
VARIABLE list initialized with populated list
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
List<Integer> ints = new List<Integer>{1,2,3};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(generic_type
|
|
||||||
(type_identifier)
|
|
||||||
(type_arguments
|
|
||||||
(type_identifier)))
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(array_creation_expression
|
|
||||||
(generic_type
|
|
||||||
(type_identifier)
|
|
||||||
(type_arguments
|
|
||||||
(type_identifier)))
|
|
||||||
(array_initializer
|
|
||||||
(int)
|
|
||||||
(int)
|
|
||||||
(int)))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
VARIABLE list initialized with new array
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
List<Integer> ints = new Integer[0];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(generic_type
|
|
||||||
(type_identifier)
|
|
||||||
(type_arguments
|
|
||||||
(type_identifier)))
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(array_creation_expression
|
|
||||||
(type_identifier)
|
|
||||||
(dimensions_expr
|
|
||||||
(int)))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
VARIABLE list initialized with populated array
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
List<Integer> ints = new Integer[]{1,2,3};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(generic_type
|
|
||||||
(type_identifier)
|
|
||||||
(type_arguments
|
|
||||||
(type_identifier)))
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(array_creation_expression
|
|
||||||
(type_identifier)
|
|
||||||
(dimensions)
|
|
||||||
(array_initializer
|
|
||||||
(int)
|
|
||||||
(int)
|
|
||||||
(int)))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
VARIABLE array filled with new array
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
Integer[] ints = new Integer[0];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(array_type
|
|
||||||
(type_identifier)
|
|
||||||
(dimensions))
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(array_creation_expression
|
|
||||||
(type_identifier)
|
|
||||||
(dimensions_expr
|
|
||||||
(int)))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
VARIABLE Set with new
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
Set<Integer> ints = new Set<Integer>();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(generic_type
|
|
||||||
(type_identifier)
|
|
||||||
(type_arguments
|
|
||||||
(type_identifier)))
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(object_creation_expression
|
|
||||||
(generic_type
|
|
||||||
(type_identifier)
|
|
||||||
(type_arguments
|
|
||||||
(type_identifier)))
|
|
||||||
(argument_list))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
VARIABLE Set with populated
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
Set<Integer> ints = new Set<Integer>{1,2,3};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(generic_type
|
|
||||||
(type_identifier)
|
|
||||||
(type_arguments
|
|
||||||
(type_identifier)))
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(array_creation_expression
|
|
||||||
(generic_type
|
|
||||||
(type_identifier)
|
|
||||||
(type_arguments
|
|
||||||
(type_identifier)))
|
|
||||||
(array_initializer
|
|
||||||
(int)
|
|
||||||
(int)
|
|
||||||
(int)))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
VARIABLE Map with new
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
Map<String,Integer> intsBymap = new Map<String,Integer>();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(generic_type
|
|
||||||
(type_identifier)
|
|
||||||
(type_arguments
|
|
||||||
(type_identifier)
|
|
||||||
(type_identifier)))
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(object_creation_expression
|
|
||||||
(generic_type
|
|
||||||
(type_identifier)
|
|
||||||
(type_arguments
|
|
||||||
(type_identifier)
|
|
||||||
(type_identifier)))
|
|
||||||
(argument_list))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
VARIABLE Map with populated
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
Map<String,Integer> intsBymap = new Map<String,Integer>{'hello' => 1, 'world' => 2};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(generic_type
|
|
||||||
(type_identifier)
|
|
||||||
(type_arguments
|
|
||||||
(type_identifier)
|
|
||||||
(type_identifier)))
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(map_creation_expression
|
|
||||||
(generic_type
|
|
||||||
(type_identifier)
|
|
||||||
(type_arguments
|
|
||||||
(type_identifier)
|
|
||||||
(type_identifier)))
|
|
||||||
(map_initializer
|
|
||||||
(string_literal)
|
|
||||||
(int)
|
|
||||||
(string_literal)
|
|
||||||
(int)))))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
VARIABLE initialize multiple on a line
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
Integer i,j,k;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier))
|
|
||||||
(variable_declarator
|
|
||||||
(identifier))
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
VARIABLE initialize multiple on a line sparse values
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
Integer i = 0, j, k = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(int))
|
|
||||||
(variable_declarator
|
|
||||||
(identifier))
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(int)))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
VARIABLE unicode in string
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
String v = 'Hello\u2019 from world\U2019';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(string_literal)))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
VARIABLE negative int
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
{
|
|
||||||
Integer i = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(parser_output
|
|
||||||
(class_declaration
|
|
||||||
(modifiers
|
|
||||||
(modifier))
|
|
||||||
(identifier)
|
|
||||||
(class_body
|
|
||||||
(block
|
|
||||||
(local_variable_declaration
|
|
||||||
(type_identifier)
|
|
||||||
(variable_declarator
|
|
||||||
(identifier)
|
|
||||||
(assignment_operator)
|
|
||||||
(unary_expression
|
|
||||||
(int))))))))
|
|
||||||
@ -1,55 +0,0 @@
|
|||||||
@Annotation(param1=false, param2='hello')
|
|
||||||
// <- operator
|
|
||||||
// ^ decorator
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ variable.readonly.defaultLibrary
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ string
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
public class Me {{
|
|
||||||
// <- keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ class
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
@InvocableVariable(required=true label='Old User')
|
|
||||||
// ^ operator
|
|
||||||
// ^ decorator
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ variable.readonly.defaultLibrary
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ string
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
public Id oldUserId;// TODO: this isn't a local variable declaration, it should be a field declaration
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
}
|
|
||||||
//^ punctuation
|
|
||||||
|
|
||||||
@Annotation('this is a test of \' strings')
|
|
||||||
//^ operator
|
|
||||||
// ^ decorator
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ string
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
public class Me {
|
|
||||||
// ^ keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ class
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
}
|
|
||||||
//^ punctuation
|
|
||||||
}
|
|
||||||
// <- punctuation
|
|
||||||
@ -1,53 +0,0 @@
|
|||||||
public class Me extends You {
|
|
||||||
// <- keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ class
|
|
||||||
// ^ keyword
|
|
||||||
// ^ class
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
private String world;
|
|
||||||
//^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ property
|
|
||||||
|
|
||||||
public Me() {
|
|
||||||
//^ keyword
|
|
||||||
// ^ class
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
this('foo');
|
|
||||||
// ^ variable.defaultLibrary
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ string
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
//^ punctuation
|
|
||||||
|
|
||||||
private Me(String hello){
|
|
||||||
//^ keyword
|
|
||||||
// ^ class
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
super(hello);
|
|
||||||
// ^ function.defaultLibrary
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
this.world = hello;
|
|
||||||
// ^ variable.defaultLibrary
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ property
|
|
||||||
// ^ operator
|
|
||||||
// ^ variable
|
|
||||||
}
|
|
||||||
//^ punctuation
|
|
||||||
}
|
|
||||||
// <- punctuation
|
|
||||||
@ -1,242 +0,0 @@
|
|||||||
public class Me {
|
|
||||||
// <- keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ class
|
|
||||||
// ^ punctuation
|
|
||||||
{
|
|
||||||
// ^ punctuation
|
|
||||||
if(true){
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable.readonly.defaultLibrary
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
Integer i = 1;
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
if(true)
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable.readonly.defaultLibrary
|
|
||||||
// ^ punctuation
|
|
||||||
Integer i = 1;
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
if(true) {
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable.readonly.defaultLibrary
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
Integer i = 1;
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
} else {
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
Integer j = 2;
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
if(true)
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable.readonly.defaultLibrary
|
|
||||||
// ^ punctuation
|
|
||||||
Integer i = 1;
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
else
|
|
||||||
// ^ keyword
|
|
||||||
Integer j = 2;
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
if(true)
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable.readonly.defaultLibrary
|
|
||||||
// ^ punctuation
|
|
||||||
Integer i = 1;
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
else if(false)
|
|
||||||
// ^ keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable.readonly.defaultLibrary
|
|
||||||
// ^ punctuation
|
|
||||||
Integer l = 3;
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
else
|
|
||||||
// ^ keyword
|
|
||||||
Integer j = 2;
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
if(true) {
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable.readonly.defaultLibrary
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
Integer i = 1;
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
} else if(false) {
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable.readonly.defaultLibrary
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
Integer l = 3;
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
} else {
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
Integer j = 2;
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
do {
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
Integer i = 1;
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
} while(true);
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable.readonly.defaultLibrary
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
while (true) {
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable.readonly.defaultLibrary
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
Integer i = 1;
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
for(Integer i = 0; i < 3; i++){
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^^ operator
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
System.debug(i);
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ method
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
for(Account a : accs){
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
System.debug(a);
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ method
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
System.runAs(new User(Id = UserInfo.getUserId())) {}
|
|
||||||
// ^^^^^^^^^^^^ method.defaultLibrary
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ keyword
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// <- punctuation
|
|
||||||
@ -1,53 +0,0 @@
|
|||||||
private virtual with sharing class Me {
|
|
||||||
// <- keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^^^^^^^^^^^^ keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ class
|
|
||||||
// ^ punctuation
|
|
||||||
{
|
|
||||||
// ^ punctuation
|
|
||||||
update a;
|
|
||||||
// ^ function.defaultLibrary
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
insert a;
|
|
||||||
// ^ function.defaultLibrary
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
upsert a;
|
|
||||||
// ^ function.defaultLibrary
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
upsert a Account.Id;
|
|
||||||
// ^ function.defaultLibrary
|
|
||||||
// ^ variable
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
delete a;
|
|
||||||
// ^ function.defaultLibrary
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
delete a.Id;
|
|
||||||
// ^ function.defaultLibrary
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ property
|
|
||||||
// ^ punctuation
|
|
||||||
undelete a.Id;
|
|
||||||
// ^ function.defaultLibrary
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ property
|
|
||||||
// ^ punctuation
|
|
||||||
merge a b;
|
|
||||||
// ^ function.defaultLibrary
|
|
||||||
// ^ variable
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// <- punctuation
|
|
||||||
@ -1,9 +0,0 @@
|
|||||||
public enum MyEnumClass { X, Y }
|
|
||||||
// <- keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ enum
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ enumMember
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ enumMember
|
|
||||||
// ^ punctuation
|
|
||||||
@ -1,34 +0,0 @@
|
|||||||
public class Me {
|
|
||||||
// <- keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ class
|
|
||||||
// ^ punctuation
|
|
||||||
public enum Season {WINTER, SPRING, SUMMER, FALL}
|
|
||||||
// ^ keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ enum
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ enumMember
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ enumMember
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ enumMember
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ enumMember
|
|
||||||
// ^ punctuation
|
|
||||||
{
|
|
||||||
//^ punctuation
|
|
||||||
Season s = Season.SPRING;
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ enum
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ enumMember
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
//^ punctuation
|
|
||||||
}
|
|
||||||
// <- punctuation
|
|
||||||
@ -1,73 +0,0 @@
|
|||||||
public class Me {
|
|
||||||
// <- keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ class
|
|
||||||
// ^ punctuation
|
|
||||||
{
|
|
||||||
// ^ punctuation
|
|
||||||
Account a = new Account(Name='Acme');
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ string
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
try {
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
insert a;
|
|
||||||
// ^ function.defaultLibrary
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
} catch(DmlException e) {
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
// Process exception here
|
|
||||||
// ^^^^^^^^^^ comment
|
|
||||||
Boolean failed = true;
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ variable.readonly.defaultLibrary
|
|
||||||
// ^ punctuation
|
|
||||||
} catch(Exception e) {
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
// Process exception here
|
|
||||||
Boolean failed = true;
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ variable.readonly.defaultLibrary
|
|
||||||
// ^ punctuation
|
|
||||||
} finally {
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
Boolean finallyRan = true;
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ variable.readonly.defaultLibrary
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// <- punctuation
|
|
||||||
@ -1,27 +0,0 @@
|
|||||||
public class Me {{
|
|
||||||
// <- keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ class
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
AccountTriggerhandler.seenRecordsMap = new Map<String, Set<Id>>();
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ property
|
|
||||||
// ^ operator
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
} }
|
|
||||||
// <- punctuation
|
|
||||||
//^ punctuation
|
|
||||||
@ -1,44 +0,0 @@
|
|||||||
public class Me {
|
|
||||||
// <- keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ class
|
|
||||||
// ^ punctuation
|
|
||||||
{
|
|
||||||
// ^ punctuation
|
|
||||||
SObject a = new Account();
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
if(a instanceof Account) {
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
Account p = (Account)a;
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
} else {
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// something else...
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// <- punctuation
|
|
||||||
@ -1,14 +0,0 @@
|
|||||||
public virtual interface MyInterface {
|
|
||||||
// <- keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ interface
|
|
||||||
// ^ punctuation
|
|
||||||
void myMethod();
|
|
||||||
//^ type.defaultLibrary
|
|
||||||
// ^ method
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// <- punctuation
|
|
||||||
@ -1,10 +0,0 @@
|
|||||||
global class Me implements Interface1, Interface2 {}
|
|
||||||
// <- keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ class
|
|
||||||
// ^ keyword
|
|
||||||
// ^ interface
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ interface
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
@ -1,78 +0,0 @@
|
|||||||
public class Me {
|
|
||||||
// <- keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ class
|
|
||||||
// ^ punctuation
|
|
||||||
public void method1(String param1, Integer param2){
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type.defaultLibrary
|
|
||||||
// ^ method
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ parameter
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ parameter
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
param1 = '1';
|
|
||||||
// ^ parameter
|
|
||||||
// ^ operator
|
|
||||||
// ^ string
|
|
||||||
// ^ punctuation
|
|
||||||
param2 = 2;
|
|
||||||
// ^ parameter
|
|
||||||
// ^ operator
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
global Integer method1(Integer param1){
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ method
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ parameter
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
return param1;
|
|
||||||
// ^ keyword
|
|
||||||
// ^ parameter
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
public void helloWorld(final Integer i){
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type.defaultLibrary
|
|
||||||
// ^ method
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ parameter
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
System.debug(i);
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ parameter
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
public testMethod void helloWorld(){
|
|
||||||
// ^ keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type.defaultLibrary
|
|
||||||
// ^ method
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
System.debug(i);
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// <- punctuation
|
|
||||||
@ -1,158 +0,0 @@
|
|||||||
public class TestObject2 {
|
|
||||||
// ^ keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ class
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
|
|
||||||
public Integer test1;
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ property
|
|
||||||
// ^ punctuation
|
|
||||||
private Integer test1;
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ property
|
|
||||||
// ^ punctuation
|
|
||||||
protected Integer test1;
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ property
|
|
||||||
// ^ punctuation
|
|
||||||
global Integer test1;
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ property
|
|
||||||
// ^ punctuation
|
|
||||||
Integer test1;
|
|
||||||
// ^ type
|
|
||||||
// ^ property
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
|
|
||||||
final Integer test1;
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ property
|
|
||||||
// ^ punctuation
|
|
||||||
static Integer test1;
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ property
|
|
||||||
// ^ punctuation
|
|
||||||
transient Integer test1;
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ property
|
|
||||||
// ^ punctuation
|
|
||||||
static transient Integer test1;
|
|
||||||
// ^ keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ property
|
|
||||||
// ^ punctuation
|
|
||||||
final static Integer test1;
|
|
||||||
// ^ keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ variable.readonly
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
public integer X { private get; set; }
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ property
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
global integer Y { get; public set; }
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ property
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
public integer Z { get; protected set; }
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ property
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
public integer prop {
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ property
|
|
||||||
// ^ punctuation
|
|
||||||
get { return prop; }
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ keyword
|
|
||||||
// ^ property
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
set { prop = value; }
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ property
|
|
||||||
// ^ operator
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
public integer prop {
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ property
|
|
||||||
// ^
|
|
||||||
get { return prop; }
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ keyword
|
|
||||||
// ^ property
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
set;
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
private static final Integer TestConst = 10;
|
|
||||||
// ^ keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ variable.readonly
|
|
||||||
// ^ operator
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
{
|
|
||||||
// ^ punctuation
|
|
||||||
Integer i = TestConst;
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ variable.readonly
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// <- punctuation
|
|
||||||
@ -1,272 +0,0 @@
|
|||||||
public class Me {
|
|
||||||
// <- keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ class
|
|
||||||
// ^ punctuation
|
|
||||||
{
|
|
||||||
// ^ punctuation
|
|
||||||
List<Account> accs =
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
[SELECT Id FROM Account WHERE Name = :('x' + 'xx')];
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ keyword
|
|
||||||
// ^ property
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ keyword
|
|
||||||
// ^ property
|
|
||||||
// ^ operator
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ string
|
|
||||||
// ^ operator
|
|
||||||
// ^ string
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
List<Account> accs = [
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
SELECT Id FROM Account
|
|
||||||
// ^ keyword
|
|
||||||
// ^ property
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
WHERE Name = :[SELECT Name FROM Account
|
|
||||||
// ^ keyword
|
|
||||||
// ^ property
|
|
||||||
// ^ operator
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ keyword
|
|
||||||
// ^ property
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
WHERE Id = :A.Id].Name];
|
|
||||||
// ^ keyword
|
|
||||||
// ^ property
|
|
||||||
// ^ operator
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ property
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ property
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
String name = [SELECT Name FROM Account
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ keyword
|
|
||||||
// ^ property
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
WHERE Id = :A.Id][0].Name;
|
|
||||||
// ^ keyword
|
|
||||||
// ^ property
|
|
||||||
// ^ operator
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ property
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ property
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
Integer cnt = [SELECT COUNT() FROM Contact ALL ROWS];
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ keyword
|
|
||||||
// ^ function
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^^^^^^^^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
String a = 'A';
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ string
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
List<Account> accs =
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
[SELECT Id FROM Account WHERE Name = :'N'+a+'M'+'E' AND Name = 'NOPE'];
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ keyword
|
|
||||||
// ^ property
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ keyword
|
|
||||||
// ^ property
|
|
||||||
// ^ operator
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ string
|
|
||||||
// ^ operator
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ string
|
|
||||||
// ^ operator
|
|
||||||
// ^ string
|
|
||||||
// ^ operator
|
|
||||||
// ^ property
|
|
||||||
// ^ operator
|
|
||||||
// ^ string
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
for(Account a : [SELECT Id FROM Account]){
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ keyword
|
|
||||||
// ^ property
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
System.debug(a);
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ method
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
for(List<Account> accs : [SELECT Id FROM Account]){
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ keyword
|
|
||||||
// ^ property
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
for(Account a : accs){
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
System.debug(a);
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ method
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
List<List<SObject>> res =
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
|
|
||||||
[FIND :myString1 IN ALL FIELDS
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// ^variable
|
|
||||||
// ^^^^^^^^^^^^^ keyword
|
|
||||||
RETURNING
|
|
||||||
// ^ keyword
|
|
||||||
Account (Id, Name WHERE Name LIKE :myString2
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ property
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ property
|
|
||||||
// ^ keyword
|
|
||||||
// ^ property
|
|
||||||
// ^ operator
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
LIMIT :myInt3),
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
Contact,
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
Opportunity,
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
Lead
|
|
||||||
// ^ type
|
|
||||||
WITH DIVISION =:myString4
|
|
||||||
// ^ keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ operator
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
LIMIT :myInt5];
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// <- punctuation
|
|
||||||
@ -1,230 +0,0 @@
|
|||||||
public class Me {
|
|
||||||
// <- keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ class
|
|
||||||
// ^ punctuation
|
|
||||||
{
|
|
||||||
// ^ punctuation
|
|
||||||
Integer i = 0;
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
switch on i {
|
|
||||||
// ^ keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
when 2, 3, 4 {
|
|
||||||
// ^ keyword
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
System.debug('when block 2');
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ method
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ string
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
when null {
|
|
||||||
// ^ keyword
|
|
||||||
// ^ variable.readonly.defaultLibrary
|
|
||||||
// ^ punctuation
|
|
||||||
System.debug('bad integer');
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ method
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ string
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
when else {
|
|
||||||
// ^ keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
System.debug('default ' + i);
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ method
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ string
|
|
||||||
// ^ operator
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
switch on someInteger(i) {
|
|
||||||
// ^ keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ method
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
when 2 {
|
|
||||||
// ^ keyword
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
System.debug('when block 2');
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ method
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ string
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
when else {
|
|
||||||
// ^ keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
System.debug('default');
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ method
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ string
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
SObject s = new Account();
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
switch on s {
|
|
||||||
// ^ keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
when Account a {
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
System.debug('account ' + a);
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ method
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ string
|
|
||||||
// ^ operator
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
when Contact c {
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
System.debug('contact ' + c);
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ method
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ string
|
|
||||||
// ^ operator
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
when else {
|
|
||||||
// ^ keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
System.debug('default');
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ method
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ string
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
switch on season {
|
|
||||||
// ^ keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
when WINTER { // TODO: would be nice if it understood it was an enumMember
|
|
||||||
// ^ keyword
|
|
||||||
// ^ enumMember
|
|
||||||
// ^ punctuation
|
|
||||||
System.debug('boots');
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ method
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ string
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
when SPRING, SUMMER {
|
|
||||||
// ^ keyword
|
|
||||||
// ^ enumMember
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ enumMember
|
|
||||||
// ^ punctuation
|
|
||||||
System.debug('sandals');
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ method
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ string
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
when else {
|
|
||||||
// ^ keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
System.debug('none of the above');
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ method
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ string
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// <- punctuation
|
|
||||||
@ -1,36 +0,0 @@
|
|||||||
trigger myAccountTrigger on Account (
|
|
||||||
// <- keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
before insert,
|
|
||||||
// ^^^^^^^^^^^^^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
before update,
|
|
||||||
// ^^^^^^^^^^^^^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
before delete,
|
|
||||||
// ^^^^^^^^^^^^^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
after insert,
|
|
||||||
// ^^^^^^^^^^^^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
after update,
|
|
||||||
// ^^^^^^^^^^^^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
after delete,
|
|
||||||
// ^^^^^^^^^^^^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
after undelete) {
|
|
||||||
// ^^^^^^^^^^^^^^ keyword
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
Integer i = 1;
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
// <- punctuation
|
|
||||||
@ -1,186 +0,0 @@
|
|||||||
public class Me {
|
|
||||||
// <- keyword
|
|
||||||
// ^ keyword
|
|
||||||
// ^ class
|
|
||||||
// ^ punctuation
|
|
||||||
{
|
|
||||||
//^ punctuation
|
|
||||||
List<Integer> ints = new List<Integer>();
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
List<Integer> ints = new List<Integer>{1,2,3};
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
List<Integer> ints = new Integer[0];
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
List<Integer> ints = new Integer[]{1,2,3};
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
Integer[] ints = new Integer[0];
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
Set<Integer> ints = new Set<Integer>();
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
Set<Integer> ints = new Set<Integer>{1,2,3};
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
|
|
||||||
Map<String,Integer> intsBymap = new Map<String,Integer>();
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
Map<String,Integer> intsBymap = new Map<String,Integer>{'hello' => 1, 'world' => 2};
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ keyword
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ type
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ string
|
|
||||||
// ^^ operator
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
// ^string
|
|
||||||
// ^^ operator
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ punctuation
|
|
||||||
Integer i,j,k;
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// punctuation
|
|
||||||
Integer i = 0, j, k = 1;
|
|
||||||
// ^ type
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ punctuation
|
|
||||||
// ^ variable
|
|
||||||
// ^ operator
|
|
||||||
// ^ number
|
|
||||||
// ^ punctuation
|
|
||||||
}
|
|
||||||
//^ punctuation
|
|
||||||
}
|
|
||||||
// <- punctuation
|
|
||||||
@ -1,14 +0,0 @@
|
|||||||
public class Me {
|
|
||||||
// ^ definition.class
|
|
||||||
{
|
|
||||||
Database.insert(null);
|
|
||||||
// ^^^^^^ reference.call
|
|
||||||
|
|
||||||
You y = new You();
|
|
||||||
// ^ reference.class
|
|
||||||
// ^^^ reference.class
|
|
||||||
|
|
||||||
y.method1();
|
|
||||||
// ^ reference.call
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,2 +0,0 @@
|
|||||||
public class Me {}
|
|
||||||
// ^ definition.class
|
|
||||||
@ -1,4 +0,0 @@
|
|||||||
public enum Enum1 {
|
|
||||||
// ^ definition.enum
|
|
||||||
Val1, Val2, Val3
|
|
||||||
}
|
|
||||||
@ -1,4 +0,0 @@
|
|||||||
public interface Test1 {
|
|
||||||
// ^ definition.interface
|
|
||||||
void testMethod(String param1);
|
|
||||||
}
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
public class Hello implements Test1 {}
|
|
||||||
// ^ definition.class
|
|
||||||
// ^ reference.implementation
|
|
||||||
@ -1,27 +0,0 @@
|
|||||||
global class ParentClass {
|
|
||||||
// ^ definition.class
|
|
||||||
|
|
||||||
private String method1(Integer i){
|
|
||||||
// ^ definition.method
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
public class InnerClass1 {
|
|
||||||
// ^ definition.class
|
|
||||||
public void innerMethod1(){}
|
|
||||||
// ^ definition.method
|
|
||||||
|
|
||||||
private void innerMethod2(){}
|
|
||||||
// ^ definition.method
|
|
||||||
}
|
|
||||||
|
|
||||||
private class InnerClass2 {
|
|
||||||
// ^ definition.class
|
|
||||||
public void innerMethod1(){}
|
|
||||||
// ^ definition.method
|
|
||||||
|
|
||||||
private void innerMethod3(){}
|
|
||||||
// ^ definition.method
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
{
|
|
||||||
"targets": [
|
|
||||||
{
|
|
||||||
"target_name": "tree_sitter_sfapex_binding",
|
|
||||||
"include_dirs": [
|
|
||||||
"<!(node -e \"require('nan')\")",
|
|
||||||
"apex/src"
|
|
||||||
],
|
|
||||||
"sources": [
|
|
||||||
"apex/src/parser.c",
|
|
||||||
"soql/src/parser.c",
|
|
||||||
"sosl/src/parser.c",
|
|
||||||
"bindings/node/binding.cc",
|
|
||||||
# If your language uses an external scanner, add it here.
|
|
||||||
],
|
|
||||||
"cflags_c": [
|
|
||||||
"-std=c99",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -1 +0,0 @@
|
|||||||
module.exports = require("./index").then((val) => val.apex);
|
|
||||||
@ -1,51 +0,0 @@
|
|||||||
#include "tree_sitter/parser.h"
|
|
||||||
#include <node.h>
|
|
||||||
#include "nan.h"
|
|
||||||
|
|
||||||
using namespace v8;
|
|
||||||
|
|
||||||
extern "C" TSLanguage * tree_sitter_apex();
|
|
||||||
extern "C" TSLanguage * tree_sitter_soql();
|
|
||||||
extern "C" TSLanguage * tree_sitter_sosl();
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
NAN_METHOD(New) {}
|
|
||||||
|
|
||||||
void Init(Local<Object> exports, Local<Object> module) {
|
|
||||||
// Apex
|
|
||||||
Local<FunctionTemplate> apex_tpl = Nan::New<FunctionTemplate>(New);
|
|
||||||
apex_tpl->SetClassName(Nan::New("Language").ToLocalChecked());
|
|
||||||
apex_tpl->InstanceTemplate()->SetInternalFieldCount(1);
|
|
||||||
|
|
||||||
Local<Function> apex_constructor = Nan::GetFunction(apex_tpl).ToLocalChecked();
|
|
||||||
Local<Object> apex_instance = apex_constructor->NewInstance(Nan::GetCurrentContext()).ToLocalChecked();
|
|
||||||
Nan::SetInternalFieldPointer(apex_instance, 0, tree_sitter_apex());
|
|
||||||
Nan::Set(apex_instance, Nan::New("name").ToLocalChecked(), Nan::New("apex").ToLocalChecked());
|
|
||||||
// SOQL
|
|
||||||
Local<FunctionTemplate> soql_tpl = Nan::New<FunctionTemplate>(New);
|
|
||||||
soql_tpl->SetClassName(Nan::New("Language").ToLocalChecked());
|
|
||||||
soql_tpl->InstanceTemplate()->SetInternalFieldCount(1);
|
|
||||||
|
|
||||||
Local<Function> soql_constructor = Nan::GetFunction(soql_tpl).ToLocalChecked();
|
|
||||||
Local<Object> soql_instance = soql_constructor->NewInstance(Nan::GetCurrentContext()).ToLocalChecked();
|
|
||||||
Nan::SetInternalFieldPointer(soql_instance, 0, tree_sitter_soql());
|
|
||||||
Nan::Set(soql_instance, Nan::New("name").ToLocalChecked(), Nan::New("soql").ToLocalChecked());
|
|
||||||
// SOSL
|
|
||||||
Local<FunctionTemplate> sosl_tpl = Nan::New<FunctionTemplate>(New);
|
|
||||||
sosl_tpl->SetClassName(Nan::New("Language").ToLocalChecked());
|
|
||||||
sosl_tpl->InstanceTemplate()->SetInternalFieldCount(1);
|
|
||||||
|
|
||||||
Local<Function> sosl_constructor = Nan::GetFunction(sosl_tpl).ToLocalChecked();
|
|
||||||
Local<Object> sosl_instance = sosl_constructor->NewInstance(Nan::GetCurrentContext()).ToLocalChecked();
|
|
||||||
Nan::SetInternalFieldPointer(sosl_instance, 0, tree_sitter_sosl());
|
|
||||||
Nan::Set(sosl_instance, Nan::New("name").ToLocalChecked(), Nan::New("sosl").ToLocalChecked());
|
|
||||||
|
|
||||||
Nan::Set(exports, Nan::New("apex").ToLocalChecked(), apex_instance);
|
|
||||||
Nan::Set(exports, Nan::New("soql").ToLocalChecked(), soql_instance);
|
|
||||||
Nan::Set(exports, Nan::New("sosl").ToLocalChecked(), sosl_instance);
|
|
||||||
}
|
|
||||||
|
|
||||||
NODE_MODULE(tree_sitter_sfapex_binding, Init)
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
@ -1,46 +0,0 @@
|
|||||||
let exportedValues = {};
|
|
||||||
try {
|
|
||||||
exportedValues = require("../../build/Release/tree_sitter_sfapex_binding");
|
|
||||||
} catch (errorA) {
|
|
||||||
if (errorA.code !== "MODULE_NOT_FOUND") {
|
|
||||||
throw errorA;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
exportedValues = require("../../build/Debug/tree_sitter_sfapex_binding");
|
|
||||||
} catch (errorB) {
|
|
||||||
if (errorB.code !== "MODULE_NOT_FOUND") {
|
|
||||||
throw errorB;
|
|
||||||
}
|
|
||||||
// TODO: load WASM instead?? Not sure how to make it hot-swappable
|
|
||||||
// but leaving it async load to leave the door open
|
|
||||||
// exportedValues = getWasmModules();
|
|
||||||
throw errorA;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Eventually, should be able to load the WASM module as a direct swap for the native... life goal
|
|
||||||
async function getWasmModules() {
|
|
||||||
const TreeSitter = require(__dirname +
|
|
||||||
"/../../prebuilds/wasm/tree-sitter.js");
|
|
||||||
await TreeSitter.init();
|
|
||||||
return {
|
|
||||||
apex: await TreeSitter.Language.load(
|
|
||||||
__dirname + "/../../prebuilds/wasm/tree-sitter-apex.wasm"
|
|
||||||
),
|
|
||||||
soql: await TreeSitter.Language.load(
|
|
||||||
__dirname + "/../../prebuilds/wasm/tree-sitter-soql.wasm"
|
|
||||||
),
|
|
||||||
sosl: await TreeSitter.Language.load(
|
|
||||||
__dirname + "/../../prebuilds/wasm/tree-sitter-sosl.wasm"
|
|
||||||
),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = Promise.resolve(exportedValues).then((mod) => {
|
|
||||||
try {
|
|
||||||
mod.apex.nodeTypeInfo = require("../../apex/src/node-types.json");
|
|
||||||
mod.soql.nodeTypeInfo = require("../../soql/src/node-types.json");
|
|
||||||
mod.sosl.nodeTypeInfo = require("../../sosl/src/node-types.json");
|
|
||||||
} catch (_) {}
|
|
||||||
return mod;
|
|
||||||
});
|
|
||||||
@ -1 +0,0 @@
|
|||||||
module.exports = require("./index").then((val) => val.soql);
|
|
||||||
@ -1 +0,0 @@
|
|||||||
module.exports = require("./index").then((val) => val.sosl);
|
|
||||||
@ -1,40 +0,0 @@
|
|||||||
fn main() {
|
|
||||||
let src_dir = std::path::Path::new("src");
|
|
||||||
|
|
||||||
let mut c_config = cc::Build::new();
|
|
||||||
c_config.include(&src_dir);
|
|
||||||
c_config
|
|
||||||
.flag_if_supported("-Wno-unused-parameter")
|
|
||||||
.flag_if_supported("-Wno-unused-but-set-variable")
|
|
||||||
.flag_if_supported("-Wno-trigraphs");
|
|
||||||
let parser_path = src_dir.join("parser.c");
|
|
||||||
c_config.file(&parser_path);
|
|
||||||
|
|
||||||
// If your language uses an external scanner written in C,
|
|
||||||
// then include this block of code:
|
|
||||||
|
|
||||||
/*
|
|
||||||
let scanner_path = src_dir.join("scanner.c");
|
|
||||||
c_config.file(&scanner_path);
|
|
||||||
println!("cargo:rerun-if-changed={}", scanner_path.to_str().unwrap());
|
|
||||||
*/
|
|
||||||
|
|
||||||
c_config.compile("parser");
|
|
||||||
println!("cargo:rerun-if-changed={}", parser_path.to_str().unwrap());
|
|
||||||
|
|
||||||
// If your language uses an external scanner written in C++,
|
|
||||||
// then include this block of code:
|
|
||||||
|
|
||||||
/*
|
|
||||||
let mut cpp_config = cc::Build::new();
|
|
||||||
cpp_config.cpp(true);
|
|
||||||
cpp_config.include(&src_dir);
|
|
||||||
cpp_config
|
|
||||||
.flag_if_supported("-Wno-unused-parameter")
|
|
||||||
.flag_if_supported("-Wno-unused-but-set-variable");
|
|
||||||
let scanner_path = src_dir.join("scanner.cc");
|
|
||||||
cpp_config.file(&scanner_path);
|
|
||||||
cpp_config.compile("scanner");
|
|
||||||
println!("cargo:rerun-if-changed={}", scanner_path.to_str().unwrap());
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
@ -1,52 +0,0 @@
|
|||||||
//! This crate provides SF_SOQL language support for the [tree-sitter][] parsing library.
|
|
||||||
//!
|
|
||||||
//! Typically, you will use the [language][language func] function to add this language to a
|
|
||||||
//! tree-sitter [Parser][], and then use the parser to parse some code:
|
|
||||||
//!
|
|
||||||
//! ```
|
|
||||||
//! let code = "";
|
|
||||||
//! let mut parser = tree_sitter::Parser::new();
|
|
||||||
//! parser.set_language(tree_sitter_SF_SOQL::language()).expect("Error loading SF_SOQL grammar");
|
|
||||||
//! let tree = parser.parse(code, None).unwrap();
|
|
||||||
//! ```
|
|
||||||
//!
|
|
||||||
//! [Language]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Language.html
|
|
||||||
//! [language func]: fn.language.html
|
|
||||||
//! [Parser]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Parser.html
|
|
||||||
//! [tree-sitter]: https://tree-sitter.github.io/
|
|
||||||
|
|
||||||
use tree_sitter::Language;
|
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
fn tree_sitter_SF_SOQL() -> Language;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Get the tree-sitter [Language][] for this grammar.
|
|
||||||
///
|
|
||||||
/// [Language]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Language.html
|
|
||||||
pub fn language() -> Language {
|
|
||||||
unsafe { tree_sitter_SF_SOQL() }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// The content of the [`node-types.json`][] file for this grammar.
|
|
||||||
///
|
|
||||||
/// [`node-types.json`]: https://tree-sitter.github.io/tree-sitter/using-parsers#static-node-types
|
|
||||||
pub const NODE_TYPES: &'static str = include_str!("../../src/node-types.json");
|
|
||||||
|
|
||||||
// Uncomment these to include any queries that this grammar contains
|
|
||||||
|
|
||||||
// pub const HIGHLIGHTS_QUERY: &'static str = include_str!("../../queries/highlights.scm");
|
|
||||||
// pub const INJECTIONS_QUERY: &'static str = include_str!("../../queries/injections.scm");
|
|
||||||
// pub const LOCALS_QUERY: &'static str = include_str!("../../queries/locals.scm");
|
|
||||||
// pub const TAGS_QUERY: &'static str = include_str!("../../queries/tags.scm");
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
#[test]
|
|
||||||
fn test_can_load_grammar() {
|
|
||||||
let mut parser = tree_sitter::Parser::new();
|
|
||||||
parser
|
|
||||||
.set_language(super::language())
|
|
||||||
.expect("Error loading SF_SOQL language");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,6 +0,0 @@
|
|||||||
type Parser = import("web-tree-sitter");
|
|
||||||
declare module "web-tree-sitter-sfapex" {
|
|
||||||
function getApexParser(): Promise<Parser>;
|
|
||||||
function getSoqlParser(): Promise<Parser>;
|
|
||||||
function getSoslParser(): Promise<Parser>;
|
|
||||||
}
|
|
||||||
@ -1,42 +0,0 @@
|
|||||||
const Parser = require("web-tree-sitter");
|
|
||||||
const fs = require("fs");
|
|
||||||
|
|
||||||
function getApexParser() {
|
|
||||||
return getParser(__dirname + "/tree-sitter-apex.wasm");
|
|
||||||
}
|
|
||||||
function getSoqlParser() {
|
|
||||||
return getParser(__dirname + "/tree-sitter-soql.wasm");
|
|
||||||
}
|
|
||||||
function getSoslParser() {
|
|
||||||
return getParser(__dirname + "/tree-sitter-sosl.wasm");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {string} wasmLangFile
|
|
||||||
* @returns {Promise<Parser>}
|
|
||||||
*/
|
|
||||||
async function getParser(wasmLangFile) {
|
|
||||||
return new Promise(async (resolve, reject) => {
|
|
||||||
await Parser.init();
|
|
||||||
// make loadable on NodeJS to enable testing, should be smarter later
|
|
||||||
const parser = new Parser();
|
|
||||||
fs.readFile(wasmLangFile, async (err, data) => {
|
|
||||||
if (err) {
|
|
||||||
reject(err);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
const lang = await Parser.Language.load(data);
|
|
||||||
parser.setLanguage(lang);
|
|
||||||
resolve(parser);
|
|
||||||
} catch (err2) {
|
|
||||||
reject(err2);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
getApexParser,
|
|
||||||
getSoqlParser,
|
|
||||||
getSoslParser,
|
|
||||||
};
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "web-tree-sitter-sfapex",
|
|
||||||
"version": "0.0.9-beta2",
|
|
||||||
"lockfileVersion": 3,
|
|
||||||
"requires": true,
|
|
||||||
"packages": {
|
|
||||||
"": {
|
|
||||||
"name": "web-tree-sitter-sfapex",
|
|
||||||
"version": "0.0.9-beta2",
|
|
||||||
"license": "ISC",
|
|
||||||
"dependencies": {
|
|
||||||
"web-tree-sitter": "^0.20.8"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/web-tree-sitter": {
|
|
||||||
"version": "0.20.8",
|
|
||||||
"resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.20.8.tgz",
|
|
||||||
"integrity": "sha512-weOVgZ3aAARgdnb220GqYuh7+rZU0Ka9k9yfKtGAzEYMa6GgiCzW9JjQRJyCJakvibQW+dfjJdihjInKuuCAUQ=="
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,15 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "web-tree-sitter-sfapex",
|
|
||||||
"version": "0.0.9",
|
|
||||||
"description": "tree-sitter-sfapex WASM",
|
|
||||||
"main": "index.js",
|
|
||||||
"types": "index.d.ts",
|
|
||||||
"scripts": {
|
|
||||||
"test": "echo \"Error: no test specified\" && exit 1"
|
|
||||||
},
|
|
||||||
"author": "Anthony Heber",
|
|
||||||
"license": "ISC",
|
|
||||||
"dependencies": {
|
|
||||||
"web-tree-sitter": "^0.20.8"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
const dialects = { SOQL: "soql", SOSL: "sosl", APEX: "apex" };
|
|
||||||
|
|
||||||
function createCaseInsensitiveRegex(word) {
|
|
||||||
return new RegExp(
|
|
||||||
word
|
|
||||||
.split("")
|
|
||||||
.map((letter) => `[${letter.toLowerCase()}${letter.toUpperCase()}]`)
|
|
||||||
.join("")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function ci(keyword) {
|
|
||||||
const words = keyword.split(" ");
|
|
||||||
const regExps = words.map(createCaseInsensitiveRegex);
|
|
||||||
|
|
||||||
return regExps.length == 1
|
|
||||||
? alias(regExps[0], keyword)
|
|
||||||
: alias(seq(...regExps), keyword.replace(/ /g, "_"));
|
|
||||||
}
|
|
||||||
|
|
||||||
function commaJoined(expression) {
|
|
||||||
return optional(commaJoined1(expression));
|
|
||||||
}
|
|
||||||
|
|
||||||
function commaJoined1(expression) {
|
|
||||||
return joined(",", expression);
|
|
||||||
}
|
|
||||||
|
|
||||||
function joined(joinedBy, expression) {
|
|
||||||
return seq(expression, repeat(seq(joinedBy, expression)));
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = { ci, commaJoined, commaJoined1, joined, dialects };
|
|
||||||
@ -1,458 +0,0 @@
|
|||||||
const { ci, commaJoined1, joined, dialects } = require("./common.js");
|
|
||||||
|
|
||||||
module.exports = function defineGrammar(dialect) {
|
|
||||||
return {
|
|
||||||
/*
|
|
||||||
RESOURCES
|
|
||||||
https://blog.jeffdouglas.com/2009/09/23/syntax-rules-for-soql/
|
|
||||||
https://github.com/forcedotcom/apex-tmLanguage
|
|
||||||
https://developer.salesforce.com/docs/atlas.en-us.238.0.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_sosl_intro.htm
|
|
||||||
*/
|
|
||||||
|
|
||||||
conflicts: ($) => [[$.function_name, $.count_expression]],
|
|
||||||
|
|
||||||
rules: {
|
|
||||||
_soql_query_expression: ($) => $.soql_query_body,
|
|
||||||
subquery: ($) => seq("(", $.soql_query_body, ")"),
|
|
||||||
|
|
||||||
soql_query_body: ($) => {
|
|
||||||
s = [
|
|
||||||
$.select_clause,
|
|
||||||
$.from_clause,
|
|
||||||
optional(alias($.soql_using_clause, $.using_clause)),
|
|
||||||
optional($.where_clause),
|
|
||||||
optional(alias($.soql_with_clause, $.with_clause)),
|
|
||||||
optional($.group_by_clause),
|
|
||||||
optional($.order_by_clause),
|
|
||||||
optional($.limit_clause),
|
|
||||||
optional($.offset_clause),
|
|
||||||
optional($.for_clause),
|
|
||||||
optional($.update_clause),
|
|
||||||
];
|
|
||||||
if (dialect == dialects.APEX) {
|
|
||||||
s.push(optional($.all_rows_clause));
|
|
||||||
}
|
|
||||||
return seq(...s);
|
|
||||||
},
|
|
||||||
|
|
||||||
count_expression: ($) =>
|
|
||||||
seq(alias(ci("COUNT"), $.function_name), "(", ")"),
|
|
||||||
// SELECT
|
|
||||||
select_clause: ($) =>
|
|
||||||
seq(
|
|
||||||
ci("SELECT"),
|
|
||||||
choice($.count_expression, commaJoined1($._selectable_expression))
|
|
||||||
),
|
|
||||||
_selectable_expression: ($) =>
|
|
||||||
choice(
|
|
||||||
$._value_expression,
|
|
||||||
$.alias_expression,
|
|
||||||
$.type_of_clause,
|
|
||||||
$.fields_expression,
|
|
||||||
$.subquery
|
|
||||||
),
|
|
||||||
|
|
||||||
// USING SCOPE
|
|
||||||
soql_using_clause: ($) => seq(ci("USING SCOPE"), $.using_scope_type),
|
|
||||||
using_scope_type: ($) =>
|
|
||||||
choice(
|
|
||||||
ci("delegated"),
|
|
||||||
ci("everything"),
|
|
||||||
ci("mine"),
|
|
||||||
ci("mine_and_my_groups"),
|
|
||||||
ci("my_territory"),
|
|
||||||
ci("my_team_territory"),
|
|
||||||
ci("team")
|
|
||||||
),
|
|
||||||
|
|
||||||
// TYPE OF
|
|
||||||
type_of_clause: ($) =>
|
|
||||||
seq(
|
|
||||||
ci("TYPEOF"),
|
|
||||||
$.identifier,
|
|
||||||
repeat($.when_expression),
|
|
||||||
optional($.else_expression),
|
|
||||||
ci("END")
|
|
||||||
),
|
|
||||||
when_expression: ($) =>
|
|
||||||
seq(ci("WHEN"), $.identifier, ci("THEN"), $.field_list),
|
|
||||||
else_expression: ($) => seq(ci("ELSE"), $.field_list),
|
|
||||||
|
|
||||||
// GROUP BY
|
|
||||||
group_by_clause: ($) =>
|
|
||||||
seq(ci("GROUP BY"), $._group_by_expression, optional($.having_clause)),
|
|
||||||
_group_by_expression: ($) =>
|
|
||||||
choice(
|
|
||||||
commaJoined1(choice($.field_identifier, $.function_expression)),
|
|
||||||
seq(
|
|
||||||
choice(
|
|
||||||
alias(ci("ROLLUP"), $.function_name),
|
|
||||||
alias(ci("CUBE"), $.function_name)
|
|
||||||
),
|
|
||||||
"(",
|
|
||||||
commaJoined1($.field_identifier),
|
|
||||||
")"
|
|
||||||
)
|
|
||||||
),
|
|
||||||
|
|
||||||
// FOR
|
|
||||||
for_clause: ($) => seq(ci("FOR"), commaJoined1($.for_type)),
|
|
||||||
for_type: ($) => choice(ci("UPDATE"), ci("REFERENCE"), ci("VIEW")),
|
|
||||||
|
|
||||||
// GROUP BY HAVING
|
|
||||||
having_clause: ($) => seq(ci("HAVING"), $._having_boolean_expression),
|
|
||||||
|
|
||||||
_having_boolean_expression: ($) =>
|
|
||||||
choice(
|
|
||||||
$.having_and_expression,
|
|
||||||
$.having_or_expression,
|
|
||||||
$.having_not_expression,
|
|
||||||
$._having_condition_expression
|
|
||||||
),
|
|
||||||
having_and_expression: ($) =>
|
|
||||||
seq(
|
|
||||||
$._having_condition_expression,
|
|
||||||
repeat1(seq(ci("AND"), $._having_condition_expression))
|
|
||||||
),
|
|
||||||
having_or_expression: ($) =>
|
|
||||||
seq(
|
|
||||||
$._having_condition_expression,
|
|
||||||
repeat1(seq(ci("OR"), $._having_condition_expression))
|
|
||||||
),
|
|
||||||
having_not_expression: ($) =>
|
|
||||||
seq(ci("NOT"), $._having_condition_expression),
|
|
||||||
_having_condition_expression: ($) =>
|
|
||||||
choice(
|
|
||||||
seq("(", $._having_boolean_expression, ")"),
|
|
||||||
$.having_comparison_expression
|
|
||||||
),
|
|
||||||
|
|
||||||
having_comparison_expression: ($) =>
|
|
||||||
seq($.function_expression, $._having_comparison),
|
|
||||||
|
|
||||||
_having_comparison: ($) =>
|
|
||||||
choice($._having_value_comparison, $._having_set_comparison),
|
|
||||||
|
|
||||||
_having_value_comparison: ($) =>
|
|
||||||
seq(
|
|
||||||
$.value_comparison_operator,
|
|
||||||
choice($._soql_literal, $.bound_apex_expression)
|
|
||||||
),
|
|
||||||
_having_set_comparison: ($) =>
|
|
||||||
seq(
|
|
||||||
$.set_comparison_operator,
|
|
||||||
choice(
|
|
||||||
seq(
|
|
||||||
"(",
|
|
||||||
commaJoined1(choice($._soql_literal, $.bound_apex_expression)),
|
|
||||||
")"
|
|
||||||
),
|
|
||||||
$.bound_apex_expression
|
|
||||||
)
|
|
||||||
),
|
|
||||||
|
|
||||||
from_clause: ($) =>
|
|
||||||
seq(
|
|
||||||
ci("FROM"),
|
|
||||||
commaJoined1(choice($.storage_identifier, $.storage_alias))
|
|
||||||
),
|
|
||||||
storage_identifier: ($) => choice($.identifier, $.dotted_identifier),
|
|
||||||
storage_alias: ($) =>
|
|
||||||
seq($.storage_identifier, optional(ci("AS")), $.identifier),
|
|
||||||
|
|
||||||
// FIELDS
|
|
||||||
fields_expression: ($) => seq(ci("FIELDS"), "(", $.fields_type, ")"),
|
|
||||||
fields_type: ($) => choice(ci("ALL"), ci("CUSTOM"), ci("STANDARD")),
|
|
||||||
|
|
||||||
// WHERE
|
|
||||||
where_clause: ($) => seq(ci("WHERE"), $._boolean_expression),
|
|
||||||
|
|
||||||
_boolean_expression: ($) =>
|
|
||||||
choice(
|
|
||||||
$.and_expression,
|
|
||||||
$.or_expression,
|
|
||||||
$.not_expression,
|
|
||||||
$._condition_expression
|
|
||||||
),
|
|
||||||
and_expression: ($) =>
|
|
||||||
seq(
|
|
||||||
$._condition_expression,
|
|
||||||
repeat1(seq(ci("AND"), $._condition_expression))
|
|
||||||
),
|
|
||||||
or_expression: ($) =>
|
|
||||||
seq(
|
|
||||||
$._condition_expression,
|
|
||||||
repeat1(seq(ci("OR"), $._condition_expression))
|
|
||||||
),
|
|
||||||
not_expression: ($) => seq(ci("NOT"), $._condition_expression),
|
|
||||||
_condition_expression: ($) =>
|
|
||||||
choice(seq("(", $._boolean_expression, ")"), $.comparison_expression),
|
|
||||||
|
|
||||||
comparison_expression: ($) => seq($._value_expression, $._comparison),
|
|
||||||
|
|
||||||
_comparison: ($) => choice($._value_comparison, $._set_comparison),
|
|
||||||
|
|
||||||
_value_comparison: ($) =>
|
|
||||||
seq(
|
|
||||||
$.value_comparison_operator,
|
|
||||||
choice($._soql_literal, $.bound_apex_expression)
|
|
||||||
),
|
|
||||||
_set_comparison: ($) =>
|
|
||||||
seq(
|
|
||||||
$.set_comparison_operator,
|
|
||||||
choice(
|
|
||||||
$.subquery,
|
|
||||||
seq(
|
|
||||||
"(",
|
|
||||||
commaJoined1(choice($._soql_literal, $.bound_apex_expression)),
|
|
||||||
")"
|
|
||||||
),
|
|
||||||
$.bound_apex_expression
|
|
||||||
)
|
|
||||||
),
|
|
||||||
|
|
||||||
// WITH
|
|
||||||
soql_with_clause: ($) =>
|
|
||||||
seq(ci("WITH"), alias($.soql_with_type, $.with_type)),
|
|
||||||
// WITH
|
|
||||||
soql_with_type: ($) =>
|
|
||||||
choice(
|
|
||||||
ci("Security_Enforced"),
|
|
||||||
ci("User_Mode"),
|
|
||||||
ci("System_Mode"),
|
|
||||||
$.with_record_visibility_expression,
|
|
||||||
$.with_data_cat_expression,
|
|
||||||
$.with_user_id_type
|
|
||||||
),
|
|
||||||
|
|
||||||
with_user_id_type: ($) => seq(ci("UserId"), "=", $.string_literal),
|
|
||||||
|
|
||||||
// WITH RecordVisibilityContext
|
|
||||||
with_record_visibility_expression: ($) =>
|
|
||||||
seq(
|
|
||||||
ci("RecordVisibilityContext"),
|
|
||||||
"(",
|
|
||||||
commaJoined1($.with_record_visibility_param),
|
|
||||||
")"
|
|
||||||
),
|
|
||||||
with_record_visibility_param: ($) =>
|
|
||||||
choice(
|
|
||||||
seq(ci("maxDescriptorPerRecord"), "=", $.int),
|
|
||||||
seq(ci("supportsDomains"), "=", $.boolean),
|
|
||||||
seq(ci("supportsDelegates"), "=", $.boolean)
|
|
||||||
),
|
|
||||||
|
|
||||||
// WITH DATA CATEGORY
|
|
||||||
with_data_cat_expression: ($) =>
|
|
||||||
seq(ci("DATA CATEGORY"), joined(ci("AND"), $.with_data_cat_filter)),
|
|
||||||
with_data_cat_filter: ($) =>
|
|
||||||
seq(
|
|
||||||
$.identifier,
|
|
||||||
$.with_data_cat_filter_type,
|
|
||||||
choice($.identifier, seq("(", commaJoined1($.identifier), ")"))
|
|
||||||
),
|
|
||||||
with_data_cat_filter_type: ($) =>
|
|
||||||
choice(ci("AT"), ci("ABOVE"), ci("BELOW"), ci("ABOVE_OR_BELOW")),
|
|
||||||
|
|
||||||
// LIMIT
|
|
||||||
limit_clause: ($) =>
|
|
||||||
seq(ci("LIMIT"), choice($.int, $.bound_apex_expression)),
|
|
||||||
// OFFSET
|
|
||||||
offset_clause: ($) =>
|
|
||||||
seq(ci("OFFSET"), choice($.int, $.bound_apex_expression)),
|
|
||||||
|
|
||||||
update_clause: ($) => seq(ci("UPDATE"), commaJoined1($.update_type)),
|
|
||||||
update_type: ($) => choice(ci("TRACKING"), ci("VIEWSTAT")),
|
|
||||||
|
|
||||||
alias_expression: ($) =>
|
|
||||||
seq($._value_expression, optional(ci("AS")), $.identifier),
|
|
||||||
|
|
||||||
// ORDER BY
|
|
||||||
order_by_clause: ($) =>
|
|
||||||
seq(ci("ORDER BY"), commaJoined1($.order_expression)),
|
|
||||||
order_expression: ($) =>
|
|
||||||
seq(
|
|
||||||
$._value_expression,
|
|
||||||
optional($.order_direction),
|
|
||||||
optional($.order_null_direciton)
|
|
||||||
),
|
|
||||||
order_direction: ($) => choice(ci("ASC"), ci("DESC")),
|
|
||||||
order_null_direciton: ($) => choice(ci("NULLS FIRST"), ci("NULLS LAST")),
|
|
||||||
|
|
||||||
geo_location_type: ($) =>
|
|
||||||
choice(
|
|
||||||
$.field_identifier,
|
|
||||||
$.bound_apex_expression,
|
|
||||||
seq(
|
|
||||||
alias(ci("GEOLOCATION"), $.function_name),
|
|
||||||
"(",
|
|
||||||
$.decimal,
|
|
||||||
",",
|
|
||||||
$.decimal,
|
|
||||||
")"
|
|
||||||
)
|
|
||||||
),
|
|
||||||
|
|
||||||
_value_expression: ($) =>
|
|
||||||
choice($.function_expression, $.field_identifier),
|
|
||||||
function_expression: ($) =>
|
|
||||||
choice(
|
|
||||||
seq(
|
|
||||||
alias(ci("DISTANCE"), $.function_name),
|
|
||||||
"(",
|
|
||||||
choice($.field_identifier, $.bound_apex_expression),
|
|
||||||
",",
|
|
||||||
$.geo_location_type,
|
|
||||||
",",
|
|
||||||
$.string_literal,
|
|
||||||
")"
|
|
||||||
),
|
|
||||||
seq($.function_name, "(", $._value_expression, ")")
|
|
||||||
),
|
|
||||||
|
|
||||||
dotted_identifier: ($) =>
|
|
||||||
seq($.identifier, repeat1(seq(".", $.identifier))),
|
|
||||||
field_identifier: ($) => choice($.identifier, $.dotted_identifier),
|
|
||||||
field_list: ($) =>
|
|
||||||
seq(commaJoined1(choice($.identifier, $.dotted_identifier))),
|
|
||||||
|
|
||||||
all_rows_clause: ($) => ci("ALL ROWS"),
|
|
||||||
|
|
||||||
boolean: ($) => choice(ci("TRUE"), ci("FALSE")),
|
|
||||||
|
|
||||||
value_comparison_operator: ($) =>
|
|
||||||
choice("=", "!=", "<>", "<", "<=", ">", ">=", ci("LIKE")),
|
|
||||||
set_comparison_operator: ($) =>
|
|
||||||
choice(ci("IN"), seq(ci("NOT IN")), ci("INCLUDES"), ci("EXCLUDES")),
|
|
||||||
|
|
||||||
date_literal: ($) =>
|
|
||||||
choice(
|
|
||||||
ci("YESTERDAY"),
|
|
||||||
ci("TODAY"),
|
|
||||||
ci("TOMORROW"),
|
|
||||||
ci("LAST_WEEK"),
|
|
||||||
ci("THIS_WEEK"),
|
|
||||||
ci("NEXT_WEEK"),
|
|
||||||
ci("LAST_MONTH"),
|
|
||||||
ci("THIS_MONTH"),
|
|
||||||
ci("NEXT_MONTH"),
|
|
||||||
ci("LAST_90_DAYS"),
|
|
||||||
ci("NEXT_90_DAYS"),
|
|
||||||
ci("THIS_QUARTER"),
|
|
||||||
ci("LAST_QUARTER"),
|
|
||||||
ci("NEXT_QUARTER"),
|
|
||||||
ci("THIS_YEAR"),
|
|
||||||
ci("LAST_YEAR"),
|
|
||||||
ci("NEXT_YEAR"),
|
|
||||||
ci("THIS_FISCAL_QUARTER"),
|
|
||||||
ci("LAST_FISCAL_QUARTER"),
|
|
||||||
ci("NEXT_FISCAL_QUARTER"),
|
|
||||||
ci("THIS_FISCAL_YEAR"),
|
|
||||||
ci("LAST_FISCAL_YEAR"),
|
|
||||||
ci("NEXT_FISCAL_YEAR")
|
|
||||||
),
|
|
||||||
|
|
||||||
date_literal_with_param: ($) =>
|
|
||||||
seq(
|
|
||||||
alias(
|
|
||||||
token(
|
|
||||||
choice(
|
|
||||||
ci("LAST_N_DAYS"),
|
|
||||||
ci("NEXT_N_DAYS"),
|
|
||||||
ci("N_DAYS_AGO"),
|
|
||||||
ci("NEXT_N_WEEKS"),
|
|
||||||
ci("LAST_N_WEEKS"),
|
|
||||||
ci("N_WEEKS_AGO"),
|
|
||||||
ci("NEXT_N_MONTHS"),
|
|
||||||
ci("LAST_N_MONTHS"),
|
|
||||||
ci("N_MONTHS_AGO"),
|
|
||||||
ci("NEXT_N_QUARTERS"),
|
|
||||||
ci("LAST_N_QUARTERS"),
|
|
||||||
ci("N_QUARTERS_AGO"),
|
|
||||||
ci("NEXT_N_YEARS"),
|
|
||||||
ci("LAST_N_YEARS"),
|
|
||||||
ci("N_YEARS_AGO"),
|
|
||||||
ci("NEXT_N_FISCAL_QUARTERS"),
|
|
||||||
ci("LAST_N_FISCAL_QUARTERS"),
|
|
||||||
ci("N_FISCAL_QUARTERS_AGO"),
|
|
||||||
ci("NEXT_N_FISCAL_YEARS"),
|
|
||||||
ci("LAST_N_FISCAL_YEARS"),
|
|
||||||
ci("N_FISCAL_YEARS_AGO")
|
|
||||||
)
|
|
||||||
),
|
|
||||||
$.date_literal
|
|
||||||
),
|
|
||||||
":",
|
|
||||||
$.int
|
|
||||||
),
|
|
||||||
|
|
||||||
// Not all valid for SOSL
|
|
||||||
function_name: ($) =>
|
|
||||||
choice(
|
|
||||||
ci("AVG"),
|
|
||||||
ci("COUNT"),
|
|
||||||
ci("COUNT_DISTINCT"),
|
|
||||||
ci("MIN"),
|
|
||||||
ci("MAX"),
|
|
||||||
ci("SUM"),
|
|
||||||
ci("GROUPING"),
|
|
||||||
ci("FORMAT"),
|
|
||||||
ci("convertCurrency"),
|
|
||||||
ci("toLabel"),
|
|
||||||
ci("CALENDAR_MONTH"),
|
|
||||||
ci("CALENDAR_QUARTER"),
|
|
||||||
ci("CALENDAR_YEAR"),
|
|
||||||
ci("DAY_IN_MONTH"),
|
|
||||||
ci("DAY_IN_WEEK"),
|
|
||||||
ci("DAY_IN_YEAR"),
|
|
||||||
ci("DAY_ONLY"),
|
|
||||||
ci("FISCAL_MONTH"),
|
|
||||||
ci("FISCAL_QUARTER"),
|
|
||||||
ci("FISCAL_YEAR"),
|
|
||||||
ci("HOUR_IN_DAY"),
|
|
||||||
ci("WEEK_IN_MONTH"),
|
|
||||||
ci("WEEK_IN_YEAR")
|
|
||||||
),
|
|
||||||
|
|
||||||
apex_method_identifier: ($) => seq($.identifier, seq("(", ")")),
|
|
||||||
apex_identifier: ($) =>
|
|
||||||
joined(
|
|
||||||
seq(optional("?"), "."),
|
|
||||||
choice($.identifier, $.apex_method_identifier)
|
|
||||||
),
|
|
||||||
bound_apex_expression: ($) => {
|
|
||||||
if (dialect == dialects.APEX) {
|
|
||||||
return seq(":", $.expression); // defined in Apex rules
|
|
||||||
} else {
|
|
||||||
return "**DONOTMATCHEVER**";
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
null_literal: ($) => ci("NULL"),
|
|
||||||
|
|
||||||
_soql_literal: ($) =>
|
|
||||||
choice(
|
|
||||||
$.int,
|
|
||||||
$.decimal,
|
|
||||||
$.string_literal,
|
|
||||||
$.date,
|
|
||||||
$.date_time,
|
|
||||||
$.boolean,
|
|
||||||
$.date_literal,
|
|
||||||
$.date_literal_with_param,
|
|
||||||
$.currency_literal,
|
|
||||||
$.null_literal
|
|
||||||
),
|
|
||||||
|
|
||||||
string_literal: ($) => /'(\\[nNrRtTbBfFuU"'_%\\]|[^\\'])*'/,
|
|
||||||
int: ($) => /\d+/,
|
|
||||||
decimal: ($) => /-?\d+(\.\d+)?/,
|
|
||||||
date: ($) =>
|
|
||||||
/[1-4][0-9]{3}-(?:0[1-9]|1[0-2])-(?:[0-2][1-9]|[1-2]0|3[0-1])/,
|
|
||||||
date_time: ($) =>
|
|
||||||
/[1-4][0-9]{3}-(?:0[1-9]|1[0-2])-(?:[0-2][1-9]|[1-2]0|3[0-1])T([0-1]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d\d?\d?)?(?:Z|[+-][0-1]\d:[0-5]\d)/,
|
|
||||||
currency_literal: ($) => /\w{3}\d+(\.\d+)?/,
|
|
||||||
identifier: ($) => /[A-Za-z][A-Za-z\d_]*/,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
};
|
|
||||||
@ -1,112 +0,0 @@
|
|||||||
const { ci, commaJoined1, dialects } = require("./common");
|
|
||||||
|
|
||||||
module.exports = function defineGrammar(dialect) {
|
|
||||||
const soqlGrammar = require("./soql-grammar")(dialect);
|
|
||||||
return {
|
|
||||||
/*
|
|
||||||
RESOURCES
|
|
||||||
https://github.com/forcedotcom/apex-tmLanguage
|
|
||||||
https://developer.salesforce.com/docs/atlas.en-us.238.0.soql_sosl.meta/soql_sosl/sforce_api_calls_soql_sosl_intro.htm
|
|
||||||
*/
|
|
||||||
|
|
||||||
conflicts: soqlGrammar.conflicts,
|
|
||||||
|
|
||||||
rules: {
|
|
||||||
_query_expression: ($) => $.sosl_query_body,
|
|
||||||
|
|
||||||
sosl_query_body: ($) =>
|
|
||||||
seq(
|
|
||||||
$.find_clause,
|
|
||||||
optional($.in_clause),
|
|
||||||
optional(repeat($.returning_clause)),
|
|
||||||
optional(repeat(alias($.sosl_with_clause, $.with_clause))),
|
|
||||||
optional($.limit_clause),
|
|
||||||
optional($.offset_clause),
|
|
||||||
optional($.update_clause)
|
|
||||||
),
|
|
||||||
// FIND
|
|
||||||
find_clause: ($) =>
|
|
||||||
seq(
|
|
||||||
ci("FIND"),
|
|
||||||
choice(
|
|
||||||
$.bound_apex_expression,
|
|
||||||
seq($.term_separator_start, $.term, $.term_separator_end)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
|
|
||||||
in_clause: ($) => seq(ci("IN"), $.in_type, ci("FIELDS")),
|
|
||||||
in_type: ($) =>
|
|
||||||
choice(ci("ALL"), ci("EMAIL"), ci("NAME"), ci("PHONE"), ci("SIDEBAR")),
|
|
||||||
|
|
||||||
term_separator_start: ($) => (dialect == dialects.SOSL ? "{" : "'"),
|
|
||||||
term_separator_end: ($) => (dialect == dialects.SOSL ? "}" : "'"),
|
|
||||||
term: ($) => (dialect == dialects.SOSL ? /(\\\}|[^}])+/ : /(\\\'|[^'])+/),
|
|
||||||
|
|
||||||
returning_clause: ($) =>
|
|
||||||
seq(ci("RETURNING"), commaJoined1($.sobject_return)),
|
|
||||||
|
|
||||||
sobject_return: ($) =>
|
|
||||||
seq(
|
|
||||||
$.identifier,
|
|
||||||
optional(
|
|
||||||
seq(
|
|
||||||
"(",
|
|
||||||
$.selected_fields,
|
|
||||||
optional($.using_clause),
|
|
||||||
optional($.where_clause),
|
|
||||||
optional($.order_by_clause),
|
|
||||||
optional($.limit_clause),
|
|
||||||
optional($.offset_clause),
|
|
||||||
")"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
),
|
|
||||||
|
|
||||||
selected_fields: ($) => commaJoined1($._selectable_expression),
|
|
||||||
|
|
||||||
_selectable_expression: ($) =>
|
|
||||||
choice($._value_expression, $.alias_expression, $.fields_expression),
|
|
||||||
|
|
||||||
using_clause: ($) => seq(ci("USING"), ci("ListView"), "=", $.identifier),
|
|
||||||
|
|
||||||
subquery: ($) => seq("(", $.sosl_query_body, ")"),
|
|
||||||
|
|
||||||
with_division_expression: ($) =>
|
|
||||||
seq(
|
|
||||||
ci("DIVISION"),
|
|
||||||
"=",
|
|
||||||
choice($.bound_apex_expression, $.string_literal)
|
|
||||||
),
|
|
||||||
with_highlight: ($) => ci("HIGHLIGHT"),
|
|
||||||
with_metadata_expression: ($) =>
|
|
||||||
seq(ci("METADATA"), "=", $.string_literal),
|
|
||||||
with_network_expression: ($) => seq(ci("NETWORK"), $._comparison),
|
|
||||||
with_pricebook_expression: ($) =>
|
|
||||||
seq(ci("PricebookId"), "=", $.string_literal),
|
|
||||||
with_snippet_expression: ($) =>
|
|
||||||
seq(
|
|
||||||
ci("SNIPPET"),
|
|
||||||
optional(seq("(", ci("target_length"), "=", $.int, ")"))
|
|
||||||
),
|
|
||||||
with_spell_correction_expression: ($) =>
|
|
||||||
seq(ci("SPELL_CORRECTION"), "=", $.boolean),
|
|
||||||
|
|
||||||
sosl_with_type: ($) =>
|
|
||||||
choice(
|
|
||||||
$.with_data_cat_expression,
|
|
||||||
$.with_division_expression,
|
|
||||||
$.with_highlight,
|
|
||||||
$.with_metadata_expression,
|
|
||||||
$.with_network_expression,
|
|
||||||
$.with_pricebook_expression,
|
|
||||||
$.with_snippet_expression,
|
|
||||||
$.with_spell_correction_expression
|
|
||||||
),
|
|
||||||
|
|
||||||
sosl_with_clause: ($) =>
|
|
||||||
seq(ci("WITH"), alias($.sosl_with_type, $.with_type)),
|
|
||||||
|
|
||||||
...soqlGrammar.rules,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
};
|
|
||||||
@ -1,203 +0,0 @@
|
|||||||
<!--
|
|
||||||
Based on:
|
|
||||||
- https://github.com/tree-sitter/tree-sitter/blob/master/cli/src/web_ui.html
|
|
||||||
- https://github.com/stsewd/tree-sitter-rst/blob/master/docs/index.html
|
|
||||||
|
|
||||||
Assets from:
|
|
||||||
- https://github.com/tree-sitter/tree-sitter/blob/master/docs/assets/js/playground.js
|
|
||||||
- https://github.com/tree-sitter/tree-sitter.github.io/blob/master/tree-sitter.js
|
|
||||||
- https://github.com/tree-sitter/tree-sitter.github.io/blob/master/tree-sitter.wasm
|
|
||||||
-->
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<title>Salesforce grammar for tree-sitter - tree-sitter-sfapex</title>
|
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.45.0/codemirror.min.css">
|
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/clusterize.js/0.18.0/clusterize.min.css">
|
|
||||||
<link rel="icon" type="image/png" href="https://tree-sitter.github.io/tree-sitter/assets/images/favicon-32x32.png" sizes="32x32" />
|
|
||||||
<link rel="icon" type="image/png" href="https://tree-sitter.github.io/tree-sitter/assets/images/favicon-16x16.png" sizes="16x16" />
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<div id="playground-container" style="visibility: hidden;">
|
|
||||||
<header>
|
|
||||||
<div class=header-item>
|
|
||||||
<bold>
|
|
||||||
<a href="https://github.com/aheber/tree-sitter-sfapex" target="_blank">
|
|
||||||
tree-sitter-sfapex
|
|
||||||
</a>
|
|
||||||
</bold>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class=header-item>
|
|
||||||
<label for="logging-checkbox">log</label>
|
|
||||||
<input id="logging-checkbox" type="checkbox"></input>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class=header-item>
|
|
||||||
<label for="query-checkbox">query</label>
|
|
||||||
<input id="query-checkbox" type="checkbox"></input>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class=header-item>
|
|
||||||
<label for="update-time">parse time: </label>
|
|
||||||
<span id="update-time"></span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<select id="language-select">
|
|
||||||
<option value="apex">Apex</option>
|
|
||||||
<option value="soql">SOQL</option>
|
|
||||||
<option value="sosl">SOSL</option>
|
|
||||||
</select>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<main>
|
|
||||||
<div id="input-pane">
|
|
||||||
<div id="code-container">
|
|
||||||
<textarea id="code-input"></textarea>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="query-container" style="visibility: hidden; position: absolute;">
|
|
||||||
<textarea id="query-input"></textarea>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="output-container-scroll">
|
|
||||||
<pre id="output-container" class="highlight"></pre>
|
|
||||||
</div>
|
|
||||||
</main>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<script src="https://code.jquery.com/jquery-3.3.1.min.js" crossorigin="anonymous">
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.45.0/codemirror.min.js"></script>
|
|
||||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/clusterize.js/0.18.0/clusterize.min.js"></script>
|
|
||||||
|
|
||||||
<script>LANGUAGE_BASE_URL = "js";</script>
|
|
||||||
<script src=js/tree-sitter.js></script>
|
|
||||||
<script src=js/playground.js></script>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
(codeExample => {
|
|
||||||
const handle = setInterval(() => {
|
|
||||||
const $codeEditor = document.querySelector('.CodeMirror');
|
|
||||||
if ($codeEditor) {
|
|
||||||
$codeEditor.CodeMirror.setValue(codeExample);
|
|
||||||
clearInterval(handle);
|
|
||||||
}
|
|
||||||
}, 500);
|
|
||||||
})(`public class Me {
|
|
||||||
{
|
|
||||||
System.debug(a);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`);
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
body {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#playground-container {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
|
|
||||||
header {
|
|
||||||
box-sizing: border-box;
|
|
||||||
display: flex;
|
|
||||||
padding: 20px;
|
|
||||||
height: 60px;
|
|
||||||
border-bottom: 1px solid #aaa;
|
|
||||||
}
|
|
||||||
|
|
||||||
main {
|
|
||||||
flex: 1;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
#input-pane {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 0;
|
|
||||||
bottom: 0;
|
|
||||||
right: 50%;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
|
|
||||||
#code-container,
|
|
||||||
#query-container {
|
|
||||||
flex: 1;
|
|
||||||
position: relative;
|
|
||||||
overflow: hidden;
|
|
||||||
border-right: 1px solid #aaa;
|
|
||||||
border-bottom: 1px solid #aaa;
|
|
||||||
}
|
|
||||||
|
|
||||||
#output-container-scroll {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
left: 50%;
|
|
||||||
bottom: 0;
|
|
||||||
right: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.header-item {
|
|
||||||
margin-right: 30px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#playground-container .CodeMirror {
|
|
||||||
position: absolute;
|
|
||||||
top: 0;
|
|
||||||
bottom: 0;
|
|
||||||
left: 0;
|
|
||||||
right: 0;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
#output-container-scroll {
|
|
||||||
flex: 1;
|
|
||||||
padding: 0;
|
|
||||||
overflow: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
#output-container {
|
|
||||||
padding: 0 10px;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#logging-checkbox {
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
|
|
||||||
.CodeMirror div.CodeMirror-cursor {
|
|
||||||
border-left: 3px solid red;
|
|
||||||
}
|
|
||||||
|
|
||||||
a {
|
|
||||||
text-decoration: none;
|
|
||||||
color: #040404;
|
|
||||||
padding: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
a:hover {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
a.highlighted {
|
|
||||||
background-color: #d9d9d9;
|
|
||||||
color: red;
|
|
||||||
border-radius: 3px;
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
.query-error {
|
|
||||||
text-decoration: underline red dashed;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</body>
|
|
||||||
@ -1,478 +0,0 @@
|
|||||||
let tree;
|
|
||||||
|
|
||||||
(async () => {
|
|
||||||
const CAPTURE_REGEX = /@\s*([\w\._-]+)/g;
|
|
||||||
const COLORS_BY_INDEX = [
|
|
||||||
"blue",
|
|
||||||
"chocolate",
|
|
||||||
"darkblue",
|
|
||||||
"darkcyan",
|
|
||||||
"darkgreen",
|
|
||||||
"darkred",
|
|
||||||
"darkslategray",
|
|
||||||
"dimgray",
|
|
||||||
"green",
|
|
||||||
"indigo",
|
|
||||||
"navy",
|
|
||||||
"red",
|
|
||||||
"sienna",
|
|
||||||
];
|
|
||||||
|
|
||||||
const scriptURL = document.currentScript.getAttribute("src");
|
|
||||||
|
|
||||||
const codeInput = document.getElementById("code-input");
|
|
||||||
const languageSelect = document.getElementById("language-select");
|
|
||||||
const loggingCheckbox = document.getElementById("logging-checkbox");
|
|
||||||
const outputContainer = document.getElementById("output-container");
|
|
||||||
const outputContainerScroll = document.getElementById(
|
|
||||||
"output-container-scroll"
|
|
||||||
);
|
|
||||||
const playgroundContainer = document.getElementById("playground-container");
|
|
||||||
const queryCheckbox = document.getElementById("query-checkbox");
|
|
||||||
const queryContainer = document.getElementById("query-container");
|
|
||||||
const queryInput = document.getElementById("query-input");
|
|
||||||
const updateTimeSpan = document.getElementById("update-time");
|
|
||||||
const languagesByName = {};
|
|
||||||
|
|
||||||
loadState();
|
|
||||||
|
|
||||||
await TreeSitter.init();
|
|
||||||
|
|
||||||
const parser = new TreeSitter();
|
|
||||||
const codeEditor = CodeMirror.fromTextArea(codeInput, {
|
|
||||||
lineNumbers: true,
|
|
||||||
showCursorWhenSelecting: true,
|
|
||||||
});
|
|
||||||
|
|
||||||
const queryEditor = CodeMirror.fromTextArea(queryInput, {
|
|
||||||
lineNumbers: true,
|
|
||||||
showCursorWhenSelecting: true,
|
|
||||||
});
|
|
||||||
|
|
||||||
const cluster = new Clusterize({
|
|
||||||
rows: [],
|
|
||||||
noDataText: null,
|
|
||||||
contentElem: outputContainer,
|
|
||||||
scrollElem: outputContainerScroll,
|
|
||||||
});
|
|
||||||
const renderTreeOnCodeChange = debounce(renderTree, 50);
|
|
||||||
const saveStateOnChange = debounce(saveState, 2000);
|
|
||||||
const runTreeQueryOnChange = debounce(runTreeQuery, 50);
|
|
||||||
|
|
||||||
let languageName = languageSelect.value;
|
|
||||||
let treeRows = null;
|
|
||||||
let treeRowHighlightedIndex = -1;
|
|
||||||
let parseCount = 0;
|
|
||||||
let isRendering = 0;
|
|
||||||
let query;
|
|
||||||
|
|
||||||
codeEditor.on("changes", handleCodeChange);
|
|
||||||
codeEditor.on("viewportChange", runTreeQueryOnChange);
|
|
||||||
codeEditor.on("cursorActivity", debounce(handleCursorMovement, 150));
|
|
||||||
queryEditor.on("changes", debounce(handleQueryChange, 150));
|
|
||||||
|
|
||||||
loggingCheckbox.addEventListener("change", handleLoggingChange);
|
|
||||||
queryCheckbox.addEventListener("change", handleQueryEnableChange);
|
|
||||||
languageSelect.addEventListener("change", handleLanguageChange);
|
|
||||||
outputContainer.addEventListener("click", handleTreeClick);
|
|
||||||
|
|
||||||
handleQueryEnableChange();
|
|
||||||
await handleLanguageChange();
|
|
||||||
|
|
||||||
playgroundContainer.style.visibility = "visible";
|
|
||||||
|
|
||||||
async function handleLanguageChange() {
|
|
||||||
const newLanguageName = languageSelect.value;
|
|
||||||
if (!languagesByName[newLanguageName]) {
|
|
||||||
const url = `${LANGUAGE_BASE_URL}/tree-sitter-${newLanguageName}.wasm`;
|
|
||||||
languageSelect.disabled = true;
|
|
||||||
try {
|
|
||||||
languagesByName[newLanguageName] = await TreeSitter.Language.load(url);
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e);
|
|
||||||
languageSelect.value = languageName;
|
|
||||||
return;
|
|
||||||
} finally {
|
|
||||||
languageSelect.disabled = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tree = null;
|
|
||||||
languageName = newLanguageName;
|
|
||||||
parser.setLanguage(languagesByName[newLanguageName]);
|
|
||||||
handleCodeChange();
|
|
||||||
handleQueryChange();
|
|
||||||
}
|
|
||||||
|
|
||||||
async function handleCodeChange(editor, changes) {
|
|
||||||
const newText = codeEditor.getValue() + "\n";
|
|
||||||
const edits = tree && changes && changes.map(treeEditForEditorChange);
|
|
||||||
|
|
||||||
const start = performance.now();
|
|
||||||
if (edits) {
|
|
||||||
for (const edit of edits) {
|
|
||||||
tree.edit(edit);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const newTree = parser.parse(newText, tree);
|
|
||||||
const duration = (performance.now() - start).toFixed(1);
|
|
||||||
|
|
||||||
updateTimeSpan.innerText = `${duration} ms`;
|
|
||||||
if (tree) tree.delete();
|
|
||||||
tree = newTree;
|
|
||||||
parseCount++;
|
|
||||||
renderTreeOnCodeChange();
|
|
||||||
runTreeQueryOnChange();
|
|
||||||
saveStateOnChange();
|
|
||||||
}
|
|
||||||
|
|
||||||
async function renderTree() {
|
|
||||||
isRendering++;
|
|
||||||
const cursor = tree.walk();
|
|
||||||
|
|
||||||
let currentRenderCount = parseCount;
|
|
||||||
let row = "";
|
|
||||||
let rows = [];
|
|
||||||
let finishedRow = false;
|
|
||||||
let visitedChildren = false;
|
|
||||||
let indentLevel = 0;
|
|
||||||
|
|
||||||
for (let i = 0; ; i++) {
|
|
||||||
if (i > 0 && i % 10000 === 0) {
|
|
||||||
await new Promise((r) => setTimeout(r, 0));
|
|
||||||
if (parseCount !== currentRenderCount) {
|
|
||||||
cursor.delete();
|
|
||||||
isRendering--;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let displayName;
|
|
||||||
if (cursor.nodeIsMissing) {
|
|
||||||
displayName = `MISSING ${cursor.nodeType}`;
|
|
||||||
} else if (cursor.nodeIsNamed) {
|
|
||||||
displayName = cursor.nodeType;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (visitedChildren) {
|
|
||||||
if (displayName) {
|
|
||||||
finishedRow = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cursor.gotoNextSibling()) {
|
|
||||||
visitedChildren = false;
|
|
||||||
} else if (cursor.gotoParent()) {
|
|
||||||
visitedChildren = true;
|
|
||||||
indentLevel--;
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (displayName) {
|
|
||||||
if (finishedRow) {
|
|
||||||
row += "</div>";
|
|
||||||
rows.push(row);
|
|
||||||
finishedRow = false;
|
|
||||||
}
|
|
||||||
const start = cursor.startPosition;
|
|
||||||
const end = cursor.endPosition;
|
|
||||||
const id = cursor.nodeId;
|
|
||||||
let fieldName = cursor.currentFieldName();
|
|
||||||
if (fieldName) {
|
|
||||||
fieldName += ": ";
|
|
||||||
} else {
|
|
||||||
fieldName = "";
|
|
||||||
}
|
|
||||||
row = `<div>${" ".repeat(
|
|
||||||
indentLevel
|
|
||||||
)}${fieldName}<a class='plain' href="#" data-id=${id} data-range="${
|
|
||||||
start.row
|
|
||||||
},${start.column},${end.row},${end.column}">${displayName}</a> [${
|
|
||||||
start.row
|
|
||||||
}, ${start.column}] - [${end.row}, ${end.column}]`;
|
|
||||||
finishedRow = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cursor.gotoFirstChild()) {
|
|
||||||
visitedChildren = false;
|
|
||||||
indentLevel++;
|
|
||||||
} else {
|
|
||||||
visitedChildren = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (finishedRow) {
|
|
||||||
row += "</div>";
|
|
||||||
rows.push(row);
|
|
||||||
}
|
|
||||||
|
|
||||||
cursor.delete();
|
|
||||||
cluster.update(rows);
|
|
||||||
treeRows = rows;
|
|
||||||
isRendering--;
|
|
||||||
handleCursorMovement();
|
|
||||||
}
|
|
||||||
|
|
||||||
function runTreeQuery(_, startRow, endRow) {
|
|
||||||
if (endRow == null) {
|
|
||||||
const viewport = codeEditor.getViewport();
|
|
||||||
startRow = viewport.from;
|
|
||||||
endRow = viewport.to;
|
|
||||||
}
|
|
||||||
|
|
||||||
codeEditor.operation(() => {
|
|
||||||
const marks = codeEditor.getAllMarks();
|
|
||||||
marks.forEach((m) => m.clear());
|
|
||||||
|
|
||||||
if (tree && query) {
|
|
||||||
const captures = query.captures(
|
|
||||||
tree.rootNode,
|
|
||||||
{ row: startRow, column: 0 },
|
|
||||||
{ row: endRow, column: 0 }
|
|
||||||
);
|
|
||||||
let lastNodeId;
|
|
||||||
for (const { name, node } of captures) {
|
|
||||||
if (node.id === lastNodeId) continue;
|
|
||||||
lastNodeId = node.id;
|
|
||||||
const { startPosition, endPosition } = node;
|
|
||||||
codeEditor.markText(
|
|
||||||
{ line: startPosition.row, ch: startPosition.column },
|
|
||||||
{ line: endPosition.row, ch: endPosition.column },
|
|
||||||
{
|
|
||||||
inclusiveLeft: true,
|
|
||||||
inclusiveRight: true,
|
|
||||||
css: `color: ${colorForCaptureName(name)}`,
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleQueryChange() {
|
|
||||||
if (query) {
|
|
||||||
query.delete();
|
|
||||||
query.deleted = true;
|
|
||||||
query = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
queryEditor.operation(() => {
|
|
||||||
queryEditor.getAllMarks().forEach((m) => m.clear());
|
|
||||||
if (!queryCheckbox.checked) return;
|
|
||||||
|
|
||||||
const queryText = queryEditor.getValue();
|
|
||||||
|
|
||||||
try {
|
|
||||||
query = parser.getLanguage().query(queryText);
|
|
||||||
let match;
|
|
||||||
|
|
||||||
let row = 0;
|
|
||||||
queryEditor.eachLine((line) => {
|
|
||||||
while ((match = CAPTURE_REGEX.exec(line.text))) {
|
|
||||||
queryEditor.markText(
|
|
||||||
{ line: row, ch: match.index },
|
|
||||||
{ line: row, ch: match.index + match[0].length },
|
|
||||||
{
|
|
||||||
inclusiveLeft: true,
|
|
||||||
inclusiveRight: true,
|
|
||||||
css: `color: ${colorForCaptureName(match[1])}`,
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
row++;
|
|
||||||
});
|
|
||||||
} catch (error) {
|
|
||||||
const startPosition = queryEditor.posFromIndex(error.index);
|
|
||||||
const endPosition = {
|
|
||||||
line: startPosition.line,
|
|
||||||
ch: startPosition.ch + (error.length || Infinity),
|
|
||||||
};
|
|
||||||
|
|
||||||
if (error.index === queryText.length) {
|
|
||||||
if (startPosition.ch > 0) {
|
|
||||||
startPosition.ch--;
|
|
||||||
} else if (startPosition.row > 0) {
|
|
||||||
startPosition.row--;
|
|
||||||
startPosition.column = Infinity;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
queryEditor.markText(startPosition, endPosition, {
|
|
||||||
className: "query-error",
|
|
||||||
inclusiveLeft: true,
|
|
||||||
inclusiveRight: true,
|
|
||||||
attributes: { title: error.message },
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
runTreeQuery();
|
|
||||||
saveQueryState();
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleCursorMovement() {
|
|
||||||
if (isRendering) return;
|
|
||||||
|
|
||||||
const selection = codeEditor.getDoc().listSelections()[0];
|
|
||||||
let start = { row: selection.anchor.line, column: selection.anchor.ch };
|
|
||||||
let end = { row: selection.head.line, column: selection.head.ch };
|
|
||||||
if (
|
|
||||||
start.row > end.row ||
|
|
||||||
(start.row === end.row && start.column > end.column)
|
|
||||||
) {
|
|
||||||
let swap = end;
|
|
||||||
end = start;
|
|
||||||
start = swap;
|
|
||||||
}
|
|
||||||
const node = tree.rootNode.namedDescendantForPosition(start, end);
|
|
||||||
if (treeRows) {
|
|
||||||
if (treeRowHighlightedIndex !== -1) {
|
|
||||||
const row = treeRows[treeRowHighlightedIndex];
|
|
||||||
if (row)
|
|
||||||
treeRows[treeRowHighlightedIndex] = row.replace(
|
|
||||||
"highlighted",
|
|
||||||
"plain"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
treeRowHighlightedIndex = treeRows.findIndex((row) =>
|
|
||||||
row.includes(`data-id=${node.id}`)
|
|
||||||
);
|
|
||||||
if (treeRowHighlightedIndex !== -1) {
|
|
||||||
const row = treeRows[treeRowHighlightedIndex];
|
|
||||||
if (row)
|
|
||||||
treeRows[treeRowHighlightedIndex] = row.replace(
|
|
||||||
"plain",
|
|
||||||
"highlighted"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
cluster.update(treeRows);
|
|
||||||
const lineHeight = cluster.options.item_height;
|
|
||||||
const scrollTop = outputContainerScroll.scrollTop;
|
|
||||||
const containerHeight = outputContainerScroll.clientHeight;
|
|
||||||
const offset = treeRowHighlightedIndex * lineHeight;
|
|
||||||
if (scrollTop > offset - 20) {
|
|
||||||
$(outputContainerScroll).animate({ scrollTop: offset - 20 }, 150);
|
|
||||||
} else if (scrollTop < offset + lineHeight + 40 - containerHeight) {
|
|
||||||
$(outputContainerScroll).animate(
|
|
||||||
{ scrollTop: offset - containerHeight + 40 },
|
|
||||||
150
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleTreeClick(event) {
|
|
||||||
if (event.target.tagName === "A") {
|
|
||||||
event.preventDefault();
|
|
||||||
const [startRow, startColumn, endRow, endColumn] =
|
|
||||||
event.target.dataset.range.split(",").map((n) => parseInt(n));
|
|
||||||
codeEditor.focus();
|
|
||||||
codeEditor.setSelection(
|
|
||||||
{ line: startRow, ch: startColumn },
|
|
||||||
{ line: endRow, ch: endColumn }
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleLoggingChange() {
|
|
||||||
if (loggingCheckbox.checked) {
|
|
||||||
parser.setLogger((message, lexing) => {
|
|
||||||
if (lexing) {
|
|
||||||
console.log(" ", message);
|
|
||||||
} else {
|
|
||||||
console.log(message);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
parser.setLogger(null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleQueryEnableChange() {
|
|
||||||
if (queryCheckbox.checked) {
|
|
||||||
queryContainer.style.visibility = "";
|
|
||||||
queryContainer.style.position = "";
|
|
||||||
} else {
|
|
||||||
queryContainer.style.visibility = "hidden";
|
|
||||||
queryContainer.style.position = "absolute";
|
|
||||||
}
|
|
||||||
handleQueryChange();
|
|
||||||
}
|
|
||||||
|
|
||||||
function treeEditForEditorChange(change) {
|
|
||||||
const oldLineCount = change.removed.length;
|
|
||||||
const newLineCount = change.text.length;
|
|
||||||
const lastLineLength = change.text[newLineCount - 1].length;
|
|
||||||
|
|
||||||
const startPosition = { row: change.from.line, column: change.from.ch };
|
|
||||||
const oldEndPosition = { row: change.to.line, column: change.to.ch };
|
|
||||||
const newEndPosition = {
|
|
||||||
row: startPosition.row + newLineCount - 1,
|
|
||||||
column:
|
|
||||||
newLineCount === 1
|
|
||||||
? startPosition.column + lastLineLength
|
|
||||||
: lastLineLength,
|
|
||||||
};
|
|
||||||
|
|
||||||
const startIndex = codeEditor.indexFromPos(change.from);
|
|
||||||
let newEndIndex = startIndex + newLineCount - 1;
|
|
||||||
let oldEndIndex = startIndex + oldLineCount - 1;
|
|
||||||
for (let i = 0; i < newLineCount; i++) newEndIndex += change.text[i].length;
|
|
||||||
for (let i = 0; i < oldLineCount; i++)
|
|
||||||
oldEndIndex += change.removed[i].length;
|
|
||||||
|
|
||||||
return {
|
|
||||||
startIndex,
|
|
||||||
oldEndIndex,
|
|
||||||
newEndIndex,
|
|
||||||
startPosition,
|
|
||||||
oldEndPosition,
|
|
||||||
newEndPosition,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function colorForCaptureName(capture) {
|
|
||||||
const id = query.captureNames.indexOf(capture);
|
|
||||||
return COLORS_BY_INDEX[id % COLORS_BY_INDEX.length];
|
|
||||||
}
|
|
||||||
|
|
||||||
function loadState() {
|
|
||||||
const language = localStorage.getItem("language");
|
|
||||||
const sourceCode = localStorage.getItem("sourceCode");
|
|
||||||
const query = localStorage.getItem("query");
|
|
||||||
const queryEnabled = localStorage.getItem("queryEnabled");
|
|
||||||
if (language != null && sourceCode != null && query != null) {
|
|
||||||
queryInput.value = query;
|
|
||||||
codeInput.value = sourceCode;
|
|
||||||
languageSelect.value = language;
|
|
||||||
queryCheckbox.checked = queryEnabled === "true";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function saveState() {
|
|
||||||
localStorage.setItem("language", languageSelect.value);
|
|
||||||
localStorage.setItem("sourceCode", codeEditor.getValue());
|
|
||||||
saveQueryState();
|
|
||||||
}
|
|
||||||
|
|
||||||
function saveQueryState() {
|
|
||||||
localStorage.setItem("queryEnabled", queryCheckbox.checked);
|
|
||||||
localStorage.setItem("query", queryEditor.getValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
function debounce(func, wait, immediate) {
|
|
||||||
var timeout;
|
|
||||||
return function () {
|
|
||||||
var context = this,
|
|
||||||
args = arguments;
|
|
||||||
var later = function () {
|
|
||||||
timeout = null;
|
|
||||||
if (!immediate) func.apply(context, args);
|
|
||||||
};
|
|
||||||
var callNow = immediate && !timeout;
|
|
||||||
clearTimeout(timeout);
|
|
||||||
timeout = setTimeout(later, wait);
|
|
||||||
if (callNow) func.apply(context, args);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
@ -1,49 +0,0 @@
|
|||||||
# Use parsers and queries in nvim-treesitter plugin
|
|
||||||
|
|
||||||
The Apex, SOQL, and SOSL parsers in this repo are alredy part of [nvim-treesitter
|
|
||||||
repository](https://github.com/nvim-treesitter/nvim-treesitter).
|
|
||||||
Any parser new version in this repo is automatically syned in nvim-treesitter.
|
|
||||||
|
|
||||||
Note. Nvim-treesitter maintains its own version of `scm` [query files](https://github.com/nvim-treesitter/nvim-treesitter/tree/master/queries).
|
|
||||||
It means that the query files stored in this repo is not used by nvim-treesitter.
|
|
||||||
|
|
||||||
# How to install and use
|
|
||||||
|
|
||||||
Installing the nvim-treesitter plugin with whatever package manager you use.
|
|
||||||
I use `Lazy`, and you can find my Nvim dotfiles
|
|
||||||
[here](https://github.com/xixiaofinland/dotfiles/tree/main/.config/nvim).
|
|
||||||
|
|
||||||
Once the plugin is installed, the parsers and query files are part of the plugin in your
|
|
||||||
local installed version.
|
|
||||||
|
|
||||||
In your Nvim init configuraiton, you need to setup the filetypes so
|
|
||||||
nvim-treesitter automatically kicks-in when corresponding filetypes are opened.
|
|
||||||
|
|
||||||
```lua
|
|
||||||
vim.filetype = on
|
|
||||||
|
|
||||||
vim.filetype.add({
|
|
||||||
extension = {
|
|
||||||
cls = 'apex',
|
|
||||||
apex = 'apex',
|
|
||||||
trigger = 'apex',
|
|
||||||
soql = 'soql',
|
|
||||||
sosl = 'sosl',
|
|
||||||
}
|
|
||||||
})
|
|
||||||
```
|
|
||||||
|
|
||||||
Now when you open a `.cls` file, Nvim should use the `Apex` parser to parse the Apex language and
|
|
||||||
`highlights.scm` to highlight syntax.
|
|
||||||
|
|
||||||
|
|
||||||
# Troubleshoot
|
|
||||||
|
|
||||||
1. Are the parsers successfully installed?
|
|
||||||
|
|
||||||
Run `:TSInstallInfo` to see the parser installation information
|
|
||||||
|
|
||||||
2. No syntax highlight in Apex?
|
|
||||||
|
|
||||||
Sometimes the syntax higlight module is disabled, open an Apex file and run `:TSEnable highlight` to enable it.
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
@ -1,95 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "tree-sitter-sfapex",
|
|
||||||
"version": "0.0.9",
|
|
||||||
"description": "A tree-sitter implementation for Apex, SOQL, and SOSL",
|
|
||||||
"homepage": "https://github.com/aheber/tree-sitter-sfapex",
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/aheber/tree-sitter-sfapex/issues"
|
|
||||||
},
|
|
||||||
"license": "MIT",
|
|
||||||
"author": {
|
|
||||||
"name": "Anthony Heber"
|
|
||||||
},
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "https://github.com/aheber/tree-sitter-sfapex.git"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"@mapbox/node-pre-gyp": "^1.0.10",
|
|
||||||
"nan": "^2.16.0",
|
|
||||||
"node-pre-gyp-github": "^1.4.4"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"tree-sitter-cli": "0.20.6"
|
|
||||||
},
|
|
||||||
"main": "bindings/node",
|
|
||||||
"scripts": {
|
|
||||||
"build": "npm run build-generate && npm run build-wasm",
|
|
||||||
"build-generate": "npm run build-apex && npm run build-soql && npm run build-sosl",
|
|
||||||
"build-apex": "cd apex && npx tree-sitter generate --no-bindings",
|
|
||||||
"build-soql": "cd soql && npx tree-sitter generate --no-bindings",
|
|
||||||
"build-sosl": "cd sosl && npx tree-sitter generate --no-bindings",
|
|
||||||
"build-wasm": "npm run build-apex-wasm && npm run build-soql-wasm && npm run build-sosl-wasm",
|
|
||||||
"build-apex-wasm": "cd apex && npx tree-sitter build-wasm && cp tree-sitter-apex.wasm ../docs/playground/js/",
|
|
||||||
"build-soql-wasm": "cd soql && npx tree-sitter build-wasm && cp tree-sitter-soql.wasm ../docs/playground/js/",
|
|
||||||
"build-sosl-wasm": "cd sosl && npx tree-sitter build-wasm && cp tree-sitter-sosl.wasm ../docs/playground/js/",
|
|
||||||
"test-load": "node -e \"require('./apex').then(apex => console.log(apex.name)), require('./soql').then(soql => console.log(soql.name)), require('./sosl').then(sosl => console.log(sosl.name))\"",
|
|
||||||
"test": "npm run test-apex && npm run test-soql && npm run test-sosl && npm run test-load",
|
|
||||||
"test-apex": "cd apex && npx tree-sitter test",
|
|
||||||
"test-soql": "cd soql && npx tree-sitter test",
|
|
||||||
"test-sosl": "cd sosl && npx tree-sitter test",
|
|
||||||
"install": "node-pre-gyp install --fallback-to-build"
|
|
||||||
},
|
|
||||||
"tree-sitter": [
|
|
||||||
{
|
|
||||||
"scope": "source.apex",
|
|
||||||
"path": "apex",
|
|
||||||
"file-types": [
|
|
||||||
"cls",
|
|
||||||
"trigger",
|
|
||||||
"apex"
|
|
||||||
],
|
|
||||||
"highlights": [
|
|
||||||
"soql/queries/highlights.scm",
|
|
||||||
"sosl/queries/highlights.scm",
|
|
||||||
"apex/queries/highlights.scm"
|
|
||||||
],
|
|
||||||
"tags": [
|
|
||||||
"apex/queries/tags.scm"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"scope": "source.soql",
|
|
||||||
"path": "soql",
|
|
||||||
"file-types": [
|
|
||||||
"soql"
|
|
||||||
],
|
|
||||||
"highlights": "soql/queries/highlights.scm"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"scope": "source.sosl",
|
|
||||||
"path": "sosl",
|
|
||||||
"file-types": [
|
|
||||||
"sosl"
|
|
||||||
],
|
|
||||||
"highlights": [
|
|
||||||
"soql/queries/highlights.scm",
|
|
||||||
"sosl/queries/highlights.scm"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"files": [
|
|
||||||
"*/queries/*",
|
|
||||||
"*/src/grammar.json",
|
|
||||||
"*/src/node-types.json",
|
|
||||||
"*/src/parser.c",
|
|
||||||
"*/src/tree_sitter/parser.h",
|
|
||||||
"binding.gyp"
|
|
||||||
],
|
|
||||||
"binary": {
|
|
||||||
"module_name": "tree_sitter_sfapex_binding",
|
|
||||||
"module_path": "./build/Release/",
|
|
||||||
"host": "https://github.com/aheber/tree-sitter-sfapex/releases/download/",
|
|
||||||
"remote_path": "{version}"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,13 +0,0 @@
|
|||||||
import NodePreGypGithub from "node-pre-gyp-github";
|
|
||||||
try {
|
|
||||||
const opts = {
|
|
||||||
draft: false,
|
|
||||||
verbose: false,
|
|
||||||
target_commitish: "main",
|
|
||||||
};
|
|
||||||
const nodePreGypGithub = new NodePreGypGithub();
|
|
||||||
await nodePreGypGithub.publish(opts);
|
|
||||||
} catch (err) {
|
|
||||||
console.error(`An error occurred whilst publishing:`, err);
|
|
||||||
process.exit(1);
|
|
||||||
}
|
|
||||||
@ -1,17 +0,0 @@
|
|||||||
const soqlGrammar = require("../common/soql-grammar.js")("soql");
|
|
||||||
module.exports = grammar({
|
|
||||||
name: "soql",
|
|
||||||
|
|
||||||
conflicts: soqlGrammar.conflicts,
|
|
||||||
|
|
||||||
// necessary to enable testing comments
|
|
||||||
extras: ($) => [$.formatting_comment, /\s/],
|
|
||||||
|
|
||||||
rules: {
|
|
||||||
source_file: ($) => seq(repeat($.header_comment), $._soql_query_expression),
|
|
||||||
|
|
||||||
header_comment: ($) => seq("//", /.*/),
|
|
||||||
formatting_comment: ($) => seq("///", /.*/),
|
|
||||||
...soqlGrammar.rules,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
@ -1,15 +0,0 @@
|
|||||||
{
|
|
||||||
"main": "../bindings/node/soql",
|
|
||||||
"tree-sitter": [
|
|
||||||
{
|
|
||||||
"scope": "source.soql",
|
|
||||||
"file-types": [
|
|
||||||
"soql"
|
|
||||||
],
|
|
||||||
"highlights": [
|
|
||||||
"queries/highlights-distinct.scm",
|
|
||||||
"queries/highlights.scm"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -1 +0,0 @@
|
|||||||
(header_comment) @comment.line
|
|
||||||
@ -1,142 +0,0 @@
|
|||||||
; https://code.visualstudio.com/api/language-extensions/semantic-highlight-guide#semantic-token-classification
|
|
||||||
(field_identifier
|
|
||||||
(identifier) @property)
|
|
||||||
|
|
||||||
(field_identifier
|
|
||||||
(dotted_identifier
|
|
||||||
(identifier) @property))
|
|
||||||
|
|
||||||
(type_of_clause
|
|
||||||
(identifier) @property)
|
|
||||||
|
|
||||||
(when_expression
|
|
||||||
(identifier) @type)
|
|
||||||
|
|
||||||
(when_expression
|
|
||||||
(field_list
|
|
||||||
(identifier) @property))
|
|
||||||
|
|
||||||
(when_expression
|
|
||||||
(field_list
|
|
||||||
(dotted_identifier
|
|
||||||
(identifier) @property )))
|
|
||||||
|
|
||||||
(else_expression
|
|
||||||
(field_list
|
|
||||||
(identifier) @property ))
|
|
||||||
|
|
||||||
(else_expression
|
|
||||||
(field_list
|
|
||||||
(dotted_identifier
|
|
||||||
(identifier) @property )))
|
|
||||||
|
|
||||||
(alias_expression
|
|
||||||
(identifier) @label)
|
|
||||||
|
|
||||||
(storage_identifier) @type
|
|
||||||
(function_name) @function
|
|
||||||
(date_literal) @variable.readonly.defaultLibrary
|
|
||||||
|
|
||||||
[
|
|
||||||
","
|
|
||||||
"."
|
|
||||||
":"
|
|
||||||
"?"
|
|
||||||
"("
|
|
||||||
")"
|
|
||||||
] @punctuation
|
|
||||||
|
|
||||||
[
|
|
||||||
"AND"
|
|
||||||
"OR"
|
|
||||||
"NOT"
|
|
||||||
"="
|
|
||||||
"!="
|
|
||||||
"LIKE"
|
|
||||||
"NOT_IN"
|
|
||||||
"INCLUDES"
|
|
||||||
"EXCLUDES"
|
|
||||||
] @operator
|
|
||||||
(value_comparison_operator "<" @operator)
|
|
||||||
"<=" @operator
|
|
||||||
(value_comparison_operator ">" @operator)
|
|
||||||
">=" @operator
|
|
||||||
@operator
|
|
||||||
(set_comparison_operator "IN" @operator)
|
|
||||||
|
|
||||||
(int) @number
|
|
||||||
(decimal) @number
|
|
||||||
(currency_literal) @number
|
|
||||||
(string_literal) @string
|
|
||||||
(date) @variable.readonly
|
|
||||||
(date_time) @variable.readonly
|
|
||||||
|
|
||||||
[
|
|
||||||
"TRUE"
|
|
||||||
"FALSE"
|
|
||||||
(null_literal)
|
|
||||||
] @variable.readonly.defaultLibrary
|
|
||||||
|
|
||||||
[
|
|
||||||
"ABOVE"
|
|
||||||
"ABOVE_OR_BELOW"
|
|
||||||
"ALL_ROWS"
|
|
||||||
"ALL"
|
|
||||||
"AS"
|
|
||||||
"ASC"
|
|
||||||
"AT"
|
|
||||||
"BELOW"
|
|
||||||
"CUSTOM"
|
|
||||||
"DATA_CATEGORY"
|
|
||||||
"DESC"
|
|
||||||
"ELSE"
|
|
||||||
"END"
|
|
||||||
"FIELDS"
|
|
||||||
"FOR"
|
|
||||||
"FROM"
|
|
||||||
"GROUP_BY"
|
|
||||||
"HAVING"
|
|
||||||
"LIMIT"
|
|
||||||
"NULLS_FIRST"
|
|
||||||
"NULLS_LAST"
|
|
||||||
"OFFSET"
|
|
||||||
"ORDER_BY"
|
|
||||||
"REFERENCE"
|
|
||||||
"SELECT"
|
|
||||||
"STANDARD"
|
|
||||||
"THEN"
|
|
||||||
"TRACKING"
|
|
||||||
"TYPEOF"
|
|
||||||
"UPDATE"
|
|
||||||
"USING_SCOPE"
|
|
||||||
"VIEW"
|
|
||||||
"VIEWSTAT"
|
|
||||||
"WITH"
|
|
||||||
"WHERE"
|
|
||||||
"WHEN"
|
|
||||||
] @keyword
|
|
||||||
|
|
||||||
; Using Scope
|
|
||||||
[
|
|
||||||
"delegated"
|
|
||||||
"everything"
|
|
||||||
"mine"
|
|
||||||
"mine_and_my_groups"
|
|
||||||
"my_territory"
|
|
||||||
"my_team_territory"
|
|
||||||
"team"
|
|
||||||
] @enumMember
|
|
||||||
|
|
||||||
; With
|
|
||||||
[
|
|
||||||
"maxDescriptorPerRecord"
|
|
||||||
"RecordVisibilityContext"
|
|
||||||
"Security_Enforced"
|
|
||||||
"supportsDomains"
|
|
||||||
"supportsDelegates"
|
|
||||||
"System_Mode"
|
|
||||||
"User_Mode"
|
|
||||||
"UserId"
|
|
||||||
] @enumMember
|
|
||||||
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,224 +0,0 @@
|
|||||||
#ifndef TREE_SITTER_PARSER_H_
|
|
||||||
#define TREE_SITTER_PARSER_H_
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#define ts_builtin_sym_error ((TSSymbol)-1)
|
|
||||||
#define ts_builtin_sym_end 0
|
|
||||||
#define TREE_SITTER_SERIALIZATION_BUFFER_SIZE 1024
|
|
||||||
|
|
||||||
typedef uint16_t TSStateId;
|
|
||||||
|
|
||||||
#ifndef TREE_SITTER_API_H_
|
|
||||||
typedef uint16_t TSSymbol;
|
|
||||||
typedef uint16_t TSFieldId;
|
|
||||||
typedef struct TSLanguage TSLanguage;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
TSFieldId field_id;
|
|
||||||
uint8_t child_index;
|
|
||||||
bool inherited;
|
|
||||||
} TSFieldMapEntry;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint16_t index;
|
|
||||||
uint16_t length;
|
|
||||||
} TSFieldMapSlice;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
bool visible;
|
|
||||||
bool named;
|
|
||||||
bool supertype;
|
|
||||||
} TSSymbolMetadata;
|
|
||||||
|
|
||||||
typedef struct TSLexer TSLexer;
|
|
||||||
|
|
||||||
struct TSLexer {
|
|
||||||
int32_t lookahead;
|
|
||||||
TSSymbol result_symbol;
|
|
||||||
void (*advance)(TSLexer *, bool);
|
|
||||||
void (*mark_end)(TSLexer *);
|
|
||||||
uint32_t (*get_column)(TSLexer *);
|
|
||||||
bool (*is_at_included_range_start)(const TSLexer *);
|
|
||||||
bool (*eof)(const TSLexer *);
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
TSParseActionTypeShift,
|
|
||||||
TSParseActionTypeReduce,
|
|
||||||
TSParseActionTypeAccept,
|
|
||||||
TSParseActionTypeRecover,
|
|
||||||
} TSParseActionType;
|
|
||||||
|
|
||||||
typedef union {
|
|
||||||
struct {
|
|
||||||
uint8_t type;
|
|
||||||
TSStateId state;
|
|
||||||
bool extra;
|
|
||||||
bool repetition;
|
|
||||||
} shift;
|
|
||||||
struct {
|
|
||||||
uint8_t type;
|
|
||||||
uint8_t child_count;
|
|
||||||
TSSymbol symbol;
|
|
||||||
int16_t dynamic_precedence;
|
|
||||||
uint16_t production_id;
|
|
||||||
} reduce;
|
|
||||||
uint8_t type;
|
|
||||||
} TSParseAction;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint16_t lex_state;
|
|
||||||
uint16_t external_lex_state;
|
|
||||||
} TSLexMode;
|
|
||||||
|
|
||||||
typedef union {
|
|
||||||
TSParseAction action;
|
|
||||||
struct {
|
|
||||||
uint8_t count;
|
|
||||||
bool reusable;
|
|
||||||
} entry;
|
|
||||||
} TSParseActionEntry;
|
|
||||||
|
|
||||||
struct TSLanguage {
|
|
||||||
uint32_t version;
|
|
||||||
uint32_t symbol_count;
|
|
||||||
uint32_t alias_count;
|
|
||||||
uint32_t token_count;
|
|
||||||
uint32_t external_token_count;
|
|
||||||
uint32_t state_count;
|
|
||||||
uint32_t large_state_count;
|
|
||||||
uint32_t production_id_count;
|
|
||||||
uint32_t field_count;
|
|
||||||
uint16_t max_alias_sequence_length;
|
|
||||||
const uint16_t *parse_table;
|
|
||||||
const uint16_t *small_parse_table;
|
|
||||||
const uint32_t *small_parse_table_map;
|
|
||||||
const TSParseActionEntry *parse_actions;
|
|
||||||
const char * const *symbol_names;
|
|
||||||
const char * const *field_names;
|
|
||||||
const TSFieldMapSlice *field_map_slices;
|
|
||||||
const TSFieldMapEntry *field_map_entries;
|
|
||||||
const TSSymbolMetadata *symbol_metadata;
|
|
||||||
const TSSymbol *public_symbol_map;
|
|
||||||
const uint16_t *alias_map;
|
|
||||||
const TSSymbol *alias_sequences;
|
|
||||||
const TSLexMode *lex_modes;
|
|
||||||
bool (*lex_fn)(TSLexer *, TSStateId);
|
|
||||||
bool (*keyword_lex_fn)(TSLexer *, TSStateId);
|
|
||||||
TSSymbol keyword_capture_token;
|
|
||||||
struct {
|
|
||||||
const bool *states;
|
|
||||||
const TSSymbol *symbol_map;
|
|
||||||
void *(*create)(void);
|
|
||||||
void (*destroy)(void *);
|
|
||||||
bool (*scan)(void *, TSLexer *, const bool *symbol_whitelist);
|
|
||||||
unsigned (*serialize)(void *, char *);
|
|
||||||
void (*deserialize)(void *, const char *, unsigned);
|
|
||||||
} external_scanner;
|
|
||||||
const TSStateId *primary_state_ids;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Lexer Macros
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define START_LEXER() \
|
|
||||||
bool result = false; \
|
|
||||||
bool skip = false; \
|
|
||||||
bool eof = false; \
|
|
||||||
int32_t lookahead; \
|
|
||||||
goto start; \
|
|
||||||
next_state: \
|
|
||||||
lexer->advance(lexer, skip); \
|
|
||||||
start: \
|
|
||||||
skip = false; \
|
|
||||||
lookahead = lexer->lookahead;
|
|
||||||
|
|
||||||
#define ADVANCE(state_value) \
|
|
||||||
{ \
|
|
||||||
state = state_value; \
|
|
||||||
goto next_state; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define SKIP(state_value) \
|
|
||||||
{ \
|
|
||||||
skip = true; \
|
|
||||||
state = state_value; \
|
|
||||||
goto next_state; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define ACCEPT_TOKEN(symbol_value) \
|
|
||||||
result = true; \
|
|
||||||
lexer->result_symbol = symbol_value; \
|
|
||||||
lexer->mark_end(lexer);
|
|
||||||
|
|
||||||
#define END_STATE() return result;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Parse Table Macros
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define SMALL_STATE(id) id - LARGE_STATE_COUNT
|
|
||||||
|
|
||||||
#define STATE(id) id
|
|
||||||
|
|
||||||
#define ACTIONS(id) id
|
|
||||||
|
|
||||||
#define SHIFT(state_value) \
|
|
||||||
{{ \
|
|
||||||
.shift = { \
|
|
||||||
.type = TSParseActionTypeShift, \
|
|
||||||
.state = state_value \
|
|
||||||
} \
|
|
||||||
}}
|
|
||||||
|
|
||||||
#define SHIFT_REPEAT(state_value) \
|
|
||||||
{{ \
|
|
||||||
.shift = { \
|
|
||||||
.type = TSParseActionTypeShift, \
|
|
||||||
.state = state_value, \
|
|
||||||
.repetition = true \
|
|
||||||
} \
|
|
||||||
}}
|
|
||||||
|
|
||||||
#define SHIFT_EXTRA() \
|
|
||||||
{{ \
|
|
||||||
.shift = { \
|
|
||||||
.type = TSParseActionTypeShift, \
|
|
||||||
.extra = true \
|
|
||||||
} \
|
|
||||||
}}
|
|
||||||
|
|
||||||
#define REDUCE(symbol_val, child_count_val, ...) \
|
|
||||||
{{ \
|
|
||||||
.reduce = { \
|
|
||||||
.type = TSParseActionTypeReduce, \
|
|
||||||
.symbol = symbol_val, \
|
|
||||||
.child_count = child_count_val, \
|
|
||||||
__VA_ARGS__ \
|
|
||||||
}, \
|
|
||||||
}}
|
|
||||||
|
|
||||||
#define RECOVER() \
|
|
||||||
{{ \
|
|
||||||
.type = TSParseActionTypeRecover \
|
|
||||||
}}
|
|
||||||
|
|
||||||
#define ACCEPT_INPUT() \
|
|
||||||
{{ \
|
|
||||||
.type = TSParseActionTypeAccept \
|
|
||||||
}}
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // TREE_SITTER_PARSER_H_
|
|
||||||
@ -1,209 +0,0 @@
|
|||||||
================================================================================
|
|
||||||
Aggregate Count Id
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
SELECT COUNT(Id)
|
|
||||||
FROM Account
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(source_file
|
|
||||||
(soql_query_body
|
|
||||||
(select_clause
|
|
||||||
(function_expression
|
|
||||||
(function_name)
|
|
||||||
(field_identifier
|
|
||||||
(identifier))))
|
|
||||||
(from_clause
|
|
||||||
(storage_identifier
|
|
||||||
(identifier)))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
Aggregate Count Without Field
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
SELECT COUNT()
|
|
||||||
FROM Account
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(source_file
|
|
||||||
(soql_query_body
|
|
||||||
(select_clause
|
|
||||||
(count_expression
|
|
||||||
(function_name)))
|
|
||||||
(from_clause
|
|
||||||
(storage_identifier
|
|
||||||
(identifier)))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
Aggregate Count Multi
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
SELECT COUNT(Id), COUNT(CampaignId)
|
|
||||||
FROM Opportunity
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(source_file
|
|
||||||
(soql_query_body
|
|
||||||
(select_clause
|
|
||||||
(function_expression
|
|
||||||
(function_name)
|
|
||||||
(field_identifier
|
|
||||||
(identifier)))
|
|
||||||
(function_expression
|
|
||||||
(function_name)
|
|
||||||
(field_identifier
|
|
||||||
(identifier))))
|
|
||||||
(from_clause
|
|
||||||
(storage_identifier
|
|
||||||
(identifier)))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
Aggregate Count With Group
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
SELECT LeadSource, COUNT(Name)
|
|
||||||
FROM Lead
|
|
||||||
GROUP BY LeadSource
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(source_file
|
|
||||||
(soql_query_body
|
|
||||||
(select_clause
|
|
||||||
(field_identifier
|
|
||||||
(identifier))
|
|
||||||
(function_expression
|
|
||||||
(function_name)
|
|
||||||
(field_identifier
|
|
||||||
(identifier))))
|
|
||||||
(from_clause
|
|
||||||
(storage_identifier
|
|
||||||
(identifier)))
|
|
||||||
(group_by_clause
|
|
||||||
(field_identifier
|
|
||||||
(identifier)))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
Aggregate Avg
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
SELECT CampaignId, AVG(Amount)
|
|
||||||
FROM Opportunity
|
|
||||||
GROUP BY CampaignId
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(source_file
|
|
||||||
(soql_query_body
|
|
||||||
(select_clause
|
|
||||||
(field_identifier
|
|
||||||
(identifier))
|
|
||||||
(function_expression
|
|
||||||
(function_name)
|
|
||||||
(field_identifier
|
|
||||||
(identifier))))
|
|
||||||
(from_clause
|
|
||||||
(storage_identifier
|
|
||||||
(identifier)))
|
|
||||||
(group_by_clause
|
|
||||||
(field_identifier
|
|
||||||
(identifier)))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
Aggregate COUNT_DISTINCT
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
SELECT COUNT_DISTINCT(Company)
|
|
||||||
FROM Lead
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(source_file
|
|
||||||
(soql_query_body
|
|
||||||
(select_clause
|
|
||||||
(function_expression
|
|
||||||
(function_name)
|
|
||||||
(field_identifier
|
|
||||||
(identifier))))
|
|
||||||
(from_clause
|
|
||||||
(storage_identifier
|
|
||||||
(identifier)))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
Aggregate MIN
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
SELECT MIN(CreatedDate), FirstName, LastName
|
|
||||||
FROM Contact
|
|
||||||
GROUP BY FirstName, LastName
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(source_file
|
|
||||||
(soql_query_body
|
|
||||||
(select_clause
|
|
||||||
(function_expression
|
|
||||||
(function_name)
|
|
||||||
(field_identifier
|
|
||||||
(identifier)))
|
|
||||||
(field_identifier
|
|
||||||
(identifier))
|
|
||||||
(field_identifier
|
|
||||||
(identifier)))
|
|
||||||
(from_clause
|
|
||||||
(storage_identifier
|
|
||||||
(identifier)))
|
|
||||||
(group_by_clause
|
|
||||||
(field_identifier
|
|
||||||
(identifier))
|
|
||||||
(field_identifier
|
|
||||||
(identifier)))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
Aggregate MAX
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
SELECT Name, MAX(BudgetedCost)
|
|
||||||
FROM Campaign
|
|
||||||
GROUP BY Name
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(source_file
|
|
||||||
(soql_query_body
|
|
||||||
(select_clause
|
|
||||||
(field_identifier
|
|
||||||
(identifier))
|
|
||||||
(function_expression
|
|
||||||
(function_name)
|
|
||||||
(field_identifier
|
|
||||||
(identifier))))
|
|
||||||
(from_clause
|
|
||||||
(storage_identifier
|
|
||||||
(identifier)))
|
|
||||||
(group_by_clause
|
|
||||||
(field_identifier
|
|
||||||
(identifier)))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
Aggregate SUM
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
SELECT SUM(Amount)
|
|
||||||
FROM Opportunity
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(source_file
|
|
||||||
(soql_query_body
|
|
||||||
(select_clause
|
|
||||||
(function_expression
|
|
||||||
(function_name)
|
|
||||||
(field_identifier
|
|
||||||
(identifier))))
|
|
||||||
(from_clause
|
|
||||||
(storage_identifier
|
|
||||||
(identifier)))))
|
|
||||||
@ -1,132 +0,0 @@
|
|||||||
================================================================================
|
|
||||||
Bound Equals (SOQL)
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
SELECT Id FROM Account WHERE Id = :id
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(source_file
|
|
||||||
(soql_query_body
|
|
||||||
(select_clause
|
|
||||||
(field_identifier
|
|
||||||
(identifier)))
|
|
||||||
(from_clause
|
|
||||||
(storage_identifier
|
|
||||||
(identifier))))
|
|
||||||
(ERROR
|
|
||||||
(field_identifier
|
|
||||||
(identifier))
|
|
||||||
(UNEXPECTED 'd')))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
Bound List (SOQL)
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
SELECT Id FROM Account WHERE Id IN :idList
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(source_file
|
|
||||||
(soql_query_body
|
|
||||||
(select_clause
|
|
||||||
(field_identifier
|
|
||||||
(identifier)))
|
|
||||||
(from_clause
|
|
||||||
(storage_identifier
|
|
||||||
(identifier))))
|
|
||||||
(ERROR
|
|
||||||
(field_identifier
|
|
||||||
(identifier))
|
|
||||||
(UNEXPECTED 'd')))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
Bound object function (SOQL)
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
SELECT Id FROM Account WHERE Id IN :object.function()
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(source_file
|
|
||||||
(soql_query_body
|
|
||||||
(select_clause
|
|
||||||
(field_identifier
|
|
||||||
(identifier)))
|
|
||||||
(from_clause
|
|
||||||
(storage_identifier
|
|
||||||
(identifier)))
|
|
||||||
(where_clause
|
|
||||||
(comparison_expression
|
|
||||||
(field_identifier
|
|
||||||
(identifier))
|
|
||||||
(set_comparison_operator)
|
|
||||||
(ERROR
|
|
||||||
(UNEXPECTED 'b')
|
|
||||||
(UNEXPECTED 'u'))
|
|
||||||
(boolean
|
|
||||||
(MISSING "TRUE"))))))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
Bound object property (SOQL)
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
SELECT Id FROM Account WHERE Id IN :idList.blarg
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(source_file
|
|
||||||
(soql_query_body
|
|
||||||
(select_clause
|
|
||||||
(field_identifier
|
|
||||||
(identifier)))
|
|
||||||
(from_clause
|
|
||||||
(storage_identifier
|
|
||||||
(identifier))))
|
|
||||||
(ERROR
|
|
||||||
(field_identifier
|
|
||||||
(identifier))
|
|
||||||
(UNEXPECTED 'd')
|
|
||||||
(UNEXPECTED 'l')))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
Bound safe navigation object property (SOQL)
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
SELECT Id FROM Account WHERE Id IN :idList?.blarg
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(source_file
|
|
||||||
(soql_query_body
|
|
||||||
(select_clause
|
|
||||||
(field_identifier
|
|
||||||
(identifier)))
|
|
||||||
(from_clause
|
|
||||||
(storage_identifier
|
|
||||||
(identifier))))
|
|
||||||
(ERROR
|
|
||||||
(field_identifier
|
|
||||||
(identifier))
|
|
||||||
(UNEXPECTED 'd')
|
|
||||||
(UNEXPECTED 'l')))
|
|
||||||
|
|
||||||
================================================================================
|
|
||||||
Apex Only ALL ROWS
|
|
||||||
================================================================================
|
|
||||||
|
|
||||||
SELECT COUNT() FROM Contact ALL ROWS
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
(source_file
|
|
||||||
(soql_query_body
|
|
||||||
(select_clause
|
|
||||||
(count_expression
|
|
||||||
(function_name)))
|
|
||||||
(from_clause
|
|
||||||
(storage_alias
|
|
||||||
(storage_identifier
|
|
||||||
(identifier))
|
|
||||||
(identifier))))
|
|
||||||
(ERROR))
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue