blob: 37b99b736db57b4c0b60fe5bab7d57fbcf82feb3 [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 Budavei910bfd52025-04-28 17:58:22 +02006" Last Change: 2025 Apr 28
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 Budaveibeb02ed2024-06-20 21:00:53 +0200205" Fancy parameterised types (JLS-17, §4.5).
206"
207" Note that false positives may elsewhere occur whenever an identifier
208" is butted against a less-than operator. Cf. (X<Y) and (X < Y).
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200209if exists("g:java_highlight_generics")
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200210 syn keyword javaWildcardBound contained extends super
211
212 " Parameterised types are delegated to javaGenerics (s:ctx.gsg) and
213 " are not matched with javaTypeArgument.
214 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*\>\)\%(\[\]\)*"'
215
216 for s:ctx in [{'dsg': 'javaDimExpr', 'gsg': 'javaGenerics', 'ghg': 'javaGenericsC1', 'csg': 'javaGenericsX', 'c': ''},
217 \ {'dsg': 'javaDimExprX', 'gsg': 'javaGenericsX', 'ghg': 'javaGenericsC2', 'csg': 'javaGenerics', 'c': ' contained'}]
218 " Consider array creation expressions of reifiable types.
219 exec 'syn region ' . s:ctx.dsg . ' contained transparent matchgroup=' . s:ctx.ghg . ' start="\[" end="\]" nextgroup=' . s:ctx.dsg . ' skipwhite skipnl'
220 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'
221 endfor
222
223 unlet s:ctx
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200224 hi def link javaWildcardBound Question
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200225 hi def link javaGenericsC1 Function
226 hi def link javaGenericsC2 Type
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200227endif
228
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200229if exists("g:java_highlight_java_lang_ids")
230 let g:java_highlight_all = 1
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000231endif
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200232if exists("g:java_highlight_all") || exists("g:java_highlight_java") || exists("g:java_highlight_java_lang")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000233 " java.lang.*
Bram Moolenaar63f32602022-06-09 20:45:54 +0100234 "
235 " The keywords of javaR_JavaLang, javaC_JavaLang, javaE_JavaLang,
236 " and javaX_JavaLang are sub-grouped according to the Java version
237 " of their introduction, and sub-group keywords (that is, class
238 " names) are arranged in alphabetical order, so that future newer
239 " keywords can be pre-sorted and appended without disturbing
240 " the current keyword placement. The below _match_es follow suit.
241
Aliaksei Budavei63d68c22024-03-26 20:12:05 +0300242 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 +0000243 syn cluster javaClasses add=javaR_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200244 hi def link javaR_JavaLang javaR_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100245 " Member enumerations:
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300246 exec 'syn match javaC_JavaLang "\%(\<Thread\.\)\@' . s:ff.Peek('7', '') . '<=\<State\>"'
247 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<UnicodeScript\>"'
248 exec 'syn match javaC_JavaLang "\%(\<ProcessBuilder\.Redirect\.\)\@' . s:ff.Peek('24', '') . '<=\<Type\>"'
249 exec 'syn match javaC_JavaLang "\%(\<StackWalker\.\)\@' . s:ff.Peek('12', '') . '<=\<Option\>"'
250 exec 'syn match javaC_JavaLang "\%(\<System\.Logger\.\)\@' . s:ff.Peek('14', '') . '<=\<Level\>"'
Bram Moolenaar63f32602022-06-09 20:45:54 +0100251 " Member classes:
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300252 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<Subset\>"'
253 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<UnicodeBlock\>"'
254 exec 'syn match javaC_JavaLang "\%(\<ProcessBuilder\.\)\@' . s:ff.Peek('15', '') . '<=\<Redirect\>"'
255 exec 'syn match javaC_JavaLang "\%(\<ModuleLayer\.\)\@' . s:ff.Peek('12', '') . '<=\<Controller\>"'
256 exec 'syn match javaC_JavaLang "\%(\<Runtime\.\)\@' . s:ff.Peek('8', '') . '<=\<Version\>"'
257 exec 'syn match javaC_JavaLang "\%(\<System\.\)\@' . s:ff.Peek('7', '') . '<=\<LoggerFinder\>"'
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200258 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 +0100259 syn match javaC_JavaLang "\<System\>" " See javaDebug.
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200260
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200261 if !exists("g:java_highlight_generics")
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200262 " The non-interface parameterised names of java.lang members.
263 exec 'syn match javaC_JavaLang "\%(\<Enum\.\)\@' . s:ff.Peek('5', '') . '<=\<EnumDesc\>"'
264 syn keyword javaC_JavaLang Class InheritableThreadLocal ThreadLocal Enum ClassValue
265 endif
266
Aliaksei Budavei1054b182025-03-29 09:16:30 +0100267 " As of JDK 24, SecurityManager is rendered non-functional
268 " (JDK-8338625).
269 " (Note that SecurityException and RuntimePermission are still
270 " not deprecated.)
271 " As of JDK 21, Compiler is no more (JDK-8205129).
272 syn keyword javaLangDeprecated Compiler SecurityManager
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000273 syn cluster javaClasses add=javaC_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200274 hi def link javaC_JavaLang javaC_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100275 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 +0000276 syn cluster javaClasses add=javaE_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200277 hi def link javaE_JavaLang javaE_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100278 syn keyword javaX_JavaLang ClassNotFoundException CloneNotSupportedException Exception IllegalAccessException InstantiationException InterruptedException NoSuchMethodException Throwable NoSuchFieldException ReflectiveOperationException
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000279 syn cluster javaClasses add=javaX_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200280 hi def link javaX_JavaLang javaX_Java
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000281
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200282 hi def link javaR_Java javaR_
283 hi def link javaC_Java javaC_
284 hi def link javaE_Java javaE_
285 hi def link javaX_Java javaX_
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200286 hi def link javaX_ javaExceptions
287 hi def link javaR_ javaExceptions
288 hi def link javaE_ javaExceptions
289 hi def link javaC_ javaConstant
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000290
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200291 syn keyword javaLangObject getClass notify notifyAll wait
292
293 " Lower the syntax priority of overridable java.lang.Object method
294 " names for zero-width matching (define g:java_highlight_signature
295 " and see their base declarations for java.lang.Object):
296 syn match javaLangObject "\<clone\>"
297 syn match javaLangObject "\<equals\>"
298 syn match javaLangObject "\<finalize\>"
299 syn match javaLangObject "\<hashCode\>"
300 syn match javaLangObject "\<toString\>"
301 hi def link javaLangObject javaConstant
Bram Moolenaar071d4272004-06-13 20:20:40 +0000302endif
303
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300304if filereadable(expand("<sfile>:p:h") . "/javaid.vim")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000305 source <sfile>:p:h/javaid.vim
306endif
307
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200308if exists("g:java_space_errors")
309 if !exists("g:java_no_trail_space_error")
310 syn match javaSpaceError "\s\+$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000311 endif
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200312 if !exists("g:java_no_tab_space_error")
313 syn match javaSpaceError " \+\t"me=e-1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000314 endif
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200315 hi def link javaSpaceError Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000316endif
317
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200318exec 'syn match javaUserLabel "^\s*\<\K\k*\>\%(\<default\>\)\@' . s:ff.Peek('7', '') . '<!\s*::\@!"he=e-1'
Aliaksei Budavei23079452024-09-19 18:22:58 +0200319
Aliaksei Budavei1054b182025-03-29 09:16:30 +0100320if s:ff.IsAnyRequestedPreviewFeatureOf([455, 488])
Aliaksei Budavei23079452024-09-19 18:22:58 +0200321 syn region javaLabelRegion transparent matchgroup=javaLabel start="\<case\>" matchgroup=NONE end=":\|->" contains=javaBoolean,javaNumber,javaCharacter,javaString,javaConstant,@javaClasses,javaGenerics,javaType,javaLabelDefault,javaLabelVarType,javaLabelWhenClause
322else
323 syn region javaLabelRegion transparent matchgroup=javaLabel start="\<case\>" matchgroup=NONE end=":\|->" contains=javaLabelCastType,javaLabelNumber,javaCharacter,javaString,javaConstant,@javaClasses,javaGenerics,javaLabelDefault,javaLabelVarType,javaLabelWhenClause
324 syn keyword javaLabelCastType contained char byte short int
325 syn match javaLabelNumber contained "\<0\>[lL]\@!"
326 syn match javaLabelNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)\>[lL]\@!"
327 hi def link javaLabelCastType javaType
328 hi def link javaLabelNumber javaNumber
329endif
330
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100331syn region javaLabelRegion transparent matchgroup=javaLabel start="\<default\>\%(\s*\%(:\|->\)\)\@=" matchgroup=NONE end=":\|->" oneline
332" Consider grouped _default_ _case_ labels, i.e.
333" case null, default ->
334" case null: default:
335syn keyword javaLabelDefault contained default
336syn keyword javaLabelVarType contained var
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100337" Allow for the contingency of the enclosing region not being able to
338" _keep_ its _end_, e.g. case ':':.
Aliaksei Budaveid6b4afb2024-06-09 19:39:52 +0300339syn 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 +0000340
Bram Moolenaar071d4272004-06-13 20:20:40 +0000341" Comments
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200342syn keyword javaTodo contained TODO FIXME XXX
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300343
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200344if exists("g:java_comment_strings")
345 syn region javaCommentString contained start=+"+ end=+"+ end=+$+ end=+\*/+me=s-1,he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell
346 syn region javaCommentString contained start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell,javaSpecialError,javaTextBlockError
347 syn region javaComment2String contained start=+"+ end=+$\|"+ contains=javaSpecial,javaSpecialChar,@Spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000348 syn match javaCommentCharacter contained "'\\[^']\{1,6\}'" contains=javaSpecialChar
349 syn match javaCommentCharacter contained "'\\''" contains=javaSpecialChar
350 syn match javaCommentCharacter contained "'[^\\]'"
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300351 syn cluster javaCommentSpecial add=javaCommentString,javaCommentCharacter,javaNumber,javaStrTempl
352 syn cluster javaCommentSpecial2 add=javaComment2String,javaCommentCharacter,javaNumber,javaStrTempl
Bram Moolenaar071d4272004-06-13 20:20:40 +0000353endif
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300354
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200355syn region javaComment matchgroup=javaCommentStart start="/\*" end="\*/" contains=@javaCommentSpecial,javaTodo,javaCommentError,javaSpaceError,@Spell fold
356syn match javaCommentStar contained "^\s*\*[^/]"me=e-1
357syn match javaCommentStar contained "^\s*\*$"
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300358syn match javaLineComment "//.*" contains=@javaCommentSpecial2,javaTodo,javaCommentMarkupTag,javaSpaceError,@Spell
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300359syn match javaCommentMarkupTag contained "@\%(end\|highlight\|link\|replace\|start\)\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
360syn match javaCommentMarkupTagAttr contained "\<region\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200361exec '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 +0300362syn match javaCommentError contained "/\*"me=e-1 display
Bram Moolenaar071d4272004-06-13 20:20:40 +0000363
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200364if !exists("g:java_ignore_javadoc") && (s:with_html || s:with_markdown) && g:main_syntax != 'jsp'
365 " The overridable "html*" and "markdown*" default links must be
366 " defined _before_ the inclusion of the same default links from
367 " "html.vim" and "markdown.vim".
368 if s:with_html || s:with_markdown
369 hi def link htmlComment Special
370 hi def link htmlCommentPart Special
371 hi def link htmlArg Type
372 hi def link htmlString String
373 endif
374
375 if s:with_markdown
376 hi def link markdownCode Special
377 hi def link markdownCodeBlock Special
378 hi def link markdownCodeDelimiter Special
379 hi def link markdownLinkDelimiter Comment
380 endif
381
Bram Moolenaar071d4272004-06-13 20:20:40 +0000382 syntax case ignore
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300383
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200384 " Note that javaDocSeeTag is valid in HTML and Markdown.
385 let s:ff.WithMarkdown = s:ff.RightConstant
386
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300387 " Include HTML syntax coloring for Javadoc comments.
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200388 if s:with_html
Aliaksei Budavei60310a42024-10-04 20:25:05 +0200389 try
Aliaksei Budavei910bfd52025-04-28 17:58:22 +0200390 if exists("g:html_syntax_folding") && !exists("g:java_consent_to_html_syntax_folding")
391 let s:html_syntax_folding_copy = g:html_syntax_folding
392 unlet g:html_syntax_folding
393 endif
394
Aliaksei Budavei60310a42024-10-04 20:25:05 +0200395 syntax include @javaHtml syntax/html.vim
396 finally
397 unlet! b:current_syntax
Aliaksei Budavei910bfd52025-04-28 17:58:22 +0200398
399 if exists("s:html_syntax_folding_copy")
400 let g:html_syntax_folding = s:html_syntax_folding_copy
401 unlet s:html_syntax_folding_copy
402 endif
Aliaksei Budavei60310a42024-10-04 20:25:05 +0200403 endtry
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200404 endif
405
406 " Include Markdown syntax coloring (v7.2.437) for Javadoc comments.
407 if s:with_markdown
408 try
Aliaksei Budavei910bfd52025-04-28 17:58:22 +0200409 if exists("g:html_syntax_folding") && !exists("g:java_consent_to_html_syntax_folding")
410 let s:html_syntax_folding_copy = g:html_syntax_folding
411 unlet g:html_syntax_folding
412 endif
413
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200414 syntax include @javaMarkdown syntax/markdown.vim
Aliaksei Budaveicd960752025-01-03 17:38:14 +0100415
416 try
417 syn clear markdownId markdownLineStart markdownH1 markdownH2 markdownHeadingRule markdownRule markdownCode markdownCodeBlock markdownIdDeclaration
418 let s:ff.WithMarkdown = s:ff.LeftConstant
419 catch /\<E28:/
420 call s:ReportOnce(v:exception)
421 let s:no_support = 1
422 unlet! g:java_ignore_markdown
423 let g:java_ignore_markdown = 28
424 endtry
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200425 catch /\<E48[45]:/
426 call s:ReportOnce(v:exception)
Aliaksei Budaveicd960752025-01-03 17:38:14 +0100427 let s:no_support = 1
Aliaksei Budavei60310a42024-10-04 20:25:05 +0200428 finally
429 unlet! b:current_syntax
Aliaksei Budaveicd960752025-01-03 17:38:14 +0100430
Aliaksei Budavei910bfd52025-04-28 17:58:22 +0200431 if exists("s:html_syntax_folding_copy")
432 let g:html_syntax_folding = s:html_syntax_folding_copy
433 unlet s:html_syntax_folding_copy
434 endif
435
Aliaksei Budaveicd960752025-01-03 17:38:14 +0100436 if exists("s:no_support")
437 unlet s:no_support
438 unlockvar s:with_markdown
439 let s:with_markdown = 0
440 lockvar s:with_markdown
441 hi clear markdownCode
442 hi clear markdownCodeBlock
443 hi clear markdownCodeDelimiter
444 hi clear markdownLinkDelimiter
445 endif
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200446 endtry
447 endif
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300448
449 " HTML enables spell checking for all text that is not in a syntax
450 " item (:syntax spell toplevel); instead, limit spell checking to
451 " items matchable with syntax groups containing the @Spell cluster.
452 try
453 syntax spell default
454 catch /\<E390:/
455 call s:ReportOnce(v:exception)
456 endtry
Bram Moolenaar5c736222010-01-06 20:54:52 +0100457
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200458 if s:with_markdown
459 syn region javaMarkdownComment start="///" skip="^\s*///.*$" end="^" keepend contains=javaMarkdownCommentTitle,javaMarkdownShortcutLink,@javaMarkdown,@javaDocTags,javaTodo,@Spell nextgroup=javaMarkdownCommentTitle fold
460 syn match javaMarkdownCommentMask contained "^\s*///"
461 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'
462 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'
463 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'
464
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200465 " REDEFINE THE MARKDOWN ITEMS ANCHORED WITH "^", OBSERVING THE
466 " DEFINITION ORDER.
467 syn match markdownLineStart contained "^\s*///\s*[<@]\@!" contains=@markdownBlock,javaMarkdownCommentTitle,javaMarkdownCommentMask nextgroup=@markdownBlock,htmlSpecialChar
468 " See https://spec.commonmark.org/0.31.2/#setext-headings.
469 syn match markdownH1 contained "^\s*/// \{,3}.\+\r\=\n\s*/// \{,3}=\+\s*$" contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink,javaMarkdownCommentMask
470 syn match markdownH2 contained "^\s*/// \{,3}.\+\r\=\n\s*/// \{,3}-\+\s*$" contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink,javaMarkdownCommentMask
471 " See https://spec.commonmark.org/0.31.2/#atx-headings.
472 syn region markdownH1 contained matchgroup=markdownH1Delimiter start=" \{,3}#\s" end="#*\s*$" keepend contains=@markdownInline,markdownAutomaticLink oneline
473 syn region markdownH2 contained matchgroup=markdownH2Delimiter start=" \{,3}##\s" end="#*\s*$" keepend contains=@markdownInline,markdownAutomaticLink oneline
474 syn match markdownHeadingRule contained "^\s*/// \{,3}[=-]\+\s*$" contains=javaMarkdownCommentMask
475 " See https://spec.commonmark.org/0.31.2/#thematic-breaks.
476 syn match markdownRule contained "^\s*/// \{,3}\*\s*\*\%(\s*\*\)\+\s*$" contains=javaMarkdownCommentMask
477 syn match markdownRule contained "^\s*/// \{,3}_\s*_\%(\s*_\)\+\s*$" contains=javaMarkdownCommentMask
478 syn match markdownRule contained "^\s*/// \{,3}-\s*-\%(\s*-\)\+\s*$" contains=javaMarkdownCommentMask
479 " See https://spec.commonmark.org/0.31.2/#indented-code-blocks.
480 syn region markdownCodeBlock contained start="^\s*///\%( \{4,}\|\t\)" end="^\ze\s*///\%(\s*$\| \{,3}\S\)" keepend contains=javaMarkdownCommentMask
481 " See https://spec.commonmark.org/0.31.2/#code-spans.
482 syn region markdownCode contained matchgroup=markdownCodeDelimiter start="\z(`\+\) \=" end=" \=\z1" keepend contains=markdownLineStart,javaMarkdownCommentMask
483 " See https://spec.commonmark.org/0.31.2/#fenced-code-blocks.
484 syn region markdownCodeBlock contained start="^\s*/// \{,3}\z(```\+\)\%(.\{-}[^`]`\)\@!" end="^\s*/// \{,3}\z1`*" keepend contains=javaMarkdownCommentMask
485 syn region markdownCodeBlock contained start="^\s*/// \{,3}\z(\~\~\~\+\)" end="^\s*/// \{,3}\z1\~*" keepend contains=javaMarkdownCommentMask
486 " See https://spec.commonmark.org/0.31.2/#link-reference-definitions.
487 syn region markdownIdDeclaration contained matchgroup=markdownLinkDelimiter start="^\s*/// \{,3\}!\=\[" end="\]:" keepend contains=javaMarkdownCommentMask nextgroup=markdownUrl oneline skipwhite
488 " See https://spec.commonmark.org/0.31.2/#link-label.
489 syn region markdownId contained matchgroup=markdownIdDelimiter start="\[\%([\t ]\]\)\@!" end="\]" contains=javaMarkdownSkipBrackets,javaMarkdownCommentMask
490 " Note that escaped brackets can be unbalanced.
491 syn match javaMarkdownSkipBrackets contained transparent "\\\[\|\\\]"
492 " See https://spec.commonmark.org/0.31.2/#shortcut-reference-link.
493 syn region javaMarkdownShortcutLink contained matchgroup=markdownLinkTextDelimiter start="!\=\[^\@!\%(\_[^][]*\%(\[\_[^][]*\]\_[^][]*\)*]\%([[(]\)\@!\)\@=" end="\]\%([[(]\)\@!" contains=@markdownInline,markdownLineStart,javaMarkdownSkipBrackets,javaMarkdownCommentMask nextgroup=markdownLink,markdownId skipwhite
494
495 for s:name in ['markdownFootnoteDefinition', 'markdownFootnote']
496 if hlexists(s:name)
497 exec 'syn clear ' . s:name
498 endif
499 endfor
500
501 unlet s:name
502
503 " COMBAK: Footnotes are recognised by "markdown.vim", but are not
504 " in CommonMark. See https://pandoc.org/MANUAL.html#footnotes.
505""""syn match markdownFootnoteDefinition contained "^\s*///\s*\[^[^\]]\+\]:" contains=javaMarkdownCommentMask
506
507 hi def link javaMarkdownComment Comment
508 hi def link javaMarkdownCommentMask javaMarkdownComment
509 hi def link javaMarkdownCommentTitle SpecialComment
510 hi def link javaMarkdownShortcutLink htmlLink
511 endif
512
513 if s:with_html
514 syn region javaDocComment start="/\*\*" end="\*/" keepend contains=javaCommentTitle,@javaHtml,@javaDocTags,javaTodo,javaCommentError,javaSpaceError,@Spell fold
515 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'
516 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
517 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
518 hi def link javaDocComment Comment
519 hi def link javaCommentTitle SpecialComment
520 endif
521
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200522 " The members of javaDocTags are sub-grouped according to the Java
523 " version of their introduction, and sub-group members in turn are
524 " arranged in alphabetical order, so that future newer members can
525 " be pre-sorted and appended without disturbing the current member
526 " placement.
527 " Since they only have significance in javaCommentTitle, neither
528 " javaDocSummaryTag nor javaDocReturnTitleTag are defined.
529 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
530
531 " Anticipate non-standard inline tags in {@return} and {@summary}.
532 syn region javaTitleSkipBlock contained transparent start="{\%(@\%(return\|summary\)\>\)\@!" end="}"
533 syn match javaDocDocRootTag contained "{@docRoot}"
534 syn match javaDocInheritDocTag contained "{@inheritDoc}"
535 syn region javaIndexSkipBlock contained transparent start="{\%(@index\>\)\@!" end="}" contains=javaIndexSkipBlock,javaDocIndexTag
536 syn region javaDocIndexTag contained start="{@index\>" end="}" contains=javaDocIndexTag,javaIndexSkipBlock
537 syn region javaLinkSkipBlock contained transparent start="{\%(@link\>\)\@!" end="}" contains=javaLinkSkipBlock,javaDocLinkTag
538 syn region javaDocLinkTag contained start="{@link\>" end="}" contains=javaDocLinkTag,javaLinkSkipBlock
539 syn region javaLinkplainSkipBlock contained transparent start="{\%(@linkplain\>\)\@!" end="}" contains=javaLinkplainSkipBlock,javaDocLinkplainTag
540 syn region javaDocLinkplainTag contained start="{@linkplain\>" end="}" contains=javaDocLinkplainTag,javaLinkplainSkipBlock
541 syn region javaLiteralSkipBlock contained transparent start="{\%(@literal\>\)\@!" end="}" contains=javaLiteralSkipBlock,javaDocLiteralTag
542 syn region javaDocLiteralTag contained start="{@literal\>" end="}" contains=javaDocLiteralTag,javaLiteralSkipBlock
543 syn region javaSystemPropertySkipBlock contained transparent start="{\%(@systemProperty\>\)\@!" end="}" contains=javaSystemPropertySkipBlock,javaDocSystemPropertyTag
544 syn region javaDocSystemPropertyTag contained start="{@systemProperty\>" end="}" contains=javaDocSystemPropertyTag,javaSystemPropertySkipBlock
545 syn region javaValueSkipBlock contained transparent start="{\%(@value\>\)\@!" end="}" contains=javaValueSkipBlock,javaDocValueTag
546 syn region javaDocValueTag contained start="{@value\>" end="}" contains=javaDocValueTag,javaValueSkipBlock
547
548 syn match javaDocParam contained "\s\zs\S\+"
549 syn match javaDocExceptionTag contained "@exception\s\+\S\+" contains=javaDocParam
550 syn match javaDocParamTag contained "@param\s\+\S\+" contains=javaDocParam
551 syn match javaDocSinceTag contained "@since\s\+\S\+" contains=javaDocParam
552 syn match javaDocThrowsTag contained "@throws\s\+\S\+" contains=javaDocParam
553 syn match javaDocSpecTag contained "@spec\_s\+\S\+\ze\_s\+\S\+" contains=javaDocParam
554
555 syn match javaDocAuthorTag contained "@author\>"
556 syn match javaDocDeprecatedTag contained "@deprecated\>"
557 syn match javaDocHiddenTag contained "@hidden\>"
558 syn match javaDocReturnTag contained "@return\>"
559 syn match javaDocSerialTag contained "@serial\>"
560 syn match javaDocSerialDataTag contained "@serialData\>"
561 syn match javaDocSerialFieldTag contained "@serialField\>"
562 syn match javaDocVersionTag contained "@version\>"
563
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200564 syn match javaDocSeeTag contained "@see\>\s*" nextgroup=javaDocSeeTag1,javaDocSeeTag2,javaDocSeeTag3,javaDocSeeTag4,javaDocSeeTagStar,javaDocSeeTagSlash skipwhite skipempty
565
566 if s:with_html
567 syn match javaDocSeeTagStar contained "^\s*\*\+\%(\s*{\=@\|/\|$\)\@!" nextgroup=javaDocSeeTag1,javaDocSeeTag2,javaDocSeeTag3,javaDocSeeTag4 skipwhite skipempty
568 hi def link javaDocSeeTagStar javaDocComment
569 endif
570
571 if s:with_markdown
572 syn match javaDocSeeTagSlash contained "^\s*///\%(\s*{\=@\|$\)\@!" nextgroup=javaDocSeeTag1,javaDocSeeTag2,javaDocSeeTag3,javaDocSeeTag4 skipwhite skipempty
573 hi def link javaDocSeeTagSlash javaMarkdownComment
574 endif
575
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200576 syn match javaDocSeeTag1 contained @"\_[^"]\+"@
577 syn match javaDocSeeTag2 contained @<a\s\+\_.\{-}</a>@ contains=@javaHtml extend
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200578 exec 'syn match javaDocSeeTag3 contained @[' . s:ff.WithMarkdown('[', '') . '"< \t]\@!\%(\k\|[/.]\)*\%(##\=\k\+\%((\_[^)]*)\)\=\)\=@ nextgroup=javaDocSeeTag3Label skipwhite skipempty'
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200579 syn match javaDocSeeTag3Label contained @\k\%(\k\+\s*\)*$@
580
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200581 " COMBAK: No support for type javaDocSeeTag2 in Markdown.
582""if s:with_markdown
583"" syn match javaDocSeeTag4 contained @\[.\+\]\s\=\%(\[.\+\]\|(.\+)\)@ contains=@javaMarkdown extend
584"" hi def link javaDocSeeTag4 Special
585""endif
586
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300587 syn region javaCodeSkipBlock contained transparent start="{\%(@code\>\)\@!" end="}" contains=javaCodeSkipBlock,javaDocCodeTag
588 syn region javaDocCodeTag contained start="{@code\>" end="}" contains=javaDocCodeTag,javaCodeSkipBlock
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200589
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200590 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 +0300591 syn region javaSnippetSkipBlock contained transparent start="{\%(@snippet\>\)\@!" end="}" contains=javaSnippetSkipBlock,javaDocSnippetTag,javaCommentMarkupTag
592 syn region javaDocSnippetTag contained start="{@snippet\>" end="}" contains=javaDocSnippetTag,javaSnippetSkipBlock,javaDocSnippetTagAttr,javaCommentMarkupTag
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300593
Bram Moolenaar071d4272004-06-13 20:20:40 +0000594 syntax case match
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200595 hi def link javaDocParam Function
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200596
597 hi def link javaDocAuthorTag Special
598 hi def link javaDocCodeTag Special
599 hi def link javaDocDeprecatedTag Special
600 hi def link javaDocDocRootTag Special
601 hi def link javaDocExceptionTag Special
602 hi def link javaDocHiddenTag Special
603 hi def link javaDocIndexTag Special
604 hi def link javaDocInheritDocTag Special
605 hi def link javaDocLinkTag Special
606 hi def link javaDocLinkplainTag Special
607 hi def link javaDocLiteralTag Special
608 hi def link javaDocParamTag Special
609 hi def link javaDocReturnTag Special
610 hi def link javaDocSeeTag Special
611 hi def link javaDocSeeTag1 String
612 hi def link javaDocSeeTag2 Special
613 hi def link javaDocSeeTag3 Function
614 hi def link javaDocSerialTag Special
615 hi def link javaDocSerialDataTag Special
616 hi def link javaDocSerialFieldTag Special
617 hi def link javaDocSinceTag Special
618 hi def link javaDocSnippetTag Special
619 hi def link javaDocSpecTag Special
620 hi def link javaDocSystemPropertyTag Special
621 hi def link javaDocThrowsTag Special
622 hi def link javaDocValueTag Special
623 hi def link javaDocVersionTag Special
Bram Moolenaar071d4272004-06-13 20:20:40 +0000624endif
625
626" match the special comment /**/
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200627syn match javaComment "/\*\*/"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000628
629" Strings and constants
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200630syn match javaSpecialError contained "\\."
Bram Moolenaar071d4272004-06-13 20:20:40 +0000631syn match javaSpecialCharError contained "[^']"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300632" Escape Sequences (JLS-17, §3.10.7):
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200633syn match javaSpecialChar contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000634syn region javaString start=+"+ end=+"+ end=+$+ contains=javaSpecialChar,javaSpecialError,@Spell
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300635syn region javaString start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecialChar,javaSpecialError,javaTextBlockError,@Spell
636syn match javaTextBlockError +"""\s*"""+
Aliaksei Budavei8556e232024-08-27 22:32:13 +0200637
Aliaksei Budavei1054b182025-03-29 09:16:30 +0100638if s:ff.IsAnyRequestedPreviewFeatureOf([430])
Aliaksei Budavei8556e232024-08-27 22:32:13 +0200639 syn region javaStrTemplEmbExp contained matchgroup=javaStrTempl start="\\{" end="}" contains=TOP
640 exec 'syn region javaStrTempl start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,@Spell'
641 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'
642 hi def link javaStrTempl Macro
643endif
644
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200645syn match javaCharacter "'[^']*'" contains=javaSpecialChar,javaSpecialCharError
646syn match javaCharacter "'\\''" contains=javaSpecialChar
647syn match javaCharacter "'[^\\]'"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300648" Integer literals (JLS-17, §3.10.1):
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200649syn keyword javaNumber 0 0l 0L
650syn match javaNumber "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300651" Decimal floating-point literals (JLS-17, §3.10.2):
652" Against "\<\d\+\>\.":
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200653syn match javaNumber "\<\d\%(_*\d\)*\."
654syn match javaNumber "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
655syn match javaNumber "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
656syn match javaNumber "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300657" Hexadecimal floating-point literals (JLS-17, §3.10.2):
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200658syn match javaNumber "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000659
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300660" Unicode characters
661syn match javaSpecial "\\u\x\x\x\x"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000662
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200663" Method declarations (JLS-17, §8.4.3, §8.4.4, §9.4).
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200664if exists("g:java_highlight_functions")
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200665 syn cluster javaFuncParams contains=javaAnnotation,@javaClasses,javaGenerics,javaType,javaVarArg,javaComment,javaLineComment
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200666
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200667 if exists("g:java_highlight_signature")
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200668 syn cluster javaFuncParams add=javaParamModifier
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200669 hi def link javaFuncDefStart javaFuncDef
670 else
671 syn cluster javaFuncParams add=javaScopeDecl,javaConceptKind,javaStorageClass,javaExternal
672 endif
673
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200674 if g:java_highlight_functions =~# '^indent[1-8]\=$'
675 let s:last = g:java_highlight_functions[-1 :]
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300676 let s:indent = s:last != 't' ? repeat("\x20", s:last) : "\t"
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300677 " Try to not match other type members, initialiser blocks, enum
678 " constants (JLS-17, §8.9.1), and constructors (JLS-17, §8.1.7):
679 " at any _conventional_ indentation, skip over all fields with
680 " "[^=]*", all records with "\<record\s", and let the "*Skip*"
681 " definitions take care of constructor declarations and enum
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200682 " constants (with no support for @Foo(value = "bar")). Also,
683 " reject inlined declarations with "[^{]" for signature.
684 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 +0300685 " As long as package-private constructors cannot be matched with
686 " javaFuncDef, do not look with javaConstructorSkipDeclarator for
687 " them.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200688 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'
689 " With a zero-width span for signature applicable on demand to
690 " javaFuncDef, make related adjustments:
691 " (1) Claim all enum constants of a line as a unit.
692 exec 'syn match javaEnumSkipConstant contained transparent /^' . s:indent . '\%(\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)*\K\k*\s*\%((.*)\)\=\s*[,;({]\s*\)\+/ contains=@javaEnumConstants'
693 " (2) Define a syntax group for top level enumerations and tell
694 " apart their constants from method declarations.
695 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'
696 " (3) Define a base variant of javaParenT without using @javaTop
697 " in order to not include javaFuncDef.
698 syn region javaParenE transparent matchgroup=javaParen start="(" end=")" contains=@javaEnumConstants,javaInParen
699 syn region javaParenE transparent matchgroup=javaParen start="\[" end="\]" contains=@javaEnumConstants
700 syn cluster javaEnumConstants contains=TOP,javaTopEnumDeclaration,javaFuncDef,javaParenT
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300701 unlet s:indent s:last
Bram Moolenaar071d4272004-06-13 20:20:40 +0000702 else
Aliaksei Budavei40524742024-04-14 19:57:00 +0300703 " This is the "style" variant (:help ft-java-syntax).
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200704
705 " Match arbitrarily indented camelCasedName method declarations.
706 " Match: [@ɐ] [abstract] [<α, β>] Τʬ[<γ>][[][]] μʭʭ(/* ... */);
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200707 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 +0000708 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000709endif
710
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200711if exists("g:java_highlight_debug")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000712 " Strings and constants
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300713 syn match javaDebugSpecial contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200714 syn region javaDebugString contained start=+"+ end=+"+ contains=javaDebugSpecial
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300715 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 +0200716
Aliaksei Budavei1054b182025-03-29 09:16:30 +0100717 if s:ff.IsAnyRequestedPreviewFeatureOf([430])
Aliaksei Budavei8556e232024-08-27 22:32:13 +0200718 " The highlight groups of java{StrTempl,Debug{,Paren,StrTempl}}\,
719 " share one colour by default. Do not conflate unrelated parens.
720 syn region javaDebugStrTemplEmbExp contained matchgroup=javaDebugStrTempl start="\\{" end="}" contains=javaComment,javaLineComment,javaDebug\%(Paren\)\@!.*
721 exec 'syn region javaDebugStrTempl contained start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ contains=javaDebugStrTemplEmbExp,javaDebugSpecial'
722 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'
723 hi def link javaDebugStrTempl Macro
724 endif
725
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300726 syn match javaDebugTextBlockError contained +"""\s*"""+
Bram Moolenaar071d4272004-06-13 20:20:40 +0000727 syn match javaDebugCharacter contained "'[^\\]'"
728 syn match javaDebugSpecialCharacter contained "'\\.'"
729 syn match javaDebugSpecialCharacter contained "'\\''"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300730 syn keyword javaDebugNumber contained 0 0l 0L
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300731 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\."
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300732 syn match javaDebugNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
733 syn match javaDebugNumber contained "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
734 syn match javaDebugNumber contained "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
735 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
736 syn match javaDebugNumber contained "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000737 syn keyword javaDebugBoolean contained true false
738 syn keyword javaDebugType contained null this super
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200739 syn region javaDebugParen contained start=+(+ end=+)+ contains=javaDebug.*,javaDebugParen
Bram Moolenaar071d4272004-06-13 20:20:40 +0000740
Aliaksei Budavei40524742024-04-14 19:57:00 +0300741 " To make this work, define the highlighting for these groups.
742 syn match javaDebug "\<System\.\%(out\|err\)\.print\%(ln\)\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
743" FIXME: What API does "p" belong to?
744" syn match javaDebug "\<p\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
745 syn match javaDebug "\<\K\k*\.printStackTrace\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
746" FIXME: What API do "trace*" belong to?
747" syn match javaDebug "\<trace[SL]\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
Bram Moolenaar071d4272004-06-13 20:20:40 +0000748
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200749 hi def link javaDebug Debug
750 hi def link javaDebugString DebugString
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200751 hi def link javaDebugTextBlockError Error
752 hi def link javaDebugType DebugType
753 hi def link javaDebugBoolean DebugBoolean
754 hi def link javaDebugNumber Debug
755 hi def link javaDebugSpecial DebugSpecial
756 hi def link javaDebugSpecialCharacter DebugSpecial
757 hi def link javaDebugCharacter DebugString
758 hi def link javaDebugParen Debug
Bram Moolenaar071d4272004-06-13 20:20:40 +0000759
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200760 hi def link DebugString String
761 hi def link DebugSpecial Special
762 hi def link DebugBoolean Boolean
763 hi def link DebugType Type
Bram Moolenaar071d4272004-06-13 20:20:40 +0000764endif
765
Aliaksei Budavei05d08932024-10-12 17:12:51 +0200766" Complement javaBlock and javaInParen for highlighting.
767syn region javaBlockOther transparent matchgroup=javaBlockOtherStart start="{" end="}"
768
Aliaksei Budavei94c5d8a2024-06-19 20:10:47 +0200769" Try not to fold top-level-type bodies under assumption that there is
770" but one such body.
Aliaksei Budavei05d08932024-10-12 17:12:51 +0200771exec 'syn region javaBlock transparent matchgroup=javaBlockStart start="\%(^\|^\S[^:]\+\)\@' . s:ff.Peek('120', '') . '<!{" end="}" fold'
Aliaksei Budavei94c5d8a2024-06-19 20:10:47 +0200772
Aliaksei Budavei05d08932024-10-12 17:12:51 +0200773" See "D.2.1 Anonymous Classes" at
774" 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 +0200775if exists("g:java_mark_braces_in_parens_as_errors")
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300776 syn match javaInParen contained "[{}]"
777 hi def link javaInParen javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000778endif
779
780" catch errors caused by wrong parenthesis
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200781syn region javaParenT transparent matchgroup=javaParen start="(" end=")" contains=@javaTop,javaInParen,javaParenT1
782syn region javaParenT1 contained transparent matchgroup=javaParen1 start="(" end=")" contains=@javaTop,javaInParen,javaParenT2
783syn region javaParenT2 contained transparent matchgroup=javaParen2 start="(" end=")" contains=@javaTop,javaInParen,javaParenT
784syn match javaParenError ")"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000785" catch errors caused by wrong square parenthesis
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200786syn region javaParenT transparent matchgroup=javaParen start="\[" end="\]" contains=@javaTop,javaParenT1
787syn region javaParenT1 contained transparent matchgroup=javaParen1 start="\[" end="\]" contains=@javaTop,javaParenT2
788syn region javaParenT2 contained transparent matchgroup=javaParen2 start="\[" end="\]" contains=@javaTop,javaParenT
789syn match javaParenError "\]"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000790
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200791" Lambda expressions (JLS-17, §15.27) and method reference expressions
792" (JLS-17, §15.13).
793if exists("g:java_highlight_functions")
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200794 syn match javaMethodRef ":::\@!"
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200795
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200796 if exists("g:java_highlight_signature")
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200797 let s:ff.LambdaDef = s:ff.LeftConstant
798 else
799 let s:ff.LambdaDef = s:ff.RightConstant
800 endif
801
Aliaksei Budavei40524742024-04-14 19:57:00 +0300802 " Make ()-matching definitions after the parenthesis error catcher.
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300803 "
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200804 " Note that here and elsewhere a single-line token is used for \z,
805 " with other tokens repeated as necessary, to overcome the lack of
806 " support for multi-line matching with \z.
807 "
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300808 " Match: ([@A [@B ...] final] var a[, var b, ...]) ->
809 " | ([@A [@B ...] final] T[<α>][[][]] a[, T b, ...]) ->
810 " There is no recognition of expressions interspersed with comments
811 " or of expressions whose parameterised parameter types are written
812 " across multiple lines.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200813 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 +0300814 " Match: () ->
815 " | (a[, b, ...]) ->
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200816 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 +0300817 " Match: a ->
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200818 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 +0300819
820 syn keyword javaParamModifier contained final
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300821 syn keyword javaLambdaVarType contained var
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200822 hi def link javaParamModifier javaConceptKind
823 hi def link javaLambdaVarType javaOperator
824 hi def link javaLambdaDef javaFuncDef
825 hi def link javaLambdaDefStart javaFuncDef
826 hi def link javaMethodRef javaFuncDef
827 hi def link javaFuncDef Function
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100828endif
829
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300830" The @javaTop cluster comprises non-contained Java syntax groups.
831" Note that the syntax file "aidl.vim" relies on its availability.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200832syn cluster javaTop contains=TOP,javaTopEnumDeclaration
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300833
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200834if !exists("g:java_minlines")
835 let g:java_minlines = 10
Bram Moolenaar071d4272004-06-13 20:20:40 +0000836endif
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300837
838" Note that variations of a /*/ balanced comment, e.g., /*/*/, /*//*/,
839" /* /*/, /* /*/, etc., may have their rightmost /*/ part accepted
840" as a comment start by ':syntax sync ccomment'; consider alternatives
841" to make synchronisation start further towards file's beginning by
842" bumping up g:java_minlines or issuing ':syntax sync fromstart' or
843" preferring &foldmethod set to 'syntax'.
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200844exec "syn sync ccomment javaComment minlines=" . g:java_minlines
Bram Moolenaar071d4272004-06-13 20:20:40 +0000845
846" The default highlighting.
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200847hi def link javaVarArg Function
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200848hi def link javaBranch Conditional
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200849hi def link javaConditional Conditional
850hi def link javaRepeat Repeat
851hi def link javaExceptions Exception
852hi def link javaAssert Statement
853hi def link javaStorageClass StorageClass
854hi def link javaMethodDecl javaStorageClass
855hi def link javaClassDecl javaStorageClass
856hi def link javaScopeDecl javaStorageClass
Aliaksei Budavei5e95c8f2024-09-15 19:53:50 +0200857hi def link javaConceptKind javaStorageClass
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200858
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200859hi def link javaBoolean Boolean
860hi def link javaSpecial Special
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200861hi def link javaSpecialError Error
862hi def link javaSpecialCharError Error
863hi def link javaString String
864hi def link javaCharacter Character
865hi def link javaSpecialChar SpecialChar
866hi def link javaNumber Number
867hi def link javaError Error
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200868hi def link javaError2 javaError
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300869hi def link javaTextBlockError Error
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200870hi def link javaParenError javaError
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200871hi def link javaStatement Statement
872hi def link javaOperator Operator
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200873hi def link javaConstant Constant
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200874hi def link javaTypedef Typedef
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200875hi def link javaTodo Todo
876hi def link javaAnnotation PreProc
Aliaksei Budavei902b7662024-06-13 18:30:09 +0300877hi def link javaAnnotationStart javaAnnotation
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200878hi def link javaType Type
879hi def link javaExternal Include
Bram Moolenaar071d4272004-06-13 20:20:40 +0000880
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200881hi def link javaUserLabel Label
882hi def link javaUserLabelRef javaUserLabel
883hi def link javaLabel Label
884hi def link javaLabelDefault javaLabel
885hi def link javaLabelVarType javaOperator
Bram Moolenaar071d4272004-06-13 20:20:40 +0000886
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200887hi def link javaComment Comment
888hi def link javaCommentStar javaComment
889hi def link javaLineComment Comment
890hi def link javaCommentMarkupTagAttr javaHtmlArg
891hi def link javaCommentString javaString
892hi def link javaComment2String javaString
893hi def link javaCommentCharacter javaCharacter
894hi def link javaCommentError javaError
895hi def link javaCommentStart javaComment
896
897hi def link javaHtmlArg Type
898hi def link javaHtmlString String
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200899
Bram Moolenaar071d4272004-06-13 20:20:40 +0000900let b:current_syntax = "java"
901
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200902if g:main_syntax == 'java'
903 unlet g:main_syntax
Bram Moolenaar071d4272004-06-13 20:20:40 +0000904endif
905
Aliaksei Budavei60310a42024-10-04 20:25:05 +0200906if exists("s:clear_java_ignore_html")
907 unlet! s:clear_java_ignore_html g:java_ignore_html
908endif
909
910if exists("s:clear_java_ignore_markdown")
911 unlet! s:clear_java_ignore_markdown g:java_ignore_markdown
912endif
913
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200914let b:spell_options = "contained"
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +0200915let &cpo = s:cpo_save
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200916unlet s:cpo_save s:ff s:with_html s:with_markdown
Bram Moolenaar071d4272004-06-13 20:20:40 +0000917
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300918" See ":help vim9-mix".
919if !has("vim9script")
920 finish
921endif
922
Aliaksei Budavei2750b832024-08-22 21:09:32 +0200923if exists("g:java_foldtext_show_first_or_second_line")
924 def! s:LazyPrefix(prefix: string, dashes: string, count: number): string
925 return empty(prefix)
926 ? printf('+-%s%3d lines: ', dashes, count)
927 : prefix
928 enddef
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300929
Aliaksei Budavei2750b832024-08-22 21:09:32 +0200930 def! s:JavaSyntaxFoldTextExpr(): string
931 # Piggyback on NGETTEXT.
932 const summary: string = foldtext()
933 return getline(v:foldstart) !~ '/\*\+\s*$'
934 ? summary
935 : LazyPrefix(matchstr(summary, '^+-\+\s*\d\+\s.\{-1,}:\s'),
936 v:folddashes,
937 (v:foldend - v:foldstart + 1)) ..
938 getline(v:foldstart + 1)
939 enddef
940
941 setlocal foldtext=s:JavaSyntaxFoldTextExpr()
942 delfunction! g:JavaSyntaxFoldTextExpr
943endif
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200944" vim: fdm=syntax sw=2 ts=8 noet sta