blob: 0ed81945944531344dcdcc615f3aea600fc73788 [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
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +020011if !exists("g: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
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +020016 let g:main_syntax = 'java'
Bram Moolenaar071d4272004-06-13 20:20:40 +000017endif
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 Moolenaar071d4272004-06-13 20:20:40 +000068
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020069" Keywords (JLS-17, §3.9):
Bram Moolenaar071d4272004-06-13 20:20:40 +000070syn keyword javaExternal native package
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020071syn match javaExternal "\<import\>\%(\s\+static\>\)\="
Bram Moolenaar071d4272004-06-13 20:20:40 +000072syn keyword javaError goto const
73syn keyword javaConditional if else switch
74syn keyword javaRepeat while for do
75syn keyword javaBoolean true false
76syn keyword javaConstant null
77syn keyword javaTypedef this super
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020078syn keyword javaOperator new instanceof
79syn match javaOperator "\<var\>\%(\s*(\)\@!"
Aliaksei Budaveid3952e82024-05-11 00:39:31 +030080
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +010081" Since the yield statement, which could take a parenthesised operand,
82" and _qualified_ yield methods get along within the switch block
83" (JLS-17, §3.8), it seems futile to make a region definition for this
84" block; instead look for the _yield_ word alone, and if found,
85" backtrack (arbitrarily) 80 bytes, at most, on the matched line and,
86" if necessary, on the line before that (h: \@<=), trying to match
87" neither a method reference nor a qualified method invocation.
Aliaksei Budaveid3952e82024-05-11 00:39:31 +030088try
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +020089 syn match javaOperator "\%(\%(::\|\.\)[[:space:]\n]*\)\@80<!\<yield\>"
Aliaksei Budaveid3952e82024-05-11 00:39:31 +030090 let s:ff.Peek = s:ff.LeftConstant
91catch /\<E59:/
92 call s:ReportOnce(v:exception)
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +020093 syn match javaOperator "\%(\%(::\|\.\)[[:space:]\n]*\)\@<!\<yield\>"
Aliaksei Budaveid3952e82024-05-11 00:39:31 +030094 let s:ff.Peek = s:ff.RightConstant
95endtry
96
Bram Moolenaar071d4272004-06-13 20:20:40 +000097syn keyword javaType boolean char byte short int long float double
98syn keyword javaType void
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +010099syn keyword javaStatement return
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200100syn keyword javaStorageClass static synchronized transient volatile strictfp
Bram Moolenaar071d4272004-06-13 20:20:40 +0000101syn keyword javaExceptions throw try catch finally
102syn keyword javaAssert assert
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200103syn keyword javaMethodDecl throws
104" Differentiate a "MyClass.class" literal from the keyword "class".
Bram Moolenaar071d4272004-06-13 20:20:40 +0000105syn match javaTypedef "\.\s*\<class\>"ms=s+1
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200106syn keyword javaClassDecl enum extends implements interface
107syn match javaClassDecl "\<permits\>\%(\s*(\)\@!"
108syn match javaClassDecl "\<record\>\%(\s*(\)\@!"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000109syn match javaClassDecl "^class\>"
110syn match javaClassDecl "[^.]\s*\<class\>"ms=s+1
Aliaksei Budavei40524742024-04-14 19:57:00 +0300111syn match javaAnnotation "@\%(\K\k*\.\)*\K\k*\>"
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300112syn 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 +0200113syn match javaClassDecl "@interface\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000114syn keyword javaBranch break continue nextgroup=javaUserLabelRef skipwhite
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200115syn match javaUserLabelRef contained "\k\+"
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000116syn match javaVarArg "\.\.\."
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200117syn keyword javaScopeDecl public protected private
118syn keyword javaConceptKind abstract final
119syn match javaConceptKind "\<non-sealed\>"
120syn match javaConceptKind "\<sealed\>\%(\s*(\)\@!"
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100121syn match javaConceptKind "\<default\>\%(\s*\%(:\|->\)\)\@!"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000122
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300123if !(v:version < 704)
124 " Request the new regexp engine for [:upper:] and [:lower:].
125 let [s:ff.Engine, s:ff.UpperCase, s:ff.LowerCase] = repeat([s:ff.LeftConstant], 3)
126else
127 " XXX: \C\<[^a-z0-9]\k*\> rejects "type", but matches "τύπος".
128 " XXX: \C\<[^A-Z0-9]\k*\> rejects "Method", but matches "Μέθοδος".
129 let [s:ff.Engine, s:ff.UpperCase, s:ff.LowerCase] = repeat([s:ff.RightConstant], 3)
130endif
Bram Moolenaar63f32602022-06-09 20:45:54 +0100131
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200132if exists("g:java_highlight_signature")
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200133 let [s:ff.PeekTo, s:ff.PeekFrom, s:ff.GroupArgs] = repeat([s:ff.LeftConstant], 3)
134else
135 let [s:ff.PeekTo, s:ff.PeekFrom, s:ff.GroupArgs] = repeat([s:ff.RightConstant], 3)
136endif
137
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200138" Java module declarations (JLS-17, §7.7).
139"
140" Note that a "module-info" file will be recognised with an arbitrary
141" file extension (or no extension at all) so that more than one such
142" declaration for the same Java module can be maintained for modular
143" testing in a project without attendant confusion for IDEs, with the
144" ".java\=" extension used for a production version and an arbitrary
145" extension used for a testing version.
146if fnamemodify(bufname("%"), ":t") =~ '^module-info\%(\.class\>\)\@!'
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200147 syn keyword javaModuleStorageClass module transitive
148 syn keyword javaModuleStmt open requires exports opens uses provides
149 syn keyword javaModuleExternal to with
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200150 hi def link javaModuleStorageClass StorageClass
151 hi def link javaModuleStmt Statement
152 hi def link javaModuleExternal Include
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).
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200159if exists("g:java_highlight_generics")
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200160 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
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200174 hi def link javaWildcardBound Question
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200175 hi def link javaGenericsC1 Function
176 hi def link javaGenericsC2 Type
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200177endif
178
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200179if exists("g:java_highlight_java_lang_ids")
180 let g:java_highlight_all = 1
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000181endif
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200182if exists("g:java_highlight_all") || exists("g:java_highlight_java") || exists("g: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
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200211 if !exists("g:java_highlight_generics")
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200212 " 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_
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200232 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
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200254if exists("g:java_space_errors")
255 if !exists("g:java_no_trail_space_error")
256 syn match javaSpaceError "\s\+$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000257 endif
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200258 if !exists("g:java_no_tab_space_error")
259 syn match javaSpaceError " \+\t"me=e-1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000260 endif
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200261 hi def link javaSpaceError Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000262endif
263
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200264exec 'syn match javaUserLabel "^\s*\<\K\k*\>\%(\<default\>\)\@' . s:ff.Peek('7', '') . '<!\s*::\@!"he=e-1'
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200265syn 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 +0100266syn region javaLabelRegion transparent matchgroup=javaLabel start="\<default\>\%(\s*\%(:\|->\)\)\@=" matchgroup=NONE end=":\|->" oneline
267" Consider grouped _default_ _case_ labels, i.e.
268" case null, default ->
269" case null: default:
270syn keyword javaLabelDefault contained default
271syn keyword javaLabelVarType contained var
272syn keyword javaLabelCastType contained char byte short int
273" Allow for the contingency of the enclosing region not being able to
274" _keep_ its _end_, e.g. case ':':.
Aliaksei Budaveid6b4afb2024-06-09 19:39:52 +0300275syn 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 +0100276syn match javaLabelNumber contained "\<0\>[lL]\@!"
277syn match javaLabelNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)\>[lL]\@!"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000278
Bram Moolenaar071d4272004-06-13 20:20:40 +0000279" Comments
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200280syn keyword javaTodo contained TODO FIXME XXX
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300281
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200282if exists("g:java_comment_strings")
283 syn region javaCommentString contained start=+"+ end=+"+ end=+$+ end=+\*/+me=s-1,he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell
284 syn region javaCommentString contained start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell,javaSpecialError,javaTextBlockError
285 syn region javaComment2String contained start=+"+ end=+$\|"+ contains=javaSpecial,javaSpecialChar,@Spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000286 syn match javaCommentCharacter contained "'\\[^']\{1,6\}'" contains=javaSpecialChar
287 syn match javaCommentCharacter contained "'\\''" contains=javaSpecialChar
288 syn match javaCommentCharacter contained "'[^\\]'"
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300289 syn cluster javaCommentSpecial add=javaCommentString,javaCommentCharacter,javaNumber,javaStrTempl
290 syn cluster javaCommentSpecial2 add=javaComment2String,javaCommentCharacter,javaNumber,javaStrTempl
Bram Moolenaar071d4272004-06-13 20:20:40 +0000291endif
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300292
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200293syn region javaComment matchgroup=javaCommentStart start="/\*" end="\*/" contains=@javaCommentSpecial,javaTodo,javaCommentError,javaSpaceError,@Spell fold
294syn match javaCommentStar contained "^\s*\*[^/]"me=e-1
295syn match javaCommentStar contained "^\s*\*$"
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300296syn match javaLineComment "//.*" contains=@javaCommentSpecial2,javaTodo,javaCommentMarkupTag,javaSpaceError,@Spell
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300297syn match javaCommentMarkupTag contained "@\%(end\|highlight\|link\|replace\|start\)\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
298syn match javaCommentMarkupTagAttr contained "\<region\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200299exec 'syn region javaCommentMarkupTagAttr contained transparent matchgroup=javaHtmlArg start=/\<\%(re\%(gex\|gion\|placement\)\|substring\|t\%(arget\|ype\)\)\%(\s*=\)\@=/ matchgroup=javaHtmlString end=/\%(=\s*\)\@' . s:ff.Peek('80', '') . '<=\%("[^"]\+"\|' . "\x27[^\x27]\\+\x27" . '\|\%([.-]\|\k\)\+\)/ nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite oneline'
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300300syn match javaCommentError contained "/\*"me=e-1 display
Bram Moolenaar071d4272004-06-13 20:20:40 +0000301
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200302if !exists("g:java_ignore_javadoc") && g:main_syntax != 'jsp'
Aliaksei Budavei3749dff2024-07-31 22:13:25 +0200303 " The overridable "html*" default links must be defined _before_ the
304 " inclusion of the same default links from "html.vim".
305 hi def link htmlComment Special
306 hi def link htmlCommentPart Special
307 hi def link htmlArg Type
308 hi def link htmlString String
Bram Moolenaar071d4272004-06-13 20:20:40 +0000309 syntax case ignore
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300310
311 " Include HTML syntax coloring for Javadoc comments.
Bram Moolenaar63f32602022-06-09 20:45:54 +0100312 syntax include @javaHtml syntax/html.vim
Bram Moolenaar071d4272004-06-13 20:20:40 +0000313 unlet b:current_syntax
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300314
315 " HTML enables spell checking for all text that is not in a syntax
316 " item (:syntax spell toplevel); instead, limit spell checking to
317 " items matchable with syntax groups containing the @Spell cluster.
318 try
319 syntax spell default
320 catch /\<E390:/
321 call s:ReportOnce(v:exception)
322 endtry
Bram Moolenaar5c736222010-01-06 20:54:52 +0100323
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300324 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 +0300325 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 +0300326 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 +0300327 syn region javaDocTags contained start="{@\%(li\%(teral\|nk\%(plain\)\=\)\|inherit[Dd]oc\|doc[rR]oot\|value\)\>" end="}"
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300328 syn match javaDocTags contained "@\%(param\|exception\|throws\|since\)\s\+\S\+" contains=javaDocParam
329 syn match javaDocParam contained "\s\S\+"
330 syn match javaDocTags contained "@\%(version\|author\|return\|deprecated\|serial\%(Field\|Data\)\=\)\>"
331 syn region javaDocSeeTag contained matchgroup=javaDocTags start="@see\s\+" matchgroup=NONE end="\_."re=e-1 contains=javaDocSeeTagParam
332 syn match javaDocSeeTagParam contained @"\_[^"]\+"\|<a\s\+\_.\{-}</a>\|\%(\k\|\.\)*\%(#\k\+\%((\_[^)]*)\)\=\)\=@ contains=@javaHtml extend
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300333 syn region javaCodeSkipBlock contained transparent start="{\%(@code\>\)\@!" end="}" contains=javaCodeSkipBlock,javaDocCodeTag
334 syn region javaDocCodeTag contained start="{@code\>" end="}" contains=javaDocCodeTag,javaCodeSkipBlock
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200335 exec 'syn region javaDocSnippetTagAttr contained transparent matchgroup=javaHtmlArg start=/\<\%(class\|file\|id\|lang\|region\)\%(\s*=\)\@=/ matchgroup=javaHtmlString end=/:$/ end=/\%(=\s*\)\@' . s:ff.Peek('80', '') . '<=\%("[^"]\+"\|' . "\x27[^\x27]\\+\x27" . '\|\%([.\\/-]\|\k\)\+\)/ nextgroup=javaDocSnippetTagAttr skipwhite skipnl'
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300336 syn region javaSnippetSkipBlock contained transparent start="{\%(@snippet\>\)\@!" end="}" contains=javaSnippetSkipBlock,javaDocSnippetTag,javaCommentMarkupTag
337 syn region javaDocSnippetTag contained start="{@snippet\>" end="}" contains=javaDocSnippetTag,javaSnippetSkipBlock,javaDocSnippetTagAttr,javaCommentMarkupTag
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300338
Bram Moolenaar071d4272004-06-13 20:20:40 +0000339 syntax case match
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200340 hi def link javaDocComment Comment
341 hi def link javaCommentTitle SpecialComment
342 hi def link javaDocTags Special
343 hi def link javaDocCodeTag Special
344 hi def link javaDocSnippetTag Special
345 hi def link javaDocSeeTagParam Function
346 hi def link javaDocParam Function
Bram Moolenaar071d4272004-06-13 20:20:40 +0000347endif
348
349" match the special comment /**/
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200350syn match javaComment "/\*\*/"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000351
352" Strings and constants
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200353syn match javaSpecialError contained "\\."
Bram Moolenaar071d4272004-06-13 20:20:40 +0000354syn match javaSpecialCharError contained "[^']"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300355" Escape Sequences (JLS-17, §3.10.7):
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200356syn match javaSpecialChar contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000357syn region javaString start=+"+ end=+"+ end=+$+ contains=javaSpecialChar,javaSpecialError,@Spell
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300358syn region javaString start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecialChar,javaSpecialError,javaTextBlockError,@Spell
359syn match javaTextBlockError +"""\s*"""+
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200360syn region javaStrTemplEmbExp contained matchgroup=javaStrTempl start="\\{" end="}" contains=TOP
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300361exec 'syn region javaStrTempl start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,@Spell'
362exec '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'
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200363syn match javaCharacter "'[^']*'" contains=javaSpecialChar,javaSpecialCharError
364syn match javaCharacter "'\\''" contains=javaSpecialChar
365syn match javaCharacter "'[^\\]'"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300366" Integer literals (JLS-17, §3.10.1):
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200367syn keyword javaNumber 0 0l 0L
368syn match javaNumber "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300369" Decimal floating-point literals (JLS-17, §3.10.2):
370" Against "\<\d\+\>\.":
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200371syn match javaNumber "\<\d\%(_*\d\)*\."
372syn match javaNumber "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
373syn match javaNumber "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
374syn match javaNumber "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300375" Hexadecimal floating-point literals (JLS-17, §3.10.2):
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200376syn match javaNumber "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000377
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300378" Unicode characters
379syn match javaSpecial "\\u\x\x\x\x"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000380
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200381" Method declarations (JLS-17, §8.4.3, §8.4.4, §9.4).
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200382if exists("g:java_highlight_functions")
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200383 syn cluster javaFuncParams contains=javaAnnotation,@javaClasses,javaGenerics,javaType,javaVarArg,javaComment,javaLineComment
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200384
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200385 if exists("g:java_highlight_signature")
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200386 syn cluster javaFuncParams add=javaParamModifier
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200387 hi def link javaFuncDefStart javaFuncDef
388 else
389 syn cluster javaFuncParams add=javaScopeDecl,javaConceptKind,javaStorageClass,javaExternal
390 endif
391
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200392 if g:java_highlight_functions =~# '^indent[1-8]\=$'
393 let s:last = g:java_highlight_functions[-1 :]
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300394 let s:indent = s:last != 't' ? repeat("\x20", s:last) : "\t"
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300395 " Try to not match other type members, initialiser blocks, enum
396 " constants (JLS-17, §8.9.1), and constructors (JLS-17, §8.1.7):
397 " at any _conventional_ indentation, skip over all fields with
398 " "[^=]*", all records with "\<record\s", and let the "*Skip*"
399 " definitions take care of constructor declarations and enum
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200400 " constants (with no support for @Foo(value = "bar")). Also,
401 " reject inlined declarations with "[^{]" for signature.
402 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 +0300403 " As long as package-private constructors cannot be matched with
404 " javaFuncDef, do not look with javaConstructorSkipDeclarator for
405 " them.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200406 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'
407 " With a zero-width span for signature applicable on demand to
408 " javaFuncDef, make related adjustments:
409 " (1) Claim all enum constants of a line as a unit.
410 exec 'syn match javaEnumSkipConstant contained transparent /^' . s:indent . '\%(\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)*\K\k*\s*\%((.*)\)\=\s*[,;({]\s*\)\+/ contains=@javaEnumConstants'
411 " (2) Define a syntax group for top level enumerations and tell
412 " apart their constants from method declarations.
413 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'
414 " (3) Define a base variant of javaParenT without using @javaTop
415 " in order to not include javaFuncDef.
416 syn region javaParenE transparent matchgroup=javaParen start="(" end=")" contains=@javaEnumConstants,javaInParen
417 syn region javaParenE transparent matchgroup=javaParen start="\[" end="\]" contains=@javaEnumConstants
418 syn cluster javaEnumConstants contains=TOP,javaTopEnumDeclaration,javaFuncDef,javaParenT
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300419 unlet s:indent s:last
Bram Moolenaar071d4272004-06-13 20:20:40 +0000420 else
Aliaksei Budavei40524742024-04-14 19:57:00 +0300421 " This is the "style" variant (:help ft-java-syntax).
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200422
423 " Match arbitrarily indented camelCasedName method declarations.
424 " Match: [@ɐ] [abstract] [<α, β>] Τʬ[<γ>][[][]] μʭʭ(/* ... */);
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200425 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 +0000426 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000427endif
428
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200429if exists("g:java_highlight_debug")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000430 " Strings and constants
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300431 syn match javaDebugSpecial contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200432 syn region javaDebugString contained start=+"+ end=+"+ contains=javaDebugSpecial
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300433 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 +0300434 " The highlight groups of java{StrTempl,Debug{,Paren,StrTempl}}\,
435 " share one colour by default. Do not conflate unrelated parens.
436 syn region javaDebugStrTemplEmbExp contained matchgroup=javaDebugStrTempl start="\\{" end="}" contains=javaComment,javaLineComment,javaDebug\%(Paren\)\@!.*
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300437 exec 'syn region javaDebugStrTempl contained start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ contains=javaDebugStrTemplEmbExp,javaDebugSpecial'
438 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 +0300439 syn match javaDebugTextBlockError contained +"""\s*"""+
Bram Moolenaar071d4272004-06-13 20:20:40 +0000440 syn match javaDebugCharacter contained "'[^\\]'"
441 syn match javaDebugSpecialCharacter contained "'\\.'"
442 syn match javaDebugSpecialCharacter contained "'\\''"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300443 syn keyword javaDebugNumber contained 0 0l 0L
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300444 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\."
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300445 syn match javaDebugNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
446 syn match javaDebugNumber contained "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
447 syn match javaDebugNumber contained "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
448 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
449 syn match javaDebugNumber contained "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000450 syn keyword javaDebugBoolean contained true false
451 syn keyword javaDebugType contained null this super
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200452 syn region javaDebugParen contained start=+(+ end=+)+ contains=javaDebug.*,javaDebugParen
Bram Moolenaar071d4272004-06-13 20:20:40 +0000453
Aliaksei Budavei40524742024-04-14 19:57:00 +0300454 " To make this work, define the highlighting for these groups.
455 syn match javaDebug "\<System\.\%(out\|err\)\.print\%(ln\)\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
456" FIXME: What API does "p" belong to?
457" syn match javaDebug "\<p\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
458 syn match javaDebug "\<\K\k*\.printStackTrace\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
459" FIXME: What API do "trace*" belong to?
460" syn match javaDebug "\<trace[SL]\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
Bram Moolenaar071d4272004-06-13 20:20:40 +0000461
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200462 hi def link javaDebug Debug
463 hi def link javaDebugString DebugString
464 hi def link javaDebugStrTempl Macro
465 hi def link javaDebugTextBlockError Error
466 hi def link javaDebugType DebugType
467 hi def link javaDebugBoolean DebugBoolean
468 hi def link javaDebugNumber Debug
469 hi def link javaDebugSpecial DebugSpecial
470 hi def link javaDebugSpecialCharacter DebugSpecial
471 hi def link javaDebugCharacter DebugString
472 hi def link javaDebugParen Debug
Bram Moolenaar071d4272004-06-13 20:20:40 +0000473
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200474 hi def link DebugString String
475 hi def link DebugSpecial Special
476 hi def link DebugBoolean Boolean
477 hi def link DebugType Type
Bram Moolenaar071d4272004-06-13 20:20:40 +0000478endif
479
Aliaksei Budavei94c5d8a2024-06-19 20:10:47 +0200480" Try not to fold top-level-type bodies under assumption that there is
481" but one such body.
482exec 'syn region javaBlock transparent start="\%(^\|^\S[^:]\+\)\@' . s:ff.Peek('120', '') . '<!{" end="}" fold'
483
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200484if exists("g:java_mark_braces_in_parens_as_errors")
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300485 syn match javaInParen contained "[{}]"
486 hi def link javaInParen javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000487endif
488
489" catch errors caused by wrong parenthesis
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200490syn region javaParenT transparent matchgroup=javaParen start="(" end=")" contains=@javaTop,javaInParen,javaParenT1
491syn region javaParenT1 contained transparent matchgroup=javaParen1 start="(" end=")" contains=@javaTop,javaInParen,javaParenT2
492syn region javaParenT2 contained transparent matchgroup=javaParen2 start="(" end=")" contains=@javaTop,javaInParen,javaParenT
493syn match javaParenError ")"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000494" catch errors caused by wrong square parenthesis
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200495syn region javaParenT transparent matchgroup=javaParen start="\[" end="\]" contains=@javaTop,javaParenT1
496syn region javaParenT1 contained transparent matchgroup=javaParen1 start="\[" end="\]" contains=@javaTop,javaParenT2
497syn region javaParenT2 contained transparent matchgroup=javaParen2 start="\[" end="\]" contains=@javaTop,javaParenT
498syn match javaParenError "\]"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000499
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200500" Lambda expressions (JLS-17, §15.27) and method reference expressions
501" (JLS-17, §15.13).
502if exists("g:java_highlight_functions")
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200503 syn match javaMethodRef ":::\@!"
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200504
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200505 if exists("g:java_highlight_signature")
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200506 let s:ff.LambdaDef = s:ff.LeftConstant
507 else
508 let s:ff.LambdaDef = s:ff.RightConstant
509 endif
510
Aliaksei Budavei40524742024-04-14 19:57:00 +0300511 " Make ()-matching definitions after the parenthesis error catcher.
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300512 "
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200513 " Note that here and elsewhere a single-line token is used for \z,
514 " with other tokens repeated as necessary, to overcome the lack of
515 " support for multi-line matching with \z.
516 "
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300517 " Match: ([@A [@B ...] final] var a[, var b, ...]) ->
518 " | ([@A [@B ...] final] T[<α>][[][]] a[, T b, ...]) ->
519 " There is no recognition of expressions interspersed with comments
520 " or of expressions whose parameterised parameter types are written
521 " across multiple lines.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200522 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 +0300523 " Match: () ->
524 " | (a[, b, ...]) ->
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200525 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 +0300526 " Match: a ->
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200527 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 +0300528
529 syn keyword javaParamModifier contained final
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300530 syn keyword javaLambdaVarType contained var
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200531 hi def link javaParamModifier javaConceptKind
532 hi def link javaLambdaVarType javaOperator
533 hi def link javaLambdaDef javaFuncDef
534 hi def link javaLambdaDefStart javaFuncDef
535 hi def link javaMethodRef javaFuncDef
536 hi def link javaFuncDef Function
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100537endif
538
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300539" The @javaTop cluster comprises non-contained Java syntax groups.
540" Note that the syntax file "aidl.vim" relies on its availability.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200541syn cluster javaTop contains=TOP,javaTopEnumDeclaration
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300542
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200543if !exists("g:java_minlines")
544 let g:java_minlines = 10
Bram Moolenaar071d4272004-06-13 20:20:40 +0000545endif
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300546
547" Note that variations of a /*/ balanced comment, e.g., /*/*/, /*//*/,
548" /* /*/, /* /*/, etc., may have their rightmost /*/ part accepted
549" as a comment start by ':syntax sync ccomment'; consider alternatives
550" to make synchronisation start further towards file's beginning by
551" bumping up g:java_minlines or issuing ':syntax sync fromstart' or
552" preferring &foldmethod set to 'syntax'.
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200553exec "syn sync ccomment javaComment minlines=" . g:java_minlines
Bram Moolenaar071d4272004-06-13 20:20:40 +0000554
555" The default highlighting.
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200556hi def link javaVarArg Function
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200557hi def link javaBranch Conditional
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200558hi def link javaConditional Conditional
559hi def link javaRepeat Repeat
560hi def link javaExceptions Exception
561hi def link javaAssert Statement
562hi def link javaStorageClass StorageClass
563hi def link javaMethodDecl javaStorageClass
564hi def link javaClassDecl javaStorageClass
565hi def link javaScopeDecl javaStorageClass
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100566hi def link javaConceptKind NonText
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200567
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200568hi def link javaBoolean Boolean
569hi def link javaSpecial Special
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200570hi def link javaSpecialError Error
571hi def link javaSpecialCharError Error
572hi def link javaString String
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300573hi def link javaStrTempl Macro
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200574hi def link javaCharacter Character
575hi def link javaSpecialChar SpecialChar
576hi def link javaNumber Number
577hi def link javaError Error
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200578hi def link javaError2 javaError
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300579hi def link javaTextBlockError Error
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200580hi def link javaParenError javaError
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200581hi def link javaStatement Statement
582hi def link javaOperator Operator
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200583hi def link javaConstant Constant
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200584hi def link javaTypedef Typedef
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200585hi def link javaTodo Todo
586hi def link javaAnnotation PreProc
Aliaksei Budavei902b7662024-06-13 18:30:09 +0300587hi def link javaAnnotationStart javaAnnotation
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200588hi def link javaType Type
589hi def link javaExternal Include
Bram Moolenaar071d4272004-06-13 20:20:40 +0000590
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200591hi def link javaUserLabel Label
592hi def link javaUserLabelRef javaUserLabel
593hi def link javaLabel Label
594hi def link javaLabelDefault javaLabel
595hi def link javaLabelVarType javaOperator
596hi def link javaLabelNumber javaNumber
597hi def link javaLabelCastType javaType
Bram Moolenaar071d4272004-06-13 20:20:40 +0000598
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200599hi def link javaComment Comment
600hi def link javaCommentStar javaComment
601hi def link javaLineComment Comment
602hi def link javaCommentMarkupTagAttr javaHtmlArg
603hi def link javaCommentString javaString
604hi def link javaComment2String javaString
605hi def link javaCommentCharacter javaCharacter
606hi def link javaCommentError javaError
607hi def link javaCommentStart javaComment
608
609hi def link javaHtmlArg Type
610hi def link javaHtmlString String
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200611
Bram Moolenaar071d4272004-06-13 20:20:40 +0000612let b:current_syntax = "java"
613
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200614if g:main_syntax == 'java'
615 unlet g:main_syntax
Bram Moolenaar071d4272004-06-13 20:20:40 +0000616endif
617
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200618let b:spell_options = "contained"
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +0200619let &cpo = s:cpo_save
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200620unlet s:ff s:cpo_save
Bram Moolenaar071d4272004-06-13 20:20:40 +0000621
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300622" See ":help vim9-mix".
623if !has("vim9script")
624 finish
625endif
626
627def! s:JavaSyntaxFoldTextExpr(): string
628 return getline(v:foldstart) !~ '/\*\+\s*$'
629 ? foldtext()
630 : printf('+-%s%3d lines: ',
631 v:folddashes,
632 (v:foldend - v:foldstart + 1)) ..
633 getline(v:foldstart + 1)
634enddef
635
636setlocal foldtext=s:JavaSyntaxFoldTextExpr()
637delfunction! g:JavaSyntaxFoldTextExpr
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300638" vim: sw=2 ts=8 noet sta