Something went wrong. Try again.
A post-modern development environment.
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249(identifier) @variable
; Methods
(method_declaration name: (identifier) @function.method)(method_invocation name: (identifier) @function.method)(super) @variable.builtin
; Annotations
(annotation name: (identifier) @attribute)(marker_annotation name: (identifier) @attribute)
; Types
(interface_declaration name: (identifier) @type)(class_declaration name: (identifier) @type)(record_declaration name: (identifier) @type)(enum_declaration name: (identifier) @type)
((field_access object: (identifier) @type) (#match? @type "^[A-Z]"))((scoped_identifier scope: (identifier) @type) (#match? @type "^[A-Z]"))
(constructor_declaration name: (identifier) @type)(compact_constructor_declaration name: (identifier) @type)
(type_identifier) @type
[ (boolean_type) (integral_type) (floating_point_type) (floating_point_type) (void_type)] @type.builtin
(type_arguments (wildcard "?" @type.builtin))
; Patterns (Java 21+): the record type name would otherwise be a @variable.(record_pattern . (identifier) @type); `when` is contextual — only a guard inside a switch label, never a keyword; elsewhere — so scope it to the guard rather than the flat keyword list.(guard "when" @keyword.control.conditional)
; Member access. `field_access` is a distinct node from `method_invocation`, so; this leaves method calls alone; placed before the SCREAMING @constant rule; below so `Type.CONST` stays a constant.(field_access field: (identifier) @variable.other.member)
; Variables
((identifier) @constant (#match? @constant "^_*[A-Z][A-Z\\d_]+$"))
; Unnamed variable / pattern `_` (Java 22) — dim as unused, like the discard in; other languages. It is an (underscore_pattern) in `var _ = …` and a plain; identifier in record components / `case _`.(underscore_pattern) @comment.unused((identifier) @comment.unused (#eq? @comment.unused "_"))
(this) @variable.builtin
; Literals
[ (hex_integer_literal) (decimal_integer_literal) (octal_integer_literal) (binary_integer_literal)] @constant.numeric.integer
[ (decimal_floating_point_literal) (hex_floating_point_literal)] @constant.numeric.float
(character_literal) @constant.character
; `string_literal` now also covers text blocks (`"""…"""`) and its fragments.(string_literal) @string(escape_sequence) @constant.character.escape; Interpolated expressions in string templates (a withdrawn preview) shouldn't; render as string; reset them rather than colour the whole literal.(string_interpolation) @none
[ (true) (false)] @constant.builtin.boolean(null_literal) @constant.builtin
(line_comment) @comment(block_comment) @comment
; Punctuation
[ "::" "." ";" ","] @punctuation.delimiter
[ "@" "..."] @punctuation.special
[ "(" ")" "[" "]" "{" "}"] @punctuation.bracket
(type_arguments [ "<" ">" ] @punctuation.bracket)
(type_parameters [ "<" ">" ] @punctuation.bracket)
; Operators
[ "=" ">" "<" "!" "~" "?" ":" "->" "==" ">=" "<=" "!=" "&&" "||" "++" "--" "+" "-" "*" "/" "&" "|" "^" "%" "<<" ">>" ">>>" "+=" "-=" "*=" "/=" "&=" "|=" "^=" "%=" "<<=" ">>=" ">>>="] @operator
; Keywords
[ "abstract" "assert" "break" "case" "catch" "class" "continue" "default" "do" "else" "enum" "exports" "extends" "final" "finally" "if" "implements" "import" "instanceof" "interface" "module" "native" "new" "non-sealed" "open" "opens" "package" "permits" "private" "protected" "provides" "public" "requires" "record" "return" "sealed" "static" "strictfp" "switch" "synchronized" "throw" "throws" "to" "transient" "transitive" "try" "uses" "volatile" "with" "yield"] @keyword
[ "while" "for"] @keyword.control.repeat