extensions/ql-vscode/syntaxes/dbscheme.tmLanguage.yml (229 lines of code) (raw):

--- # This file is transformed into the equivalent JSON TextMate grammar, with the following additional # features available: # # The `regexOptions` Property # A top-level property named `regexOptions` may be defined with a string value. This string # represents the set of regular expression options to apply to all regular expressions throughout # the file. # # Macros # The `macros` element defines a map of macro names to replacement text. When a `match`, `begin`, or # `end` property has a value that is a single-key map, the value is replaced with the value of the # macro named by the key, with any use of `(?#)` in the macro text replaced with the text of the # value of the key, surrounded by a non-capturing group (`(?:)`). For example: # # The `beginPattern` and `endPattern` Properties # A rule can have a `beginPattern` or `endPattern` property whose value is a reference to another # rule (e.g. `#other-rule`). The `beginPattern` property is replaced as follows: # # my-rule: # beginPattern: '#other-rule' # # would be transformed to # # my-rule: # begin: '(?#other-rule)' # beginCaptures: # '0': # patterns: # - include: '#other-rule' # # An `endPattern` property is transformed similary. # # macros: # repeat: '(?#)*' # repository: # multi-letter: # match: # repeat: '[A-Za-z]' # name: scope.multi-letter # # would be transformed to # # repository: # multi-letter: # match: '(?:[A-Za-z])*' # name: scope.multi-letter # # Reference Expansion # Any comment of the form `(?#ref-id)` in a `match`, `begin`, or `end` property will be replaced # with the match text of the rule named "ref-id". If the rule named "ref-id" consists of just a # `patterns` property with a list of `include` directives, the replacement pattern is the # disjunction of the match patterns of all of the included rules. name: DBScheme scopeName: source.dbscheme fileTypes: [dbscheme] uuid: BE08929D-CEAC-4B88-9844-57475F4E8A82 regexOptions: 'x' # Ignore pattern whitespace # Macros are parameterized patterns that can be used as a match elsewhere in the file. # To use a macro, replace the string for a `match`, `begin`, or `end` property with a single-element # map whose key is the name of the macro to invoke, and whose value is a string to be substituted for # any usage of `(?#)` in the macro pattern definition. macros: keyword: '\b(?#)(?#end-of-id)' annotation: '\#(?#)(?#end-of-id)' patterns: - include: '#table-column-list' - include: '#case-declaration-head' - include: '#annotation' - include: '#non-context-sensitive' - include: '#table-name' - include: '#type-name' repository: # A character that can appear somewhere in an identifier. id-letter: match: '[0-9A-Za-z_]' # Matches a position containing a non-identifier character. Used to ensure we do not match partial # identifiers/keywords in other rules. end-of-id: match: '(?!(?#id-letter))' id: match: '\b [A-Za-z][0-9A-Za-z_]* (?#end-of-id)' at-id: match: '@[A-Za-z][0-9A-Za-z_]* (?#end-of-id)' # An integer literal. integer-literal: match: '[0-9]+(?![0-9])' name: constant.numeric.decimal.dbscheme # A pattern that can start a comment. comment-start: match: '// | /\*' # A QL comment, regardless of form. comment: patterns: # A QLDoc (`/** */`) comment. - begin: '/\*\*' end: '\*/' name: comment.block.documentation.dbscheme # Highlight tag names within the QLDoc. patterns: - begin: '(?<=/\*\*)([^*]|\*(?!/))*$' while: '(^|\G)\s*\*(?!/)(?=([^*]|[*](?!/))*$)' patterns: - include: 'text.html.markdown#fenced_code_block' - include: 'text.html.markdown#lists' - include: 'text.html.markdown#inline' - match: '\G\s* (@\S+)' name: keyword.tag.dbscheme # A block (`/* */`) comment. - begin: '/\*' end: '\*/' name: comment.block.dbscheme # A single line (`//`) comment. - match: //.*$ name: comment.line.double-slash.dbscheme # Operators and punctuation sub: match: '<:' name: punctuation.sub.sub.dbscheme pipe: match: '\|' name: punctuation.separator.pipe.dbscheme open-paren: match: '\(' name: punctuation.parenthesis.open.dbscheme close-paren: match: '\)' name: punctuation.parenthesis.close.dbscheme semicolon: match: ';' name: punctuation.separator.statement.dbscheme colon: match: ':' name: punctuation.separator.colon.dbscheme comma: match: ',' name: punctuation.separator.comma.dbscheme equals: match: '=' name: punctuation.separator.equals.dbscheme dot: match: '\.' name: punctuation.accessor.dbscheme open-bracket: match: '\[' name: punctuation.squarebracket.open.dbscheme close-bracket: match: '\]' name: punctuation.squarebracket.close.dbscheme operator-or-punctuation: patterns: - include: '#sub' - include: '#pipe' - include: '#open-paren' - include: '#close-paren' - include: '#semicolon' - include: '#colon' - include: '#comma' - include: '#equals' - include: '#dot' - include: '#open-bracket' - include: '#close-bracket' # Annotations keyset: match: annotation: 'keyset' name: storage.modifier.keyset.dbscheme computed: match: annotation: 'computed' name: storage.modifier.computed.dbscheme annotation-keyword: patterns: - include: '#keyset' - include: '#computed' # Keywords type: match: keyword: 'type' name: keyword.other.type.dbscheme subtype: match: keyword: 'subtype' name: keyword.other.subtype.dbscheme case: match: keyword: 'case' name: keyword.other.case.dbscheme of: match: keyword: 'of' name: keyword.other.of.dbscheme order: match: keyword: 'order' name: keyword.other.order.dbscheme key: match: keyword: 'key' name: keyword.other.key.dbscheme ref: match: keyword: 'ref' name: storage.modifier.ref.dbscheme int: match: keyword: 'int' name: keyword.type.boolean.dbscheme float: match: keyword: 'float' name: keyword.type.float.dbscheme boolean: match: keyword: 'boolean' name: keyword.type.boolean.dbscheme date: match: keyword: 'date' name: keyword.type.date.dbscheme varchar: match: keyword: 'varchar' name: keyword.type.varchar.dbscheme string: match: keyword: 'string' name: keyword.type.string.dbscheme unique: match: keyword: 'unique' name: storage.modifier.unique.dbscheme # Any "true" keyword (not including annotations). keyword: patterns: - include: '#type' - include: '#subtype' - include: '#case' - include: '#of' - include: '#order' - include: '#key' - include: '#ref' - include: '#int' - include: '#float' - include: '#boolean' - include: '#date' - include: '#varchar' - include: '#string' - include: '#unique' # All tokens that can appear in any context. non-context-sensitive: patterns: - include: '#comment' - include: '#integer-literal' - include: '#operator-or-punctuation' - include: '#keyword' # An annotation on a table declaration. annotation: patterns: - include: '#keyset-annotation' - include: '#annotation-keyword' # A `#keyset` annotation, including its arguments. keyset-annotation: beginPattern: '#keyset' # Ends after the next `]`, or when we encounter something other than a `[`. end: '(?! \s | (?#comment-start) | \[ ) | (?<=\])' name: meta.block.keyset-annotation.dbscheme patterns: - include: '#keyset-annotation-body' - include: '#non-context-sensitive' # The bracket-enclosed body of a `#keyset` annotation. keyset-annotation-body: beginPattern: '#open-bracket' endPattern: '#close-bracket' name: meta.block.keyset-annotation-body.dbscheme patterns: - include: '#non-context-sensitive' - include: '#column-name' table-column-list: beginPattern: '#open-paren' endPattern: '#close-paren' name: meta.block.table-column-list.dbscheme patterns: - include: '#non-context-sensitive' - include: '#column-name' - include: '#type-name' case-declaration-head: beginPattern: '#case' end: '(?!\s|(?#id)|(?#at-id)|(?#dot)|(?#comment-start))' name: meta.block.case-declaration-head.dbscheme patterns: - include: '#non-context-sensitive' - include: '#column-name' - include: '#type-name' column-name: match: '(?#id)' name: entity.name.variable.parameter.dbscheme type-name: match: '(?#at-id)' name: entity.name.type.dbscheme table-name: match: '(?#id)' name: entity.name.function.dbscheme