blob: 4bf154473d42bd0e2a4c79630e8bdea9d9d1b718 [file] [log] [blame]
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +02001" Vim syntax file
Aliaksei Budavei40524742024-04-14 19:57:00 +03002" Language: Java
3" Maintainer: Aliaksei Budavei <0x000c70 AT gmail DOT com>
4" Former Maintainer: Claudio Fleiner <claudio@fleiner.com>
5" Repository: https://github.com/zzzyxwvut/java-vim.git
Aliaksei Budavei06bdac12024-05-10 15:49:06 +03006" Last Change: 2024 May 07
Bram Moolenaar071d4272004-06-13 20:20:40 +00007
8" Please check :help java.vim for comments on some of the options available.
9
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020010" quit when a syntax file was already loaded
Bram Moolenaar071d4272004-06-13 20:20:40 +000011if !exists("main_syntax")
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020012 if exists("b:current_syntax")
Bram Moolenaar071d4272004-06-13 20:20:40 +000013 finish
14 endif
15 " we define it here so that included files can test for it
16 let main_syntax='java'
Bram Moolenaar5c736222010-01-06 20:54:52 +010017 syn region javaFold start="{" end="}" transparent fold
Bram Moolenaar071d4272004-06-13 20:20:40 +000018endif
19
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +020020let s:cpo_save = &cpo
21set cpo&vim
22
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020023" Admit the ASCII dollar sign to keyword characters (JLS-17, §3.8):
24execute printf('syntax iskeyword %s,$', &l:iskeyword)
25
Bram Moolenaar071d4272004-06-13 20:20:40 +000026" some characters that cannot be in a java program (outside a string)
27syn match javaError "[\\@`]"
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +010028syn match javaError "<<<\|\.\.\|=>\|||=\|&&=\|\*\/"
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +020029
Bram Moolenaar071d4272004-06-13 20:20:40 +000030" use separate name so that it can be deleted in javacc.vim
31syn match javaError2 "#\|=<"
Bram Moolenaarf37506f2016-08-31 22:22:10 +020032hi def link javaError2 javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +000033
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020034" Keywords (JLS-17, §3.9):
Bram Moolenaar071d4272004-06-13 20:20:40 +000035syn keyword javaExternal native package
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020036syn match javaExternal "\<import\>\%(\s\+static\>\)\="
Bram Moolenaar071d4272004-06-13 20:20:40 +000037syn keyword javaError goto const
38syn keyword javaConditional if else switch
39syn keyword javaRepeat while for do
40syn keyword javaBoolean true false
41syn keyword javaConstant null
42syn keyword javaTypedef this super
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020043syn keyword javaOperator new instanceof
44syn match javaOperator "\<var\>\%(\s*(\)\@!"
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +010045" Since the yield statement, which could take a parenthesised operand,
46" and _qualified_ yield methods get along within the switch block
47" (JLS-17, §3.8), it seems futile to make a region definition for this
48" block; instead look for the _yield_ word alone, and if found,
49" backtrack (arbitrarily) 80 bytes, at most, on the matched line and,
50" if necessary, on the line before that (h: \@<=), trying to match
51" neither a method reference nor a qualified method invocation.
52syn match javaOperator "\%(\%(::\|\.\)[[:space:]\n]*\)\@80<!\<yield\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +000053syn keyword javaType boolean char byte short int long float double
54syn keyword javaType void
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +010055syn keyword javaStatement return
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020056syn keyword javaStorageClass static synchronized transient volatile strictfp serializable
Bram Moolenaar071d4272004-06-13 20:20:40 +000057syn keyword javaExceptions throw try catch finally
58syn keyword javaAssert assert
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020059syn keyword javaMethodDecl throws
60" Differentiate a "MyClass.class" literal from the keyword "class".
Bram Moolenaar071d4272004-06-13 20:20:40 +000061syn match javaTypedef "\.\s*\<class\>"ms=s+1
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020062syn keyword javaClassDecl enum extends implements interface
63syn match javaClassDecl "\<permits\>\%(\s*(\)\@!"
64syn match javaClassDecl "\<record\>\%(\s*(\)\@!"
Bram Moolenaar071d4272004-06-13 20:20:40 +000065syn match javaClassDecl "^class\>"
66syn match javaClassDecl "[^.]\s*\<class\>"ms=s+1
Aliaksei Budavei40524742024-04-14 19:57:00 +030067syn match javaAnnotation "@\%(\K\k*\.\)*\K\k*\>"
Bram Moolenaar00a927d2010-05-14 23:24:24 +020068syn match javaClassDecl "@interface\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +000069syn keyword javaBranch break continue nextgroup=javaUserLabelRef skipwhite
70syn match javaUserLabelRef "\k\+" contained
Bram Moolenaarc9b4b052006-04-30 18:54:39 +000071syn match javaVarArg "\.\.\."
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020072syn keyword javaScopeDecl public protected private
73syn keyword javaConceptKind abstract final
74syn match javaConceptKind "\<non-sealed\>"
75syn match javaConceptKind "\<sealed\>\%(\s*(\)\@!"
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +010076syn match javaConceptKind "\<default\>\%(\s*\%(:\|->\)\)\@!"
Bram Moolenaar071d4272004-06-13 20:20:40 +000077
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020078" Note that a "module-info" file will be recognised with an arbitrary
79" file extension (or no extension at all) so that more than one such
80" declaration for the same Java module can be maintained for modular
81" testing in a project without attendant confusion for IDEs, with the
82" ".java\=" extension used for a production version and an arbitrary
83" extension used for a testing version.
84let s:module_info_cur_buf = fnamemodify(bufname("%"), ":t") =~ '^module-info\%(\.class\>\)\@!'
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +020085let s:selectable_regexp_engine = !(v:version < 704)
86lockvar s:selectable_regexp_engine s:module_info_cur_buf
Bram Moolenaar63f32602022-06-09 20:45:54 +010087
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020088" Java modules (since Java 9, for "module-info.java" file).
89if s:module_info_cur_buf
90 syn keyword javaModuleStorageClass module transitive
91 syn keyword javaModuleStmt open requires exports opens uses provides
92 syn keyword javaModuleExternal to with
Bram Moolenaar91f84f62018-07-29 15:07:52 +020093endif
94
Bram Moolenaar8ada17c2006-01-19 22:16:24 +000095if exists("java_highlight_java_lang_ids")
96 let java_highlight_all=1
97endif
Bram Moolenaar91f84f62018-07-29 15:07:52 +020098if exists("java_highlight_all") || exists("java_highlight_java") || exists("java_highlight_java_lang")
Bram Moolenaar071d4272004-06-13 20:20:40 +000099 " java.lang.*
Bram Moolenaar63f32602022-06-09 20:45:54 +0100100 "
101 " The keywords of javaR_JavaLang, javaC_JavaLang, javaE_JavaLang,
102 " and javaX_JavaLang are sub-grouped according to the Java version
103 " of their introduction, and sub-group keywords (that is, class
104 " names) are arranged in alphabetical order, so that future newer
105 " keywords can be pre-sorted and appended without disturbing
106 " the current keyword placement. The below _match_es follow suit.
107
Aliaksei Budavei63d68c22024-03-26 20:12:05 +0300108 syn keyword javaR_JavaLang ArithmeticException ArrayIndexOutOfBoundsException ArrayStoreException ClassCastException IllegalArgumentException IllegalMonitorStateException IllegalThreadStateException IndexOutOfBoundsException NegativeArraySizeException NullPointerException NumberFormatException RuntimeException SecurityException StringIndexOutOfBoundsException IllegalStateException UnsupportedOperationException EnumConstantNotPresentException TypeNotPresentException IllegalCallerException LayerInstantiationException WrongThreadException MatchException
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000109 syn cluster javaClasses add=javaR_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200110 hi def link javaR_JavaLang javaR_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100111 " Member enumerations:
112 syn match javaC_JavaLang "\%(\<Thread\.\)\@<=\<State\>"
113 syn match javaC_JavaLang "\%(\<Character\.\)\@<=\<UnicodeScript\>"
114 syn match javaC_JavaLang "\%(\<ProcessBuilder\.Redirect\.\)\@<=\<Type\>"
115 syn match javaC_JavaLang "\%(\<StackWalker\.\)\@<=\<Option\>"
116 syn match javaC_JavaLang "\%(\<System\.Logger\.\)\@<=\<Level\>"
117 " Member classes:
118 syn match javaC_JavaLang "\%(\<Character\.\)\@<=\<Subset\>"
119 syn match javaC_JavaLang "\%(\<Character\.\)\@<=\<UnicodeBlock\>"
120 syn match javaC_JavaLang "\%(\<ProcessBuilder\.\)\@<=\<Redirect\>"
121 syn match javaC_JavaLang "\%(\<ModuleLayer\.\)\@<=\<Controller\>"
122 syn match javaC_JavaLang "\%(\<Runtime\.\)\@<=\<Version\>"
123 syn match javaC_JavaLang "\%(\<System\.\)\@<=\<LoggerFinder\>"
124 syn match javaC_JavaLang "\%(\<Enum\.\)\@<=\<EnumDesc\>"
125 syn keyword javaC_JavaLang Boolean Character Class ClassLoader Compiler Double Float Integer Long Math Number Object Process Runtime SecurityManager String StringBuffer Thread ThreadGroup Byte Short Void InheritableThreadLocal Package RuntimePermission ThreadLocal StrictMath StackTraceElement Enum ProcessBuilder StringBuilder ClassValue Module ModuleLayer StackWalker Record
126 syn match javaC_JavaLang "\<System\>" " See javaDebug.
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200127 " As of JDK 21, java.lang.Compiler is no more (deprecated in JDK 9).
Aliaksei Budavei63d68c22024-03-26 20:12:05 +0300128 syn keyword javaLangDeprecated Compiler
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000129 syn cluster javaClasses add=javaC_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200130 hi def link javaC_JavaLang javaC_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100131 syn keyword javaE_JavaLang AbstractMethodError ClassCircularityError ClassFormatError Error IllegalAccessError IncompatibleClassChangeError InstantiationError InternalError LinkageError NoClassDefFoundError NoSuchFieldError NoSuchMethodError OutOfMemoryError StackOverflowError ThreadDeath UnknownError UnsatisfiedLinkError VerifyError VirtualMachineError ExceptionInInitializerError UnsupportedClassVersionError AssertionError BootstrapMethodError
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000132 syn cluster javaClasses add=javaE_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200133 hi def link javaE_JavaLang javaE_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100134 syn keyword javaX_JavaLang ClassNotFoundException CloneNotSupportedException Exception IllegalAccessException InstantiationException InterruptedException NoSuchMethodException Throwable NoSuchFieldException ReflectiveOperationException
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000135 syn cluster javaClasses add=javaX_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200136 hi def link javaX_JavaLang javaX_Java
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000137
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200138 hi def link javaR_Java javaR_
139 hi def link javaC_Java javaC_
140 hi def link javaE_Java javaE_
141 hi def link javaX_Java javaX_
142 hi def link javaX_ javaExceptions
143 hi def link javaR_ javaExceptions
144 hi def link javaE_ javaExceptions
145 hi def link javaC_ javaConstant
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000146
Bram Moolenaar071d4272004-06-13 20:20:40 +0000147 syn keyword javaLangObject clone equals finalize getClass hashCode
148 syn keyword javaLangObject notify notifyAll toString wait
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200149 hi def link javaLangObject javaConstant
Bram Moolenaar071d4272004-06-13 20:20:40 +0000150endif
151
152if filereadable(expand("<sfile>:p:h")."/javaid.vim")
153 source <sfile>:p:h/javaid.vim
154endif
155
156if exists("java_space_errors")
157 if !exists("java_no_trail_space_error")
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200158 syn match javaSpaceError "\s\+$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000159 endif
160 if !exists("java_no_tab_space_error")
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200161 syn match javaSpaceError " \+\t"me=e-1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000162 endif
163endif
164
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100165syn match javaUserLabel "^\s*\<\K\k*\>\%(\<default\>\)\@<!\s*:"he=e-1
166syn region javaLabelRegion transparent matchgroup=javaLabel start="\<case\>" matchgroup=NONE end=":\|->" contains=javaLabelCastType,javaLabelNumber,javaCharacter,javaString,javaConstant,@javaClasses,javaLabelDefault,javaLabelVarType,javaLabelWhenClause
167syn region javaLabelRegion transparent matchgroup=javaLabel start="\<default\>\%(\s*\%(:\|->\)\)\@=" matchgroup=NONE end=":\|->" oneline
168" Consider grouped _default_ _case_ labels, i.e.
169" case null, default ->
170" case null: default:
171syn keyword javaLabelDefault contained default
172syn keyword javaLabelVarType contained var
173syn keyword javaLabelCastType contained char byte short int
174" Allow for the contingency of the enclosing region not being able to
175" _keep_ its _end_, e.g. case ':':.
176syn region javaLabelWhenClause contained transparent matchgroup=javaLabel start="\<when\>" matchgroup=NONE end=":"me=e-1 end="->"me=e-2 contains=TOP,javaExternal
177syn match javaLabelNumber contained "\<0\>[lL]\@!"
178syn match javaLabelNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)\>[lL]\@!"
179hi def link javaLabelDefault javaLabel
180hi def link javaLabelVarType javaOperator
181hi def link javaLabelNumber javaNumber
182hi def link javaLabelCastType javaType
Bram Moolenaar071d4272004-06-13 20:20:40 +0000183
Bram Moolenaar071d4272004-06-13 20:20:40 +0000184" Comments
185syn keyword javaTodo contained TODO FIXME XXX
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300186
Bram Moolenaar071d4272004-06-13 20:20:40 +0000187if exists("java_comment_strings")
188 syn region javaCommentString contained start=+"+ end=+"+ end=+$+ end=+\*/+me=s-1,he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300189 syn region javaCommentString contained start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell,javaSpecialError,javaTextBlockError
190 syn region javaComment2String contained start=+"+ end=+$\|"+ contains=javaSpecial,javaSpecialChar,@Spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000191 syn match javaCommentCharacter contained "'\\[^']\{1,6\}'" contains=javaSpecialChar
192 syn match javaCommentCharacter contained "'\\''" contains=javaSpecialChar
193 syn match javaCommentCharacter contained "'[^\\]'"
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300194 syn cluster javaCommentSpecial add=javaCommentString,javaCommentCharacter,javaNumber,javaStrTempl
195 syn cluster javaCommentSpecial2 add=javaComment2String,javaCommentCharacter,javaNumber,javaStrTempl
Bram Moolenaar071d4272004-06-13 20:20:40 +0000196endif
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300197
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300198syn region javaComment matchgroup=javaCommentStart start="/\*" end="\*/" contains=@javaCommentSpecial,javaTodo,javaCommentError,javaSpaceError,@Spell
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200199syn match javaCommentStar contained "^\s*\*[^/]"me=e-1
200syn match javaCommentStar contained "^\s*\*$"
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300201syn match javaLineComment "//.*" contains=@javaCommentSpecial2,javaTodo,javaCommentMarkupTag,javaSpaceError,@Spell
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300202syn match javaCommentMarkupTag contained "@\%(end\|highlight\|link\|replace\|start\)\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
203syn match javaCommentMarkupTagAttr contained "\<region\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
204syn region javaCommentMarkupTagAttr contained transparent matchgroup=htmlArg start=/\<\%(re\%(gex\|gion\|placement\)\|substring\|t\%(arget\|ype\)\)\%(\s*=\)\@=/ matchgroup=htmlString end=/\%(=\s*\)\@<=\%("[^"]\+"\|'[^']\+'\|\%([.-]\|\k\)\+\)/ nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite oneline
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300205hi def link javaCommentMarkupTagAttr htmlArg
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200206hi def link javaCommentString javaString
207hi def link javaComment2String javaString
208hi def link javaCommentCharacter javaCharacter
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300209syn match javaCommentError contained "/\*"me=e-1 display
210hi def link javaCommentError javaError
211hi def link javaCommentStart javaComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000212
Bram Moolenaar071d4272004-06-13 20:20:40 +0000213if !exists("java_ignore_javadoc") && main_syntax != 'jsp'
214 syntax case ignore
215 " syntax coloring for javadoc comments (HTML)
Bram Moolenaar63f32602022-06-09 20:45:54 +0100216 syntax include @javaHtml syntax/html.vim
Bram Moolenaar071d4272004-06-13 20:20:40 +0000217 unlet b:current_syntax
Bram Moolenaar5c736222010-01-06 20:54:52 +0100218 " HTML enables spell checking for all text that is not in a syntax item. This
219 " is wrong for Java (all identifiers would be spell-checked), so it's undone
220 " here.
221 syntax spell default
222
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300223 syn region javaDocComment start="/\*\*" end="\*/" keepend contains=javaCommentTitle,@javaHtml,javaDocTags,javaDocSeeTag,javaDocCodeTag,javaDocSnippetTag,javaTodo,javaCommentError,javaSpaceError,@Spell
224 syn region javaCommentTitle contained matchgroup=javaDocComment start="/\*\*" matchgroup=javaCommentTitle end="\.$" end="\.[ \t\r]\@=" end="\%(^\s*\**\s*\)\@<=@"me=s-2,he=s-1 end="\*/"me=s-1,he=s-1 contains=@javaHtml,javaCommentStar,javaTodo,javaCommentError,javaSpaceError,@Spell,javaDocTags,javaDocSeeTag,javaDocCodeTag,javaDocSnippetTag
225 syn region javaCommentTitle contained matchgroup=javaDocComment start="/\*\*\s*\r\=\n\=\s*\**\s*\%({@return\>\)\@=" matchgroup=javaCommentTitle end="}\%(\s*\.*\)*" contains=@javaHtml,javaCommentStar,javaTodo,javaCommentError,javaSpaceError,@Spell,javaDocTags,javaDocSeeTag,javaDocCodeTag,javaDocSnippetTag
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300226 syn region javaDocTags contained start="{@\%(li\%(teral\|nk\%(plain\)\=\)\|inherit[Dd]oc\|doc[rR]oot\|value\)\>" end="}"
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300227 syn match javaDocTags contained "@\%(param\|exception\|throws\|since\)\s\+\S\+" contains=javaDocParam
228 syn match javaDocParam contained "\s\S\+"
229 syn match javaDocTags contained "@\%(version\|author\|return\|deprecated\|serial\%(Field\|Data\)\=\)\>"
230 syn region javaDocSeeTag contained matchgroup=javaDocTags start="@see\s\+" matchgroup=NONE end="\_."re=e-1 contains=javaDocSeeTagParam
231 syn match javaDocSeeTagParam contained @"\_[^"]\+"\|<a\s\+\_.\{-}</a>\|\%(\k\|\.\)*\%(#\k\+\%((\_[^)]*)\)\=\)\=@ contains=@javaHtml extend
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300232 syn region javaCodeSkipBlock contained transparent start="{\%(@code\>\)\@!" end="}" contains=javaCodeSkipBlock,javaDocCodeTag
233 syn region javaDocCodeTag contained start="{@code\>" end="}" contains=javaDocCodeTag,javaCodeSkipBlock
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300234 syn region javaDocSnippetTagAttr contained transparent matchgroup=htmlArg start=/\<\%(class\|file\|id\|lang\|region\)\%(\s*=\)\@=/ matchgroup=htmlString end=/:$/ end=/\%(=\s*\)\@<=\%("[^"]\+"\|'[^']\+'\|\%([.\\/-]\|\k\)\+\)/ nextgroup=javaDocSnippetTagAttr skipwhite skipnl
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300235 syn region javaSnippetSkipBlock contained transparent start="{\%(@snippet\>\)\@!" end="}" contains=javaSnippetSkipBlock,javaDocSnippetTag,javaCommentMarkupTag
236 syn region javaDocSnippetTag contained start="{@snippet\>" end="}" contains=javaDocSnippetTag,javaSnippetSkipBlock,javaDocSnippetTagAttr,javaCommentMarkupTag
Bram Moolenaar071d4272004-06-13 20:20:40 +0000237 syntax case match
238endif
239
240" match the special comment /**/
241syn match javaComment "/\*\*/"
242
243" Strings and constants
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200244syn match javaSpecialError contained "\\."
Bram Moolenaar071d4272004-06-13 20:20:40 +0000245syn match javaSpecialCharError contained "[^']"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300246" Escape Sequences (JLS-17, §3.10.7):
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300247syn match javaSpecialChar contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000248syn region javaString start=+"+ end=+"+ end=+$+ contains=javaSpecialChar,javaSpecialError,@Spell
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300249syn region javaString start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecialChar,javaSpecialError,javaTextBlockError,@Spell
250syn match javaTextBlockError +"""\s*"""+
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300251syn region javaStrTemplEmbExp contained matchgroup=javaStrTempl start="\\{" end="}" contains=TOP
252syn region javaStrTempl start=+\%(\.[[:space:]\n]*\)\@<="+ end=+"+ contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,@Spell
253syn region javaStrTempl start=+\%(\.[[:space:]\n]*\)\@<="""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,javaTextBlockError,@Spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000254syn match javaCharacter "'[^']*'" contains=javaSpecialChar,javaSpecialCharError
255syn match javaCharacter "'\\''" contains=javaSpecialChar
256syn match javaCharacter "'[^\\]'"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300257" Integer literals (JLS-17, §3.10.1):
258syn keyword javaNumber 0 0l 0L
259syn match javaNumber "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
260" Decimal floating-point literals (JLS-17, §3.10.2):
261" Against "\<\d\+\>\.":
262syn match javaNumber "\<\d\%(_*\d\)*\."
263syn match javaNumber "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
264syn match javaNumber "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
265syn match javaNumber "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
266" Hexadecimal floating-point literals (JLS-17, §3.10.2):
267syn match javaNumber "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000268
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300269" Unicode characters
270syn match javaSpecial "\\u\x\x\x\x"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000271
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200272" Method declarations (JLS-17, §8.4.3, §8.4.4, §9.4).
Bram Moolenaar071d4272004-06-13 20:20:40 +0000273if exists("java_highlight_functions")
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200274 syn cluster javaFuncParams contains=javaAnnotation,@javaClasses,javaType,javaVarArg,javaComment,javaLineComment
275
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300276 if java_highlight_functions =~# '^indent[1-8]\=$'
277 let s:last = java_highlight_functions[-1 :]
278 let s:indent = s:last != 't' ? repeat("\x20", s:last) : "\t"
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200279 syn cluster javaFuncParams add=javaScopeDecl,javaConceptKind,javaStorageClass,javaExternal
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300280 " Try to not match other type members, initialiser blocks, enum
281 " constants (JLS-17, §8.9.1), and constructors (JLS-17, §8.1.7):
282 " at any _conventional_ indentation, skip over all fields with
283 " "[^=]*", all records with "\<record\s", and let the "*Skip*"
284 " definitions take care of constructor declarations and enum
285 " constants (with no support for @Foo(value = "bar")).
286 exec 'syn region javaFuncDef start=+^' . s:indent . '\%(<[^>]\+>\+\s\+\|\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)\+\)\=\%(\<\K\k*\>\.\)*\K\k*\>[^=]*\%(\<record\)\@6<!\s\K\k*\s*(+ end=+)+ contains=@javaFuncParams'
287 " As long as package-private constructors cannot be matched with
288 " javaFuncDef, do not look with javaConstructorSkipDeclarator for
289 " them.
290 exec 'syn match javaConstructorSkipDeclarator transparent +^' . s:indent . '\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)*p\%(ublic\|rotected\|rivate\)\s\+\%(<[^>]\+>\+\s\+\)\=\K\k*\s*\ze(+ contains=javaAnnotation,javaScopeDecl'
291 exec 'syn match javaEnumSkipArgumentativeConstant transparent +^' . s:indent . '\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)*\K\k*\s*\ze(+ contains=javaAnnotation'
292 unlet s:indent s:last
Bram Moolenaar071d4272004-06-13 20:20:40 +0000293 else
Aliaksei Budavei40524742024-04-14 19:57:00 +0300294 " This is the "style" variant (:help ft-java-syntax).
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200295 syn cluster javaFuncParams add=javaScopeDecl,javaConceptKind,javaStorageClass,javaExternal
296
297 " Match arbitrarily indented camelCasedName method declarations.
298 " Match: [@ɐ] [abstract] [<α, β>] Τʬ[<γ>][[][]] μʭʭ(/* ... */);
299
300 if s:selectable_regexp_engine
301 " Request the new regexp engine for [:upper:] and [:lower:].
302 syn region javaFuncDef start=/\%#=2^\s\+\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)*\%(p\%(ublic\|rotected\|rivate\)\s\+\)\=\%(\%(abstract\|default\)\s\+\|\%(\%(final\|\%(native\|strictfp\)\|s\%(tatic\|ynchronized\)\)\s\+\)*\)\=\%(<.*[[:space:]-]\@1<!>\s\+\)\=\%(void\|\%(b\%(oolean\|yte\)\|char\|short\|int\|long\|float\|double\|\%(\<\K\k*\>\.\)*\<[$_[:upper:]]\k*\>\%(<[^(){}]*[[:space:]-]\@1<!>\)\=\)\%(\[\]\)*\)\s\+\<[$_[:lower:]]\k*\>\s*(/ end=/)/ skip=/\/\*.\{-}\*\/\|\/\/.*$/ contains=@javaFuncParams
303 else
304 " XXX: \C\<[^a-z0-9]\k*\> rejects "type", but matches "τύπος".
305 " XXX: \C\<[^A-Z0-9]\k*\> rejects "Method", but matches "Μέθοδος".
306 syn region javaFuncDef start=/^\s\+\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)*\%(p\%(ublic\|rotected\|rivate\)\s\+\)\=\%(\%(abstract\|default\)\s\+\|\%(\%(final\|\%(native\|strictfp\)\|s\%(tatic\|ynchronized\)\)\s\+\)*\)\=\%(<.*[[:space:]-]\@1<!>\s\+\)\=\%(void\|\%(b\%(oolean\|yte\)\|char\|short\|int\|long\|float\|double\|\%(\<\K\k*\>\.\)*\<[^a-z0-9]\k*\>\%(<[^(){}]*[[:space:]-]\@1<!>\)\=\)\%(\[\]\)*\)\s\+\<[^A-Z0-9]\k*\>\s*(/ end=/)/ skip=/\/\*.\{-}\*\/\|\/\/.*$/ contains=@javaFuncParams
307 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000308 endif
Aliaksei Budavei40524742024-04-14 19:57:00 +0300309
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100310 syn match javaLambdaDef "\<\K\k*\>\%(\<default\>\)\@<!\s*->"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000311 syn match javaBraces "[{}]"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000312endif
313
314if exists("java_highlight_debug")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000315 " Strings and constants
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300316 syn match javaDebugSpecial contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000317 syn region javaDebugString contained start=+"+ end=+"+ contains=javaDebugSpecial
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300318 syn region javaDebugString contained start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaDebugSpecial,javaDebugTextBlockError
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300319 " The highlight groups of java{StrTempl,Debug{,Paren,StrTempl}}\,
320 " share one colour by default. Do not conflate unrelated parens.
321 syn region javaDebugStrTemplEmbExp contained matchgroup=javaDebugStrTempl start="\\{" end="}" contains=javaComment,javaLineComment,javaDebug\%(Paren\)\@!.*
322 syn region javaDebugStrTempl contained start=+\%(\.[[:space:]\n]*\)\@<="+ end=+"+ contains=javaDebugStrTemplEmbExp,javaDebugSpecial
323 syn region javaDebugStrTempl contained start=+\%(\.[[:space:]\n]*\)\@<="""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaDebugStrTemplEmbExp,javaDebugSpecial,javaDebugTextBlockError
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300324 syn match javaDebugTextBlockError contained +"""\s*"""+
Bram Moolenaar071d4272004-06-13 20:20:40 +0000325 syn match javaDebugCharacter contained "'[^\\]'"
326 syn match javaDebugSpecialCharacter contained "'\\.'"
327 syn match javaDebugSpecialCharacter contained "'\\''"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300328 syn keyword javaDebugNumber contained 0 0l 0L
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300329 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\."
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300330 syn match javaDebugNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
331 syn match javaDebugNumber contained "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
332 syn match javaDebugNumber contained "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
333 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
334 syn match javaDebugNumber contained "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000335 syn keyword javaDebugBoolean contained true false
336 syn keyword javaDebugType contained null this super
337 syn region javaDebugParen start=+(+ end=+)+ contained contains=javaDebug.*,javaDebugParen
338
Aliaksei Budavei40524742024-04-14 19:57:00 +0300339 " To make this work, define the highlighting for these groups.
340 syn match javaDebug "\<System\.\%(out\|err\)\.print\%(ln\)\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
341" FIXME: What API does "p" belong to?
342" syn match javaDebug "\<p\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
343 syn match javaDebug "\<\K\k*\.printStackTrace\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
344" FIXME: What API do "trace*" belong to?
345" syn match javaDebug "\<trace[SL]\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
Bram Moolenaar071d4272004-06-13 20:20:40 +0000346
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200347 hi def link javaDebug Debug
348 hi def link javaDebugString DebugString
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300349 hi def link javaDebugStrTempl Macro
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300350 hi def link javaDebugTextBlockError Error
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200351 hi def link javaDebugType DebugType
352 hi def link javaDebugBoolean DebugBoolean
353 hi def link javaDebugNumber Debug
354 hi def link javaDebugSpecial DebugSpecial
355 hi def link javaDebugSpecialCharacter DebugSpecial
356 hi def link javaDebugCharacter DebugString
357 hi def link javaDebugParen Debug
Bram Moolenaar071d4272004-06-13 20:20:40 +0000358
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200359 hi def link DebugString String
360 hi def link DebugSpecial Special
361 hi def link DebugBoolean Boolean
362 hi def link DebugType Type
Bram Moolenaar071d4272004-06-13 20:20:40 +0000363endif
364
365if exists("java_mark_braces_in_parens_as_errors")
366 syn match javaInParen contained "[{}]"
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200367 hi def link javaInParen javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000368endif
369
370" catch errors caused by wrong parenthesis
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100371syn region javaParenT transparent matchgroup=javaParen start="(" end=")" contains=@javaTop,javaParenT1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000372syn region javaParenT1 transparent matchgroup=javaParen1 start="(" end=")" contains=@javaTop,javaParenT2 contained
373syn region javaParenT2 transparent matchgroup=javaParen2 start="(" end=")" contains=@javaTop,javaParenT contained
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200374syn match javaParenError ")"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000375" catch errors caused by wrong square parenthesis
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100376syn region javaParenT transparent matchgroup=javaParen start="\[" end="\]" contains=@javaTop,javaParenT1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000377syn region javaParenT1 transparent matchgroup=javaParen1 start="\[" end="\]" contains=@javaTop,javaParenT2 contained
378syn region javaParenT2 transparent matchgroup=javaParen2 start="\[" end="\]" contains=@javaTop,javaParenT contained
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200379syn match javaParenError "\]"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000380
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200381hi def link javaParenError javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000382
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100383if exists("java_highlight_functions")
Aliaksei Budavei40524742024-04-14 19:57:00 +0300384 " Make ()-matching definitions after the parenthesis error catcher.
385 syn match javaLambdaDef "\k\@4<!(\%(\k\|[[:space:]<>?\[\]@,.]\)*)\s*->"
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100386endif
387
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300388" The @javaTop cluster comprises non-contained Java syntax groups.
389" Note that the syntax file "aidl.vim" relies on its availability.
390syn cluster javaTop contains=TOP,javaDocComment,javaFold,javaParenError,javaParenT
391
Bram Moolenaar071d4272004-06-13 20:20:40 +0000392if !exists("java_minlines")
393 let java_minlines = 10
394endif
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300395
396" Note that variations of a /*/ balanced comment, e.g., /*/*/, /*//*/,
397" /* /*/, /* /*/, etc., may have their rightmost /*/ part accepted
398" as a comment start by ':syntax sync ccomment'; consider alternatives
399" to make synchronisation start further towards file's beginning by
400" bumping up g:java_minlines or issuing ':syntax sync fromstart' or
401" preferring &foldmethod set to 'syntax'.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000402exec "syn sync ccomment javaComment minlines=" . java_minlines
403
404" The default highlighting.
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200405hi def link javaLambdaDef Function
406hi def link javaFuncDef Function
407hi def link javaVarArg Function
408hi def link javaBraces Function
409hi def link javaBranch Conditional
410hi def link javaUserLabelRef javaUserLabel
411hi def link javaLabel Label
412hi def link javaUserLabel Label
413hi def link javaConditional Conditional
414hi def link javaRepeat Repeat
415hi def link javaExceptions Exception
416hi def link javaAssert Statement
417hi def link javaStorageClass StorageClass
418hi def link javaMethodDecl javaStorageClass
419hi def link javaClassDecl javaStorageClass
420hi def link javaScopeDecl javaStorageClass
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100421hi def link javaConceptKind NonText
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200422
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200423hi def link javaBoolean Boolean
424hi def link javaSpecial Special
425hi def link javaSpecialError Error
426hi def link javaSpecialCharError Error
427hi def link javaString String
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300428hi def link javaStrTempl Macro
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200429hi def link javaCharacter Character
430hi def link javaSpecialChar SpecialChar
431hi def link javaNumber Number
432hi def link javaError Error
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300433hi def link javaTextBlockError Error
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200434hi def link javaStatement Statement
435hi def link javaOperator Operator
436hi def link javaComment Comment
437hi def link javaDocComment Comment
438hi def link javaLineComment Comment
439hi def link javaConstant Constant
440hi def link javaTypedef Typedef
441hi def link javaTodo Todo
442hi def link javaAnnotation PreProc
Bram Moolenaar071d4272004-06-13 20:20:40 +0000443
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200444hi def link javaCommentTitle SpecialComment
445hi def link javaDocTags Special
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300446hi def link javaDocCodeTag Special
447hi def link javaDocSnippetTag Special
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200448hi def link javaDocParam Function
449hi def link javaDocSeeTagParam Function
450hi def link javaCommentStar javaComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000451
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200452hi def link javaType Type
453hi def link javaExternal Include
Bram Moolenaar071d4272004-06-13 20:20:40 +0000454
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200455hi def link htmlComment Special
456hi def link htmlCommentPart Special
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300457hi def link htmlArg Type
458hi def link htmlString String
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200459hi def link javaSpaceError Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000460
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200461if s:module_info_cur_buf
462 hi def link javaModuleStorageClass StorageClass
463 hi def link javaModuleStmt Statement
464 hi def link javaModuleExternal Include
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200465endif
466
Bram Moolenaar071d4272004-06-13 20:20:40 +0000467let b:current_syntax = "java"
468
469if main_syntax == 'java'
470 unlet main_syntax
471endif
472
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200473let b:spell_options = "contained"
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +0200474let &cpo = s:cpo_save
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200475unlet s:selectable_regexp_engine s:module_info_cur_buf s:cpo_save
Bram Moolenaar071d4272004-06-13 20:20:40 +0000476
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300477" vim: sw=2 ts=8 noet sta