blob: 8aa053d522576e4375a7e92241cffa0b96460abd [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 Budavei8556e232024-08-27 22:32:13 +02006" Last Change: 2024 Aug 26
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
Aliaksei Budavei8556e232024-08-27 22:32:13 +020033function! s:ff.IsRequestedPreviewFeature(n) abort
34 return exists("g:java_syntax_previews") && index(g:java_syntax_previews, a:n) + 1
35endfunction
36
Aliaksei Budaveid3952e82024-05-11 00:39:31 +030037if !exists("*s:ReportOnce")
38 function s:ReportOnce(message) abort
39 echomsg 'syntax/java.vim: ' . a:message
40 endfunction
41else
42 function! s:ReportOnce(dummy)
43 endfunction
44endif
45
Aliaksei Budavei2750b832024-08-22 21:09:32 +020046if exists("g:java_foldtext_show_first_or_second_line")
47 function! s:LazyPrefix(prefix, dashes, count) abort
48 return empty(a:prefix)
49 \ ? printf('+-%s%3d lines: ', a:dashes, a:count)
50 \ : a:prefix
51 endfunction
Aliaksei Budavei371bab02024-06-16 09:42:55 +030052
Aliaksei Budavei2750b832024-08-22 21:09:32 +020053 function! JavaSyntaxFoldTextExpr() abort
54 " Piggyback on NGETTEXT.
55 let summary = foldtext()
56 return getline(v:foldstart) !~ '/\*\+\s*$'
57 \ ? summary
58 \ : s:LazyPrefix(matchstr(summary, '^+-\+\s*\d\+\s.\{-1,}:\s'),
59 \ v:folddashes,
60 \ (v:foldend - v:foldstart + 1)) .
61 \ getline(v:foldstart + 1)
62 endfunction
63
64 " E120 for "fdt=s:JavaSyntaxFoldTextExpr()" before v8.2.3900.
65 setlocal foldtext=JavaSyntaxFoldTextExpr()
66endif
Aliaksei Budavei371bab02024-06-16 09:42:55 +030067
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020068" Admit the ASCII dollar sign to keyword characters (JLS-17, §3.8):
Aliaksei Budaveid3952e82024-05-11 00:39:31 +030069try
70 exec 'syntax iskeyword ' . &l:iskeyword . ',$'
71catch /\<E410:/
72 call s:ReportOnce(v:exception)
73 setlocal iskeyword+=$
74endtry
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020075
Bram Moolenaar071d4272004-06-13 20:20:40 +000076" some characters that cannot be in a java program (outside a string)
77syn match javaError "[\\@`]"
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +010078syn match javaError "<<<\|\.\.\|=>\|||=\|&&=\|\*\/"
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +020079
Bram Moolenaar071d4272004-06-13 20:20:40 +000080" use separate name so that it can be deleted in javacc.vim
81syn match javaError2 "#\|=<"
Bram Moolenaar071d4272004-06-13 20:20:40 +000082
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020083" Keywords (JLS-17, §3.9):
Bram Moolenaar071d4272004-06-13 20:20:40 +000084syn keyword javaExternal native package
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020085syn match javaExternal "\<import\>\%(\s\+static\>\)\="
Bram Moolenaar071d4272004-06-13 20:20:40 +000086syn keyword javaError goto const
87syn keyword javaConditional if else switch
88syn keyword javaRepeat while for do
89syn keyword javaBoolean true false
90syn keyword javaConstant null
91syn keyword javaTypedef this super
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020092syn keyword javaOperator new instanceof
93syn match javaOperator "\<var\>\%(\s*(\)\@!"
Aliaksei Budaveid3952e82024-05-11 00:39:31 +030094
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +010095" Since the yield statement, which could take a parenthesised operand,
96" and _qualified_ yield methods get along within the switch block
97" (JLS-17, §3.8), it seems futile to make a region definition for this
98" block; instead look for the _yield_ word alone, and if found,
99" backtrack (arbitrarily) 80 bytes, at most, on the matched line and,
100" if necessary, on the line before that (h: \@<=), trying to match
101" neither a method reference nor a qualified method invocation.
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300102try
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200103 syn match javaOperator "\%(\%(::\|\.\)[[:space:]\n]*\)\@80<!\<yield\>"
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300104 let s:ff.Peek = s:ff.LeftConstant
105catch /\<E59:/
106 call s:ReportOnce(v:exception)
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200107 syn match javaOperator "\%(\%(::\|\.\)[[:space:]\n]*\)\@<!\<yield\>"
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300108 let s:ff.Peek = s:ff.RightConstant
109endtry
110
Bram Moolenaar071d4272004-06-13 20:20:40 +0000111syn keyword javaType boolean char byte short int long float double
112syn keyword javaType void
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100113syn keyword javaStatement return
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200114syn keyword javaStorageClass static synchronized transient volatile strictfp
Bram Moolenaar071d4272004-06-13 20:20:40 +0000115syn keyword javaExceptions throw try catch finally
116syn keyword javaAssert assert
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200117syn keyword javaMethodDecl throws
118" Differentiate a "MyClass.class" literal from the keyword "class".
Bram Moolenaar071d4272004-06-13 20:20:40 +0000119syn match javaTypedef "\.\s*\<class\>"ms=s+1
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200120syn keyword javaClassDecl enum extends implements interface
121syn match javaClassDecl "\<permits\>\%(\s*(\)\@!"
122syn match javaClassDecl "\<record\>\%(\s*(\)\@!"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000123syn match javaClassDecl "^class\>"
124syn match javaClassDecl "[^.]\s*\<class\>"ms=s+1
Aliaksei Budavei40524742024-04-14 19:57:00 +0300125syn match javaAnnotation "@\%(\K\k*\.\)*\K\k*\>"
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300126syn 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 +0200127syn match javaClassDecl "@interface\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000128syn keyword javaBranch break continue nextgroup=javaUserLabelRef skipwhite
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200129syn match javaUserLabelRef contained "\k\+"
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000130syn match javaVarArg "\.\.\."
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200131syn keyword javaScopeDecl public protected private
132syn keyword javaConceptKind abstract final
133syn match javaConceptKind "\<non-sealed\>"
134syn match javaConceptKind "\<sealed\>\%(\s*(\)\@!"
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100135syn match javaConceptKind "\<default\>\%(\s*\%(:\|->\)\)\@!"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000136
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300137if !(v:version < 704)
138 " Request the new regexp engine for [:upper:] and [:lower:].
139 let [s:ff.Engine, s:ff.UpperCase, s:ff.LowerCase] = repeat([s:ff.LeftConstant], 3)
140else
141 " XXX: \C\<[^a-z0-9]\k*\> rejects "type", but matches "τύπος".
142 " XXX: \C\<[^A-Z0-9]\k*\> rejects "Method", but matches "Μέθοδος".
143 let [s:ff.Engine, s:ff.UpperCase, s:ff.LowerCase] = repeat([s:ff.RightConstant], 3)
144endif
Bram Moolenaar63f32602022-06-09 20:45:54 +0100145
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200146if exists("g:java_highlight_signature")
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200147 let [s:ff.PeekTo, s:ff.PeekFrom, s:ff.GroupArgs] = repeat([s:ff.LeftConstant], 3)
148else
149 let [s:ff.PeekTo, s:ff.PeekFrom, s:ff.GroupArgs] = repeat([s:ff.RightConstant], 3)
150endif
151
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200152" Java module declarations (JLS-17, §7.7).
153"
154" Note that a "module-info" file will be recognised with an arbitrary
155" file extension (or no extension at all) so that more than one such
156" declaration for the same Java module can be maintained for modular
157" testing in a project without attendant confusion for IDEs, with the
158" ".java\=" extension used for a production version and an arbitrary
159" extension used for a testing version.
160if fnamemodify(bufname("%"), ":t") =~ '^module-info\%(\.class\>\)\@!'
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200161 syn keyword javaModuleStorageClass module transitive
162 syn keyword javaModuleStmt open requires exports opens uses provides
163 syn keyword javaModuleExternal to with
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200164 hi def link javaModuleStorageClass StorageClass
165 hi def link javaModuleStmt Statement
166 hi def link javaModuleExternal Include
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200167endif
168
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200169" Fancy parameterised types (JLS-17, §4.5).
170"
171" Note that false positives may elsewhere occur whenever an identifier
172" is butted against a less-than operator. Cf. (X<Y) and (X < Y).
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200173if exists("g:java_highlight_generics")
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200174 syn keyword javaWildcardBound contained extends super
175
176 " Parameterised types are delegated to javaGenerics (s:ctx.gsg) and
177 " are not matched with javaTypeArgument.
178 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*\>\)\%(\[\]\)*"'
179
180 for s:ctx in [{'dsg': 'javaDimExpr', 'gsg': 'javaGenerics', 'ghg': 'javaGenericsC1', 'csg': 'javaGenericsX', 'c': ''},
181 \ {'dsg': 'javaDimExprX', 'gsg': 'javaGenericsX', 'ghg': 'javaGenericsC2', 'csg': 'javaGenerics', 'c': ' contained'}]
182 " Consider array creation expressions of reifiable types.
183 exec 'syn region ' . s:ctx.dsg . ' contained transparent matchgroup=' . s:ctx.ghg . ' start="\[" end="\]" nextgroup=' . s:ctx.dsg . ' skipwhite skipnl'
184 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'
185 endfor
186
187 unlet s:ctx
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200188 hi def link javaWildcardBound Question
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200189 hi def link javaGenericsC1 Function
190 hi def link javaGenericsC2 Type
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200191endif
192
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200193if exists("g:java_highlight_java_lang_ids")
194 let g:java_highlight_all = 1
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000195endif
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200196if exists("g:java_highlight_all") || exists("g:java_highlight_java") || exists("g:java_highlight_java_lang")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000197 " java.lang.*
Bram Moolenaar63f32602022-06-09 20:45:54 +0100198 "
199 " The keywords of javaR_JavaLang, javaC_JavaLang, javaE_JavaLang,
200 " and javaX_JavaLang are sub-grouped according to the Java version
201 " of their introduction, and sub-group keywords (that is, class
202 " names) are arranged in alphabetical order, so that future newer
203 " keywords can be pre-sorted and appended without disturbing
204 " the current keyword placement. The below _match_es follow suit.
205
Aliaksei Budavei63d68c22024-03-26 20:12:05 +0300206 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 +0000207 syn cluster javaClasses add=javaR_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200208 hi def link javaR_JavaLang javaR_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100209 " Member enumerations:
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300210 exec 'syn match javaC_JavaLang "\%(\<Thread\.\)\@' . s:ff.Peek('7', '') . '<=\<State\>"'
211 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<UnicodeScript\>"'
212 exec 'syn match javaC_JavaLang "\%(\<ProcessBuilder\.Redirect\.\)\@' . s:ff.Peek('24', '') . '<=\<Type\>"'
213 exec 'syn match javaC_JavaLang "\%(\<StackWalker\.\)\@' . s:ff.Peek('12', '') . '<=\<Option\>"'
214 exec 'syn match javaC_JavaLang "\%(\<System\.Logger\.\)\@' . s:ff.Peek('14', '') . '<=\<Level\>"'
Bram Moolenaar63f32602022-06-09 20:45:54 +0100215 " Member classes:
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300216 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<Subset\>"'
217 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<UnicodeBlock\>"'
218 exec 'syn match javaC_JavaLang "\%(\<ProcessBuilder\.\)\@' . s:ff.Peek('15', '') . '<=\<Redirect\>"'
219 exec 'syn match javaC_JavaLang "\%(\<ModuleLayer\.\)\@' . s:ff.Peek('12', '') . '<=\<Controller\>"'
220 exec 'syn match javaC_JavaLang "\%(\<Runtime\.\)\@' . s:ff.Peek('8', '') . '<=\<Version\>"'
221 exec 'syn match javaC_JavaLang "\%(\<System\.\)\@' . s:ff.Peek('7', '') . '<=\<LoggerFinder\>"'
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200222 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 +0100223 syn match javaC_JavaLang "\<System\>" " See javaDebug.
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200224
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200225 if !exists("g:java_highlight_generics")
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200226 " The non-interface parameterised names of java.lang members.
227 exec 'syn match javaC_JavaLang "\%(\<Enum\.\)\@' . s:ff.Peek('5', '') . '<=\<EnumDesc\>"'
228 syn keyword javaC_JavaLang Class InheritableThreadLocal ThreadLocal Enum ClassValue
229 endif
230
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200231 " As of JDK 21, java.lang.Compiler is no more (deprecated in JDK 9).
Aliaksei Budavei63d68c22024-03-26 20:12:05 +0300232 syn keyword javaLangDeprecated Compiler
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000233 syn cluster javaClasses add=javaC_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200234 hi def link javaC_JavaLang javaC_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100235 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 +0000236 syn cluster javaClasses add=javaE_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200237 hi def link javaE_JavaLang javaE_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100238 syn keyword javaX_JavaLang ClassNotFoundException CloneNotSupportedException Exception IllegalAccessException InstantiationException InterruptedException NoSuchMethodException Throwable NoSuchFieldException ReflectiveOperationException
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000239 syn cluster javaClasses add=javaX_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200240 hi def link javaX_JavaLang javaX_Java
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000241
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200242 hi def link javaR_Java javaR_
243 hi def link javaC_Java javaC_
244 hi def link javaE_Java javaE_
245 hi def link javaX_Java javaX_
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200246 hi def link javaX_ javaExceptions
247 hi def link javaR_ javaExceptions
248 hi def link javaE_ javaExceptions
249 hi def link javaC_ javaConstant
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000250
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200251 syn keyword javaLangObject getClass notify notifyAll wait
252
253 " Lower the syntax priority of overridable java.lang.Object method
254 " names for zero-width matching (define g:java_highlight_signature
255 " and see their base declarations for java.lang.Object):
256 syn match javaLangObject "\<clone\>"
257 syn match javaLangObject "\<equals\>"
258 syn match javaLangObject "\<finalize\>"
259 syn match javaLangObject "\<hashCode\>"
260 syn match javaLangObject "\<toString\>"
261 hi def link javaLangObject javaConstant
Bram Moolenaar071d4272004-06-13 20:20:40 +0000262endif
263
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300264if filereadable(expand("<sfile>:p:h") . "/javaid.vim")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000265 source <sfile>:p:h/javaid.vim
266endif
267
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200268if exists("g:java_space_errors")
269 if !exists("g:java_no_trail_space_error")
270 syn match javaSpaceError "\s\+$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000271 endif
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200272 if !exists("g:java_no_tab_space_error")
273 syn match javaSpaceError " \+\t"me=e-1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000274 endif
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200275 hi def link javaSpaceError Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000276endif
277
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200278exec 'syn match javaUserLabel "^\s*\<\K\k*\>\%(\<default\>\)\@' . s:ff.Peek('7', '') . '<!\s*::\@!"he=e-1'
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200279syn 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 +0100280syn region javaLabelRegion transparent matchgroup=javaLabel start="\<default\>\%(\s*\%(:\|->\)\)\@=" matchgroup=NONE end=":\|->" oneline
281" Consider grouped _default_ _case_ labels, i.e.
282" case null, default ->
283" case null: default:
284syn keyword javaLabelDefault contained default
285syn keyword javaLabelVarType contained var
286syn keyword javaLabelCastType contained char byte short int
287" Allow for the contingency of the enclosing region not being able to
288" _keep_ its _end_, e.g. case ':':.
Aliaksei Budaveid6b4afb2024-06-09 19:39:52 +0300289syn 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 +0100290syn match javaLabelNumber contained "\<0\>[lL]\@!"
291syn match javaLabelNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)\>[lL]\@!"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000292
Bram Moolenaar071d4272004-06-13 20:20:40 +0000293" Comments
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200294syn keyword javaTodo contained TODO FIXME XXX
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300295
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200296if exists("g:java_comment_strings")
297 syn region javaCommentString contained start=+"+ end=+"+ end=+$+ end=+\*/+me=s-1,he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell
298 syn region javaCommentString contained start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell,javaSpecialError,javaTextBlockError
299 syn region javaComment2String contained start=+"+ end=+$\|"+ contains=javaSpecial,javaSpecialChar,@Spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000300 syn match javaCommentCharacter contained "'\\[^']\{1,6\}'" contains=javaSpecialChar
301 syn match javaCommentCharacter contained "'\\''" contains=javaSpecialChar
302 syn match javaCommentCharacter contained "'[^\\]'"
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300303 syn cluster javaCommentSpecial add=javaCommentString,javaCommentCharacter,javaNumber,javaStrTempl
304 syn cluster javaCommentSpecial2 add=javaComment2String,javaCommentCharacter,javaNumber,javaStrTempl
Bram Moolenaar071d4272004-06-13 20:20:40 +0000305endif
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300306
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200307syn region javaComment matchgroup=javaCommentStart start="/\*" end="\*/" contains=@javaCommentSpecial,javaTodo,javaCommentError,javaSpaceError,@Spell fold
308syn match javaCommentStar contained "^\s*\*[^/]"me=e-1
309syn match javaCommentStar contained "^\s*\*$"
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300310syn match javaLineComment "//.*" contains=@javaCommentSpecial2,javaTodo,javaCommentMarkupTag,javaSpaceError,@Spell
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300311syn match javaCommentMarkupTag contained "@\%(end\|highlight\|link\|replace\|start\)\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
312syn match javaCommentMarkupTagAttr contained "\<region\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200313exec '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 +0300314syn match javaCommentError contained "/\*"me=e-1 display
Bram Moolenaar071d4272004-06-13 20:20:40 +0000315
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200316if !exists("g:java_ignore_javadoc") && g:main_syntax != 'jsp'
Aliaksei Budavei3749dff2024-07-31 22:13:25 +0200317 " The overridable "html*" default links must be defined _before_ the
318 " inclusion of the same default links from "html.vim".
319 hi def link htmlComment Special
320 hi def link htmlCommentPart Special
321 hi def link htmlArg Type
322 hi def link htmlString String
Bram Moolenaar071d4272004-06-13 20:20:40 +0000323 syntax case ignore
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300324
325 " Include HTML syntax coloring for Javadoc comments.
Bram Moolenaar63f32602022-06-09 20:45:54 +0100326 syntax include @javaHtml syntax/html.vim
Bram Moolenaar071d4272004-06-13 20:20:40 +0000327 unlet b:current_syntax
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300328
329 " HTML enables spell checking for all text that is not in a syntax
330 " item (:syntax spell toplevel); instead, limit spell checking to
331 " items matchable with syntax groups containing the @Spell cluster.
332 try
333 syntax spell default
334 catch /\<E390:/
335 call s:ReportOnce(v:exception)
336 endtry
Bram Moolenaar5c736222010-01-06 20:54:52 +0100337
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300338 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 +0300339 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 +0300340 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 +0300341 syn region javaDocTags contained start="{@\%(li\%(teral\|nk\%(plain\)\=\)\|inherit[Dd]oc\|doc[rR]oot\|value\)\>" end="}"
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300342 syn match javaDocTags contained "@\%(param\|exception\|throws\|since\)\s\+\S\+" contains=javaDocParam
343 syn match javaDocParam contained "\s\S\+"
344 syn match javaDocTags contained "@\%(version\|author\|return\|deprecated\|serial\%(Field\|Data\)\=\)\>"
345 syn region javaDocSeeTag contained matchgroup=javaDocTags start="@see\s\+" matchgroup=NONE end="\_."re=e-1 contains=javaDocSeeTagParam
346 syn match javaDocSeeTagParam contained @"\_[^"]\+"\|<a\s\+\_.\{-}</a>\|\%(\k\|\.\)*\%(#\k\+\%((\_[^)]*)\)\=\)\=@ contains=@javaHtml extend
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300347 syn region javaCodeSkipBlock contained transparent start="{\%(@code\>\)\@!" end="}" contains=javaCodeSkipBlock,javaDocCodeTag
348 syn region javaDocCodeTag contained start="{@code\>" end="}" contains=javaDocCodeTag,javaCodeSkipBlock
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200349 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 +0300350 syn region javaSnippetSkipBlock contained transparent start="{\%(@snippet\>\)\@!" end="}" contains=javaSnippetSkipBlock,javaDocSnippetTag,javaCommentMarkupTag
351 syn region javaDocSnippetTag contained start="{@snippet\>" end="}" contains=javaDocSnippetTag,javaSnippetSkipBlock,javaDocSnippetTagAttr,javaCommentMarkupTag
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300352
Bram Moolenaar071d4272004-06-13 20:20:40 +0000353 syntax case match
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200354 hi def link javaDocComment Comment
355 hi def link javaCommentTitle SpecialComment
356 hi def link javaDocTags Special
357 hi def link javaDocCodeTag Special
358 hi def link javaDocSnippetTag Special
359 hi def link javaDocSeeTagParam Function
360 hi def link javaDocParam Function
Bram Moolenaar071d4272004-06-13 20:20:40 +0000361endif
362
363" match the special comment /**/
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200364syn match javaComment "/\*\*/"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000365
366" Strings and constants
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200367syn match javaSpecialError contained "\\."
Bram Moolenaar071d4272004-06-13 20:20:40 +0000368syn match javaSpecialCharError contained "[^']"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300369" Escape Sequences (JLS-17, §3.10.7):
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200370syn match javaSpecialChar contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000371syn region javaString start=+"+ end=+"+ end=+$+ contains=javaSpecialChar,javaSpecialError,@Spell
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300372syn region javaString start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecialChar,javaSpecialError,javaTextBlockError,@Spell
373syn match javaTextBlockError +"""\s*"""+
Aliaksei Budavei8556e232024-08-27 22:32:13 +0200374
375if s:ff.IsRequestedPreviewFeature(430)
376 syn region javaStrTemplEmbExp contained matchgroup=javaStrTempl start="\\{" end="}" contains=TOP
377 exec 'syn region javaStrTempl start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,@Spell'
378 exec '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'
379 hi def link javaStrTempl Macro
380endif
381
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200382syn match javaCharacter "'[^']*'" contains=javaSpecialChar,javaSpecialCharError
383syn match javaCharacter "'\\''" contains=javaSpecialChar
384syn match javaCharacter "'[^\\]'"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300385" Integer literals (JLS-17, §3.10.1):
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200386syn keyword javaNumber 0 0l 0L
387syn match javaNumber "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300388" Decimal floating-point literals (JLS-17, §3.10.2):
389" Against "\<\d\+\>\.":
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200390syn match javaNumber "\<\d\%(_*\d\)*\."
391syn match javaNumber "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
392syn match javaNumber "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
393syn match javaNumber "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300394" Hexadecimal floating-point literals (JLS-17, §3.10.2):
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200395syn match javaNumber "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000396
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300397" Unicode characters
398syn match javaSpecial "\\u\x\x\x\x"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000399
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200400" Method declarations (JLS-17, §8.4.3, §8.4.4, §9.4).
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200401if exists("g:java_highlight_functions")
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200402 syn cluster javaFuncParams contains=javaAnnotation,@javaClasses,javaGenerics,javaType,javaVarArg,javaComment,javaLineComment
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200403
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200404 if exists("g:java_highlight_signature")
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200405 syn cluster javaFuncParams add=javaParamModifier
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200406 hi def link javaFuncDefStart javaFuncDef
407 else
408 syn cluster javaFuncParams add=javaScopeDecl,javaConceptKind,javaStorageClass,javaExternal
409 endif
410
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200411 if g:java_highlight_functions =~# '^indent[1-8]\=$'
412 let s:last = g:java_highlight_functions[-1 :]
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300413 let s:indent = s:last != 't' ? repeat("\x20", s:last) : "\t"
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300414 " Try to not match other type members, initialiser blocks, enum
415 " constants (JLS-17, §8.9.1), and constructors (JLS-17, §8.1.7):
416 " at any _conventional_ indentation, skip over all fields with
417 " "[^=]*", all records with "\<record\s", and let the "*Skip*"
418 " definitions take care of constructor declarations and enum
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200419 " constants (with no support for @Foo(value = "bar")). Also,
420 " reject inlined declarations with "[^{]" for signature.
421 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 +0300422 " As long as package-private constructors cannot be matched with
423 " javaFuncDef, do not look with javaConstructorSkipDeclarator for
424 " them.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200425 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'
426 " With a zero-width span for signature applicable on demand to
427 " javaFuncDef, make related adjustments:
428 " (1) Claim all enum constants of a line as a unit.
429 exec 'syn match javaEnumSkipConstant contained transparent /^' . s:indent . '\%(\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)*\K\k*\s*\%((.*)\)\=\s*[,;({]\s*\)\+/ contains=@javaEnumConstants'
430 " (2) Define a syntax group for top level enumerations and tell
431 " apart their constants from method declarations.
432 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'
433 " (3) Define a base variant of javaParenT without using @javaTop
434 " in order to not include javaFuncDef.
435 syn region javaParenE transparent matchgroup=javaParen start="(" end=")" contains=@javaEnumConstants,javaInParen
436 syn region javaParenE transparent matchgroup=javaParen start="\[" end="\]" contains=@javaEnumConstants
437 syn cluster javaEnumConstants contains=TOP,javaTopEnumDeclaration,javaFuncDef,javaParenT
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300438 unlet s:indent s:last
Bram Moolenaar071d4272004-06-13 20:20:40 +0000439 else
Aliaksei Budavei40524742024-04-14 19:57:00 +0300440 " This is the "style" variant (:help ft-java-syntax).
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200441
442 " Match arbitrarily indented camelCasedName method declarations.
443 " Match: [@ɐ] [abstract] [<α, β>] Τʬ[<γ>][[][]] μʭʭ(/* ... */);
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200444 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 +0000445 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000446endif
447
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200448if exists("g:java_highlight_debug")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000449 " Strings and constants
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300450 syn match javaDebugSpecial contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200451 syn region javaDebugString contained start=+"+ end=+"+ contains=javaDebugSpecial
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300452 syn region javaDebugString contained start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaDebugSpecial,javaDebugTextBlockError
Aliaksei Budavei8556e232024-08-27 22:32:13 +0200453
454 if s:ff.IsRequestedPreviewFeature(430)
455 " The highlight groups of java{StrTempl,Debug{,Paren,StrTempl}}\,
456 " share one colour by default. Do not conflate unrelated parens.
457 syn region javaDebugStrTemplEmbExp contained matchgroup=javaDebugStrTempl start="\\{" end="}" contains=javaComment,javaLineComment,javaDebug\%(Paren\)\@!.*
458 exec 'syn region javaDebugStrTempl contained start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ contains=javaDebugStrTemplEmbExp,javaDebugSpecial'
459 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'
460 hi def link javaDebugStrTempl Macro
461 endif
462
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300463 syn match javaDebugTextBlockError contained +"""\s*"""+
Bram Moolenaar071d4272004-06-13 20:20:40 +0000464 syn match javaDebugCharacter contained "'[^\\]'"
465 syn match javaDebugSpecialCharacter contained "'\\.'"
466 syn match javaDebugSpecialCharacter contained "'\\''"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300467 syn keyword javaDebugNumber contained 0 0l 0L
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300468 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\."
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300469 syn match javaDebugNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
470 syn match javaDebugNumber contained "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
471 syn match javaDebugNumber contained "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
472 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
473 syn match javaDebugNumber contained "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000474 syn keyword javaDebugBoolean contained true false
475 syn keyword javaDebugType contained null this super
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200476 syn region javaDebugParen contained start=+(+ end=+)+ contains=javaDebug.*,javaDebugParen
Bram Moolenaar071d4272004-06-13 20:20:40 +0000477
Aliaksei Budavei40524742024-04-14 19:57:00 +0300478 " To make this work, define the highlighting for these groups.
479 syn match javaDebug "\<System\.\%(out\|err\)\.print\%(ln\)\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
480" FIXME: What API does "p" belong to?
481" syn match javaDebug "\<p\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
482 syn match javaDebug "\<\K\k*\.printStackTrace\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
483" FIXME: What API do "trace*" belong to?
484" syn match javaDebug "\<trace[SL]\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
Bram Moolenaar071d4272004-06-13 20:20:40 +0000485
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200486 hi def link javaDebug Debug
487 hi def link javaDebugString DebugString
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200488 hi def link javaDebugTextBlockError Error
489 hi def link javaDebugType DebugType
490 hi def link javaDebugBoolean DebugBoolean
491 hi def link javaDebugNumber Debug
492 hi def link javaDebugSpecial DebugSpecial
493 hi def link javaDebugSpecialCharacter DebugSpecial
494 hi def link javaDebugCharacter DebugString
495 hi def link javaDebugParen Debug
Bram Moolenaar071d4272004-06-13 20:20:40 +0000496
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200497 hi def link DebugString String
498 hi def link DebugSpecial Special
499 hi def link DebugBoolean Boolean
500 hi def link DebugType Type
Bram Moolenaar071d4272004-06-13 20:20:40 +0000501endif
502
Aliaksei Budavei94c5d8a2024-06-19 20:10:47 +0200503" Try not to fold top-level-type bodies under assumption that there is
504" but one such body.
505exec 'syn region javaBlock transparent start="\%(^\|^\S[^:]\+\)\@' . s:ff.Peek('120', '') . '<!{" end="}" fold'
506
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200507if exists("g:java_mark_braces_in_parens_as_errors")
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300508 syn match javaInParen contained "[{}]"
509 hi def link javaInParen javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000510endif
511
512" catch errors caused by wrong parenthesis
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200513syn region javaParenT transparent matchgroup=javaParen start="(" end=")" contains=@javaTop,javaInParen,javaParenT1
514syn region javaParenT1 contained transparent matchgroup=javaParen1 start="(" end=")" contains=@javaTop,javaInParen,javaParenT2
515syn region javaParenT2 contained transparent matchgroup=javaParen2 start="(" end=")" contains=@javaTop,javaInParen,javaParenT
516syn match javaParenError ")"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000517" catch errors caused by wrong square parenthesis
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200518syn region javaParenT transparent matchgroup=javaParen start="\[" end="\]" contains=@javaTop,javaParenT1
519syn region javaParenT1 contained transparent matchgroup=javaParen1 start="\[" end="\]" contains=@javaTop,javaParenT2
520syn region javaParenT2 contained transparent matchgroup=javaParen2 start="\[" end="\]" contains=@javaTop,javaParenT
521syn match javaParenError "\]"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000522
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200523" Lambda expressions (JLS-17, §15.27) and method reference expressions
524" (JLS-17, §15.13).
525if exists("g:java_highlight_functions")
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200526 syn match javaMethodRef ":::\@!"
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200527
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200528 if exists("g:java_highlight_signature")
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200529 let s:ff.LambdaDef = s:ff.LeftConstant
530 else
531 let s:ff.LambdaDef = s:ff.RightConstant
532 endif
533
Aliaksei Budavei40524742024-04-14 19:57:00 +0300534 " Make ()-matching definitions after the parenthesis error catcher.
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300535 "
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200536 " Note that here and elsewhere a single-line token is used for \z,
537 " with other tokens repeated as necessary, to overcome the lack of
538 " support for multi-line matching with \z.
539 "
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300540 " Match: ([@A [@B ...] final] var a[, var b, ...]) ->
541 " | ([@A [@B ...] final] T[<α>][[][]] a[, T b, ...]) ->
542 " There is no recognition of expressions interspersed with comments
543 " or of expressions whose parameterised parameter types are written
544 " across multiple lines.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200545 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 +0300546 " Match: () ->
547 " | (a[, b, ...]) ->
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200548 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 +0300549 " Match: a ->
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200550 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 +0300551
552 syn keyword javaParamModifier contained final
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300553 syn keyword javaLambdaVarType contained var
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200554 hi def link javaParamModifier javaConceptKind
555 hi def link javaLambdaVarType javaOperator
556 hi def link javaLambdaDef javaFuncDef
557 hi def link javaLambdaDefStart javaFuncDef
558 hi def link javaMethodRef javaFuncDef
559 hi def link javaFuncDef Function
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100560endif
561
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300562" The @javaTop cluster comprises non-contained Java syntax groups.
563" Note that the syntax file "aidl.vim" relies on its availability.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200564syn cluster javaTop contains=TOP,javaTopEnumDeclaration
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300565
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200566if !exists("g:java_minlines")
567 let g:java_minlines = 10
Bram Moolenaar071d4272004-06-13 20:20:40 +0000568endif
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300569
570" Note that variations of a /*/ balanced comment, e.g., /*/*/, /*//*/,
571" /* /*/, /* /*/, etc., may have their rightmost /*/ part accepted
572" as a comment start by ':syntax sync ccomment'; consider alternatives
573" to make synchronisation start further towards file's beginning by
574" bumping up g:java_minlines or issuing ':syntax sync fromstart' or
575" preferring &foldmethod set to 'syntax'.
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200576exec "syn sync ccomment javaComment minlines=" . g:java_minlines
Bram Moolenaar071d4272004-06-13 20:20:40 +0000577
578" The default highlighting.
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200579hi def link javaVarArg Function
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200580hi def link javaBranch Conditional
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200581hi def link javaConditional Conditional
582hi def link javaRepeat Repeat
583hi def link javaExceptions Exception
584hi def link javaAssert Statement
585hi def link javaStorageClass StorageClass
586hi def link javaMethodDecl javaStorageClass
587hi def link javaClassDecl javaStorageClass
588hi def link javaScopeDecl javaStorageClass
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100589hi def link javaConceptKind NonText
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200590
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200591hi def link javaBoolean Boolean
592hi def link javaSpecial Special
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200593hi def link javaSpecialError Error
594hi def link javaSpecialCharError Error
595hi def link javaString String
596hi def link javaCharacter Character
597hi def link javaSpecialChar SpecialChar
598hi def link javaNumber Number
599hi def link javaError Error
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200600hi def link javaError2 javaError
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300601hi def link javaTextBlockError Error
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200602hi def link javaParenError javaError
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200603hi def link javaStatement Statement
604hi def link javaOperator Operator
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200605hi def link javaConstant Constant
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200606hi def link javaTypedef Typedef
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200607hi def link javaTodo Todo
608hi def link javaAnnotation PreProc
Aliaksei Budavei902b7662024-06-13 18:30:09 +0300609hi def link javaAnnotationStart javaAnnotation
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200610hi def link javaType Type
611hi def link javaExternal Include
Bram Moolenaar071d4272004-06-13 20:20:40 +0000612
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200613hi def link javaUserLabel Label
614hi def link javaUserLabelRef javaUserLabel
615hi def link javaLabel Label
616hi def link javaLabelDefault javaLabel
617hi def link javaLabelVarType javaOperator
618hi def link javaLabelNumber javaNumber
619hi def link javaLabelCastType javaType
Bram Moolenaar071d4272004-06-13 20:20:40 +0000620
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200621hi def link javaComment Comment
622hi def link javaCommentStar javaComment
623hi def link javaLineComment Comment
624hi def link javaCommentMarkupTagAttr javaHtmlArg
625hi def link javaCommentString javaString
626hi def link javaComment2String javaString
627hi def link javaCommentCharacter javaCharacter
628hi def link javaCommentError javaError
629hi def link javaCommentStart javaComment
630
631hi def link javaHtmlArg Type
632hi def link javaHtmlString String
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200633
Bram Moolenaar071d4272004-06-13 20:20:40 +0000634let b:current_syntax = "java"
635
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200636if g:main_syntax == 'java'
637 unlet g:main_syntax
Bram Moolenaar071d4272004-06-13 20:20:40 +0000638endif
639
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200640let b:spell_options = "contained"
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +0200641let &cpo = s:cpo_save
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200642unlet s:ff s:cpo_save
Bram Moolenaar071d4272004-06-13 20:20:40 +0000643
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300644" See ":help vim9-mix".
645if !has("vim9script")
646 finish
647endif
648
Aliaksei Budavei2750b832024-08-22 21:09:32 +0200649if exists("g:java_foldtext_show_first_or_second_line")
650 def! s:LazyPrefix(prefix: string, dashes: string, count: number): string
651 return empty(prefix)
652 ? printf('+-%s%3d lines: ', dashes, count)
653 : prefix
654 enddef
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300655
Aliaksei Budavei2750b832024-08-22 21:09:32 +0200656 def! s:JavaSyntaxFoldTextExpr(): string
657 # Piggyback on NGETTEXT.
658 const summary: string = foldtext()
659 return getline(v:foldstart) !~ '/\*\+\s*$'
660 ? summary
661 : LazyPrefix(matchstr(summary, '^+-\+\s*\d\+\s.\{-1,}:\s'),
662 v:folddashes,
663 (v:foldend - v:foldstart + 1)) ..
664 getline(v:foldstart + 1)
665 enddef
666
667 setlocal foldtext=s:JavaSyntaxFoldTextExpr()
668 delfunction! g:JavaSyntaxFoldTextExpr
669endif
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300670" vim: sw=2 ts=8 noet sta