blob: bbef266c34eac3490cdae46c535d269fa9485ccb [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 Budavei23079452024-09-19 18:22:58 +02006" Last Change: 2024 Sep 18
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 Budavei9ecf02c2024-02-28 21:30:22 +010095" Since the yield statement, which could take a parenthesised operand,
96" and _qualified_ yield methods get along within the switch block
97" (JLS-17, §3.8), it seems futile to make a region definition for this
98" block; instead look for the _yield_ word alone, and if found,
99" backtrack (arbitrarily) 80 bytes, at most, on the matched line and,
100" if necessary, on the line before that (h: \@<=), trying to match
101" neither a method reference nor a qualified method invocation.
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300102try
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200103 syn match javaOperator "\%(\%(::\|\.\)[[:space:]\n]*\)\@80<!\<yield\>"
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300104 let s:ff.Peek = s:ff.LeftConstant
105catch /\<E59:/
106 call s:ReportOnce(v:exception)
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200107 syn match javaOperator "\%(\%(::\|\.\)[[:space:]\n]*\)\@<!\<yield\>"
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300108 let s:ff.Peek = s:ff.RightConstant
109endtry
110
Bram Moolenaar071d4272004-06-13 20:20:40 +0000111syn keyword javaType boolean char byte short int long float double
112syn keyword javaType void
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100113syn keyword javaStatement return
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200114syn keyword javaStorageClass static synchronized transient volatile strictfp
Bram Moolenaar071d4272004-06-13 20:20:40 +0000115syn keyword javaExceptions throw try catch finally
116syn keyword javaAssert assert
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200117syn keyword javaMethodDecl throws
118" Differentiate a "MyClass.class" literal from the keyword "class".
Bram Moolenaar071d4272004-06-13 20:20:40 +0000119syn match javaTypedef "\.\s*\<class\>"ms=s+1
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200120syn keyword javaClassDecl enum extends implements interface
121syn match javaClassDecl "\<permits\>\%(\s*(\)\@!"
122syn match javaClassDecl "\<record\>\%(\s*(\)\@!"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000123syn match javaClassDecl "^class\>"
124syn match javaClassDecl "[^.]\s*\<class\>"ms=s+1
Aliaksei Budavei40524742024-04-14 19:57:00 +0300125syn match javaAnnotation "@\%(\K\k*\.\)*\K\k*\>"
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300126syn 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 +0200127syn match javaClassDecl "@interface\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000128syn keyword javaBranch break continue nextgroup=javaUserLabelRef skipwhite
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200129syn match javaUserLabelRef contained "\k\+"
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000130syn match javaVarArg "\.\.\."
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200131syn keyword javaScopeDecl public protected private
132syn keyword javaConceptKind abstract final
133syn match javaConceptKind "\<non-sealed\>"
134syn match javaConceptKind "\<sealed\>\%(\s*(\)\@!"
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100135syn match javaConceptKind "\<default\>\%(\s*\%(:\|->\)\)\@!"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000136
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300137if !(v:version < 704)
138 " Request the new regexp engine for [:upper:] and [:lower:].
139 let [s:ff.Engine, s:ff.UpperCase, s:ff.LowerCase] = repeat([s:ff.LeftConstant], 3)
140else
141 " XXX: \C\<[^a-z0-9]\k*\> rejects "type", but matches "τύπος".
142 " XXX: \C\<[^A-Z0-9]\k*\> rejects "Method", but matches "Μέθοδος".
143 let [s:ff.Engine, s:ff.UpperCase, s:ff.LowerCase] = repeat([s:ff.RightConstant], 3)
144endif
Bram Moolenaar63f32602022-06-09 20:45:54 +0100145
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200146if exists("g:java_highlight_signature")
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200147 let [s:ff.PeekTo, s:ff.PeekFrom, s:ff.GroupArgs] = repeat([s:ff.LeftConstant], 3)
148else
149 let [s:ff.PeekTo, s:ff.PeekFrom, s:ff.GroupArgs] = repeat([s:ff.RightConstant], 3)
150endif
151
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200152" Java module declarations (JLS-17, §7.7).
153"
154" Note that a "module-info" file will be recognised with an arbitrary
155" file extension (or no extension at all) so that more than one such
156" declaration for the same Java module can be maintained for modular
157" testing in a project without attendant confusion for IDEs, with the
158" ".java\=" extension used for a production version and an arbitrary
159" extension used for a testing version.
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200160if fnamemodify(bufname("%"), ":t") =~ '^module-info\>\%(\.class\>\)\@!'
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200161 syn keyword javaModuleStorageClass module transitive
162 syn keyword javaModuleStmt open requires exports opens uses provides
163 syn keyword javaModuleExternal to with
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200164 hi def link javaModuleStorageClass StorageClass
165 hi def link javaModuleStmt Statement
166 hi def link javaModuleExternal Include
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200167
168 if !exists("g:java_ignore_javadoc") && g:main_syntax != 'jsp'
169 syn match javaDocProvidesTag contained "@provides\_s\+\S\+" contains=javaDocParam
170 syn match javaDocUsesTag contained "@uses\_s\+\S\+" contains=javaDocParam
171 hi def link javaDocProvidesTag Special
172 hi def link javaDocUsesTag Special
173 endif
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200174endif
175
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200176" Fancy parameterised types (JLS-17, §4.5).
177"
178" Note that false positives may elsewhere occur whenever an identifier
179" is butted against a less-than operator. Cf. (X<Y) and (X < Y).
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200180if exists("g:java_highlight_generics")
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200181 syn keyword javaWildcardBound contained extends super
182
183 " Parameterised types are delegated to javaGenerics (s:ctx.gsg) and
184 " are not matched with javaTypeArgument.
185 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*\>\)\%(\[\]\)*"'
186
187 for s:ctx in [{'dsg': 'javaDimExpr', 'gsg': 'javaGenerics', 'ghg': 'javaGenericsC1', 'csg': 'javaGenericsX', 'c': ''},
188 \ {'dsg': 'javaDimExprX', 'gsg': 'javaGenericsX', 'ghg': 'javaGenericsC2', 'csg': 'javaGenerics', 'c': ' contained'}]
189 " Consider array creation expressions of reifiable types.
190 exec 'syn region ' . s:ctx.dsg . ' contained transparent matchgroup=' . s:ctx.ghg . ' start="\[" end="\]" nextgroup=' . s:ctx.dsg . ' skipwhite skipnl'
191 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'
192 endfor
193
194 unlet s:ctx
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200195 hi def link javaWildcardBound Question
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200196 hi def link javaGenericsC1 Function
197 hi def link javaGenericsC2 Type
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200198endif
199
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200200if exists("g:java_highlight_java_lang_ids")
201 let g:java_highlight_all = 1
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000202endif
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200203if exists("g:java_highlight_all") || exists("g:java_highlight_java") || exists("g:java_highlight_java_lang")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000204 " java.lang.*
Bram Moolenaar63f32602022-06-09 20:45:54 +0100205 "
206 " The keywords of javaR_JavaLang, javaC_JavaLang, javaE_JavaLang,
207 " and javaX_JavaLang are sub-grouped according to the Java version
208 " of their introduction, and sub-group keywords (that is, class
209 " names) are arranged in alphabetical order, so that future newer
210 " keywords can be pre-sorted and appended without disturbing
211 " the current keyword placement. The below _match_es follow suit.
212
Aliaksei Budavei63d68c22024-03-26 20:12:05 +0300213 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 +0000214 syn cluster javaClasses add=javaR_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200215 hi def link javaR_JavaLang javaR_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100216 " Member enumerations:
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300217 exec 'syn match javaC_JavaLang "\%(\<Thread\.\)\@' . s:ff.Peek('7', '') . '<=\<State\>"'
218 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<UnicodeScript\>"'
219 exec 'syn match javaC_JavaLang "\%(\<ProcessBuilder\.Redirect\.\)\@' . s:ff.Peek('24', '') . '<=\<Type\>"'
220 exec 'syn match javaC_JavaLang "\%(\<StackWalker\.\)\@' . s:ff.Peek('12', '') . '<=\<Option\>"'
221 exec 'syn match javaC_JavaLang "\%(\<System\.Logger\.\)\@' . s:ff.Peek('14', '') . '<=\<Level\>"'
Bram Moolenaar63f32602022-06-09 20:45:54 +0100222 " Member classes:
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300223 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<Subset\>"'
224 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<UnicodeBlock\>"'
225 exec 'syn match javaC_JavaLang "\%(\<ProcessBuilder\.\)\@' . s:ff.Peek('15', '') . '<=\<Redirect\>"'
226 exec 'syn match javaC_JavaLang "\%(\<ModuleLayer\.\)\@' . s:ff.Peek('12', '') . '<=\<Controller\>"'
227 exec 'syn match javaC_JavaLang "\%(\<Runtime\.\)\@' . s:ff.Peek('8', '') . '<=\<Version\>"'
228 exec 'syn match javaC_JavaLang "\%(\<System\.\)\@' . s:ff.Peek('7', '') . '<=\<LoggerFinder\>"'
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200229 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 +0100230 syn match javaC_JavaLang "\<System\>" " See javaDebug.
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200231
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200232 if !exists("g:java_highlight_generics")
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200233 " The non-interface parameterised names of java.lang members.
234 exec 'syn match javaC_JavaLang "\%(\<Enum\.\)\@' . s:ff.Peek('5', '') . '<=\<EnumDesc\>"'
235 syn keyword javaC_JavaLang Class InheritableThreadLocal ThreadLocal Enum ClassValue
236 endif
237
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200238 " As of JDK 21, java.lang.Compiler is no more (deprecated in JDK 9).
Aliaksei Budavei63d68c22024-03-26 20:12:05 +0300239 syn keyword javaLangDeprecated Compiler
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000240 syn cluster javaClasses add=javaC_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200241 hi def link javaC_JavaLang javaC_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100242 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 +0000243 syn cluster javaClasses add=javaE_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200244 hi def link javaE_JavaLang javaE_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100245 syn keyword javaX_JavaLang ClassNotFoundException CloneNotSupportedException Exception IllegalAccessException InstantiationException InterruptedException NoSuchMethodException Throwable NoSuchFieldException ReflectiveOperationException
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000246 syn cluster javaClasses add=javaX_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200247 hi def link javaX_JavaLang javaX_Java
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000248
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200249 hi def link javaR_Java javaR_
250 hi def link javaC_Java javaC_
251 hi def link javaE_Java javaE_
252 hi def link javaX_Java javaX_
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200253 hi def link javaX_ javaExceptions
254 hi def link javaR_ javaExceptions
255 hi def link javaE_ javaExceptions
256 hi def link javaC_ javaConstant
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000257
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200258 syn keyword javaLangObject getClass notify notifyAll wait
259
260 " Lower the syntax priority of overridable java.lang.Object method
261 " names for zero-width matching (define g:java_highlight_signature
262 " and see their base declarations for java.lang.Object):
263 syn match javaLangObject "\<clone\>"
264 syn match javaLangObject "\<equals\>"
265 syn match javaLangObject "\<finalize\>"
266 syn match javaLangObject "\<hashCode\>"
267 syn match javaLangObject "\<toString\>"
268 hi def link javaLangObject javaConstant
Bram Moolenaar071d4272004-06-13 20:20:40 +0000269endif
270
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300271if filereadable(expand("<sfile>:p:h") . "/javaid.vim")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000272 source <sfile>:p:h/javaid.vim
273endif
274
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200275if exists("g:java_space_errors")
276 if !exists("g:java_no_trail_space_error")
277 syn match javaSpaceError "\s\+$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000278 endif
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200279 if !exists("g:java_no_tab_space_error")
280 syn match javaSpaceError " \+\t"me=e-1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000281 endif
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200282 hi def link javaSpaceError Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000283endif
284
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200285exec 'syn match javaUserLabel "^\s*\<\K\k*\>\%(\<default\>\)\@' . s:ff.Peek('7', '') . '<!\s*::\@!"he=e-1'
Aliaksei Budavei23079452024-09-19 18:22:58 +0200286
287if s:ff.IsRequestedPreviewFeature(455)
288 syn region javaLabelRegion transparent matchgroup=javaLabel start="\<case\>" matchgroup=NONE end=":\|->" contains=javaBoolean,javaNumber,javaCharacter,javaString,javaConstant,@javaClasses,javaGenerics,javaType,javaLabelDefault,javaLabelVarType,javaLabelWhenClause
289else
290 syn region javaLabelRegion transparent matchgroup=javaLabel start="\<case\>" matchgroup=NONE end=":\|->" contains=javaLabelCastType,javaLabelNumber,javaCharacter,javaString,javaConstant,@javaClasses,javaGenerics,javaLabelDefault,javaLabelVarType,javaLabelWhenClause
291 syn keyword javaLabelCastType contained char byte short int
292 syn match javaLabelNumber contained "\<0\>[lL]\@!"
293 syn match javaLabelNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)\>[lL]\@!"
294 hi def link javaLabelCastType javaType
295 hi def link javaLabelNumber javaNumber
296endif
297
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100298syn region javaLabelRegion transparent matchgroup=javaLabel start="\<default\>\%(\s*\%(:\|->\)\)\@=" matchgroup=NONE end=":\|->" oneline
299" Consider grouped _default_ _case_ labels, i.e.
300" case null, default ->
301" case null: default:
302syn keyword javaLabelDefault contained default
303syn keyword javaLabelVarType contained var
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100304" Allow for the contingency of the enclosing region not being able to
305" _keep_ its _end_, e.g. case ':':.
Aliaksei Budaveid6b4afb2024-06-09 19:39:52 +0300306syn 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 +0000307
Bram Moolenaar071d4272004-06-13 20:20:40 +0000308" Comments
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200309syn keyword javaTodo contained TODO FIXME XXX
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300310
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200311if exists("g:java_comment_strings")
312 syn region javaCommentString contained start=+"+ end=+"+ end=+$+ end=+\*/+me=s-1,he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell
313 syn region javaCommentString contained start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell,javaSpecialError,javaTextBlockError
314 syn region javaComment2String contained start=+"+ end=+$\|"+ contains=javaSpecial,javaSpecialChar,@Spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000315 syn match javaCommentCharacter contained "'\\[^']\{1,6\}'" contains=javaSpecialChar
316 syn match javaCommentCharacter contained "'\\''" contains=javaSpecialChar
317 syn match javaCommentCharacter contained "'[^\\]'"
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300318 syn cluster javaCommentSpecial add=javaCommentString,javaCommentCharacter,javaNumber,javaStrTempl
319 syn cluster javaCommentSpecial2 add=javaComment2String,javaCommentCharacter,javaNumber,javaStrTempl
Bram Moolenaar071d4272004-06-13 20:20:40 +0000320endif
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300321
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200322syn region javaComment matchgroup=javaCommentStart start="/\*" end="\*/" contains=@javaCommentSpecial,javaTodo,javaCommentError,javaSpaceError,@Spell fold
323syn match javaCommentStar contained "^\s*\*[^/]"me=e-1
324syn match javaCommentStar contained "^\s*\*$"
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300325syn match javaLineComment "//.*" contains=@javaCommentSpecial2,javaTodo,javaCommentMarkupTag,javaSpaceError,@Spell
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300326syn match javaCommentMarkupTag contained "@\%(end\|highlight\|link\|replace\|start\)\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
327syn match javaCommentMarkupTagAttr contained "\<region\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200328exec '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 +0300329syn match javaCommentError contained "/\*"me=e-1 display
Bram Moolenaar071d4272004-06-13 20:20:40 +0000330
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200331if !exists("g:java_ignore_javadoc") && g:main_syntax != 'jsp'
Aliaksei Budavei3749dff2024-07-31 22:13:25 +0200332 " The overridable "html*" default links must be defined _before_ the
333 " inclusion of the same default links from "html.vim".
334 hi def link htmlComment Special
335 hi def link htmlCommentPart Special
336 hi def link htmlArg Type
337 hi def link htmlString String
Bram Moolenaar071d4272004-06-13 20:20:40 +0000338 syntax case ignore
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300339
340 " Include HTML syntax coloring for Javadoc comments.
Bram Moolenaar63f32602022-06-09 20:45:54 +0100341 syntax include @javaHtml syntax/html.vim
Bram Moolenaar071d4272004-06-13 20:20:40 +0000342 unlet b:current_syntax
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300343
344 " HTML enables spell checking for all text that is not in a syntax
345 " item (:syntax spell toplevel); instead, limit spell checking to
346 " items matchable with syntax groups containing the @Spell cluster.
347 try
348 syntax spell default
349 catch /\<E390:/
350 call s:ReportOnce(v:exception)
351 endtry
Bram Moolenaar5c736222010-01-06 20:54:52 +0100352
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200353 syn region javaDocComment start="/\*\*" end="\*/" keepend contains=javaCommentTitle,@javaHtml,@javaDocTags,javaTodo,javaCommentError,javaSpaceError,@Spell fold
354 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'
355 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
356 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
357 " The members of javaDocTags are sub-grouped according to the Java
358 " version of their introduction, and sub-group members in turn are
359 " arranged in alphabetical order, so that future newer members can
360 " be pre-sorted and appended without disturbing the current member
361 " placement.
362 " Since they only have significance in javaCommentTitle, neither
363 " javaDocSummaryTag nor javaDocReturnTitleTag are defined.
364 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
365
366 " Anticipate non-standard inline tags in {@return} and {@summary}.
367 syn region javaTitleSkipBlock contained transparent start="{\%(@\%(return\|summary\)\>\)\@!" end="}"
368 syn match javaDocDocRootTag contained "{@docRoot}"
369 syn match javaDocInheritDocTag contained "{@inheritDoc}"
370 syn region javaIndexSkipBlock contained transparent start="{\%(@index\>\)\@!" end="}" contains=javaIndexSkipBlock,javaDocIndexTag
371 syn region javaDocIndexTag contained start="{@index\>" end="}" contains=javaDocIndexTag,javaIndexSkipBlock
372 syn region javaLinkSkipBlock contained transparent start="{\%(@link\>\)\@!" end="}" contains=javaLinkSkipBlock,javaDocLinkTag
373 syn region javaDocLinkTag contained start="{@link\>" end="}" contains=javaDocLinkTag,javaLinkSkipBlock
374 syn region javaLinkplainSkipBlock contained transparent start="{\%(@linkplain\>\)\@!" end="}" contains=javaLinkplainSkipBlock,javaDocLinkplainTag
375 syn region javaDocLinkplainTag contained start="{@linkplain\>" end="}" contains=javaDocLinkplainTag,javaLinkplainSkipBlock
376 syn region javaLiteralSkipBlock contained transparent start="{\%(@literal\>\)\@!" end="}" contains=javaLiteralSkipBlock,javaDocLiteralTag
377 syn region javaDocLiteralTag contained start="{@literal\>" end="}" contains=javaDocLiteralTag,javaLiteralSkipBlock
378 syn region javaSystemPropertySkipBlock contained transparent start="{\%(@systemProperty\>\)\@!" end="}" contains=javaSystemPropertySkipBlock,javaDocSystemPropertyTag
379 syn region javaDocSystemPropertyTag contained start="{@systemProperty\>" end="}" contains=javaDocSystemPropertyTag,javaSystemPropertySkipBlock
380 syn region javaValueSkipBlock contained transparent start="{\%(@value\>\)\@!" end="}" contains=javaValueSkipBlock,javaDocValueTag
381 syn region javaDocValueTag contained start="{@value\>" end="}" contains=javaDocValueTag,javaValueSkipBlock
382
383 syn match javaDocParam contained "\s\zs\S\+"
384 syn match javaDocExceptionTag contained "@exception\s\+\S\+" contains=javaDocParam
385 syn match javaDocParamTag contained "@param\s\+\S\+" contains=javaDocParam
386 syn match javaDocSinceTag contained "@since\s\+\S\+" contains=javaDocParam
387 syn match javaDocThrowsTag contained "@throws\s\+\S\+" contains=javaDocParam
388 syn match javaDocSpecTag contained "@spec\_s\+\S\+\ze\_s\+\S\+" contains=javaDocParam
389
390 syn match javaDocAuthorTag contained "@author\>"
391 syn match javaDocDeprecatedTag contained "@deprecated\>"
392 syn match javaDocHiddenTag contained "@hidden\>"
393 syn match javaDocReturnTag contained "@return\>"
394 syn match javaDocSerialTag contained "@serial\>"
395 syn match javaDocSerialDataTag contained "@serialData\>"
396 syn match javaDocSerialFieldTag contained "@serialField\>"
397 syn match javaDocVersionTag contained "@version\>"
398
399 syn match javaDocSeeTag contained "@see\>" nextgroup=javaDocSeeTag1,javaDocSeeTag2,javaDocSeeTag3,javaDocSeeTagStar skipwhite skipempty
400 syn match javaDocSeeTagStar contained "^\s*\*\+\%(\s*{\=@\|/\|$\)\@!" nextgroup=javaDocSeeTag1,javaDocSeeTag2,javaDocSeeTag3 skipwhite skipempty
401 syn match javaDocSeeTag1 contained @"\_[^"]\+"@
402 syn match javaDocSeeTag2 contained @<a\s\+\_.\{-}</a>@ contains=@javaHtml extend
403 syn match javaDocSeeTag3 contained @["< \t]\@!\%(\k\|[/.]\)*\%(##\=\k\+\%((\_[^)]*)\)\=\)\=@ nextgroup=javaDocSeeTag3Label skipwhite skipempty
404 syn match javaDocSeeTag3Label contained @\k\%(\k\+\s*\)*$@
405
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300406 syn region javaCodeSkipBlock contained transparent start="{\%(@code\>\)\@!" end="}" contains=javaCodeSkipBlock,javaDocCodeTag
407 syn region javaDocCodeTag contained start="{@code\>" end="}" contains=javaDocCodeTag,javaCodeSkipBlock
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200408
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200409 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 +0300410 syn region javaSnippetSkipBlock contained transparent start="{\%(@snippet\>\)\@!" end="}" contains=javaSnippetSkipBlock,javaDocSnippetTag,javaCommentMarkupTag
411 syn region javaDocSnippetTag contained start="{@snippet\>" end="}" contains=javaDocSnippetTag,javaSnippetSkipBlock,javaDocSnippetTagAttr,javaCommentMarkupTag
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300412
Bram Moolenaar071d4272004-06-13 20:20:40 +0000413 syntax case match
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200414 hi def link javaDocComment Comment
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200415 hi def link javaDocSeeTagStar javaDocComment
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200416 hi def link javaCommentTitle SpecialComment
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200417 hi def link javaDocParam Function
Aliaksei Budaveia9ae38d2024-09-10 21:00:33 +0200418
419 hi def link javaDocAuthorTag Special
420 hi def link javaDocCodeTag Special
421 hi def link javaDocDeprecatedTag Special
422 hi def link javaDocDocRootTag Special
423 hi def link javaDocExceptionTag Special
424 hi def link javaDocHiddenTag Special
425 hi def link javaDocIndexTag Special
426 hi def link javaDocInheritDocTag Special
427 hi def link javaDocLinkTag Special
428 hi def link javaDocLinkplainTag Special
429 hi def link javaDocLiteralTag Special
430 hi def link javaDocParamTag Special
431 hi def link javaDocReturnTag Special
432 hi def link javaDocSeeTag Special
433 hi def link javaDocSeeTag1 String
434 hi def link javaDocSeeTag2 Special
435 hi def link javaDocSeeTag3 Function
436 hi def link javaDocSerialTag Special
437 hi def link javaDocSerialDataTag Special
438 hi def link javaDocSerialFieldTag Special
439 hi def link javaDocSinceTag Special
440 hi def link javaDocSnippetTag Special
441 hi def link javaDocSpecTag Special
442 hi def link javaDocSystemPropertyTag Special
443 hi def link javaDocThrowsTag Special
444 hi def link javaDocValueTag Special
445 hi def link javaDocVersionTag Special
Bram Moolenaar071d4272004-06-13 20:20:40 +0000446endif
447
448" match the special comment /**/
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200449syn match javaComment "/\*\*/"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000450
451" Strings and constants
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200452syn match javaSpecialError contained "\\."
Bram Moolenaar071d4272004-06-13 20:20:40 +0000453syn match javaSpecialCharError contained "[^']"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300454" Escape Sequences (JLS-17, §3.10.7):
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200455syn match javaSpecialChar contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000456syn region javaString start=+"+ end=+"+ end=+$+ contains=javaSpecialChar,javaSpecialError,@Spell
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300457syn region javaString start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecialChar,javaSpecialError,javaTextBlockError,@Spell
458syn match javaTextBlockError +"""\s*"""+
Aliaksei Budavei8556e232024-08-27 22:32:13 +0200459
460if s:ff.IsRequestedPreviewFeature(430)
461 syn region javaStrTemplEmbExp contained matchgroup=javaStrTempl start="\\{" end="}" contains=TOP
462 exec 'syn region javaStrTempl start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,@Spell'
463 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'
464 hi def link javaStrTempl Macro
465endif
466
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200467syn match javaCharacter "'[^']*'" contains=javaSpecialChar,javaSpecialCharError
468syn match javaCharacter "'\\''" contains=javaSpecialChar
469syn match javaCharacter "'[^\\]'"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300470" Integer literals (JLS-17, §3.10.1):
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200471syn keyword javaNumber 0 0l 0L
472syn match javaNumber "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300473" Decimal floating-point literals (JLS-17, §3.10.2):
474" Against "\<\d\+\>\.":
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200475syn match javaNumber "\<\d\%(_*\d\)*\."
476syn match javaNumber "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
477syn match javaNumber "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
478syn match javaNumber "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300479" Hexadecimal floating-point literals (JLS-17, §3.10.2):
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200480syn match javaNumber "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000481
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300482" Unicode characters
483syn match javaSpecial "\\u\x\x\x\x"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000484
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200485" Method declarations (JLS-17, §8.4.3, §8.4.4, §9.4).
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200486if exists("g:java_highlight_functions")
Aliaksei Budaveibeb02ed2024-06-20 21:00:53 +0200487 syn cluster javaFuncParams contains=javaAnnotation,@javaClasses,javaGenerics,javaType,javaVarArg,javaComment,javaLineComment
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200488
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200489 if exists("g:java_highlight_signature")
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200490 syn cluster javaFuncParams add=javaParamModifier
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200491 hi def link javaFuncDefStart javaFuncDef
492 else
493 syn cluster javaFuncParams add=javaScopeDecl,javaConceptKind,javaStorageClass,javaExternal
494 endif
495
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200496 if g:java_highlight_functions =~# '^indent[1-8]\=$'
497 let s:last = g:java_highlight_functions[-1 :]
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300498 let s:indent = s:last != 't' ? repeat("\x20", s:last) : "\t"
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300499 " Try to not match other type members, initialiser blocks, enum
500 " constants (JLS-17, §8.9.1), and constructors (JLS-17, §8.1.7):
501 " at any _conventional_ indentation, skip over all fields with
502 " "[^=]*", all records with "\<record\s", and let the "*Skip*"
503 " definitions take care of constructor declarations and enum
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200504 " constants (with no support for @Foo(value = "bar")). Also,
505 " reject inlined declarations with "[^{]" for signature.
506 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 +0300507 " As long as package-private constructors cannot be matched with
508 " javaFuncDef, do not look with javaConstructorSkipDeclarator for
509 " them.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200510 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'
511 " With a zero-width span for signature applicable on demand to
512 " javaFuncDef, make related adjustments:
513 " (1) Claim all enum constants of a line as a unit.
514 exec 'syn match javaEnumSkipConstant contained transparent /^' . s:indent . '\%(\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)*\K\k*\s*\%((.*)\)\=\s*[,;({]\s*\)\+/ contains=@javaEnumConstants'
515 " (2) Define a syntax group for top level enumerations and tell
516 " apart their constants from method declarations.
517 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'
518 " (3) Define a base variant of javaParenT without using @javaTop
519 " in order to not include javaFuncDef.
520 syn region javaParenE transparent matchgroup=javaParen start="(" end=")" contains=@javaEnumConstants,javaInParen
521 syn region javaParenE transparent matchgroup=javaParen start="\[" end="\]" contains=@javaEnumConstants
522 syn cluster javaEnumConstants contains=TOP,javaTopEnumDeclaration,javaFuncDef,javaParenT
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300523 unlet s:indent s:last
Bram Moolenaar071d4272004-06-13 20:20:40 +0000524 else
Aliaksei Budavei40524742024-04-14 19:57:00 +0300525 " This is the "style" variant (:help ft-java-syntax).
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200526
527 " Match arbitrarily indented camelCasedName method declarations.
528 " Match: [@ɐ] [abstract] [<α, β>] Τʬ[<γ>][[][]] μʭʭ(/* ... */);
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200529 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 +0000530 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000531endif
532
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200533if exists("g:java_highlight_debug")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000534 " Strings and constants
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300535 syn match javaDebugSpecial contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200536 syn region javaDebugString contained start=+"+ end=+"+ contains=javaDebugSpecial
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300537 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 +0200538
539 if s:ff.IsRequestedPreviewFeature(430)
540 " The highlight groups of java{StrTempl,Debug{,Paren,StrTempl}}\,
541 " share one colour by default. Do not conflate unrelated parens.
542 syn region javaDebugStrTemplEmbExp contained matchgroup=javaDebugStrTempl start="\\{" end="}" contains=javaComment,javaLineComment,javaDebug\%(Paren\)\@!.*
543 exec 'syn region javaDebugStrTempl contained start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ contains=javaDebugStrTemplEmbExp,javaDebugSpecial'
544 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'
545 hi def link javaDebugStrTempl Macro
546 endif
547
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300548 syn match javaDebugTextBlockError contained +"""\s*"""+
Bram Moolenaar071d4272004-06-13 20:20:40 +0000549 syn match javaDebugCharacter contained "'[^\\]'"
550 syn match javaDebugSpecialCharacter contained "'\\.'"
551 syn match javaDebugSpecialCharacter contained "'\\''"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300552 syn keyword javaDebugNumber contained 0 0l 0L
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300553 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\."
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300554 syn match javaDebugNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
555 syn match javaDebugNumber contained "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
556 syn match javaDebugNumber contained "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
557 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
558 syn match javaDebugNumber contained "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000559 syn keyword javaDebugBoolean contained true false
560 syn keyword javaDebugType contained null this super
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200561 syn region javaDebugParen contained start=+(+ end=+)+ contains=javaDebug.*,javaDebugParen
Bram Moolenaar071d4272004-06-13 20:20:40 +0000562
Aliaksei Budavei40524742024-04-14 19:57:00 +0300563 " To make this work, define the highlighting for these groups.
564 syn match javaDebug "\<System\.\%(out\|err\)\.print\%(ln\)\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
565" FIXME: What API does "p" belong to?
566" syn match javaDebug "\<p\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
567 syn match javaDebug "\<\K\k*\.printStackTrace\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
568" FIXME: What API do "trace*" belong to?
569" syn match javaDebug "\<trace[SL]\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
Bram Moolenaar071d4272004-06-13 20:20:40 +0000570
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200571 hi def link javaDebug Debug
572 hi def link javaDebugString DebugString
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200573 hi def link javaDebugTextBlockError Error
574 hi def link javaDebugType DebugType
575 hi def link javaDebugBoolean DebugBoolean
576 hi def link javaDebugNumber Debug
577 hi def link javaDebugSpecial DebugSpecial
578 hi def link javaDebugSpecialCharacter DebugSpecial
579 hi def link javaDebugCharacter DebugString
580 hi def link javaDebugParen Debug
Bram Moolenaar071d4272004-06-13 20:20:40 +0000581
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200582 hi def link DebugString String
583 hi def link DebugSpecial Special
584 hi def link DebugBoolean Boolean
585 hi def link DebugType Type
Bram Moolenaar071d4272004-06-13 20:20:40 +0000586endif
587
Aliaksei Budavei94c5d8a2024-06-19 20:10:47 +0200588" Try not to fold top-level-type bodies under assumption that there is
589" but one such body.
590exec 'syn region javaBlock transparent start="\%(^\|^\S[^:]\+\)\@' . s:ff.Peek('120', '') . '<!{" end="}" fold'
591
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200592if exists("g:java_mark_braces_in_parens_as_errors")
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300593 syn match javaInParen contained "[{}]"
594 hi def link javaInParen javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000595endif
596
597" catch errors caused by wrong parenthesis
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200598syn region javaParenT transparent matchgroup=javaParen start="(" end=")" contains=@javaTop,javaInParen,javaParenT1
599syn region javaParenT1 contained transparent matchgroup=javaParen1 start="(" end=")" contains=@javaTop,javaInParen,javaParenT2
600syn region javaParenT2 contained transparent matchgroup=javaParen2 start="(" end=")" contains=@javaTop,javaInParen,javaParenT
601syn match javaParenError ")"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000602" catch errors caused by wrong square parenthesis
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200603syn region javaParenT transparent matchgroup=javaParen start="\[" end="\]" contains=@javaTop,javaParenT1
604syn region javaParenT1 contained transparent matchgroup=javaParen1 start="\[" end="\]" contains=@javaTop,javaParenT2
605syn region javaParenT2 contained transparent matchgroup=javaParen2 start="\[" end="\]" contains=@javaTop,javaParenT
606syn match javaParenError "\]"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000607
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200608" Lambda expressions (JLS-17, §15.27) and method reference expressions
609" (JLS-17, §15.13).
610if exists("g:java_highlight_functions")
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200611 syn match javaMethodRef ":::\@!"
Aliaksei Budaveie73e5b82024-07-24 20:15:15 +0200612
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200613 if exists("g:java_highlight_signature")
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200614 let s:ff.LambdaDef = s:ff.LeftConstant
615 else
616 let s:ff.LambdaDef = s:ff.RightConstant
617 endif
618
Aliaksei Budavei40524742024-04-14 19:57:00 +0300619 " Make ()-matching definitions after the parenthesis error catcher.
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300620 "
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200621 " Note that here and elsewhere a single-line token is used for \z,
622 " with other tokens repeated as necessary, to overcome the lack of
623 " support for multi-line matching with \z.
624 "
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300625 " Match: ([@A [@B ...] final] var a[, var b, ...]) ->
626 " | ([@A [@B ...] final] T[<α>][[][]] a[, T b, ...]) ->
627 " There is no recognition of expressions interspersed with comments
628 " or of expressions whose parameterised parameter types are written
629 " across multiple lines.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200630 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 +0300631 " Match: () ->
632 " | (a[, b, ...]) ->
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200633 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 +0300634 " Match: a ->
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200635 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 +0300636
637 syn keyword javaParamModifier contained final
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300638 syn keyword javaLambdaVarType contained var
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200639 hi def link javaParamModifier javaConceptKind
640 hi def link javaLambdaVarType javaOperator
641 hi def link javaLambdaDef javaFuncDef
642 hi def link javaLambdaDefStart javaFuncDef
643 hi def link javaMethodRef javaFuncDef
644 hi def link javaFuncDef Function
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100645endif
646
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300647" The @javaTop cluster comprises non-contained Java syntax groups.
648" Note that the syntax file "aidl.vim" relies on its availability.
Aliaksei Budavei01a4fb12024-06-23 10:03:33 +0200649syn cluster javaTop contains=TOP,javaTopEnumDeclaration
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300650
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200651if !exists("g:java_minlines")
652 let g:java_minlines = 10
Bram Moolenaar071d4272004-06-13 20:20:40 +0000653endif
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300654
655" Note that variations of a /*/ balanced comment, e.g., /*/*/, /*//*/,
656" /* /*/, /* /*/, etc., may have their rightmost /*/ part accepted
657" as a comment start by ':syntax sync ccomment'; consider alternatives
658" to make synchronisation start further towards file's beginning by
659" bumping up g:java_minlines or issuing ':syntax sync fromstart' or
660" preferring &foldmethod set to 'syntax'.
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200661exec "syn sync ccomment javaComment minlines=" . g:java_minlines
Bram Moolenaar071d4272004-06-13 20:20:40 +0000662
663" The default highlighting.
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200664hi def link javaVarArg Function
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200665hi def link javaBranch Conditional
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200666hi def link javaConditional Conditional
667hi def link javaRepeat Repeat
668hi def link javaExceptions Exception
669hi def link javaAssert Statement
670hi def link javaStorageClass StorageClass
671hi def link javaMethodDecl javaStorageClass
672hi def link javaClassDecl javaStorageClass
673hi def link javaScopeDecl javaStorageClass
Aliaksei Budavei5e95c8f2024-09-15 19:53:50 +0200674hi def link javaConceptKind javaStorageClass
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200675
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200676hi def link javaBoolean Boolean
677hi def link javaSpecial Special
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200678hi def link javaSpecialError Error
679hi def link javaSpecialCharError Error
680hi def link javaString String
681hi def link javaCharacter Character
682hi def link javaSpecialChar SpecialChar
683hi def link javaNumber Number
684hi def link javaError Error
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200685hi def link javaError2 javaError
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300686hi def link javaTextBlockError Error
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200687hi def link javaParenError javaError
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200688hi def link javaStatement Statement
689hi def link javaOperator Operator
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200690hi def link javaConstant Constant
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200691hi def link javaTypedef Typedef
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200692hi def link javaTodo Todo
693hi def link javaAnnotation PreProc
Aliaksei Budavei902b7662024-06-13 18:30:09 +0300694hi def link javaAnnotationStart javaAnnotation
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200695hi def link javaType Type
696hi def link javaExternal Include
Bram Moolenaar071d4272004-06-13 20:20:40 +0000697
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200698hi def link javaUserLabel Label
699hi def link javaUserLabelRef javaUserLabel
700hi def link javaLabel Label
701hi def link javaLabelDefault javaLabel
702hi def link javaLabelVarType javaOperator
Bram Moolenaar071d4272004-06-13 20:20:40 +0000703
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200704hi def link javaComment Comment
705hi def link javaCommentStar javaComment
706hi def link javaLineComment Comment
707hi def link javaCommentMarkupTagAttr javaHtmlArg
708hi def link javaCommentString javaString
709hi def link javaComment2String javaString
710hi def link javaCommentCharacter javaCharacter
711hi def link javaCommentError javaError
712hi def link javaCommentStart javaComment
713
714hi def link javaHtmlArg Type
715hi def link javaHtmlString String
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200716
Bram Moolenaar071d4272004-06-13 20:20:40 +0000717let b:current_syntax = "java"
718
Aliaksei Budavei9aabcef2024-07-31 22:14:37 +0200719if g:main_syntax == 'java'
720 unlet g:main_syntax
Bram Moolenaar071d4272004-06-13 20:20:40 +0000721endif
722
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200723let b:spell_options = "contained"
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +0200724let &cpo = s:cpo_save
Aliaksei Budavei77b87c32024-07-31 22:15:16 +0200725unlet s:ff s:cpo_save
Bram Moolenaar071d4272004-06-13 20:20:40 +0000726
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300727" See ":help vim9-mix".
728if !has("vim9script")
729 finish
730endif
731
Aliaksei Budavei2750b832024-08-22 21:09:32 +0200732if exists("g:java_foldtext_show_first_or_second_line")
733 def! s:LazyPrefix(prefix: string, dashes: string, count: number): string
734 return empty(prefix)
735 ? printf('+-%s%3d lines: ', dashes, count)
736 : prefix
737 enddef
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300738
Aliaksei Budavei2750b832024-08-22 21:09:32 +0200739 def! s:JavaSyntaxFoldTextExpr(): string
740 # Piggyback on NGETTEXT.
741 const summary: string = foldtext()
742 return getline(v:foldstart) !~ '/\*\+\s*$'
743 ? summary
744 : LazyPrefix(matchstr(summary, '^+-\+\s*\d\+\s.\{-1,}:\s'),
745 v:folddashes,
746 (v:foldend - v:foldstart + 1)) ..
747 getline(v:foldstart + 1)
748 enddef
749
750 setlocal foldtext=s:JavaSyntaxFoldTextExpr()
751 delfunction! g:JavaSyntaxFoldTextExpr
752endif
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300753" vim: sw=2 ts=8 noet sta