blob: 800faa40a0418920594b2d05eab3b8a69b69f0b2 [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 Budavei50423ab2024-09-20 21:37:46 +02006" Last Change: 2024 Sep 19
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 Budavei77b87c32024-07-31 22:15:16 +0200159" Java module declarations (JLS-17, §7.7).
160"
161" Note that a "module-info" file will be recognised with an arbitrary
162" file extension (or no extension at all) so that more than one such
163" declaration for the same Java module can be maintained for modular
164" testing in a project without attendant confusion for IDEs, with the
165" ".java\=" extension used for a production version and an arbitrary
166" extension used for a testing version.
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200167if fnamemodify(bufname("%"), ":t") =~ '^module-info\>\%(\.class\>\)\@!'
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200168 syn keyword javaModuleStorageClass module transitive
169 syn keyword javaModuleStmt open requires exports opens uses provides
170 syn keyword javaModuleExternal to with
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200171 hi def link javaModuleStorageClass StorageClass
172 hi def link javaModuleStmt Statement
173 hi def link javaModuleExternal Include
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200174
175 if !exists("g:java_ignore_javadoc") && g:main_syntax != 'jsp'
176 syn match javaDocProvidesTag contained "@provides\_s\+\S\+" contains=javaDocParam
177 syn match javaDocUsesTag contained "@uses\_s\+\S\+" contains=javaDocParam
178 hi def link javaDocProvidesTag Special
179 hi def link javaDocUsesTag Special
180 endif
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200181endif
182
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200183" Fancy parameterised types (JLS-17, §4.5).
184"
185" Note that false positives may elsewhere occur whenever an identifier
186" is butted against a less-than operator. Cf. (X<Y) and (X < Y).
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200187if exists("g:java_highlight_generics")
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200188 syn keyword javaWildcardBound contained extends super
189
190 " Parameterised types are delegated to javaGenerics (s:ctx.gsg) and
191 " are not matched with javaTypeArgument.
192 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*\>\)\%(\[\]\)*"'
193
194 for s:ctx in [{'dsg': 'javaDimExpr', 'gsg': 'javaGenerics', 'ghg': 'javaGenericsC1', 'csg': 'javaGenericsX', 'c': ''},
195 \ {'dsg': 'javaDimExprX', 'gsg': 'javaGenericsX', 'ghg': 'javaGenericsC2', 'csg': 'javaGenerics', 'c': ' contained'}]
196 " Consider array creation expressions of reifiable types.
197 exec 'syn region ' . s:ctx.dsg . ' contained transparent matchgroup=' . s:ctx.ghg . ' start="\[" end="\]" nextgroup=' . s:ctx.dsg . ' skipwhite skipnl'
198 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'
199 endfor
200
201 unlet s:ctx
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200202 hi def link javaWildcardBound Question
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200203 hi def link javaGenericsC1 Function
204 hi def link javaGenericsC2 Type
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200205endif
206
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200207if exists("g:java_highlight_java_lang_ids")
208 let g:java_highlight_all = 1
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000209endif
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200210if exists("g:java_highlight_all") || exists("g:java_highlight_java") || exists("g:java_highlight_java_lang")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000211 " java.lang.*
Bram Moolenaar63f32602022-06-09 20:45:54 +0100212 "
213 " The keywords of javaR_JavaLang, javaC_JavaLang, javaE_JavaLang,
214 " and javaX_JavaLang are sub-grouped according to the Java version
215 " of their introduction, and sub-group keywords (that is, class
216 " names) are arranged in alphabetical order, so that future newer
217 " keywords can be pre-sorted and appended without disturbing
218 " the current keyword placement. The below _match_es follow suit.
219
Aliaksei Budavei63d68c22024-03-26 20:12:05 +0300220 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 +0000221 syn cluster javaClasses add=javaR_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200222 hi def link javaR_JavaLang javaR_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100223 " Member enumerations:
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300224 exec 'syn match javaC_JavaLang "\%(\<Thread\.\)\@' . s:ff.Peek('7', '') . '<=\<State\>"'
225 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<UnicodeScript\>"'
226 exec 'syn match javaC_JavaLang "\%(\<ProcessBuilder\.Redirect\.\)\@' . s:ff.Peek('24', '') . '<=\<Type\>"'
227 exec 'syn match javaC_JavaLang "\%(\<StackWalker\.\)\@' . s:ff.Peek('12', '') . '<=\<Option\>"'
228 exec 'syn match javaC_JavaLang "\%(\<System\.Logger\.\)\@' . s:ff.Peek('14', '') . '<=\<Level\>"'
Bram Moolenaar63f32602022-06-09 20:45:54 +0100229 " Member classes:
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300230 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<Subset\>"'
231 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<UnicodeBlock\>"'
232 exec 'syn match javaC_JavaLang "\%(\<ProcessBuilder\.\)\@' . s:ff.Peek('15', '') . '<=\<Redirect\>"'
233 exec 'syn match javaC_JavaLang "\%(\<ModuleLayer\.\)\@' . s:ff.Peek('12', '') . '<=\<Controller\>"'
234 exec 'syn match javaC_JavaLang "\%(\<Runtime\.\)\@' . s:ff.Peek('8', '') . '<=\<Version\>"'
235 exec 'syn match javaC_JavaLang "\%(\<System\.\)\@' . s:ff.Peek('7', '') . '<=\<LoggerFinder\>"'
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200236 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 +0100237 syn match javaC_JavaLang "\<System\>" " See javaDebug.
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200238
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200239 if !exists("g:java_highlight_generics")
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200240 " The non-interface parameterised names of java.lang members.
241 exec 'syn match javaC_JavaLang "\%(\<Enum\.\)\@' . s:ff.Peek('5', '') . '<=\<EnumDesc\>"'
242 syn keyword javaC_JavaLang Class InheritableThreadLocal ThreadLocal Enum ClassValue
243 endif
244
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200245 " As of JDK 21, java.lang.Compiler is no more (deprecated in JDK 9).
Aliaksei Budavei63d68c22024-03-26 20:12:05 +0300246 syn keyword javaLangDeprecated Compiler
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000247 syn cluster javaClasses add=javaC_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200248 hi def link javaC_JavaLang javaC_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100249 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 +0000250 syn cluster javaClasses add=javaE_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200251 hi def link javaE_JavaLang javaE_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100252 syn keyword javaX_JavaLang ClassNotFoundException CloneNotSupportedException Exception IllegalAccessException InstantiationException InterruptedException NoSuchMethodException Throwable NoSuchFieldException ReflectiveOperationException
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000253 syn cluster javaClasses add=javaX_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200254 hi def link javaX_JavaLang javaX_Java
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000255
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200256 hi def link javaR_Java javaR_
257 hi def link javaC_Java javaC_
258 hi def link javaE_Java javaE_
259 hi def link javaX_Java javaX_
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200260 hi def link javaX_ javaExceptions
261 hi def link javaR_ javaExceptions
262 hi def link javaE_ javaExceptions
263 hi def link javaC_ javaConstant
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000264
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200265 syn keyword javaLangObject getClass notify notifyAll wait
266
267 " Lower the syntax priority of overridable java.lang.Object method
268 " names for zero-width matching (define g:java_highlight_signature
269 " and see their base declarations for java.lang.Object):
270 syn match javaLangObject "\<clone\>"
271 syn match javaLangObject "\<equals\>"
272 syn match javaLangObject "\<finalize\>"
273 syn match javaLangObject "\<hashCode\>"
274 syn match javaLangObject "\<toString\>"
275 hi def link javaLangObject javaConstant
Bram Moolenaar071d4272004-06-13 20:20:40 +0000276endif
277
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300278if filereadable(expand("<sfile>:p:h") . "/javaid.vim")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000279 source <sfile>:p:h/javaid.vim
280endif
281
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200282if exists("g:java_space_errors")
283 if !exists("g:java_no_trail_space_error")
284 syn match javaSpaceError "\s\+$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000285 endif
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200286 if !exists("g:java_no_tab_space_error")
287 syn match javaSpaceError " \+\t"me=e-1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000288 endif
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200289 hi def link javaSpaceError Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000290endif
291
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200292exec 'syn match javaUserLabel "^\s*\<\K\k*\>\%(\<default\>\)\@' . s:ff.Peek('7', '') . '<!\s*::\@!"he=e-1'
Aliaksei Budavei23079452024-09-19 18:22:58 +0200293
294if s:ff.IsRequestedPreviewFeature(455)
295 syn region javaLabelRegion transparent matchgroup=javaLabel start="\<case\>" matchgroup=NONE end=":\|->" contains=javaBoolean,javaNumber,javaCharacter,javaString,javaConstant,@javaClasses,javaGenerics,javaType,javaLabelDefault,javaLabelVarType,javaLabelWhenClause
296else
297 syn region javaLabelRegion transparent matchgroup=javaLabel start="\<case\>" matchgroup=NONE end=":\|->" contains=javaLabelCastType,javaLabelNumber,javaCharacter,javaString,javaConstant,@javaClasses,javaGenerics,javaLabelDefault,javaLabelVarType,javaLabelWhenClause
298 syn keyword javaLabelCastType contained char byte short int
299 syn match javaLabelNumber contained "\<0\>[lL]\@!"
300 syn match javaLabelNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)\>[lL]\@!"
301 hi def link javaLabelCastType javaType
302 hi def link javaLabelNumber javaNumber
303endif
304
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100305syn region javaLabelRegion transparent matchgroup=javaLabel start="\<default\>\%(\s*\%(:\|->\)\)\@=" matchgroup=NONE end=":\|->" oneline
306" Consider grouped _default_ _case_ labels, i.e.
307" case null, default ->
308" case null: default:
309syn keyword javaLabelDefault contained default
310syn keyword javaLabelVarType contained var
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100311" Allow for the contingency of the enclosing region not being able to
312" _keep_ its _end_, e.g. case ':':.
Aliaksei Budaveid6b4afb2024-06-09 19:39:52 +0300313syn 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 +0000314
Bram Moolenaar071d4272004-06-13 20:20:40 +0000315" Comments
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200316syn keyword javaTodo contained TODO FIXME XXX
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300317
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200318if exists("g:java_comment_strings")
319 syn region javaCommentString contained start=+"+ end=+"+ end=+$+ end=+\*/+me=s-1,he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell
320 syn region javaCommentString contained start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell,javaSpecialError,javaTextBlockError
321 syn region javaComment2String contained start=+"+ end=+$\|"+ contains=javaSpecial,javaSpecialChar,@Spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000322 syn match javaCommentCharacter contained "'\\[^']\{1,6\}'" contains=javaSpecialChar
323 syn match javaCommentCharacter contained "'\\''" contains=javaSpecialChar
324 syn match javaCommentCharacter contained "'[^\\]'"
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300325 syn cluster javaCommentSpecial add=javaCommentString,javaCommentCharacter,javaNumber,javaStrTempl
326 syn cluster javaCommentSpecial2 add=javaComment2String,javaCommentCharacter,javaNumber,javaStrTempl
Bram Moolenaar071d4272004-06-13 20:20:40 +0000327endif
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300328
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200329syn region javaComment matchgroup=javaCommentStart start="/\*" end="\*/" contains=@javaCommentSpecial,javaTodo,javaCommentError,javaSpaceError,@Spell fold
330syn match javaCommentStar contained "^\s*\*[^/]"me=e-1
331syn match javaCommentStar contained "^\s*\*$"
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300332syn match javaLineComment "//.*" contains=@javaCommentSpecial2,javaTodo,javaCommentMarkupTag,javaSpaceError,@Spell
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300333syn match javaCommentMarkupTag contained "@\%(end\|highlight\|link\|replace\|start\)\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
334syn match javaCommentMarkupTagAttr contained "\<region\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200335exec '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 +0300336syn match javaCommentError contained "/\*"me=e-1 display
Bram Moolenaar071d4272004-06-13 20:20:40 +0000337
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200338if !exists("g:java_ignore_javadoc") && g:main_syntax != 'jsp'
Aliaksei Budavei3749dff2024-07-31 22:13:25 +0200339 " The overridable "html*" default links must be defined _before_ the
340 " inclusion of the same default links from "html.vim".
341 hi def link htmlComment Special
342 hi def link htmlCommentPart Special
343 hi def link htmlArg Type
344 hi def link htmlString String
Bram Moolenaar071d4272004-06-13 20:20:40 +0000345 syntax case ignore
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300346
347 " Include HTML syntax coloring for Javadoc comments.
Bram Moolenaar63f32602022-06-09 20:45:54 +0100348 syntax include @javaHtml syntax/html.vim
Bram Moolenaar071d4272004-06-13 20:20:40 +0000349 unlet b:current_syntax
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300350
351 " HTML enables spell checking for all text that is not in a syntax
352 " item (:syntax spell toplevel); instead, limit spell checking to
353 " items matchable with syntax groups containing the @Spell cluster.
354 try
355 syntax spell default
356 catch /\<E390:/
357 call s:ReportOnce(v:exception)
358 endtry
Bram Moolenaar5c736222010-01-06 20:54:52 +0100359
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200360 syn region javaDocComment start="/\*\*" end="\*/" keepend contains=javaCommentTitle,@javaHtml,@javaDocTags,javaTodo,javaCommentError,javaSpaceError,@Spell fold
361 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'
362 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
363 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
364 " The members of javaDocTags are sub-grouped according to the Java
365 " version of their introduction, and sub-group members in turn are
366 " arranged in alphabetical order, so that future newer members can
367 " be pre-sorted and appended without disturbing the current member
368 " placement.
369 " Since they only have significance in javaCommentTitle, neither
370 " javaDocSummaryTag nor javaDocReturnTitleTag are defined.
371 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
372
373 " Anticipate non-standard inline tags in {@return} and {@summary}.
374 syn region javaTitleSkipBlock contained transparent start="{\%(@\%(return\|summary\)\>\)\@!" end="}"
375 syn match javaDocDocRootTag contained "{@docRoot}"
376 syn match javaDocInheritDocTag contained "{@inheritDoc}"
377 syn region javaIndexSkipBlock contained transparent start="{\%(@index\>\)\@!" end="}" contains=javaIndexSkipBlock,javaDocIndexTag
378 syn region javaDocIndexTag contained start="{@index\>" end="}" contains=javaDocIndexTag,javaIndexSkipBlock
379 syn region javaLinkSkipBlock contained transparent start="{\%(@link\>\)\@!" end="}" contains=javaLinkSkipBlock,javaDocLinkTag
380 syn region javaDocLinkTag contained start="{@link\>" end="}" contains=javaDocLinkTag,javaLinkSkipBlock
381 syn region javaLinkplainSkipBlock contained transparent start="{\%(@linkplain\>\)\@!" end="}" contains=javaLinkplainSkipBlock,javaDocLinkplainTag
382 syn region javaDocLinkplainTag contained start="{@linkplain\>" end="}" contains=javaDocLinkplainTag,javaLinkplainSkipBlock
383 syn region javaLiteralSkipBlock contained transparent start="{\%(@literal\>\)\@!" end="}" contains=javaLiteralSkipBlock,javaDocLiteralTag
384 syn region javaDocLiteralTag contained start="{@literal\>" end="}" contains=javaDocLiteralTag,javaLiteralSkipBlock
385 syn region javaSystemPropertySkipBlock contained transparent start="{\%(@systemProperty\>\)\@!" end="}" contains=javaSystemPropertySkipBlock,javaDocSystemPropertyTag
386 syn region javaDocSystemPropertyTag contained start="{@systemProperty\>" end="}" contains=javaDocSystemPropertyTag,javaSystemPropertySkipBlock
387 syn region javaValueSkipBlock contained transparent start="{\%(@value\>\)\@!" end="}" contains=javaValueSkipBlock,javaDocValueTag
388 syn region javaDocValueTag contained start="{@value\>" end="}" contains=javaDocValueTag,javaValueSkipBlock
389
390 syn match javaDocParam contained "\s\zs\S\+"
391 syn match javaDocExceptionTag contained "@exception\s\+\S\+" contains=javaDocParam
392 syn match javaDocParamTag contained "@param\s\+\S\+" contains=javaDocParam
393 syn match javaDocSinceTag contained "@since\s\+\S\+" contains=javaDocParam
394 syn match javaDocThrowsTag contained "@throws\s\+\S\+" contains=javaDocParam
395 syn match javaDocSpecTag contained "@spec\_s\+\S\+\ze\_s\+\S\+" contains=javaDocParam
396
397 syn match javaDocAuthorTag contained "@author\>"
398 syn match javaDocDeprecatedTag contained "@deprecated\>"
399 syn match javaDocHiddenTag contained "@hidden\>"
400 syn match javaDocReturnTag contained "@return\>"
401 syn match javaDocSerialTag contained "@serial\>"
402 syn match javaDocSerialDataTag contained "@serialData\>"
403 syn match javaDocSerialFieldTag contained "@serialField\>"
404 syn match javaDocVersionTag contained "@version\>"
405
406 syn match javaDocSeeTag contained "@see\>" nextgroup=javaDocSeeTag1,javaDocSeeTag2,javaDocSeeTag3,javaDocSeeTagStar skipwhite skipempty
407 syn match javaDocSeeTagStar contained "^\s*\*\+\%(\s*{\=@\|/\|$\)\@!" nextgroup=javaDocSeeTag1,javaDocSeeTag2,javaDocSeeTag3 skipwhite skipempty
408 syn match javaDocSeeTag1 contained @"\_[^"]\+"@
409 syn match javaDocSeeTag2 contained @<a\s\+\_.\{-}</a>@ contains=@javaHtml extend
410 syn match javaDocSeeTag3 contained @["< \t]\@!\%(\k\|[/.]\)*\%(##\=\k\+\%((\_[^)]*)\)\=\)\=@ nextgroup=javaDocSeeTag3Label skipwhite skipempty
411 syn match javaDocSeeTag3Label contained @\k\%(\k\+\s*\)*$@
412
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300413 syn region javaCodeSkipBlock contained transparent start="{\%(@code\>\)\@!" end="}" contains=javaCodeSkipBlock,javaDocCodeTag
414 syn region javaDocCodeTag contained start="{@code\>" end="}" contains=javaDocCodeTag,javaCodeSkipBlock
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200415
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200416 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 +0300417 syn region javaSnippetSkipBlock contained transparent start="{\%(@snippet\>\)\@!" end="}" contains=javaSnippetSkipBlock,javaDocSnippetTag,javaCommentMarkupTag
418 syn region javaDocSnippetTag contained start="{@snippet\>" end="}" contains=javaDocSnippetTag,javaSnippetSkipBlock,javaDocSnippetTagAttr,javaCommentMarkupTag
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300419
Bram Moolenaar071d4272004-06-13 20:20:40 +0000420 syntax case match
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200421 hi def link javaDocComment Comment
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200422 hi def link javaDocSeeTagStar javaDocComment
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200423 hi def link javaCommentTitle SpecialComment
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200424 hi def link javaDocParam Function
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200425
426 hi def link javaDocAuthorTag Special
427 hi def link javaDocCodeTag Special
428 hi def link javaDocDeprecatedTag Special
429 hi def link javaDocDocRootTag Special
430 hi def link javaDocExceptionTag Special
431 hi def link javaDocHiddenTag Special
432 hi def link javaDocIndexTag Special
433 hi def link javaDocInheritDocTag Special
434 hi def link javaDocLinkTag Special
435 hi def link javaDocLinkplainTag Special
436 hi def link javaDocLiteralTag Special
437 hi def link javaDocParamTag Special
438 hi def link javaDocReturnTag Special
439 hi def link javaDocSeeTag Special
440 hi def link javaDocSeeTag1 String
441 hi def link javaDocSeeTag2 Special
442 hi def link javaDocSeeTag3 Function
443 hi def link javaDocSerialTag Special
444 hi def link javaDocSerialDataTag Special
445 hi def link javaDocSerialFieldTag Special
446 hi def link javaDocSinceTag Special
447 hi def link javaDocSnippetTag Special
448 hi def link javaDocSpecTag Special
449 hi def link javaDocSystemPropertyTag Special
450 hi def link javaDocThrowsTag Special
451 hi def link javaDocValueTag Special
452 hi def link javaDocVersionTag Special
Bram Moolenaar071d4272004-06-13 20:20:40 +0000453endif
454
455" match the special comment /**/
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200456syn match javaComment "/\*\*/"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000457
458" Strings and constants
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200459syn match javaSpecialError contained "\\."
Bram Moolenaar071d4272004-06-13 20:20:40 +0000460syn match javaSpecialCharError contained "[^']"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300461" Escape Sequences (JLS-17, §3.10.7):
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200462syn match javaSpecialChar contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000463syn region javaString start=+"+ end=+"+ end=+$+ contains=javaSpecialChar,javaSpecialError,@Spell
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300464syn region javaString start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecialChar,javaSpecialError,javaTextBlockError,@Spell
465syn match javaTextBlockError +"""\s*"""+
Aliaksei Budavei8556e232024-08-27 22:32:13 +0200466
467if s:ff.IsRequestedPreviewFeature(430)
468 syn region javaStrTemplEmbExp contained matchgroup=javaStrTempl start="\\{" end="}" contains=TOP
469 exec 'syn region javaStrTempl start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,@Spell'
470 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'
471 hi def link javaStrTempl Macro
472endif
473
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200474syn match javaCharacter "'[^']*'" contains=javaSpecialChar,javaSpecialCharError
475syn match javaCharacter "'\\''" contains=javaSpecialChar
476syn match javaCharacter "'[^\\]'"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300477" Integer literals (JLS-17, §3.10.1):
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200478syn keyword javaNumber 0 0l 0L
479syn match javaNumber "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300480" Decimal floating-point literals (JLS-17, §3.10.2):
481" Against "\<\d\+\>\.":
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200482syn match javaNumber "\<\d\%(_*\d\)*\."
483syn match javaNumber "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
484syn match javaNumber "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
485syn match javaNumber "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300486" Hexadecimal floating-point literals (JLS-17, §3.10.2):
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200487syn match javaNumber "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000488
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300489" Unicode characters
490syn match javaSpecial "\\u\x\x\x\x"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000491
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200492" Method declarations (JLS-17, §8.4.3, §8.4.4, §9.4).
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200493if exists("g:java_highlight_functions")
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200494 syn cluster javaFuncParams contains=javaAnnotation,@javaClasses,javaGenerics,javaType,javaVarArg,javaComment,javaLineComment
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200495
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200496 if exists("g:java_highlight_signature")
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200497 syn cluster javaFuncParams add=javaParamModifier
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200498 hi def link javaFuncDefStart javaFuncDef
499 else
500 syn cluster javaFuncParams add=javaScopeDecl,javaConceptKind,javaStorageClass,javaExternal
501 endif
502
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200503 if g:java_highlight_functions =~# '^indent[1-8]\=$'
504 let s:last = g:java_highlight_functions[-1 :]
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300505 let s:indent = s:last != 't' ? repeat("\x20", s:last) : "\t"
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300506 " Try to not match other type members, initialiser blocks, enum
507 " constants (JLS-17, §8.9.1), and constructors (JLS-17, §8.1.7):
508 " at any _conventional_ indentation, skip over all fields with
509 " "[^=]*", all records with "\<record\s", and let the "*Skip*"
510 " definitions take care of constructor declarations and enum
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200511 " constants (with no support for @Foo(value = "bar")). Also,
512 " reject inlined declarations with "[^{]" for signature.
513 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 +0300514 " As long as package-private constructors cannot be matched with
515 " javaFuncDef, do not look with javaConstructorSkipDeclarator for
516 " them.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200517 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'
518 " With a zero-width span for signature applicable on demand to
519 " javaFuncDef, make related adjustments:
520 " (1) Claim all enum constants of a line as a unit.
521 exec 'syn match javaEnumSkipConstant contained transparent /^' . s:indent . '\%(\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)*\K\k*\s*\%((.*)\)\=\s*[,;({]\s*\)\+/ contains=@javaEnumConstants'
522 " (2) Define a syntax group for top level enumerations and tell
523 " apart their constants from method declarations.
524 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'
525 " (3) Define a base variant of javaParenT without using @javaTop
526 " in order to not include javaFuncDef.
527 syn region javaParenE transparent matchgroup=javaParen start="(" end=")" contains=@javaEnumConstants,javaInParen
528 syn region javaParenE transparent matchgroup=javaParen start="\[" end="\]" contains=@javaEnumConstants
529 syn cluster javaEnumConstants contains=TOP,javaTopEnumDeclaration,javaFuncDef,javaParenT
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300530 unlet s:indent s:last
Bram Moolenaar071d4272004-06-13 20:20:40 +0000531 else
Aliaksei Budavei40524742024-04-14 19:57:00 +0300532 " This is the "style" variant (:help ft-java-syntax).
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200533
534 " Match arbitrarily indented camelCasedName method declarations.
535 " Match: [@ɐ] [abstract] [<α, β>] Τʬ[<γ>][[][]] μʭʭ(/* ... */);
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200536 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 +0000537 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000538endif
539
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200540if exists("g:java_highlight_debug")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000541 " Strings and constants
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300542 syn match javaDebugSpecial contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200543 syn region javaDebugString contained start=+"+ end=+"+ contains=javaDebugSpecial
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300544 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 +0200545
546 if s:ff.IsRequestedPreviewFeature(430)
547 " The highlight groups of java{StrTempl,Debug{,Paren,StrTempl}}\,
548 " share one colour by default. Do not conflate unrelated parens.
549 syn region javaDebugStrTemplEmbExp contained matchgroup=javaDebugStrTempl start="\\{" end="}" contains=javaComment,javaLineComment,javaDebug\%(Paren\)\@!.*
550 exec 'syn region javaDebugStrTempl contained start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ contains=javaDebugStrTemplEmbExp,javaDebugSpecial'
551 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'
552 hi def link javaDebugStrTempl Macro
553 endif
554
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300555 syn match javaDebugTextBlockError contained +"""\s*"""+
Bram Moolenaar071d4272004-06-13 20:20:40 +0000556 syn match javaDebugCharacter contained "'[^\\]'"
557 syn match javaDebugSpecialCharacter contained "'\\.'"
558 syn match javaDebugSpecialCharacter contained "'\\''"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300559 syn keyword javaDebugNumber contained 0 0l 0L
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300560 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\."
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300561 syn match javaDebugNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
562 syn match javaDebugNumber contained "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
563 syn match javaDebugNumber contained "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
564 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
565 syn match javaDebugNumber contained "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000566 syn keyword javaDebugBoolean contained true false
567 syn keyword javaDebugType contained null this super
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200568 syn region javaDebugParen contained start=+(+ end=+)+ contains=javaDebug.*,javaDebugParen
Bram Moolenaar071d4272004-06-13 20:20:40 +0000569
Aliaksei Budavei40524742024-04-14 19:57:00 +0300570 " To make this work, define the highlighting for these groups.
571 syn match javaDebug "\<System\.\%(out\|err\)\.print\%(ln\)\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
572" FIXME: What API does "p" belong to?
573" syn match javaDebug "\<p\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
574 syn match javaDebug "\<\K\k*\.printStackTrace\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
575" FIXME: What API do "trace*" belong to?
576" syn match javaDebug "\<trace[SL]\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
Bram Moolenaar071d4272004-06-13 20:20:40 +0000577
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200578 hi def link javaDebug Debug
579 hi def link javaDebugString DebugString
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200580 hi def link javaDebugTextBlockError Error
581 hi def link javaDebugType DebugType
582 hi def link javaDebugBoolean DebugBoolean
583 hi def link javaDebugNumber Debug
584 hi def link javaDebugSpecial DebugSpecial
585 hi def link javaDebugSpecialCharacter DebugSpecial
586 hi def link javaDebugCharacter DebugString
587 hi def link javaDebugParen Debug
Bram Moolenaar071d4272004-06-13 20:20:40 +0000588
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200589 hi def link DebugString String
590 hi def link DebugSpecial Special
591 hi def link DebugBoolean Boolean
592 hi def link DebugType Type
Bram Moolenaar071d4272004-06-13 20:20:40 +0000593endif
594
Aliaksei Budavei94c5d8a2024-06-19 20:10:47 +0200595" Try not to fold top-level-type bodies under assumption that there is
596" but one such body.
597exec 'syn region javaBlock transparent start="\%(^\|^\S[^:]\+\)\@' . s:ff.Peek('120', '') . '<!{" end="}" fold'
598
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200599if exists("g:java_mark_braces_in_parens_as_errors")
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300600 syn match javaInParen contained "[{}]"
601 hi def link javaInParen javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000602endif
603
604" catch errors caused by wrong parenthesis
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200605syn region javaParenT transparent matchgroup=javaParen start="(" end=")" contains=@javaTop,javaInParen,javaParenT1
606syn region javaParenT1 contained transparent matchgroup=javaParen1 start="(" end=")" contains=@javaTop,javaInParen,javaParenT2
607syn region javaParenT2 contained transparent matchgroup=javaParen2 start="(" end=")" contains=@javaTop,javaInParen,javaParenT
608syn match javaParenError ")"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000609" catch errors caused by wrong square parenthesis
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200610syn region javaParenT transparent matchgroup=javaParen start="\[" end="\]" contains=@javaTop,javaParenT1
611syn region javaParenT1 contained transparent matchgroup=javaParen1 start="\[" end="\]" contains=@javaTop,javaParenT2
612syn region javaParenT2 contained transparent matchgroup=javaParen2 start="\[" end="\]" contains=@javaTop,javaParenT
613syn match javaParenError "\]"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000614
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200615" Lambda expressions (JLS-17, §15.27) and method reference expressions
616" (JLS-17, §15.13).
617if exists("g:java_highlight_functions")
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200618 syn match javaMethodRef ":::\@!"
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200619
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200620 if exists("g:java_highlight_signature")
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200621 let s:ff.LambdaDef = s:ff.LeftConstant
622 else
623 let s:ff.LambdaDef = s:ff.RightConstant
624 endif
625
Aliaksei Budavei40524742024-04-14 19:57:00 +0300626 " Make ()-matching definitions after the parenthesis error catcher.
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300627 "
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200628 " Note that here and elsewhere a single-line token is used for \z,
629 " with other tokens repeated as necessary, to overcome the lack of
630 " support for multi-line matching with \z.
631 "
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300632 " Match: ([@A [@B ...] final] var a[, var b, ...]) ->
633 " | ([@A [@B ...] final] T[<α>][[][]] a[, T b, ...]) ->
634 " There is no recognition of expressions interspersed with comments
635 " or of expressions whose parameterised parameter types are written
636 " across multiple lines.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200637 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 +0300638 " Match: () ->
639 " | (a[, b, ...]) ->
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200640 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 +0300641 " Match: a ->
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200642 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 +0300643
644 syn keyword javaParamModifier contained final
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300645 syn keyword javaLambdaVarType contained var
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200646 hi def link javaParamModifier javaConceptKind
647 hi def link javaLambdaVarType javaOperator
648 hi def link javaLambdaDef javaFuncDef
649 hi def link javaLambdaDefStart javaFuncDef
650 hi def link javaMethodRef javaFuncDef
651 hi def link javaFuncDef Function
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100652endif
653
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300654" The @javaTop cluster comprises non-contained Java syntax groups.
655" Note that the syntax file "aidl.vim" relies on its availability.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200656syn cluster javaTop contains=TOP,javaTopEnumDeclaration
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300657
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200658if !exists("g:java_minlines")
659 let g:java_minlines = 10
Bram Moolenaar071d4272004-06-13 20:20:40 +0000660endif
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300661
662" Note that variations of a /*/ balanced comment, e.g., /*/*/, /*//*/,
663" /* /*/, /* /*/, etc., may have their rightmost /*/ part accepted
664" as a comment start by ':syntax sync ccomment'; consider alternatives
665" to make synchronisation start further towards file's beginning by
666" bumping up g:java_minlines or issuing ':syntax sync fromstart' or
667" preferring &foldmethod set to 'syntax'.
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200668exec "syn sync ccomment javaComment minlines=" . g:java_minlines
Bram Moolenaar071d4272004-06-13 20:20:40 +0000669
670" The default highlighting.
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200671hi def link javaVarArg Function
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200672hi def link javaBranch Conditional
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200673hi def link javaConditional Conditional
674hi def link javaRepeat Repeat
675hi def link javaExceptions Exception
676hi def link javaAssert Statement
677hi def link javaStorageClass StorageClass
678hi def link javaMethodDecl javaStorageClass
679hi def link javaClassDecl javaStorageClass
680hi def link javaScopeDecl javaStorageClass
Aliaksei Budavei5e95c8f2024-09-15 19:53:50 +0200681hi def link javaConceptKind javaStorageClass
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200682
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200683hi def link javaBoolean Boolean
684hi def link javaSpecial Special
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200685hi def link javaSpecialError Error
686hi def link javaSpecialCharError Error
687hi def link javaString String
688hi def link javaCharacter Character
689hi def link javaSpecialChar SpecialChar
690hi def link javaNumber Number
691hi def link javaError Error
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200692hi def link javaError2 javaError
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300693hi def link javaTextBlockError Error
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200694hi def link javaParenError javaError
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200695hi def link javaStatement Statement
696hi def link javaOperator Operator
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200697hi def link javaConstant Constant
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200698hi def link javaTypedef Typedef
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200699hi def link javaTodo Todo
700hi def link javaAnnotation PreProc
Aliaksei Budavei902b7662024-06-13 18:30:09 +0300701hi def link javaAnnotationStart javaAnnotation
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200702hi def link javaType Type
703hi def link javaExternal Include
Bram Moolenaar071d4272004-06-13 20:20:40 +0000704
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200705hi def link javaUserLabel Label
706hi def link javaUserLabelRef javaUserLabel
707hi def link javaLabel Label
708hi def link javaLabelDefault javaLabel
709hi def link javaLabelVarType javaOperator
Bram Moolenaar071d4272004-06-13 20:20:40 +0000710
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200711hi def link javaComment Comment
712hi def link javaCommentStar javaComment
713hi def link javaLineComment Comment
714hi def link javaCommentMarkupTagAttr javaHtmlArg
715hi def link javaCommentString javaString
716hi def link javaComment2String javaString
717hi def link javaCommentCharacter javaCharacter
718hi def link javaCommentError javaError
719hi def link javaCommentStart javaComment
720
721hi def link javaHtmlArg Type
722hi def link javaHtmlString String
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200723
Bram Moolenaar071d4272004-06-13 20:20:40 +0000724let b:current_syntax = "java"
725
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200726if g:main_syntax == 'java'
727 unlet g:main_syntax
Bram Moolenaar071d4272004-06-13 20:20:40 +0000728endif
729
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200730let b:spell_options = "contained"
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +0200731let &cpo = s:cpo_save
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200732unlet s:ff s:cpo_save
Bram Moolenaar071d4272004-06-13 20:20:40 +0000733
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300734" See ":help vim9-mix".
735if !has("vim9script")
736 finish
737endif
738
Aliaksei Budavei2750b832024-08-22 21:09:32 +0200739if exists("g:java_foldtext_show_first_or_second_line")
740 def! s:LazyPrefix(prefix: string, dashes: string, count: number): string
741 return empty(prefix)
742 ? printf('+-%s%3d lines: ', dashes, count)
743 : prefix
744 enddef
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300745
Aliaksei Budavei2750b832024-08-22 21:09:32 +0200746 def! s:JavaSyntaxFoldTextExpr(): string
747 # Piggyback on NGETTEXT.
748 const summary: string = foldtext()
749 return getline(v:foldstart) !~ '/\*\+\s*$'
750 ? summary
751 : LazyPrefix(matchstr(summary, '^+-\+\s*\d\+\s.\{-1,}:\s'),
752 v:folddashes,
753 (v:foldend - v:foldstart + 1)) ..
754 getline(v:foldstart + 1)
755 enddef
756
757 setlocal foldtext=s:JavaSyntaxFoldTextExpr()
758 delfunction! g:JavaSyntaxFoldTextExpr
759endif
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300760" vim: sw=2 ts=8 noet sta