blob: 9b38ccd4dc77015a86a608a7d185c9327a408241 [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 Budaveicd960752025-01-03 17:38:14 +01006" Last Change: 2025 Jan 02
Bram Moolenaar071d4272004-06-13 20:20:40 +00007
Aliaksei Budavei60310a42024-10-04 20:25:05 +02008" Please check ":help java.vim" for comments on some of the options
9" available.
Bram Moolenaar071d4272004-06-13 20:20:40 +000010
Aliaksei Budavei60310a42024-10-04 20:25:05 +020011" Do not aggregate syntax items from circular inclusion.
12if exists("b:current_syntax")
13 finish
14endif
15
16if exists("g:main_syntax")
17 " Reject attendant circularity for every :syn-included syntax file,
18 " but ACCEPT FAILURE when "g:main_syntax" is set to "java".
19 if g:main_syntax == 'html'
20 if !exists("g:java_ignore_html")
21 let g:java_ignore_html = 1
22 let s:clear_java_ignore_html = 1
23 endif
24 elseif g:main_syntax == 'markdown'
25 if !exists("g:java_ignore_markdown")
26 let g:java_ignore_markdown = 1
27 let s:clear_java_ignore_markdown = 1
28 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000029 endif
Aliaksei Budavei60310a42024-10-04 20:25:05 +020030else
31 " Allow syntax files that include this file test for its inclusion.
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +020032 let g:main_syntax = 'java'
Bram Moolenaar071d4272004-06-13 20:20:40 +000033endif
34
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +020035let s:cpo_save = &cpo
36set cpo&vim
37
Aliaksei Budaveid3952e82024-05-11 00:39:31 +030038"""" STRIVE TO REMAIN COMPATIBLE FOR AT LEAST VIM 7.0.
39let s:ff = {}
40
41function! s:ff.LeftConstant(x, y) abort
42 return a:x
43endfunction
44
45function! s:ff.RightConstant(x, y) abort
46 return a:y
47endfunction
48
Aliaksei Budavei8556e232024-08-27 22:32:13 +020049function! s:ff.IsRequestedPreviewFeature(n) abort
50 return exists("g:java_syntax_previews") && index(g:java_syntax_previews, a:n) + 1
51endfunction
52
Aliaksei Budaveid3952e82024-05-11 00:39:31 +030053if !exists("*s:ReportOnce")
54 function s:ReportOnce(message) abort
55 echomsg 'syntax/java.vim: ' . a:message
56 endfunction
57else
58 function! s:ReportOnce(dummy)
59 endfunction
60endif
61
Aliaksei Budavei2750b832024-08-22 21:09:32 +020062if exists("g:java_foldtext_show_first_or_second_line")
63 function! s:LazyPrefix(prefix, dashes, count) abort
64 return empty(a:prefix)
65 \ ? printf('+-%s%3d lines: ', a:dashes, a:count)
66 \ : a:prefix
67 endfunction
Aliaksei Budavei371bab02024-06-16 09:42:55 +030068
Aliaksei Budavei2750b832024-08-22 21:09:32 +020069 function! JavaSyntaxFoldTextExpr() abort
70 " Piggyback on NGETTEXT.
71 let summary = foldtext()
72 return getline(v:foldstart) !~ '/\*\+\s*$'
73 \ ? summary
74 \ : s:LazyPrefix(matchstr(summary, '^+-\+\s*\d\+\s.\{-1,}:\s'),
75 \ v:folddashes,
76 \ (v:foldend - v:foldstart + 1)) .
77 \ getline(v:foldstart + 1)
78 endfunction
79
80 " E120 for "fdt=s:JavaSyntaxFoldTextExpr()" before v8.2.3900.
81 setlocal foldtext=JavaSyntaxFoldTextExpr()
82endif
Aliaksei Budavei371bab02024-06-16 09:42:55 +030083
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020084" Admit the ASCII dollar sign to keyword characters (JLS-17, §3.8):
Aliaksei Budaveid3952e82024-05-11 00:39:31 +030085try
86 exec 'syntax iskeyword ' . &l:iskeyword . ',$'
87catch /\<E410:/
88 call s:ReportOnce(v:exception)
89 setlocal iskeyword+=$
90endtry
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020091
Bram Moolenaar071d4272004-06-13 20:20:40 +000092" some characters that cannot be in a java program (outside a string)
93syn match javaError "[\\@`]"
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +010094syn match javaError "<<<\|\.\.\|=>\|||=\|&&=\|\*\/"
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +020095
Bram Moolenaar071d4272004-06-13 20:20:40 +000096" use separate name so that it can be deleted in javacc.vim
97syn match javaError2 "#\|=<"
Bram Moolenaar071d4272004-06-13 20:20:40 +000098
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020099" Keywords (JLS-17, §3.9):
Bram Moolenaar071d4272004-06-13 20:20:40 +0000100syn keyword javaExternal native package
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200101syn match javaExternal "\<import\>\%(\s\+static\>\)\="
Bram Moolenaar071d4272004-06-13 20:20:40 +0000102syn keyword javaError goto const
103syn keyword javaConditional if else switch
104syn keyword javaRepeat while for do
105syn keyword javaBoolean true false
106syn keyword javaConstant null
107syn keyword javaTypedef this super
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200108syn keyword javaOperator new instanceof
109syn match javaOperator "\<var\>\%(\s*(\)\@!"
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300110
Aliaksei Budavei50423ab2024-09-20 21:37:46 +0200111if s:ff.IsRequestedPreviewFeature(476)
112 " Module imports can be used in any source file.
113 syn match javaExternal "\<import\s\+module\>" contains=javaModuleImport
114 syn keyword javaModuleImport contained module
115 hi def link javaModuleImport Statement
116endif
117
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100118" Since the yield statement, which could take a parenthesised operand,
119" and _qualified_ yield methods get along within the switch block
120" (JLS-17, §3.8), it seems futile to make a region definition for this
121" block; instead look for the _yield_ word alone, and if found,
122" backtrack (arbitrarily) 80 bytes, at most, on the matched line and,
123" if necessary, on the line before that (h: \@<=), trying to match
124" neither a method reference nor a qualified method invocation.
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300125try
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200126 syn match javaOperator "\%(\%(::\|\.\)[[:space:]\n]*\)\@80<!\<yield\>"
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300127 let s:ff.Peek = s:ff.LeftConstant
128catch /\<E59:/
129 call s:ReportOnce(v:exception)
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200130 syn match javaOperator "\%(\%(::\|\.\)[[:space:]\n]*\)\@<!\<yield\>"
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300131 let s:ff.Peek = s:ff.RightConstant
132endtry
133
Bram Moolenaar071d4272004-06-13 20:20:40 +0000134syn keyword javaType boolean char byte short int long float double
135syn keyword javaType void
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100136syn keyword javaStatement return
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200137syn keyword javaStorageClass static synchronized transient volatile strictfp
Bram Moolenaar071d4272004-06-13 20:20:40 +0000138syn keyword javaExceptions throw try catch finally
139syn keyword javaAssert assert
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200140syn keyword javaMethodDecl throws
141" Differentiate a "MyClass.class" literal from the keyword "class".
Bram Moolenaar071d4272004-06-13 20:20:40 +0000142syn match javaTypedef "\.\s*\<class\>"ms=s+1
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200143syn keyword javaClassDecl enum extends implements interface
144syn match javaClassDecl "\<permits\>\%(\s*(\)\@!"
145syn match javaClassDecl "\<record\>\%(\s*(\)\@!"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000146syn match javaClassDecl "^class\>"
147syn match javaClassDecl "[^.]\s*\<class\>"ms=s+1
Aliaksei Budavei40524742024-04-14 19:57:00 +0300148syn match javaAnnotation "@\%(\K\k*\.\)*\K\k*\>"
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300149syn 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 +0200150syn match javaClassDecl "@interface\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000151syn keyword javaBranch break continue nextgroup=javaUserLabelRef skipwhite
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200152syn match javaUserLabelRef contained "\k\+"
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000153syn match javaVarArg "\.\.\."
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200154syn keyword javaScopeDecl public protected private
155syn keyword javaConceptKind abstract final
156syn match javaConceptKind "\<non-sealed\>"
157syn match javaConceptKind "\<sealed\>\%(\s*(\)\@!"
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100158syn match javaConceptKind "\<default\>\%(\s*\%(:\|->\)\)\@!"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000159
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300160if !(v:version < 704)
161 " Request the new regexp engine for [:upper:] and [:lower:].
162 let [s:ff.Engine, s:ff.UpperCase, s:ff.LowerCase] = repeat([s:ff.LeftConstant], 3)
163else
164 " XXX: \C\<[^a-z0-9]\k*\> rejects "type", but matches "τύπος".
165 " XXX: \C\<[^A-Z0-9]\k*\> rejects "Method", but matches "Μέθοδος".
166 let [s:ff.Engine, s:ff.UpperCase, s:ff.LowerCase] = repeat([s:ff.RightConstant], 3)
167endif
Bram Moolenaar63f32602022-06-09 20:45:54 +0100168
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200169if exists("g:java_highlight_signature")
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200170 let [s:ff.PeekTo, s:ff.PeekFrom, s:ff.GroupArgs] = repeat([s:ff.LeftConstant], 3)
171else
172 let [s:ff.PeekTo, s:ff.PeekFrom, s:ff.GroupArgs] = repeat([s:ff.RightConstant], 3)
173endif
174
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200175let s:with_html = !exists("g:java_ignore_html")
176let s:with_markdown = !exists("g:java_ignore_markdown")
177lockvar s:with_html s:with_markdown
178
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200179" Java module declarations (JLS-17, §7.7).
180"
181" Note that a "module-info" file will be recognised with an arbitrary
182" file extension (or no extension at all) so that more than one such
183" declaration for the same Java module can be maintained for modular
184" testing in a project without attendant confusion for IDEs, with the
185" ".java\=" extension used for a production version and an arbitrary
186" extension used for a testing version.
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200187if fnamemodify(bufname("%"), ":t") =~ '^module-info\>\%(\.class\>\)\@!'
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200188 syn keyword javaModuleStorageClass module transitive
189 syn keyword javaModuleStmt open requires exports opens uses provides
190 syn keyword javaModuleExternal to with
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200191 hi def link javaModuleStorageClass StorageClass
192 hi def link javaModuleStmt Statement
193 hi def link javaModuleExternal Include
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200194
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200195 if !exists("g:java_ignore_javadoc") && (s:with_html || s:with_markdown) && g:main_syntax != 'jsp'
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200196 syn match javaDocProvidesTag contained "@provides\_s\+\S\+" contains=javaDocParam
197 syn match javaDocUsesTag contained "@uses\_s\+\S\+" contains=javaDocParam
198 hi def link javaDocProvidesTag Special
199 hi def link javaDocUsesTag Special
200 endif
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200201endif
202
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200203" Fancy parameterised types (JLS-17, §4.5).
204"
205" Note that false positives may elsewhere occur whenever an identifier
206" is butted against a less-than operator. Cf. (X<Y) and (X < Y).
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200207if exists("g:java_highlight_generics")
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200208 syn keyword javaWildcardBound contained extends super
209
210 " Parameterised types are delegated to javaGenerics (s:ctx.gsg) and
211 " are not matched with javaTypeArgument.
212 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*\>\)\%(\[\]\)*"'
213
214 for s:ctx in [{'dsg': 'javaDimExpr', 'gsg': 'javaGenerics', 'ghg': 'javaGenericsC1', 'csg': 'javaGenericsX', 'c': ''},
215 \ {'dsg': 'javaDimExprX', 'gsg': 'javaGenericsX', 'ghg': 'javaGenericsC2', 'csg': 'javaGenerics', 'c': ' contained'}]
216 " Consider array creation expressions of reifiable types.
217 exec 'syn region ' . s:ctx.dsg . ' contained transparent matchgroup=' . s:ctx.ghg . ' start="\[" end="\]" nextgroup=' . s:ctx.dsg . ' skipwhite skipnl'
218 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'
219 endfor
220
221 unlet s:ctx
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200222 hi def link javaWildcardBound Question
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200223 hi def link javaGenericsC1 Function
224 hi def link javaGenericsC2 Type
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200225endif
226
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200227if exists("g:java_highlight_java_lang_ids")
228 let g:java_highlight_all = 1
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000229endif
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200230if exists("g:java_highlight_all") || exists("g:java_highlight_java") || exists("g:java_highlight_java_lang")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000231 " java.lang.*
Bram Moolenaar63f32602022-06-09 20:45:54 +0100232 "
233 " The keywords of javaR_JavaLang, javaC_JavaLang, javaE_JavaLang,
234 " and javaX_JavaLang are sub-grouped according to the Java version
235 " of their introduction, and sub-group keywords (that is, class
236 " names) are arranged in alphabetical order, so that future newer
237 " keywords can be pre-sorted and appended without disturbing
238 " the current keyword placement. The below _match_es follow suit.
239
Aliaksei Budavei63d68c22024-03-26 20:12:05 +0300240 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 +0000241 syn cluster javaClasses add=javaR_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200242 hi def link javaR_JavaLang javaR_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100243 " Member enumerations:
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300244 exec 'syn match javaC_JavaLang "\%(\<Thread\.\)\@' . s:ff.Peek('7', '') . '<=\<State\>"'
245 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<UnicodeScript\>"'
246 exec 'syn match javaC_JavaLang "\%(\<ProcessBuilder\.Redirect\.\)\@' . s:ff.Peek('24', '') . '<=\<Type\>"'
247 exec 'syn match javaC_JavaLang "\%(\<StackWalker\.\)\@' . s:ff.Peek('12', '') . '<=\<Option\>"'
248 exec 'syn match javaC_JavaLang "\%(\<System\.Logger\.\)\@' . s:ff.Peek('14', '') . '<=\<Level\>"'
Bram Moolenaar63f32602022-06-09 20:45:54 +0100249 " Member classes:
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300250 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<Subset\>"'
251 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<UnicodeBlock\>"'
252 exec 'syn match javaC_JavaLang "\%(\<ProcessBuilder\.\)\@' . s:ff.Peek('15', '') . '<=\<Redirect\>"'
253 exec 'syn match javaC_JavaLang "\%(\<ModuleLayer\.\)\@' . s:ff.Peek('12', '') . '<=\<Controller\>"'
254 exec 'syn match javaC_JavaLang "\%(\<Runtime\.\)\@' . s:ff.Peek('8', '') . '<=\<Version\>"'
255 exec 'syn match javaC_JavaLang "\%(\<System\.\)\@' . s:ff.Peek('7', '') . '<=\<LoggerFinder\>"'
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200256 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 +0100257 syn match javaC_JavaLang "\<System\>" " See javaDebug.
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200258
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200259 if !exists("g:java_highlight_generics")
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200260 " The non-interface parameterised names of java.lang members.
261 exec 'syn match javaC_JavaLang "\%(\<Enum\.\)\@' . s:ff.Peek('5', '') . '<=\<EnumDesc\>"'
262 syn keyword javaC_JavaLang Class InheritableThreadLocal ThreadLocal Enum ClassValue
263 endif
264
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200265 " As of JDK 21, java.lang.Compiler is no more (deprecated in JDK 9).
Aliaksei Budavei63d68c22024-03-26 20:12:05 +0300266 syn keyword javaLangDeprecated Compiler
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000267 syn cluster javaClasses add=javaC_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200268 hi def link javaC_JavaLang javaC_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100269 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 +0000270 syn cluster javaClasses add=javaE_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200271 hi def link javaE_JavaLang javaE_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100272 syn keyword javaX_JavaLang ClassNotFoundException CloneNotSupportedException Exception IllegalAccessException InstantiationException InterruptedException NoSuchMethodException Throwable NoSuchFieldException ReflectiveOperationException
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000273 syn cluster javaClasses add=javaX_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200274 hi def link javaX_JavaLang javaX_Java
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000275
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200276 hi def link javaR_Java javaR_
277 hi def link javaC_Java javaC_
278 hi def link javaE_Java javaE_
279 hi def link javaX_Java javaX_
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200280 hi def link javaX_ javaExceptions
281 hi def link javaR_ javaExceptions
282 hi def link javaE_ javaExceptions
283 hi def link javaC_ javaConstant
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000284
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200285 syn keyword javaLangObject getClass notify notifyAll wait
286
287 " Lower the syntax priority of overridable java.lang.Object method
288 " names for zero-width matching (define g:java_highlight_signature
289 " and see their base declarations for java.lang.Object):
290 syn match javaLangObject "\<clone\>"
291 syn match javaLangObject "\<equals\>"
292 syn match javaLangObject "\<finalize\>"
293 syn match javaLangObject "\<hashCode\>"
294 syn match javaLangObject "\<toString\>"
295 hi def link javaLangObject javaConstant
Bram Moolenaar071d4272004-06-13 20:20:40 +0000296endif
297
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300298if filereadable(expand("<sfile>:p:h") . "/javaid.vim")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000299 source <sfile>:p:h/javaid.vim
300endif
301
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200302if exists("g:java_space_errors")
303 if !exists("g:java_no_trail_space_error")
304 syn match javaSpaceError "\s\+$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000305 endif
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200306 if !exists("g:java_no_tab_space_error")
307 syn match javaSpaceError " \+\t"me=e-1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000308 endif
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200309 hi def link javaSpaceError Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000310endif
311
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200312exec 'syn match javaUserLabel "^\s*\<\K\k*\>\%(\<default\>\)\@' . s:ff.Peek('7', '') . '<!\s*::\@!"he=e-1'
Aliaksei Budavei23079452024-09-19 18:22:58 +0200313
314if s:ff.IsRequestedPreviewFeature(455)
315 syn region javaLabelRegion transparent matchgroup=javaLabel start="\<case\>" matchgroup=NONE end=":\|->" contains=javaBoolean,javaNumber,javaCharacter,javaString,javaConstant,@javaClasses,javaGenerics,javaType,javaLabelDefault,javaLabelVarType,javaLabelWhenClause
316else
317 syn region javaLabelRegion transparent matchgroup=javaLabel start="\<case\>" matchgroup=NONE end=":\|->" contains=javaLabelCastType,javaLabelNumber,javaCharacter,javaString,javaConstant,@javaClasses,javaGenerics,javaLabelDefault,javaLabelVarType,javaLabelWhenClause
318 syn keyword javaLabelCastType contained char byte short int
319 syn match javaLabelNumber contained "\<0\>[lL]\@!"
320 syn match javaLabelNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)\>[lL]\@!"
321 hi def link javaLabelCastType javaType
322 hi def link javaLabelNumber javaNumber
323endif
324
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100325syn region javaLabelRegion transparent matchgroup=javaLabel start="\<default\>\%(\s*\%(:\|->\)\)\@=" matchgroup=NONE end=":\|->" oneline
326" Consider grouped _default_ _case_ labels, i.e.
327" case null, default ->
328" case null: default:
329syn keyword javaLabelDefault contained default
330syn keyword javaLabelVarType contained var
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100331" Allow for the contingency of the enclosing region not being able to
332" _keep_ its _end_, e.g. case ':':.
Aliaksei Budaveid6b4afb2024-06-09 19:39:52 +0300333syn region javaLabelWhenClause contained transparent matchgroup=javaLabel start="\<when\>" matchgroup=NONE end=":"me=e-1 end="->"me=e-2 contains=TOP,javaExternal,javaLambdaDef
Bram Moolenaar071d4272004-06-13 20:20:40 +0000334
Bram Moolenaar071d4272004-06-13 20:20:40 +0000335" Comments
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200336syn keyword javaTodo contained TODO FIXME XXX
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300337
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200338if exists("g:java_comment_strings")
339 syn region javaCommentString contained start=+"+ end=+"+ end=+$+ end=+\*/+me=s-1,he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell
340 syn region javaCommentString contained start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell,javaSpecialError,javaTextBlockError
341 syn region javaComment2String contained start=+"+ end=+$\|"+ contains=javaSpecial,javaSpecialChar,@Spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000342 syn match javaCommentCharacter contained "'\\[^']\{1,6\}'" contains=javaSpecialChar
343 syn match javaCommentCharacter contained "'\\''" contains=javaSpecialChar
344 syn match javaCommentCharacter contained "'[^\\]'"
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300345 syn cluster javaCommentSpecial add=javaCommentString,javaCommentCharacter,javaNumber,javaStrTempl
346 syn cluster javaCommentSpecial2 add=javaComment2String,javaCommentCharacter,javaNumber,javaStrTempl
Bram Moolenaar071d4272004-06-13 20:20:40 +0000347endif
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300348
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200349syn region javaComment matchgroup=javaCommentStart start="/\*" end="\*/" contains=@javaCommentSpecial,javaTodo,javaCommentError,javaSpaceError,@Spell fold
350syn match javaCommentStar contained "^\s*\*[^/]"me=e-1
351syn match javaCommentStar contained "^\s*\*$"
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300352syn match javaLineComment "//.*" contains=@javaCommentSpecial2,javaTodo,javaCommentMarkupTag,javaSpaceError,@Spell
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300353syn match javaCommentMarkupTag contained "@\%(end\|highlight\|link\|replace\|start\)\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
354syn match javaCommentMarkupTagAttr contained "\<region\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200355exec '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 +0300356syn match javaCommentError contained "/\*"me=e-1 display
Bram Moolenaar071d4272004-06-13 20:20:40 +0000357
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200358if !exists("g:java_ignore_javadoc") && (s:with_html || s:with_markdown) && g:main_syntax != 'jsp'
359 " The overridable "html*" and "markdown*" default links must be
360 " defined _before_ the inclusion of the same default links from
361 " "html.vim" and "markdown.vim".
362 if s:with_html || s:with_markdown
363 hi def link htmlComment Special
364 hi def link htmlCommentPart Special
365 hi def link htmlArg Type
366 hi def link htmlString String
367 endif
368
369 if s:with_markdown
370 hi def link markdownCode Special
371 hi def link markdownCodeBlock Special
372 hi def link markdownCodeDelimiter Special
373 hi def link markdownLinkDelimiter Comment
374 endif
375
Bram Moolenaar071d4272004-06-13 20:20:40 +0000376 syntax case ignore
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300377
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200378 " Note that javaDocSeeTag is valid in HTML and Markdown.
379 let s:ff.WithMarkdown = s:ff.RightConstant
380
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300381 " Include HTML syntax coloring for Javadoc comments.
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200382 if s:with_html
Aliaksei Budavei60310a42024-10-04 20:25:05 +0200383 try
384 syntax include @javaHtml syntax/html.vim
385 finally
386 unlet! b:current_syntax
387 endtry
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200388 endif
389
390 " Include Markdown syntax coloring (v7.2.437) for Javadoc comments.
391 if s:with_markdown
392 try
393 syntax include @javaMarkdown syntax/markdown.vim
Aliaksei Budaveicd960752025-01-03 17:38:14 +0100394
395 try
396 syn clear markdownId markdownLineStart markdownH1 markdownH2 markdownHeadingRule markdownRule markdownCode markdownCodeBlock markdownIdDeclaration
397 let s:ff.WithMarkdown = s:ff.LeftConstant
398 catch /\<E28:/
399 call s:ReportOnce(v:exception)
400 let s:no_support = 1
401 unlet! g:java_ignore_markdown
402 let g:java_ignore_markdown = 28
403 endtry
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200404 catch /\<E48[45]:/
405 call s:ReportOnce(v:exception)
Aliaksei Budaveicd960752025-01-03 17:38:14 +0100406 let s:no_support = 1
Aliaksei Budavei60310a42024-10-04 20:25:05 +0200407 finally
408 unlet! b:current_syntax
Aliaksei Budaveicd960752025-01-03 17:38:14 +0100409
410 if exists("s:no_support")
411 unlet s:no_support
412 unlockvar s:with_markdown
413 let s:with_markdown = 0
414 lockvar s:with_markdown
415 hi clear markdownCode
416 hi clear markdownCodeBlock
417 hi clear markdownCodeDelimiter
418 hi clear markdownLinkDelimiter
419 endif
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200420 endtry
421 endif
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300422
423 " HTML enables spell checking for all text that is not in a syntax
424 " item (:syntax spell toplevel); instead, limit spell checking to
425 " items matchable with syntax groups containing the @Spell cluster.
426 try
427 syntax spell default
428 catch /\<E390:/
429 call s:ReportOnce(v:exception)
430 endtry
Bram Moolenaar5c736222010-01-06 20:54:52 +0100431
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200432 if s:with_markdown
433 syn region javaMarkdownComment start="///" skip="^\s*///.*$" end="^" keepend contains=javaMarkdownCommentTitle,javaMarkdownShortcutLink,@javaMarkdown,@javaDocTags,javaTodo,@Spell nextgroup=javaMarkdownCommentTitle fold
434 syn match javaMarkdownCommentMask contained "^\s*///"
435 exec 'syn region javaMarkdownCommentTitle contained matchgroup=javaMarkdownComment start="\%(///.*\r\=\n\s*\)\@' . s:ff.Peek('80', '') . '<!///" matchgroup=javaMarkdownCommentTitle end="\.$" end="\.[ \t\r]\@=" end="\n\%(\s*///\s*$\)\@=" end="\%(^\s*///\s*\)\@' . s:ff.Peek('80', '') . '<=@"me=s-2,he=s-1 contains=javaMarkdownShortcutLink,@javaMarkdown,javaMarkdownCommentMask,javaTodo,@Spell,@javaDocTags'
436 exec 'syn region javaMarkdownCommentTitle contained matchgroup=javaMarkdownComment start="\%(///.*\r\=\n\s*\)\@' . s:ff.Peek('80', '') . '<!///\s*\%({@return\>\)\@=" matchgroup=javaMarkdownCommentTitle end="}\%(\s*\.*\)*" contains=javaMarkdownShortcutLink,@javaMarkdown,javaMarkdownCommentMask,javaTodo,@Spell,@javaDocTags,javaTitleSkipBlock'
437 exec 'syn region javaMarkdownCommentTitle contained matchgroup=javaMarkdownComment start="\%(///.*\r\=\n\s*\)\@' . s:ff.Peek('80', '') . '<!///\s*\%({@summary\>\)\@=" matchgroup=javaMarkdownCommentTitle end="}" contains=javaMarkdownShortcutLink,@javaMarkdown,javaMarkdownCommentMask,javaTodo,@Spell,@javaDocTags,javaTitleSkipBlock'
438
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200439 " REDEFINE THE MARKDOWN ITEMS ANCHORED WITH "^", OBSERVING THE
440 " DEFINITION ORDER.
441 syn match markdownLineStart contained "^\s*///\s*[<@]\@!" contains=@markdownBlock,javaMarkdownCommentTitle,javaMarkdownCommentMask nextgroup=@markdownBlock,htmlSpecialChar
442 " See https://spec.commonmark.org/0.31.2/#setext-headings.
443 syn match markdownH1 contained "^\s*/// \{,3}.\+\r\=\n\s*/// \{,3}=\+\s*$" contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink,javaMarkdownCommentMask
444 syn match markdownH2 contained "^\s*/// \{,3}.\+\r\=\n\s*/// \{,3}-\+\s*$" contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink,javaMarkdownCommentMask
445 " See https://spec.commonmark.org/0.31.2/#atx-headings.
446 syn region markdownH1 contained matchgroup=markdownH1Delimiter start=" \{,3}#\s" end="#*\s*$" keepend contains=@markdownInline,markdownAutomaticLink oneline
447 syn region markdownH2 contained matchgroup=markdownH2Delimiter start=" \{,3}##\s" end="#*\s*$" keepend contains=@markdownInline,markdownAutomaticLink oneline
448 syn match markdownHeadingRule contained "^\s*/// \{,3}[=-]\+\s*$" contains=javaMarkdownCommentMask
449 " See https://spec.commonmark.org/0.31.2/#thematic-breaks.
450 syn match markdownRule contained "^\s*/// \{,3}\*\s*\*\%(\s*\*\)\+\s*$" contains=javaMarkdownCommentMask
451 syn match markdownRule contained "^\s*/// \{,3}_\s*_\%(\s*_\)\+\s*$" contains=javaMarkdownCommentMask
452 syn match markdownRule contained "^\s*/// \{,3}-\s*-\%(\s*-\)\+\s*$" contains=javaMarkdownCommentMask
453 " See https://spec.commonmark.org/0.31.2/#indented-code-blocks.
454 syn region markdownCodeBlock contained start="^\s*///\%( \{4,}\|\t\)" end="^\ze\s*///\%(\s*$\| \{,3}\S\)" keepend contains=javaMarkdownCommentMask
455 " See https://spec.commonmark.org/0.31.2/#code-spans.
456 syn region markdownCode contained matchgroup=markdownCodeDelimiter start="\z(`\+\) \=" end=" \=\z1" keepend contains=markdownLineStart,javaMarkdownCommentMask
457 " See https://spec.commonmark.org/0.31.2/#fenced-code-blocks.
458 syn region markdownCodeBlock contained start="^\s*/// \{,3}\z(```\+\)\%(.\{-}[^`]`\)\@!" end="^\s*/// \{,3}\z1`*" keepend contains=javaMarkdownCommentMask
459 syn region markdownCodeBlock contained start="^\s*/// \{,3}\z(\~\~\~\+\)" end="^\s*/// \{,3}\z1\~*" keepend contains=javaMarkdownCommentMask
460 " See https://spec.commonmark.org/0.31.2/#link-reference-definitions.
461 syn region markdownIdDeclaration contained matchgroup=markdownLinkDelimiter start="^\s*/// \{,3\}!\=\[" end="\]:" keepend contains=javaMarkdownCommentMask nextgroup=markdownUrl oneline skipwhite
462 " See https://spec.commonmark.org/0.31.2/#link-label.
463 syn region markdownId contained matchgroup=markdownIdDelimiter start="\[\%([\t ]\]\)\@!" end="\]" contains=javaMarkdownSkipBrackets,javaMarkdownCommentMask
464 " Note that escaped brackets can be unbalanced.
465 syn match javaMarkdownSkipBrackets contained transparent "\\\[\|\\\]"
466 " See https://spec.commonmark.org/0.31.2/#shortcut-reference-link.
467 syn region javaMarkdownShortcutLink contained matchgroup=markdownLinkTextDelimiter start="!\=\[^\@!\%(\_[^][]*\%(\[\_[^][]*\]\_[^][]*\)*]\%([[(]\)\@!\)\@=" end="\]\%([[(]\)\@!" contains=@markdownInline,markdownLineStart,javaMarkdownSkipBrackets,javaMarkdownCommentMask nextgroup=markdownLink,markdownId skipwhite
468
469 for s:name in ['markdownFootnoteDefinition', 'markdownFootnote']
470 if hlexists(s:name)
471 exec 'syn clear ' . s:name
472 endif
473 endfor
474
475 unlet s:name
476
477 " COMBAK: Footnotes are recognised by "markdown.vim", but are not
478 " in CommonMark. See https://pandoc.org/MANUAL.html#footnotes.
479""""syn match markdownFootnoteDefinition contained "^\s*///\s*\[^[^\]]\+\]:" contains=javaMarkdownCommentMask
480
481 hi def link javaMarkdownComment Comment
482 hi def link javaMarkdownCommentMask javaMarkdownComment
483 hi def link javaMarkdownCommentTitle SpecialComment
484 hi def link javaMarkdownShortcutLink htmlLink
485 endif
486
487 if s:with_html
488 syn region javaDocComment start="/\*\*" end="\*/" keepend contains=javaCommentTitle,@javaHtml,@javaDocTags,javaTodo,javaCommentError,javaSpaceError,@Spell fold
489 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'
490 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
491 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
492 hi def link javaDocComment Comment
493 hi def link javaCommentTitle SpecialComment
494 endif
495
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200496 " The members of javaDocTags are sub-grouped according to the Java
497 " version of their introduction, and sub-group members in turn are
498 " arranged in alphabetical order, so that future newer members can
499 " be pre-sorted and appended without disturbing the current member
500 " placement.
501 " Since they only have significance in javaCommentTitle, neither
502 " javaDocSummaryTag nor javaDocReturnTitleTag are defined.
503 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
504
505 " Anticipate non-standard inline tags in {@return} and {@summary}.
506 syn region javaTitleSkipBlock contained transparent start="{\%(@\%(return\|summary\)\>\)\@!" end="}"
507 syn match javaDocDocRootTag contained "{@docRoot}"
508 syn match javaDocInheritDocTag contained "{@inheritDoc}"
509 syn region javaIndexSkipBlock contained transparent start="{\%(@index\>\)\@!" end="}" contains=javaIndexSkipBlock,javaDocIndexTag
510 syn region javaDocIndexTag contained start="{@index\>" end="}" contains=javaDocIndexTag,javaIndexSkipBlock
511 syn region javaLinkSkipBlock contained transparent start="{\%(@link\>\)\@!" end="}" contains=javaLinkSkipBlock,javaDocLinkTag
512 syn region javaDocLinkTag contained start="{@link\>" end="}" contains=javaDocLinkTag,javaLinkSkipBlock
513 syn region javaLinkplainSkipBlock contained transparent start="{\%(@linkplain\>\)\@!" end="}" contains=javaLinkplainSkipBlock,javaDocLinkplainTag
514 syn region javaDocLinkplainTag contained start="{@linkplain\>" end="}" contains=javaDocLinkplainTag,javaLinkplainSkipBlock
515 syn region javaLiteralSkipBlock contained transparent start="{\%(@literal\>\)\@!" end="}" contains=javaLiteralSkipBlock,javaDocLiteralTag
516 syn region javaDocLiteralTag contained start="{@literal\>" end="}" contains=javaDocLiteralTag,javaLiteralSkipBlock
517 syn region javaSystemPropertySkipBlock contained transparent start="{\%(@systemProperty\>\)\@!" end="}" contains=javaSystemPropertySkipBlock,javaDocSystemPropertyTag
518 syn region javaDocSystemPropertyTag contained start="{@systemProperty\>" end="}" contains=javaDocSystemPropertyTag,javaSystemPropertySkipBlock
519 syn region javaValueSkipBlock contained transparent start="{\%(@value\>\)\@!" end="}" contains=javaValueSkipBlock,javaDocValueTag
520 syn region javaDocValueTag contained start="{@value\>" end="}" contains=javaDocValueTag,javaValueSkipBlock
521
522 syn match javaDocParam contained "\s\zs\S\+"
523 syn match javaDocExceptionTag contained "@exception\s\+\S\+" contains=javaDocParam
524 syn match javaDocParamTag contained "@param\s\+\S\+" contains=javaDocParam
525 syn match javaDocSinceTag contained "@since\s\+\S\+" contains=javaDocParam
526 syn match javaDocThrowsTag contained "@throws\s\+\S\+" contains=javaDocParam
527 syn match javaDocSpecTag contained "@spec\_s\+\S\+\ze\_s\+\S\+" contains=javaDocParam
528
529 syn match javaDocAuthorTag contained "@author\>"
530 syn match javaDocDeprecatedTag contained "@deprecated\>"
531 syn match javaDocHiddenTag contained "@hidden\>"
532 syn match javaDocReturnTag contained "@return\>"
533 syn match javaDocSerialTag contained "@serial\>"
534 syn match javaDocSerialDataTag contained "@serialData\>"
535 syn match javaDocSerialFieldTag contained "@serialField\>"
536 syn match javaDocVersionTag contained "@version\>"
537
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200538 syn match javaDocSeeTag contained "@see\>\s*" nextgroup=javaDocSeeTag1,javaDocSeeTag2,javaDocSeeTag3,javaDocSeeTag4,javaDocSeeTagStar,javaDocSeeTagSlash skipwhite skipempty
539
540 if s:with_html
541 syn match javaDocSeeTagStar contained "^\s*\*\+\%(\s*{\=@\|/\|$\)\@!" nextgroup=javaDocSeeTag1,javaDocSeeTag2,javaDocSeeTag3,javaDocSeeTag4 skipwhite skipempty
542 hi def link javaDocSeeTagStar javaDocComment
543 endif
544
545 if s:with_markdown
546 syn match javaDocSeeTagSlash contained "^\s*///\%(\s*{\=@\|$\)\@!" nextgroup=javaDocSeeTag1,javaDocSeeTag2,javaDocSeeTag3,javaDocSeeTag4 skipwhite skipempty
547 hi def link javaDocSeeTagSlash javaMarkdownComment
548 endif
549
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200550 syn match javaDocSeeTag1 contained @"\_[^"]\+"@
551 syn match javaDocSeeTag2 contained @<a\s\+\_.\{-}</a>@ contains=@javaHtml extend
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200552 exec 'syn match javaDocSeeTag3 contained @[' . s:ff.WithMarkdown('[', '') . '"< \t]\@!\%(\k\|[/.]\)*\%(##\=\k\+\%((\_[^)]*)\)\=\)\=@ nextgroup=javaDocSeeTag3Label skipwhite skipempty'
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200553 syn match javaDocSeeTag3Label contained @\k\%(\k\+\s*\)*$@
554
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200555 " COMBAK: No support for type javaDocSeeTag2 in Markdown.
556""if s:with_markdown
557"" syn match javaDocSeeTag4 contained @\[.\+\]\s\=\%(\[.\+\]\|(.\+)\)@ contains=@javaMarkdown extend
558"" hi def link javaDocSeeTag4 Special
559""endif
560
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300561 syn region javaCodeSkipBlock contained transparent start="{\%(@code\>\)\@!" end="}" contains=javaCodeSkipBlock,javaDocCodeTag
562 syn region javaDocCodeTag contained start="{@code\>" end="}" contains=javaDocCodeTag,javaCodeSkipBlock
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200563
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200564 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 +0300565 syn region javaSnippetSkipBlock contained transparent start="{\%(@snippet\>\)\@!" end="}" contains=javaSnippetSkipBlock,javaDocSnippetTag,javaCommentMarkupTag
566 syn region javaDocSnippetTag contained start="{@snippet\>" end="}" contains=javaDocSnippetTag,javaSnippetSkipBlock,javaDocSnippetTagAttr,javaCommentMarkupTag
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300567
Bram Moolenaar071d4272004-06-13 20:20:40 +0000568 syntax case match
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200569 hi def link javaDocParam Function
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200570
571 hi def link javaDocAuthorTag Special
572 hi def link javaDocCodeTag Special
573 hi def link javaDocDeprecatedTag Special
574 hi def link javaDocDocRootTag Special
575 hi def link javaDocExceptionTag Special
576 hi def link javaDocHiddenTag Special
577 hi def link javaDocIndexTag Special
578 hi def link javaDocInheritDocTag Special
579 hi def link javaDocLinkTag Special
580 hi def link javaDocLinkplainTag Special
581 hi def link javaDocLiteralTag Special
582 hi def link javaDocParamTag Special
583 hi def link javaDocReturnTag Special
584 hi def link javaDocSeeTag Special
585 hi def link javaDocSeeTag1 String
586 hi def link javaDocSeeTag2 Special
587 hi def link javaDocSeeTag3 Function
588 hi def link javaDocSerialTag Special
589 hi def link javaDocSerialDataTag Special
590 hi def link javaDocSerialFieldTag Special
591 hi def link javaDocSinceTag Special
592 hi def link javaDocSnippetTag Special
593 hi def link javaDocSpecTag Special
594 hi def link javaDocSystemPropertyTag Special
595 hi def link javaDocThrowsTag Special
596 hi def link javaDocValueTag Special
597 hi def link javaDocVersionTag Special
Bram Moolenaar071d4272004-06-13 20:20:40 +0000598endif
599
600" match the special comment /**/
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200601syn match javaComment "/\*\*/"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000602
603" Strings and constants
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200604syn match javaSpecialError contained "\\."
Bram Moolenaar071d4272004-06-13 20:20:40 +0000605syn match javaSpecialCharError contained "[^']"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300606" Escape Sequences (JLS-17, §3.10.7):
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200607syn match javaSpecialChar contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000608syn region javaString start=+"+ end=+"+ end=+$+ contains=javaSpecialChar,javaSpecialError,@Spell
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300609syn region javaString start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecialChar,javaSpecialError,javaTextBlockError,@Spell
610syn match javaTextBlockError +"""\s*"""+
Aliaksei Budavei8556e232024-08-27 22:32:13 +0200611
612if s:ff.IsRequestedPreviewFeature(430)
613 syn region javaStrTemplEmbExp contained matchgroup=javaStrTempl start="\\{" end="}" contains=TOP
614 exec 'syn region javaStrTempl start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,@Spell'
615 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'
616 hi def link javaStrTempl Macro
617endif
618
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200619syn match javaCharacter "'[^']*'" contains=javaSpecialChar,javaSpecialCharError
620syn match javaCharacter "'\\''" contains=javaSpecialChar
621syn match javaCharacter "'[^\\]'"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300622" Integer literals (JLS-17, §3.10.1):
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200623syn keyword javaNumber 0 0l 0L
624syn match javaNumber "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300625" Decimal floating-point literals (JLS-17, §3.10.2):
626" Against "\<\d\+\>\.":
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200627syn match javaNumber "\<\d\%(_*\d\)*\."
628syn match javaNumber "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
629syn match javaNumber "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
630syn match javaNumber "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300631" Hexadecimal floating-point literals (JLS-17, §3.10.2):
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200632syn match javaNumber "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000633
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300634" Unicode characters
635syn match javaSpecial "\\u\x\x\x\x"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000636
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200637" Method declarations (JLS-17, §8.4.3, §8.4.4, §9.4).
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200638if exists("g:java_highlight_functions")
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200639 syn cluster javaFuncParams contains=javaAnnotation,@javaClasses,javaGenerics,javaType,javaVarArg,javaComment,javaLineComment
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200640
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200641 if exists("g:java_highlight_signature")
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200642 syn cluster javaFuncParams add=javaParamModifier
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200643 hi def link javaFuncDefStart javaFuncDef
644 else
645 syn cluster javaFuncParams add=javaScopeDecl,javaConceptKind,javaStorageClass,javaExternal
646 endif
647
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200648 if g:java_highlight_functions =~# '^indent[1-8]\=$'
649 let s:last = g:java_highlight_functions[-1 :]
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300650 let s:indent = s:last != 't' ? repeat("\x20", s:last) : "\t"
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300651 " Try to not match other type members, initialiser blocks, enum
652 " constants (JLS-17, §8.9.1), and constructors (JLS-17, §8.1.7):
653 " at any _conventional_ indentation, skip over all fields with
654 " "[^=]*", all records with "\<record\s", and let the "*Skip*"
655 " definitions take care of constructor declarations and enum
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200656 " constants (with no support for @Foo(value = "bar")). Also,
657 " reject inlined declarations with "[^{]" for signature.
658 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 +0300659 " As long as package-private constructors cannot be matched with
660 " javaFuncDef, do not look with javaConstructorSkipDeclarator for
661 " them.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200662 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'
663 " With a zero-width span for signature applicable on demand to
664 " javaFuncDef, make related adjustments:
665 " (1) Claim all enum constants of a line as a unit.
666 exec 'syn match javaEnumSkipConstant contained transparent /^' . s:indent . '\%(\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)*\K\k*\s*\%((.*)\)\=\s*[,;({]\s*\)\+/ contains=@javaEnumConstants'
667 " (2) Define a syntax group for top level enumerations and tell
668 " apart their constants from method declarations.
669 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'
670 " (3) Define a base variant of javaParenT without using @javaTop
671 " in order to not include javaFuncDef.
672 syn region javaParenE transparent matchgroup=javaParen start="(" end=")" contains=@javaEnumConstants,javaInParen
673 syn region javaParenE transparent matchgroup=javaParen start="\[" end="\]" contains=@javaEnumConstants
674 syn cluster javaEnumConstants contains=TOP,javaTopEnumDeclaration,javaFuncDef,javaParenT
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300675 unlet s:indent s:last
Bram Moolenaar071d4272004-06-13 20:20:40 +0000676 else
Aliaksei Budavei40524742024-04-14 19:57:00 +0300677 " This is the "style" variant (:help ft-java-syntax).
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200678
679 " Match arbitrarily indented camelCasedName method declarations.
680 " Match: [@ɐ] [abstract] [<α, β>] Τʬ[<γ>][[][]] μʭʭ(/* ... */);
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200681 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 +0000682 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000683endif
684
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200685if exists("g:java_highlight_debug")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000686 " Strings and constants
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300687 syn match javaDebugSpecial contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200688 syn region javaDebugString contained start=+"+ end=+"+ contains=javaDebugSpecial
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300689 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 +0200690
691 if s:ff.IsRequestedPreviewFeature(430)
692 " The highlight groups of java{StrTempl,Debug{,Paren,StrTempl}}\,
693 " share one colour by default. Do not conflate unrelated parens.
694 syn region javaDebugStrTemplEmbExp contained matchgroup=javaDebugStrTempl start="\\{" end="}" contains=javaComment,javaLineComment,javaDebug\%(Paren\)\@!.*
695 exec 'syn region javaDebugStrTempl contained start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ contains=javaDebugStrTemplEmbExp,javaDebugSpecial'
696 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'
697 hi def link javaDebugStrTempl Macro
698 endif
699
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300700 syn match javaDebugTextBlockError contained +"""\s*"""+
Bram Moolenaar071d4272004-06-13 20:20:40 +0000701 syn match javaDebugCharacter contained "'[^\\]'"
702 syn match javaDebugSpecialCharacter contained "'\\.'"
703 syn match javaDebugSpecialCharacter contained "'\\''"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300704 syn keyword javaDebugNumber contained 0 0l 0L
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300705 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\."
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300706 syn match javaDebugNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
707 syn match javaDebugNumber contained "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
708 syn match javaDebugNumber contained "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
709 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
710 syn match javaDebugNumber contained "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000711 syn keyword javaDebugBoolean contained true false
712 syn keyword javaDebugType contained null this super
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200713 syn region javaDebugParen contained start=+(+ end=+)+ contains=javaDebug.*,javaDebugParen
Bram Moolenaar071d4272004-06-13 20:20:40 +0000714
Aliaksei Budavei40524742024-04-14 19:57:00 +0300715 " To make this work, define the highlighting for these groups.
716 syn match javaDebug "\<System\.\%(out\|err\)\.print\%(ln\)\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
717" FIXME: What API does "p" belong to?
718" syn match javaDebug "\<p\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
719 syn match javaDebug "\<\K\k*\.printStackTrace\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
720" FIXME: What API do "trace*" belong to?
721" syn match javaDebug "\<trace[SL]\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
Bram Moolenaar071d4272004-06-13 20:20:40 +0000722
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200723 hi def link javaDebug Debug
724 hi def link javaDebugString DebugString
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200725 hi def link javaDebugTextBlockError Error
726 hi def link javaDebugType DebugType
727 hi def link javaDebugBoolean DebugBoolean
728 hi def link javaDebugNumber Debug
729 hi def link javaDebugSpecial DebugSpecial
730 hi def link javaDebugSpecialCharacter DebugSpecial
731 hi def link javaDebugCharacter DebugString
732 hi def link javaDebugParen Debug
Bram Moolenaar071d4272004-06-13 20:20:40 +0000733
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200734 hi def link DebugString String
735 hi def link DebugSpecial Special
736 hi def link DebugBoolean Boolean
737 hi def link DebugType Type
Bram Moolenaar071d4272004-06-13 20:20:40 +0000738endif
739
Aliaksei Budavei05d08932024-10-12 17:12:51 +0200740" Complement javaBlock and javaInParen for highlighting.
741syn region javaBlockOther transparent matchgroup=javaBlockOtherStart start="{" end="}"
742
Aliaksei Budavei94c5d8a2024-06-19 20:10:47 +0200743" Try not to fold top-level-type bodies under assumption that there is
744" but one such body.
Aliaksei Budavei05d08932024-10-12 17:12:51 +0200745exec 'syn region javaBlock transparent matchgroup=javaBlockStart start="\%(^\|^\S[^:]\+\)\@' . s:ff.Peek('120', '') . '<!{" end="}" fold'
Aliaksei Budavei94c5d8a2024-06-19 20:10:47 +0200746
Aliaksei Budavei05d08932024-10-12 17:12:51 +0200747" See "D.2.1 Anonymous Classes" at
748" https://web.archive.org/web/20010821025330/java.sun.com/docs/books/jls/first_edition/html/1.1Update.html#12959.
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200749if exists("g:java_mark_braces_in_parens_as_errors")
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300750 syn match javaInParen contained "[{}]"
751 hi def link javaInParen javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000752endif
753
754" catch errors caused by wrong parenthesis
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200755syn region javaParenT transparent matchgroup=javaParen start="(" end=")" contains=@javaTop,javaInParen,javaParenT1
756syn region javaParenT1 contained transparent matchgroup=javaParen1 start="(" end=")" contains=@javaTop,javaInParen,javaParenT2
757syn region javaParenT2 contained transparent matchgroup=javaParen2 start="(" end=")" contains=@javaTop,javaInParen,javaParenT
758syn match javaParenError ")"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000759" catch errors caused by wrong square parenthesis
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200760syn region javaParenT transparent matchgroup=javaParen start="\[" end="\]" contains=@javaTop,javaParenT1
761syn region javaParenT1 contained transparent matchgroup=javaParen1 start="\[" end="\]" contains=@javaTop,javaParenT2
762syn region javaParenT2 contained transparent matchgroup=javaParen2 start="\[" end="\]" contains=@javaTop,javaParenT
763syn match javaParenError "\]"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000764
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200765" Lambda expressions (JLS-17, §15.27) and method reference expressions
766" (JLS-17, §15.13).
767if exists("g:java_highlight_functions")
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200768 syn match javaMethodRef ":::\@!"
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200769
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200770 if exists("g:java_highlight_signature")
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200771 let s:ff.LambdaDef = s:ff.LeftConstant
772 else
773 let s:ff.LambdaDef = s:ff.RightConstant
774 endif
775
Aliaksei Budavei40524742024-04-14 19:57:00 +0300776 " Make ()-matching definitions after the parenthesis error catcher.
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300777 "
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200778 " Note that here and elsewhere a single-line token is used for \z,
779 " with other tokens repeated as necessary, to overcome the lack of
780 " support for multi-line matching with \z.
781 "
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300782 " Match: ([@A [@B ...] final] var a[, var b, ...]) ->
783 " | ([@A [@B ...] final] T[<α>][[][]] a[, T b, ...]) ->
784 " There is no recognition of expressions interspersed with comments
785 " or of expressions whose parameterised parameter types are written
786 " across multiple lines.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200787 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 +0300788 " Match: () ->
789 " | (a[, b, ...]) ->
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200790 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 +0300791 " Match: a ->
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200792 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 +0300793
794 syn keyword javaParamModifier contained final
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300795 syn keyword javaLambdaVarType contained var
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200796 hi def link javaParamModifier javaConceptKind
797 hi def link javaLambdaVarType javaOperator
798 hi def link javaLambdaDef javaFuncDef
799 hi def link javaLambdaDefStart javaFuncDef
800 hi def link javaMethodRef javaFuncDef
801 hi def link javaFuncDef Function
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100802endif
803
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300804" The @javaTop cluster comprises non-contained Java syntax groups.
805" Note that the syntax file "aidl.vim" relies on its availability.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200806syn cluster javaTop contains=TOP,javaTopEnumDeclaration
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300807
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200808if !exists("g:java_minlines")
809 let g:java_minlines = 10
Bram Moolenaar071d4272004-06-13 20:20:40 +0000810endif
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300811
812" Note that variations of a /*/ balanced comment, e.g., /*/*/, /*//*/,
813" /* /*/, /* /*/, etc., may have their rightmost /*/ part accepted
814" as a comment start by ':syntax sync ccomment'; consider alternatives
815" to make synchronisation start further towards file's beginning by
816" bumping up g:java_minlines or issuing ':syntax sync fromstart' or
817" preferring &foldmethod set to 'syntax'.
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200818exec "syn sync ccomment javaComment minlines=" . g:java_minlines
Bram Moolenaar071d4272004-06-13 20:20:40 +0000819
820" The default highlighting.
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200821hi def link javaVarArg Function
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200822hi def link javaBranch Conditional
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200823hi def link javaConditional Conditional
824hi def link javaRepeat Repeat
825hi def link javaExceptions Exception
826hi def link javaAssert Statement
827hi def link javaStorageClass StorageClass
828hi def link javaMethodDecl javaStorageClass
829hi def link javaClassDecl javaStorageClass
830hi def link javaScopeDecl javaStorageClass
Aliaksei Budavei5e95c8f2024-09-15 19:53:50 +0200831hi def link javaConceptKind javaStorageClass
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200832
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200833hi def link javaBoolean Boolean
834hi def link javaSpecial Special
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200835hi def link javaSpecialError Error
836hi def link javaSpecialCharError Error
837hi def link javaString String
838hi def link javaCharacter Character
839hi def link javaSpecialChar SpecialChar
840hi def link javaNumber Number
841hi def link javaError Error
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200842hi def link javaError2 javaError
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300843hi def link javaTextBlockError Error
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200844hi def link javaParenError javaError
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200845hi def link javaStatement Statement
846hi def link javaOperator Operator
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200847hi def link javaConstant Constant
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200848hi def link javaTypedef Typedef
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200849hi def link javaTodo Todo
850hi def link javaAnnotation PreProc
Aliaksei Budavei902b7662024-06-13 18:30:09 +0300851hi def link javaAnnotationStart javaAnnotation
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200852hi def link javaType Type
853hi def link javaExternal Include
Bram Moolenaar071d4272004-06-13 20:20:40 +0000854
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200855hi def link javaUserLabel Label
856hi def link javaUserLabelRef javaUserLabel
857hi def link javaLabel Label
858hi def link javaLabelDefault javaLabel
859hi def link javaLabelVarType javaOperator
Bram Moolenaar071d4272004-06-13 20:20:40 +0000860
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200861hi def link javaComment Comment
862hi def link javaCommentStar javaComment
863hi def link javaLineComment Comment
864hi def link javaCommentMarkupTagAttr javaHtmlArg
865hi def link javaCommentString javaString
866hi def link javaComment2String javaString
867hi def link javaCommentCharacter javaCharacter
868hi def link javaCommentError javaError
869hi def link javaCommentStart javaComment
870
871hi def link javaHtmlArg Type
872hi def link javaHtmlString String
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200873
Bram Moolenaar071d4272004-06-13 20:20:40 +0000874let b:current_syntax = "java"
875
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200876if g:main_syntax == 'java'
877 unlet g:main_syntax
Bram Moolenaar071d4272004-06-13 20:20:40 +0000878endif
879
Aliaksei Budavei60310a42024-10-04 20:25:05 +0200880if exists("s:clear_java_ignore_html")
881 unlet! s:clear_java_ignore_html g:java_ignore_html
882endif
883
884if exists("s:clear_java_ignore_markdown")
885 unlet! s:clear_java_ignore_markdown g:java_ignore_markdown
886endif
887
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200888let b:spell_options = "contained"
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +0200889let &cpo = s:cpo_save
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200890unlet s:cpo_save s:ff s:with_html s:with_markdown
Bram Moolenaar071d4272004-06-13 20:20:40 +0000891
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300892" See ":help vim9-mix".
893if !has("vim9script")
894 finish
895endif
896
Aliaksei Budavei2750b832024-08-22 21:09:32 +0200897if exists("g:java_foldtext_show_first_or_second_line")
898 def! s:LazyPrefix(prefix: string, dashes: string, count: number): string
899 return empty(prefix)
900 ? printf('+-%s%3d lines: ', dashes, count)
901 : prefix
902 enddef
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300903
Aliaksei Budavei2750b832024-08-22 21:09:32 +0200904 def! s:JavaSyntaxFoldTextExpr(): string
905 # Piggyback on NGETTEXT.
906 const summary: string = foldtext()
907 return getline(v:foldstart) !~ '/\*\+\s*$'
908 ? summary
909 : LazyPrefix(matchstr(summary, '^+-\+\s*\d\+\s.\{-1,}:\s'),
910 v:folddashes,
911 (v:foldend - v:foldstart + 1)) ..
912 getline(v:foldstart + 1)
913 enddef
914
915 setlocal foldtext=s:JavaSyntaxFoldTextExpr()
916 delfunction! g:JavaSyntaxFoldTextExpr
917endif
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200918" vim: fdm=syntax sw=2 ts=8 noet sta