missing Java and Groovy keywords
the current Java language definition (enhanced by Groovy) isn't up-to-date. There is a whole bunch of new keywords.
Further issues:
- the declaration of an annotation interface is different to the later use of an annotation. Currently, both events are put to keyword group id=3. The problem is simply solved by adding "@Interface" to keyword list 1. IMHO, this is a good solution, since "@Interface" is related to other declarations like enum, interface, record etc.
- Annotations may contain whitespaces after the leading "@", e. g. "@ Override". This is pretty unusual, but can be considered by adding "\s*" to the corresponding regex. (BTW, this is also true - and unusual - for declarations "@ interface". However, I don't see a simple way, how to add an regex to the keyword lists.)
- The new (and rarely used) keyword "non-sealed" is the first Java keyword including a minus sign (-). The standard identifier definition (as mentioned in extras/landDefs-Resources/cleanslate.lang) doesn't contain the minus sign. I added an "Identifiers" entry (borrowed from the cobol.lang definition).
- I added the newer Groovy keywords (see https://groovy-lang.org/syntax.html#_keywords), but did not check for further operators
I attach my reworked and commented "java.lang" definition.
Description="Java"
Categories = {"source"}
-- identifier including the minus sign (needed for Java's "non-sealed")
Identifiers=[[ [a-zA-Z_][\w\-]* ]]
Keywords={
{ Id=1,
List={
-- reserved Java keywords (Java Lang Spec 21)
"abstract", "assert", "boolean", "break", "byte", "case", "catch", "char", "class", "const",
"continue", "default", "do", "double", "else", "enum", "extends", "final", "finally",
"float", "for", "goto", "if", "implements", "import", "instanceof", "int", "interface",
"long", "native", "new", "package", "private", "protected", "public", "return", "short",
"static", "strictfp", "super", "switch", "synchronized", "this", "throw", "throws",
"transient", "try", "void", "volatile", "while", "@interface",
-- contextual Java keywords
"exports", "module", "non-sealed", "open", "opens", "permits", "provides", "record",
"requires", "sealed", "to", "transitive", "uses", "var", "when", "with", "yield",
-- reserved Groovy word. Added here for convenience
"def", "default", "threadsafe",
-- contextual Groovy keywords
"as", "in", "trait"},
},
{ Id=2,
List={"false", "true", "null"},
},
{ Id=3,
Regex=[[@\s*\w+]],
},
{ Id=4,
Regex=[[(\w+)\s*\(]],
},
}
Strings={
Delimiter=[["""|"|']],
Escape = [[ \\u\d{4}|\\x?\d{3}|\\\w|\\[\'\\\"] ]]
}
IgnoreCase=false
Comments={
{ Block=false,
Delimiter= { [[\/\/]] },
},
{ Block=true,
Nested=false,
Delimiter= { [[\/\*]],[[\*\/]],}
}
}
Operators=[[\(|\)|\[|\]|\{|\}|\,|\;|\.|\:|\&|<|>|\!|\=|\/|\*|\%|\+|\-|\|]]
Digits=[[ (?:0x|0X|0b)[0-9a-fA-F_]+|\d*[\.\_]?\d+(?:[eE][\-\+]?\d+)?[fFlLuU]? ]]
EnableIndentation=true
Edited by André Simon