blob: 293d63c0a238ad00bd3d6c50555c6707fc4c6c88 [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 Budaveia9ae38d2024-09-10 21:00:33 +02006" Last Change: 2024 Sep 10
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.
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200160if 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
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200167
168 if !exists("g:java_ignore_javadoc") && g:main_syntax != 'jsp'
169 syn match javaDocProvidesTag contained "@provides\_s\+\S\+" contains=javaDocParam
170 syn match javaDocUsesTag contained "@uses\_s\+\S\+" contains=javaDocParam
171 hi def link javaDocProvidesTag Special
172 hi def link javaDocUsesTag Special
173 endif
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200174endif
175
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200176" Fancy parameterised types (JLS-17, §4.5).
177"
178" Note that false positives may elsewhere occur whenever an identifier
179" is butted against a less-than operator. Cf. (X<Y) and (X < Y).
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200180if exists("g:java_highlight_generics")
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200181 syn keyword javaWildcardBound contained extends super
182
183 " Parameterised types are delegated to javaGenerics (s:ctx.gsg) and
184 " are not matched with javaTypeArgument.
185 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*\>\)\%(\[\]\)*"'
186
187 for s:ctx in [{'dsg': 'javaDimExpr', 'gsg': 'javaGenerics', 'ghg': 'javaGenericsC1', 'csg': 'javaGenericsX', 'c': ''},
188 \ {'dsg': 'javaDimExprX', 'gsg': 'javaGenericsX', 'ghg': 'javaGenericsC2', 'csg': 'javaGenerics', 'c': ' contained'}]
189 " Consider array creation expressions of reifiable types.
190 exec 'syn region ' . s:ctx.dsg . ' contained transparent matchgroup=' . s:ctx.ghg . ' start="\[" end="\]" nextgroup=' . s:ctx.dsg . ' skipwhite skipnl'
191 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'
192 endfor
193
194 unlet s:ctx
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200195 hi def link javaWildcardBound Question
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200196 hi def link javaGenericsC1 Function
197 hi def link javaGenericsC2 Type
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200198endif
199
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200200if exists("g:java_highlight_java_lang_ids")
201 let g:java_highlight_all = 1
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000202endif
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200203if exists("g:java_highlight_all") || exists("g:java_highlight_java") || exists("g:java_highlight_java_lang")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000204 " java.lang.*
Bram Moolenaar63f32602022-06-09 20:45:54 +0100205 "
206 " The keywords of javaR_JavaLang, javaC_JavaLang, javaE_JavaLang,
207 " and javaX_JavaLang are sub-grouped according to the Java version
208 " of their introduction, and sub-group keywords (that is, class
209 " names) are arranged in alphabetical order, so that future newer
210 " keywords can be pre-sorted and appended without disturbing
211 " the current keyword placement. The below _match_es follow suit.
212
Aliaksei Budavei63d68c22024-03-26 20:12:05 +0300213 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 +0000214 syn cluster javaClasses add=javaR_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200215 hi def link javaR_JavaLang javaR_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100216 " Member enumerations:
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300217 exec 'syn match javaC_JavaLang "\%(\<Thread\.\)\@' . s:ff.Peek('7', '') . '<=\<State\>"'
218 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<UnicodeScript\>"'
219 exec 'syn match javaC_JavaLang "\%(\<ProcessBuilder\.Redirect\.\)\@' . s:ff.Peek('24', '') . '<=\<Type\>"'
220 exec 'syn match javaC_JavaLang "\%(\<StackWalker\.\)\@' . s:ff.Peek('12', '') . '<=\<Option\>"'
221 exec 'syn match javaC_JavaLang "\%(\<System\.Logger\.\)\@' . s:ff.Peek('14', '') . '<=\<Level\>"'
Bram Moolenaar63f32602022-06-09 20:45:54 +0100222 " Member classes:
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300223 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<Subset\>"'
224 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<UnicodeBlock\>"'
225 exec 'syn match javaC_JavaLang "\%(\<ProcessBuilder\.\)\@' . s:ff.Peek('15', '') . '<=\<Redirect\>"'
226 exec 'syn match javaC_JavaLang "\%(\<ModuleLayer\.\)\@' . s:ff.Peek('12', '') . '<=\<Controller\>"'
227 exec 'syn match javaC_JavaLang "\%(\<Runtime\.\)\@' . s:ff.Peek('8', '') . '<=\<Version\>"'
228 exec 'syn match javaC_JavaLang "\%(\<System\.\)\@' . s:ff.Peek('7', '') . '<=\<LoggerFinder\>"'
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200229 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 +0100230 syn match javaC_JavaLang "\<System\>" " See javaDebug.
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200231
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200232 if !exists("g:java_highlight_generics")
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200233 " The non-interface parameterised names of java.lang members.
234 exec 'syn match javaC_JavaLang "\%(\<Enum\.\)\@' . s:ff.Peek('5', '') . '<=\<EnumDesc\>"'
235 syn keyword javaC_JavaLang Class InheritableThreadLocal ThreadLocal Enum ClassValue
236 endif
237
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200238 " As of JDK 21, java.lang.Compiler is no more (deprecated in JDK 9).
Aliaksei Budavei63d68c22024-03-26 20:12:05 +0300239 syn keyword javaLangDeprecated Compiler
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000240 syn cluster javaClasses add=javaC_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200241 hi def link javaC_JavaLang javaC_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100242 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 +0000243 syn cluster javaClasses add=javaE_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200244 hi def link javaE_JavaLang javaE_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100245 syn keyword javaX_JavaLang ClassNotFoundException CloneNotSupportedException Exception IllegalAccessException InstantiationException InterruptedException NoSuchMethodException Throwable NoSuchFieldException ReflectiveOperationException
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000246 syn cluster javaClasses add=javaX_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200247 hi def link javaX_JavaLang javaX_Java
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000248
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200249 hi def link javaR_Java javaR_
250 hi def link javaC_Java javaC_
251 hi def link javaE_Java javaE_
252 hi def link javaX_Java javaX_
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200253 hi def link javaX_ javaExceptions
254 hi def link javaR_ javaExceptions
255 hi def link javaE_ javaExceptions
256 hi def link javaC_ javaConstant
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000257
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200258 syn keyword javaLangObject getClass notify notifyAll wait
259
260 " Lower the syntax priority of overridable java.lang.Object method
261 " names for zero-width matching (define g:java_highlight_signature
262 " and see their base declarations for java.lang.Object):
263 syn match javaLangObject "\<clone\>"
264 syn match javaLangObject "\<equals\>"
265 syn match javaLangObject "\<finalize\>"
266 syn match javaLangObject "\<hashCode\>"
267 syn match javaLangObject "\<toString\>"
268 hi def link javaLangObject javaConstant
Bram Moolenaar071d4272004-06-13 20:20:40 +0000269endif
270
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300271if filereadable(expand("<sfile>:p:h") . "/javaid.vim")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000272 source <sfile>:p:h/javaid.vim
273endif
274
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200275if exists("g:java_space_errors")
276 if !exists("g:java_no_trail_space_error")
277 syn match javaSpaceError "\s\+$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000278 endif
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200279 if !exists("g:java_no_tab_space_error")
280 syn match javaSpaceError " \+\t"me=e-1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000281 endif
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200282 hi def link javaSpaceError Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000283endif
284
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200285exec 'syn match javaUserLabel "^\s*\<\K\k*\>\%(\<default\>\)\@' . s:ff.Peek('7', '') . '<!\s*::\@!"he=e-1'
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200286syn 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 +0100287syn region javaLabelRegion transparent matchgroup=javaLabel start="\<default\>\%(\s*\%(:\|->\)\)\@=" matchgroup=NONE end=":\|->" oneline
288" Consider grouped _default_ _case_ labels, i.e.
289" case null, default ->
290" case null: default:
291syn keyword javaLabelDefault contained default
292syn keyword javaLabelVarType contained var
293syn keyword javaLabelCastType contained char byte short int
294" Allow for the contingency of the enclosing region not being able to
295" _keep_ its _end_, e.g. case ':':.
Aliaksei Budaveid6b4afb2024-06-09 19:39:52 +0300296syn 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 +0100297syn match javaLabelNumber contained "\<0\>[lL]\@!"
298syn match javaLabelNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)\>[lL]\@!"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000299
Bram Moolenaar071d4272004-06-13 20:20:40 +0000300" Comments
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200301syn keyword javaTodo contained TODO FIXME XXX
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300302
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200303if exists("g:java_comment_strings")
304 syn region javaCommentString contained start=+"+ end=+"+ end=+$+ end=+\*/+me=s-1,he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell
305 syn region javaCommentString contained start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell,javaSpecialError,javaTextBlockError
306 syn region javaComment2String contained start=+"+ end=+$\|"+ contains=javaSpecial,javaSpecialChar,@Spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000307 syn match javaCommentCharacter contained "'\\[^']\{1,6\}'" contains=javaSpecialChar
308 syn match javaCommentCharacter contained "'\\''" contains=javaSpecialChar
309 syn match javaCommentCharacter contained "'[^\\]'"
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300310 syn cluster javaCommentSpecial add=javaCommentString,javaCommentCharacter,javaNumber,javaStrTempl
311 syn cluster javaCommentSpecial2 add=javaComment2String,javaCommentCharacter,javaNumber,javaStrTempl
Bram Moolenaar071d4272004-06-13 20:20:40 +0000312endif
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300313
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200314syn region javaComment matchgroup=javaCommentStart start="/\*" end="\*/" contains=@javaCommentSpecial,javaTodo,javaCommentError,javaSpaceError,@Spell fold
315syn match javaCommentStar contained "^\s*\*[^/]"me=e-1
316syn match javaCommentStar contained "^\s*\*$"
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300317syn match javaLineComment "//.*" contains=@javaCommentSpecial2,javaTodo,javaCommentMarkupTag,javaSpaceError,@Spell
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300318syn match javaCommentMarkupTag contained "@\%(end\|highlight\|link\|replace\|start\)\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
319syn match javaCommentMarkupTagAttr contained "\<region\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200320exec '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 +0300321syn match javaCommentError contained "/\*"me=e-1 display
Bram Moolenaar071d4272004-06-13 20:20:40 +0000322
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200323if !exists("g:java_ignore_javadoc") && g:main_syntax != 'jsp'
Aliaksei Budavei3749dff2024-07-31 22:13:25 +0200324 " The overridable "html*" default links must be defined _before_ the
325 " inclusion of the same default links from "html.vim".
326 hi def link htmlComment Special
327 hi def link htmlCommentPart Special
328 hi def link htmlArg Type
329 hi def link htmlString String
Bram Moolenaar071d4272004-06-13 20:20:40 +0000330 syntax case ignore
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300331
332 " Include HTML syntax coloring for Javadoc comments.
Bram Moolenaar63f32602022-06-09 20:45:54 +0100333 syntax include @javaHtml syntax/html.vim
Bram Moolenaar071d4272004-06-13 20:20:40 +0000334 unlet b:current_syntax
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300335
336 " HTML enables spell checking for all text that is not in a syntax
337 " item (:syntax spell toplevel); instead, limit spell checking to
338 " items matchable with syntax groups containing the @Spell cluster.
339 try
340 syntax spell default
341 catch /\<E390:/
342 call s:ReportOnce(v:exception)
343 endtry
Bram Moolenaar5c736222010-01-06 20:54:52 +0100344
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200345 syn region javaDocComment start="/\*\*" end="\*/" keepend contains=javaCommentTitle,@javaHtml,@javaDocTags,javaTodo,javaCommentError,javaSpaceError,@Spell fold
346 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'
347 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,javaTitleSkipBlock
348 syn region javaCommentTitle contained matchgroup=javaDocComment start="/\*\*\s*\r\=\n\=\s*\**\s*\%({@summary\>\)\@=" matchgroup=javaCommentTitle end="}" contains=@javaHtml,javaCommentStar,javaTodo,javaCommentError,javaSpaceError,@Spell,@javaDocTags,javaTitleSkipBlock
349 " The members of javaDocTags are sub-grouped according to the Java
350 " version of their introduction, and sub-group members in turn are
351 " arranged in alphabetical order, so that future newer members can
352 " be pre-sorted and appended without disturbing the current member
353 " placement.
354 " Since they only have significance in javaCommentTitle, neither
355 " javaDocSummaryTag nor javaDocReturnTitleTag are defined.
356 syn cluster javaDocTags contains=javaDocAuthorTag,javaDocDeprecatedTag,javaDocExceptionTag,javaDocParamTag,javaDocReturnTag,javaDocSeeTag,javaDocVersionTag,javaDocSinceTag,javaDocLinkTag,javaDocSerialTag,javaDocSerialDataTag,javaDocSerialFieldTag,javaDocThrowsTag,javaDocDocRootTag,javaDocInheritDocTag,javaDocLinkplainTag,javaDocValueTag,javaDocCodeTag,javaDocLiteralTag,javaDocHiddenTag,javaDocIndexTag,javaDocProvidesTag,javaDocUsesTag,javaDocSystemPropertyTag,javaDocSnippetTag,javaDocSpecTag
357
358 " Anticipate non-standard inline tags in {@return} and {@summary}.
359 syn region javaTitleSkipBlock contained transparent start="{\%(@\%(return\|summary\)\>\)\@!" end="}"
360 syn match javaDocDocRootTag contained "{@docRoot}"
361 syn match javaDocInheritDocTag contained "{@inheritDoc}"
362 syn region javaIndexSkipBlock contained transparent start="{\%(@index\>\)\@!" end="}" contains=javaIndexSkipBlock,javaDocIndexTag
363 syn region javaDocIndexTag contained start="{@index\>" end="}" contains=javaDocIndexTag,javaIndexSkipBlock
364 syn region javaLinkSkipBlock contained transparent start="{\%(@link\>\)\@!" end="}" contains=javaLinkSkipBlock,javaDocLinkTag
365 syn region javaDocLinkTag contained start="{@link\>" end="}" contains=javaDocLinkTag,javaLinkSkipBlock
366 syn region javaLinkplainSkipBlock contained transparent start="{\%(@linkplain\>\)\@!" end="}" contains=javaLinkplainSkipBlock,javaDocLinkplainTag
367 syn region javaDocLinkplainTag contained start="{@linkplain\>" end="}" contains=javaDocLinkplainTag,javaLinkplainSkipBlock
368 syn region javaLiteralSkipBlock contained transparent start="{\%(@literal\>\)\@!" end="}" contains=javaLiteralSkipBlock,javaDocLiteralTag
369 syn region javaDocLiteralTag contained start="{@literal\>" end="}" contains=javaDocLiteralTag,javaLiteralSkipBlock
370 syn region javaSystemPropertySkipBlock contained transparent start="{\%(@systemProperty\>\)\@!" end="}" contains=javaSystemPropertySkipBlock,javaDocSystemPropertyTag
371 syn region javaDocSystemPropertyTag contained start="{@systemProperty\>" end="}" contains=javaDocSystemPropertyTag,javaSystemPropertySkipBlock
372 syn region javaValueSkipBlock contained transparent start="{\%(@value\>\)\@!" end="}" contains=javaValueSkipBlock,javaDocValueTag
373 syn region javaDocValueTag contained start="{@value\>" end="}" contains=javaDocValueTag,javaValueSkipBlock
374
375 syn match javaDocParam contained "\s\zs\S\+"
376 syn match javaDocExceptionTag contained "@exception\s\+\S\+" contains=javaDocParam
377 syn match javaDocParamTag contained "@param\s\+\S\+" contains=javaDocParam
378 syn match javaDocSinceTag contained "@since\s\+\S\+" contains=javaDocParam
379 syn match javaDocThrowsTag contained "@throws\s\+\S\+" contains=javaDocParam
380 syn match javaDocSpecTag contained "@spec\_s\+\S\+\ze\_s\+\S\+" contains=javaDocParam
381
382 syn match javaDocAuthorTag contained "@author\>"
383 syn match javaDocDeprecatedTag contained "@deprecated\>"
384 syn match javaDocHiddenTag contained "@hidden\>"
385 syn match javaDocReturnTag contained "@return\>"
386 syn match javaDocSerialTag contained "@serial\>"
387 syn match javaDocSerialDataTag contained "@serialData\>"
388 syn match javaDocSerialFieldTag contained "@serialField\>"
389 syn match javaDocVersionTag contained "@version\>"
390
391 syn match javaDocSeeTag contained "@see\>" nextgroup=javaDocSeeTag1,javaDocSeeTag2,javaDocSeeTag3,javaDocSeeTagStar skipwhite skipempty
392 syn match javaDocSeeTagStar contained "^\s*\*\+\%(\s*{\=@\|/\|$\)\@!" nextgroup=javaDocSeeTag1,javaDocSeeTag2,javaDocSeeTag3 skipwhite skipempty
393 syn match javaDocSeeTag1 contained @"\_[^"]\+"@
394 syn match javaDocSeeTag2 contained @<a\s\+\_.\{-}</a>@ contains=@javaHtml extend
395 syn match javaDocSeeTag3 contained @["< \t]\@!\%(\k\|[/.]\)*\%(##\=\k\+\%((\_[^)]*)\)\=\)\=@ nextgroup=javaDocSeeTag3Label skipwhite skipempty
396 syn match javaDocSeeTag3Label contained @\k\%(\k\+\s*\)*$@
397
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300398 syn region javaCodeSkipBlock contained transparent start="{\%(@code\>\)\@!" end="}" contains=javaCodeSkipBlock,javaDocCodeTag
399 syn region javaDocCodeTag contained start="{@code\>" end="}" contains=javaDocCodeTag,javaCodeSkipBlock
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200400
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200401 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 +0300402 syn region javaSnippetSkipBlock contained transparent start="{\%(@snippet\>\)\@!" end="}" contains=javaSnippetSkipBlock,javaDocSnippetTag,javaCommentMarkupTag
403 syn region javaDocSnippetTag contained start="{@snippet\>" end="}" contains=javaDocSnippetTag,javaSnippetSkipBlock,javaDocSnippetTagAttr,javaCommentMarkupTag
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300404
Bram Moolenaar071d4272004-06-13 20:20:40 +0000405 syntax case match
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200406 hi def link javaDocComment Comment
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200407 hi def link javaDocSeeTagStar javaDocComment
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200408 hi def link javaCommentTitle SpecialComment
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200409 hi def link javaDocParam Function
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200410
411 hi def link javaDocAuthorTag Special
412 hi def link javaDocCodeTag Special
413 hi def link javaDocDeprecatedTag Special
414 hi def link javaDocDocRootTag Special
415 hi def link javaDocExceptionTag Special
416 hi def link javaDocHiddenTag Special
417 hi def link javaDocIndexTag Special
418 hi def link javaDocInheritDocTag Special
419 hi def link javaDocLinkTag Special
420 hi def link javaDocLinkplainTag Special
421 hi def link javaDocLiteralTag Special
422 hi def link javaDocParamTag Special
423 hi def link javaDocReturnTag Special
424 hi def link javaDocSeeTag Special
425 hi def link javaDocSeeTag1 String
426 hi def link javaDocSeeTag2 Special
427 hi def link javaDocSeeTag3 Function
428 hi def link javaDocSerialTag Special
429 hi def link javaDocSerialDataTag Special
430 hi def link javaDocSerialFieldTag Special
431 hi def link javaDocSinceTag Special
432 hi def link javaDocSnippetTag Special
433 hi def link javaDocSpecTag Special
434 hi def link javaDocSystemPropertyTag Special
435 hi def link javaDocThrowsTag Special
436 hi def link javaDocValueTag Special
437 hi def link javaDocVersionTag Special
Bram Moolenaar071d4272004-06-13 20:20:40 +0000438endif
439
440" match the special comment /**/
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200441syn match javaComment "/\*\*/"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000442
443" Strings and constants
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200444syn match javaSpecialError contained "\\."
Bram Moolenaar071d4272004-06-13 20:20:40 +0000445syn match javaSpecialCharError contained "[^']"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300446" Escape Sequences (JLS-17, §3.10.7):
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200447syn match javaSpecialChar contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000448syn region javaString start=+"+ end=+"+ end=+$+ contains=javaSpecialChar,javaSpecialError,@Spell
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300449syn region javaString start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecialChar,javaSpecialError,javaTextBlockError,@Spell
450syn match javaTextBlockError +"""\s*"""+
Aliaksei Budavei8556e232024-08-27 22:32:13 +0200451
452if s:ff.IsRequestedPreviewFeature(430)
453 syn region javaStrTemplEmbExp contained matchgroup=javaStrTempl start="\\{" end="}" contains=TOP
454 exec 'syn region javaStrTempl start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,@Spell'
455 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'
456 hi def link javaStrTempl Macro
457endif
458
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200459syn match javaCharacter "'[^']*'" contains=javaSpecialChar,javaSpecialCharError
460syn match javaCharacter "'\\''" contains=javaSpecialChar
461syn match javaCharacter "'[^\\]'"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300462" Integer literals (JLS-17, §3.10.1):
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200463syn keyword javaNumber 0 0l 0L
464syn match javaNumber "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300465" Decimal floating-point literals (JLS-17, §3.10.2):
466" Against "\<\d\+\>\.":
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200467syn match javaNumber "\<\d\%(_*\d\)*\."
468syn match javaNumber "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
469syn match javaNumber "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
470syn match javaNumber "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300471" Hexadecimal floating-point literals (JLS-17, §3.10.2):
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200472syn match javaNumber "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000473
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300474" Unicode characters
475syn match javaSpecial "\\u\x\x\x\x"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000476
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200477" Method declarations (JLS-17, §8.4.3, §8.4.4, §9.4).
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200478if exists("g:java_highlight_functions")
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200479 syn cluster javaFuncParams contains=javaAnnotation,@javaClasses,javaGenerics,javaType,javaVarArg,javaComment,javaLineComment
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200480
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200481 if exists("g:java_highlight_signature")
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200482 syn cluster javaFuncParams add=javaParamModifier
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200483 hi def link javaFuncDefStart javaFuncDef
484 else
485 syn cluster javaFuncParams add=javaScopeDecl,javaConceptKind,javaStorageClass,javaExternal
486 endif
487
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200488 if g:java_highlight_functions =~# '^indent[1-8]\=$'
489 let s:last = g:java_highlight_functions[-1 :]
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300490 let s:indent = s:last != 't' ? repeat("\x20", s:last) : "\t"
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300491 " Try to not match other type members, initialiser blocks, enum
492 " constants (JLS-17, §8.9.1), and constructors (JLS-17, §8.1.7):
493 " at any _conventional_ indentation, skip over all fields with
494 " "[^=]*", all records with "\<record\s", and let the "*Skip*"
495 " definitions take care of constructor declarations and enum
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200496 " constants (with no support for @Foo(value = "bar")). Also,
497 " reject inlined declarations with "[^{]" for signature.
498 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 +0300499 " As long as package-private constructors cannot be matched with
500 " javaFuncDef, do not look with javaConstructorSkipDeclarator for
501 " them.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200502 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'
503 " With a zero-width span for signature applicable on demand to
504 " javaFuncDef, make related adjustments:
505 " (1) Claim all enum constants of a line as a unit.
506 exec 'syn match javaEnumSkipConstant contained transparent /^' . s:indent . '\%(\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)*\K\k*\s*\%((.*)\)\=\s*[,;({]\s*\)\+/ contains=@javaEnumConstants'
507 " (2) Define a syntax group for top level enumerations and tell
508 " apart their constants from method declarations.
509 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'
510 " (3) Define a base variant of javaParenT without using @javaTop
511 " in order to not include javaFuncDef.
512 syn region javaParenE transparent matchgroup=javaParen start="(" end=")" contains=@javaEnumConstants,javaInParen
513 syn region javaParenE transparent matchgroup=javaParen start="\[" end="\]" contains=@javaEnumConstants
514 syn cluster javaEnumConstants contains=TOP,javaTopEnumDeclaration,javaFuncDef,javaParenT
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300515 unlet s:indent s:last
Bram Moolenaar071d4272004-06-13 20:20:40 +0000516 else
Aliaksei Budavei40524742024-04-14 19:57:00 +0300517 " This is the "style" variant (:help ft-java-syntax).
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200518
519 " Match arbitrarily indented camelCasedName method declarations.
520 " Match: [@ɐ] [abstract] [<α, β>] Τʬ[<γ>][[][]] μʭʭ(/* ... */);
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200521 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 +0000522 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000523endif
524
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200525if exists("g:java_highlight_debug")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000526 " Strings and constants
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300527 syn match javaDebugSpecial contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200528 syn region javaDebugString contained start=+"+ end=+"+ contains=javaDebugSpecial
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300529 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 +0200530
531 if s:ff.IsRequestedPreviewFeature(430)
532 " The highlight groups of java{StrTempl,Debug{,Paren,StrTempl}}\,
533 " share one colour by default. Do not conflate unrelated parens.
534 syn region javaDebugStrTemplEmbExp contained matchgroup=javaDebugStrTempl start="\\{" end="}" contains=javaComment,javaLineComment,javaDebug\%(Paren\)\@!.*
535 exec 'syn region javaDebugStrTempl contained start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ contains=javaDebugStrTemplEmbExp,javaDebugSpecial'
536 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'
537 hi def link javaDebugStrTempl Macro
538 endif
539
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300540 syn match javaDebugTextBlockError contained +"""\s*"""+
Bram Moolenaar071d4272004-06-13 20:20:40 +0000541 syn match javaDebugCharacter contained "'[^\\]'"
542 syn match javaDebugSpecialCharacter contained "'\\.'"
543 syn match javaDebugSpecialCharacter contained "'\\''"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300544 syn keyword javaDebugNumber contained 0 0l 0L
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300545 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\."
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300546 syn match javaDebugNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
547 syn match javaDebugNumber contained "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
548 syn match javaDebugNumber contained "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
549 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
550 syn match javaDebugNumber contained "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000551 syn keyword javaDebugBoolean contained true false
552 syn keyword javaDebugType contained null this super
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200553 syn region javaDebugParen contained start=+(+ end=+)+ contains=javaDebug.*,javaDebugParen
Bram Moolenaar071d4272004-06-13 20:20:40 +0000554
Aliaksei Budavei40524742024-04-14 19:57:00 +0300555 " To make this work, define the highlighting for these groups.
556 syn match javaDebug "\<System\.\%(out\|err\)\.print\%(ln\)\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
557" FIXME: What API does "p" belong to?
558" syn match javaDebug "\<p\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
559 syn match javaDebug "\<\K\k*\.printStackTrace\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
560" FIXME: What API do "trace*" belong to?
561" syn match javaDebug "\<trace[SL]\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
Bram Moolenaar071d4272004-06-13 20:20:40 +0000562
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200563 hi def link javaDebug Debug
564 hi def link javaDebugString DebugString
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200565 hi def link javaDebugTextBlockError Error
566 hi def link javaDebugType DebugType
567 hi def link javaDebugBoolean DebugBoolean
568 hi def link javaDebugNumber Debug
569 hi def link javaDebugSpecial DebugSpecial
570 hi def link javaDebugSpecialCharacter DebugSpecial
571 hi def link javaDebugCharacter DebugString
572 hi def link javaDebugParen Debug
Bram Moolenaar071d4272004-06-13 20:20:40 +0000573
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200574 hi def link DebugString String
575 hi def link DebugSpecial Special
576 hi def link DebugBoolean Boolean
577 hi def link DebugType Type
Bram Moolenaar071d4272004-06-13 20:20:40 +0000578endif
579
Aliaksei Budavei94c5d8a2024-06-19 20:10:47 +0200580" Try not to fold top-level-type bodies under assumption that there is
581" but one such body.
582exec 'syn region javaBlock transparent start="\%(^\|^\S[^:]\+\)\@' . s:ff.Peek('120', '') . '<!{" end="}" fold'
583
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200584if exists("g:java_mark_braces_in_parens_as_errors")
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300585 syn match javaInParen contained "[{}]"
586 hi def link javaInParen javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000587endif
588
589" catch errors caused by wrong parenthesis
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200590syn region javaParenT transparent matchgroup=javaParen start="(" end=")" contains=@javaTop,javaInParen,javaParenT1
591syn region javaParenT1 contained transparent matchgroup=javaParen1 start="(" end=")" contains=@javaTop,javaInParen,javaParenT2
592syn region javaParenT2 contained transparent matchgroup=javaParen2 start="(" end=")" contains=@javaTop,javaInParen,javaParenT
593syn match javaParenError ")"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000594" catch errors caused by wrong square parenthesis
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200595syn region javaParenT transparent matchgroup=javaParen start="\[" end="\]" contains=@javaTop,javaParenT1
596syn region javaParenT1 contained transparent matchgroup=javaParen1 start="\[" end="\]" contains=@javaTop,javaParenT2
597syn region javaParenT2 contained transparent matchgroup=javaParen2 start="\[" end="\]" contains=@javaTop,javaParenT
598syn match javaParenError "\]"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000599
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200600" Lambda expressions (JLS-17, §15.27) and method reference expressions
601" (JLS-17, §15.13).
602if exists("g:java_highlight_functions")
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200603 syn match javaMethodRef ":::\@!"
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200604
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200605 if exists("g:java_highlight_signature")
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200606 let s:ff.LambdaDef = s:ff.LeftConstant
607 else
608 let s:ff.LambdaDef = s:ff.RightConstant
609 endif
610
Aliaksei Budavei40524742024-04-14 19:57:00 +0300611 " Make ()-matching definitions after the parenthesis error catcher.
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300612 "
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200613 " Note that here and elsewhere a single-line token is used for \z,
614 " with other tokens repeated as necessary, to overcome the lack of
615 " support for multi-line matching with \z.
616 "
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300617 " Match: ([@A [@B ...] final] var a[, var b, ...]) ->
618 " | ([@A [@B ...] final] T[<α>][[][]] a[, T b, ...]) ->
619 " There is no recognition of expressions interspersed with comments
620 " or of expressions whose parameterised parameter types are written
621 " across multiple lines.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200622 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 +0300623 " Match: () ->
624 " | (a[, b, ...]) ->
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200625 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 +0300626 " Match: a ->
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200627 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 +0300628
629 syn keyword javaParamModifier contained final
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300630 syn keyword javaLambdaVarType contained var
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200631 hi def link javaParamModifier javaConceptKind
632 hi def link javaLambdaVarType javaOperator
633 hi def link javaLambdaDef javaFuncDef
634 hi def link javaLambdaDefStart javaFuncDef
635 hi def link javaMethodRef javaFuncDef
636 hi def link javaFuncDef Function
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100637endif
638
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300639" The @javaTop cluster comprises non-contained Java syntax groups.
640" Note that the syntax file "aidl.vim" relies on its availability.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200641syn cluster javaTop contains=TOP,javaTopEnumDeclaration
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300642
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200643if !exists("g:java_minlines")
644 let g:java_minlines = 10
Bram Moolenaar071d4272004-06-13 20:20:40 +0000645endif
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300646
647" Note that variations of a /*/ balanced comment, e.g., /*/*/, /*//*/,
648" /* /*/, /* /*/, etc., may have their rightmost /*/ part accepted
649" as a comment start by ':syntax sync ccomment'; consider alternatives
650" to make synchronisation start further towards file's beginning by
651" bumping up g:java_minlines or issuing ':syntax sync fromstart' or
652" preferring &foldmethod set to 'syntax'.
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200653exec "syn sync ccomment javaComment minlines=" . g:java_minlines
Bram Moolenaar071d4272004-06-13 20:20:40 +0000654
655" The default highlighting.
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200656hi def link javaVarArg Function
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200657hi def link javaBranch Conditional
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200658hi def link javaConditional Conditional
659hi def link javaRepeat Repeat
660hi def link javaExceptions Exception
661hi def link javaAssert Statement
662hi def link javaStorageClass StorageClass
663hi def link javaMethodDecl javaStorageClass
664hi def link javaClassDecl javaStorageClass
665hi def link javaScopeDecl javaStorageClass
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100666hi def link javaConceptKind NonText
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200667
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200668hi def link javaBoolean Boolean
669hi def link javaSpecial Special
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200670hi def link javaSpecialError Error
671hi def link javaSpecialCharError Error
672hi def link javaString String
673hi def link javaCharacter Character
674hi def link javaSpecialChar SpecialChar
675hi def link javaNumber Number
676hi def link javaError Error
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200677hi def link javaError2 javaError
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300678hi def link javaTextBlockError Error
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200679hi def link javaParenError javaError
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200680hi def link javaStatement Statement
681hi def link javaOperator Operator
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200682hi def link javaConstant Constant
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200683hi def link javaTypedef Typedef
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200684hi def link javaTodo Todo
685hi def link javaAnnotation PreProc
Aliaksei Budavei902b7662024-06-13 18:30:09 +0300686hi def link javaAnnotationStart javaAnnotation
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200687hi def link javaType Type
688hi def link javaExternal Include
Bram Moolenaar071d4272004-06-13 20:20:40 +0000689
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200690hi def link javaUserLabel Label
691hi def link javaUserLabelRef javaUserLabel
692hi def link javaLabel Label
693hi def link javaLabelDefault javaLabel
694hi def link javaLabelVarType javaOperator
695hi def link javaLabelNumber javaNumber
696hi def link javaLabelCastType javaType
Bram Moolenaar071d4272004-06-13 20:20:40 +0000697
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200698hi def link javaComment Comment
699hi def link javaCommentStar javaComment
700hi def link javaLineComment Comment
701hi def link javaCommentMarkupTagAttr javaHtmlArg
702hi def link javaCommentString javaString
703hi def link javaComment2String javaString
704hi def link javaCommentCharacter javaCharacter
705hi def link javaCommentError javaError
706hi def link javaCommentStart javaComment
707
708hi def link javaHtmlArg Type
709hi def link javaHtmlString String
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200710
Bram Moolenaar071d4272004-06-13 20:20:40 +0000711let b:current_syntax = "java"
712
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200713if g:main_syntax == 'java'
714 unlet g:main_syntax
Bram Moolenaar071d4272004-06-13 20:20:40 +0000715endif
716
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200717let b:spell_options = "contained"
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +0200718let &cpo = s:cpo_save
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200719unlet s:ff s:cpo_save
Bram Moolenaar071d4272004-06-13 20:20:40 +0000720
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300721" See ":help vim9-mix".
722if !has("vim9script")
723 finish
724endif
725
Aliaksei Budavei2750b832024-08-22 21:09:32 +0200726if exists("g:java_foldtext_show_first_or_second_line")
727 def! s:LazyPrefix(prefix: string, dashes: string, count: number): string
728 return empty(prefix)
729 ? printf('+-%s%3d lines: ', dashes, count)
730 : prefix
731 enddef
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300732
Aliaksei Budavei2750b832024-08-22 21:09:32 +0200733 def! s:JavaSyntaxFoldTextExpr(): string
734 # Piggyback on NGETTEXT.
735 const summary: string = foldtext()
736 return getline(v:foldstart) !~ '/\*\+\s*$'
737 ? summary
738 : LazyPrefix(matchstr(summary, '^+-\+\s*\d\+\s.\{-1,}:\s'),
739 v:folddashes,
740 (v:foldend - v:foldstart + 1)) ..
741 getline(v:foldstart + 1)
742 enddef
743
744 setlocal foldtext=s:JavaSyntaxFoldTextExpr()
745 delfunction! g:JavaSyntaxFoldTextExpr
746endif
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300747" vim: sw=2 ts=8 noet sta