codekingpro/portable-devtools
114k
1" Vim syntax file2" Language: Java3" Maintainer: Aliaksei Budavei <0x000c70 AT gmail DOT com>4" Former Maintainer: Claudio Fleiner <claudio@fleiner.com>5" Repository: https://github.com/zzzyxwvut/java-vim.git6" Last Change: 2026 Mar 227 8" Please check ":help java.vim" for comments on some of the options9" available.10 11" Do not aggregate syntax items from circular inclusion.12if exists("b:current_syntax")13 finish14endif15 16if exists("g:main_syntax")17 " Reject attendant circularity for every :syn-included syntax file,18 " but ACCEPT FAILURE when "g:main_syntax" is set to "java".19 if g:main_syntax == 'html'20 if !exists("g:java_ignore_html")21 let g:java_ignore_html = 122 let s:clear_java_ignore_html = 123 endif24 elseif g:main_syntax == 'markdown'25 if !exists("g:java_ignore_markdown")26 let g:java_ignore_markdown = 127 let s:clear_java_ignore_markdown = 128 endif29 endif30else31 " Allow syntax files that include this file test for its inclusion.32 let g:main_syntax = 'java'33endif34 35let s:cpo_save = &cpo36set cpo&vim37 38"""" STRIVE TO REMAIN COMPATIBLE FOR AT LEAST VIM 7.0.39let s:ff = {}40let s:vv = {}41let s:vv.ignore_folding = get(g:, 'java_ignore_folding', '')42 43function! s:ff.LeftConstant(x, y) abort44 return a:x45endfunction46 47function! s:ff.RightConstant(x, y) abort48 return a:y49endfunction50 51if !empty(get(g:, 'java_syntax_previews', []))52 " Fold the value of "g:java_syntax_previews" in this function.53 exec printf("%s\n%s\n%s",54 \ 'function! s:ff.IsAnyRequestedPreviewFeatureOf(ns) abort',55 \ printf('return !empty(filter(a:ns, "index(%s, v:val) + 1"))',56 \ string(g:java_syntax_previews)),57 \ 'endfunction')58else59 function! s:ff.IsAnyRequestedPreviewFeatureOf(dummy) abort60 return 061 endfunction62endif63 64function! s:ff.QueryFoldArgForSyntaxItems(kind) abort65 return stridx(s:vv.ignore_folding, a:kind) < 0 ? "fold" : ""66endfunction67 68if !exists("*s:ReportOnce")69 function s:ReportOnce(message) abort70 echomsg 'syntax/java.vim: ' . a:message71 endfunction72else73 function! s:ReportOnce(dummy)74 endfunction75endif76 77if exists("g:java_foldtext_show_first_or_second_line")78 function! s:LazyPrefix(prefix, dashes, count) abort79 return empty(a:prefix)80 \ ? printf('+-%s%3d lines: ', a:dashes, a:count)81 \ : a:prefix82 endfunction83 84 function! JavaSyntaxFoldTextExpr() abort85 " Piggyback on NGETTEXT.86 let summary = foldtext()87 return getline(v:foldstart) !~ '/\*\+\s*$'88 \ ? summary89 \ : s:LazyPrefix(matchstr(summary, '^+-\+\s*\d\+\s.\{-1,}:\s'),90 \ v:folddashes,91 \ (v:foldend - v:foldstart + 1)) .92 \ getline(v:foldstart + 1)93 endfunction94 95 " E120 for "fdt=s:JavaSyntaxFoldTextExpr()" before v8.2.3900.96 setlocal foldtext=JavaSyntaxFoldTextExpr()97endif98 99" Admit the ASCII dollar sign to keyword characters (JLS-17, §3.8):100try101 exec 'syntax iskeyword ' . &l:iskeyword . ',$'102catch /\<E410:/103 call s:ReportOnce(v:exception)104 setlocal iskeyword+=$105endtry106 107" some characters that cannot be in a java program (outside a string)108syn match javaError "[\\@`]"109syn match javaError "<<<\|\.\.\|=>\|||=\|&&=\|\*\/"110 111" use separate name so that it can be deleted in javacc.vim112syn match javaError2 "#\|=<"113 114" Keywords (JLS-17, §3.9):115syn keyword javaExternal native package116syn match javaExternal "\<import\>\%(\s\+static\>\)\="117syn keyword javaError goto const118syn keyword javaConditional if else switch119syn keyword javaRepeat while for do120syn keyword javaBoolean true false121syn keyword javaConstant null122syn keyword javaTypedef this super123syn keyword javaOperator new instanceof124syn match javaOperator "\<var\>\%(\s*(\)\@!"125 126" Module imports can be used in any source file.127syn match javaExternal "\<import\s\+module\>" contains=javaModuleImport128syn keyword javaModuleImport contained module129 130if !empty(s:ff.QueryFoldArgForSyntaxItems('i'))131 " Group and fold adjacent "import" declarations.132 syn region javaImportDeclBlock transparent start="\<import\s\+\K" skip="\<import\s\+\K" end="^" contains=javaExternal,@javaClasses,javaComment,javaLineComment fold133endif134 135" Since the yield statement, which could take a parenthesised operand,136" and _qualified_ yield methods get along within the switch block137" (JLS-17, §3.8), it seems futile to make a region definition for this138" block; instead look for the _yield_ word alone, and if found,139" backtrack (arbitrarily) 80 bytes, at most, on the matched line and,140" if necessary, on the line before that (h: \@<=), trying to match141" neither a method reference nor a qualified method invocation.142try143 if !empty(get(g:, 'java_lookbehind_byte_counts', {}))144 exec 'syn match javaOperator "\%(\%(::\|\.\)[[:space:]\n]*\)\@' . max([0, get(g:java_lookbehind_byte_counts, 'javaOperator', 80)]) . '<!\<yield\>"'145 146 function! s:ff.PeekFor(item, count) abort147 return string(max([0, get(g:java_lookbehind_byte_counts, a:item, a:count)]))148 endfunction149 else150 syn match javaOperator "\%(\%(::\|\.\)[[:space:]\n]*\)\@80<!\<yield\>"151 152 function! s:ff.PeekFor(dummy, count) abort153 return string(a:count)154 endfunction155 endif156 157 let s:ff.Peek = s:ff.LeftConstant158catch /\<E59:/159 call s:ReportOnce(v:exception)160 syn match javaOperator "\%(\%(::\|\.\)[[:space:]\n]*\)\@<!\<yield\>"161 162 function! s:ff.PeekFor(dummy_a, dummy_b) abort163 return ""164 endfunction165 166 let s:ff.Peek = s:ff.RightConstant167endtry168 169syn keyword javaType boolean char byte short int long float double170syn keyword javaType void171syn keyword javaStatement return172syn keyword javaStorageClass static synchronized transient volatile strictfp173syn keyword javaExceptions throw try catch finally174syn keyword javaAssert assert175syn keyword javaMethodDecl throws176" Differentiate a "MyClass.class" literal from the keyword "class".177syn match javaTypedef "\.\s*\<class\>"ms=s+1178syn keyword javaClassDecl enum extends implements interface179syn match javaClassDecl "\<permits\>\%(\s*(\)\@!"180syn match javaClassDecl "\<record\>\%(\s*(\)\@!"181syn match javaClassDecl "^class\>"182syn match javaClassDecl "[^.]\s*\<class\>"ms=s+1183syn match javaAnnotation "@\%(\K\k*\.\)*\K\k*\>"184syn region javaAnnotation transparent matchgroup=javaAnnotationStart start=/@\%(\K\k*\.\)*\K\k*(/ end=/)/ skip=/\/\*.\{-}\*\/\|\/\/.*$/ contains=javaAnnotation,javaParenT,javaBlock,javaString,javaBoolean,javaNumber,javaTypedef,javaComment,javaLineComment185syn match javaClassDecl "@interface\>"186syn keyword javaBranch break continue nextgroup=javaUserLabelRef skipwhite187syn match javaUserLabelRef contained "\k\+"188syn match javaVarArg "\.\.\."189syn keyword javaScopeDecl public protected private190syn keyword javaConceptKind abstract final191syn match javaConceptKind "\<non-sealed\>"192syn match javaConceptKind "\<sealed\>\%(\s*(\)\@!"193syn match javaConceptKind "\<default\>\%(\s*\%(:\|->\)\)\@!"194 195if !(v:version < 704)196 " Request the new regexp engine for [:upper:] and [:lower:].197 let [s:ff.Engine, s:ff.UpperCase, s:ff.LowerCase] = repeat([s:ff.LeftConstant], 3)198else199 " XXX: \C\<[^a-z0-9]\k*\> rejects "type", but matches "τύπος".200 " XXX: \C\<[^A-Z0-9]\k*\> rejects "Method", but matches "Μέθοδος".201 let [s:ff.Engine, s:ff.UpperCase, s:ff.LowerCase] = repeat([s:ff.RightConstant], 3)202endif203 204if exists("g:java_highlight_signature")205 let [s:ff.PeekTo, s:ff.PeekFrom, s:ff.GroupArgs] = repeat([s:ff.LeftConstant], 3)206else207 let [s:ff.PeekTo, s:ff.PeekFrom, s:ff.GroupArgs] = repeat([s:ff.RightConstant], 3)208endif209 210let s:with_html = !exists("g:java_ignore_html")211let s:with_markdown = !exists("g:java_ignore_markdown")212lockvar s:with_html s:with_markdown213 214" Note that the delimiting angle brackets are omitted.215let s:vv.type_param_list = '\%([^(){}]\|\n\)\+[[:space:]-]\@' . s:ff.Peek('1', '') . '<!'216" COMBAK: Revisit reference types once JDK-8259731 and JDK-8316779217" will have been resolved.218let s:vv.param_type_head = 'b\%%(oolean\|yte\)\|char\|short\|int\|long\|float\|double\|\%%(\<\K\k*\>\.\)*%s\<' . s:ff.UpperCase('[$_[:upper:]]', '[^a-z0-9]') . '\k*\>'219" Allow for org.example.TopLevelType<T>.MemberType return types.220let s:vv.void_or_param_type = 'void\|\%(' . printf(s:vv.param_type_head, '\%(') . '\%(<' . s:vv.type_param_list . '>\.\=\)\=\)\+\)\%(\[\]\)*'221let s:vv.param_type_head = printf(s:vv.param_type_head, '')222 223" Java module declarations (JLS-17, §7.7).224"225" Note that a "module-info" file will be recognised with an arbitrary226" file extension (or no extension at all) so that more than one such227" declaration for the same Java module can be maintained for modular228" testing in a project without attendant confusion for IDEs, with the229" ".java\=" extension used for a production version and an arbitrary230" extension used for a testing version.231if fnamemodify(bufname("%"), ":t") =~ '^module-info\>\%(\.class\>\)\@!'232 syn keyword javaModuleStorageClass module transitive233 syn keyword javaModuleStmt open requires exports opens uses provides234 syn keyword javaModuleExternal to with235 hi def link javaModuleStorageClass StorageClass236 hi def link javaModuleStmt Statement237 hi def link javaModuleExternal Include238 239 if !exists("g:java_ignore_javadoc") && (s:with_html || s:with_markdown) && g:main_syntax != 'jsp'240 syn match javaDocProvidesTag contained "@provides\_s\+\S\+" contains=javaDocParam241 syn match javaDocUsesTag contained "@uses\_s\+\S\+" contains=javaDocParam242 hi def link javaDocProvidesTag Special243 hi def link javaDocUsesTag Special244 endif245endif246 247if exists("g:java_highlight_java_lang_ids")248 let g:java_highlight_all = 1249endif250 251if exists("g:java_highlight_all") || exists("g:java_highlight_java") || exists("g:java_highlight_java_lang")252 " java.lang.*253 "254 " The type names in ":syn-keyword"s (and in ":syn-match"es) of the255 " "java[CEIRX]_JavaLang" syntax groups are sub-grouped according to256 " the Java version of their introduction, and sub-group names are257 " arranged in alphabetical order, so that future newer names can be258 " pre-sorted and appended without disturbing their placement.259 260 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 MatchException261 syn cluster javaClasses add=javaR_JavaLang262 hi def link javaR_JavaLang javaR_Java263 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 IO264 syn match javaC_JavaLang "\<System\>" " See javaDebug.265 " Generic non-interfaces:266 syn match javaC_JavaLang "\<Class\>"267 syn match javaC_JavaLang "\<InheritableThreadLocal\>"268 syn match javaC_JavaLang "\<ThreadLocal\>"269 syn match javaC_JavaLang "\<Enum\>"270 syn match javaC_JavaLang "\<ClassValue\>"271 exec 'syn match javaC_JavaLang "\%(\<Enum\.\)\@' . s:ff.Peek('5', '') . '<=\<EnumDesc\>"'272 syn match javaC_JavaLang "\<ScopedValue\>"273 " Member classes:274 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<Subset\>"'275 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<UnicodeBlock\>"'276 exec 'syn match javaC_JavaLang "\%(\<ProcessBuilder\.\)\@' . s:ff.Peek('15', '') . '<=\<Redirect\>"'277 exec 'syn match javaC_JavaLang "\%(\<ModuleLayer\.\)\@' . s:ff.Peek('12', '') . '<=\<Controller\>"'278 exec 'syn match javaC_JavaLang "\%(\<Runtime\.\)\@' . s:ff.Peek('8', '') . '<=\<Version\>"'279 exec 'syn match javaC_JavaLang "\%(\<System\.\)\@' . s:ff.Peek('7', '') . '<=\<LoggerFinder\>"'280 exec 'syn match javaC_JavaLang "\%(\<ScopedValue\.\)\@' . s:ff.Peek('12', '') . '<=\<Carrier\>"'281 " Member enumerations:282 exec 'syn match javaC_JavaLang "\%(\<Thread\.\)\@' . s:ff.Peek('7', '') . '<=\<State\>"'283 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<UnicodeScript\>"'284 exec 'syn match javaC_JavaLang "\%(\<ProcessBuilder\.Redirect\.\)\@' . s:ff.Peek('24', '') . '<=\<Type\>"'285 exec 'syn match javaC_JavaLang "\%(\<StackWalker\.\)\@' . s:ff.Peek('12', '') . '<=\<Option\>"'286 exec 'syn match javaC_JavaLang "\%(\<System\.Logger\.\)\@' . s:ff.Peek('14', '') . '<=\<Level\>"'287 syn cluster javaClasses add=javaC_JavaLang288 hi def link javaC_JavaLang javaC_Java289 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 BootstrapMethodError290 syn cluster javaClasses add=javaE_JavaLang291 hi def link javaE_JavaLang javaE_Java292 syn keyword javaX_JavaLang ClassNotFoundException CloneNotSupportedException Exception IllegalAccessException InstantiationException InterruptedException NoSuchMethodException Throwable NoSuchFieldException ReflectiveOperationException293 syn cluster javaClasses add=javaX_JavaLang294 hi def link javaX_JavaLang javaX_Java295 syn keyword javaI_JavaLang Cloneable Runnable CharSequence Appendable Deprecated Override Readable SuppressWarnings AutoCloseable SafeVarargs FunctionalInterface ProcessHandle296 " Generic non-classes:297 syn match javaI_JavaLang "\<Comparable\>"298 syn match javaI_JavaLang "\<Iterable\>"299 " Member interfaces:300 exec 'syn match javaI_JavaLang "\%(\<Thread\.\)\@' . s:ff.Peek('7', '') . '<=\<UncaughtExceptionHandler\>"'301 exec 'syn match javaI_JavaLang "\%(\<ProcessHandle\.\)\@' . s:ff.Peek('14', '') . '<=\<Info\>"'302 exec 'syn match javaI_JavaLang "\%(\<System\.\)\@' . s:ff.Peek('7', '') . '<=\<Logger\>"'303 exec 'syn match javaI_JavaLang "\%(\<StackWalker\.\)\@' . s:ff.Peek('12', '') . '<=\<StackFrame\>"'304 exec 'syn match javaI_JavaLang "\%(\<Thread\.\)\@' . s:ff.Peek('7', '') . '<=\<Builder\>"'305 exec 'syn match javaI_JavaLang "\%(\<Thread\.Builder\.\)\@' . s:ff.Peek('15', '') . '<=\<OfPlatform\>"'306 exec 'syn match javaI_JavaLang "\%(\<Thread\.Builder\.\)\@' . s:ff.Peek('15', '') . '<=\<OfVirtual\>"'307 exec 'syn match javaI_JavaLang "\%(\<ScopedValue\.\)\@' . s:ff.Peek('12', '') . '<=\<CallableOp\>"'308 syn cluster javaClasses add=javaI_JavaLang309 hi def link javaI_JavaLang javaI_Java310 311 " Common groups for generated "javaid.vim" syntax items:312 hi def link javaR_Java javaR_313 hi def link javaC_Java javaC_314 hi def link javaE_Java javaE_315 hi def link javaX_Java javaX_316 hi def link javaI_Java javaI_317 hi def link javaX_ javaExceptions318 hi def link javaR_ javaExceptions319 hi def link javaE_ javaExceptions320 hi def link javaC_ javaConstant321 hi def link javaI_ javaTypedef322 323 syn keyword javaLangObject getClass notify notifyAll wait324 325 " Lower the syntax priority of overridable java.lang.Object method326 " names for zero-width matching (define g:java_highlight_signature327 " and see their base declarations for java.lang.Object):328 syn match javaLangObject "\<clone\>"329 syn match javaLangObject "\<equals\>"330 syn match javaLangObject "\<finalize\>"331 syn match javaLangObject "\<hashCode\>"332 syn match javaLangObject "\<toString\>"333 hi def link javaLangObject javaConstant334 335 " As of JDK 25, RuntimePermission is deprecated for removal336 " (JDK-8353641).337 " (Note that SecurityException is still not deprecated.)338 " As of JDK 24, SecurityManager is rendered non-functional339 " (JDK-8338625).340 " As of JDK 21, Compiler is no more (JDK-8205129).341 syn keyword javaLangDeprecated Compiler SecurityManager RuntimePermission342endif343 344runtime syntax/javaid.vim345 346" Type parameter sections (JLS-17, §4.4, §4.5).347"348" Note that false positives may elsewhere occur whenever an identifier349" is butted against a less-than operator. Cf. (X<Y) and (X < Y).350if exists("g:java_highlight_generics")351 syn keyword javaWildcardBound contained extends super352 syn cluster javaTypeParams contains=javaAnnotation,javaWildcardBound,javaType,@javaClasses,javaComment,javaLineComment353 354 " Match sections of generic methods and constructors and their355 " parameterised use.356 exec 'syn region javaTypeParamSection transparent matchgroup=javaGenericsCX start=/' . s:ff.Engine('\%#=2', '') . '\%(^\|\s\)\@' . s:ff.Peek('1', '') . '<=<\%(' . s:vv.type_param_list . '>\_s\+\%(\%(' . s:vv.void_or_param_type . '\)\_s\+\)\=\<\K\k*\>\s*(\)\@=/ end=/>/ contains=javaGenerics,@javaTypeParams'357 exec 'syn region javaTypeParamSection transparent matchgroup=javaGenericsCX start=/\%(\%(\<new\|::\|\.\)[[:space:]\n]*\)\@' . s:ff.PeekFor('javaTypeParamSection', 80) . '<=<>\@!/ end=/>/ contains=javaGenerics,@javaTypeParams'358 359 for s:ctx in [{'gsg': 'javaGenerics', 'ghg': 'javaGenericsC1', 'csg': 'javaGenericsX', 'c': ''},360 \ {'gsg': 'javaGenericsX', 'ghg': 'javaGenericsC2', 'csg': 'javaGenerics', 'c': ' contained'}]361 " Match sections of generic types and their parameterised use.362 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]*\%([?@]\|' . s:vv.param_type_head . '\)\)\@=/ end=/>/ contains=' . s:ctx.csg . ',@javaTypeParams'363 endfor364 365 unlet s:ctx366 hi def link javaWildcardBound Question367 hi def link javaGenericsC1 Function368 hi def link javaGenericsC2 Type369 hi def link javaGenericsCX javaGenericsC2370endif371 372if exists("g:java_space_errors")373 if !exists("g:java_no_trail_space_error")374 syn match javaSpaceError "\s\+$"375 endif376 if !exists("g:java_no_tab_space_error")377 syn match javaSpaceError " \+\t"me=e-1378 endif379 hi def link javaSpaceError Error380endif381 382exec 'syn match javaUserLabel "^\s*\<\K\k*\>\%(\<default\>\)\@' . s:ff.Peek('7', '') . '<!\s*::\@!"he=e-1'383 384if s:ff.IsAnyRequestedPreviewFeatureOf([455, 488, 507, 530])385 syn region javaLabelRegion transparent matchgroup=javaLabel start="\<case\>" matchgroup=NONE end=":\|->" contains=javaBoolean,javaNumber,javaCharacter,javaString,javaConstant,@javaClasses,javaGenerics,javaType,javaLabelDefault,javaLabelVarType,javaLabelWhenClause386else387 syn region javaLabelRegion transparent matchgroup=javaLabel start="\<case\>" matchgroup=NONE end=":\|->" contains=javaLabelCastType,javaLabelNumber,javaCharacter,javaString,javaConstant,@javaClasses,javaGenerics,javaLabelDefault,javaLabelVarType,javaLabelWhenClause388 syn keyword javaLabelCastType contained char byte short int389 syn match javaLabelNumber contained "\<0\>[lL]\@!"390 syn match javaLabelNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)\>[lL]\@!"391 hi def link javaLabelCastType javaType392 hi def link javaLabelNumber javaNumber393endif394 395syn region javaLabelRegion transparent matchgroup=javaLabel start="\<default\>\%(\s*\%(:\|->\)\)\@=" matchgroup=NONE end=":\|->" oneline396" Consider grouped _default_ _case_ labels, i.e.397" case null, default ->398" case null: default:399syn keyword javaLabelDefault contained default400syn keyword javaLabelVarType contained var401" Allow for the contingency of the enclosing region not being able to402" _keep_ its _end_, e.g. case ':':.403syn region javaLabelWhenClause contained transparent matchgroup=javaLabel start="\<when\>" matchgroup=NONE end=":"me=e-1 end="->"me=e-2 contains=TOP,javaImportDeclBlock,javaExternal,javaLambdaDef404 405" Comments406syn keyword javaTodo contained TODO FIXME XXX407 408if exists("g:java_comment_strings")409 syn region javaCommentString contained start=+"+ end=+"+ end=+$+ end=+\*/+me=s-1,he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell410 syn region javaCommentString contained start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell,javaSpecialError,javaTextBlockError411 syn region javaComment2String contained start=+"+ end=+$\|"+ contains=javaSpecial,javaSpecialChar,@Spell412 syn match javaCommentCharacter contained "'\\[^']\{1,6\}'" contains=javaSpecialChar413 syn match javaCommentCharacter contained "'\\''" contains=javaSpecialChar414 syn match javaCommentCharacter contained "'[^\\]'"415 syn cluster javaCommentSpecial add=javaCommentString,javaCommentCharacter,javaNumber,javaStrTempl416 syn cluster javaCommentSpecial2 add=javaComment2String,javaCommentCharacter,javaNumber,javaStrTempl417endif418 419exec 'syn region javaComment matchgroup=javaCommentStart start="/\*" end="\*/" contains=@javaCommentSpecial,javaTodo,javaCommentError,javaSpaceError,@Spell ' . s:ff.QueryFoldArgForSyntaxItems('c')420syn match javaCommentStar contained "^\s*\*[^/]"me=e-1421syn match javaCommentStar contained "^\s*\*$"422syn match javaLineComment "//.*" contains=@javaCommentSpecial2,javaTodo,javaCommentMarkupTag,javaSpaceError,@Spell423syn match javaCommentMarkupTag contained "@\%(end\|highlight\|link\|replace\|start\)\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite424syn match javaCommentMarkupTagAttr contained "\<region\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite425exec 'syn region javaCommentMarkupTagAttr contained transparent matchgroup=javaHtmlArg start=/\<\%(re\%(gex\|gion\|placement\)\|substring\|t\%(arget\|ype\)\)\%(\s*=\)\@=/ matchgroup=javaHtmlString end=/\%(=\s*\)\@' . s:ff.PeekFor('javaCommentMarkupTagAttr', 80) . '<=\%("[^"]\+"\|' . "\x27[^\x27]\\+\x27" . '\|\%([.-]\|\k\)\+\)/ nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite oneline'426syn match javaCommentError contained "/\*"me=e-1 display427 428if !exists("g:java_ignore_javadoc") && (s:with_html || s:with_markdown) && g:main_syntax != 'jsp'429 " The overridable "html*" and "markdown*" default links must be430 " defined _before_ the inclusion of the same default links from431 " "html.vim" and "markdown.vim".432 if s:with_html || s:with_markdown433 hi def link htmlComment Special434 hi def link htmlCommentPart Special435 hi def link htmlArg Type436 hi def link htmlString String437 endif438 439 if s:with_markdown440 hi def link markdownCode Special441 hi def link markdownCodeBlock Special442 hi def link markdownCodeDelimiter Special443 hi def link markdownLinkDelimiter Comment444 endif445 446 syntax case ignore447 448 " Note that javaDocSeeTag is valid in HTML and Markdown.449 let s:ff.WithMarkdown = s:ff.RightConstant450 451 " Include HTML syntax coloring for Javadoc comments.452 if s:with_html453 try454 if exists("g:html_syntax_folding") && !exists("g:java_consent_to_html_syntax_folding")455 let s:html_syntax_folding_copy = g:html_syntax_folding456 unlet g:html_syntax_folding457 endif458 459 syntax include @javaHtml syntax/html.vim460 finally461 unlet! b:current_syntax462 463 if exists("s:html_syntax_folding_copy")464 let g:html_syntax_folding = s:html_syntax_folding_copy465 unlet s:html_syntax_folding_copy466 endif467 endtry468 endif469 470 " Include Markdown syntax coloring (v7.2.437) for Javadoc comments.471 if s:with_markdown472 try473 if exists("g:html_syntax_folding") && !exists("g:java_consent_to_html_syntax_folding")474 let s:html_syntax_folding_copy = g:html_syntax_folding475 unlet g:html_syntax_folding476 endif477 478 if !empty(get(g:, 'markdown_fenced_languages', []))479 let s:markdown_fenced_languages_copy = g:markdown_fenced_languages480 unlet g:markdown_fenced_languages481 endif482 483 syntax include @javaMarkdown syntax/markdown.vim484 485 try486 syn clear markdownId markdownLineStart markdownH1 markdownH2 markdownHeadingRule markdownRule markdownCode markdownCodeBlock markdownIdDeclaration487 let s:ff.WithMarkdown = s:ff.LeftConstant488 catch /\<E28:/489 call s:ReportOnce(v:exception)490 let s:no_support = 1491 unlet! g:java_ignore_markdown492 let g:java_ignore_markdown = 28493 endtry494 catch /\<E48[45]:/495 call s:ReportOnce(v:exception)496 let s:no_support = 1497 finally498 unlet! b:current_syntax499 500 if exists("s:markdown_fenced_languages_copy")501 let g:markdown_fenced_languages = s:markdown_fenced_languages_copy502 unlet s:markdown_fenced_languages_copy503 endif504 505 if exists("s:html_syntax_folding_copy")506 let g:html_syntax_folding = s:html_syntax_folding_copy507 unlet s:html_syntax_folding_copy508 endif509 510 if exists("s:no_support")511 unlet s:no_support512 unlockvar s:with_markdown513 let s:with_markdown = 0514 lockvar s:with_markdown515 hi clear markdownCode516 hi clear markdownCodeBlock517 hi clear markdownCodeDelimiter518 hi clear markdownLinkDelimiter519 endif520 endtry521 endif522 523 " HTML enables spell checking for all text that is not in a syntax524 " item (:syntax spell toplevel); instead, limit spell checking to525 " items matchable with syntax groups containing the @Spell cluster.526 try527 syntax spell default528 catch /\<E390:/529 call s:ReportOnce(v:exception)530 endtry531 532 if s:with_markdown533 exec 'syn region javaMarkdownComment start="///" skip="^\s*///.*$" end="^" keepend contains=javaMarkdownCommentTitle,javaMarkdownShortcutLink,@javaMarkdown,@javaDocTags,javaTodo,@Spell nextgroup=javaMarkdownCommentTitle ' . s:ff.QueryFoldArgForSyntaxItems('d')534 syn match javaMarkdownCommentMask contained "^\s*///"535 exec 'syn region javaMarkdownCommentTitle contained matchgroup=javaMarkdownComment start="\%(///.*\r\=\n\s*\)\@' . s:ff.PeekFor('javaMarkdownCommentTitle', 120) . '<!///" matchgroup=javaMarkdownCommentTitle end="\.$" end="\.[ \t\r]\@=" end="\n\%(\s*///\s*$\)\@=" end="\%(^\s*///\s*\)\@' . s:ff.PeekFor('javaMarkdownCommentTitle', 120) . '<=@"me=s-2,he=s-1 contains=javaMarkdownShortcutLink,@javaMarkdown,javaMarkdownCommentMask,javaTodo,@Spell,@javaDocTags'536 exec 'syn region javaMarkdownCommentTitle contained matchgroup=javaMarkdownComment start="\%(///.*\r\=\n\s*\)\@' . s:ff.PeekFor('javaMarkdownCommentTitle', 120) . '<!///\s*\%({@return\>\)\@=" matchgroup=javaMarkdownCommentTitle end="}\%(\s*\.*\)*" contains=javaMarkdownShortcutLink,@javaMarkdown,javaMarkdownCommentMask,javaTodo,@Spell,@javaDocTags,javaTitleSkipBlock'537 exec 'syn region javaMarkdownCommentTitle contained matchgroup=javaMarkdownComment start="\%(///.*\r\=\n\s*\)\@' . s:ff.PeekFor('javaMarkdownCommentTitle', 120) . '<!///\s*\%({@summary\>\)\@=" matchgroup=javaMarkdownCommentTitle end="}" contains=javaMarkdownShortcutLink,@javaMarkdown,javaMarkdownCommentMask,javaTodo,@Spell,@javaDocTags,javaTitleSkipBlock'538 539 " REDEFINE THE MARKDOWN ITEMS ANCHORED WITH "^", OBSERVING THE540 " DEFINITION ORDER.541 syn match markdownLineStart contained "^\s*///\s*[<@]\@!" contains=@markdownBlock,javaMarkdownCommentTitle,javaMarkdownCommentMask nextgroup=@markdownBlock,htmlSpecialChar542 " See https://spec.commonmark.org/0.31.2/#setext-headings.543 syn match markdownH1 contained "^\s*/// \{,3}.\+\r\=\n\s*/// \{,3}=\+\s*$" contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink,javaMarkdownCommentMask544 syn match markdownH2 contained "^\s*/// \{,3}.\+\r\=\n\s*/// \{,3}-\+\s*$" contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink,javaMarkdownCommentMask545 " See https://spec.commonmark.org/0.31.2/#atx-headings.546 syn region markdownH1 contained matchgroup=markdownH1Delimiter start=" \{,3}#\s" end="#*\s*$" keepend contains=@markdownInline,markdownAutomaticLink oneline547 syn region markdownH2 contained matchgroup=markdownH2Delimiter start=" \{,3}##\s" end="#*\s*$" keepend contains=@markdownInline,markdownAutomaticLink oneline548 syn match markdownHeadingRule contained "^\s*/// \{,3}[=-]\+\s*$" contains=javaMarkdownCommentMask549 " See https://spec.commonmark.org/0.31.2/#thematic-breaks.550 syn match markdownRule contained "^\s*/// \{,3}\*\s*\*\%(\s*\*\)\+\s*$" contains=javaMarkdownCommentMask551 syn match markdownRule contained "^\s*/// \{,3}_\s*_\%(\s*_\)\+\s*$" contains=javaMarkdownCommentMask552 syn match markdownRule contained "^\s*/// \{,3}-\s*-\%(\s*-\)\+\s*$" contains=javaMarkdownCommentMask553 " See https://spec.commonmark.org/0.31.2/#indented-code-blocks.554 syn region markdownCodeBlock contained start="^\s*///\%( \{4,}\|\t\)" end="^\ze\s*///\%(\s*$\| \{,3}\S\)" keepend contains=javaMarkdownCommentMask555 " See https://spec.commonmark.org/0.31.2/#code-spans.556 syn region markdownCode contained matchgroup=markdownCodeDelimiter start="\z(`\+\) \=" end=" \=\z1" keepend contains=markdownLineStart,javaMarkdownCommentMask557 " See https://spec.commonmark.org/0.31.2/#fenced-code-blocks.558 syn region markdownCodeBlock contained start="^\s*/// \{,3}\z(```\+\)\%(.\{-}[^`]`\)\@!" end="^\s*/// \{,3}\z1`*" keepend contains=javaMarkdownCommentMask559 syn region markdownCodeBlock contained start="^\s*/// \{,3}\z(\~\~\~\+\)" end="^\s*/// \{,3}\z1\~*" keepend contains=javaMarkdownCommentMask560 " See https://spec.commonmark.org/0.31.2/#link-reference-definitions.561 syn region markdownIdDeclaration contained matchgroup=markdownLinkDelimiter start="^\s*/// \{,3\}!\=\[" end="\]:" keepend contains=javaMarkdownCommentMask nextgroup=markdownUrl oneline skipwhite562 " See https://spec.commonmark.org/0.31.2/#link-label.563 syn region markdownId contained matchgroup=markdownIdDelimiter start="\[\%([\t ]\]\)\@!" end="\]" contains=javaMarkdownSkipBrackets,javaMarkdownCommentMask564 " Note that escaped brackets can be unbalanced.565 syn match javaMarkdownSkipBrackets contained transparent "\\\[\|\\\]"566 " See https://spec.commonmark.org/0.31.2/#shortcut-reference-link.567 syn region javaMarkdownShortcutLink contained matchgroup=markdownLinkTextDelimiter start="!\=\[^\@!\%(\_[^][]*\%(\[\_[^][]*\]\_[^][]*\)*]\%([[(]\)\@!\)\@=" end="\]\%([[(]\)\@!" contains=@markdownInline,markdownLineStart,javaMarkdownSkipBrackets,javaMarkdownCommentMask nextgroup=markdownLink,markdownId skipwhite568 569 for s:name in ['markdownFootnoteDefinition', 'markdownFootnote']570 if hlexists(s:name)571 exec 'syn clear ' . s:name572 endif573 endfor574 575 unlet s:name576 577 " COMBAK: Footnotes are recognised by "markdown.vim", but are not578 " in CommonMark. See https://pandoc.org/MANUAL.html#footnotes.579""""syn match markdownFootnoteDefinition contained "^\s*///\s*\[^[^\]]\+\]:" contains=javaMarkdownCommentMask580 581 hi def link javaMarkdownComment Comment582 hi def link javaMarkdownCommentMask javaMarkdownComment583 hi def link javaMarkdownCommentTitle SpecialComment584 hi def link javaMarkdownShortcutLink htmlLink585 endif586 587 if s:with_html588 exec 'syn region javaDocComment start="/\*\*" end="\*/" keepend contains=javaCommentTitle,@javaHtml,@javaDocTags,javaTodo,javaCommentError,javaSpaceError,@Spell ' . s:ff.QueryFoldArgForSyntaxItems('d')589 exec 'syn region javaCommentTitle contained matchgroup=javaDocComment start="/\*\*" matchgroup=javaCommentTitle end="\.$" end="\.[ \t\r]\@=" end="\%(^\s*\**\s*\)\@' . s:ff.PeekFor('javaCommentTitle', 120) . '<=@"me=s-2,he=s-1 end="\*/"me=s-1,he=s-1 contains=@javaHtml,javaCommentStar,javaTodo,javaCommentError,javaSpaceError,@Spell,@javaDocTags'590 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,javaTitleSkipBlock591 syn region javaCommentTitle contained matchgroup=javaDocComment start="/\*\*\s*\r\=\n\=\s*\**\s*\%({@summary\>\)\@=" matchgroup=javaCommentTitle end="}" contains=@javaHtml,javaCommentStar,javaTodo,javaCommentError,javaSpaceError,@Spell,@javaDocTags,javaTitleSkipBlock592 hi def link javaDocComment Comment593 hi def link javaCommentTitle SpecialComment594 endif595 596 " The members of javaDocTags are sub-grouped according to the Java597 " version of their introduction, and sub-group members in turn are598 " arranged in alphabetical order, so that future newer members can599 " be pre-sorted and appended without disturbing the current member600 " placement.601 " Since they only have significance in javaCommentTitle, neither602 " javaDocSummaryTag nor javaDocReturnTitleTag are defined.603 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,javaDocSpecTag604 605 " Anticipate non-standard inline tags in {@return} and {@summary}.606 syn region javaTitleSkipBlock contained transparent start="{\%(@\%(return\|summary\)\>\)\@!" end="}"607 syn match javaDocDocRootTag contained "{@docRoot}"608 syn match javaDocInheritDocTag contained "{@inheritDoc}"609 syn region javaIndexSkipBlock contained transparent start="{\%(@index\>\)\@!" end="}" contains=javaIndexSkipBlock,javaDocIndexTag610 syn region javaDocIndexTag contained start="{@index\>" end="}" contains=javaDocIndexTag,javaIndexSkipBlock611 syn region javaLinkSkipBlock contained transparent start="{\%(@link\>\)\@!" end="}" contains=javaLinkSkipBlock,javaDocLinkTag612 syn region javaDocLinkTag contained start="{@link\>" end="}" contains=javaDocLinkTag,javaLinkSkipBlock613 syn region javaLinkplainSkipBlock contained transparent start="{\%(@linkplain\>\)\@!" end="}" contains=javaLinkplainSkipBlock,javaDocLinkplainTag614 syn region javaDocLinkplainTag contained start="{@linkplain\>" end="}" contains=javaDocLinkplainTag,javaLinkplainSkipBlock615 syn region javaLiteralSkipBlock contained transparent start="{\%(@literal\>\)\@!" end="}" contains=javaLiteralSkipBlock,javaDocLiteralTag616 syn region javaDocLiteralTag contained start="{@literal\>" end="}" contains=javaDocLiteralTag,javaLiteralSkipBlock617 syn region javaSystemPropertySkipBlock contained transparent start="{\%(@systemProperty\>\)\@!" end="}" contains=javaSystemPropertySkipBlock,javaDocSystemPropertyTag618 syn region javaDocSystemPropertyTag contained start="{@systemProperty\>" end="}" contains=javaDocSystemPropertyTag,javaSystemPropertySkipBlock619 syn region javaValueSkipBlock contained transparent start="{\%(@value\>\)\@!" end="}" contains=javaValueSkipBlock,javaDocValueTag620 syn region javaDocValueTag contained start="{@value\>" end="}" contains=javaDocValueTag,javaValueSkipBlock621 622 syn match javaDocParam contained "\s\zs\S\+"623 syn match javaDocExceptionTag contained "@exception\s\+\S\+" contains=javaDocParam624 syn match javaDocParamTag contained "@param\s\+\S\+" contains=javaDocParam625 syn match javaDocSinceTag contained "@since\s\+\S\+" contains=javaDocParam626 syn match javaDocThrowsTag contained "@throws\s\+\S\+" contains=javaDocParam627 syn match javaDocSpecTag contained "@spec\_s\+\S\+\ze\_s\+\S\+" contains=javaDocParam628 629 syn match javaDocAuthorTag contained "@author\>"630 syn match javaDocDeprecatedTag contained "@deprecated\>"631 syn match javaDocHiddenTag contained "@hidden\>"632 syn match javaDocReturnTag contained "@return\>"633 syn match javaDocSerialTag contained "@serial\>"634 syn match javaDocSerialDataTag contained "@serialData\>"635 syn match javaDocSerialFieldTag contained "@serialField\>"636 syn match javaDocVersionTag contained "@version\>"637 638 syn match javaDocSeeTag contained "@see\>\s*" nextgroup=javaDocSeeTag1,javaDocSeeTag2,javaDocSeeTag3,javaDocSeeTag4,javaDocSeeTagStar,javaDocSeeTagSlash skipwhite skipempty639 640 if s:with_html641 syn match javaDocSeeTagStar contained "^\s*\*\+\%(\s*{\=@\|/\|$\)\@!" nextgroup=javaDocSeeTag1,javaDocSeeTag2,javaDocSeeTag3,javaDocSeeTag4 skipwhite skipempty642 hi def link javaDocSeeTagStar javaDocComment643 endif644 645 if s:with_markdown646 syn match javaDocSeeTagSlash contained "^\s*///\%(\s*{\=@\|$\)\@!" nextgroup=javaDocSeeTag1,javaDocSeeTag2,javaDocSeeTag3,javaDocSeeTag4 skipwhite skipempty647 hi def link javaDocSeeTagSlash javaMarkdownComment648 endif649 650 syn match javaDocSeeTag1 contained @"\_[^"]\+"@651 syn match javaDocSeeTag2 contained @<a\s\+\_.\{-}</a>@ contains=@javaHtml extend652 exec 'syn match javaDocSeeTag3 contained @[' . s:ff.WithMarkdown('[', '') . '"< \t]\@!\%(\k\|[/.]\)*\%(##\=\k\+\%((\_[^)]*)\)\=\)\=@ nextgroup=javaDocSeeTag3Label skipwhite skipempty'653 syn match javaDocSeeTag3Label contained @\k\%(\k\+\s*\)*$@654 655 " COMBAK: No support for type javaDocSeeTag2 in Markdown.656""if s:with_markdown657"" syn match javaDocSeeTag4 contained @\[.\+\]\s\=\%(\[.\+\]\|(.\+)\)@ contains=@javaMarkdown extend658"" hi def link javaDocSeeTag4 Special659""endif660 661 syn region javaCodeSkipBlock contained transparent start="{\%(@code\>\)\@!" end="}" contains=javaCodeSkipBlock,javaDocCodeTag662 syn region javaDocCodeTag contained start="{@code\>" end="}" contains=javaDocCodeTag,javaCodeSkipBlock663 664 exec 'syn region javaDocSnippetTagAttr contained transparent matchgroup=javaHtmlArg start=/\<\%(class\|file\|id\|lang\|region\)\%(\s*=\)\@=/ matchgroup=javaHtmlString end=/:$/ end=/\%(=\s*\)\@' . s:ff.PeekFor('javaDocSnippetTagAttr', 80) . '<=\%("[^"]\+"\|' . "\x27[^\x27]\\+\x27" . '\|\%([.\\/-]\|\k\)\+\)/ nextgroup=javaDocSnippetTagAttr skipwhite skipnl'665 syn region javaSnippetSkipBlock contained transparent start="{\%(@snippet\>\)\@!" end="}" contains=javaSnippetSkipBlock,javaDocSnippetTag,javaCommentMarkupTag666 syn region javaDocSnippetTag contained start="{@snippet\>" end="}" contains=javaDocSnippetTag,javaSnippetSkipBlock,javaDocSnippetTagAttr,javaCommentMarkupTag667 668 syntax case match669 hi def link javaDocParam Function670 671 hi def link javaDocAuthorTag Special672 hi def link javaDocCodeTag Special673 hi def link javaDocDeprecatedTag Special674 hi def link javaDocDocRootTag Special675 hi def link javaDocExceptionTag Special676 hi def link javaDocHiddenTag Special677 hi def link javaDocIndexTag Special678 hi def link javaDocInheritDocTag Special679 hi def link javaDocLinkTag Special680 hi def link javaDocLinkplainTag Special681 hi def link javaDocLiteralTag Special682 hi def link javaDocParamTag Special683 hi def link javaDocReturnTag Special684 hi def link javaDocSeeTag Special685 hi def link javaDocSeeTag1 String686 hi def link javaDocSeeTag2 Special687 hi def link javaDocSeeTag3 Function688 hi def link javaDocSerialTag Special689 hi def link javaDocSerialDataTag Special690 hi def link javaDocSerialFieldTag Special691 hi def link javaDocSinceTag Special692 hi def link javaDocSnippetTag Special693 hi def link javaDocSpecTag Special694 hi def link javaDocSystemPropertyTag Special695 hi def link javaDocThrowsTag Special696 hi def link javaDocValueTag Special697 hi def link javaDocVersionTag Special698endif699 700" match the special comment /**/701syn match javaComment "/\*\*/"702 703" Strings and constants704syn match javaSpecialError contained "\\."705syn match javaSpecialCharError contained "[^']"706" Escape Sequences (JLS-17, §3.10.7):707syn match javaSpecialChar contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"708syn region javaString start=+"+ end=+"+ end=+$+ contains=javaSpecialChar,javaSpecialError,@Spell709syn region javaString start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecialChar,javaSpecialError,javaTextBlockError,@Spell710syn match javaTextBlockError +"""\s*"""+711 712if s:ff.IsAnyRequestedPreviewFeatureOf([430])713 syn region javaStrTemplEmbExp contained matchgroup=javaStrTempl start="\\{" end="}" contains=TOP,javaImportDeclBlock714 exec 'syn region javaStrTempl start=+\%(\.[[:space:]\n]*\)\@' . s:ff.PeekFor('javaStrTempl', 80) . '<="+ end=+"+ contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,@Spell'715 exec 'syn region javaStrTempl start=+\%(\.[[:space:]\n]*\)\@' . s:ff.PeekFor('javaStrTempl', 80) . '<="""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,javaTextBlockError,@Spell'716 hi def link javaStrTempl Macro717endif718 719syn match javaCharacter "'[^']*'" contains=javaSpecialChar,javaSpecialCharError720syn match javaCharacter "'\\''" contains=javaSpecialChar721syn match javaCharacter "'[^\\]'"722" Integer literals (JLS-17, §3.10.1):723syn keyword javaNumber 0 0l 0L724syn match javaNumber "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"725" Decimal floating-point literals (JLS-17, §3.10.2):726" Against "\<\d\+\>\.":727syn match javaNumber "\<\d\%(_*\d\)*\."728syn match javaNumber "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"729syn match javaNumber "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"730syn match javaNumber "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"731" Hexadecimal floating-point literals (JLS-17, §3.10.2):732syn match javaNumber "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"733 734" Unicode characters735syn match javaSpecial "\\u\x\x\x\x"736 737" Method declarations (JLS-17, §8.4.3, §8.4.4, §9.4).738if exists("g:java_highlight_functions")739 syn cluster javaFuncParams contains=javaAnnotation,@javaClasses,javaGenerics,javaType,javaVarArg,javaComment,javaLineComment740 741 if exists("g:java_highlight_signature")742 syn cluster javaFuncParams add=javaParamModifier743 hi def link javaFuncDefStart javaFuncDef744 else745 syn cluster javaFuncParams add=javaScopeDecl,javaConceptKind,javaStorageClass,javaExternal,javaTypeParamSection746 endif747 748 if g:java_highlight_functions =~# '^indent[1-8]\=$'749 let s:last = g:java_highlight_functions[-1 :]750 let s:indent = s:last != 't' ? repeat("\x20", s:last) : "\t"751 " Try to not match other type members, initialiser blocks, enum752 " constants (JLS-17, §8.9.1), and constructors (JLS-17, §8.1.7):753 " at any _conventional_ indentation, skip over all fields with754 " "[^=]*", all records with "\<record\s", and let the "*Skip*"755 " definitions take care of constructor declarations and enum756 " constants (with no support for @Foo(value = "bar")). Also,757 " reject inlined declarations with "[^{;]" for signature.758 exec 'syn region javaFuncDef ' . s:ff.GroupArgs('transparent matchgroup=javaFuncDefStart', '') . ' start="' . s:ff.PeekTo('\%(', '') . '^' . s:indent . '\%(<\%(/\*.\{-}\*/\|[^(){}>]\|\n\)\+>\+\s\+\|\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)\+\)\=\%(\<\K\k*\>\.\)*\K\k*\>[^={;]*\%(\<record\)\@' . s:ff.Peek('6', '') . '<!\s' . s:ff.PeekFrom('\)\@' . s:ff.PeekFor('javaFuncDef', 120) . '<=', '') . '\K\k*\s*(" end=")" contains=@javaFuncParams'759 " As long as package-private constructors cannot be matched with760 " javaFuncDef, do not look with javaConstructorSkipDeclarator for761 " them. (Approximate "javaTypeParamSection" if necessary.)762 exec 'syn match javaConstructorSkipDeclarator transparent "^' . s:indent . '\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)*p\%(ublic\|rotected\|rivate\)\s\+\%(<\%(/\*.\{-}\*/\|[^(){}>]\|\n\)\+>\+\s\+\)\=\K\k*\s*(\@=" contains=javaAnnotation,javaScopeDecl,javaTypeParamSection,javaClassDecl,javaTypedef,javaType,@javaClasses,javaGenerics,javaComment,javaLineComment'763 " With a zero-width span for signature applicable on demand to764 " javaFuncDef, make related adjustments:765 " (1) Claim all enum constants of a line as a unit.766 exec 'syn match javaEnumSkipConstant contained transparent /^' . s:indent . '\%(\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)*\K\k*\s*\%((.*)\)\=\s*[,;({]\s*\)\+/ contains=@javaEnumConstants'767 " (2) Define javaTopEnum{Block,Declaration} for top level enums768 " and tell apart their constants from method declarations.769 syn region javaTopEnumBlock contained transparent matchgroup=javaTopEnumBlockStart start="{" end="}" contains=@javaTop,javaEnumSkipConstant770 exec 'syn match javaTopEnumDeclaration transparent /\%(^\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)*\%(p\%(ublic\|rotected\|rivate\)\s\+\)\=\%(strictfp\s\+\)\=\<enum\_s\+\)\@' . s:ff.PeekFor('javaTopEnumDeclaration', 80) . '<=\K\k*\%(\_s\+implements\_s.\+\)\=\_s*{\@=/ nextgroup=javaTopEnumBlock skipwhite skipempty'771 " (3) Define a base variant of javaParenT without using @javaTop772 " in order to not include javaFuncDef.773 syn region javaParenE transparent matchgroup=javaParen start="(" end=")" contains=@javaEnumConstants,javaInParen774 syn region javaParenE transparent matchgroup=javaParen start="\[" end="\]" contains=@javaEnumConstants775 syn cluster javaEnumConstants contains=TOP,javaTopEnumDeclaration,javaImportDeclBlock,javaFuncDef,javaParenT776 unlet s:indent s:last777 else778 " This is the "style" variant (:help ft-java-syntax).779 780 " Match arbitrarily indented camelCasedName method declarations.781 " Match: [@ɐ] [abstract] [<α, β>] Τʬ[<γ>][[][]] μʭʭ(/* ... */);782 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\+\)*\)\=\%(<' . s:vv.type_param_list . '>\s\+\)\=\%(' . s:vv.void_or_param_type . '\)\s\+' . s:ff.PeekFrom('\)\@' . s:ff.PeekFor('javaFuncDef', 120) . '<=', '') . '\<' . s:ff.LowerCase('[$_[:lower:]]', '[^A-Z0-9]') . '\k*\>\s*(/ end=/)/ skip=/\/\*.\{-}\*\/\|\/\/.*$/ contains=@javaFuncParams'783 endif784endif785 786if exists("g:java_highlight_debug")787 " Strings and constants788 syn match javaDebugSpecial contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"789 syn region javaDebugString contained start=+"+ end=+"+ contains=javaDebugSpecial790 syn region javaDebugString contained start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaDebugSpecial,javaDebugTextBlockError791 792 if s:ff.IsAnyRequestedPreviewFeatureOf([430])793 " The highlight groups of java{StrTempl,Debug{,Paren,StrTempl}}\,794 " share one colour by default. Do not conflate unrelated parens.795 syn region javaDebugStrTemplEmbExp contained matchgroup=javaDebugStrTempl start="\\{" end="}" contains=javaComment,javaLineComment,javaDebug\%(Paren\)\@!.*796 exec 'syn region javaDebugStrTempl contained start=+\%(\.[[:space:]\n]*\)\@' . s:ff.PeekFor('javaDebugStrTempl', 80) . '<="+ end=+"+ contains=javaDebugStrTemplEmbExp,javaDebugSpecial'797 exec 'syn region javaDebugStrTempl contained start=+\%(\.[[:space:]\n]*\)\@' . s:ff.PeekFor('javaDebugStrTempl', 80) . '<="""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaDebugStrTemplEmbExp,javaDebugSpecial,javaDebugTextBlockError'798 hi def link javaDebugStrTempl Macro799 endif800 801 syn match javaDebugTextBlockError contained +"""\s*"""+802 syn match javaDebugCharacter contained "'[^\\]'"803 syn match javaDebugSpecialCharacter contained "'\\.'"804 syn match javaDebugSpecialCharacter contained "'\\''"805 syn keyword javaDebugNumber contained 0 0l 0L806 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\."807 syn match javaDebugNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"808 syn match javaDebugNumber contained "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"809 syn match javaDebugNumber contained "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"810 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"811 syn match javaDebugNumber contained "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"812 syn keyword javaDebugBoolean contained true false813 syn keyword javaDebugType contained null this super814 syn region javaDebugParen contained start=+(+ end=+)+ contains=javaDebug.*,javaDebugParen815 816 " To make this work, define the highlighting for these groups.817 syn match javaDebug "\<System\.\%(out\|err\)\.print\%(ln\)\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen818" FIXME: What API does "p" belong to?819" syn match javaDebug "\<p\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen820 syn match javaDebug "\<\K\k*\.printStackTrace\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen821" FIXME: What API do "trace*" belong to?822" syn match javaDebug "\<trace[SL]\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen823 824 hi def link javaDebug Debug825 hi def link javaDebugString DebugString826 hi def link javaDebugTextBlockError Error827 hi def link javaDebugType DebugType828 hi def link javaDebugBoolean DebugBoolean829 hi def link javaDebugNumber Debug830 hi def link javaDebugSpecial DebugSpecial831 hi def link javaDebugSpecialCharacter DebugSpecial832 hi def link javaDebugCharacter DebugString833 hi def link javaDebugParen Debug834 835 hi def link DebugString String836 hi def link DebugSpecial Special837 hi def link DebugBoolean Boolean838 hi def link DebugType Type839endif840 841" Complement javaBlock and javaInParen for highlighting.842syn region javaBlockOther transparent matchgroup=javaBlockOtherStart start="{" end="}"843 844" Try not to fold top-level-type bodies under assumption that there is845" but one such body.846exec 'syn region javaBlock transparent matchgroup=javaBlockStart start="\%(^\|^\S[^:]\+\)\@' . s:ff.PeekFor('javaBlock', 120) . '<!{" end="}" ' . s:ff.QueryFoldArgForSyntaxItems('b')847 848" See "D.2.1 Anonymous Classes" at849" https://web.archive.org/web/20010821025330/java.sun.com/docs/books/jls/first_edition/html/1.1Update.html#12959.850if exists("g:java_mark_braces_in_parens_as_errors")851 syn match javaInParen contained "[{}]"852 hi def link javaInParen javaError853endif854 855" catch errors caused by wrong parenthesis856syn region javaParenT transparent matchgroup=javaParen start="(" end=")" contains=@javaTop,javaInParen,javaParenT1857syn region javaParenT1 contained transparent matchgroup=javaParen1 start="(" end=")" contains=@javaTop,javaInParen,javaParenT2858syn region javaParenT2 contained transparent matchgroup=javaParen2 start="(" end=")" contains=@javaTop,javaInParen,javaParenT859syn match javaParenError ")"860" catch errors caused by wrong square parenthesis861syn region javaParenT transparent matchgroup=javaParen start="\[" end="\]" contains=@javaTop,javaParenT1862syn region javaParenT1 contained transparent matchgroup=javaParen1 start="\[" end="\]" contains=@javaTop,javaParenT2863syn region javaParenT2 contained transparent matchgroup=javaParen2 start="\[" end="\]" contains=@javaTop,javaParenT864syn match javaParenError "\]"865 866" Lambda expressions (JLS-17, §15.27) and method reference expressions867" (JLS-17, §15.13).868if exists("g:java_highlight_functions")869 syn match javaMethodRef ":::\@!"870 871 if exists("g:java_highlight_signature")872 let s:ff.LambdaDef = s:ff.LeftConstant873 else874 let s:ff.LambdaDef = s:ff.RightConstant875 endif876 877 " Make ()-matching definitions after the parenthesis error catcher.878 "879 " Note that here and elsewhere a single-line token is used for \z,880 " with other tokens repeated as necessary, to overcome the lack of881 " support for multi-line matching with \z.882 "883 " Match: ([@A [@B ...] final] var a[, var b, ...]) ->884 " | ([@A [@B ...] final] T[<α>][[][]] a[, T b, ...]) ->885 " Expressions interspersed with comments are not recognised.886 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*\>\%(<\%([^(){}]\|\n\)\+[[: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'887 " Match: () ->888 " | (a[, b, ...]) ->889 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/', '->"')890 " Match: a ->891 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]*->"')892 893 syn keyword javaParamModifier contained final894 syn keyword javaLambdaVarType contained var895 hi def link javaParamModifier javaConceptKind896 hi def link javaLambdaVarType javaOperator897 hi def link javaLambdaDef javaFuncDef898 hi def link javaLambdaDefStart javaFuncDef899 hi def link javaMethodRef javaFuncDef900 hi def link javaFuncDef Function901endif902 903" The @javaTop cluster comprises non-contained Java syntax groups.904" Note that the syntax file "aidl.vim" relies on its availability.905syn cluster javaTop contains=TOP,javaTopEnumDeclaration906 907if !exists("g:java_minlines")908 let g:java_minlines = 10909endif910 911" Note that variations of a /*/ balanced comment, e.g., /*/*/, /*//*/,912" /* /*/, /* /*/, etc., may have their rightmost /*/ part accepted913" as a comment start by ':syntax sync ccomment'; consider alternatives914" to make synchronisation start further towards file's beginning by915" bumping up g:java_minlines or issuing ':syntax sync fromstart' or916" preferring &foldmethod set to 'syntax'.917exec "syn sync ccomment javaComment minlines=" . g:java_minlines918 919" The default highlighting.920hi def link javaVarArg Function921hi def link javaBranch Conditional922hi def link javaConditional Conditional923hi def link javaRepeat Repeat924hi def link javaExceptions Exception925hi def link javaAssert Statement926hi def link javaStorageClass StorageClass927hi def link javaMethodDecl javaStorageClass928hi def link javaClassDecl javaStorageClass929hi def link javaScopeDecl javaStorageClass930hi def link javaConceptKind javaStorageClass931 932hi def link javaBoolean Boolean933hi def link javaSpecial Special934hi def link javaSpecialError Error935hi def link javaSpecialCharError Error936hi def link javaString String937hi def link javaCharacter Character938hi def link javaSpecialChar SpecialChar939hi def link javaNumber Number940hi def link javaError Error941hi def link javaError2 javaError942hi def link javaTextBlockError Error943hi def link javaParenError javaError944hi def link javaStatement Statement945hi def link javaOperator Operator946hi def link javaConstant Constant947hi def link javaTypedef Typedef948hi def link javaTodo Todo949hi def link javaAnnotation PreProc950hi def link javaAnnotationStart javaAnnotation951hi def link javaType Type952hi def link javaExternal Include953hi def link javaModuleImport Statement954 955hi def link javaUserLabel Label956hi def link javaUserLabelRef javaUserLabel957hi def link javaLabel Label958hi def link javaLabelDefault javaLabel959hi def link javaLabelVarType javaOperator960 961hi def link javaComment Comment962hi def link javaCommentStar javaComment963hi def link javaLineComment Comment964hi def link javaCommentMarkupTagAttr javaHtmlArg965hi def link javaCommentString javaString966hi def link javaComment2String javaString967hi def link javaCommentCharacter javaCharacter968hi def link javaCommentError javaError969hi def link javaCommentStart javaComment970 971hi def link javaHtmlArg Type972hi def link javaHtmlString String973 974let b:current_syntax = "java"975 976if g:main_syntax == 'java'977 unlet g:main_syntax978endif979 980if exists("s:clear_java_ignore_html")981 unlet! s:clear_java_ignore_html g:java_ignore_html982endif983 984if exists("s:clear_java_ignore_markdown")985 unlet! s:clear_java_ignore_markdown g:java_ignore_markdown986endif987 988let b:spell_options = "contained"989let &cpo = s:cpo_save990unlet s:cpo_save s:ff s:vv s:with_html s:with_markdown991 992" See ":help vim9-mix".993if !has("vim9script")994 finish995endif996 997if exists("g:java_foldtext_show_first_or_second_line")998 def! s:LazyPrefix(prefix: string, dashes: string, count: number): string999 return empty(prefix)1000 ? printf('+-%s%3d lines: ', dashes, count)1001 : prefix1002 enddef1003 1004 def! s:JavaSyntaxFoldTextExpr(): string1005 # Piggyback on NGETTEXT.1006 const summary: string = foldtext()1007 return getline(v:foldstart) !~ '/\*\+\s*$'1008 ? summary1009 : LazyPrefix(matchstr(summary, '^+-\+\s*\d\+\s.\{-1,}:\s'),1010 v:folddashes,1011 (v:foldend - v:foldstart + 1)) ..1012 getline(v:foldstart + 1)1013 enddef1014 1015 setlocal foldtext=s:JavaSyntaxFoldTextExpr()1016 delfunction! g:JavaSyntaxFoldTextExpr1017endif1018" vim: fdm=syntax sw=2 ts=8 noet sta1019 