blob: 737219afce854d141722be59f05e9d2483a5d4cb [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 Budavei85f054a2024-09-30 19:40:04 +02006" Last Change: 2024 Sep 28
Bram Moolenaar071d4272004-06-13 20:20:40 +00007
8" Please check :help java.vim for comments on some of the options available.
9
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020010" quit when a syntax file was already loaded
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +020011if !exists("g:main_syntax")
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020012 if exists("b:current_syntax")
Bram Moolenaar071d4272004-06-13 20:20:40 +000013 finish
14 endif
15 " we define it here so that included files can test for it
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +020016 let g:main_syntax = 'java'
Bram Moolenaar071d4272004-06-13 20:20:40 +000017endif
18
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +020019let s:cpo_save = &cpo
20set cpo&vim
21
Aliaksei Budaveid3952e82024-05-11 00:39:31 +030022"""" STRIVE TO REMAIN COMPATIBLE FOR AT LEAST VIM 7.0.
23let s:ff = {}
24
25function! s:ff.LeftConstant(x, y) abort
26 return a:x
27endfunction
28
29function! s:ff.RightConstant(x, y) abort
30 return a:y
31endfunction
32
Aliaksei Budavei8556e232024-08-27 22:32:13 +020033function! s:ff.IsRequestedPreviewFeature(n) abort
34 return exists("g:java_syntax_previews") && index(g:java_syntax_previews, a:n) + 1
35endfunction
36
Aliaksei Budaveid3952e82024-05-11 00:39:31 +030037if !exists("*s:ReportOnce")
38 function s:ReportOnce(message) abort
39 echomsg 'syntax/java.vim: ' . a:message
40 endfunction
41else
42 function! s:ReportOnce(dummy)
43 endfunction
44endif
45
Aliaksei Budavei2750b832024-08-22 21:09:32 +020046if exists("g:java_foldtext_show_first_or_second_line")
47 function! s:LazyPrefix(prefix, dashes, count) abort
48 return empty(a:prefix)
49 \ ? printf('+-%s%3d lines: ', a:dashes, a:count)
50 \ : a:prefix
51 endfunction
Aliaksei Budavei371bab02024-06-16 09:42:55 +030052
Aliaksei Budavei2750b832024-08-22 21:09:32 +020053 function! JavaSyntaxFoldTextExpr() abort
54 " Piggyback on NGETTEXT.
55 let summary = foldtext()
56 return getline(v:foldstart) !~ '/\*\+\s*$'
57 \ ? summary
58 \ : s:LazyPrefix(matchstr(summary, '^+-\+\s*\d\+\s.\{-1,}:\s'),
59 \ v:folddashes,
60 \ (v:foldend - v:foldstart + 1)) .
61 \ getline(v:foldstart + 1)
62 endfunction
63
64 " E120 for "fdt=s:JavaSyntaxFoldTextExpr()" before v8.2.3900.
65 setlocal foldtext=JavaSyntaxFoldTextExpr()
66endif
Aliaksei Budavei371bab02024-06-16 09:42:55 +030067
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020068" Admit the ASCII dollar sign to keyword characters (JLS-17, §3.8):
Aliaksei Budaveid3952e82024-05-11 00:39:31 +030069try
70 exec 'syntax iskeyword ' . &l:iskeyword . ',$'
71catch /\<E410:/
72 call s:ReportOnce(v:exception)
73 setlocal iskeyword+=$
74endtry
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020075
Bram Moolenaar071d4272004-06-13 20:20:40 +000076" some characters that cannot be in a java program (outside a string)
77syn match javaError "[\\@`]"
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +010078syn match javaError "<<<\|\.\.\|=>\|||=\|&&=\|\*\/"
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +020079
Bram Moolenaar071d4272004-06-13 20:20:40 +000080" use separate name so that it can be deleted in javacc.vim
81syn match javaError2 "#\|=<"
Bram Moolenaar071d4272004-06-13 20:20:40 +000082
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020083" Keywords (JLS-17, §3.9):
Bram Moolenaar071d4272004-06-13 20:20:40 +000084syn keyword javaExternal native package
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020085syn match javaExternal "\<import\>\%(\s\+static\>\)\="
Bram Moolenaar071d4272004-06-13 20:20:40 +000086syn keyword javaError goto const
87syn keyword javaConditional if else switch
88syn keyword javaRepeat while for do
89syn keyword javaBoolean true false
90syn keyword javaConstant null
91syn keyword javaTypedef this super
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020092syn keyword javaOperator new instanceof
93syn match javaOperator "\<var\>\%(\s*(\)\@!"
Aliaksei Budaveid3952e82024-05-11 00:39:31 +030094
Aliaksei Budavei50423ab2024-09-20 21:37:46 +020095if s:ff.IsRequestedPreviewFeature(476)
96 " Module imports can be used in any source file.
97 syn match javaExternal "\<import\s\+module\>" contains=javaModuleImport
98 syn keyword javaModuleImport contained module
99 hi def link javaModuleImport Statement
100endif
101
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100102" Since the yield statement, which could take a parenthesised operand,
103" and _qualified_ yield methods get along within the switch block
104" (JLS-17, §3.8), it seems futile to make a region definition for this
105" block; instead look for the _yield_ word alone, and if found,
106" backtrack (arbitrarily) 80 bytes, at most, on the matched line and,
107" if necessary, on the line before that (h: \@<=), trying to match
108" neither a method reference nor a qualified method invocation.
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300109try
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200110 syn match javaOperator "\%(\%(::\|\.\)[[:space:]\n]*\)\@80<!\<yield\>"
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300111 let s:ff.Peek = s:ff.LeftConstant
112catch /\<E59:/
113 call s:ReportOnce(v:exception)
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200114 syn match javaOperator "\%(\%(::\|\.\)[[:space:]\n]*\)\@<!\<yield\>"
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300115 let s:ff.Peek = s:ff.RightConstant
116endtry
117
Bram Moolenaar071d4272004-06-13 20:20:40 +0000118syn keyword javaType boolean char byte short int long float double
119syn keyword javaType void
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100120syn keyword javaStatement return
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200121syn keyword javaStorageClass static synchronized transient volatile strictfp
Bram Moolenaar071d4272004-06-13 20:20:40 +0000122syn keyword javaExceptions throw try catch finally
123syn keyword javaAssert assert
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200124syn keyword javaMethodDecl throws
125" Differentiate a "MyClass.class" literal from the keyword "class".
Bram Moolenaar071d4272004-06-13 20:20:40 +0000126syn match javaTypedef "\.\s*\<class\>"ms=s+1
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200127syn keyword javaClassDecl enum extends implements interface
128syn match javaClassDecl "\<permits\>\%(\s*(\)\@!"
129syn match javaClassDecl "\<record\>\%(\s*(\)\@!"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000130syn match javaClassDecl "^class\>"
131syn match javaClassDecl "[^.]\s*\<class\>"ms=s+1
Aliaksei Budavei40524742024-04-14 19:57:00 +0300132syn match javaAnnotation "@\%(\K\k*\.\)*\K\k*\>"
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300133syn 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 +0200134syn match javaClassDecl "@interface\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000135syn keyword javaBranch break continue nextgroup=javaUserLabelRef skipwhite
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200136syn match javaUserLabelRef contained "\k\+"
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000137syn match javaVarArg "\.\.\."
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200138syn keyword javaScopeDecl public protected private
139syn keyword javaConceptKind abstract final
140syn match javaConceptKind "\<non-sealed\>"
141syn match javaConceptKind "\<sealed\>\%(\s*(\)\@!"
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100142syn match javaConceptKind "\<default\>\%(\s*\%(:\|->\)\)\@!"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000143
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300144if !(v:version < 704)
145 " Request the new regexp engine for [:upper:] and [:lower:].
146 let [s:ff.Engine, s:ff.UpperCase, s:ff.LowerCase] = repeat([s:ff.LeftConstant], 3)
147else
148 " XXX: \C\<[^a-z0-9]\k*\> rejects "type", but matches "τύπος".
149 " XXX: \C\<[^A-Z0-9]\k*\> rejects "Method", but matches "Μέθοδος".
150 let [s:ff.Engine, s:ff.UpperCase, s:ff.LowerCase] = repeat([s:ff.RightConstant], 3)
151endif
Bram Moolenaar63f32602022-06-09 20:45:54 +0100152
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200153if exists("g:java_highlight_signature")
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200154 let [s:ff.PeekTo, s:ff.PeekFrom, s:ff.GroupArgs] = repeat([s:ff.LeftConstant], 3)
155else
156 let [s:ff.PeekTo, s:ff.PeekFrom, s:ff.GroupArgs] = repeat([s:ff.RightConstant], 3)
157endif
158
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200159let s:with_html = !exists("g:java_ignore_html")
160let s:with_markdown = !exists("g:java_ignore_markdown")
161lockvar s:with_html s:with_markdown
162
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200163" Java module declarations (JLS-17, §7.7).
164"
165" Note that a "module-info" file will be recognised with an arbitrary
166" file extension (or no extension at all) so that more than one such
167" declaration for the same Java module can be maintained for modular
168" testing in a project without attendant confusion for IDEs, with the
169" ".java\=" extension used for a production version and an arbitrary
170" extension used for a testing version.
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200171if fnamemodify(bufname("%"), ":t") =~ '^module-info\>\%(\.class\>\)\@!'
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200172 syn keyword javaModuleStorageClass module transitive
173 syn keyword javaModuleStmt open requires exports opens uses provides
174 syn keyword javaModuleExternal to with
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200175 hi def link javaModuleStorageClass StorageClass
176 hi def link javaModuleStmt Statement
177 hi def link javaModuleExternal Include
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200178
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200179 if !exists("g:java_ignore_javadoc") && (s:with_html || s:with_markdown) && g:main_syntax != 'jsp'
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200180 syn match javaDocProvidesTag contained "@provides\_s\+\S\+" contains=javaDocParam
181 syn match javaDocUsesTag contained "@uses\_s\+\S\+" contains=javaDocParam
182 hi def link javaDocProvidesTag Special
183 hi def link javaDocUsesTag Special
184 endif
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200185endif
186
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200187" Fancy parameterised types (JLS-17, §4.5).
188"
189" Note that false positives may elsewhere occur whenever an identifier
190" is butted against a less-than operator. Cf. (X<Y) and (X < Y).
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200191if exists("g:java_highlight_generics")
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200192 syn keyword javaWildcardBound contained extends super
193
194 " Parameterised types are delegated to javaGenerics (s:ctx.gsg) and
195 " are not matched with javaTypeArgument.
196 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*\>\)\%(\[\]\)*"'
197
198 for s:ctx in [{'dsg': 'javaDimExpr', 'gsg': 'javaGenerics', 'ghg': 'javaGenericsC1', 'csg': 'javaGenericsX', 'c': ''},
199 \ {'dsg': 'javaDimExprX', 'gsg': 'javaGenericsX', 'ghg': 'javaGenericsC2', 'csg': 'javaGenerics', 'c': ' contained'}]
200 " Consider array creation expressions of reifiable types.
201 exec 'syn region ' . s:ctx.dsg . ' contained transparent matchgroup=' . s:ctx.ghg . ' start="\[" end="\]" nextgroup=' . s:ctx.dsg . ' skipwhite skipnl'
202 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'
203 endfor
204
205 unlet s:ctx
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200206 hi def link javaWildcardBound Question
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200207 hi def link javaGenericsC1 Function
208 hi def link javaGenericsC2 Type
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200209endif
210
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200211if exists("g:java_highlight_java_lang_ids")
212 let g:java_highlight_all = 1
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000213endif
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200214if exists("g:java_highlight_all") || exists("g:java_highlight_java") || exists("g:java_highlight_java_lang")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000215 " java.lang.*
Bram Moolenaar63f32602022-06-09 20:45:54 +0100216 "
217 " The keywords of javaR_JavaLang, javaC_JavaLang, javaE_JavaLang,
218 " and javaX_JavaLang are sub-grouped according to the Java version
219 " of their introduction, and sub-group keywords (that is, class
220 " names) are arranged in alphabetical order, so that future newer
221 " keywords can be pre-sorted and appended without disturbing
222 " the current keyword placement. The below _match_es follow suit.
223
Aliaksei Budavei63d68c22024-03-26 20:12:05 +0300224 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 +0000225 syn cluster javaClasses add=javaR_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200226 hi def link javaR_JavaLang javaR_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100227 " Member enumerations:
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300228 exec 'syn match javaC_JavaLang "\%(\<Thread\.\)\@' . s:ff.Peek('7', '') . '<=\<State\>"'
229 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<UnicodeScript\>"'
230 exec 'syn match javaC_JavaLang "\%(\<ProcessBuilder\.Redirect\.\)\@' . s:ff.Peek('24', '') . '<=\<Type\>"'
231 exec 'syn match javaC_JavaLang "\%(\<StackWalker\.\)\@' . s:ff.Peek('12', '') . '<=\<Option\>"'
232 exec 'syn match javaC_JavaLang "\%(\<System\.Logger\.\)\@' . s:ff.Peek('14', '') . '<=\<Level\>"'
Bram Moolenaar63f32602022-06-09 20:45:54 +0100233 " Member classes:
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300234 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<Subset\>"'
235 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<UnicodeBlock\>"'
236 exec 'syn match javaC_JavaLang "\%(\<ProcessBuilder\.\)\@' . s:ff.Peek('15', '') . '<=\<Redirect\>"'
237 exec 'syn match javaC_JavaLang "\%(\<ModuleLayer\.\)\@' . s:ff.Peek('12', '') . '<=\<Controller\>"'
238 exec 'syn match javaC_JavaLang "\%(\<Runtime\.\)\@' . s:ff.Peek('8', '') . '<=\<Version\>"'
239 exec 'syn match javaC_JavaLang "\%(\<System\.\)\@' . s:ff.Peek('7', '') . '<=\<LoggerFinder\>"'
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200240 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 +0100241 syn match javaC_JavaLang "\<System\>" " See javaDebug.
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200242
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200243 if !exists("g:java_highlight_generics")
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200244 " The non-interface parameterised names of java.lang members.
245 exec 'syn match javaC_JavaLang "\%(\<Enum\.\)\@' . s:ff.Peek('5', '') . '<=\<EnumDesc\>"'
246 syn keyword javaC_JavaLang Class InheritableThreadLocal ThreadLocal Enum ClassValue
247 endif
248
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200249 " As of JDK 21, java.lang.Compiler is no more (deprecated in JDK 9).
Aliaksei Budavei63d68c22024-03-26 20:12:05 +0300250 syn keyword javaLangDeprecated Compiler
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000251 syn cluster javaClasses add=javaC_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200252 hi def link javaC_JavaLang javaC_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100253 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 +0000254 syn cluster javaClasses add=javaE_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200255 hi def link javaE_JavaLang javaE_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100256 syn keyword javaX_JavaLang ClassNotFoundException CloneNotSupportedException Exception IllegalAccessException InstantiationException InterruptedException NoSuchMethodException Throwable NoSuchFieldException ReflectiveOperationException
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000257 syn cluster javaClasses add=javaX_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200258 hi def link javaX_JavaLang javaX_Java
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000259
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200260 hi def link javaR_Java javaR_
261 hi def link javaC_Java javaC_
262 hi def link javaE_Java javaE_
263 hi def link javaX_Java javaX_
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200264 hi def link javaX_ javaExceptions
265 hi def link javaR_ javaExceptions
266 hi def link javaE_ javaExceptions
267 hi def link javaC_ javaConstant
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000268
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200269 syn keyword javaLangObject getClass notify notifyAll wait
270
271 " Lower the syntax priority of overridable java.lang.Object method
272 " names for zero-width matching (define g:java_highlight_signature
273 " and see their base declarations for java.lang.Object):
274 syn match javaLangObject "\<clone\>"
275 syn match javaLangObject "\<equals\>"
276 syn match javaLangObject "\<finalize\>"
277 syn match javaLangObject "\<hashCode\>"
278 syn match javaLangObject "\<toString\>"
279 hi def link javaLangObject javaConstant
Bram Moolenaar071d4272004-06-13 20:20:40 +0000280endif
281
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300282if filereadable(expand("<sfile>:p:h") . "/javaid.vim")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000283 source <sfile>:p:h/javaid.vim
284endif
285
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200286if exists("g:java_space_errors")
287 if !exists("g:java_no_trail_space_error")
288 syn match javaSpaceError "\s\+$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000289 endif
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200290 if !exists("g:java_no_tab_space_error")
291 syn match javaSpaceError " \+\t"me=e-1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000292 endif
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200293 hi def link javaSpaceError Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000294endif
295
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200296exec 'syn match javaUserLabel "^\s*\<\K\k*\>\%(\<default\>\)\@' . s:ff.Peek('7', '') . '<!\s*::\@!"he=e-1'
Aliaksei Budavei23079452024-09-19 18:22:58 +0200297
298if s:ff.IsRequestedPreviewFeature(455)
299 syn region javaLabelRegion transparent matchgroup=javaLabel start="\<case\>" matchgroup=NONE end=":\|->" contains=javaBoolean,javaNumber,javaCharacter,javaString,javaConstant,@javaClasses,javaGenerics,javaType,javaLabelDefault,javaLabelVarType,javaLabelWhenClause
300else
301 syn region javaLabelRegion transparent matchgroup=javaLabel start="\<case\>" matchgroup=NONE end=":\|->" contains=javaLabelCastType,javaLabelNumber,javaCharacter,javaString,javaConstant,@javaClasses,javaGenerics,javaLabelDefault,javaLabelVarType,javaLabelWhenClause
302 syn keyword javaLabelCastType contained char byte short int
303 syn match javaLabelNumber contained "\<0\>[lL]\@!"
304 syn match javaLabelNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)\>[lL]\@!"
305 hi def link javaLabelCastType javaType
306 hi def link javaLabelNumber javaNumber
307endif
308
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100309syn region javaLabelRegion transparent matchgroup=javaLabel start="\<default\>\%(\s*\%(:\|->\)\)\@=" matchgroup=NONE end=":\|->" oneline
310" Consider grouped _default_ _case_ labels, i.e.
311" case null, default ->
312" case null: default:
313syn keyword javaLabelDefault contained default
314syn keyword javaLabelVarType contained var
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100315" Allow for the contingency of the enclosing region not being able to
316" _keep_ its _end_, e.g. case ':':.
Aliaksei Budaveid6b4afb2024-06-09 19:39:52 +0300317syn 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 +0000318
Bram Moolenaar071d4272004-06-13 20:20:40 +0000319" Comments
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200320syn keyword javaTodo contained TODO FIXME XXX
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300321
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200322if exists("g:java_comment_strings")
323 syn region javaCommentString contained start=+"+ end=+"+ end=+$+ end=+\*/+me=s-1,he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell
324 syn region javaCommentString contained start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell,javaSpecialError,javaTextBlockError
325 syn region javaComment2String contained start=+"+ end=+$\|"+ contains=javaSpecial,javaSpecialChar,@Spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000326 syn match javaCommentCharacter contained "'\\[^']\{1,6\}'" contains=javaSpecialChar
327 syn match javaCommentCharacter contained "'\\''" contains=javaSpecialChar
328 syn match javaCommentCharacter contained "'[^\\]'"
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300329 syn cluster javaCommentSpecial add=javaCommentString,javaCommentCharacter,javaNumber,javaStrTempl
330 syn cluster javaCommentSpecial2 add=javaComment2String,javaCommentCharacter,javaNumber,javaStrTempl
Bram Moolenaar071d4272004-06-13 20:20:40 +0000331endif
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300332
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200333syn region javaComment matchgroup=javaCommentStart start="/\*" end="\*/" contains=@javaCommentSpecial,javaTodo,javaCommentError,javaSpaceError,@Spell fold
334syn match javaCommentStar contained "^\s*\*[^/]"me=e-1
335syn match javaCommentStar contained "^\s*\*$"
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300336syn match javaLineComment "//.*" contains=@javaCommentSpecial2,javaTodo,javaCommentMarkupTag,javaSpaceError,@Spell
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300337syn match javaCommentMarkupTag contained "@\%(end\|highlight\|link\|replace\|start\)\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
338syn match javaCommentMarkupTagAttr contained "\<region\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200339exec '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 +0300340syn match javaCommentError contained "/\*"me=e-1 display
Bram Moolenaar071d4272004-06-13 20:20:40 +0000341
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200342if !exists("g:java_ignore_javadoc") && (s:with_html || s:with_markdown) && g:main_syntax != 'jsp'
343 " The overridable "html*" and "markdown*" default links must be
344 " defined _before_ the inclusion of the same default links from
345 " "html.vim" and "markdown.vim".
346 if s:with_html || s:with_markdown
347 hi def link htmlComment Special
348 hi def link htmlCommentPart Special
349 hi def link htmlArg Type
350 hi def link htmlString String
351 endif
352
353 if s:with_markdown
354 hi def link markdownCode Special
355 hi def link markdownCodeBlock Special
356 hi def link markdownCodeDelimiter Special
357 hi def link markdownLinkDelimiter Comment
358 endif
359
Bram Moolenaar071d4272004-06-13 20:20:40 +0000360 syntax case ignore
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300361
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200362 " Note that javaDocSeeTag is valid in HTML and Markdown.
363 let s:ff.WithMarkdown = s:ff.RightConstant
364
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300365 " Include HTML syntax coloring for Javadoc comments.
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200366 if s:with_html
367 syntax include @javaHtml syntax/html.vim
368 unlet b:current_syntax
369 endif
370
371 " Include Markdown syntax coloring (v7.2.437) for Javadoc comments.
372 if s:with_markdown
373 try
374 syntax include @javaMarkdown syntax/markdown.vim
375 unlet b:current_syntax
376 let s:ff.WithMarkdown = s:ff.LeftConstant
377 catch /\<E48[45]:/
378 call s:ReportOnce(v:exception)
379 unlockvar s:with_markdown
380 let s:with_markdown = 0
381 lockvar s:with_markdown
382 hi clear markdownCode
383 hi clear markdownCodeBlock
384 hi clear markdownCodeDelimiter
385 hi clear markdownLinkDelimiter
386 endtry
387 endif
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300388
389 " HTML enables spell checking for all text that is not in a syntax
390 " item (:syntax spell toplevel); instead, limit spell checking to
391 " items matchable with syntax groups containing the @Spell cluster.
392 try
393 syntax spell default
394 catch /\<E390:/
395 call s:ReportOnce(v:exception)
396 endtry
Bram Moolenaar5c736222010-01-06 20:54:52 +0100397
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200398 if s:with_markdown
399 syn region javaMarkdownComment start="///" skip="^\s*///.*$" end="^" keepend contains=javaMarkdownCommentTitle,javaMarkdownShortcutLink,@javaMarkdown,@javaDocTags,javaTodo,@Spell nextgroup=javaMarkdownCommentTitle fold
400 syn match javaMarkdownCommentMask contained "^\s*///"
401 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'
402 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'
403 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'
404
405 syn clear markdownId markdownLineStart markdownH1 markdownH2 markdownHeadingRule markdownRule markdownCode markdownCodeBlock markdownIdDeclaration
406 " REDEFINE THE MARKDOWN ITEMS ANCHORED WITH "^", OBSERVING THE
407 " DEFINITION ORDER.
408 syn match markdownLineStart contained "^\s*///\s*[<@]\@!" contains=@markdownBlock,javaMarkdownCommentTitle,javaMarkdownCommentMask nextgroup=@markdownBlock,htmlSpecialChar
409 " See https://spec.commonmark.org/0.31.2/#setext-headings.
410 syn match markdownH1 contained "^\s*/// \{,3}.\+\r\=\n\s*/// \{,3}=\+\s*$" contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink,javaMarkdownCommentMask
411 syn match markdownH2 contained "^\s*/// \{,3}.\+\r\=\n\s*/// \{,3}-\+\s*$" contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink,javaMarkdownCommentMask
412 " See https://spec.commonmark.org/0.31.2/#atx-headings.
413 syn region markdownH1 contained matchgroup=markdownH1Delimiter start=" \{,3}#\s" end="#*\s*$" keepend contains=@markdownInline,markdownAutomaticLink oneline
414 syn region markdownH2 contained matchgroup=markdownH2Delimiter start=" \{,3}##\s" end="#*\s*$" keepend contains=@markdownInline,markdownAutomaticLink oneline
415 syn match markdownHeadingRule contained "^\s*/// \{,3}[=-]\+\s*$" contains=javaMarkdownCommentMask
416 " See https://spec.commonmark.org/0.31.2/#thematic-breaks.
417 syn match markdownRule contained "^\s*/// \{,3}\*\s*\*\%(\s*\*\)\+\s*$" contains=javaMarkdownCommentMask
418 syn match markdownRule contained "^\s*/// \{,3}_\s*_\%(\s*_\)\+\s*$" contains=javaMarkdownCommentMask
419 syn match markdownRule contained "^\s*/// \{,3}-\s*-\%(\s*-\)\+\s*$" contains=javaMarkdownCommentMask
420 " See https://spec.commonmark.org/0.31.2/#indented-code-blocks.
421 syn region markdownCodeBlock contained start="^\s*///\%( \{4,}\|\t\)" end="^\ze\s*///\%(\s*$\| \{,3}\S\)" keepend contains=javaMarkdownCommentMask
422 " See https://spec.commonmark.org/0.31.2/#code-spans.
423 syn region markdownCode contained matchgroup=markdownCodeDelimiter start="\z(`\+\) \=" end=" \=\z1" keepend contains=markdownLineStart,javaMarkdownCommentMask
424 " See https://spec.commonmark.org/0.31.2/#fenced-code-blocks.
425 syn region markdownCodeBlock contained start="^\s*/// \{,3}\z(```\+\)\%(.\{-}[^`]`\)\@!" end="^\s*/// \{,3}\z1`*" keepend contains=javaMarkdownCommentMask
426 syn region markdownCodeBlock contained start="^\s*/// \{,3}\z(\~\~\~\+\)" end="^\s*/// \{,3}\z1\~*" keepend contains=javaMarkdownCommentMask
427 " See https://spec.commonmark.org/0.31.2/#link-reference-definitions.
428 syn region markdownIdDeclaration contained matchgroup=markdownLinkDelimiter start="^\s*/// \{,3\}!\=\[" end="\]:" keepend contains=javaMarkdownCommentMask nextgroup=markdownUrl oneline skipwhite
429 " See https://spec.commonmark.org/0.31.2/#link-label.
430 syn region markdownId contained matchgroup=markdownIdDelimiter start="\[\%([\t ]\]\)\@!" end="\]" contains=javaMarkdownSkipBrackets,javaMarkdownCommentMask
431 " Note that escaped brackets can be unbalanced.
432 syn match javaMarkdownSkipBrackets contained transparent "\\\[\|\\\]"
433 " See https://spec.commonmark.org/0.31.2/#shortcut-reference-link.
434 syn region javaMarkdownShortcutLink contained matchgroup=markdownLinkTextDelimiter start="!\=\[^\@!\%(\_[^][]*\%(\[\_[^][]*\]\_[^][]*\)*]\%([[(]\)\@!\)\@=" end="\]\%([[(]\)\@!" contains=@markdownInline,markdownLineStart,javaMarkdownSkipBrackets,javaMarkdownCommentMask nextgroup=markdownLink,markdownId skipwhite
435
436 for s:name in ['markdownFootnoteDefinition', 'markdownFootnote']
437 if hlexists(s:name)
438 exec 'syn clear ' . s:name
439 endif
440 endfor
441
442 unlet s:name
443
444 " COMBAK: Footnotes are recognised by "markdown.vim", but are not
445 " in CommonMark. See https://pandoc.org/MANUAL.html#footnotes.
446""""syn match markdownFootnoteDefinition contained "^\s*///\s*\[^[^\]]\+\]:" contains=javaMarkdownCommentMask
447
448 hi def link javaMarkdownComment Comment
449 hi def link javaMarkdownCommentMask javaMarkdownComment
450 hi def link javaMarkdownCommentTitle SpecialComment
451 hi def link javaMarkdownShortcutLink htmlLink
452 endif
453
454 if s:with_html
455 syn region javaDocComment start="/\*\*" end="\*/" keepend contains=javaCommentTitle,@javaHtml,@javaDocTags,javaTodo,javaCommentError,javaSpaceError,@Spell fold
456 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'
457 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
458 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
459 hi def link javaDocComment Comment
460 hi def link javaCommentTitle SpecialComment
461 endif
462
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200463 " The members of javaDocTags are sub-grouped according to the Java
464 " version of their introduction, and sub-group members in turn are
465 " arranged in alphabetical order, so that future newer members can
466 " be pre-sorted and appended without disturbing the current member
467 " placement.
468 " Since they only have significance in javaCommentTitle, neither
469 " javaDocSummaryTag nor javaDocReturnTitleTag are defined.
470 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
471
472 " Anticipate non-standard inline tags in {@return} and {@summary}.
473 syn region javaTitleSkipBlock contained transparent start="{\%(@\%(return\|summary\)\>\)\@!" end="}"
474 syn match javaDocDocRootTag contained "{@docRoot}"
475 syn match javaDocInheritDocTag contained "{@inheritDoc}"
476 syn region javaIndexSkipBlock contained transparent start="{\%(@index\>\)\@!" end="}" contains=javaIndexSkipBlock,javaDocIndexTag
477 syn region javaDocIndexTag contained start="{@index\>" end="}" contains=javaDocIndexTag,javaIndexSkipBlock
478 syn region javaLinkSkipBlock contained transparent start="{\%(@link\>\)\@!" end="}" contains=javaLinkSkipBlock,javaDocLinkTag
479 syn region javaDocLinkTag contained start="{@link\>" end="}" contains=javaDocLinkTag,javaLinkSkipBlock
480 syn region javaLinkplainSkipBlock contained transparent start="{\%(@linkplain\>\)\@!" end="}" contains=javaLinkplainSkipBlock,javaDocLinkplainTag
481 syn region javaDocLinkplainTag contained start="{@linkplain\>" end="}" contains=javaDocLinkplainTag,javaLinkplainSkipBlock
482 syn region javaLiteralSkipBlock contained transparent start="{\%(@literal\>\)\@!" end="}" contains=javaLiteralSkipBlock,javaDocLiteralTag
483 syn region javaDocLiteralTag contained start="{@literal\>" end="}" contains=javaDocLiteralTag,javaLiteralSkipBlock
484 syn region javaSystemPropertySkipBlock contained transparent start="{\%(@systemProperty\>\)\@!" end="}" contains=javaSystemPropertySkipBlock,javaDocSystemPropertyTag
485 syn region javaDocSystemPropertyTag contained start="{@systemProperty\>" end="}" contains=javaDocSystemPropertyTag,javaSystemPropertySkipBlock
486 syn region javaValueSkipBlock contained transparent start="{\%(@value\>\)\@!" end="}" contains=javaValueSkipBlock,javaDocValueTag
487 syn region javaDocValueTag contained start="{@value\>" end="}" contains=javaDocValueTag,javaValueSkipBlock
488
489 syn match javaDocParam contained "\s\zs\S\+"
490 syn match javaDocExceptionTag contained "@exception\s\+\S\+" contains=javaDocParam
491 syn match javaDocParamTag contained "@param\s\+\S\+" contains=javaDocParam
492 syn match javaDocSinceTag contained "@since\s\+\S\+" contains=javaDocParam
493 syn match javaDocThrowsTag contained "@throws\s\+\S\+" contains=javaDocParam
494 syn match javaDocSpecTag contained "@spec\_s\+\S\+\ze\_s\+\S\+" contains=javaDocParam
495
496 syn match javaDocAuthorTag contained "@author\>"
497 syn match javaDocDeprecatedTag contained "@deprecated\>"
498 syn match javaDocHiddenTag contained "@hidden\>"
499 syn match javaDocReturnTag contained "@return\>"
500 syn match javaDocSerialTag contained "@serial\>"
501 syn match javaDocSerialDataTag contained "@serialData\>"
502 syn match javaDocSerialFieldTag contained "@serialField\>"
503 syn match javaDocVersionTag contained "@version\>"
504
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200505 syn match javaDocSeeTag contained "@see\>\s*" nextgroup=javaDocSeeTag1,javaDocSeeTag2,javaDocSeeTag3,javaDocSeeTag4,javaDocSeeTagStar,javaDocSeeTagSlash skipwhite skipempty
506
507 if s:with_html
508 syn match javaDocSeeTagStar contained "^\s*\*\+\%(\s*{\=@\|/\|$\)\@!" nextgroup=javaDocSeeTag1,javaDocSeeTag2,javaDocSeeTag3,javaDocSeeTag4 skipwhite skipempty
509 hi def link javaDocSeeTagStar javaDocComment
510 endif
511
512 if s:with_markdown
513 syn match javaDocSeeTagSlash contained "^\s*///\%(\s*{\=@\|$\)\@!" nextgroup=javaDocSeeTag1,javaDocSeeTag2,javaDocSeeTag3,javaDocSeeTag4 skipwhite skipempty
514 hi def link javaDocSeeTagSlash javaMarkdownComment
515 endif
516
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200517 syn match javaDocSeeTag1 contained @"\_[^"]\+"@
518 syn match javaDocSeeTag2 contained @<a\s\+\_.\{-}</a>@ contains=@javaHtml extend
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200519 exec 'syn match javaDocSeeTag3 contained @[' . s:ff.WithMarkdown('[', '') . '"< \t]\@!\%(\k\|[/.]\)*\%(##\=\k\+\%((\_[^)]*)\)\=\)\=@ nextgroup=javaDocSeeTag3Label skipwhite skipempty'
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200520 syn match javaDocSeeTag3Label contained @\k\%(\k\+\s*\)*$@
521
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200522 " COMBAK: No support for type javaDocSeeTag2 in Markdown.
523""if s:with_markdown
524"" syn match javaDocSeeTag4 contained @\[.\+\]\s\=\%(\[.\+\]\|(.\+)\)@ contains=@javaMarkdown extend
525"" hi def link javaDocSeeTag4 Special
526""endif
527
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300528 syn region javaCodeSkipBlock contained transparent start="{\%(@code\>\)\@!" end="}" contains=javaCodeSkipBlock,javaDocCodeTag
529 syn region javaDocCodeTag contained start="{@code\>" end="}" contains=javaDocCodeTag,javaCodeSkipBlock
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200530
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200531 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 +0300532 syn region javaSnippetSkipBlock contained transparent start="{\%(@snippet\>\)\@!" end="}" contains=javaSnippetSkipBlock,javaDocSnippetTag,javaCommentMarkupTag
533 syn region javaDocSnippetTag contained start="{@snippet\>" end="}" contains=javaDocSnippetTag,javaSnippetSkipBlock,javaDocSnippetTagAttr,javaCommentMarkupTag
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300534
Bram Moolenaar071d4272004-06-13 20:20:40 +0000535 syntax case match
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200536 hi def link javaDocParam Function
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200537
538 hi def link javaDocAuthorTag Special
539 hi def link javaDocCodeTag Special
540 hi def link javaDocDeprecatedTag Special
541 hi def link javaDocDocRootTag Special
542 hi def link javaDocExceptionTag Special
543 hi def link javaDocHiddenTag Special
544 hi def link javaDocIndexTag Special
545 hi def link javaDocInheritDocTag Special
546 hi def link javaDocLinkTag Special
547 hi def link javaDocLinkplainTag Special
548 hi def link javaDocLiteralTag Special
549 hi def link javaDocParamTag Special
550 hi def link javaDocReturnTag Special
551 hi def link javaDocSeeTag Special
552 hi def link javaDocSeeTag1 String
553 hi def link javaDocSeeTag2 Special
554 hi def link javaDocSeeTag3 Function
555 hi def link javaDocSerialTag Special
556 hi def link javaDocSerialDataTag Special
557 hi def link javaDocSerialFieldTag Special
558 hi def link javaDocSinceTag Special
559 hi def link javaDocSnippetTag Special
560 hi def link javaDocSpecTag Special
561 hi def link javaDocSystemPropertyTag Special
562 hi def link javaDocThrowsTag Special
563 hi def link javaDocValueTag Special
564 hi def link javaDocVersionTag Special
Bram Moolenaar071d4272004-06-13 20:20:40 +0000565endif
566
567" match the special comment /**/
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200568syn match javaComment "/\*\*/"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000569
570" Strings and constants
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200571syn match javaSpecialError contained "\\."
Bram Moolenaar071d4272004-06-13 20:20:40 +0000572syn match javaSpecialCharError contained "[^']"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300573" Escape Sequences (JLS-17, §3.10.7):
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200574syn match javaSpecialChar contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000575syn region javaString start=+"+ end=+"+ end=+$+ contains=javaSpecialChar,javaSpecialError,@Spell
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300576syn region javaString start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecialChar,javaSpecialError,javaTextBlockError,@Spell
577syn match javaTextBlockError +"""\s*"""+
Aliaksei Budavei8556e232024-08-27 22:32:13 +0200578
579if s:ff.IsRequestedPreviewFeature(430)
580 syn region javaStrTemplEmbExp contained matchgroup=javaStrTempl start="\\{" end="}" contains=TOP
581 exec 'syn region javaStrTempl start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,@Spell'
582 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'
583 hi def link javaStrTempl Macro
584endif
585
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200586syn match javaCharacter "'[^']*'" contains=javaSpecialChar,javaSpecialCharError
587syn match javaCharacter "'\\''" contains=javaSpecialChar
588syn match javaCharacter "'[^\\]'"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300589" Integer literals (JLS-17, §3.10.1):
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200590syn keyword javaNumber 0 0l 0L
591syn match javaNumber "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300592" Decimal floating-point literals (JLS-17, §3.10.2):
593" Against "\<\d\+\>\.":
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200594syn match javaNumber "\<\d\%(_*\d\)*\."
595syn match javaNumber "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
596syn match javaNumber "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
597syn match javaNumber "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300598" Hexadecimal floating-point literals (JLS-17, §3.10.2):
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200599syn match javaNumber "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000600
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300601" Unicode characters
602syn match javaSpecial "\\u\x\x\x\x"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000603
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200604" Method declarations (JLS-17, §8.4.3, §8.4.4, §9.4).
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200605if exists("g:java_highlight_functions")
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200606 syn cluster javaFuncParams contains=javaAnnotation,@javaClasses,javaGenerics,javaType,javaVarArg,javaComment,javaLineComment
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200607
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200608 if exists("g:java_highlight_signature")
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200609 syn cluster javaFuncParams add=javaParamModifier
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200610 hi def link javaFuncDefStart javaFuncDef
611 else
612 syn cluster javaFuncParams add=javaScopeDecl,javaConceptKind,javaStorageClass,javaExternal
613 endif
614
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200615 if g:java_highlight_functions =~# '^indent[1-8]\=$'
616 let s:last = g:java_highlight_functions[-1 :]
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300617 let s:indent = s:last != 't' ? repeat("\x20", s:last) : "\t"
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300618 " Try to not match other type members, initialiser blocks, enum
619 " constants (JLS-17, §8.9.1), and constructors (JLS-17, §8.1.7):
620 " at any _conventional_ indentation, skip over all fields with
621 " "[^=]*", all records with "\<record\s", and let the "*Skip*"
622 " definitions take care of constructor declarations and enum
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200623 " constants (with no support for @Foo(value = "bar")). Also,
624 " reject inlined declarations with "[^{]" for signature.
625 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 +0300626 " As long as package-private constructors cannot be matched with
627 " javaFuncDef, do not look with javaConstructorSkipDeclarator for
628 " them.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200629 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'
630 " With a zero-width span for signature applicable on demand to
631 " javaFuncDef, make related adjustments:
632 " (1) Claim all enum constants of a line as a unit.
633 exec 'syn match javaEnumSkipConstant contained transparent /^' . s:indent . '\%(\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)*\K\k*\s*\%((.*)\)\=\s*[,;({]\s*\)\+/ contains=@javaEnumConstants'
634 " (2) Define a syntax group for top level enumerations and tell
635 " apart their constants from method declarations.
636 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'
637 " (3) Define a base variant of javaParenT without using @javaTop
638 " in order to not include javaFuncDef.
639 syn region javaParenE transparent matchgroup=javaParen start="(" end=")" contains=@javaEnumConstants,javaInParen
640 syn region javaParenE transparent matchgroup=javaParen start="\[" end="\]" contains=@javaEnumConstants
641 syn cluster javaEnumConstants contains=TOP,javaTopEnumDeclaration,javaFuncDef,javaParenT
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300642 unlet s:indent s:last
Bram Moolenaar071d4272004-06-13 20:20:40 +0000643 else
Aliaksei Budavei40524742024-04-14 19:57:00 +0300644 " This is the "style" variant (:help ft-java-syntax).
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200645
646 " Match arbitrarily indented camelCasedName method declarations.
647 " Match: [@ɐ] [abstract] [<α, β>] Τʬ[<γ>][[][]] μʭʭ(/* ... */);
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200648 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 +0000649 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000650endif
651
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200652if exists("g:java_highlight_debug")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000653 " Strings and constants
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300654 syn match javaDebugSpecial contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200655 syn region javaDebugString contained start=+"+ end=+"+ contains=javaDebugSpecial
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300656 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 +0200657
658 if s:ff.IsRequestedPreviewFeature(430)
659 " The highlight groups of java{StrTempl,Debug{,Paren,StrTempl}}\,
660 " share one colour by default. Do not conflate unrelated parens.
661 syn region javaDebugStrTemplEmbExp contained matchgroup=javaDebugStrTempl start="\\{" end="}" contains=javaComment,javaLineComment,javaDebug\%(Paren\)\@!.*
662 exec 'syn region javaDebugStrTempl contained start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ contains=javaDebugStrTemplEmbExp,javaDebugSpecial'
663 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'
664 hi def link javaDebugStrTempl Macro
665 endif
666
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300667 syn match javaDebugTextBlockError contained +"""\s*"""+
Bram Moolenaar071d4272004-06-13 20:20:40 +0000668 syn match javaDebugCharacter contained "'[^\\]'"
669 syn match javaDebugSpecialCharacter contained "'\\.'"
670 syn match javaDebugSpecialCharacter contained "'\\''"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300671 syn keyword javaDebugNumber contained 0 0l 0L
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300672 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\."
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300673 syn match javaDebugNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
674 syn match javaDebugNumber contained "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
675 syn match javaDebugNumber contained "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
676 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
677 syn match javaDebugNumber contained "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000678 syn keyword javaDebugBoolean contained true false
679 syn keyword javaDebugType contained null this super
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200680 syn region javaDebugParen contained start=+(+ end=+)+ contains=javaDebug.*,javaDebugParen
Bram Moolenaar071d4272004-06-13 20:20:40 +0000681
Aliaksei Budavei40524742024-04-14 19:57:00 +0300682 " To make this work, define the highlighting for these groups.
683 syn match javaDebug "\<System\.\%(out\|err\)\.print\%(ln\)\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
684" FIXME: What API does "p" belong to?
685" syn match javaDebug "\<p\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
686 syn match javaDebug "\<\K\k*\.printStackTrace\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
687" FIXME: What API do "trace*" belong to?
688" syn match javaDebug "\<trace[SL]\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
Bram Moolenaar071d4272004-06-13 20:20:40 +0000689
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200690 hi def link javaDebug Debug
691 hi def link javaDebugString DebugString
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200692 hi def link javaDebugTextBlockError Error
693 hi def link javaDebugType DebugType
694 hi def link javaDebugBoolean DebugBoolean
695 hi def link javaDebugNumber Debug
696 hi def link javaDebugSpecial DebugSpecial
697 hi def link javaDebugSpecialCharacter DebugSpecial
698 hi def link javaDebugCharacter DebugString
699 hi def link javaDebugParen Debug
Bram Moolenaar071d4272004-06-13 20:20:40 +0000700
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200701 hi def link DebugString String
702 hi def link DebugSpecial Special
703 hi def link DebugBoolean Boolean
704 hi def link DebugType Type
Bram Moolenaar071d4272004-06-13 20:20:40 +0000705endif
706
Aliaksei Budavei94c5d8a2024-06-19 20:10:47 +0200707" Try not to fold top-level-type bodies under assumption that there is
708" but one such body.
709exec 'syn region javaBlock transparent start="\%(^\|^\S[^:]\+\)\@' . s:ff.Peek('120', '') . '<!{" end="}" fold'
710
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200711if exists("g:java_mark_braces_in_parens_as_errors")
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300712 syn match javaInParen contained "[{}]"
713 hi def link javaInParen javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000714endif
715
716" catch errors caused by wrong parenthesis
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200717syn region javaParenT transparent matchgroup=javaParen start="(" end=")" contains=@javaTop,javaInParen,javaParenT1
718syn region javaParenT1 contained transparent matchgroup=javaParen1 start="(" end=")" contains=@javaTop,javaInParen,javaParenT2
719syn region javaParenT2 contained transparent matchgroup=javaParen2 start="(" end=")" contains=@javaTop,javaInParen,javaParenT
720syn match javaParenError ")"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000721" catch errors caused by wrong square parenthesis
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200722syn region javaParenT transparent matchgroup=javaParen start="\[" end="\]" contains=@javaTop,javaParenT1
723syn region javaParenT1 contained transparent matchgroup=javaParen1 start="\[" end="\]" contains=@javaTop,javaParenT2
724syn region javaParenT2 contained transparent matchgroup=javaParen2 start="\[" end="\]" contains=@javaTop,javaParenT
725syn match javaParenError "\]"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000726
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200727" Lambda expressions (JLS-17, §15.27) and method reference expressions
728" (JLS-17, §15.13).
729if exists("g:java_highlight_functions")
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200730 syn match javaMethodRef ":::\@!"
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200731
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200732 if exists("g:java_highlight_signature")
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200733 let s:ff.LambdaDef = s:ff.LeftConstant
734 else
735 let s:ff.LambdaDef = s:ff.RightConstant
736 endif
737
Aliaksei Budavei40524742024-04-14 19:57:00 +0300738 " Make ()-matching definitions after the parenthesis error catcher.
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300739 "
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200740 " Note that here and elsewhere a single-line token is used for \z,
741 " with other tokens repeated as necessary, to overcome the lack of
742 " support for multi-line matching with \z.
743 "
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300744 " Match: ([@A [@B ...] final] var a[, var b, ...]) ->
745 " | ([@A [@B ...] final] T[<α>][[][]] a[, T b, ...]) ->
746 " There is no recognition of expressions interspersed with comments
747 " or of expressions whose parameterised parameter types are written
748 " across multiple lines.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200749 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 +0300750 " Match: () ->
751 " | (a[, b, ...]) ->
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200752 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 +0300753 " Match: a ->
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200754 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 +0300755
756 syn keyword javaParamModifier contained final
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300757 syn keyword javaLambdaVarType contained var
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200758 hi def link javaParamModifier javaConceptKind
759 hi def link javaLambdaVarType javaOperator
760 hi def link javaLambdaDef javaFuncDef
761 hi def link javaLambdaDefStart javaFuncDef
762 hi def link javaMethodRef javaFuncDef
763 hi def link javaFuncDef Function
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100764endif
765
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300766" The @javaTop cluster comprises non-contained Java syntax groups.
767" Note that the syntax file "aidl.vim" relies on its availability.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200768syn cluster javaTop contains=TOP,javaTopEnumDeclaration
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300769
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200770if !exists("g:java_minlines")
771 let g:java_minlines = 10
Bram Moolenaar071d4272004-06-13 20:20:40 +0000772endif
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300773
774" Note that variations of a /*/ balanced comment, e.g., /*/*/, /*//*/,
775" /* /*/, /* /*/, etc., may have their rightmost /*/ part accepted
776" as a comment start by ':syntax sync ccomment'; consider alternatives
777" to make synchronisation start further towards file's beginning by
778" bumping up g:java_minlines or issuing ':syntax sync fromstart' or
779" preferring &foldmethod set to 'syntax'.
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200780exec "syn sync ccomment javaComment minlines=" . g:java_minlines
Bram Moolenaar071d4272004-06-13 20:20:40 +0000781
782" The default highlighting.
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200783hi def link javaVarArg Function
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200784hi def link javaBranch Conditional
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200785hi def link javaConditional Conditional
786hi def link javaRepeat Repeat
787hi def link javaExceptions Exception
788hi def link javaAssert Statement
789hi def link javaStorageClass StorageClass
790hi def link javaMethodDecl javaStorageClass
791hi def link javaClassDecl javaStorageClass
792hi def link javaScopeDecl javaStorageClass
Aliaksei Budavei5e95c8f2024-09-15 19:53:50 +0200793hi def link javaConceptKind javaStorageClass
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200794
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200795hi def link javaBoolean Boolean
796hi def link javaSpecial Special
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200797hi def link javaSpecialError Error
798hi def link javaSpecialCharError Error
799hi def link javaString String
800hi def link javaCharacter Character
801hi def link javaSpecialChar SpecialChar
802hi def link javaNumber Number
803hi def link javaError Error
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200804hi def link javaError2 javaError
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300805hi def link javaTextBlockError Error
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200806hi def link javaParenError javaError
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200807hi def link javaStatement Statement
808hi def link javaOperator Operator
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200809hi def link javaConstant Constant
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200810hi def link javaTypedef Typedef
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200811hi def link javaTodo Todo
812hi def link javaAnnotation PreProc
Aliaksei Budavei902b7662024-06-13 18:30:09 +0300813hi def link javaAnnotationStart javaAnnotation
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200814hi def link javaType Type
815hi def link javaExternal Include
Bram Moolenaar071d4272004-06-13 20:20:40 +0000816
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200817hi def link javaUserLabel Label
818hi def link javaUserLabelRef javaUserLabel
819hi def link javaLabel Label
820hi def link javaLabelDefault javaLabel
821hi def link javaLabelVarType javaOperator
Bram Moolenaar071d4272004-06-13 20:20:40 +0000822
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200823hi def link javaComment Comment
824hi def link javaCommentStar javaComment
825hi def link javaLineComment Comment
826hi def link javaCommentMarkupTagAttr javaHtmlArg
827hi def link javaCommentString javaString
828hi def link javaComment2String javaString
829hi def link javaCommentCharacter javaCharacter
830hi def link javaCommentError javaError
831hi def link javaCommentStart javaComment
832
833hi def link javaHtmlArg Type
834hi def link javaHtmlString String
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200835
Bram Moolenaar071d4272004-06-13 20:20:40 +0000836let b:current_syntax = "java"
837
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200838if g:main_syntax == 'java'
839 unlet g:main_syntax
Bram Moolenaar071d4272004-06-13 20:20:40 +0000840endif
841
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200842let b:spell_options = "contained"
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +0200843let &cpo = s:cpo_save
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200844unlet s:cpo_save s:ff s:with_html s:with_markdown
Bram Moolenaar071d4272004-06-13 20:20:40 +0000845
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300846" See ":help vim9-mix".
847if !has("vim9script")
848 finish
849endif
850
Aliaksei Budavei2750b832024-08-22 21:09:32 +0200851if exists("g:java_foldtext_show_first_or_second_line")
852 def! s:LazyPrefix(prefix: string, dashes: string, count: number): string
853 return empty(prefix)
854 ? printf('+-%s%3d lines: ', dashes, count)
855 : prefix
856 enddef
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300857
Aliaksei Budavei2750b832024-08-22 21:09:32 +0200858 def! s:JavaSyntaxFoldTextExpr(): string
859 # Piggyback on NGETTEXT.
860 const summary: string = foldtext()
861 return getline(v:foldstart) !~ '/\*\+\s*$'
862 ? summary
863 : LazyPrefix(matchstr(summary, '^+-\+\s*\d\+\s.\{-1,}:\s'),
864 v:folddashes,
865 (v:foldend - v:foldstart + 1)) ..
866 getline(v:foldstart + 1)
867 enddef
868
869 setlocal foldtext=s:JavaSyntaxFoldTextExpr()
870 delfunction! g:JavaSyntaxFoldTextExpr
871endif
Aliaksei Budavei85f054a2024-09-30 19:40:04 +0200872" vim: fdm=syntax sw=2 ts=8 noet sta