blob: 51ef8395b9f6ab36e0b6881b92397be4a9ddf53a [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 Budavei2750b832024-08-22 21:09:32 +02006" Last Change: 2024 Aug 22
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 Budavei2750b832024-08-22 21:09:32 +020042if exists("g:java_foldtext_show_first_or_second_line")
43 function! s:LazyPrefix(prefix, dashes, count) abort
44 return empty(a:prefix)
45 \ ? printf('+-%s%3d lines: ', a:dashes, a:count)
46 \ : a:prefix
47 endfunction
Aliaksei Budavei371bab02024-06-16 09:42:55 +030048
Aliaksei Budavei2750b832024-08-22 21:09:32 +020049 function! JavaSyntaxFoldTextExpr() abort
50 " Piggyback on NGETTEXT.
51 let summary = foldtext()
52 return getline(v:foldstart) !~ '/\*\+\s*$'
53 \ ? summary
54 \ : s:LazyPrefix(matchstr(summary, '^+-\+\s*\d\+\s.\{-1,}:\s'),
55 \ v:folddashes,
56 \ (v:foldend - v:foldstart + 1)) .
57 \ getline(v:foldstart + 1)
58 endfunction
59
60 " E120 for "fdt=s:JavaSyntaxFoldTextExpr()" before v8.2.3900.
61 setlocal foldtext=JavaSyntaxFoldTextExpr()
62endif
Aliaksei Budavei371bab02024-06-16 09:42:55 +030063
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020064" Admit the ASCII dollar sign to keyword characters (JLS-17, §3.8):
Aliaksei Budaveid3952e82024-05-11 00:39:31 +030065try
66 exec 'syntax iskeyword ' . &l:iskeyword . ',$'
67catch /\<E410:/
68 call s:ReportOnce(v:exception)
69 setlocal iskeyword+=$
70endtry
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020071
Bram Moolenaar071d4272004-06-13 20:20:40 +000072" some characters that cannot be in a java program (outside a string)
73syn match javaError "[\\@`]"
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +010074syn match javaError "<<<\|\.\.\|=>\|||=\|&&=\|\*\/"
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +020075
Bram Moolenaar071d4272004-06-13 20:20:40 +000076" use separate name so that it can be deleted in javacc.vim
77syn match javaError2 "#\|=<"
Bram Moolenaar071d4272004-06-13 20:20:40 +000078
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020079" Keywords (JLS-17, §3.9):
Bram Moolenaar071d4272004-06-13 20:20:40 +000080syn keyword javaExternal native package
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020081syn match javaExternal "\<import\>\%(\s\+static\>\)\="
Bram Moolenaar071d4272004-06-13 20:20:40 +000082syn keyword javaError goto const
83syn keyword javaConditional if else switch
84syn keyword javaRepeat while for do
85syn keyword javaBoolean true false
86syn keyword javaConstant null
87syn keyword javaTypedef this super
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020088syn keyword javaOperator new instanceof
89syn match javaOperator "\<var\>\%(\s*(\)\@!"
Aliaksei Budaveid3952e82024-05-11 00:39:31 +030090
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +010091" Since the yield statement, which could take a parenthesised operand,
92" and _qualified_ yield methods get along within the switch block
93" (JLS-17, §3.8), it seems futile to make a region definition for this
94" block; instead look for the _yield_ word alone, and if found,
95" backtrack (arbitrarily) 80 bytes, at most, on the matched line and,
96" if necessary, on the line before that (h: \@<=), trying to match
97" neither a method reference nor a qualified method invocation.
Aliaksei Budaveid3952e82024-05-11 00:39:31 +030098try
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +020099 syn match javaOperator "\%(\%(::\|\.\)[[:space:]\n]*\)\@80<!\<yield\>"
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300100 let s:ff.Peek = s:ff.LeftConstant
101catch /\<E59:/
102 call s:ReportOnce(v:exception)
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200103 syn match javaOperator "\%(\%(::\|\.\)[[:space:]\n]*\)\@<!\<yield\>"
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300104 let s:ff.Peek = s:ff.RightConstant
105endtry
106
Bram Moolenaar071d4272004-06-13 20:20:40 +0000107syn keyword javaType boolean char byte short int long float double
108syn keyword javaType void
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100109syn keyword javaStatement return
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200110syn keyword javaStorageClass static synchronized transient volatile strictfp
Bram Moolenaar071d4272004-06-13 20:20:40 +0000111syn keyword javaExceptions throw try catch finally
112syn keyword javaAssert assert
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200113syn keyword javaMethodDecl throws
114" Differentiate a "MyClass.class" literal from the keyword "class".
Bram Moolenaar071d4272004-06-13 20:20:40 +0000115syn match javaTypedef "\.\s*\<class\>"ms=s+1
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200116syn keyword javaClassDecl enum extends implements interface
117syn match javaClassDecl "\<permits\>\%(\s*(\)\@!"
118syn match javaClassDecl "\<record\>\%(\s*(\)\@!"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000119syn match javaClassDecl "^class\>"
120syn match javaClassDecl "[^.]\s*\<class\>"ms=s+1
Aliaksei Budavei40524742024-04-14 19:57:00 +0300121syn match javaAnnotation "@\%(\K\k*\.\)*\K\k*\>"
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300122syn 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 +0200123syn match javaClassDecl "@interface\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000124syn keyword javaBranch break continue nextgroup=javaUserLabelRef skipwhite
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200125syn match javaUserLabelRef contained "\k\+"
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000126syn match javaVarArg "\.\.\."
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200127syn keyword javaScopeDecl public protected private
128syn keyword javaConceptKind abstract final
129syn match javaConceptKind "\<non-sealed\>"
130syn match javaConceptKind "\<sealed\>\%(\s*(\)\@!"
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100131syn match javaConceptKind "\<default\>\%(\s*\%(:\|->\)\)\@!"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000132
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300133if !(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 Budavei9aabcef2024-07-31 22:14:37 +0200142if exists("g:java_highlight_signature")
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200143 let [s:ff.PeekTo, s:ff.PeekFrom, s:ff.GroupArgs] = repeat([s:ff.LeftConstant], 3)
144else
145 let [s:ff.PeekTo, s:ff.PeekFrom, s:ff.GroupArgs] = repeat([s:ff.RightConstant], 3)
146endif
147
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200148" Java module declarations (JLS-17, §7.7).
149"
150" Note that a "module-info" file will be recognised with an arbitrary
151" file extension (or no extension at all) so that more than one such
152" declaration for the same Java module can be maintained for modular
153" testing in a project without attendant confusion for IDEs, with the
154" ".java\=" extension used for a production version and an arbitrary
155" extension used for a testing version.
156if fnamemodify(bufname("%"), ":t") =~ '^module-info\%(\.class\>\)\@!'
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200157 syn keyword javaModuleStorageClass module transitive
158 syn keyword javaModuleStmt open requires exports opens uses provides
159 syn keyword javaModuleExternal to with
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200160 hi def link javaModuleStorageClass StorageClass
161 hi def link javaModuleStmt Statement
162 hi def link javaModuleExternal Include
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200163endif
164
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200165" Fancy parameterised types (JLS-17, §4.5).
166"
167" Note that false positives may elsewhere occur whenever an identifier
168" is butted against a less-than operator. Cf. (X<Y) and (X < Y).
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200169if exists("g:java_highlight_generics")
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200170 syn keyword javaWildcardBound contained extends super
171
172 " Parameterised types are delegated to javaGenerics (s:ctx.gsg) and
173 " are not matched with javaTypeArgument.
174 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*\>\)\%(\[\]\)*"'
175
176 for s:ctx in [{'dsg': 'javaDimExpr', 'gsg': 'javaGenerics', 'ghg': 'javaGenericsC1', 'csg': 'javaGenericsX', 'c': ''},
177 \ {'dsg': 'javaDimExprX', 'gsg': 'javaGenericsX', 'ghg': 'javaGenericsC2', 'csg': 'javaGenerics', 'c': ' contained'}]
178 " Consider array creation expressions of reifiable types.
179 exec 'syn region ' . s:ctx.dsg . ' contained transparent matchgroup=' . s:ctx.ghg . ' start="\[" end="\]" nextgroup=' . s:ctx.dsg . ' skipwhite skipnl'
180 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'
181 endfor
182
183 unlet s:ctx
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200184 hi def link javaWildcardBound Question
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200185 hi def link javaGenericsC1 Function
186 hi def link javaGenericsC2 Type
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200187endif
188
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200189if exists("g:java_highlight_java_lang_ids")
190 let g:java_highlight_all = 1
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000191endif
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200192if exists("g:java_highlight_all") || exists("g:java_highlight_java") || exists("g:java_highlight_java_lang")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000193 " java.lang.*
Bram Moolenaar63f32602022-06-09 20:45:54 +0100194 "
195 " The keywords of javaR_JavaLang, javaC_JavaLang, javaE_JavaLang,
196 " and javaX_JavaLang are sub-grouped according to the Java version
197 " of their introduction, and sub-group keywords (that is, class
198 " names) are arranged in alphabetical order, so that future newer
199 " keywords can be pre-sorted and appended without disturbing
200 " the current keyword placement. The below _match_es follow suit.
201
Aliaksei Budavei63d68c22024-03-26 20:12:05 +0300202 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 +0000203 syn cluster javaClasses add=javaR_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200204 hi def link javaR_JavaLang javaR_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100205 " Member enumerations:
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300206 exec 'syn match javaC_JavaLang "\%(\<Thread\.\)\@' . s:ff.Peek('7', '') . '<=\<State\>"'
207 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<UnicodeScript\>"'
208 exec 'syn match javaC_JavaLang "\%(\<ProcessBuilder\.Redirect\.\)\@' . s:ff.Peek('24', '') . '<=\<Type\>"'
209 exec 'syn match javaC_JavaLang "\%(\<StackWalker\.\)\@' . s:ff.Peek('12', '') . '<=\<Option\>"'
210 exec 'syn match javaC_JavaLang "\%(\<System\.Logger\.\)\@' . s:ff.Peek('14', '') . '<=\<Level\>"'
Bram Moolenaar63f32602022-06-09 20:45:54 +0100211 " Member classes:
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300212 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<Subset\>"'
213 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<UnicodeBlock\>"'
214 exec 'syn match javaC_JavaLang "\%(\<ProcessBuilder\.\)\@' . s:ff.Peek('15', '') . '<=\<Redirect\>"'
215 exec 'syn match javaC_JavaLang "\%(\<ModuleLayer\.\)\@' . s:ff.Peek('12', '') . '<=\<Controller\>"'
216 exec 'syn match javaC_JavaLang "\%(\<Runtime\.\)\@' . s:ff.Peek('8', '') . '<=\<Version\>"'
217 exec 'syn match javaC_JavaLang "\%(\<System\.\)\@' . s:ff.Peek('7', '') . '<=\<LoggerFinder\>"'
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200218 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 +0100219 syn match javaC_JavaLang "\<System\>" " See javaDebug.
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200220
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200221 if !exists("g:java_highlight_generics")
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200222 " The non-interface parameterised names of java.lang members.
223 exec 'syn match javaC_JavaLang "\%(\<Enum\.\)\@' . s:ff.Peek('5', '') . '<=\<EnumDesc\>"'
224 syn keyword javaC_JavaLang Class InheritableThreadLocal ThreadLocal Enum ClassValue
225 endif
226
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200227 " As of JDK 21, java.lang.Compiler is no more (deprecated in JDK 9).
Aliaksei Budavei63d68c22024-03-26 20:12:05 +0300228 syn keyword javaLangDeprecated Compiler
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000229 syn cluster javaClasses add=javaC_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200230 hi def link javaC_JavaLang javaC_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100231 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 +0000232 syn cluster javaClasses add=javaE_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200233 hi def link javaE_JavaLang javaE_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100234 syn keyword javaX_JavaLang ClassNotFoundException CloneNotSupportedException Exception IllegalAccessException InstantiationException InterruptedException NoSuchMethodException Throwable NoSuchFieldException ReflectiveOperationException
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000235 syn cluster javaClasses add=javaX_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200236 hi def link javaX_JavaLang javaX_Java
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000237
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200238 hi def link javaR_Java javaR_
239 hi def link javaC_Java javaC_
240 hi def link javaE_Java javaE_
241 hi def link javaX_Java javaX_
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200242 hi def link javaX_ javaExceptions
243 hi def link javaR_ javaExceptions
244 hi def link javaE_ javaExceptions
245 hi def link javaC_ javaConstant
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000246
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200247 syn keyword javaLangObject getClass notify notifyAll wait
248
249 " Lower the syntax priority of overridable java.lang.Object method
250 " names for zero-width matching (define g:java_highlight_signature
251 " and see their base declarations for java.lang.Object):
252 syn match javaLangObject "\<clone\>"
253 syn match javaLangObject "\<equals\>"
254 syn match javaLangObject "\<finalize\>"
255 syn match javaLangObject "\<hashCode\>"
256 syn match javaLangObject "\<toString\>"
257 hi def link javaLangObject javaConstant
Bram Moolenaar071d4272004-06-13 20:20:40 +0000258endif
259
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300260if filereadable(expand("<sfile>:p:h") . "/javaid.vim")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000261 source <sfile>:p:h/javaid.vim
262endif
263
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200264if exists("g:java_space_errors")
265 if !exists("g:java_no_trail_space_error")
266 syn match javaSpaceError "\s\+$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000267 endif
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200268 if !exists("g:java_no_tab_space_error")
269 syn match javaSpaceError " \+\t"me=e-1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000270 endif
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200271 hi def link javaSpaceError Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000272endif
273
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200274exec 'syn match javaUserLabel "^\s*\<\K\k*\>\%(\<default\>\)\@' . s:ff.Peek('7', '') . '<!\s*::\@!"he=e-1'
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200275syn 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 +0100276syn region javaLabelRegion transparent matchgroup=javaLabel start="\<default\>\%(\s*\%(:\|->\)\)\@=" matchgroup=NONE end=":\|->" oneline
277" Consider grouped _default_ _case_ labels, i.e.
278" case null, default ->
279" case null: default:
280syn keyword javaLabelDefault contained default
281syn keyword javaLabelVarType contained var
282syn keyword javaLabelCastType contained char byte short int
283" Allow for the contingency of the enclosing region not being able to
284" _keep_ its _end_, e.g. case ':':.
Aliaksei Budaveid6b4afb2024-06-09 19:39:52 +0300285syn 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 +0100286syn match javaLabelNumber contained "\<0\>[lL]\@!"
287syn match javaLabelNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)\>[lL]\@!"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000288
Bram Moolenaar071d4272004-06-13 20:20:40 +0000289" Comments
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200290syn keyword javaTodo contained TODO FIXME XXX
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300291
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200292if exists("g:java_comment_strings")
293 syn region javaCommentString contained start=+"+ end=+"+ end=+$+ end=+\*/+me=s-1,he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell
294 syn region javaCommentString contained start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell,javaSpecialError,javaTextBlockError
295 syn region javaComment2String contained start=+"+ end=+$\|"+ contains=javaSpecial,javaSpecialChar,@Spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000296 syn match javaCommentCharacter contained "'\\[^']\{1,6\}'" contains=javaSpecialChar
297 syn match javaCommentCharacter contained "'\\''" contains=javaSpecialChar
298 syn match javaCommentCharacter contained "'[^\\]'"
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300299 syn cluster javaCommentSpecial add=javaCommentString,javaCommentCharacter,javaNumber,javaStrTempl
300 syn cluster javaCommentSpecial2 add=javaComment2String,javaCommentCharacter,javaNumber,javaStrTempl
Bram Moolenaar071d4272004-06-13 20:20:40 +0000301endif
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300302
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200303syn region javaComment matchgroup=javaCommentStart start="/\*" end="\*/" contains=@javaCommentSpecial,javaTodo,javaCommentError,javaSpaceError,@Spell fold
304syn match javaCommentStar contained "^\s*\*[^/]"me=e-1
305syn match javaCommentStar contained "^\s*\*$"
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300306syn match javaLineComment "//.*" contains=@javaCommentSpecial2,javaTodo,javaCommentMarkupTag,javaSpaceError,@Spell
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300307syn match javaCommentMarkupTag contained "@\%(end\|highlight\|link\|replace\|start\)\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
308syn match javaCommentMarkupTagAttr contained "\<region\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200309exec '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 +0300310syn match javaCommentError contained "/\*"me=e-1 display
Bram Moolenaar071d4272004-06-13 20:20:40 +0000311
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200312if !exists("g:java_ignore_javadoc") && g:main_syntax != 'jsp'
Aliaksei Budavei3749dff2024-07-31 22:13:25 +0200313 " The overridable "html*" default links must be defined _before_ the
314 " inclusion of the same default links from "html.vim".
315 hi def link htmlComment Special
316 hi def link htmlCommentPart Special
317 hi def link htmlArg Type
318 hi def link htmlString String
Bram Moolenaar071d4272004-06-13 20:20:40 +0000319 syntax case ignore
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300320
321 " Include HTML syntax coloring for Javadoc comments.
Bram Moolenaar63f32602022-06-09 20:45:54 +0100322 syntax include @javaHtml syntax/html.vim
Bram Moolenaar071d4272004-06-13 20:20:40 +0000323 unlet b:current_syntax
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300324
325 " HTML enables spell checking for all text that is not in a syntax
326 " item (:syntax spell toplevel); instead, limit spell checking to
327 " items matchable with syntax groups containing the @Spell cluster.
328 try
329 syntax spell default
330 catch /\<E390:/
331 call s:ReportOnce(v:exception)
332 endtry
Bram Moolenaar5c736222010-01-06 20:54:52 +0100333
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300334 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 +0300335 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 +0300336 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 +0300337 syn region javaDocTags contained start="{@\%(li\%(teral\|nk\%(plain\)\=\)\|inherit[Dd]oc\|doc[rR]oot\|value\)\>" end="}"
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300338 syn match javaDocTags contained "@\%(param\|exception\|throws\|since\)\s\+\S\+" contains=javaDocParam
339 syn match javaDocParam contained "\s\S\+"
340 syn match javaDocTags contained "@\%(version\|author\|return\|deprecated\|serial\%(Field\|Data\)\=\)\>"
341 syn region javaDocSeeTag contained matchgroup=javaDocTags start="@see\s\+" matchgroup=NONE end="\_."re=e-1 contains=javaDocSeeTagParam
342 syn match javaDocSeeTagParam contained @"\_[^"]\+"\|<a\s\+\_.\{-}</a>\|\%(\k\|\.\)*\%(#\k\+\%((\_[^)]*)\)\=\)\=@ contains=@javaHtml extend
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300343 syn region javaCodeSkipBlock contained transparent start="{\%(@code\>\)\@!" end="}" contains=javaCodeSkipBlock,javaDocCodeTag
344 syn region javaDocCodeTag contained start="{@code\>" end="}" contains=javaDocCodeTag,javaCodeSkipBlock
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200345 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 +0300346 syn region javaSnippetSkipBlock contained transparent start="{\%(@snippet\>\)\@!" end="}" contains=javaSnippetSkipBlock,javaDocSnippetTag,javaCommentMarkupTag
347 syn region javaDocSnippetTag contained start="{@snippet\>" end="}" contains=javaDocSnippetTag,javaSnippetSkipBlock,javaDocSnippetTagAttr,javaCommentMarkupTag
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300348
Bram Moolenaar071d4272004-06-13 20:20:40 +0000349 syntax case match
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200350 hi def link javaDocComment Comment
351 hi def link javaCommentTitle SpecialComment
352 hi def link javaDocTags Special
353 hi def link javaDocCodeTag Special
354 hi def link javaDocSnippetTag Special
355 hi def link javaDocSeeTagParam Function
356 hi def link javaDocParam Function
Bram Moolenaar071d4272004-06-13 20:20:40 +0000357endif
358
359" match the special comment /**/
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200360syn match javaComment "/\*\*/"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000361
362" Strings and constants
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200363syn match javaSpecialError contained "\\."
Bram Moolenaar071d4272004-06-13 20:20:40 +0000364syn match javaSpecialCharError contained "[^']"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300365" Escape Sequences (JLS-17, §3.10.7):
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200366syn match javaSpecialChar contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000367syn region javaString start=+"+ end=+"+ end=+$+ contains=javaSpecialChar,javaSpecialError,@Spell
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300368syn region javaString start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecialChar,javaSpecialError,javaTextBlockError,@Spell
369syn match javaTextBlockError +"""\s*"""+
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200370syn region javaStrTemplEmbExp contained matchgroup=javaStrTempl start="\\{" end="}" contains=TOP
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300371exec 'syn region javaStrTempl start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,@Spell'
372exec '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 +0200373syn match javaCharacter "'[^']*'" contains=javaSpecialChar,javaSpecialCharError
374syn match javaCharacter "'\\''" contains=javaSpecialChar
375syn match javaCharacter "'[^\\]'"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300376" Integer literals (JLS-17, §3.10.1):
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200377syn keyword javaNumber 0 0l 0L
378syn match javaNumber "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300379" Decimal floating-point literals (JLS-17, §3.10.2):
380" Against "\<\d\+\>\.":
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200381syn match javaNumber "\<\d\%(_*\d\)*\."
382syn match javaNumber "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
383syn match javaNumber "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
384syn match javaNumber "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300385" Hexadecimal floating-point literals (JLS-17, §3.10.2):
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200386syn match javaNumber "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000387
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300388" Unicode characters
389syn match javaSpecial "\\u\x\x\x\x"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000390
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200391" Method declarations (JLS-17, §8.4.3, §8.4.4, §9.4).
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200392if exists("g:java_highlight_functions")
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200393 syn cluster javaFuncParams contains=javaAnnotation,@javaClasses,javaGenerics,javaType,javaVarArg,javaComment,javaLineComment
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200394
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200395 if exists("g:java_highlight_signature")
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200396 syn cluster javaFuncParams add=javaParamModifier
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200397 hi def link javaFuncDefStart javaFuncDef
398 else
399 syn cluster javaFuncParams add=javaScopeDecl,javaConceptKind,javaStorageClass,javaExternal
400 endif
401
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200402 if g:java_highlight_functions =~# '^indent[1-8]\=$'
403 let s:last = g:java_highlight_functions[-1 :]
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300404 let s:indent = s:last != 't' ? repeat("\x20", s:last) : "\t"
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300405 " Try to not match other type members, initialiser blocks, enum
406 " constants (JLS-17, §8.9.1), and constructors (JLS-17, §8.1.7):
407 " at any _conventional_ indentation, skip over all fields with
408 " "[^=]*", all records with "\<record\s", and let the "*Skip*"
409 " definitions take care of constructor declarations and enum
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200410 " constants (with no support for @Foo(value = "bar")). Also,
411 " reject inlined declarations with "[^{]" for signature.
412 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 +0300413 " As long as package-private constructors cannot be matched with
414 " javaFuncDef, do not look with javaConstructorSkipDeclarator for
415 " them.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200416 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'
417 " With a zero-width span for signature applicable on demand to
418 " javaFuncDef, make related adjustments:
419 " (1) Claim all enum constants of a line as a unit.
420 exec 'syn match javaEnumSkipConstant contained transparent /^' . s:indent . '\%(\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)*\K\k*\s*\%((.*)\)\=\s*[,;({]\s*\)\+/ contains=@javaEnumConstants'
421 " (2) Define a syntax group for top level enumerations and tell
422 " apart their constants from method declarations.
423 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'
424 " (3) Define a base variant of javaParenT without using @javaTop
425 " in order to not include javaFuncDef.
426 syn region javaParenE transparent matchgroup=javaParen start="(" end=")" contains=@javaEnumConstants,javaInParen
427 syn region javaParenE transparent matchgroup=javaParen start="\[" end="\]" contains=@javaEnumConstants
428 syn cluster javaEnumConstants contains=TOP,javaTopEnumDeclaration,javaFuncDef,javaParenT
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300429 unlet s:indent s:last
Bram Moolenaar071d4272004-06-13 20:20:40 +0000430 else
Aliaksei Budavei40524742024-04-14 19:57:00 +0300431 " This is the "style" variant (:help ft-java-syntax).
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200432
433 " Match arbitrarily indented camelCasedName method declarations.
434 " Match: [@ɐ] [abstract] [<α, β>] Τʬ[<γ>][[][]] μʭʭ(/* ... */);
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200435 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 +0000436 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000437endif
438
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200439if exists("g:java_highlight_debug")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000440 " Strings and constants
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300441 syn match javaDebugSpecial contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200442 syn region javaDebugString contained start=+"+ end=+"+ contains=javaDebugSpecial
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300443 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 +0300444 " The highlight groups of java{StrTempl,Debug{,Paren,StrTempl}}\,
445 " share one colour by default. Do not conflate unrelated parens.
446 syn region javaDebugStrTemplEmbExp contained matchgroup=javaDebugStrTempl start="\\{" end="}" contains=javaComment,javaLineComment,javaDebug\%(Paren\)\@!.*
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300447 exec 'syn region javaDebugStrTempl contained start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ contains=javaDebugStrTemplEmbExp,javaDebugSpecial'
448 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 +0300449 syn match javaDebugTextBlockError contained +"""\s*"""+
Bram Moolenaar071d4272004-06-13 20:20:40 +0000450 syn match javaDebugCharacter contained "'[^\\]'"
451 syn match javaDebugSpecialCharacter contained "'\\.'"
452 syn match javaDebugSpecialCharacter contained "'\\''"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300453 syn keyword javaDebugNumber contained 0 0l 0L
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300454 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\."
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300455 syn match javaDebugNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
456 syn match javaDebugNumber contained "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
457 syn match javaDebugNumber contained "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
458 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
459 syn match javaDebugNumber contained "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000460 syn keyword javaDebugBoolean contained true false
461 syn keyword javaDebugType contained null this super
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200462 syn region javaDebugParen contained start=+(+ end=+)+ contains=javaDebug.*,javaDebugParen
Bram Moolenaar071d4272004-06-13 20:20:40 +0000463
Aliaksei Budavei40524742024-04-14 19:57:00 +0300464 " To make this work, define the highlighting for these groups.
465 syn match javaDebug "\<System\.\%(out\|err\)\.print\%(ln\)\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
466" FIXME: What API does "p" belong to?
467" syn match javaDebug "\<p\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
468 syn match javaDebug "\<\K\k*\.printStackTrace\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
469" FIXME: What API do "trace*" belong to?
470" syn match javaDebug "\<trace[SL]\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
Bram Moolenaar071d4272004-06-13 20:20:40 +0000471
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200472 hi def link javaDebug Debug
473 hi def link javaDebugString DebugString
474 hi def link javaDebugStrTempl Macro
475 hi def link javaDebugTextBlockError Error
476 hi def link javaDebugType DebugType
477 hi def link javaDebugBoolean DebugBoolean
478 hi def link javaDebugNumber Debug
479 hi def link javaDebugSpecial DebugSpecial
480 hi def link javaDebugSpecialCharacter DebugSpecial
481 hi def link javaDebugCharacter DebugString
482 hi def link javaDebugParen Debug
Bram Moolenaar071d4272004-06-13 20:20:40 +0000483
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200484 hi def link DebugString String
485 hi def link DebugSpecial Special
486 hi def link DebugBoolean Boolean
487 hi def link DebugType Type
Bram Moolenaar071d4272004-06-13 20:20:40 +0000488endif
489
Aliaksei Budavei94c5d8a2024-06-19 20:10:47 +0200490" Try not to fold top-level-type bodies under assumption that there is
491" but one such body.
492exec 'syn region javaBlock transparent start="\%(^\|^\S[^:]\+\)\@' . s:ff.Peek('120', '') . '<!{" end="}" fold'
493
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200494if exists("g:java_mark_braces_in_parens_as_errors")
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300495 syn match javaInParen contained "[{}]"
496 hi def link javaInParen javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000497endif
498
499" catch errors caused by wrong parenthesis
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200500syn region javaParenT transparent matchgroup=javaParen start="(" end=")" contains=@javaTop,javaInParen,javaParenT1
501syn region javaParenT1 contained transparent matchgroup=javaParen1 start="(" end=")" contains=@javaTop,javaInParen,javaParenT2
502syn region javaParenT2 contained transparent matchgroup=javaParen2 start="(" end=")" contains=@javaTop,javaInParen,javaParenT
503syn match javaParenError ")"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000504" catch errors caused by wrong square parenthesis
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200505syn region javaParenT transparent matchgroup=javaParen start="\[" end="\]" contains=@javaTop,javaParenT1
506syn region javaParenT1 contained transparent matchgroup=javaParen1 start="\[" end="\]" contains=@javaTop,javaParenT2
507syn region javaParenT2 contained transparent matchgroup=javaParen2 start="\[" end="\]" contains=@javaTop,javaParenT
508syn match javaParenError "\]"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000509
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200510" Lambda expressions (JLS-17, §15.27) and method reference expressions
511" (JLS-17, §15.13).
512if exists("g:java_highlight_functions")
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200513 syn match javaMethodRef ":::\@!"
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200514
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200515 if exists("g:java_highlight_signature")
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200516 let s:ff.LambdaDef = s:ff.LeftConstant
517 else
518 let s:ff.LambdaDef = s:ff.RightConstant
519 endif
520
Aliaksei Budavei40524742024-04-14 19:57:00 +0300521 " Make ()-matching definitions after the parenthesis error catcher.
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300522 "
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200523 " Note that here and elsewhere a single-line token is used for \z,
524 " with other tokens repeated as necessary, to overcome the lack of
525 " support for multi-line matching with \z.
526 "
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300527 " Match: ([@A [@B ...] final] var a[, var b, ...]) ->
528 " | ([@A [@B ...] final] T[<α>][[][]] a[, T b, ...]) ->
529 " There is no recognition of expressions interspersed with comments
530 " or of expressions whose parameterised parameter types are written
531 " across multiple lines.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200532 exec 'syn ' . s:ff.LambdaDef('region javaLambdaDef transparent matchgroup=javaLambdaDefStart start=/', 'match javaLambdaDef "') . '\k\@' . s:ff.Peek('4', '') . '<!(' . s:ff.LambdaDef('\%(', '') . '[[:space:]\n]*\%(\%(@\%(\K\k*\.\)*\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 +0300533 " Match: () ->
534 " | (a[, b, ...]) ->
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200535 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 +0300536 " Match: a ->
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200537 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 +0300538
539 syn keyword javaParamModifier contained final
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300540 syn keyword javaLambdaVarType contained var
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200541 hi def link javaParamModifier javaConceptKind
542 hi def link javaLambdaVarType javaOperator
543 hi def link javaLambdaDef javaFuncDef
544 hi def link javaLambdaDefStart javaFuncDef
545 hi def link javaMethodRef javaFuncDef
546 hi def link javaFuncDef Function
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100547endif
548
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300549" The @javaTop cluster comprises non-contained Java syntax groups.
550" Note that the syntax file "aidl.vim" relies on its availability.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200551syn cluster javaTop contains=TOP,javaTopEnumDeclaration
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300552
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200553if !exists("g:java_minlines")
554 let g:java_minlines = 10
Bram Moolenaar071d4272004-06-13 20:20:40 +0000555endif
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300556
557" Note that variations of a /*/ balanced comment, e.g., /*/*/, /*//*/,
558" /* /*/, /* /*/, etc., may have their rightmost /*/ part accepted
559" as a comment start by ':syntax sync ccomment'; consider alternatives
560" to make synchronisation start further towards file's beginning by
561" bumping up g:java_minlines or issuing ':syntax sync fromstart' or
562" preferring &foldmethod set to 'syntax'.
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200563exec "syn sync ccomment javaComment minlines=" . g:java_minlines
Bram Moolenaar071d4272004-06-13 20:20:40 +0000564
565" The default highlighting.
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200566hi def link javaVarArg Function
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200567hi def link javaBranch Conditional
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200568hi def link javaConditional Conditional
569hi def link javaRepeat Repeat
570hi def link javaExceptions Exception
571hi def link javaAssert Statement
572hi def link javaStorageClass StorageClass
573hi def link javaMethodDecl javaStorageClass
574hi def link javaClassDecl javaStorageClass
575hi def link javaScopeDecl javaStorageClass
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100576hi def link javaConceptKind NonText
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200577
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200578hi def link javaBoolean Boolean
579hi def link javaSpecial Special
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200580hi def link javaSpecialError Error
581hi def link javaSpecialCharError Error
582hi def link javaString String
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300583hi def link javaStrTempl Macro
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200584hi def link javaCharacter Character
585hi def link javaSpecialChar SpecialChar
586hi def link javaNumber Number
587hi def link javaError Error
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200588hi def link javaError2 javaError
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300589hi def link javaTextBlockError Error
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200590hi def link javaParenError javaError
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200591hi def link javaStatement Statement
592hi def link javaOperator Operator
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200593hi def link javaConstant Constant
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200594hi def link javaTypedef Typedef
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200595hi def link javaTodo Todo
596hi def link javaAnnotation PreProc
Aliaksei Budavei902b7662024-06-13 18:30:09 +0300597hi def link javaAnnotationStart javaAnnotation
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200598hi def link javaType Type
599hi def link javaExternal Include
Bram Moolenaar071d4272004-06-13 20:20:40 +0000600
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200601hi def link javaUserLabel Label
602hi def link javaUserLabelRef javaUserLabel
603hi def link javaLabel Label
604hi def link javaLabelDefault javaLabel
605hi def link javaLabelVarType javaOperator
606hi def link javaLabelNumber javaNumber
607hi def link javaLabelCastType javaType
Bram Moolenaar071d4272004-06-13 20:20:40 +0000608
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200609hi def link javaComment Comment
610hi def link javaCommentStar javaComment
611hi def link javaLineComment Comment
612hi def link javaCommentMarkupTagAttr javaHtmlArg
613hi def link javaCommentString javaString
614hi def link javaComment2String javaString
615hi def link javaCommentCharacter javaCharacter
616hi def link javaCommentError javaError
617hi def link javaCommentStart javaComment
618
619hi def link javaHtmlArg Type
620hi def link javaHtmlString String
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200621
Bram Moolenaar071d4272004-06-13 20:20:40 +0000622let b:current_syntax = "java"
623
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200624if g:main_syntax == 'java'
625 unlet g:main_syntax
Bram Moolenaar071d4272004-06-13 20:20:40 +0000626endif
627
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200628let b:spell_options = "contained"
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +0200629let &cpo = s:cpo_save
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200630unlet s:ff s:cpo_save
Bram Moolenaar071d4272004-06-13 20:20:40 +0000631
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300632" See ":help vim9-mix".
633if !has("vim9script")
634 finish
635endif
636
Aliaksei Budavei2750b832024-08-22 21:09:32 +0200637if exists("g:java_foldtext_show_first_or_second_line")
638 def! s:LazyPrefix(prefix: string, dashes: string, count: number): string
639 return empty(prefix)
640 ? printf('+-%s%3d lines: ', dashes, count)
641 : prefix
642 enddef
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300643
Aliaksei Budavei2750b832024-08-22 21:09:32 +0200644 def! s:JavaSyntaxFoldTextExpr(): string
645 # Piggyback on NGETTEXT.
646 const summary: string = foldtext()
647 return getline(v:foldstart) !~ '/\*\+\s*$'
648 ? summary
649 : LazyPrefix(matchstr(summary, '^+-\+\s*\d\+\s.\{-1,}:\s'),
650 v:folddashes,
651 (v:foldend - v:foldstart + 1)) ..
652 getline(v:foldstart + 1)
653 enddef
654
655 setlocal foldtext=s:JavaSyntaxFoldTextExpr()
656 delfunction! g:JavaSyntaxFoldTextExpr
657endif
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300658" vim: sw=2 ts=8 noet sta