blob: b612ccaaadb45c9d9c9242d60ae45a126254cb21 [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 Budavei94c5d8a2024-06-19 20:10:47 +02006" Last Change: 2024 Jun 19
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 Budavei5ccdcc42024-04-04 21:51:18 +0200142" Java modules (since Java 9, for "module-info.java" file).
143if s:module_info_cur_buf
144 syn keyword javaModuleStorageClass module transitive
145 syn keyword javaModuleStmt open requires exports opens uses provides
146 syn keyword javaModuleExternal to with
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200147endif
148
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200149" Fancy parameterised types (JLS-17, §4.5).
150"
151" Note that false positives may elsewhere occur whenever an identifier
152" is butted against a less-than operator. Cf. (X<Y) and (X < Y).
153if exists("java_highlight_generics")
154 syn keyword javaWildcardBound contained extends super
155
156 " Parameterised types are delegated to javaGenerics (s:ctx.gsg) and
157 " are not matched with javaTypeArgument.
158 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*\>\)\%(\[\]\)*"'
159
160 for s:ctx in [{'dsg': 'javaDimExpr', 'gsg': 'javaGenerics', 'ghg': 'javaGenericsC1', 'csg': 'javaGenericsX', 'c': ''},
161 \ {'dsg': 'javaDimExprX', 'gsg': 'javaGenericsX', 'ghg': 'javaGenericsC2', 'csg': 'javaGenerics', 'c': ' contained'}]
162 " Consider array creation expressions of reifiable types.
163 exec 'syn region ' . s:ctx.dsg . ' contained transparent matchgroup=' . s:ctx.ghg . ' start="\[" end="\]" nextgroup=' . s:ctx.dsg . ' skipwhite skipnl'
164 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'
165 endfor
166
167 unlet s:ctx
168 hi def link javaWildcardBound Question
169 hi def link javaGenericsC1 javaFuncDef
170 hi def link javaGenericsC2 javaType
171endif
172
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000173if exists("java_highlight_java_lang_ids")
174 let java_highlight_all=1
175endif
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200176if exists("java_highlight_all") || exists("java_highlight_java") || exists("java_highlight_java_lang")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000177 " java.lang.*
Bram Moolenaar63f32602022-06-09 20:45:54 +0100178 "
179 " The keywords of javaR_JavaLang, javaC_JavaLang, javaE_JavaLang,
180 " and javaX_JavaLang are sub-grouped according to the Java version
181 " of their introduction, and sub-group keywords (that is, class
182 " names) are arranged in alphabetical order, so that future newer
183 " keywords can be pre-sorted and appended without disturbing
184 " the current keyword placement. The below _match_es follow suit.
185
Aliaksei Budavei63d68c22024-03-26 20:12:05 +0300186 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 +0000187 syn cluster javaClasses add=javaR_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200188 hi def link javaR_JavaLang javaR_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100189 " Member enumerations:
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300190 exec 'syn match javaC_JavaLang "\%(\<Thread\.\)\@' . s:ff.Peek('7', '') . '<=\<State\>"'
191 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<UnicodeScript\>"'
192 exec 'syn match javaC_JavaLang "\%(\<ProcessBuilder\.Redirect\.\)\@' . s:ff.Peek('24', '') . '<=\<Type\>"'
193 exec 'syn match javaC_JavaLang "\%(\<StackWalker\.\)\@' . s:ff.Peek('12', '') . '<=\<Option\>"'
194 exec 'syn match javaC_JavaLang "\%(\<System\.Logger\.\)\@' . s:ff.Peek('14', '') . '<=\<Level\>"'
Bram Moolenaar63f32602022-06-09 20:45:54 +0100195 " Member classes:
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300196 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<Subset\>"'
197 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<UnicodeBlock\>"'
198 exec 'syn match javaC_JavaLang "\%(\<ProcessBuilder\.\)\@' . s:ff.Peek('15', '') . '<=\<Redirect\>"'
199 exec 'syn match javaC_JavaLang "\%(\<ModuleLayer\.\)\@' . s:ff.Peek('12', '') . '<=\<Controller\>"'
200 exec 'syn match javaC_JavaLang "\%(\<Runtime\.\)\@' . s:ff.Peek('8', '') . '<=\<Version\>"'
201 exec 'syn match javaC_JavaLang "\%(\<System\.\)\@' . s:ff.Peek('7', '') . '<=\<LoggerFinder\>"'
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200202 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 +0100203 syn match javaC_JavaLang "\<System\>" " See javaDebug.
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200204
205 if !exists("java_highlight_generics")
206 " The non-interface parameterised names of java.lang members.
207 exec 'syn match javaC_JavaLang "\%(\<Enum\.\)\@' . s:ff.Peek('5', '') . '<=\<EnumDesc\>"'
208 syn keyword javaC_JavaLang Class InheritableThreadLocal ThreadLocal Enum ClassValue
209 endif
210
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200211 " As of JDK 21, java.lang.Compiler is no more (deprecated in JDK 9).
Aliaksei Budavei63d68c22024-03-26 20:12:05 +0300212 syn keyword javaLangDeprecated Compiler
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000213 syn cluster javaClasses add=javaC_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200214 hi def link javaC_JavaLang javaC_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100215 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 +0000216 syn cluster javaClasses add=javaE_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200217 hi def link javaE_JavaLang javaE_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100218 syn keyword javaX_JavaLang ClassNotFoundException CloneNotSupportedException Exception IllegalAccessException InstantiationException InterruptedException NoSuchMethodException Throwable NoSuchFieldException ReflectiveOperationException
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000219 syn cluster javaClasses add=javaX_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200220 hi def link javaX_JavaLang javaX_Java
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000221
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200222 hi def link javaR_Java javaR_
223 hi def link javaC_Java javaC_
224 hi def link javaE_Java javaE_
225 hi def link javaX_Java javaX_
226 hi def link javaX_ javaExceptions
227 hi def link javaR_ javaExceptions
228 hi def link javaE_ javaExceptions
229 hi def link javaC_ javaConstant
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000230
Bram Moolenaar071d4272004-06-13 20:20:40 +0000231 syn keyword javaLangObject clone equals finalize getClass hashCode
232 syn keyword javaLangObject notify notifyAll toString wait
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200233 hi def link javaLangObject javaConstant
Bram Moolenaar071d4272004-06-13 20:20:40 +0000234endif
235
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300236if filereadable(expand("<sfile>:p:h") . "/javaid.vim")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000237 source <sfile>:p:h/javaid.vim
238endif
239
240if exists("java_space_errors")
241 if !exists("java_no_trail_space_error")
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200242 syn match javaSpaceError "\s\+$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000243 endif
244 if !exists("java_no_tab_space_error")
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200245 syn match javaSpaceError " \+\t"me=e-1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000246 endif
247endif
248
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300249exec 'syn match javaUserLabel "^\s*\<\K\k*\>\%(\<default\>\)\@' . s:ff.Peek('7', '') . '<!\s*:"he=e-1'
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200250syn 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 +0100251syn region javaLabelRegion transparent matchgroup=javaLabel start="\<default\>\%(\s*\%(:\|->\)\)\@=" matchgroup=NONE end=":\|->" oneline
252" Consider grouped _default_ _case_ labels, i.e.
253" case null, default ->
254" case null: default:
255syn keyword javaLabelDefault contained default
256syn keyword javaLabelVarType contained var
257syn keyword javaLabelCastType contained char byte short int
258" Allow for the contingency of the enclosing region not being able to
259" _keep_ its _end_, e.g. case ':':.
Aliaksei Budaveid6b4afb2024-06-09 19:39:52 +0300260syn 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 +0100261syn match javaLabelNumber contained "\<0\>[lL]\@!"
262syn match javaLabelNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)\>[lL]\@!"
263hi def link javaLabelDefault javaLabel
264hi def link javaLabelVarType javaOperator
265hi def link javaLabelNumber javaNumber
266hi def link javaLabelCastType javaType
Bram Moolenaar071d4272004-06-13 20:20:40 +0000267
Bram Moolenaar071d4272004-06-13 20:20:40 +0000268" Comments
269syn keyword javaTodo contained TODO FIXME XXX
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300270
Bram Moolenaar071d4272004-06-13 20:20:40 +0000271if exists("java_comment_strings")
272 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 +0300273 syn region javaCommentString contained start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell,javaSpecialError,javaTextBlockError
274 syn region javaComment2String contained start=+"+ end=+$\|"+ contains=javaSpecial,javaSpecialChar,@Spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000275 syn match javaCommentCharacter contained "'\\[^']\{1,6\}'" contains=javaSpecialChar
276 syn match javaCommentCharacter contained "'\\''" contains=javaSpecialChar
277 syn match javaCommentCharacter contained "'[^\\]'"
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300278 syn cluster javaCommentSpecial add=javaCommentString,javaCommentCharacter,javaNumber,javaStrTempl
279 syn cluster javaCommentSpecial2 add=javaComment2String,javaCommentCharacter,javaNumber,javaStrTempl
Bram Moolenaar071d4272004-06-13 20:20:40 +0000280endif
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300281
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300282syn region javaComment matchgroup=javaCommentStart start="/\*" end="\*/" contains=@javaCommentSpecial,javaTodo,javaCommentError,javaSpaceError,@Spell fold
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200283syn match javaCommentStar contained "^\s*\*[^/]"me=e-1
284syn match javaCommentStar contained "^\s*\*$"
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300285syn match javaLineComment "//.*" contains=@javaCommentSpecial2,javaTodo,javaCommentMarkupTag,javaSpaceError,@Spell
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300286syn match javaCommentMarkupTag contained "@\%(end\|highlight\|link\|replace\|start\)\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
287syn match javaCommentMarkupTagAttr contained "\<region\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300288exec '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 +0300289hi def link javaCommentMarkupTagAttr htmlArg
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200290hi def link javaCommentString javaString
291hi def link javaComment2String javaString
292hi def link javaCommentCharacter javaCharacter
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300293syn match javaCommentError contained "/\*"me=e-1 display
294hi def link javaCommentError javaError
295hi def link javaCommentStart javaComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000296
Bram Moolenaar071d4272004-06-13 20:20:40 +0000297if !exists("java_ignore_javadoc") && main_syntax != 'jsp'
298 syntax case ignore
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300299
300 " Include HTML syntax coloring for Javadoc comments.
Bram Moolenaar63f32602022-06-09 20:45:54 +0100301 syntax include @javaHtml syntax/html.vim
Bram Moolenaar071d4272004-06-13 20:20:40 +0000302 unlet b:current_syntax
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300303
304 " HTML enables spell checking for all text that is not in a syntax
305 " item (:syntax spell toplevel); instead, limit spell checking to
306 " items matchable with syntax groups containing the @Spell cluster.
307 try
308 syntax spell default
309 catch /\<E390:/
310 call s:ReportOnce(v:exception)
311 endtry
Bram Moolenaar5c736222010-01-06 20:54:52 +0100312
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300313 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 +0300314 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 +0300315 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 +0300316 syn region javaDocTags contained start="{@\%(li\%(teral\|nk\%(plain\)\=\)\|inherit[Dd]oc\|doc[rR]oot\|value\)\>" end="}"
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300317 syn match javaDocTags contained "@\%(param\|exception\|throws\|since\)\s\+\S\+" contains=javaDocParam
318 syn match javaDocParam contained "\s\S\+"
319 syn match javaDocTags contained "@\%(version\|author\|return\|deprecated\|serial\%(Field\|Data\)\=\)\>"
320 syn region javaDocSeeTag contained matchgroup=javaDocTags start="@see\s\+" matchgroup=NONE end="\_."re=e-1 contains=javaDocSeeTagParam
321 syn match javaDocSeeTagParam contained @"\_[^"]\+"\|<a\s\+\_.\{-}</a>\|\%(\k\|\.\)*\%(#\k\+\%((\_[^)]*)\)\=\)\=@ contains=@javaHtml extend
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300322 syn region javaCodeSkipBlock contained transparent start="{\%(@code\>\)\@!" end="}" contains=javaCodeSkipBlock,javaDocCodeTag
323 syn region javaDocCodeTag contained start="{@code\>" end="}" contains=javaDocCodeTag,javaCodeSkipBlock
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300324 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 +0300325 syn region javaSnippetSkipBlock contained transparent start="{\%(@snippet\>\)\@!" end="}" contains=javaSnippetSkipBlock,javaDocSnippetTag,javaCommentMarkupTag
326 syn region javaDocSnippetTag contained start="{@snippet\>" end="}" contains=javaDocSnippetTag,javaSnippetSkipBlock,javaDocSnippetTagAttr,javaCommentMarkupTag
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300327
Bram Moolenaar071d4272004-06-13 20:20:40 +0000328 syntax case match
329endif
330
331" match the special comment /**/
332syn match javaComment "/\*\*/"
333
334" Strings and constants
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200335syn match javaSpecialError contained "\\."
Bram Moolenaar071d4272004-06-13 20:20:40 +0000336syn match javaSpecialCharError contained "[^']"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300337" Escape Sequences (JLS-17, §3.10.7):
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300338syn match javaSpecialChar contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000339syn region javaString start=+"+ end=+"+ end=+$+ contains=javaSpecialChar,javaSpecialError,@Spell
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300340syn region javaString start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecialChar,javaSpecialError,javaTextBlockError,@Spell
341syn match javaTextBlockError +"""\s*"""+
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300342syn region javaStrTemplEmbExp contained matchgroup=javaStrTempl start="\\{" end="}" contains=TOP
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300343exec 'syn region javaStrTempl start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,@Spell'
344exec '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 +0000345syn match javaCharacter "'[^']*'" contains=javaSpecialChar,javaSpecialCharError
346syn match javaCharacter "'\\''" contains=javaSpecialChar
347syn match javaCharacter "'[^\\]'"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300348" Integer literals (JLS-17, §3.10.1):
349syn keyword javaNumber 0 0l 0L
350syn match javaNumber "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
351" Decimal floating-point literals (JLS-17, §3.10.2):
352" Against "\<\d\+\>\.":
353syn match javaNumber "\<\d\%(_*\d\)*\."
354syn match javaNumber "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
355syn match javaNumber "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
356syn match javaNumber "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
357" Hexadecimal floating-point literals (JLS-17, §3.10.2):
358syn match javaNumber "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000359
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300360" Unicode characters
361syn match javaSpecial "\\u\x\x\x\x"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000362
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200363" Method declarations (JLS-17, §8.4.3, §8.4.4, §9.4).
Bram Moolenaar071d4272004-06-13 20:20:40 +0000364if exists("java_highlight_functions")
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200365 syn cluster javaFuncParams contains=javaAnnotation,@javaClasses,javaGenerics,javaType,javaVarArg,javaComment,javaLineComment
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200366
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300367 if java_highlight_functions =~# '^indent[1-8]\=$'
368 let s:last = java_highlight_functions[-1 :]
369 let s:indent = s:last != 't' ? repeat("\x20", s:last) : "\t"
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200370 syn cluster javaFuncParams add=javaScopeDecl,javaConceptKind,javaStorageClass,javaExternal
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300371 " Try to not match other type members, initialiser blocks, enum
372 " constants (JLS-17, §8.9.1), and constructors (JLS-17, §8.1.7):
373 " at any _conventional_ indentation, skip over all fields with
374 " "[^=]*", all records with "\<record\s", and let the "*Skip*"
375 " definitions take care of constructor declarations and enum
376 " constants (with no support for @Foo(value = "bar")).
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300377 exec 'syn region javaFuncDef start=+^' . s:indent . '\%(<[^>]\+>\+\s\+\|\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)\+\)\=\%(\<\K\k*\>\.\)*\K\k*\>[^=]*\%(\<record\)\@' . s:ff.Peek('6', '') . '<!\s\K\k*\s*(+ end=+)+ contains=@javaFuncParams'
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300378 " As long as package-private constructors cannot be matched with
379 " javaFuncDef, do not look with javaConstructorSkipDeclarator for
380 " them.
381 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'
382 exec 'syn match javaEnumSkipArgumentativeConstant transparent +^' . s:indent . '\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)*\K\k*\s*\ze(+ contains=javaAnnotation'
383 unlet s:indent s:last
Bram Moolenaar071d4272004-06-13 20:20:40 +0000384 else
Aliaksei Budavei40524742024-04-14 19:57:00 +0300385 " This is the "style" variant (:help ft-java-syntax).
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200386 syn cluster javaFuncParams add=javaScopeDecl,javaConceptKind,javaStorageClass,javaExternal
387
388 " Match arbitrarily indented camelCasedName method declarations.
389 " Match: [@ɐ] [abstract] [<α, β>] Τʬ[<γ>][[][]] μʭʭ(/* ... */);
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300390 exec 'syn region javaFuncDef start=/' . s:ff.Engine('\%#=2', '') . '^\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.LowerCase('[$_[:lower:]]', '[^A-Z0-9]') . '\k*\>\s*(/ end=/)/ skip=/\/\*.\{-}\*\/\|\/\/.*$/ contains=@javaFuncParams'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000391 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000392endif
393
394if exists("java_highlight_debug")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000395 " Strings and constants
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300396 syn match javaDebugSpecial contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000397 syn region javaDebugString contained start=+"+ end=+"+ contains=javaDebugSpecial
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300398 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 +0300399 " The highlight groups of java{StrTempl,Debug{,Paren,StrTempl}}\,
400 " share one colour by default. Do not conflate unrelated parens.
401 syn region javaDebugStrTemplEmbExp contained matchgroup=javaDebugStrTempl start="\\{" end="}" contains=javaComment,javaLineComment,javaDebug\%(Paren\)\@!.*
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300402 exec 'syn region javaDebugStrTempl contained start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ contains=javaDebugStrTemplEmbExp,javaDebugSpecial'
403 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 +0300404 syn match javaDebugTextBlockError contained +"""\s*"""+
Bram Moolenaar071d4272004-06-13 20:20:40 +0000405 syn match javaDebugCharacter contained "'[^\\]'"
406 syn match javaDebugSpecialCharacter contained "'\\.'"
407 syn match javaDebugSpecialCharacter contained "'\\''"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300408 syn keyword javaDebugNumber contained 0 0l 0L
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300409 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\."
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300410 syn match javaDebugNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
411 syn match javaDebugNumber contained "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
412 syn match javaDebugNumber contained "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
413 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
414 syn match javaDebugNumber contained "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000415 syn keyword javaDebugBoolean contained true false
416 syn keyword javaDebugType contained null this super
417 syn region javaDebugParen start=+(+ end=+)+ contained contains=javaDebug.*,javaDebugParen
418
Aliaksei Budavei40524742024-04-14 19:57:00 +0300419 " To make this work, define the highlighting for these groups.
420 syn match javaDebug "\<System\.\%(out\|err\)\.print\%(ln\)\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
421" FIXME: What API does "p" belong to?
422" syn match javaDebug "\<p\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
423 syn match javaDebug "\<\K\k*\.printStackTrace\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
424" FIXME: What API do "trace*" belong to?
425" syn match javaDebug "\<trace[SL]\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
Bram Moolenaar071d4272004-06-13 20:20:40 +0000426
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200427 hi def link javaDebug Debug
428 hi def link javaDebugString DebugString
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300429 hi def link javaDebugStrTempl Macro
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300430 hi def link javaDebugTextBlockError Error
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200431 hi def link javaDebugType DebugType
432 hi def link javaDebugBoolean DebugBoolean
433 hi def link javaDebugNumber Debug
434 hi def link javaDebugSpecial DebugSpecial
435 hi def link javaDebugSpecialCharacter DebugSpecial
436 hi def link javaDebugCharacter DebugString
437 hi def link javaDebugParen Debug
Bram Moolenaar071d4272004-06-13 20:20:40 +0000438
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200439 hi def link DebugString String
440 hi def link DebugSpecial Special
441 hi def link DebugBoolean Boolean
442 hi def link DebugType Type
Bram Moolenaar071d4272004-06-13 20:20:40 +0000443endif
444
Aliaksei Budavei94c5d8a2024-06-19 20:10:47 +0200445" Try not to fold top-level-type bodies under assumption that there is
446" but one such body.
447exec 'syn region javaBlock transparent start="\%(^\|^\S[^:]\+\)\@' . s:ff.Peek('120', '') . '<!{" end="}" fold'
448
Bram Moolenaar071d4272004-06-13 20:20:40 +0000449if exists("java_mark_braces_in_parens_as_errors")
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300450 syn match javaInParen contained "[{}]"
451 hi def link javaInParen javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000452endif
453
454" catch errors caused by wrong parenthesis
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300455syn region javaParenT transparent matchgroup=javaParen start="(" end=")" contains=@javaTop,javaInParen,javaParenT1
456syn region javaParenT1 transparent matchgroup=javaParen1 start="(" end=")" contains=@javaTop,javaInParen,javaParenT2 contained
457syn region javaParenT2 transparent matchgroup=javaParen2 start="(" end=")" contains=@javaTop,javaInParen,javaParenT contained
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200458syn match javaParenError ")"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000459" catch errors caused by wrong square parenthesis
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100460syn region javaParenT transparent matchgroup=javaParen start="\[" end="\]" contains=@javaTop,javaParenT1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000461syn region javaParenT1 transparent matchgroup=javaParen1 start="\[" end="\]" contains=@javaTop,javaParenT2 contained
462syn region javaParenT2 transparent matchgroup=javaParen2 start="\[" end="\]" contains=@javaTop,javaParenT contained
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200463syn match javaParenError "\]"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000464
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200465hi def link javaParenError javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000466
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300467" Lambda expressions (JLS-17, §15.27).
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100468if exists("java_highlight_functions")
Aliaksei Budavei40524742024-04-14 19:57:00 +0300469 " Make ()-matching definitions after the parenthesis error catcher.
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300470 "
471 " Match: ([@A [@B ...] final] var a[, var b, ...]) ->
472 " | ([@A [@B ...] final] T[<α>][[][]] a[, T b, ...]) ->
473 " There is no recognition of expressions interspersed with comments
474 " or of expressions whose parameterised parameter types are written
475 " across multiple lines.
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200476 exec 'syn match javaLambdaDef "\k\@' . s:ff.Peek('4', '') . '<!([[: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]*->" contains=javaAnnotation,javaParamModifier,javaLambdaVarType,javaType,@javaClasses,javaGenerics,javaVarArg'
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300477 " Match: () ->
478 " | (a[, b, ...]) ->
479 exec 'syn match javaLambdaDef "\k\@' . s:ff.Peek('4', '') . '<!([[:space:]\n]*\%(\<\K\k*\>\%(,[[:space:]\n]*\)\=\)*)[[:space:]\n]*->"'
480 " Match: a ->
481 exec 'syn match javaLambdaDef "\<\K\k*\>\%(\<default\>\)\@' . s:ff.Peek('7', '') . '<![[:space:]\n]*->"'
482
483 syn keyword javaParamModifier contained final
484 hi def link javaParamModifier javaConceptKind
485 syn keyword javaLambdaVarType contained var
486 hi def link javaLambdaVarType javaOperator
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100487endif
488
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300489" The @javaTop cluster comprises non-contained Java syntax groups.
490" Note that the syntax file "aidl.vim" relies on its availability.
Aliaksei Budavei94c5d8a2024-06-19 20:10:47 +0200491syn cluster javaTop contains=TOP
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300492
Bram Moolenaar071d4272004-06-13 20:20:40 +0000493if !exists("java_minlines")
494 let java_minlines = 10
495endif
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300496
497" Note that variations of a /*/ balanced comment, e.g., /*/*/, /*//*/,
498" /* /*/, /* /*/, etc., may have their rightmost /*/ part accepted
499" as a comment start by ':syntax sync ccomment'; consider alternatives
500" to make synchronisation start further towards file's beginning by
501" bumping up g:java_minlines or issuing ':syntax sync fromstart' or
502" preferring &foldmethod set to 'syntax'.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000503exec "syn sync ccomment javaComment minlines=" . java_minlines
504
505" The default highlighting.
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200506hi def link javaLambdaDef Function
507hi def link javaFuncDef Function
508hi def link javaVarArg Function
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200509hi def link javaBranch Conditional
510hi def link javaUserLabelRef javaUserLabel
511hi def link javaLabel Label
512hi def link javaUserLabel Label
513hi def link javaConditional Conditional
514hi def link javaRepeat Repeat
515hi def link javaExceptions Exception
516hi def link javaAssert Statement
517hi def link javaStorageClass StorageClass
518hi def link javaMethodDecl javaStorageClass
519hi def link javaClassDecl javaStorageClass
520hi def link javaScopeDecl javaStorageClass
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100521hi def link javaConceptKind NonText
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200522
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200523hi def link javaBoolean Boolean
524hi def link javaSpecial Special
525hi def link javaSpecialError Error
526hi def link javaSpecialCharError Error
527hi def link javaString String
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300528hi def link javaStrTempl Macro
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200529hi def link javaCharacter Character
530hi def link javaSpecialChar SpecialChar
531hi def link javaNumber Number
532hi def link javaError Error
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300533hi def link javaTextBlockError Error
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200534hi def link javaStatement Statement
535hi def link javaOperator Operator
536hi def link javaComment Comment
537hi def link javaDocComment Comment
538hi def link javaLineComment Comment
539hi def link javaConstant Constant
540hi def link javaTypedef Typedef
541hi def link javaTodo Todo
542hi def link javaAnnotation PreProc
Aliaksei Budavei902b7662024-06-13 18:30:09 +0300543hi def link javaAnnotationStart javaAnnotation
Bram Moolenaar071d4272004-06-13 20:20:40 +0000544
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200545hi def link javaCommentTitle SpecialComment
546hi def link javaDocTags Special
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300547hi def link javaDocCodeTag Special
548hi def link javaDocSnippetTag Special
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200549hi def link javaDocParam Function
550hi def link javaDocSeeTagParam Function
551hi def link javaCommentStar javaComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000552
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200553hi def link javaType Type
554hi def link javaExternal Include
Bram Moolenaar071d4272004-06-13 20:20:40 +0000555
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200556hi def link htmlComment Special
557hi def link htmlCommentPart Special
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300558hi def link htmlArg Type
559hi def link htmlString String
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200560hi def link javaSpaceError Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000561
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200562if s:module_info_cur_buf
563 hi def link javaModuleStorageClass StorageClass
564 hi def link javaModuleStmt Statement
565 hi def link javaModuleExternal Include
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200566endif
567
Bram Moolenaar071d4272004-06-13 20:20:40 +0000568let b:current_syntax = "java"
569
570if main_syntax == 'java'
571 unlet main_syntax
572endif
573
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200574let b:spell_options = "contained"
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +0200575let &cpo = s:cpo_save
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300576unlet s:module_info_cur_buf s:ff s:cpo_save
Bram Moolenaar071d4272004-06-13 20:20:40 +0000577
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300578" See ":help vim9-mix".
579if !has("vim9script")
580 finish
581endif
582
583def! s:JavaSyntaxFoldTextExpr(): string
584 return getline(v:foldstart) !~ '/\*\+\s*$'
585 ? foldtext()
586 : printf('+-%s%3d lines: ',
587 v:folddashes,
588 (v:foldend - v:foldstart + 1)) ..
589 getline(v:foldstart + 1)
590enddef
591
592setlocal foldtext=s:JavaSyntaxFoldTextExpr()
593delfunction! g:JavaSyntaxFoldTextExpr
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300594" vim: sw=2 ts=8 noet sta