blob: 7c58ef2223320bbf2f8404f9e6641df3c396d348 [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 Budaveic413ac72025-06-10 20:37:39 +02006" Last Change: 2025 Jun 10
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 Budavei1054b182025-03-29 09:16:30 +010049function! s:ff.IsAnyRequestedPreviewFeatureOf(ns) abort
50 return exists("g:java_syntax_previews") &&
51 \ !empty(filter(a:ns, printf('index(%s, v:val) + 1',
52 \ string(g:java_syntax_previews))))
Aliaksei Budavei8556e232024-08-27 22:32:13 +020053endfunction
54
Aliaksei Budaveid3952e82024-05-11 00:39:31 +030055if !exists("*s:ReportOnce")
56 function s:ReportOnce(message) abort
57 echomsg 'syntax/java.vim: ' . a:message
58 endfunction
59else
60 function! s:ReportOnce(dummy)
61 endfunction
62endif
63
Aliaksei Budavei2750b832024-08-22 21:09:32 +020064if exists("g:java_foldtext_show_first_or_second_line")
65 function! s:LazyPrefix(prefix, dashes, count) abort
66 return empty(a:prefix)
67 \ ? printf('+-%s%3d lines: ', a:dashes, a:count)
68 \ : a:prefix
69 endfunction
Aliaksei Budavei371bab02024-06-16 09:42:55 +030070
Aliaksei Budavei2750b832024-08-22 21:09:32 +020071 function! JavaSyntaxFoldTextExpr() abort
72 " Piggyback on NGETTEXT.
73 let summary = foldtext()
74 return getline(v:foldstart) !~ '/\*\+\s*$'
75 \ ? summary
76 \ : s:LazyPrefix(matchstr(summary, '^+-\+\s*\d\+\s.\{-1,}:\s'),
77 \ v:folddashes,
78 \ (v:foldend - v:foldstart + 1)) .
79 \ getline(v:foldstart + 1)
80 endfunction
81
82 " E120 for "fdt=s:JavaSyntaxFoldTextExpr()" before v8.2.3900.
83 setlocal foldtext=JavaSyntaxFoldTextExpr()
84endif
Aliaksei Budavei371bab02024-06-16 09:42:55 +030085
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020086" Admit the ASCII dollar sign to keyword characters (JLS-17, §3.8):
Aliaksei Budaveid3952e82024-05-11 00:39:31 +030087try
88 exec 'syntax iskeyword ' . &l:iskeyword . ',$'
89catch /\<E410:/
90 call s:ReportOnce(v:exception)
91 setlocal iskeyword+=$
92endtry
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020093
Bram Moolenaar071d4272004-06-13 20:20:40 +000094" some characters that cannot be in a java program (outside a string)
95syn match javaError "[\\@`]"
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +010096syn match javaError "<<<\|\.\.\|=>\|||=\|&&=\|\*\/"
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +020097
Bram Moolenaar071d4272004-06-13 20:20:40 +000098" use separate name so that it can be deleted in javacc.vim
99syn match javaError2 "#\|=<"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000100
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200101" Keywords (JLS-17, §3.9):
Bram Moolenaar071d4272004-06-13 20:20:40 +0000102syn keyword javaExternal native package
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200103syn match javaExternal "\<import\>\%(\s\+static\>\)\="
Bram Moolenaar071d4272004-06-13 20:20:40 +0000104syn keyword javaError goto const
105syn keyword javaConditional if else switch
106syn keyword javaRepeat while for do
107syn keyword javaBoolean true false
108syn keyword javaConstant null
109syn keyword javaTypedef this super
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200110syn keyword javaOperator new instanceof
111syn match javaOperator "\<var\>\%(\s*(\)\@!"
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300112
Aliaksei Budavei1054b182025-03-29 09:16:30 +0100113if s:ff.IsAnyRequestedPreviewFeatureOf([476, 494])
Aliaksei Budavei50423ab2024-09-20 21:37:46 +0200114 " Module imports can be used in any source file.
115 syn match javaExternal "\<import\s\+module\>" contains=javaModuleImport
116 syn keyword javaModuleImport contained module
117 hi def link javaModuleImport Statement
118endif
119
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100120" Since the yield statement, which could take a parenthesised operand,
121" and _qualified_ yield methods get along within the switch block
122" (JLS-17, §3.8), it seems futile to make a region definition for this
123" block; instead look for the _yield_ word alone, and if found,
124" backtrack (arbitrarily) 80 bytes, at most, on the matched line and,
125" if necessary, on the line before that (h: \@<=), trying to match
126" neither a method reference nor a qualified method invocation.
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300127try
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200128 syn match javaOperator "\%(\%(::\|\.\)[[:space:]\n]*\)\@80<!\<yield\>"
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300129 let s:ff.Peek = s:ff.LeftConstant
130catch /\<E59:/
131 call s:ReportOnce(v:exception)
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200132 syn match javaOperator "\%(\%(::\|\.\)[[:space:]\n]*\)\@<!\<yield\>"
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300133 let s:ff.Peek = s:ff.RightConstant
134endtry
135
Bram Moolenaar071d4272004-06-13 20:20:40 +0000136syn keyword javaType boolean char byte short int long float double
137syn keyword javaType void
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100138syn keyword javaStatement return
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200139syn keyword javaStorageClass static synchronized transient volatile strictfp
Bram Moolenaar071d4272004-06-13 20:20:40 +0000140syn keyword javaExceptions throw try catch finally
141syn keyword javaAssert assert
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200142syn keyword javaMethodDecl throws
143" Differentiate a "MyClass.class" literal from the keyword "class".
Bram Moolenaar071d4272004-06-13 20:20:40 +0000144syn match javaTypedef "\.\s*\<class\>"ms=s+1
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200145syn keyword javaClassDecl enum extends implements interface
146syn match javaClassDecl "\<permits\>\%(\s*(\)\@!"
147syn match javaClassDecl "\<record\>\%(\s*(\)\@!"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000148syn match javaClassDecl "^class\>"
149syn match javaClassDecl "[^.]\s*\<class\>"ms=s+1
Aliaksei Budavei40524742024-04-14 19:57:00 +0300150syn match javaAnnotation "@\%(\K\k*\.\)*\K\k*\>"
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300151syn 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 +0200152syn match javaClassDecl "@interface\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000153syn keyword javaBranch break continue nextgroup=javaUserLabelRef skipwhite
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200154syn match javaUserLabelRef contained "\k\+"
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000155syn match javaVarArg "\.\.\."
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200156syn keyword javaScopeDecl public protected private
157syn keyword javaConceptKind abstract final
158syn match javaConceptKind "\<non-sealed\>"
159syn match javaConceptKind "\<sealed\>\%(\s*(\)\@!"
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100160syn match javaConceptKind "\<default\>\%(\s*\%(:\|->\)\)\@!"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000161
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300162if !(v:version < 704)
163 " Request the new regexp engine for [:upper:] and [:lower:].
164 let [s:ff.Engine, s:ff.UpperCase, s:ff.LowerCase] = repeat([s:ff.LeftConstant], 3)
165else
166 " XXX: \C\<[^a-z0-9]\k*\> rejects "type", but matches "τύπος".
167 " XXX: \C\<[^A-Z0-9]\k*\> rejects "Method", but matches "Μέθοδος".
168 let [s:ff.Engine, s:ff.UpperCase, s:ff.LowerCase] = repeat([s:ff.RightConstant], 3)
169endif
Bram Moolenaar63f32602022-06-09 20:45:54 +0100170
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200171if exists("g:java_highlight_signature")
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200172 let [s:ff.PeekTo, s:ff.PeekFrom, s:ff.GroupArgs] = repeat([s:ff.LeftConstant], 3)
173else
174 let [s:ff.PeekTo, s:ff.PeekFrom, s:ff.GroupArgs] = repeat([s:ff.RightConstant], 3)
175endif
176
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200177let s:with_html = !exists("g:java_ignore_html")
178let s:with_markdown = !exists("g:java_ignore_markdown")
179lockvar s:with_html s:with_markdown
180
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200181" Java module declarations (JLS-17, §7.7).
182"
183" Note that a "module-info" file will be recognised with an arbitrary
184" file extension (or no extension at all) so that more than one such
185" declaration for the same Java module can be maintained for modular
186" testing in a project without attendant confusion for IDEs, with the
187" ".java\=" extension used for a production version and an arbitrary
188" extension used for a testing version.
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200189if fnamemodify(bufname("%"), ":t") =~ '^module-info\>\%(\.class\>\)\@!'
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200190 syn keyword javaModuleStorageClass module transitive
191 syn keyword javaModuleStmt open requires exports opens uses provides
192 syn keyword javaModuleExternal to with
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200193 hi def link javaModuleStorageClass StorageClass
194 hi def link javaModuleStmt Statement
195 hi def link javaModuleExternal Include
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200196
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200197 if !exists("g:java_ignore_javadoc") && (s:with_html || s:with_markdown) && g:main_syntax != 'jsp'
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200198 syn match javaDocProvidesTag contained "@provides\_s\+\S\+" contains=javaDocParam
199 syn match javaDocUsesTag contained "@uses\_s\+\S\+" contains=javaDocParam
200 hi def link javaDocProvidesTag Special
201 hi def link javaDocUsesTag Special
202 endif
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200203endif
204
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200205if exists("g:java_highlight_java_lang_ids")
206 let g:java_highlight_all = 1
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000207endif
Aliaksei Budaveib577ad52025-06-01 18:29:37 +0200208
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200209if exists("g:java_highlight_all") || exists("g:java_highlight_java") || exists("g:java_highlight_java_lang")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000210 " java.lang.*
Bram Moolenaar63f32602022-06-09 20:45:54 +0100211 "
Aliaksei Budaveib577ad52025-06-01 18:29:37 +0200212 " The type names in ":syn-keyword"s (and in ":syn-match"es) of the
213 " "java[CEIRX]_JavaLang" syntax groups are sub-grouped according to
214 " the Java version of their introduction, and sub-group names are
215 " arranged in alphabetical order, so that future newer names can be
216 " pre-sorted and appended without disturbing their placement.
Bram Moolenaar63f32602022-06-09 20:45:54 +0100217
Aliaksei Budavei63d68c22024-03-26 20:12:05 +0300218 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 +0000219 syn cluster javaClasses add=javaR_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200220 hi def link javaR_JavaLang javaR_Java
Aliaksei Budaveic413ac72025-06-10 20:37:39 +0200221 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
222 syn match javaC_JavaLang "\<System\>" " See javaDebug.
223 " Generic non-interfaces:
224 syn match javaC_JavaLang "\<Class\>"
225 syn match javaC_JavaLang "\<InheritableThreadLocal\>"
226 syn match javaC_JavaLang "\<ThreadLocal\>"
227 syn match javaC_JavaLang "\<Enum\>"
228 syn match javaC_JavaLang "\<ClassValue\>"
229 exec 'syn match javaC_JavaLang "\%(\<Enum\.\)\@' . s:ff.Peek('5', '') . '<=\<EnumDesc\>"'
Bram Moolenaar63f32602022-06-09 20:45:54 +0100230 " Member classes:
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300231 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<Subset\>"'
232 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<UnicodeBlock\>"'
233 exec 'syn match javaC_JavaLang "\%(\<ProcessBuilder\.\)\@' . s:ff.Peek('15', '') . '<=\<Redirect\>"'
234 exec 'syn match javaC_JavaLang "\%(\<ModuleLayer\.\)\@' . s:ff.Peek('12', '') . '<=\<Controller\>"'
235 exec 'syn match javaC_JavaLang "\%(\<Runtime\.\)\@' . s:ff.Peek('8', '') . '<=\<Version\>"'
236 exec 'syn match javaC_JavaLang "\%(\<System\.\)\@' . s:ff.Peek('7', '') . '<=\<LoggerFinder\>"'
Aliaksei Budaveic413ac72025-06-10 20:37:39 +0200237 " Member enumerations:
238 exec 'syn match javaC_JavaLang "\%(\<Thread\.\)\@' . s:ff.Peek('7', '') . '<=\<State\>"'
239 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<UnicodeScript\>"'
240 exec 'syn match javaC_JavaLang "\%(\<ProcessBuilder\.Redirect\.\)\@' . s:ff.Peek('24', '') . '<=\<Type\>"'
241 exec 'syn match javaC_JavaLang "\%(\<StackWalker\.\)\@' . s:ff.Peek('12', '') . '<=\<Option\>"'
242 exec 'syn match javaC_JavaLang "\%(\<System\.Logger\.\)\@' . s:ff.Peek('14', '') . '<=\<Level\>"'
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000243 syn cluster javaClasses add=javaC_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200244 hi def link javaC_JavaLang javaC_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100245 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 +0000246 syn cluster javaClasses add=javaE_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200247 hi def link javaE_JavaLang javaE_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100248 syn keyword javaX_JavaLang ClassNotFoundException CloneNotSupportedException Exception IllegalAccessException InstantiationException InterruptedException NoSuchMethodException Throwable NoSuchFieldException ReflectiveOperationException
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000249 syn cluster javaClasses add=javaX_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200250 hi def link javaX_JavaLang javaX_Java
Aliaksei Budaveib577ad52025-06-01 18:29:37 +0200251 syn keyword javaI_JavaLang Cloneable Runnable CharSequence Appendable Deprecated Override Readable SuppressWarnings AutoCloseable SafeVarargs FunctionalInterface ProcessHandle
Aliaksei Budaveic413ac72025-06-10 20:37:39 +0200252 " Generic non-classes:
253 syn match javaI_JavaLang "\<Comparable\>"
254 syn match javaI_JavaLang "\<Iterable\>"
Aliaksei Budaveib577ad52025-06-01 18:29:37 +0200255 " Member interfaces:
256 exec 'syn match javaI_JavaLang "\%(\<Thread\.\)\@' . s:ff.Peek('7', '') . '<=\<UncaughtExceptionHandler\>"'
257 exec 'syn match javaI_JavaLang "\%(\<ProcessHandle\.\)\@' . s:ff.Peek('14', '') . '<=\<Info\>"'
258 exec 'syn match javaI_JavaLang "\%(\<System\.\)\@' . s:ff.Peek('7', '') . '<=\<Logger\>"'
259 exec 'syn match javaI_JavaLang "\%(\<StackWalker\.\)\@' . s:ff.Peek('12', '') . '<=\<StackFrame\>"'
260 exec 'syn match javaI_JavaLang "\%(\<Thread\.\)\@' . s:ff.Peek('7', '') . '<=\<Builder\>"'
261 exec 'syn match javaI_JavaLang "\%(\<Thread\.Builder\.\)\@' . s:ff.Peek('15', '') . '<=\<OfPlatform\>"'
262 exec 'syn match javaI_JavaLang "\%(\<Thread\.Builder\.\)\@' . s:ff.Peek('15', '') . '<=\<OfVirtual\>"'
Aliaksei Budaveib577ad52025-06-01 18:29:37 +0200263 syn cluster javaClasses add=javaI_JavaLang
264 hi def link javaI_JavaLang javaI_Java
265
Aliaksei Budaveic413ac72025-06-10 20:37:39 +0200266 " Common groups for generated "javaid.vim" syntax items:
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200267 hi def link javaR_Java javaR_
268 hi def link javaC_Java javaC_
269 hi def link javaE_Java javaE_
270 hi def link javaX_Java javaX_
Aliaksei Budaveib577ad52025-06-01 18:29:37 +0200271 hi def link javaI_Java javaI_
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200272 hi def link javaX_ javaExceptions
273 hi def link javaR_ javaExceptions
274 hi def link javaE_ javaExceptions
275 hi def link javaC_ javaConstant
Aliaksei Budaveib577ad52025-06-01 18:29:37 +0200276 hi def link javaI_ javaTypedef
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000277
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200278 syn keyword javaLangObject getClass notify notifyAll wait
279
280 " Lower the syntax priority of overridable java.lang.Object method
281 " names for zero-width matching (define g:java_highlight_signature
282 " and see their base declarations for java.lang.Object):
283 syn match javaLangObject "\<clone\>"
284 syn match javaLangObject "\<equals\>"
285 syn match javaLangObject "\<finalize\>"
286 syn match javaLangObject "\<hashCode\>"
287 syn match javaLangObject "\<toString\>"
288 hi def link javaLangObject javaConstant
Aliaksei Budaveic413ac72025-06-10 20:37:39 +0200289
290 " As of JDK 24, SecurityManager is rendered non-functional
291 " (JDK-8338625).
292 " (Note that SecurityException and RuntimePermission are still
293 " not deprecated.)
294 " As of JDK 21, Compiler is no more (JDK-8205129).
295 syn keyword javaLangDeprecated Compiler SecurityManager
Bram Moolenaar071d4272004-06-13 20:20:40 +0000296endif
297
Aliaksei Budavei055cca82025-05-31 12:25:15 +0200298runtime syntax/javaid.vim
Bram Moolenaar071d4272004-06-13 20:20:40 +0000299
Aliaksei Budaveic413ac72025-06-10 20:37:39 +0200300" Type parameter sections of generic and parameterised types (JLS-17,
301" §4.5).
302"
303" Note that false positives may elsewhere occur whenever an identifier
304" is butted against a less-than operator. Cf. (X<Y) and (X < Y).
305if exists("g:java_highlight_generics")
306 syn keyword javaWildcardBound contained extends super
307
308 for s:ctx in [{'gsg': 'javaGenerics', 'ghg': 'javaGenericsC1', 'csg': 'javaGenericsX', 'c': ''},
309 \ {'gsg': 'javaGenericsX', 'ghg': 'javaGenericsC2', 'csg': 'javaGenerics', 'c': ' contained'}]
310 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,javaWildcardBound,javaType,@javaClasses'
311 endfor
312
313 unlet s:ctx
314 hi def link javaWildcardBound Question
315 hi def link javaGenericsC1 Function
316 hi def link javaGenericsC2 Type
317endif
318
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200319if exists("g:java_space_errors")
320 if !exists("g:java_no_trail_space_error")
321 syn match javaSpaceError "\s\+$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000322 endif
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200323 if !exists("g:java_no_tab_space_error")
324 syn match javaSpaceError " \+\t"me=e-1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000325 endif
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200326 hi def link javaSpaceError Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000327endif
328
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200329exec 'syn match javaUserLabel "^\s*\<\K\k*\>\%(\<default\>\)\@' . s:ff.Peek('7', '') . '<!\s*::\@!"he=e-1'
Aliaksei Budavei23079452024-09-19 18:22:58 +0200330
Aliaksei Budavei1054b182025-03-29 09:16:30 +0100331if s:ff.IsAnyRequestedPreviewFeatureOf([455, 488])
Aliaksei Budavei23079452024-09-19 18:22:58 +0200332 syn region javaLabelRegion transparent matchgroup=javaLabel start="\<case\>" matchgroup=NONE end=":\|->" contains=javaBoolean,javaNumber,javaCharacter,javaString,javaConstant,@javaClasses,javaGenerics,javaType,javaLabelDefault,javaLabelVarType,javaLabelWhenClause
333else
334 syn region javaLabelRegion transparent matchgroup=javaLabel start="\<case\>" matchgroup=NONE end=":\|->" contains=javaLabelCastType,javaLabelNumber,javaCharacter,javaString,javaConstant,@javaClasses,javaGenerics,javaLabelDefault,javaLabelVarType,javaLabelWhenClause
335 syn keyword javaLabelCastType contained char byte short int
336 syn match javaLabelNumber contained "\<0\>[lL]\@!"
337 syn match javaLabelNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)\>[lL]\@!"
338 hi def link javaLabelCastType javaType
339 hi def link javaLabelNumber javaNumber
340endif
341
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100342syn region javaLabelRegion transparent matchgroup=javaLabel start="\<default\>\%(\s*\%(:\|->\)\)\@=" matchgroup=NONE end=":\|->" oneline
343" Consider grouped _default_ _case_ labels, i.e.
344" case null, default ->
345" case null: default:
346syn keyword javaLabelDefault contained default
347syn keyword javaLabelVarType contained var
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100348" Allow for the contingency of the enclosing region not being able to
349" _keep_ its _end_, e.g. case ':':.
Aliaksei Budaveid6b4afb2024-06-09 19:39:52 +0300350syn 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 +0000351
Bram Moolenaar071d4272004-06-13 20:20:40 +0000352" Comments
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200353syn keyword javaTodo contained TODO FIXME XXX
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300354
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200355if exists("g:java_comment_strings")
356 syn region javaCommentString contained start=+"+ end=+"+ end=+$+ end=+\*/+me=s-1,he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell
357 syn region javaCommentString contained start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell,javaSpecialError,javaTextBlockError
358 syn region javaComment2String contained start=+"+ end=+$\|"+ contains=javaSpecial,javaSpecialChar,@Spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000359 syn match javaCommentCharacter contained "'\\[^']\{1,6\}'" contains=javaSpecialChar
360 syn match javaCommentCharacter contained "'\\''" contains=javaSpecialChar
361 syn match javaCommentCharacter contained "'[^\\]'"
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300362 syn cluster javaCommentSpecial add=javaCommentString,javaCommentCharacter,javaNumber,javaStrTempl
363 syn cluster javaCommentSpecial2 add=javaComment2String,javaCommentCharacter,javaNumber,javaStrTempl
Bram Moolenaar071d4272004-06-13 20:20:40 +0000364endif
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300365
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200366syn region javaComment matchgroup=javaCommentStart start="/\*" end="\*/" contains=@javaCommentSpecial,javaTodo,javaCommentError,javaSpaceError,@Spell fold
367syn match javaCommentStar contained "^\s*\*[^/]"me=e-1
368syn match javaCommentStar contained "^\s*\*$"
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300369syn match javaLineComment "//.*" contains=@javaCommentSpecial2,javaTodo,javaCommentMarkupTag,javaSpaceError,@Spell
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300370syn match javaCommentMarkupTag contained "@\%(end\|highlight\|link\|replace\|start\)\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
371syn match javaCommentMarkupTagAttr contained "\<region\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200372exec '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 +0300373syn match javaCommentError contained "/\*"me=e-1 display
Bram Moolenaar071d4272004-06-13 20:20:40 +0000374
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200375if !exists("g:java_ignore_javadoc") && (s:with_html || s:with_markdown) && g:main_syntax != 'jsp'
376 " The overridable "html*" and "markdown*" default links must be
377 " defined _before_ the inclusion of the same default links from
378 " "html.vim" and "markdown.vim".
379 if s:with_html || s:with_markdown
380 hi def link htmlComment Special
381 hi def link htmlCommentPart Special
382 hi def link htmlArg Type
383 hi def link htmlString String
384 endif
385
386 if s:with_markdown
387 hi def link markdownCode Special
388 hi def link markdownCodeBlock Special
389 hi def link markdownCodeDelimiter Special
390 hi def link markdownLinkDelimiter Comment
391 endif
392
Bram Moolenaar071d4272004-06-13 20:20:40 +0000393 syntax case ignore
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300394
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200395 " Note that javaDocSeeTag is valid in HTML and Markdown.
396 let s:ff.WithMarkdown = s:ff.RightConstant
397
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300398 " Include HTML syntax coloring for Javadoc comments.
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200399 if s:with_html
Aliaksei Budavei60310a42024-10-04 20:25:05 +0200400 try
Aliaksei Budavei910bfd52025-04-28 17:58:22 +0200401 if exists("g:html_syntax_folding") && !exists("g:java_consent_to_html_syntax_folding")
402 let s:html_syntax_folding_copy = g:html_syntax_folding
403 unlet g:html_syntax_folding
404 endif
405
Aliaksei Budavei60310a42024-10-04 20:25:05 +0200406 syntax include @javaHtml syntax/html.vim
407 finally
408 unlet! b:current_syntax
Aliaksei Budavei910bfd52025-04-28 17:58:22 +0200409
410 if exists("s:html_syntax_folding_copy")
411 let g:html_syntax_folding = s:html_syntax_folding_copy
412 unlet s:html_syntax_folding_copy
413 endif
Aliaksei Budavei60310a42024-10-04 20:25:05 +0200414 endtry
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200415 endif
416
417 " Include Markdown syntax coloring (v7.2.437) for Javadoc comments.
418 if s:with_markdown
419 try
Aliaksei Budavei910bfd52025-04-28 17:58:22 +0200420 if exists("g:html_syntax_folding") && !exists("g:java_consent_to_html_syntax_folding")
421 let s:html_syntax_folding_copy = g:html_syntax_folding
422 unlet g:html_syntax_folding
423 endif
424
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200425 syntax include @javaMarkdown syntax/markdown.vim
Aliaksei Budaveicd960752025-01-03 17:38:14 +0100426
427 try
428 syn clear markdownId markdownLineStart markdownH1 markdownH2 markdownHeadingRule markdownRule markdownCode markdownCodeBlock markdownIdDeclaration
429 let s:ff.WithMarkdown = s:ff.LeftConstant
430 catch /\<E28:/
431 call s:ReportOnce(v:exception)
432 let s:no_support = 1
433 unlet! g:java_ignore_markdown
434 let g:java_ignore_markdown = 28
435 endtry
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200436 catch /\<E48[45]:/
437 call s:ReportOnce(v:exception)
Aliaksei Budaveicd960752025-01-03 17:38:14 +0100438 let s:no_support = 1
Aliaksei Budavei60310a42024-10-04 20:25:05 +0200439 finally
440 unlet! b:current_syntax
Aliaksei Budaveicd960752025-01-03 17:38:14 +0100441
Aliaksei Budavei910bfd52025-04-28 17:58:22 +0200442 if exists("s:html_syntax_folding_copy")
443 let g:html_syntax_folding = s:html_syntax_folding_copy
444 unlet s:html_syntax_folding_copy
445 endif
446
Aliaksei Budaveicd960752025-01-03 17:38:14 +0100447 if exists("s:no_support")
448 unlet s:no_support
449 unlockvar s:with_markdown
450 let s:with_markdown = 0
451 lockvar s:with_markdown
452 hi clear markdownCode
453 hi clear markdownCodeBlock
454 hi clear markdownCodeDelimiter
455 hi clear markdownLinkDelimiter
456 endif
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200457 endtry
458 endif
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300459
460 " HTML enables spell checking for all text that is not in a syntax
461 " item (:syntax spell toplevel); instead, limit spell checking to
462 " items matchable with syntax groups containing the @Spell cluster.
463 try
464 syntax spell default
465 catch /\<E390:/
466 call s:ReportOnce(v:exception)
467 endtry
Bram Moolenaar5c736222010-01-06 20:54:52 +0100468
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200469 if s:with_markdown
470 syn region javaMarkdownComment start="///" skip="^\s*///.*$" end="^" keepend contains=javaMarkdownCommentTitle,javaMarkdownShortcutLink,@javaMarkdown,@javaDocTags,javaTodo,@Spell nextgroup=javaMarkdownCommentTitle fold
471 syn match javaMarkdownCommentMask contained "^\s*///"
472 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'
473 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'
474 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'
475
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200476 " REDEFINE THE MARKDOWN ITEMS ANCHORED WITH "^", OBSERVING THE
477 " DEFINITION ORDER.
478 syn match markdownLineStart contained "^\s*///\s*[<@]\@!" contains=@markdownBlock,javaMarkdownCommentTitle,javaMarkdownCommentMask nextgroup=@markdownBlock,htmlSpecialChar
479 " See https://spec.commonmark.org/0.31.2/#setext-headings.
480 syn match markdownH1 contained "^\s*/// \{,3}.\+\r\=\n\s*/// \{,3}=\+\s*$" contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink,javaMarkdownCommentMask
481 syn match markdownH2 contained "^\s*/// \{,3}.\+\r\=\n\s*/// \{,3}-\+\s*$" contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink,javaMarkdownCommentMask
482 " See https://spec.commonmark.org/0.31.2/#atx-headings.
483 syn region markdownH1 contained matchgroup=markdownH1Delimiter start=" \{,3}#\s" end="#*\s*$" keepend contains=@markdownInline,markdownAutomaticLink oneline
484 syn region markdownH2 contained matchgroup=markdownH2Delimiter start=" \{,3}##\s" end="#*\s*$" keepend contains=@markdownInline,markdownAutomaticLink oneline
485 syn match markdownHeadingRule contained "^\s*/// \{,3}[=-]\+\s*$" contains=javaMarkdownCommentMask
486 " See https://spec.commonmark.org/0.31.2/#thematic-breaks.
487 syn match markdownRule contained "^\s*/// \{,3}\*\s*\*\%(\s*\*\)\+\s*$" contains=javaMarkdownCommentMask
488 syn match markdownRule contained "^\s*/// \{,3}_\s*_\%(\s*_\)\+\s*$" contains=javaMarkdownCommentMask
489 syn match markdownRule contained "^\s*/// \{,3}-\s*-\%(\s*-\)\+\s*$" contains=javaMarkdownCommentMask
490 " See https://spec.commonmark.org/0.31.2/#indented-code-blocks.
491 syn region markdownCodeBlock contained start="^\s*///\%( \{4,}\|\t\)" end="^\ze\s*///\%(\s*$\| \{,3}\S\)" keepend contains=javaMarkdownCommentMask
492 " See https://spec.commonmark.org/0.31.2/#code-spans.
493 syn region markdownCode contained matchgroup=markdownCodeDelimiter start="\z(`\+\) \=" end=" \=\z1" keepend contains=markdownLineStart,javaMarkdownCommentMask
494 " See https://spec.commonmark.org/0.31.2/#fenced-code-blocks.
495 syn region markdownCodeBlock contained start="^\s*/// \{,3}\z(```\+\)\%(.\{-}[^`]`\)\@!" end="^\s*/// \{,3}\z1`*" keepend contains=javaMarkdownCommentMask
496 syn region markdownCodeBlock contained start="^\s*/// \{,3}\z(\~\~\~\+\)" end="^\s*/// \{,3}\z1\~*" keepend contains=javaMarkdownCommentMask
497 " See https://spec.commonmark.org/0.31.2/#link-reference-definitions.
498 syn region markdownIdDeclaration contained matchgroup=markdownLinkDelimiter start="^\s*/// \{,3\}!\=\[" end="\]:" keepend contains=javaMarkdownCommentMask nextgroup=markdownUrl oneline skipwhite
499 " See https://spec.commonmark.org/0.31.2/#link-label.
500 syn region markdownId contained matchgroup=markdownIdDelimiter start="\[\%([\t ]\]\)\@!" end="\]" contains=javaMarkdownSkipBrackets,javaMarkdownCommentMask
501 " Note that escaped brackets can be unbalanced.
502 syn match javaMarkdownSkipBrackets contained transparent "\\\[\|\\\]"
503 " See https://spec.commonmark.org/0.31.2/#shortcut-reference-link.
504 syn region javaMarkdownShortcutLink contained matchgroup=markdownLinkTextDelimiter start="!\=\[^\@!\%(\_[^][]*\%(\[\_[^][]*\]\_[^][]*\)*]\%([[(]\)\@!\)\@=" end="\]\%([[(]\)\@!" contains=@markdownInline,markdownLineStart,javaMarkdownSkipBrackets,javaMarkdownCommentMask nextgroup=markdownLink,markdownId skipwhite
505
506 for s:name in ['markdownFootnoteDefinition', 'markdownFootnote']
507 if hlexists(s:name)
508 exec 'syn clear ' . s:name
509 endif
510 endfor
511
512 unlet s:name
513
514 " COMBAK: Footnotes are recognised by "markdown.vim", but are not
515 " in CommonMark. See https://pandoc.org/MANUAL.html#footnotes.
516""""syn match markdownFootnoteDefinition contained "^\s*///\s*\[^[^\]]\+\]:" contains=javaMarkdownCommentMask
517
518 hi def link javaMarkdownComment Comment
519 hi def link javaMarkdownCommentMask javaMarkdownComment
520 hi def link javaMarkdownCommentTitle SpecialComment
521 hi def link javaMarkdownShortcutLink htmlLink
522 endif
523
524 if s:with_html
525 syn region javaDocComment start="/\*\*" end="\*/" keepend contains=javaCommentTitle,@javaHtml,@javaDocTags,javaTodo,javaCommentError,javaSpaceError,@Spell fold
526 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'
527 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
528 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
529 hi def link javaDocComment Comment
530 hi def link javaCommentTitle SpecialComment
531 endif
532
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200533 " The members of javaDocTags are sub-grouped according to the Java
534 " version of their introduction, and sub-group members in turn are
535 " arranged in alphabetical order, so that future newer members can
536 " be pre-sorted and appended without disturbing the current member
537 " placement.
538 " Since they only have significance in javaCommentTitle, neither
539 " javaDocSummaryTag nor javaDocReturnTitleTag are defined.
540 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
541
542 " Anticipate non-standard inline tags in {@return} and {@summary}.
543 syn region javaTitleSkipBlock contained transparent start="{\%(@\%(return\|summary\)\>\)\@!" end="}"
544 syn match javaDocDocRootTag contained "{@docRoot}"
545 syn match javaDocInheritDocTag contained "{@inheritDoc}"
546 syn region javaIndexSkipBlock contained transparent start="{\%(@index\>\)\@!" end="}" contains=javaIndexSkipBlock,javaDocIndexTag
547 syn region javaDocIndexTag contained start="{@index\>" end="}" contains=javaDocIndexTag,javaIndexSkipBlock
548 syn region javaLinkSkipBlock contained transparent start="{\%(@link\>\)\@!" end="}" contains=javaLinkSkipBlock,javaDocLinkTag
549 syn region javaDocLinkTag contained start="{@link\>" end="}" contains=javaDocLinkTag,javaLinkSkipBlock
550 syn region javaLinkplainSkipBlock contained transparent start="{\%(@linkplain\>\)\@!" end="}" contains=javaLinkplainSkipBlock,javaDocLinkplainTag
551 syn region javaDocLinkplainTag contained start="{@linkplain\>" end="}" contains=javaDocLinkplainTag,javaLinkplainSkipBlock
552 syn region javaLiteralSkipBlock contained transparent start="{\%(@literal\>\)\@!" end="}" contains=javaLiteralSkipBlock,javaDocLiteralTag
553 syn region javaDocLiteralTag contained start="{@literal\>" end="}" contains=javaDocLiteralTag,javaLiteralSkipBlock
554 syn region javaSystemPropertySkipBlock contained transparent start="{\%(@systemProperty\>\)\@!" end="}" contains=javaSystemPropertySkipBlock,javaDocSystemPropertyTag
555 syn region javaDocSystemPropertyTag contained start="{@systemProperty\>" end="}" contains=javaDocSystemPropertyTag,javaSystemPropertySkipBlock
556 syn region javaValueSkipBlock contained transparent start="{\%(@value\>\)\@!" end="}" contains=javaValueSkipBlock,javaDocValueTag
557 syn region javaDocValueTag contained start="{@value\>" end="}" contains=javaDocValueTag,javaValueSkipBlock
558
559 syn match javaDocParam contained "\s\zs\S\+"
560 syn match javaDocExceptionTag contained "@exception\s\+\S\+" contains=javaDocParam
561 syn match javaDocParamTag contained "@param\s\+\S\+" contains=javaDocParam
562 syn match javaDocSinceTag contained "@since\s\+\S\+" contains=javaDocParam
563 syn match javaDocThrowsTag contained "@throws\s\+\S\+" contains=javaDocParam
564 syn match javaDocSpecTag contained "@spec\_s\+\S\+\ze\_s\+\S\+" contains=javaDocParam
565
566 syn match javaDocAuthorTag contained "@author\>"
567 syn match javaDocDeprecatedTag contained "@deprecated\>"
568 syn match javaDocHiddenTag contained "@hidden\>"
569 syn match javaDocReturnTag contained "@return\>"
570 syn match javaDocSerialTag contained "@serial\>"
571 syn match javaDocSerialDataTag contained "@serialData\>"
572 syn match javaDocSerialFieldTag contained "@serialField\>"
573 syn match javaDocVersionTag contained "@version\>"
574
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200575 syn match javaDocSeeTag contained "@see\>\s*" nextgroup=javaDocSeeTag1,javaDocSeeTag2,javaDocSeeTag3,javaDocSeeTag4,javaDocSeeTagStar,javaDocSeeTagSlash skipwhite skipempty
576
577 if s:with_html
578 syn match javaDocSeeTagStar contained "^\s*\*\+\%(\s*{\=@\|/\|$\)\@!" nextgroup=javaDocSeeTag1,javaDocSeeTag2,javaDocSeeTag3,javaDocSeeTag4 skipwhite skipempty
579 hi def link javaDocSeeTagStar javaDocComment
580 endif
581
582 if s:with_markdown
583 syn match javaDocSeeTagSlash contained "^\s*///\%(\s*{\=@\|$\)\@!" nextgroup=javaDocSeeTag1,javaDocSeeTag2,javaDocSeeTag3,javaDocSeeTag4 skipwhite skipempty
584 hi def link javaDocSeeTagSlash javaMarkdownComment
585 endif
586
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200587 syn match javaDocSeeTag1 contained @"\_[^"]\+"@
588 syn match javaDocSeeTag2 contained @<a\s\+\_.\{-}</a>@ contains=@javaHtml extend
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200589 exec 'syn match javaDocSeeTag3 contained @[' . s:ff.WithMarkdown('[', '') . '"< \t]\@!\%(\k\|[/.]\)*\%(##\=\k\+\%((\_[^)]*)\)\=\)\=@ nextgroup=javaDocSeeTag3Label skipwhite skipempty'
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200590 syn match javaDocSeeTag3Label contained @\k\%(\k\+\s*\)*$@
591
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200592 " COMBAK: No support for type javaDocSeeTag2 in Markdown.
593""if s:with_markdown
594"" syn match javaDocSeeTag4 contained @\[.\+\]\s\=\%(\[.\+\]\|(.\+)\)@ contains=@javaMarkdown extend
595"" hi def link javaDocSeeTag4 Special
596""endif
597
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300598 syn region javaCodeSkipBlock contained transparent start="{\%(@code\>\)\@!" end="}" contains=javaCodeSkipBlock,javaDocCodeTag
599 syn region javaDocCodeTag contained start="{@code\>" end="}" contains=javaDocCodeTag,javaCodeSkipBlock
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200600
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200601 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 +0300602 syn region javaSnippetSkipBlock contained transparent start="{\%(@snippet\>\)\@!" end="}" contains=javaSnippetSkipBlock,javaDocSnippetTag,javaCommentMarkupTag
603 syn region javaDocSnippetTag contained start="{@snippet\>" end="}" contains=javaDocSnippetTag,javaSnippetSkipBlock,javaDocSnippetTagAttr,javaCommentMarkupTag
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300604
Bram Moolenaar071d4272004-06-13 20:20:40 +0000605 syntax case match
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200606 hi def link javaDocParam Function
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200607
608 hi def link javaDocAuthorTag Special
609 hi def link javaDocCodeTag Special
610 hi def link javaDocDeprecatedTag Special
611 hi def link javaDocDocRootTag Special
612 hi def link javaDocExceptionTag Special
613 hi def link javaDocHiddenTag Special
614 hi def link javaDocIndexTag Special
615 hi def link javaDocInheritDocTag Special
616 hi def link javaDocLinkTag Special
617 hi def link javaDocLinkplainTag Special
618 hi def link javaDocLiteralTag Special
619 hi def link javaDocParamTag Special
620 hi def link javaDocReturnTag Special
621 hi def link javaDocSeeTag Special
622 hi def link javaDocSeeTag1 String
623 hi def link javaDocSeeTag2 Special
624 hi def link javaDocSeeTag3 Function
625 hi def link javaDocSerialTag Special
626 hi def link javaDocSerialDataTag Special
627 hi def link javaDocSerialFieldTag Special
628 hi def link javaDocSinceTag Special
629 hi def link javaDocSnippetTag Special
630 hi def link javaDocSpecTag Special
631 hi def link javaDocSystemPropertyTag Special
632 hi def link javaDocThrowsTag Special
633 hi def link javaDocValueTag Special
634 hi def link javaDocVersionTag Special
Bram Moolenaar071d4272004-06-13 20:20:40 +0000635endif
636
637" match the special comment /**/
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200638syn match javaComment "/\*\*/"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000639
640" Strings and constants
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200641syn match javaSpecialError contained "\\."
Bram Moolenaar071d4272004-06-13 20:20:40 +0000642syn match javaSpecialCharError contained "[^']"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300643" Escape Sequences (JLS-17, §3.10.7):
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200644syn match javaSpecialChar contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000645syn region javaString start=+"+ end=+"+ end=+$+ contains=javaSpecialChar,javaSpecialError,@Spell
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300646syn region javaString start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecialChar,javaSpecialError,javaTextBlockError,@Spell
647syn match javaTextBlockError +"""\s*"""+
Aliaksei Budavei8556e232024-08-27 22:32:13 +0200648
Aliaksei Budavei1054b182025-03-29 09:16:30 +0100649if s:ff.IsAnyRequestedPreviewFeatureOf([430])
Aliaksei Budavei8556e232024-08-27 22:32:13 +0200650 syn region javaStrTemplEmbExp contained matchgroup=javaStrTempl start="\\{" end="}" contains=TOP
651 exec 'syn region javaStrTempl start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,@Spell'
652 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'
653 hi def link javaStrTempl Macro
654endif
655
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200656syn match javaCharacter "'[^']*'" contains=javaSpecialChar,javaSpecialCharError
657syn match javaCharacter "'\\''" contains=javaSpecialChar
658syn match javaCharacter "'[^\\]'"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300659" Integer literals (JLS-17, §3.10.1):
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200660syn keyword javaNumber 0 0l 0L
661syn match javaNumber "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300662" Decimal floating-point literals (JLS-17, §3.10.2):
663" Against "\<\d\+\>\.":
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200664syn match javaNumber "\<\d\%(_*\d\)*\."
665syn match javaNumber "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
666syn match javaNumber "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
667syn match javaNumber "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300668" Hexadecimal floating-point literals (JLS-17, §3.10.2):
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200669syn match javaNumber "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000670
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300671" Unicode characters
672syn match javaSpecial "\\u\x\x\x\x"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000673
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200674" Method declarations (JLS-17, §8.4.3, §8.4.4, §9.4).
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200675if exists("g:java_highlight_functions")
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200676 syn cluster javaFuncParams contains=javaAnnotation,@javaClasses,javaGenerics,javaType,javaVarArg,javaComment,javaLineComment
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200677
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200678 if exists("g:java_highlight_signature")
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200679 syn cluster javaFuncParams add=javaParamModifier
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200680 hi def link javaFuncDefStart javaFuncDef
681 else
682 syn cluster javaFuncParams add=javaScopeDecl,javaConceptKind,javaStorageClass,javaExternal
683 endif
684
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200685 if g:java_highlight_functions =~# '^indent[1-8]\=$'
686 let s:last = g:java_highlight_functions[-1 :]
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300687 let s:indent = s:last != 't' ? repeat("\x20", s:last) : "\t"
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300688 " Try to not match other type members, initialiser blocks, enum
689 " constants (JLS-17, §8.9.1), and constructors (JLS-17, §8.1.7):
690 " at any _conventional_ indentation, skip over all fields with
691 " "[^=]*", all records with "\<record\s", and let the "*Skip*"
692 " definitions take care of constructor declarations and enum
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200693 " constants (with no support for @Foo(value = "bar")). Also,
694 " reject inlined declarations with "[^{]" for signature.
695 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 +0300696 " As long as package-private constructors cannot be matched with
697 " javaFuncDef, do not look with javaConstructorSkipDeclarator for
698 " them.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200699 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'
700 " With a zero-width span for signature applicable on demand to
701 " javaFuncDef, make related adjustments:
702 " (1) Claim all enum constants of a line as a unit.
703 exec 'syn match javaEnumSkipConstant contained transparent /^' . s:indent . '\%(\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)*\K\k*\s*\%((.*)\)\=\s*[,;({]\s*\)\+/ contains=@javaEnumConstants'
704 " (2) Define a syntax group for top level enumerations and tell
705 " apart their constants from method declarations.
706 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'
707 " (3) Define a base variant of javaParenT without using @javaTop
708 " in order to not include javaFuncDef.
709 syn region javaParenE transparent matchgroup=javaParen start="(" end=")" contains=@javaEnumConstants,javaInParen
710 syn region javaParenE transparent matchgroup=javaParen start="\[" end="\]" contains=@javaEnumConstants
711 syn cluster javaEnumConstants contains=TOP,javaTopEnumDeclaration,javaFuncDef,javaParenT
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300712 unlet s:indent s:last
Bram Moolenaar071d4272004-06-13 20:20:40 +0000713 else
Aliaksei Budavei40524742024-04-14 19:57:00 +0300714 " This is the "style" variant (:help ft-java-syntax).
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200715
716 " Match arbitrarily indented camelCasedName method declarations.
717 " Match: [@ɐ] [abstract] [<α, β>] Τʬ[<γ>][[][]] μʭʭ(/* ... */);
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200718 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 +0000719 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000720endif
721
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200722if exists("g:java_highlight_debug")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000723 " Strings and constants
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300724 syn match javaDebugSpecial contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200725 syn region javaDebugString contained start=+"+ end=+"+ contains=javaDebugSpecial
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300726 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 +0200727
Aliaksei Budavei1054b182025-03-29 09:16:30 +0100728 if s:ff.IsAnyRequestedPreviewFeatureOf([430])
Aliaksei Budavei8556e232024-08-27 22:32:13 +0200729 " The highlight groups of java{StrTempl,Debug{,Paren,StrTempl}}\,
730 " share one colour by default. Do not conflate unrelated parens.
731 syn region javaDebugStrTemplEmbExp contained matchgroup=javaDebugStrTempl start="\\{" end="}" contains=javaComment,javaLineComment,javaDebug\%(Paren\)\@!.*
732 exec 'syn region javaDebugStrTempl contained start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ contains=javaDebugStrTemplEmbExp,javaDebugSpecial'
733 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'
734 hi def link javaDebugStrTempl Macro
735 endif
736
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300737 syn match javaDebugTextBlockError contained +"""\s*"""+
Bram Moolenaar071d4272004-06-13 20:20:40 +0000738 syn match javaDebugCharacter contained "'[^\\]'"
739 syn match javaDebugSpecialCharacter contained "'\\.'"
740 syn match javaDebugSpecialCharacter contained "'\\''"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300741 syn keyword javaDebugNumber contained 0 0l 0L
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300742 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\."
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300743 syn match javaDebugNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
744 syn match javaDebugNumber contained "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
745 syn match javaDebugNumber contained "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
746 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
747 syn match javaDebugNumber contained "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000748 syn keyword javaDebugBoolean contained true false
749 syn keyword javaDebugType contained null this super
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200750 syn region javaDebugParen contained start=+(+ end=+)+ contains=javaDebug.*,javaDebugParen
Bram Moolenaar071d4272004-06-13 20:20:40 +0000751
Aliaksei Budavei40524742024-04-14 19:57:00 +0300752 " To make this work, define the highlighting for these groups.
753 syn match javaDebug "\<System\.\%(out\|err\)\.print\%(ln\)\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
754" FIXME: What API does "p" belong to?
755" syn match javaDebug "\<p\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
756 syn match javaDebug "\<\K\k*\.printStackTrace\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
757" FIXME: What API do "trace*" belong to?
758" syn match javaDebug "\<trace[SL]\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
Bram Moolenaar071d4272004-06-13 20:20:40 +0000759
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200760 hi def link javaDebug Debug
761 hi def link javaDebugString DebugString
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200762 hi def link javaDebugTextBlockError Error
763 hi def link javaDebugType DebugType
764 hi def link javaDebugBoolean DebugBoolean
765 hi def link javaDebugNumber Debug
766 hi def link javaDebugSpecial DebugSpecial
767 hi def link javaDebugSpecialCharacter DebugSpecial
768 hi def link javaDebugCharacter DebugString
769 hi def link javaDebugParen Debug
Bram Moolenaar071d4272004-06-13 20:20:40 +0000770
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200771 hi def link DebugString String
772 hi def link DebugSpecial Special
773 hi def link DebugBoolean Boolean
774 hi def link DebugType Type
Bram Moolenaar071d4272004-06-13 20:20:40 +0000775endif
776
Aliaksei Budavei05d08932024-10-12 17:12:51 +0200777" Complement javaBlock and javaInParen for highlighting.
778syn region javaBlockOther transparent matchgroup=javaBlockOtherStart start="{" end="}"
779
Aliaksei Budavei94c5d8a2024-06-19 20:10:47 +0200780" Try not to fold top-level-type bodies under assumption that there is
781" but one such body.
Aliaksei Budavei05d08932024-10-12 17:12:51 +0200782exec 'syn region javaBlock transparent matchgroup=javaBlockStart start="\%(^\|^\S[^:]\+\)\@' . s:ff.Peek('120', '') . '<!{" end="}" fold'
Aliaksei Budavei94c5d8a2024-06-19 20:10:47 +0200783
Aliaksei Budavei05d08932024-10-12 17:12:51 +0200784" See "D.2.1 Anonymous Classes" at
785" 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 +0200786if exists("g:java_mark_braces_in_parens_as_errors")
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300787 syn match javaInParen contained "[{}]"
788 hi def link javaInParen javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000789endif
790
791" catch errors caused by wrong parenthesis
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200792syn region javaParenT transparent matchgroup=javaParen start="(" end=")" contains=@javaTop,javaInParen,javaParenT1
793syn region javaParenT1 contained transparent matchgroup=javaParen1 start="(" end=")" contains=@javaTop,javaInParen,javaParenT2
794syn region javaParenT2 contained transparent matchgroup=javaParen2 start="(" end=")" contains=@javaTop,javaInParen,javaParenT
795syn match javaParenError ")"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000796" catch errors caused by wrong square parenthesis
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200797syn region javaParenT transparent matchgroup=javaParen start="\[" end="\]" contains=@javaTop,javaParenT1
798syn region javaParenT1 contained transparent matchgroup=javaParen1 start="\[" end="\]" contains=@javaTop,javaParenT2
799syn region javaParenT2 contained transparent matchgroup=javaParen2 start="\[" end="\]" contains=@javaTop,javaParenT
800syn match javaParenError "\]"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000801
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200802" Lambda expressions (JLS-17, §15.27) and method reference expressions
803" (JLS-17, §15.13).
804if exists("g:java_highlight_functions")
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200805 syn match javaMethodRef ":::\@!"
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200806
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200807 if exists("g:java_highlight_signature")
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200808 let s:ff.LambdaDef = s:ff.LeftConstant
809 else
810 let s:ff.LambdaDef = s:ff.RightConstant
811 endif
812
Aliaksei Budavei40524742024-04-14 19:57:00 +0300813 " Make ()-matching definitions after the parenthesis error catcher.
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300814 "
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200815 " Note that here and elsewhere a single-line token is used for \z,
816 " with other tokens repeated as necessary, to overcome the lack of
817 " support for multi-line matching with \z.
818 "
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300819 " Match: ([@A [@B ...] final] var a[, var b, ...]) ->
820 " | ([@A [@B ...] final] T[<α>][[][]] a[, T b, ...]) ->
821 " There is no recognition of expressions interspersed with comments
822 " or of expressions whose parameterised parameter types are written
823 " across multiple lines.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200824 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 +0300825 " Match: () ->
826 " | (a[, b, ...]) ->
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200827 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 +0300828 " Match: a ->
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200829 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 +0300830
831 syn keyword javaParamModifier contained final
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300832 syn keyword javaLambdaVarType contained var
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200833 hi def link javaParamModifier javaConceptKind
834 hi def link javaLambdaVarType javaOperator
835 hi def link javaLambdaDef javaFuncDef
836 hi def link javaLambdaDefStart javaFuncDef
837 hi def link javaMethodRef javaFuncDef
838 hi def link javaFuncDef Function
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100839endif
840
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300841" The @javaTop cluster comprises non-contained Java syntax groups.
842" Note that the syntax file "aidl.vim" relies on its availability.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200843syn cluster javaTop contains=TOP,javaTopEnumDeclaration
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300844
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200845if !exists("g:java_minlines")
846 let g:java_minlines = 10
Bram Moolenaar071d4272004-06-13 20:20:40 +0000847endif
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300848
849" Note that variations of a /*/ balanced comment, e.g., /*/*/, /*//*/,
850" /* /*/, /* /*/, etc., may have their rightmost /*/ part accepted
851" as a comment start by ':syntax sync ccomment'; consider alternatives
852" to make synchronisation start further towards file's beginning by
853" bumping up g:java_minlines or issuing ':syntax sync fromstart' or
854" preferring &foldmethod set to 'syntax'.
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200855exec "syn sync ccomment javaComment minlines=" . g:java_minlines
Bram Moolenaar071d4272004-06-13 20:20:40 +0000856
857" The default highlighting.
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200858hi def link javaVarArg Function
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200859hi def link javaBranch Conditional
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200860hi def link javaConditional Conditional
861hi def link javaRepeat Repeat
862hi def link javaExceptions Exception
863hi def link javaAssert Statement
864hi def link javaStorageClass StorageClass
865hi def link javaMethodDecl javaStorageClass
866hi def link javaClassDecl javaStorageClass
867hi def link javaScopeDecl javaStorageClass
Aliaksei Budavei5e95c8f2024-09-15 19:53:50 +0200868hi def link javaConceptKind javaStorageClass
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200869
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200870hi def link javaBoolean Boolean
871hi def link javaSpecial Special
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200872hi def link javaSpecialError Error
873hi def link javaSpecialCharError Error
874hi def link javaString String
875hi def link javaCharacter Character
876hi def link javaSpecialChar SpecialChar
877hi def link javaNumber Number
878hi def link javaError Error
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200879hi def link javaError2 javaError
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300880hi def link javaTextBlockError Error
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200881hi def link javaParenError javaError
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200882hi def link javaStatement Statement
883hi def link javaOperator Operator
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200884hi def link javaConstant Constant
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200885hi def link javaTypedef Typedef
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200886hi def link javaTodo Todo
887hi def link javaAnnotation PreProc
Aliaksei Budavei902b7662024-06-13 18:30:09 +0300888hi def link javaAnnotationStart javaAnnotation
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200889hi def link javaType Type
890hi def link javaExternal Include
Bram Moolenaar071d4272004-06-13 20:20:40 +0000891
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200892hi def link javaUserLabel Label
893hi def link javaUserLabelRef javaUserLabel
894hi def link javaLabel Label
895hi def link javaLabelDefault javaLabel
896hi def link javaLabelVarType javaOperator
Bram Moolenaar071d4272004-06-13 20:20:40 +0000897
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200898hi def link javaComment Comment
899hi def link javaCommentStar javaComment
900hi def link javaLineComment Comment
901hi def link javaCommentMarkupTagAttr javaHtmlArg
902hi def link javaCommentString javaString
903hi def link javaComment2String javaString
904hi def link javaCommentCharacter javaCharacter
905hi def link javaCommentError javaError
906hi def link javaCommentStart javaComment
907
908hi def link javaHtmlArg Type
909hi def link javaHtmlString String
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200910
Bram Moolenaar071d4272004-06-13 20:20:40 +0000911let b:current_syntax = "java"
912
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200913if g:main_syntax == 'java'
914 unlet g:main_syntax
Bram Moolenaar071d4272004-06-13 20:20:40 +0000915endif
916
Aliaksei Budavei60310a42024-10-04 20:25:05 +0200917if exists("s:clear_java_ignore_html")
918 unlet! s:clear_java_ignore_html g:java_ignore_html
919endif
920
921if exists("s:clear_java_ignore_markdown")
922 unlet! s:clear_java_ignore_markdown g:java_ignore_markdown
923endif
924
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200925let b:spell_options = "contained"
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +0200926let &cpo = s:cpo_save
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200927unlet s:cpo_save s:ff s:with_html s:with_markdown
Bram Moolenaar071d4272004-06-13 20:20:40 +0000928
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300929" See ":help vim9-mix".
930if !has("vim9script")
931 finish
932endif
933
Aliaksei Budavei2750b832024-08-22 21:09:32 +0200934if exists("g:java_foldtext_show_first_or_second_line")
935 def! s:LazyPrefix(prefix: string, dashes: string, count: number): string
936 return empty(prefix)
937 ? printf('+-%s%3d lines: ', dashes, count)
938 : prefix
939 enddef
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300940
Aliaksei Budavei2750b832024-08-22 21:09:32 +0200941 def! s:JavaSyntaxFoldTextExpr(): string
942 # Piggyback on NGETTEXT.
943 const summary: string = foldtext()
944 return getline(v:foldstart) !~ '/\*\+\s*$'
945 ? summary
946 : LazyPrefix(matchstr(summary, '^+-\+\s*\d\+\s.\{-1,}:\s'),
947 v:folddashes,
948 (v:foldend - v:foldstart + 1)) ..
949 getline(v:foldstart + 1)
950 enddef
951
952 setlocal foldtext=s:JavaSyntaxFoldTextExpr()
953 delfunction! g:JavaSyntaxFoldTextExpr
954endif
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200955" vim: fdm=syntax sw=2 ts=8 noet sta