summary refs log tree commit diff stats
path: root/java/vendor/Java.sublime-syntax
diff options
context:
space:
mode:
Diffstat (limited to 'java/vendor/Java.sublime-syntax')
-rw-r--r--java/vendor/Java.sublime-syntax1246
1 files changed, 1246 insertions, 0 deletions
diff --git a/java/vendor/Java.sublime-syntax b/java/vendor/Java.sublime-syntax
new file mode 100644
index 0000000..c13c939
--- /dev/null
+++ b/java/vendor/Java.sublime-syntax
@@ -0,0 +1,1246 @@
+%YAML 1.2
+---
+# http://www.sublimetext.com/docs/3/syntax.html
+name: java-new
+file_extensions:
+  - java
+  - bsh
+scope: source.java
+
+variables:
+  primitives: (?:boolean|byte|char|short|int|float|long|double|var)
+  storage_modifiers: (?:public|private|protected|static|final|native|synchronized|strictfp|abstract|transient|default|volatile)
+
+  id: (?:[\p{L}_$][\p{L}\p{N}_$]*)
+  classcase_id: (?:\p{Lu}[\p{L}\p{N}_$]*)
+  lowercase_id: (?:[_$]*\p{Ll}[\p{Ll}\p{N}_$]*\b)
+  uppercase_id: (?:[_$]*\p{Lu}[\p{Lu}\p{N}_$]*\b)
+
+  # One dot is mandatory to not compete with other regexes that match an id.
+  before_fqn: (?={{lowercase_id}}\s*\.)
+
+  # utility lookaround
+  lambda_lookahead: (?:\(.*\)|{{id}})\s*->
+
+  # digits
+  ddigits0: '\d[\d_]*?(_*)'
+  ddigits: (?:(_*){{ddigits0}})
+  hdigits: (?:(_*)\h[\h_]*?(_*))
+  exponent: '[-+]?{{ddigits}}'
+  eexponent: (?:[eE]{{exponent}})
+  pexponent: (?:[pP]{{exponent}})
+
+contexts:
+  prototype:
+    - match: (?=%>)
+      pop: true
+    - include: comments
+    - include: illegal-keywords
+
+  any_POP:
+    - match: (?=\S)
+      pop: true
+
+  immediate_POP:
+    - match: ''
+      pop: true
+
+  main:
+    - include: prototype
+    - include: package-statement
+    - include: import-statement
+    - include: module
+    - include: class
+    - include: annotations
+    # Get modifiers defined on a different line than the class
+    - include: storage-modifiers
+    - include: stray-braces
+    - include: code
+
+  punctuation-accessor-dot:
+    - match: \.
+      scope: punctuation.accessor.dot.java
+
+  punctuation-separator-comma:
+    - match: \,
+      scope: punctuation.separator.comma.java
+
+  punctuation-terminator-semicolon:
+    - match: ;
+      scope: punctuation.terminator.java
+
+  dot-separated-identifier:
+    - match: '{{id}}'
+    - include: punctuation-accessor-dot
+    - include: immediate_POP
+
+  package-statement:
+    - match: \bpackage\b
+      scope: keyword.other.package.java
+      push:
+        - - meta_scope: meta.package-declaration.java
+          - include: immediate_POP
+        - - match: '{{id}}'
+            set:
+              - meta_scope: meta.path.java entity.name.namespace.java
+              - include: dot-separated-identifier
+          - include: any_POP
+
+  import-statement:
+    - match: \bimport\b
+      scope: keyword.control.import.java
+      push:
+        - - meta_scope: meta.import.java
+          - include: immediate_POP
+        - import-statement-body
+
+  import-statement-body:
+    - match: \bstatic\b
+      scope: keyword.control.import.static.java
+      set: static-import-statement-body
+    - include: before-next-import
+    - match: '{{lowercase_id}}'
+      scope: meta.path.java support.type.package.java
+      set:
+        - meta_content_scope: meta.path.java
+        - include: before-next-import
+        - include: package
+        - match: \*
+          scope: meta.path.java keyword.operator.wildcard.asterisk.java
+          pop: true
+        - match: '{{classcase_id}}'
+          scope: support.class.import.java
+          set:
+            - include: before-next-import
+            - include: punctuation-accessor-dot
+            - include: import-class
+            - include: import-wildcard
+            - include: any_POP
+        - include: any_POP
+    - include: any_POP
+
+  static-import-statement-body:
+    - include: before-next-import
+    - match: '{{lowercase_id}}'
+      scope: meta.path.java support.type.package.java
+      set:
+        - meta_content_scope: meta.path.java
+        - include: before-next-import
+        - include: package
+        - match: '{{classcase_id}}'
+          scope: support.class.import.java
+          set:
+            - include: before-next-import
+            - include: punctuation-accessor-dot
+            - include: import-constant
+            - include: import-class
+            - include: import-function
+            - include: import-wildcard
+            - include: any_POP
+        - include: any_POP
+    - include: any_POP
+
+  before-next-import:
+    # Prevent next import statement to be consumed when a current statement isn't terminated with ';'.
+    - match: (?=\bimport\b)
+      pop: true
+    # For a case of a statement immediately before a class definition.
+    - match: (?=\b(?:{{storage_modifiers}}|class|interface|enum)\b)
+      pop: true
+
+  package:
+    - match: '{{lowercase_id}}'
+      scope: support.type.package.java
+    - include: punctuation-accessor-dot
+
+  all-types:
+    - include: primitive-types
+    - include: object-types
+
+  import-constant:
+    - match: '{{uppercase_id}}'
+      scope: constant.other.import.java
+
+  import-class:
+    - match: '{{classcase_id}}'
+      scope: support.class.import.java
+
+  import-function:
+    - match: '{{id}}'
+      scope: support.function.import.java
+
+  import-wildcard:
+    - match: \*
+      scope: keyword.operator.wildcard.asterisk.java
+
+  annotations:
+    - match: \@
+      scope: punctuation.definition.annotation.java
+      push:
+        - - meta_scope: meta.annotation.java
+          - include: immediate_POP
+        - annotation-parameters
+        - - meta_content_scope: meta.annotation.identifier.java
+          - include: immediate_POP
+        - annotation-type-reference
+
+  annotation-type-reference:
+    - match: '{{before_fqn}}'
+      set:
+        - meta_scope: meta.path.java
+        - match: '{{lowercase_id}}'
+          scope: variable.annotation.package.java
+        - include: punctuation-accessor-dot
+        - include: annotation-type-no-fqn
+    - include: annotation-type-no-fqn
+
+  annotation-type-no-fqn:
+    - match: '{{classcase_id}}'
+      scope: variable.annotation.java
+      set: after-annotation-type-reference
+    - include: any_POP
+
+  after-annotation-type-reference:
+    - match: \.
+      scope: punctuation.accessor.dot.java
+      set: annotation-type-no-fqn
+    - include: any_POP
+
+  annotation-parameters:
+    - match: \(
+      scope: punctuation.section.parens.begin.java
+      set:
+        - meta_scope: meta.annotation.parameters.java
+        - match: \)
+          scope: punctuation.section.parens.end.java
+          pop: true
+        - match: ({{id}})\s*(=)
+          captures:
+            1: variable.parameter.java
+            2: keyword.operator.assignment.java
+          push:
+            - match: (?=[,})])
+              pop: true
+            - include: annotations
+            - include: code
+        - include: annotation-array-initialization
+        - include: annotations
+        - include: code
+    - include: any_POP
+
+  annotation-array-initialization:
+    - match: \{
+      scope: punctuation.section.braces.begin.java
+      push:
+        - meta_scope: meta.braces.annotation-array-initialization.java
+        - include: array-initialization-common
+        - include: annotations
+
+  anonymous-classes-and-new:
+    - match: \bnew\b
+      scope: keyword.other.storage.new.java
+      push:
+        - - meta_scope: meta.instantiation.java
+          - include: immediate_POP
+        - instantiation
+
+  instantiation:
+    - match: \b{{primitives}}\b
+      scope: storage.type.primitive.java
+      set: array-definition
+    - match: '{{before_fqn}}'
+      set: [after-object-type-in-instantiation, object-type-fqn]
+    - include: object-type-instantiation-no-fqn
+
+  object-type-instantiation-no-fqn:
+    - match: '{{classcase_id}}'
+      scope: support.class.java
+      set: after-object-type-in-instantiation
+    - include: any_POP
+
+  after-object-type-in-instantiation:
+    - match: (?=\[)
+      set: array-definition
+    - match: (?=\()
+      set: object-construction
+    - match: <>
+      scope: punctuation.definition.generic.diamond.java
+      set: object-construction
+    - match: (?=<)
+      set: [after-generic-in-instantiation, generic-type-invocation]
+    - match: \.
+      scope: punctuation.accessor.dot.java
+      set: object-type-instantiation-no-fqn
+    - include: any_POP
+
+  after-generic-in-instantiation:
+    - match: (?=\[)
+      set: array-definition
+    - include: object-construction
+
+  object-construction:
+    - match: \(
+      scope: punctuation.section.parens.begin.java
+      set:
+        - meta_scope: meta.parens.constructor-arguments.java
+        - match: \)
+          scope: punctuation.section.parens.end.java
+          set:
+            - match: \{
+              scope: punctuation.section.braces.begin.java
+              set:
+                - meta_scope: meta.class.body.anonymous.java
+                - match: \}
+                  scope: punctuation.section.braces.end.java
+                  pop: true
+                - include: class-body
+            - include: any_POP
+        - include: illegal-parens-terminators
+        - include: code
+    - include: any_POP
+
+  array-definition:
+    - match: \[
+      scope: punctuation.section.brackets.begin.java
+      set:
+        - meta_scope: meta.brackets.array-initialization.java
+        - match: \]
+          scope: punctuation.section.brackets.end.java
+          set:
+            - match: (?=\[)
+              set: array-definition
+            - match: \{
+              scope: punctuation.section.braces.begin.java
+              set: array-initialization
+            - include: any_POP
+        - include: code
+    - include: any_POP
+
+  array-initialization:
+    - meta_scope: meta.braces.array-initialization.java
+    - include: array-initialization-common
+
+  array-initialization-common:
+    - match: \}
+      scope: punctuation.section.braces.end.java
+      pop: true
+    - match: \{
+      scope: punctuation.section.braces.begin.java
+      push: array-initialization
+    - include: code
+
+  class:
+    - match: (?=({{storage_modifiers}}\s+)*(?:class|(?:@)?interface|enum)\b)
+      push: [class-meta, class-type]
+
+  class-meta:
+    - meta_scope: meta.class.java
+    - include: immediate_POP
+
+  class-type:
+    - include: storage-modifiers
+    - match: (?:class|(\@?)interface)\b
+      scope: storage.type.java
+      captures:
+        1: punctuation.definition.type.java
+      set:
+        - class-block
+        - class-extends
+        - generic-type-declaration
+        - class-name
+    - match: enum\b
+      scope: storage.type.java
+      set:
+        - enum-block
+        - class-extends
+        - generic-type-declaration
+        - class-name
+    - include: any_POP
+
+  class-name:
+    - meta_scope: meta.class.identifier.java
+    - match: (?!extends|implements){{id}}\b
+      scope: entity.name.class.java
+      pop: true
+    - include: any_POP
+
+  class-extends:
+    - match: extends\b
+      scope: keyword.declaration.extends.java
+      push:
+        - - meta_scope: meta.class.extends.java
+          - match: \,
+            scope: punctuation.separator.comma.java
+            push: inherited-object-type-reference
+          - include: any_POP
+        - inherited-object-type-reference
+    - match: implements\b
+      scope: keyword.declaration.implements.java
+      push:
+        - - meta_scope: meta.class.implements.java
+          - match: \,
+            scope: punctuation.separator.comma.java
+            push: inherited-object-type-reference
+          - include: any_POP
+        - inherited-object-type-reference
+    - include: any_POP
+
+  class-block:
+    - match: \{
+      scope: punctuation.section.block.begin.java
+      set:
+        - meta_scope: meta.class.body.java meta.block.java
+        - match: \}
+          scope: punctuation.section.block.end.java
+          pop: true
+        - include: class-body
+    - include: any_POP
+
+  class-body:
+    - include: class
+    - include: annotations
+    - include: fields-and-methods
+    - include: constants-and-special-vars
+    - include: storage-modifiers
+    - include: all-types
+    - include: static-code-block
+    - include: punctuation-separator-comma
+    - include: punctuation-terminator-semicolon
+    - match: (?=<)
+      push: generic-type-declaration
+
+  enum-block:
+    - match: \{
+      scope: punctuation.section.block.begin.java
+      set:
+        - meta_scope: meta.class.body.java meta.block.java
+        - match: \}
+          scope: punctuation.section.block.end.java
+          pop: true
+        - include: enum-body
+    - include: any_POP
+
+  enum-body:
+    - match: ^(?=\s*([[:upper:]_][[:upper:][:digit:]_]*|(?!{{primitives}}|{{storage_modifiers}})[[:lower:]_][[:alnum:]_]*)\s*[,;{(])
+      push:
+        - match: (?=[;}])
+          pop: true
+        - match: \w+
+          scope: constant.other.enum.java
+          push:
+            - meta_scope: meta.enum.java
+            - match: \{
+              scope: punctuation.section.block.begin.java
+              push:
+                - meta_scope: meta.enum.body.java meta.block.java
+                - match: \}
+                  scope: punctuation.section.block.end.java
+                  pop: true
+                - include: enum-body
+            - include: parens
+            - include: any_POP
+        - include: punctuation-separator-comma
+    - include: class-body
+
+  code:
+    - include: constants-and-special-vars
+    - include: assignment
+    - include: lambdas
+    - include: strings
+    - include: anonymous-classes-and-new
+    - include: keywords-control
+    - include: method-invocations
+    - include: uppercase-identifiers
+    - include: all-types
+    - include: keywords
+    - include: code-block-include
+    - include: parens
+  code-block-include:
+    - match: \{
+      scope: punctuation.section.block.begin.java
+      push:
+        - meta_scope: meta.block.java
+        - match: \}
+          scope: punctuation.section.block.end.java
+          pop: true
+        - include: code-block
+  code-block:
+    - include: storage-modifiers
+    - include: var-type
+    - include: code
+    - include: annotations
+    - include: code-block-include
+    - include: stray-parens
+  comments:
+    - match: /\*\*/
+      scope: comment.block.empty.java punctuation.definition.comment.java
+    - include: scope:text.html.javadoc
+    - include: comments-inline
+  comments-inline:
+    - match: /\*
+      scope: punctuation.definition.comment.java
+      push:
+        - meta_scope: comment.block.java
+        - match: \*/
+          scope: punctuation.definition.comment.java
+          pop: true
+    - match: //
+      scope: punctuation.definition.comment.java
+      push:
+        - meta_scope: comment.line.double-slash.java
+        - match: \n
+          pop: true
+        - match: (?=%>)
+          pop: true
+
+  constants-and-special-vars:
+    - match: \b(true|false|null)\b
+      scope: constant.language.java
+    - match: \b(this|super)\b
+      scope: variable.language.java
+    # hexadecimal floats
+    - match: |-
+        \b(0[xX])(?x:
+          # 0x1., 0x1.1, 0x1.1p1, 0x1.1p-1, 0x1.p1, 0x1.p-1 | 0x1p1
+          {{hdigits}} (?: (\.) (?: {{hdigits}}? {{pexponent}}? \b )? | {{pexponent}} \b )
+          # 0x.1, 0x.1p1, 0x.1p-1
+          | (\.) {{hdigits}} {{pexponent}}? \b
+        )
+      scope: constant.numeric.float.hexadecimal.java
+      captures:
+        1: punctuation.definition.numeric.hexadecimal.java
+        2: invalid.illegal.numeric.java
+        3: invalid.illegal.numeric.java
+        4: punctuation.separator.decimal.java
+        5: invalid.illegal.numeric.java
+        6: invalid.illegal.numeric.java
+        7: invalid.illegal.numeric.java
+        8: invalid.illegal.numeric.java
+        9: invalid.illegal.numeric.java
+        10: invalid.illegal.numeric.java
+        11: punctuation.separator.decimal.java
+        12: invalid.illegal.numeric.java
+        13: invalid.illegal.numeric.java
+        14: invalid.illegal.numeric.java
+        15: invalid.illegal.numeric.java
+    # decimal floats
+    - match: |-
+        (?x:
+          \b{{ddigits0}}
+          (?:
+            # 1., 1.1, 1.1e1, 1.1e-1, 1.e1, 1.e-1, 1.d, 1.1d, 1.1e1d, 1.1e-1d, 1.e1d, 1.e-1d
+            (\.) (?: {{ddigits}}? {{eexponent}}? ([dDfF])? \b )?
+            # 1e1 1e1d
+            | {{eexponent}} ([dDfF])? \b
+            # 1d
+            | ([dDfF]) \b
+          )
+          # .1, .1e1, .1e-1
+          | (\.) {{ddigits}} {{eexponent}}? ([dDfF])? \b
+        )
+      scope: constant.numeric.float.decimal.java
+      captures:
+        1: invalid.illegal.numeric.java
+        2: punctuation.separator.decimal.java
+        3: invalid.illegal.numeric.java
+        4: invalid.illegal.numeric.java
+        5: invalid.illegal.numeric.java
+        6: invalid.illegal.numeric.java
+        7: storage.type.numeric.java
+        8: invalid.illegal.numeric.java
+        9: invalid.illegal.numeric.java
+        10: storage.type.numeric.java
+        11: storage.type.numeric.java
+        12: punctuation.separator.decimal.java
+        13: invalid.illegal.numeric.java
+        14: invalid.illegal.numeric.java
+        15: invalid.illegal.numeric.java
+        16: invalid.illegal.numeric.java
+        17: storage.type.numeric.java
+    # binary integers
+    - match: \b(0[bB])(_*)[01][01_]*?(_*)([lL])?\b
+      scope: constant.numeric.integer.binary.java
+      captures:
+        1: punctuation.definition.numeric.binary.java
+        2: invalid.illegal.numeric.java
+        3: invalid.illegal.numeric.java
+        4: storage.type.numeric.java
+    # hexadecimal integers
+    - match: \b(0[xX]){{hdigits}}([lL])?\b
+      scope: constant.numeric.integer.hexadecimal.java
+      captures:
+        1: punctuation.definition.numeric.hexadecimal.java
+        2: invalid.illegal.numeric.java
+        3: invalid.illegal.numeric.java
+        4: storage.type.numeric.java
+    # octal integers
+    - match: \b(0)(?:(_+)|[0-7_]+?(_*)|([\d_]+))([lL])?\b
+      scope: constant.numeric.integer.octal.java
+      captures:
+        1: punctuation.definition.numeric.octal.java
+        2: invalid.illegal.numeric.java
+        3: invalid.illegal.numeric.java
+        4: invalid.illegal.numeric.java
+        5: storage.type.numeric.java
+    # decimal integers
+    - match: \b{{ddigits0}}([lL])?\b
+      scope: constant.numeric.integer.decimal.java
+      captures:
+        1: invalid.illegal.numeric.java
+        2: storage.type.numeric.java
+
+  keywords:
+    - match: '::'
+      scope: punctuation.accessor.double-colon.java
+      push:
+        - match: '{{id}}'
+          scope: variable.function.reference.java
+          pop: true
+        - include: any_POP
+    - match: '\?|:'
+      scope: keyword.operator.ternary.java
+    - match: \binstanceof\b
+      scope: keyword.operator.word.instanceof.java
+    - match: (<<|>>>?)
+      scope: keyword.operator.bitshift.java
+    - match: (==|!=|<=|>=|<>|<|>)
+      scope: keyword.operator.comparison.java
+    - match: (\-\-|\+\+)
+      scope: keyword.operator.increment-decrement.java
+    - match: (\-|\+|\*|\/|%)
+      scope: keyword.operator.arithmetic.java
+    - match: (!|&&|\|\|)
+      scope: keyword.operator.logical.java
+    - match: (~|\^|&|\|)
+      scope: keyword.operator.bitwise.java
+    - match: (\.)(class\b)?
+      captures:
+        1: punctuation.accessor.dot.java
+        2: variable.language.java
+    - include: punctuation-separator-comma
+    - include: punctuation-terminator-semicolon
+
+  keywords-control:
+    # exceptions
+    - match: \bcatch\b
+      scope: keyword.control.exception.catch.java
+      push:
+        - meta_scope: meta.catch.java
+        - match: (?=\()
+          set:
+            - match: \(
+              scope: punctuation.section.parens.begin.java
+              set:
+                - meta_scope: meta.catch.parameters.java meta.parens.java
+                - match: \)
+                  scope: punctuation.section.parens.end.java
+                  pop: true
+                - match: \|
+                  scope: punctuation.separator.bar.java
+                - include: parameters
+        - include: any_POP
+    - match: \bfinally\b
+      scope: keyword.control.exception.finally.java
+    - match: \btry\b
+      scope: keyword.control.exception.try.java
+      push: declaration-statement-parens
+    # flow
+    - match: \bassert\b
+      scope: keyword.control.flow.assert.java
+      push:
+        - meta_scope: meta.assertion.java
+        - match: (?=;)
+          pop: true
+        - match: ':'
+          scope: punctuation.separator.expressions.java
+        - include: code
+    - match: \bbreak\b
+      scope: keyword.control.flow.break.java
+    - match: \bcontinue\b
+      scope: keyword.control.flow.continue.java
+    - match: \breturn\b
+      scope: keyword.control.flow.return.java
+    - match: \bthrow\b
+      scope: keyword.control.flow.throw.java
+    # conditional
+    - match: \bif\b
+      scope: keyword.control.conditional.if.java
+    - match: \belse\b
+      scope: keyword.control.conditional.else.java
+    - match: \bswitch\b
+      scope: keyword.control.conditional.switch.java
+    - match: \bcase\b
+      scope: keyword.control.conditional.case.java
+    - match: \bdefault\b
+      scope: keyword.control.conditional.default.java
+    # loop
+    - match: \bdo\b
+      scope: keyword.control.loop.do-while.java
+    - match: \bfor\b
+      scope: keyword.control.loop.for.java
+      push: declaration-statement-parens
+    - match: \bwhile\b
+      scope: keyword.control.loop.while.java
+
+  illegal-keywords:
+    - match: \b(goto|const)\b
+      scope: invalid.illegal.keyword.java
+
+  illegal-open-block:
+    - match: \s?(?={)
+      scope: invalid.illegal.stray-terminator-end
+      pop: true
+
+  illegal-semicolon:
+    - match: ;
+      scope: invalid.illegal.stray-terminator-end
+      pop: true
+
+  illegal-parens-terminators:
+    # Pops the stack if anything matches
+    - include: illegal-semicolon
+    - include: illegal-open-block
+
+  method-invocations:
+    - match: (\.)\s*(?=<)
+      captures:
+        1: punctuation.accessor.dot.java
+      push: generic-type-invocation
+    - match: ({{id}})\s*(\()
+      captures:
+        1: variable.function.java
+        2: punctuation.section.parens.begin.java
+      push:
+        - meta_scope: meta.function-call.java
+        - match: \)
+          scope: punctuation.section.parens.end.java
+          pop: true
+        - include: illegal-parens-terminators
+        - include: code
+
+  fields-and-methods:
+    - match: \bvoid\b
+      scope: storage.type.void.java
+      push: method
+    - match: (?={{id}}\s*\()
+      push: method
+    - match: '{{before_fqn}}'
+      push: [field-or-method, after-object-and-array-types, object-type-fqn]
+    - match: \b{{classcase_id}}
+      scope: support.class.java
+      push: [field-or-method, after-object-and-array-types]
+    - match: \b{{primitives}}\b
+      scope: storage.type.primitive.java
+      push: [field-or-method, array-brackets]
+
+  field-or-method:
+    - match: (?={{id}}\s*\()
+      set: method
+    - match: (?=\S)
+      set:
+      - include: before-next-field
+      - match: (?:({{uppercase_id}})|({{id}}))
+        captures:
+          1: entity.name.constant.java
+          2: meta.field.java
+        push: [static-assignment, array-brackets]
+      - include: punctuation-separator-comma
+      - include: any_POP
+
+  before-next-field:
+    # Prevent style from being removed from whole file when making a new expression
+    - match: (?=\b(?:{{storage_modifiers}}|{{primitives}}|void)\b)
+      pop: true
+
+  method:
+    - meta_scope: meta.method.java
+    - match: ({{classcase_id}})\s*(?=\()
+      captures:
+        1: meta.method.identifier.java entity.name.function.constructor.java
+    - match: ({{id}})\s*(?=\()
+      captures:
+        1: meta.method.identifier.java entity.name.function.java
+    - match: \(
+      scope: punctuation.section.parens.begin.java
+      push:
+        - meta_scope: meta.method.parameters.java meta.parens.java
+        - match: \)
+          scope: punctuation.section.parens.end.java
+          pop: true
+        - include: parameters
+        - match: \S
+          scope: invalid.illegal.missing-parameter-end
+          pop: true
+    - include: throws
+    - include: annotation-default
+    - match: \{
+      scope: punctuation.section.block.begin.java
+      set:
+        - meta_scope: meta.method.java meta.method.body.java
+        - match: \}
+          scope: punctuation.section.block.end.java
+          pop: true
+        - include: code-block
+    - include: any_POP
+
+  throws:
+    - match: \bthrows\b
+      scope: keyword.declaration.throws.java
+      push:
+      - - meta_scope: meta.method.throws.java
+        - match: \,
+          scope: punctuation.separator.comma.java
+          push: object-type-reference
+        - include: any_POP
+      - object-type-reference
+
+  # Stand-along uppercase id, either type or constant.
+  # Should be used only inside code blocks.
+  uppercase-identifiers:
+    # Popular JDK classes
+    - match: \b(?:UUID|UR[LI])\b
+      scope: support.class.java
+      push: after-object-type
+    # Generic type variable
+    - match: \b\p{Lu}\b
+      scope: support.class.java
+      push: after-object-type
+    # Uppercase constants
+    - match: \b{{uppercase_id}}
+      scope: constant.other.java
+
+  # Stand-alone type, maybe type of the variable or class object reference.
+  # Should be used only inside code blocks.
+  object-types:
+    # Here the match is more complex than 'before_fqn'.
+    # In code block we can't simply distinguish package from variable.
+    - match: (?=\b(?:{{lowercase_id}}\.)+\p{Lu})
+      push: [after-object-type, object-type-fqn]
+    - match: \b{{classcase_id}}\b
+      scope: support.class.java
+      push: after-object-type
+
+  object-type-fqn:
+    - meta_scope: meta.path.java
+    - include: package
+    - match: '{{classcase_id}}'
+      scope: support.class.java
+      pop: true
+    - include: any_POP
+
+  after-object-type:
+    - match: (?=<)
+      set: [array-brackets, generic-type-invocation]
+    - match: \.(?!\.)
+      scope: punctuation.accessor.dot.java
+      set:
+        - match: (?=<)
+          set: generic-type-invocation
+        - match: (?:(class)\b|({{uppercase_id}}))
+          captures:
+            1: variable.language.java
+            2: constant.other.java
+          pop: true
+        - match: '{{classcase_id}}'
+          scope: support.class.java
+          set: after-object-type
+        - include: any_POP
+    - include: array-brackets
+
+  # Used in 'throws' and generic bounds
+  object-type-reference:
+    - match: '{{before_fqn}}'
+      set:
+        - meta_scope: meta.path.java
+        - include: package
+        - include: object-type-reference-no-fqn
+    - include: object-type-reference-no-fqn
+
+  object-type-reference-no-fqn:
+    - match: '{{classcase_id}}'
+      scope: support.class.java
+      set: after-object-type-reference
+    - include: any_POP
+
+  after-object-type-reference:
+    - match: (?=<)
+      set: generic-type-invocation
+    - match: \.
+      scope: punctuation.accessor.dot.java
+      set: object-type-reference-no-fqn
+    - include: any_POP
+
+  # Used in method's and generic's parameters
+  object-and-array-types:
+    - match: '{{before_fqn}}'
+      push:
+        - meta_scope: meta.path.java
+        - include: package
+        - include: object-and-array-types-no-fqn
+    - match: \b({{primitives}})(?=\s*\[)
+      scope: storage.type.primitive.java
+      push: array-brackets
+    - match: \b{{classcase_id}}
+      scope: support.class.java
+      push: after-object-and-array-types
+
+  object-and-array-types-no-fqn:
+    - match: '{{classcase_id}}'
+      scope: support.class.java
+      set: after-object-and-array-types
+    - include: any_POP
+
+  after-object-and-array-types:
+    - match: (?=<)
+      set: [array-brackets, generic-type-invocation]
+    - match: \.(?!\.)
+      scope: punctuation.accessor.dot.java
+      set: object-and-array-types-no-fqn
+    - include: array-brackets
+
+  # Used in class-level 'extends' and 'implements'
+  inherited-object-type-reference:
+    - match: '{{before_fqn}}'
+      set:
+        - meta_scope: meta.path.java
+        - match: '{{lowercase_id}}'
+          scope: entity.other.inherited-class.package.java
+        - include: punctuation-accessor-dot
+        - include: inherited-object-type-reference-no-fqn
+    - include: inherited-object-type-reference-no-fqn
+
+  inherited-object-type-reference-no-fqn:
+    - match: (?!class|extends|implements|interface){{id}}
+      scope: entity.other.inherited-class.java
+      set: after-inherited-object-type-reference
+    - include: any_POP
+
+  after-inherited-object-type-reference:
+    - match: (?=<)
+      set: generic-type-invocation
+    - match: \.
+      scope: punctuation.accessor.dot.java
+      set: inherited-object-type-reference-no-fqn
+    - include: any_POP
+
+  generic-type-declaration:
+    - match: <
+      scope: punctuation.definition.generic.begin.java
+      push: generic-type-parameter
+    - include: any_POP
+
+  generic-type-terminator:
+    - include: illegal-semicolon
+    # These characters can't appear in a generic. If we've matched
+    # them then someone forgot to close it.
+    - match: (?=[{}()])
+      pop: true
+    - match: '>'
+      scope: punctuation.definition.generic.end.java
+      pop: true
+
+  generic-type-parameter:
+    - meta_scope: meta.generic.declaration.java
+    - match: \b{{id}}\b
+      scope: variable.parameter.type.java
+      push: generic-type-bounds
+    - include: generic-type-terminator
+
+  generic-type-bounds:
+    - match: (,)|(?=>)
+      captures:
+        1: punctuation.separator.comma.java
+      pop: true
+    - match: \bextends\b
+      scope: keyword.declaration.extends.java
+      push: [generic-type-extends-multiple-bounds, object-type-reference]
+    - match: \bsuper\b
+      scope: keyword.declaration.super.java
+      push: object-type-reference
+
+  generic-type-extends-multiple-bounds:
+    - match: '&'
+      scope: keyword.operator.multiple-bounds.java
+      set: [generic-type-extends-multiple-bounds, object-type-reference]
+    - include: any_POP
+
+  generic-type-invocation:
+    - match: <
+      scope: punctuation.definition.generic.begin.java
+      set: generic-type-argument
+    - include: any_POP
+
+  generic-type-argument:
+    - meta_scope: meta.generic.java
+    - match: \?
+      scope: keyword.operator.wildcard.java
+      push: generic-type-bounds
+    - include: generic-type-terminator
+    - include: object-and-array-types
+    - include: punctuation-separator-comma
+
+  annotation-default:
+    - match: \bdefault\b
+      scope: keyword.declaration.default.java
+      push:
+        - meta_scope: meta.annotation.default.java
+        - match: (?=;)
+          pop: true
+        - include: code
+
+  parameters:
+    - match: \bfinal\b
+      scope: storage.modifier.java
+    - include: annotations
+    - include: primitive-types
+    - include: object-and-array-types
+    - match: \.\.\.
+      scope: keyword.operator.variadic.java
+    - match: '{{id}}'
+      scope: variable.parameter.java
+      push: array-brackets
+    - include: punctuation-separator-comma
+
+  lambdas:
+    - match: (?={{lambda_lookahead}})
+      push: lambda-params
+
+  lambda-params:
+    - meta_scope: meta.function.anonymous.parameters.java
+    - match: \(
+      scope: punctuation.section.parens.begin.java
+      set:
+        - meta_scope: meta.function.anonymous.parameters.java
+        - match: \)
+          scope: punctuation.section.parens.end.java
+          set: lambda-arrow
+        - include: parameters
+    - match: '{{id}}'
+      scope: variable.parameter.java
+      set: lambda-arrow
+
+  lambda-arrow:
+    - match: ->
+      scope: storage.type.function.anonymous.java
+      set:
+        - meta_scope: meta.function.anonymous.body.java
+        - match: (?=[)};])
+          pop: true
+        - include: code
+
+  parens:
+    - match: \(
+      scope: punctuation.section.parens.begin.java
+      push:
+        - meta_scope: meta.parens.java
+        - match: \)
+          scope: punctuation.section.parens.end.java
+          pop: true
+        - include: illegal-parens-terminators
+        - include: code
+
+  declaration-statement-parens:
+    - match: \(
+      scope: punctuation.section.parens.begin.java
+      set:
+        - meta_scope: meta.parens.java
+        - match: \)
+          scope: punctuation.section.parens.end.java
+          pop: true
+        - include: illegal-open-block
+        - include: code-block
+    - include: any_POP
+
+  primitive-types:
+    - match: \b{{primitives}}\b
+      scope: storage.type.primitive.java
+      push: array-brackets
+
+  var-type:
+    - match: \bvar\b
+      scope: storage.type.var.java
+
+  array-brackets:
+    - match: \[\s*\]
+      scope: storage.modifier.array.java
+    - include: any_POP
+
+  static-assignment:
+    - match: \=
+      scope: keyword.operator.assignment.java
+      set:
+        - meta_scope: meta.assignment.rhs.java
+        - match: (?=[,;])
+          pop: true
+        - include: before-next-field
+        - include: code
+        - include: stray-parens
+    - include: any_POP
+
+  assignment:
+    - match: ([|&^*/+-]\=|\=(?!=))
+      scope: keyword.operator.assignment.java
+      push:
+        - meta_scope: meta.assignment.rhs.java
+        - match: (?=;|\)|\}|,)
+          pop: true
+        - include: code
+  static-code-block:
+    - match: \{
+      scope: punctuation.section.block.begin.java
+      push:
+        - meta_scope: meta.static.body.java
+        - match: \}
+          scope: punctuation.section.block.end.java
+          pop: true
+        - include: code-block
+  storage-modifiers:
+    - match: \b{{storage_modifiers}}\b
+      scope: storage.modifier.java
+  stray-braces:
+    - match: \}
+      scope: invalid.illegal.stray-brace-end
+  stray-parens:
+    - match: \)
+      scope: invalid.illegal.stray-parens-end
+
+  strings:
+    - match: \"
+      scope: punctuation.definition.string.begin.java
+      push:
+        - meta_include_prototype: false
+        - meta_scope: string.quoted.double.java
+        - match: \"
+          scope: punctuation.definition.string.end.java
+          pop: true
+        - include: strings-common
+    - match: \'
+      scope: punctuation.definition.string.begin.java
+      push:
+        - meta_include_prototype: false
+        - meta_scope: string.quoted.single.java
+        - match: \'
+          scope: punctuation.definition.string.end.java
+          pop: true
+        - include: strings-common
+
+  strings-common:
+    - match: \n
+      scope: invalid.illegal.newline.java
+      pop: true
+    - match: \\.
+      scope: constant.character.escape.java
+
+  module:
+    - match: (?=\b(?:open\s+)?module\b)
+      push:
+      - - meta_scope: meta.module.java
+        - include: immediate_POP
+      - - match: \bopen\b
+          scope: storage.modifier.java
+        - match: \bmodule\b
+          scope: storage.type.java
+          set: [module-body, module-identifier-scope, module-identifier]
+
+  module-identifier-scope:
+    - meta_scope: meta.module.identifier.java
+    - include: immediate_POP
+
+  module-identifier:
+    - match: '{{id}}'
+      set:
+        - - meta_scope: entity.name.module.java
+          - include: immediate_POP
+        - dot-separated-identifier
+    - include: any_POP
+
+  module-body:
+    - match: \{
+      scope: punctuation.section.braces.begin.java
+      set:
+        - meta_scope: meta.module.body.java
+        - include: module-body-content
+        - match: \}
+          scope: punctuation.section.braces.end.java
+          pop: true
+    - include: any_POP
+
+  module-body-content:
+    - match: \bexports\b
+      scope: keyword.other.module.exports.java
+      push: [exports-statement-scope, exports-or-opens-statement]
+    - match: \bopens\b
+      scope: keyword.other.module.opens.java
+      push: [opens-statement-scope, exports-or-opens-statement]
+    - match: \brequires\b
+      scope: keyword.other.module.requires.java
+      push: requires-statement
+    - match: \buses\b
+      scope: keyword.other.module.uses.java
+      push: [uses-statement-scope, object-type-reference]
+    - match: \bprovides\b
+      scope: keyword.other.module.provides.java
+      push: [provides-statement-scope, provides-with-statement, object-type-reference]
+    - include: punctuation-terminator-semicolon
+
+  # Should always come before module/package patterns
+  module-statement-terminator:
+    - match: (?=[;\}])
+      pop: true
+    - match: (?=\b(?:requires|exports|uses|provides|opens)\b)
+      pop: true
+
+  support-type-module:
+    - match: '{{id}}'
+      push:
+        - - meta_scope: support.type.module.java
+          - include: immediate_POP
+        - dot-separated-identifier
+
+  exports-statement-scope:
+    - meta_scope: meta.exports.java
+    - include: immediate_POP
+
+  opens-statement-scope:
+    - meta_scope: meta.opens.java
+    - include: immediate_POP
+
+  exports-or-opens-statement:
+    - match: \bto\b
+      scope: keyword.other.module.to.java
+      set:
+        - include: module-statement-terminator
+        - include: support-type-module
+        - include: punctuation-separator-comma
+    - include: module-statement-terminator
+    - match: '{{id}}'
+      push:
+        - - meta_scope: support.type.package.java
+          - include: immediate_POP
+        - dot-separated-identifier
+
+  requires-statement:
+    - meta_scope: meta.requires.java
+    - match: \btransitive\b
+      scope: keyword.other.module.transitive.java
+    - include: module-statement-terminator
+    - include: support-type-module
+
+  uses-statement-scope:
+    - meta_scope: meta.uses.java
+    - include: immediate_POP
+
+  provides-statement-scope:
+    - meta_scope: meta.provides.java
+    - include: immediate_POP
+
+  provides-with-statement:
+    - match: \bwith\b
+      scope: keyword.other.module.with.java
+      set:
+        - - match: \,
+            scope: punctuation.separator.comma.java
+            push: object-type-reference
+          - include: any_POP
+        - object-type-reference
+    - include: any_POP