blob: a63ae0216a56fafc0cf376b6951d29c5970637cb [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 Budavei3749dff2024-07-31 22:13:25 +02006" Last Change: 2024 Jul 30
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'
17endif
18
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +020019let s:cpo_save = &cpo
20set cpo&vim
21
Aliaksei Budaveid3952e82024-05-11 00:39:31 +030022"""" STRIVE TO REMAIN COMPATIBLE FOR AT LEAST VIM 7.0.
23let s:ff = {}
24
25function! s:ff.LeftConstant(x, y) abort
26 return a:x
27endfunction
28
29function! s:ff.RightConstant(x, y) abort
30 return a:y
31endfunction
32
33if !exists("*s:ReportOnce")
34 function s:ReportOnce(message) abort
35 echomsg 'syntax/java.vim: ' . a:message
36 endfunction
37else
38 function! s:ReportOnce(dummy)
39 endfunction
40endif
41
Aliaksei Budavei371bab02024-06-16 09:42:55 +030042function! JavaSyntaxFoldTextExpr() abort
43 return getline(v:foldstart) !~ '/\*\+\s*$'
44 \ ? foldtext()
45 \ : printf('+-%s%3d lines: ',
46 \ v:folddashes,
47 \ (v:foldend - v:foldstart + 1)) .
48 \ getline(v:foldstart + 1)
49endfunction
50
51" E120 for "fdt=s:JavaSyntaxFoldTextExpr()" before v8.2.3900.
52setlocal foldtext=JavaSyntaxFoldTextExpr()
53
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020054" Admit the ASCII dollar sign to keyword characters (JLS-17, §3.8):
Aliaksei Budaveid3952e82024-05-11 00:39:31 +030055try
56 exec 'syntax iskeyword ' . &l:iskeyword . ',$'
57catch /\<E410:/
58 call s:ReportOnce(v:exception)
59 setlocal iskeyword+=$
60endtry
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020061
Bram Moolenaar071d4272004-06-13 20:20:40 +000062" some characters that cannot be in a java program (outside a string)
63syn match javaError "[\\@`]"
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +010064syn match javaError "<<<\|\.\.\|=>\|||=\|&&=\|\*\/"
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +020065
Bram Moolenaar071d4272004-06-13 20:20:40 +000066" use separate name so that it can be deleted in javacc.vim
67syn match javaError2 "#\|=<"
Bram Moolenaarf37506f2016-08-31 22:22:10 +020068hi def link javaError2 javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +000069
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020070" Keywords (JLS-17, §3.9):
Bram Moolenaar071d4272004-06-13 20:20:40 +000071syn keyword javaExternal native package
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020072syn match javaExternal "\<import\>\%(\s\+static\>\)\="
Bram Moolenaar071d4272004-06-13 20:20:40 +000073syn keyword javaError goto const
74syn keyword javaConditional if else switch
75syn keyword javaRepeat while for do
76syn keyword javaBoolean true false
77syn keyword javaConstant null
78syn keyword javaTypedef this super
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020079syn keyword javaOperator new instanceof
80syn match javaOperator "\<var\>\%(\s*(\)\@!"
Aliaksei Budaveid3952e82024-05-11 00:39:31 +030081
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +010082" Since the yield statement, which could take a parenthesised operand,
83" and _qualified_ yield methods get along within the switch block
84" (JLS-17, §3.8), it seems futile to make a region definition for this
85" block; instead look for the _yield_ word alone, and if found,
86" backtrack (arbitrarily) 80 bytes, at most, on the matched line and,
87" if necessary, on the line before that (h: \@<=), trying to match
88" neither a method reference nor a qualified method invocation.
Aliaksei Budaveid3952e82024-05-11 00:39:31 +030089try
90 syn match javaOperator "\%(\%(::\|\.\)[[:space:]\n]*\)\@80<!\<yield\>"
91 let s:ff.Peek = s:ff.LeftConstant
92catch /\<E59:/
93 call s:ReportOnce(v:exception)
94 syn match javaOperator "\%(\%(::\|\.\)[[:space:]\n]*\)\@<!\<yield\>"
95 let s:ff.Peek = s:ff.RightConstant
96endtry
97
Bram Moolenaar071d4272004-06-13 20:20:40 +000098syn keyword javaType boolean char byte short int long float double
99syn keyword javaType void
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100100syn keyword javaStatement return
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200101syn keyword javaStorageClass static synchronized transient volatile strictfp serializable
Bram Moolenaar071d4272004-06-13 20:20:40 +0000102syn keyword javaExceptions throw try catch finally
103syn keyword javaAssert assert
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200104syn keyword javaMethodDecl throws
105" Differentiate a "MyClass.class" literal from the keyword "class".
Bram Moolenaar071d4272004-06-13 20:20:40 +0000106syn match javaTypedef "\.\s*\<class\>"ms=s+1
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200107syn keyword javaClassDecl enum extends implements interface
108syn match javaClassDecl "\<permits\>\%(\s*(\)\@!"
109syn match javaClassDecl "\<record\>\%(\s*(\)\@!"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000110syn match javaClassDecl "^class\>"
111syn match javaClassDecl "[^.]\s*\<class\>"ms=s+1
Aliaksei Budavei40524742024-04-14 19:57:00 +0300112syn match javaAnnotation "@\%(\K\k*\.\)*\K\k*\>"
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300113syn region javaAnnotation transparent matchgroup=javaAnnotationStart start=/@\%(\K\k*\.\)*\K\k*(/ end=/)/ skip=/\/\*.\{-}\*\/\|\/\/.*$/ contains=javaAnnotation,javaParenT,javaBlock,javaString,javaBoolean,javaNumber,javaTypedef,javaComment,javaLineComment
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200114syn match javaClassDecl "@interface\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000115syn keyword javaBranch break continue nextgroup=javaUserLabelRef skipwhite
116syn match javaUserLabelRef "\k\+" contained
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000117syn match javaVarArg "\.\.\."
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200118syn keyword javaScopeDecl public protected private
119syn keyword javaConceptKind abstract final
120syn match javaConceptKind "\<non-sealed\>"
121syn match javaConceptKind "\<sealed\>\%(\s*(\)\@!"
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100122syn match javaConceptKind "\<default\>\%(\s*\%(:\|->\)\)\@!"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000123
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200124" Note that a "module-info" file will be recognised with an arbitrary
125" file extension (or no extension at all) so that more than one such
126" declaration for the same Java module can be maintained for modular
127" testing in a project without attendant confusion for IDEs, with the
128" ".java\=" extension used for a production version and an arbitrary
129" extension used for a testing version.
130let s:module_info_cur_buf = fnamemodify(bufname("%"), ":t") =~ '^module-info\%(\.class\>\)\@!'
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300131lockvar s:module_info_cur_buf
132
133if !(v:version < 704)
134 " Request the new regexp engine for [:upper:] and [:lower:].
135 let [s:ff.Engine, s:ff.UpperCase, s:ff.LowerCase] = repeat([s:ff.LeftConstant], 3)
136else
137 " XXX: \C\<[^a-z0-9]\k*\> rejects "type", but matches "τύπος".
138 " XXX: \C\<[^A-Z0-9]\k*\> rejects "Method", but matches "Μέθοδος".
139 let [s:ff.Engine, s:ff.UpperCase, s:ff.LowerCase] = repeat([s:ff.RightConstant], 3)
140endif
Bram Moolenaar63f32602022-06-09 20:45:54 +0100141
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200142if exists("java_highlight_signature")
143 let [s:ff.PeekTo, s:ff.PeekFrom, s:ff.GroupArgs] = repeat([s:ff.LeftConstant], 3)
144else
145 let [s:ff.PeekTo, s:ff.PeekFrom, s:ff.GroupArgs] = repeat([s:ff.RightConstant], 3)
146endif
147
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200148" Java modules (since Java 9, for "module-info.java" file).
149if s:module_info_cur_buf
150 syn keyword javaModuleStorageClass module transitive
151 syn keyword javaModuleStmt open requires exports opens uses provides
152 syn keyword javaModuleExternal to with
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200153endif
154
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200155" Fancy parameterised types (JLS-17, §4.5).
156"
157" Note that false positives may elsewhere occur whenever an identifier
158" is butted against a less-than operator. Cf. (X<Y) and (X < Y).
159if exists("java_highlight_generics")
160 syn keyword javaWildcardBound contained extends super
161
162 " Parameterised types are delegated to javaGenerics (s:ctx.gsg) and
163 " are not matched with javaTypeArgument.
164 exec 'syn match javaTypeArgument contained "' . s:ff.Engine('\%#=2', '') . '?\|\%(\<\%(b\%(oolean\|yte\)\|char\|short\|int\|long\|float\|double\)\[\]\|\%(\<\K\k*\>\.\)*\<' . s:ff.UpperCase('[$_[:upper:]]', '[^a-z0-9]') . '\k*\>\)\%(\[\]\)*"'
165
166 for s:ctx in [{'dsg': 'javaDimExpr', 'gsg': 'javaGenerics', 'ghg': 'javaGenericsC1', 'csg': 'javaGenericsX', 'c': ''},
167 \ {'dsg': 'javaDimExprX', 'gsg': 'javaGenericsX', 'ghg': 'javaGenericsC2', 'csg': 'javaGenerics', 'c': ' contained'}]
168 " Consider array creation expressions of reifiable types.
169 exec 'syn region ' . s:ctx.dsg . ' contained transparent matchgroup=' . s:ctx.ghg . ' start="\[" end="\]" nextgroup=' . s:ctx.dsg . ' skipwhite skipnl'
170 exec 'syn region ' . s:ctx.gsg . s:ctx.c . ' transparent matchgroup=' . s:ctx.ghg . ' start=/' . s:ff.Engine('\%#=2', '') . '\%(\<\K\k*\>\.\)*\<' . s:ff.UpperCase('[$_[:upper:]]', '[^a-z0-9]') . '\k*\><\%([[:space:]\n]*\%([?@]\|\<\%(b\%(oolean\|yte\)\|char\|short\|int\|long\|float\|double\)\[\]\|\%(\<\K\k*\>\.\)*\<' . s:ff.UpperCase('[$_[:upper:]]', '[^a-z0-9]') . '\k*\>\)\)\@=/ end=/>/ contains=' . s:ctx.csg . ',javaAnnotation,javaTypeArgument,javaWildcardBound,javaType,@javaClasses nextgroup=' . s:ctx.dsg . ' skipwhite skipnl'
171 endfor
172
173 unlet s:ctx
174 hi def link javaWildcardBound Question
175 hi def link javaGenericsC1 javaFuncDef
176 hi def link javaGenericsC2 javaType
177endif
178
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000179if exists("java_highlight_java_lang_ids")
180 let java_highlight_all=1
181endif
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200182if exists("java_highlight_all") || exists("java_highlight_java") || exists("java_highlight_java_lang")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000183 " java.lang.*
Bram Moolenaar63f32602022-06-09 20:45:54 +0100184 "
185 " The keywords of javaR_JavaLang, javaC_JavaLang, javaE_JavaLang,
186 " and javaX_JavaLang are sub-grouped according to the Java version
187 " of their introduction, and sub-group keywords (that is, class
188 " names) are arranged in alphabetical order, so that future newer
189 " keywords can be pre-sorted and appended without disturbing
190 " the current keyword placement. The below _match_es follow suit.
191
Aliaksei Budavei63d68c22024-03-26 20:12:05 +0300192 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 +0000193 syn cluster javaClasses add=javaR_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200194 hi def link javaR_JavaLang javaR_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100195 " Member enumerations:
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300196 exec 'syn match javaC_JavaLang "\%(\<Thread\.\)\@' . s:ff.Peek('7', '') . '<=\<State\>"'
197 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<UnicodeScript\>"'
198 exec 'syn match javaC_JavaLang "\%(\<ProcessBuilder\.Redirect\.\)\@' . s:ff.Peek('24', '') . '<=\<Type\>"'
199 exec 'syn match javaC_JavaLang "\%(\<StackWalker\.\)\@' . s:ff.Peek('12', '') . '<=\<Option\>"'
200 exec 'syn match javaC_JavaLang "\%(\<System\.Logger\.\)\@' . s:ff.Peek('14', '') . '<=\<Level\>"'
Bram Moolenaar63f32602022-06-09 20:45:54 +0100201 " Member classes:
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300202 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<Subset\>"'
203 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<UnicodeBlock\>"'
204 exec 'syn match javaC_JavaLang "\%(\<ProcessBuilder\.\)\@' . s:ff.Peek('15', '') . '<=\<Redirect\>"'
205 exec 'syn match javaC_JavaLang "\%(\<ModuleLayer\.\)\@' . s:ff.Peek('12', '') . '<=\<Controller\>"'
206 exec 'syn match javaC_JavaLang "\%(\<Runtime\.\)\@' . s:ff.Peek('8', '') . '<=\<Version\>"'
207 exec 'syn match javaC_JavaLang "\%(\<System\.\)\@' . s:ff.Peek('7', '') . '<=\<LoggerFinder\>"'
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200208 syn keyword javaC_JavaLang Boolean Character ClassLoader Compiler Double Float Integer Long Math Number Object Process Runtime SecurityManager String StringBuffer Thread ThreadGroup Byte Short Void Package RuntimePermission StrictMath StackTraceElement ProcessBuilder StringBuilder Module ModuleLayer StackWalker Record
Bram Moolenaar63f32602022-06-09 20:45:54 +0100209 syn match javaC_JavaLang "\<System\>" " See javaDebug.
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200210
211 if !exists("java_highlight_generics")
212 " The non-interface parameterised names of java.lang members.
213 exec 'syn match javaC_JavaLang "\%(\<Enum\.\)\@' . s:ff.Peek('5', '') . '<=\<EnumDesc\>"'
214 syn keyword javaC_JavaLang Class InheritableThreadLocal ThreadLocal Enum ClassValue
215 endif
216
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200217 " As of JDK 21, java.lang.Compiler is no more (deprecated in JDK 9).
Aliaksei Budavei63d68c22024-03-26 20:12:05 +0300218 syn keyword javaLangDeprecated Compiler
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000219 syn cluster javaClasses add=javaC_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200220 hi def link javaC_JavaLang javaC_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100221 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 +0000222 syn cluster javaClasses add=javaE_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200223 hi def link javaE_JavaLang javaE_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100224 syn keyword javaX_JavaLang ClassNotFoundException CloneNotSupportedException Exception IllegalAccessException InstantiationException InterruptedException NoSuchMethodException Throwable NoSuchFieldException ReflectiveOperationException
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000225 syn cluster javaClasses add=javaX_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200226 hi def link javaX_JavaLang javaX_Java
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000227
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200228 hi def link javaR_Java javaR_
229 hi def link javaC_Java javaC_
230 hi def link javaE_Java javaE_
231 hi def link javaX_Java javaX_
232 hi def link javaX_ javaExceptions
233 hi def link javaR_ javaExceptions
234 hi def link javaE_ javaExceptions
235 hi def link javaC_ javaConstant
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000236
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200237 syn keyword javaLangObject getClass notify notifyAll wait
238
239 " Lower the syntax priority of overridable java.lang.Object method
240 " names for zero-width matching (define g:java_highlight_signature
241 " and see their base declarations for java.lang.Object):
242 syn match javaLangObject "\<clone\>"
243 syn match javaLangObject "\<equals\>"
244 syn match javaLangObject "\<finalize\>"
245 syn match javaLangObject "\<hashCode\>"
246 syn match javaLangObject "\<toString\>"
247 hi def link javaLangObject javaConstant
Bram Moolenaar071d4272004-06-13 20:20:40 +0000248endif
249
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300250if filereadable(expand("<sfile>:p:h") . "/javaid.vim")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000251 source <sfile>:p:h/javaid.vim
252endif
253
254if exists("java_space_errors")
255 if !exists("java_no_trail_space_error")
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200256 syn match javaSpaceError "\s\+$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000257 endif
258 if !exists("java_no_tab_space_error")
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200259 syn match javaSpaceError " \+\t"me=e-1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000260 endif
261endif
262
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200263exec 'syn match javaUserLabel "^\s*\<\K\k*\>\%(\<default\>\)\@' . s:ff.Peek('7', '') . '<!\s*::\@!"he=e-1'
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200264syn region javaLabelRegion transparent matchgroup=javaLabel start="\<case\>" matchgroup=NONE end=":\|->" contains=javaLabelCastType,javaLabelNumber,javaCharacter,javaString,javaConstant,@javaClasses,javaGenerics,javaLabelDefault,javaLabelVarType,javaLabelWhenClause
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100265syn region javaLabelRegion transparent matchgroup=javaLabel start="\<default\>\%(\s*\%(:\|->\)\)\@=" matchgroup=NONE end=":\|->" oneline
266" Consider grouped _default_ _case_ labels, i.e.
267" case null, default ->
268" case null: default:
269syn keyword javaLabelDefault contained default
270syn keyword javaLabelVarType contained var
271syn keyword javaLabelCastType contained char byte short int
272" Allow for the contingency of the enclosing region not being able to
273" _keep_ its _end_, e.g. case ':':.
Aliaksei Budaveid6b4afb2024-06-09 19:39:52 +0300274syn region javaLabelWhenClause contained transparent matchgroup=javaLabel start="\<when\>" matchgroup=NONE end=":"me=e-1 end="->"me=e-2 contains=TOP,javaExternal,javaLambdaDef
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100275syn match javaLabelNumber contained "\<0\>[lL]\@!"
276syn match javaLabelNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)\>[lL]\@!"
277hi def link javaLabelDefault javaLabel
278hi def link javaLabelVarType javaOperator
279hi def link javaLabelNumber javaNumber
280hi def link javaLabelCastType javaType
Bram Moolenaar071d4272004-06-13 20:20:40 +0000281
Bram Moolenaar071d4272004-06-13 20:20:40 +0000282" Comments
283syn keyword javaTodo contained TODO FIXME XXX
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300284
Bram Moolenaar071d4272004-06-13 20:20:40 +0000285if exists("java_comment_strings")
286 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 +0300287 syn region javaCommentString contained start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell,javaSpecialError,javaTextBlockError
288 syn region javaComment2String contained start=+"+ end=+$\|"+ contains=javaSpecial,javaSpecialChar,@Spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000289 syn match javaCommentCharacter contained "'\\[^']\{1,6\}'" contains=javaSpecialChar
290 syn match javaCommentCharacter contained "'\\''" contains=javaSpecialChar
291 syn match javaCommentCharacter contained "'[^\\]'"
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300292 syn cluster javaCommentSpecial add=javaCommentString,javaCommentCharacter,javaNumber,javaStrTempl
293 syn cluster javaCommentSpecial2 add=javaComment2String,javaCommentCharacter,javaNumber,javaStrTempl
Bram Moolenaar071d4272004-06-13 20:20:40 +0000294endif
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300295
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300296syn region javaComment matchgroup=javaCommentStart start="/\*" end="\*/" contains=@javaCommentSpecial,javaTodo,javaCommentError,javaSpaceError,@Spell fold
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200297syn match javaCommentStar contained "^\s*\*[^/]"me=e-1
298syn match javaCommentStar contained "^\s*\*$"
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300299syn match javaLineComment "//.*" contains=@javaCommentSpecial2,javaTodo,javaCommentMarkupTag,javaSpaceError,@Spell
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300300syn match javaCommentMarkupTag contained "@\%(end\|highlight\|link\|replace\|start\)\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
301syn match javaCommentMarkupTagAttr contained "\<region\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300302exec 'syn region javaCommentMarkupTagAttr contained transparent matchgroup=htmlArg start=/\<\%(re\%(gex\|gion\|placement\)\|substring\|t\%(arget\|ype\)\)\%(\s*=\)\@=/ matchgroup=htmlString end=/\%(=\s*\)\@' . s:ff.Peek('80', '') . '<=\%("[^"]\+"\|' . "\x27[^\x27]\\+\x27" . '\|\%([.-]\|\k\)\+\)/ nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite oneline'
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300303hi def link javaCommentMarkupTagAttr htmlArg
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200304hi def link javaCommentString javaString
305hi def link javaComment2String javaString
306hi def link javaCommentCharacter javaCharacter
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300307syn match javaCommentError contained "/\*"me=e-1 display
308hi def link javaCommentError javaError
309hi def link javaCommentStart javaComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000310
Bram Moolenaar071d4272004-06-13 20:20:40 +0000311if !exists("java_ignore_javadoc") && main_syntax != 'jsp'
Aliaksei Budavei3749dff2024-07-31 22:13:25 +0200312 " The overridable "html*" default links must be defined _before_ the
313 " inclusion of the same default links from "html.vim".
314 hi def link htmlComment Special
315 hi def link htmlCommentPart Special
316 hi def link htmlArg Type
317 hi def link htmlString String
Bram Moolenaar071d4272004-06-13 20:20:40 +0000318 syntax case ignore
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300319
320 " Include HTML syntax coloring for Javadoc comments.
Bram Moolenaar63f32602022-06-09 20:45:54 +0100321 syntax include @javaHtml syntax/html.vim
Bram Moolenaar071d4272004-06-13 20:20:40 +0000322 unlet b:current_syntax
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300323
324 " HTML enables spell checking for all text that is not in a syntax
325 " item (:syntax spell toplevel); instead, limit spell checking to
326 " items matchable with syntax groups containing the @Spell cluster.
327 try
328 syntax spell default
329 catch /\<E390:/
330 call s:ReportOnce(v:exception)
331 endtry
Bram Moolenaar5c736222010-01-06 20:54:52 +0100332
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300333 syn region javaDocComment start="/\*\*" end="\*/" keepend contains=javaCommentTitle,@javaHtml,javaDocTags,javaDocSeeTag,javaDocCodeTag,javaDocSnippetTag,javaTodo,javaCommentError,javaSpaceError,@Spell fold
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300334 exec 'syn region javaCommentTitle contained matchgroup=javaDocComment start="/\*\*" matchgroup=javaCommentTitle end="\.$" end="\.[ \t\r]\@=" end="\%(^\s*\**\s*\)\@' . s:ff.Peek('80', '') . '<=@"me=s-2,he=s-1 end="\*/"me=s-1,he=s-1 contains=@javaHtml,javaCommentStar,javaTodo,javaCommentError,javaSpaceError,@Spell,javaDocTags,javaDocSeeTag,javaDocCodeTag,javaDocSnippetTag'
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300335 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 +0300336 syn region javaDocTags contained start="{@\%(li\%(teral\|nk\%(plain\)\=\)\|inherit[Dd]oc\|doc[rR]oot\|value\)\>" end="}"
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300337 syn match javaDocTags contained "@\%(param\|exception\|throws\|since\)\s\+\S\+" contains=javaDocParam
338 syn match javaDocParam contained "\s\S\+"
339 syn match javaDocTags contained "@\%(version\|author\|return\|deprecated\|serial\%(Field\|Data\)\=\)\>"
340 syn region javaDocSeeTag contained matchgroup=javaDocTags start="@see\s\+" matchgroup=NONE end="\_."re=e-1 contains=javaDocSeeTagParam
341 syn match javaDocSeeTagParam contained @"\_[^"]\+"\|<a\s\+\_.\{-}</a>\|\%(\k\|\.\)*\%(#\k\+\%((\_[^)]*)\)\=\)\=@ contains=@javaHtml extend
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300342 syn region javaCodeSkipBlock contained transparent start="{\%(@code\>\)\@!" end="}" contains=javaCodeSkipBlock,javaDocCodeTag
343 syn region javaDocCodeTag contained start="{@code\>" end="}" contains=javaDocCodeTag,javaCodeSkipBlock
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300344 exec 'syn region javaDocSnippetTagAttr contained transparent matchgroup=htmlArg start=/\<\%(class\|file\|id\|lang\|region\)\%(\s*=\)\@=/ matchgroup=htmlString end=/:$/ end=/\%(=\s*\)\@' . s:ff.Peek('80', '') . '<=\%("[^"]\+"\|' . "\x27[^\x27]\\+\x27" . '\|\%([.\\/-]\|\k\)\+\)/ nextgroup=javaDocSnippetTagAttr skipwhite skipnl'
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300345 syn region javaSnippetSkipBlock contained transparent start="{\%(@snippet\>\)\@!" end="}" contains=javaSnippetSkipBlock,javaDocSnippetTag,javaCommentMarkupTag
346 syn region javaDocSnippetTag contained start="{@snippet\>" end="}" contains=javaDocSnippetTag,javaSnippetSkipBlock,javaDocSnippetTagAttr,javaCommentMarkupTag
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300347
Bram Moolenaar071d4272004-06-13 20:20:40 +0000348 syntax case match
349endif
350
351" match the special comment /**/
352syn match javaComment "/\*\*/"
353
354" Strings and constants
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200355syn match javaSpecialError contained "\\."
Bram Moolenaar071d4272004-06-13 20:20:40 +0000356syn match javaSpecialCharError contained "[^']"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300357" Escape Sequences (JLS-17, §3.10.7):
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300358syn match javaSpecialChar contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000359syn region javaString start=+"+ end=+"+ end=+$+ contains=javaSpecialChar,javaSpecialError,@Spell
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300360syn region javaString start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecialChar,javaSpecialError,javaTextBlockError,@Spell
361syn match javaTextBlockError +"""\s*"""+
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300362syn region javaStrTemplEmbExp contained matchgroup=javaStrTempl start="\\{" end="}" contains=TOP
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300363exec 'syn region javaStrTempl start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,@Spell'
364exec 'syn region javaStrTempl start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,javaTextBlockError,@Spell'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000365syn match javaCharacter "'[^']*'" contains=javaSpecialChar,javaSpecialCharError
366syn match javaCharacter "'\\''" contains=javaSpecialChar
367syn match javaCharacter "'[^\\]'"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300368" Integer literals (JLS-17, §3.10.1):
369syn keyword javaNumber 0 0l 0L
370syn match javaNumber "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
371" Decimal floating-point literals (JLS-17, §3.10.2):
372" Against "\<\d\+\>\.":
373syn match javaNumber "\<\d\%(_*\d\)*\."
374syn match javaNumber "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
375syn match javaNumber "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
376syn match javaNumber "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
377" Hexadecimal floating-point literals (JLS-17, §3.10.2):
378syn match javaNumber "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000379
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300380" Unicode characters
381syn match javaSpecial "\\u\x\x\x\x"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000382
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200383" Method declarations (JLS-17, §8.4.3, §8.4.4, §9.4).
Bram Moolenaar071d4272004-06-13 20:20:40 +0000384if exists("java_highlight_functions")
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200385 syn cluster javaFuncParams contains=javaAnnotation,@javaClasses,javaGenerics,javaType,javaVarArg,javaComment,javaLineComment
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200386
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200387 if exists("java_highlight_signature")
388 syn keyword javaParamModifier contained final
389 syn cluster javaFuncParams add=javaParamModifier
390 hi def link javaParamModifier javaConceptKind
391 hi def link javaFuncDefStart javaFuncDef
392 else
393 syn cluster javaFuncParams add=javaScopeDecl,javaConceptKind,javaStorageClass,javaExternal
394 endif
395
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300396 if java_highlight_functions =~# '^indent[1-8]\=$'
397 let s:last = java_highlight_functions[-1 :]
398 let s:indent = s:last != 't' ? repeat("\x20", s:last) : "\t"
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300399 " Try to not match other type members, initialiser blocks, enum
400 " constants (JLS-17, §8.9.1), and constructors (JLS-17, §8.1.7):
401 " at any _conventional_ indentation, skip over all fields with
402 " "[^=]*", all records with "\<record\s", and let the "*Skip*"
403 " definitions take care of constructor declarations and enum
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200404 " constants (with no support for @Foo(value = "bar")). Also,
405 " reject inlined declarations with "[^{]" for signature.
406 exec 'syn region javaFuncDef ' . s:ff.GroupArgs('transparent matchgroup=javaFuncDefStart', '') . ' start=/' . s:ff.PeekTo('\%(', '') . '^' . s:indent . '\%(<[^>]\+>\+\s\+\|\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)\+\)\=\%(\<\K\k*\>\.\)*\K\k*\>[^={]*\%(\<record\)\@' . s:ff.Peek('6', '') . '<!\s' . s:ff.PeekFrom('\)\@' . s:ff.Peek('80', '') . '<=', '') . '\K\k*\s*(/ end=/)/ contains=@javaFuncParams'
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300407 " As long as package-private constructors cannot be matched with
408 " javaFuncDef, do not look with javaConstructorSkipDeclarator for
409 " them.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200410 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,javaClassDecl,javaTypedef,javaGenerics'
411 " With a zero-width span for signature applicable on demand to
412 " javaFuncDef, make related adjustments:
413 " (1) Claim all enum constants of a line as a unit.
414 exec 'syn match javaEnumSkipConstant contained transparent /^' . s:indent . '\%(\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)*\K\k*\s*\%((.*)\)\=\s*[,;({]\s*\)\+/ contains=@javaEnumConstants'
415 " (2) Define a syntax group for top level enumerations and tell
416 " apart their constants from method declarations.
417 exec 'syn region javaTopEnumDeclaration transparent start=/\%(^\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)*\%(p\%(ublic\|rotected\|rivate\)\s\+\)\=\%(strictfp\s\+\)\=\<enum\_s\+\)\@' . s:ff.Peek('80', '') . '<=\K\k*\%(\_s\+implements\_s.\+\)\=\_s*{/ end=/}/ contains=@javaTop,javaEnumSkipConstant'
418 " (3) Define a base variant of javaParenT without using @javaTop
419 " in order to not include javaFuncDef.
420 syn region javaParenE transparent matchgroup=javaParen start="(" end=")" contains=@javaEnumConstants,javaInParen
421 syn region javaParenE transparent matchgroup=javaParen start="\[" end="\]" contains=@javaEnumConstants
422 syn cluster javaEnumConstants contains=TOP,javaTopEnumDeclaration,javaFuncDef,javaParenT
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300423 unlet s:indent s:last
Bram Moolenaar071d4272004-06-13 20:20:40 +0000424 else
Aliaksei Budavei40524742024-04-14 19:57:00 +0300425 " This is the "style" variant (:help ft-java-syntax).
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200426
427 " Match arbitrarily indented camelCasedName method declarations.
428 " Match: [@ɐ] [abstract] [<α, β>] Τʬ[<γ>][[][]] μʭʭ(/* ... */);
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200429 exec 'syn region javaFuncDef ' . s:ff.GroupArgs('transparent matchgroup=javaFuncDefStart', '') . ' start=/' . s:ff.Engine('\%#=2', '') . s:ff.PeekTo('\%(', '') . '^\s\+\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)*\%(p\%(ublic\|rotected\|rivate\)\s\+\)\=\%(\%(abstract\|default\)\s\+\|\%(\%(final\|\%(native\|strictfp\)\|s\%(tatic\|ynchronized\)\)\s\+\)*\)\=\%(<.*[[:space:]-]\@' . s:ff.Peek('1', '') . '<!>\s\+\)\=\%(void\|\%(b\%(oolean\|yte\)\|char\|short\|int\|long\|float\|double\|\%(\<\K\k*\>\.\)*\<' . s:ff.UpperCase('[$_[:upper:]]', '[^a-z0-9]') . '\k*\>\%(<[^(){}]*[[:space:]-]\@' . s:ff.Peek('1', '') . '<!>\)\=\)\%(\[\]\)*\)\s\+' . s:ff.PeekFrom('\)\@' . s:ff.Peek('80', '') . '<=', '') . '\<' . s:ff.LowerCase('[$_[:lower:]]', '[^A-Z0-9]') . '\k*\>\s*(/ end=/)/ skip=/\/\*.\{-}\*\/\|\/\/.*$/ contains=@javaFuncParams'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000430 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000431endif
432
433if exists("java_highlight_debug")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000434 " Strings and constants
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300435 syn match javaDebugSpecial contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000436 syn region javaDebugString contained start=+"+ end=+"+ contains=javaDebugSpecial
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300437 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 +0300438 " The highlight groups of java{StrTempl,Debug{,Paren,StrTempl}}\,
439 " share one colour by default. Do not conflate unrelated parens.
440 syn region javaDebugStrTemplEmbExp contained matchgroup=javaDebugStrTempl start="\\{" end="}" contains=javaComment,javaLineComment,javaDebug\%(Paren\)\@!.*
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300441 exec 'syn region javaDebugStrTempl contained start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ contains=javaDebugStrTemplEmbExp,javaDebugSpecial'
442 exec 'syn region javaDebugStrTempl contained start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaDebugStrTemplEmbExp,javaDebugSpecial,javaDebugTextBlockError'
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300443 syn match javaDebugTextBlockError contained +"""\s*"""+
Bram Moolenaar071d4272004-06-13 20:20:40 +0000444 syn match javaDebugCharacter contained "'[^\\]'"
445 syn match javaDebugSpecialCharacter contained "'\\.'"
446 syn match javaDebugSpecialCharacter contained "'\\''"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300447 syn keyword javaDebugNumber contained 0 0l 0L
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300448 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\."
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300449 syn match javaDebugNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
450 syn match javaDebugNumber contained "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
451 syn match javaDebugNumber contained "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
452 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
453 syn match javaDebugNumber contained "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000454 syn keyword javaDebugBoolean contained true false
455 syn keyword javaDebugType contained null this super
456 syn region javaDebugParen start=+(+ end=+)+ contained contains=javaDebug.*,javaDebugParen
457
Aliaksei Budavei40524742024-04-14 19:57:00 +0300458 " To make this work, define the highlighting for these groups.
459 syn match javaDebug "\<System\.\%(out\|err\)\.print\%(ln\)\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
460" FIXME: What API does "p" belong to?
461" syn match javaDebug "\<p\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
462 syn match javaDebug "\<\K\k*\.printStackTrace\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
463" FIXME: What API do "trace*" belong to?
464" syn match javaDebug "\<trace[SL]\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
Bram Moolenaar071d4272004-06-13 20:20:40 +0000465
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200466 hi def link javaDebug Debug
467 hi def link javaDebugString DebugString
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300468 hi def link javaDebugStrTempl Macro
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300469 hi def link javaDebugTextBlockError Error
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200470 hi def link javaDebugType DebugType
471 hi def link javaDebugBoolean DebugBoolean
472 hi def link javaDebugNumber Debug
473 hi def link javaDebugSpecial DebugSpecial
474 hi def link javaDebugSpecialCharacter DebugSpecial
475 hi def link javaDebugCharacter DebugString
476 hi def link javaDebugParen Debug
Bram Moolenaar071d4272004-06-13 20:20:40 +0000477
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200478 hi def link DebugString String
479 hi def link DebugSpecial Special
480 hi def link DebugBoolean Boolean
481 hi def link DebugType Type
Bram Moolenaar071d4272004-06-13 20:20:40 +0000482endif
483
Aliaksei Budavei94c5d8a2024-06-19 20:10:47 +0200484" Try not to fold top-level-type bodies under assumption that there is
485" but one such body.
486exec 'syn region javaBlock transparent start="\%(^\|^\S[^:]\+\)\@' . s:ff.Peek('120', '') . '<!{" end="}" fold'
487
Bram Moolenaar071d4272004-06-13 20:20:40 +0000488if exists("java_mark_braces_in_parens_as_errors")
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300489 syn match javaInParen contained "[{}]"
490 hi def link javaInParen javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000491endif
492
493" catch errors caused by wrong parenthesis
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300494syn region javaParenT transparent matchgroup=javaParen start="(" end=")" contains=@javaTop,javaInParen,javaParenT1
495syn region javaParenT1 transparent matchgroup=javaParen1 start="(" end=")" contains=@javaTop,javaInParen,javaParenT2 contained
496syn region javaParenT2 transparent matchgroup=javaParen2 start="(" end=")" contains=@javaTop,javaInParen,javaParenT contained
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200497syn match javaParenError ")"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000498" catch errors caused by wrong square parenthesis
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100499syn region javaParenT transparent matchgroup=javaParen start="\[" end="\]" contains=@javaTop,javaParenT1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000500syn region javaParenT1 transparent matchgroup=javaParen1 start="\[" end="\]" contains=@javaTop,javaParenT2 contained
501syn region javaParenT2 transparent matchgroup=javaParen2 start="\[" end="\]" contains=@javaTop,javaParenT contained
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200502syn match javaParenError "\]"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000503
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200504hi def link javaParenError javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000505
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200506" Lambda expressions (JLS-17, §15.27) and method references (JLS-17,
507" §15.13).
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100508if exists("java_highlight_functions")
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200509 syn match javaMethodRef ":::\@!"
510 hi def link javaMethodRef javaFuncDef
511
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200512 if exists("java_highlight_signature")
513 let s:ff.LambdaDef = s:ff.LeftConstant
514 else
515 let s:ff.LambdaDef = s:ff.RightConstant
516 endif
517
Aliaksei Budavei40524742024-04-14 19:57:00 +0300518 " Make ()-matching definitions after the parenthesis error catcher.
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300519 "
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200520 " Note that here and elsewhere a single-line token is used for \z,
521 " with other tokens repeated as necessary, to overcome the lack of
522 " support for multi-line matching with \z.
523 "
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300524 " Match: ([@A [@B ...] final] var a[, var b, ...]) ->
525 " | ([@A [@B ...] final] T[<α>][[][]] a[, T b, ...]) ->
526 " There is no recognition of expressions interspersed with comments
527 " or of expressions whose parameterised parameter types are written
528 " across multiple lines.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200529 exec 'syn ' . s:ff.LambdaDef('region javaLambdaDef transparent matchgroup=javaLambdaDefStart start=/', 'match javaLambdaDef "') . '\k\@' . s:ff.Peek('4', '') . '<!(' . s:ff.LambdaDef('\%(', '') . '[[:space:]\n]*\%(\%(@\%(\K\k*\.\)*\K\k*\>\%((\_.\{-1,})\)\{-,1}[[:space:]\n]\+\)*\%(final[[:space:]\n]\+\)\=\%(\<\K\k*\>\.\)*\<\K\k*\>\%(<[^(){}]*[[:space:]-]\@' . s:ff.Peek('1', '') . '<!>\)\=\%(\%(\%(\[\]\)\+\|\.\.\.\)\)\=[[:space:]\n]\+\<\K\k*\>\%(\[\]\)*\%(,[[:space:]\n]*\)\=\)\+)[[:space:]\n]*' . s:ff.LambdaDef('\z(->\)\)\@=/ end=/)[[:space:]\n]*\z1/', '->"') . ' contains=javaAnnotation,javaParamModifier,javaLambdaVarType,javaType,@javaClasses,javaGenerics,javaVarArg'
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300530 " Match: () ->
531 " | (a[, b, ...]) ->
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200532 exec 'syn ' . s:ff.LambdaDef('region javaLambdaDef transparent matchgroup=javaLambdaDefStart start=/', 'match javaLambdaDef "') . '\k\@' . s:ff.Peek('4', '') . '<!(' . s:ff.LambdaDef('\%(', '') . '[[:space:]\n]*\%(\<\K\k*\>\%(,[[:space:]\n]*\)\=\)*)[[:space:]\n]*' . s:ff.LambdaDef('\z(->\)\)\@=/ end=/)[[:space:]\n]*\z1/', '->"')
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300533 " Match: a ->
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200534 exec 'syn ' . s:ff.LambdaDef('region javaLambdaDef transparent start=/', 'match javaLambdaDef "') . '\<\K\k*\>\%(\<default\>\)\@' . s:ff.Peek('7', '') . '<!' . s:ff.LambdaDef('\%([[:space:]\n]*\z(->\)\)\@=/ matchgroup=javaLambdaDefStart end=/\z1/', '[[:space:]\n]*->"')
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300535
536 syn keyword javaParamModifier contained final
537 hi def link javaParamModifier javaConceptKind
538 syn keyword javaLambdaVarType contained var
539 hi def link javaLambdaVarType javaOperator
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100540endif
541
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300542" The @javaTop cluster comprises non-contained Java syntax groups.
543" Note that the syntax file "aidl.vim" relies on its availability.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200544syn cluster javaTop contains=TOP,javaTopEnumDeclaration
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300545
Bram Moolenaar071d4272004-06-13 20:20:40 +0000546if !exists("java_minlines")
547 let java_minlines = 10
548endif
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300549
550" Note that variations of a /*/ balanced comment, e.g., /*/*/, /*//*/,
551" /* /*/, /* /*/, etc., may have their rightmost /*/ part accepted
552" as a comment start by ':syntax sync ccomment'; consider alternatives
553" to make synchronisation start further towards file's beginning by
554" bumping up g:java_minlines or issuing ':syntax sync fromstart' or
555" preferring &foldmethod set to 'syntax'.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000556exec "syn sync ccomment javaComment minlines=" . java_minlines
557
558" The default highlighting.
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200559hi def link javaLambdaDef Function
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200560hi def link javaLambdaDefStart Function
561hi def link javaFuncDef Function
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200562hi def link javaVarArg Function
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200563hi def link javaBranch Conditional
564hi def link javaUserLabelRef javaUserLabel
565hi def link javaLabel Label
566hi def link javaUserLabel Label
567hi def link javaConditional Conditional
568hi def link javaRepeat Repeat
569hi def link javaExceptions Exception
570hi def link javaAssert Statement
571hi def link javaStorageClass StorageClass
572hi def link javaMethodDecl javaStorageClass
573hi def link javaClassDecl javaStorageClass
574hi def link javaScopeDecl javaStorageClass
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100575hi def link javaConceptKind NonText
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200576
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200577hi def link javaBoolean Boolean
578hi def link javaSpecial Special
579hi def link javaSpecialError Error
580hi def link javaSpecialCharError Error
581hi def link javaString String
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300582hi def link javaStrTempl Macro
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200583hi def link javaCharacter Character
584hi def link javaSpecialChar SpecialChar
585hi def link javaNumber Number
586hi def link javaError Error
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300587hi def link javaTextBlockError Error
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200588hi def link javaStatement Statement
589hi def link javaOperator Operator
590hi def link javaComment Comment
591hi def link javaDocComment Comment
592hi def link javaLineComment Comment
593hi def link javaConstant Constant
594hi def link javaTypedef Typedef
595hi def link javaTodo Todo
596hi def link javaAnnotation PreProc
Aliaksei Budavei902b7662024-06-13 18:30:09 +0300597hi def link javaAnnotationStart javaAnnotation
Bram Moolenaar071d4272004-06-13 20:20:40 +0000598
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200599hi def link javaCommentTitle SpecialComment
600hi def link javaDocTags Special
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300601hi def link javaDocCodeTag Special
602hi def link javaDocSnippetTag Special
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200603hi def link javaDocParam Function
604hi def link javaDocSeeTagParam Function
605hi def link javaCommentStar javaComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000606
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200607hi def link javaType Type
608hi def link javaExternal Include
Bram Moolenaar071d4272004-06-13 20:20:40 +0000609
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200610hi def link javaSpaceError Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000611
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200612if s:module_info_cur_buf
613 hi def link javaModuleStorageClass StorageClass
614 hi def link javaModuleStmt Statement
615 hi def link javaModuleExternal Include
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200616endif
617
Bram Moolenaar071d4272004-06-13 20:20:40 +0000618let b:current_syntax = "java"
619
620if main_syntax == 'java'
621 unlet main_syntax
622endif
623
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200624let b:spell_options = "contained"
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +0200625let &cpo = s:cpo_save
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300626unlet s:module_info_cur_buf s:ff s:cpo_save
Bram Moolenaar071d4272004-06-13 20:20:40 +0000627
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300628" See ":help vim9-mix".
629if !has("vim9script")
630 finish
631endif
632
633def! s:JavaSyntaxFoldTextExpr(): string
634 return getline(v:foldstart) !~ '/\*\+\s*$'
635 ? foldtext()
636 : printf('+-%s%3d lines: ',
637 v:folddashes,
638 (v:foldend - v:foldstart + 1)) ..
639 getline(v:foldstart + 1)
640enddef
641
642setlocal foldtext=s:JavaSyntaxFoldTextExpr()
643delfunction! g:JavaSyntaxFoldTextExpr
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300644" vim: sw=2 ts=8 noet sta