neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

java.vim (56831B)


      1 " Vim syntax file
      2 " 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
      6 " Last Change:		2026 Feb 06
      7 
      8 " Please check ":help java.vim" for comments on some of the options
      9 " available.
     10 
     11 " Do not aggregate syntax items from circular inclusion.
     12 if exists("b:current_syntax")
     13  finish
     14 endif
     15 
     16 if exists("g:main_syntax")
     17  " Reject attendant circularity for every :syn-included syntax file,
     18  " but ACCEPT FAILURE when "g:main_syntax" is set to "java".
     19  if g:main_syntax == 'html'
     20    if !exists("g:java_ignore_html")
     21      let g:java_ignore_html = 1
     22      let s:clear_java_ignore_html = 1
     23    endif
     24  elseif g:main_syntax == 'markdown'
     25    if !exists("g:java_ignore_markdown")
     26      let g:java_ignore_markdown = 1
     27      let s:clear_java_ignore_markdown = 1
     28    endif
     29  endif
     30 else
     31  " Allow syntax files that include this file test for its inclusion.
     32  let g:main_syntax = 'java'
     33 endif
     34 
     35 let s:cpo_save = &cpo
     36 set cpo&vim
     37 
     38 """" STRIVE TO REMAIN COMPATIBLE FOR AT LEAST VIM 7.0.
     39 let s:ff = {}
     40 let s:vv = {}
     41 let s:vv.ignore_folding = get(g:, 'java_ignore_folding', '')
     42 
     43 function! s:ff.LeftConstant(x, y) abort
     44  return a:x
     45 endfunction
     46 
     47 function! s:ff.RightConstant(x, y) abort
     48  return a:y
     49 endfunction
     50 
     51 if !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')
     58 else
     59  function! s:ff.IsAnyRequestedPreviewFeatureOf(dummy) abort
     60    return 0
     61  endfunction
     62 endif
     63 
     64 function! s:ff.QueryFoldArgForSyntaxItems(kind) abort
     65  return stridx(s:vv.ignore_folding, a:kind) < 0 ? "fold" : ""
     66 endfunction
     67 
     68 if !exists("*s:ReportOnce")
     69  function s:ReportOnce(message) abort
     70    echomsg 'syntax/java.vim: ' . a:message
     71  endfunction
     72 else
     73  function! s:ReportOnce(dummy)
     74  endfunction
     75 endif
     76 
     77 if exists("g:java_foldtext_show_first_or_second_line")
     78  function! s:LazyPrefix(prefix, dashes, count) abort
     79    return empty(a:prefix)
     80      \ ? printf('+-%s%3d lines: ', a:dashes, a:count)
     81      \ : a:prefix
     82  endfunction
     83 
     84  function! JavaSyntaxFoldTextExpr() abort
     85    " Piggyback on NGETTEXT.
     86    let summary = foldtext()
     87    return getline(v:foldstart) !~ '/\*\+\s*$'
     88      \ ? summary
     89      \ : s:LazyPrefix(matchstr(summary, '^+-\+\s*\d\+\s.\{-1,}:\s'),
     90 		\ v:folddashes,
     91 		\ (v:foldend - v:foldstart + 1)) .
     92   \ getline(v:foldstart + 1)
     93  endfunction
     94 
     95  " E120 for "fdt=s:JavaSyntaxFoldTextExpr()" before v8.2.3900.
     96  setlocal foldtext=JavaSyntaxFoldTextExpr()
     97 endif
     98 
     99 " Admit the ASCII dollar sign to keyword characters (JLS-17, §3.8):
    100 try
    101  exec 'syntax iskeyword ' . &l:iskeyword . ',$'
    102 catch /\<E410:/
    103  call s:ReportOnce(v:exception)
    104  setlocal iskeyword+=$
    105 endtry
    106 
    107 " some characters that cannot be in a java program (outside a string)
    108 syn match javaError "[\\@`]"
    109 syn match javaError "<<<\|\.\.\|=>\|||=\|&&=\|\*\/"
    110 
    111 " use separate name so that it can be deleted in javacc.vim
    112 syn match   javaError2 "#\|=<"
    113 
    114 " Keywords (JLS-17, §3.9):
    115 syn keyword javaExternal	native package
    116 syn match   javaExternal	"\<import\>\%(\s\+static\>\)\="
    117 syn keyword javaError		goto const
    118 syn keyword javaConditional	if else switch
    119 syn keyword javaRepeat		while for do
    120 syn keyword javaBoolean		true false
    121 syn keyword javaConstant	null
    122 syn keyword javaTypedef		this super
    123 syn keyword javaOperator	new instanceof
    124 syn match   javaOperator	"\<var\>\%(\s*(\)\@!"
    125 
    126 " Module imports can be used in any source file.
    127 syn match   javaExternal	"\<import\s\+module\>" contains=javaModuleImport
    128 syn keyword javaModuleImport	contained module
    129 
    130 if !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 fold
    133 endif
    134 
    135 " Since the yield statement, which could take a parenthesised operand,
    136 " and _qualified_ yield methods get along within the switch block
    137 " (JLS-17, §3.8), it seems futile to make a region definition for this
    138 " 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 match
    141 " neither a method reference nor a qualified method invocation.
    142 try
    143  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) abort
    147      return string(max([0, get(g:java_lookbehind_byte_counts, a:item, a:count)]))
    148    endfunction
    149  else
    150    syn match  javaOperator	"\%(\%(::\|\.\)[[:space:]\n]*\)\@80<!\<yield\>"
    151 
    152    function! s:ff.PeekFor(dummy, count) abort
    153      return string(a:count)
    154    endfunction
    155  endif
    156 
    157  let s:ff.Peek = s:ff.LeftConstant
    158 catch /\<E59:/
    159  call s:ReportOnce(v:exception)
    160  syn match  javaOperator	"\%(\%(::\|\.\)[[:space:]\n]*\)\@<!\<yield\>"
    161 
    162  function! s:ff.PeekFor(dummy_a, dummy_b) abort
    163    return ""
    164  endfunction
    165 
    166  let s:ff.Peek = s:ff.RightConstant
    167 endtry
    168 
    169 syn keyword javaType		boolean char byte short int long float double
    170 syn keyword javaType		void
    171 syn keyword javaStatement	return
    172 syn keyword javaStorageClass	static synchronized transient volatile strictfp
    173 syn keyword javaExceptions	throw try catch finally
    174 syn keyword javaAssert		assert
    175 syn keyword javaMethodDecl	throws
    176 " Differentiate a "MyClass.class" literal from the keyword "class".
    177 syn match   javaTypedef		"\.\s*\<class\>"ms=s+1
    178 syn keyword javaClassDecl	enum extends implements interface
    179 syn match   javaClassDecl	"\<permits\>\%(\s*(\)\@!"
    180 syn match   javaClassDecl	"\<record\>\%(\s*(\)\@!"
    181 syn match   javaClassDecl	"^class\>"
    182 syn match   javaClassDecl	"[^.]\s*\<class\>"ms=s+1
    183 syn match   javaAnnotation	"@\%(\K\k*\.\)*\K\k*\>"
    184 syn region  javaAnnotation	transparent matchgroup=javaAnnotationStart start=/@\%(\K\k*\.\)*\K\k*(/ end=/)/ skip=/\/\*.\{-}\*\/\|\/\/.*$/ contains=javaAnnotation,javaParenT,javaBlock,javaString,javaBoolean,javaNumber,javaTypedef,javaComment,javaLineComment
    185 syn match   javaClassDecl	"@interface\>"
    186 syn keyword javaBranch		break continue nextgroup=javaUserLabelRef skipwhite
    187 syn match   javaUserLabelRef	contained "\k\+"
    188 syn match   javaVarArg		"\.\.\."
    189 syn keyword javaScopeDecl	public protected private
    190 syn keyword javaConceptKind	abstract final
    191 syn match   javaConceptKind	"\<non-sealed\>"
    192 syn match   javaConceptKind	"\<sealed\>\%(\s*(\)\@!"
    193 syn match   javaConceptKind	"\<default\>\%(\s*\%(:\|->\)\)\@!"
    194 
    195 if !(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)
    198 else
    199  " 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)
    202 endif
    203 
    204 if exists("g:java_highlight_signature")
    205  let [s:ff.PeekTo, s:ff.PeekFrom, s:ff.GroupArgs] = repeat([s:ff.LeftConstant], 3)
    206 else
    207  let [s:ff.PeekTo, s:ff.PeekFrom, s:ff.GroupArgs] = repeat([s:ff.RightConstant], 3)
    208 endif
    209 
    210 let s:with_html = !exists("g:java_ignore_html")
    211 let s:with_markdown = !exists("g:java_ignore_markdown")
    212 lockvar s:with_html s:with_markdown
    213 
    214 " Note that the delimiting angle brackets are omitted.
    215 let s:vv.type_param_list = '\%([^(){}]\|\n\)\+[[:space:]-]\@' . s:ff.Peek('1', '') . '<!'
    216 " COMBAK: Revisit reference types once JDK-8259731 and JDK-8316779
    217 " will have been resolved.
    218 let 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.
    220 let s:vv.void_or_param_type = 'void\|\%(' . printf(s:vv.param_type_head, '\%(') . '\%(<' . s:vv.type_param_list . '>\.\=\)\=\)\+\)\%(\[\]\)*'
    221 let 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 arbitrary
    226 " file extension (or no extension at all) so that more than one such
    227 " declaration for the same Java module can be maintained for modular
    228 " testing in a project without attendant confusion for IDEs, with the
    229 " ".java\=" extension used for a production version and an arbitrary
    230 " extension used for a testing version.
    231 if fnamemodify(bufname("%"), ":t") =~ '^module-info\>\%(\.class\>\)\@!'
    232  syn keyword javaModuleStorageClass	module transitive
    233  syn keyword javaModuleStmt		open requires exports opens uses provides
    234  syn keyword javaModuleExternal	to with
    235  hi def link javaModuleStorageClass	StorageClass
    236  hi def link javaModuleStmt		Statement
    237  hi def link javaModuleExternal	Include
    238 
    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=javaDocParam
    241    syn match javaDocUsesTag		contained "@uses\_s\+\S\+" contains=javaDocParam
    242    hi def link javaDocProvidesTag	Special
    243    hi def link javaDocUsesTag		Special
    244  endif
    245 endif
    246 
    247 if exists("g:java_highlight_java_lang_ids")
    248  let g:java_highlight_all = 1
    249 endif
    250 
    251 if 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 the
    255  " "java[CEIRX]_JavaLang" syntax groups are sub-grouped according to
    256  " the Java version of their introduction, and sub-group names are
    257  " arranged in alphabetical order, so that future newer names can be
    258  " 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 MatchException
    261  syn cluster javaClasses add=javaR_JavaLang
    262  hi def link javaR_JavaLang javaR_Java
    263  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 IO
    264  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_JavaLang
    288  hi def link javaC_JavaLang javaC_Java
    289  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
    290  syn cluster javaClasses add=javaE_JavaLang
    291  hi def link javaE_JavaLang javaE_Java
    292  syn keyword javaX_JavaLang ClassNotFoundException CloneNotSupportedException Exception IllegalAccessException InstantiationException InterruptedException NoSuchMethodException Throwable NoSuchFieldException ReflectiveOperationException
    293  syn cluster javaClasses add=javaX_JavaLang
    294  hi def link javaX_JavaLang javaX_Java
    295  syn keyword javaI_JavaLang Cloneable Runnable CharSequence Appendable Deprecated Override Readable SuppressWarnings AutoCloseable SafeVarargs FunctionalInterface ProcessHandle
    296  " 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_JavaLang
    309  hi def link javaI_JavaLang javaI_Java
    310 
    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_ javaExceptions
    318  hi def link javaR_ javaExceptions
    319  hi def link javaE_ javaExceptions
    320  hi def link javaC_ javaConstant
    321  hi def link javaI_ javaTypedef
    322 
    323  syn keyword javaLangObject getClass notify notifyAll wait
    324 
    325  " Lower the syntax priority of overridable java.lang.Object method
    326  " names for zero-width matching (define g:java_highlight_signature
    327  " 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 javaConstant
    334 
    335  " As of JDK 25, RuntimePermission is deprecated for removal
    336  "	(JDK-8353641).
    337  "	(Note that SecurityException is still not deprecated.)
    338  " As of JDK 24, SecurityManager is rendered non-functional
    339  "	(JDK-8338625).
    340  " As of JDK 21, Compiler is no more (JDK-8205129).
    341  syn keyword javaLangDeprecated Compiler SecurityManager RuntimePermission
    342 endif
    343 
    344 runtime syntax/javaid.vim
    345 
    346 " Type parameter sections (JLS-17, §4.4, §4.5).
    347 "
    348 " Note that false positives may elsewhere occur whenever an identifier
    349 " is butted against a less-than operator.  Cf. (X<Y) and (X < Y).
    350 if exists("g:java_highlight_generics")
    351  syn keyword javaWildcardBound contained extends super
    352  syn cluster javaTypeParams contains=javaAnnotation,javaWildcardBound,javaType,@javaClasses,javaComment,javaLineComment
    353 
    354  " Match sections of generic methods and constructors and their
    355  " 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  endfor
    364 
    365  unlet s:ctx
    366  hi def link javaWildcardBound	Question
    367  hi def link javaGenericsC1	Function
    368  hi def link javaGenericsC2	Type
    369  hi def link javaGenericsCX	javaGenericsC2
    370 endif
    371 
    372 if exists("g:java_space_errors")
    373  if !exists("g:java_no_trail_space_error")
    374    syn match javaSpaceError "\s\+$"
    375  endif
    376  if !exists("g:java_no_tab_space_error")
    377    syn match javaSpaceError " \+\t"me=e-1
    378  endif
    379  hi def link javaSpaceError Error
    380 endif
    381 
    382 exec 'syn match javaUserLabel "^\s*\<\K\k*\>\%(\<default\>\)\@' . s:ff.Peek('7', '') . '<!\s*::\@!"he=e-1'
    383 
    384 if s:ff.IsAnyRequestedPreviewFeatureOf([455, 488, 507])
    385  syn region  javaLabelRegion	transparent matchgroup=javaLabel start="\<case\>" matchgroup=NONE end=":\|->" contains=javaBoolean,javaNumber,javaCharacter,javaString,javaConstant,@javaClasses,javaGenerics,javaType,javaLabelDefault,javaLabelVarType,javaLabelWhenClause
    386 else
    387  syn region  javaLabelRegion	transparent matchgroup=javaLabel start="\<case\>" matchgroup=NONE end=":\|->" contains=javaLabelCastType,javaLabelNumber,javaCharacter,javaString,javaConstant,@javaClasses,javaGenerics,javaLabelDefault,javaLabelVarType,javaLabelWhenClause
    388  syn keyword javaLabelCastType	contained char byte short int
    389  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	javaType
    392  hi def link javaLabelNumber	javaNumber
    393 endif
    394 
    395 syn region  javaLabelRegion	transparent matchgroup=javaLabel start="\<default\>\%(\s*\%(:\|->\)\)\@=" matchgroup=NONE end=":\|->" oneline
    396 " Consider grouped _default_ _case_ labels, i.e.
    397 " case null, default ->
    398 " case null: default:
    399 syn keyword javaLabelDefault	contained default
    400 syn keyword javaLabelVarType	contained var
    401 " Allow for the contingency of the enclosing region not being able to
    402 " _keep_ its _end_, e.g. case ':':.
    403 syn region  javaLabelWhenClause	contained transparent matchgroup=javaLabel start="\<when\>" matchgroup=NONE end=":"me=e-1 end="->"me=e-2 contains=TOP,javaImportDeclBlock,javaExternal,javaLambdaDef
    404 
    405 " Comments
    406 syn keyword javaTodo		contained TODO FIXME XXX
    407 
    408 if exists("g:java_comment_strings")
    409  syn region  javaCommentString	contained start=+"+ end=+"+ end=+$+ end=+\*/+me=s-1,he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell
    410  syn region  javaCommentString	contained start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell,javaSpecialError,javaTextBlockError
    411  syn region  javaComment2String contained start=+"+ end=+$\|"+ contains=javaSpecial,javaSpecialChar,@Spell
    412  syn match   javaCommentCharacter contained "'\\[^']\{1,6\}'" contains=javaSpecialChar
    413  syn match   javaCommentCharacter contained "'\\''" contains=javaSpecialChar
    414  syn match   javaCommentCharacter contained "'[^\\]'"
    415  syn cluster javaCommentSpecial add=javaCommentString,javaCommentCharacter,javaNumber,javaStrTempl
    416  syn cluster javaCommentSpecial2 add=javaComment2String,javaCommentCharacter,javaNumber,javaStrTempl
    417 endif
    418 
    419 exec 'syn region javaComment matchgroup=javaCommentStart start="/\*" end="\*/" contains=@javaCommentSpecial,javaTodo,javaCommentError,javaSpaceError,@Spell ' . s:ff.QueryFoldArgForSyntaxItems('c')
    420 syn match   javaCommentStar	contained "^\s*\*[^/]"me=e-1
    421 syn match   javaCommentStar	contained "^\s*\*$"
    422 syn match   javaLineComment	"//.*" contains=@javaCommentSpecial2,javaTodo,javaCommentMarkupTag,javaSpaceError,@Spell
    423 syn match   javaCommentMarkupTag contained "@\%(end\|highlight\|link\|replace\|start\)\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
    424 syn match   javaCommentMarkupTagAttr contained "\<region\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
    425 exec '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'
    426 syn match   javaCommentError contained "/\*"me=e-1 display
    427 
    428 if !exists("g:java_ignore_javadoc") && (s:with_html || s:with_markdown) && g:main_syntax != 'jsp'
    429  " The overridable "html*" and "markdown*" default links must be
    430  " defined _before_ the inclusion of the same default links from
    431  " "html.vim" and "markdown.vim".
    432  if s:with_html || s:with_markdown
    433    hi def link htmlComment		Special
    434    hi def link htmlCommentPart		Special
    435    hi def link htmlArg			Type
    436    hi def link htmlString		String
    437  endif
    438 
    439  if s:with_markdown
    440    hi def link markdownCode		Special
    441    hi def link markdownCodeBlock	Special
    442    hi def link markdownCodeDelimiter	Special
    443    hi def link markdownLinkDelimiter	Comment
    444  endif
    445 
    446  syntax case ignore
    447 
    448  " Note that javaDocSeeTag is valid in HTML and Markdown.
    449  let s:ff.WithMarkdown = s:ff.RightConstant
    450 
    451  " Include HTML syntax coloring for Javadoc comments.
    452  if s:with_html
    453    try
    454      if exists("g:html_syntax_folding") && !exists("g:java_consent_to_html_syntax_folding")
    455 let s:html_syntax_folding_copy = g:html_syntax_folding
    456 unlet g:html_syntax_folding
    457      endif
    458 
    459      syntax include @javaHtml syntax/html.vim
    460    finally
    461      unlet! b:current_syntax
    462 
    463      if exists("s:html_syntax_folding_copy")
    464 let g:html_syntax_folding = s:html_syntax_folding_copy
    465 unlet s:html_syntax_folding_copy
    466      endif
    467    endtry
    468  endif
    469 
    470  " Include Markdown syntax coloring (v7.2.437) for Javadoc comments.
    471  if s:with_markdown
    472    try
    473      if exists("g:html_syntax_folding") && !exists("g:java_consent_to_html_syntax_folding")
    474 let s:html_syntax_folding_copy = g:html_syntax_folding
    475 unlet g:html_syntax_folding
    476      endif
    477 
    478      if !empty(get(g:, 'markdown_fenced_languages', []))
    479 let s:markdown_fenced_languages_copy = g:markdown_fenced_languages
    480 unlet g:markdown_fenced_languages
    481      endif
    482 
    483      syntax include @javaMarkdown syntax/markdown.vim
    484 
    485      try
    486 syn clear markdownId markdownLineStart markdownH1 markdownH2 markdownHeadingRule markdownRule markdownCode markdownCodeBlock markdownIdDeclaration
    487 let s:ff.WithMarkdown = s:ff.LeftConstant
    488      catch /\<E28:/
    489 call s:ReportOnce(v:exception)
    490 let s:no_support = 1
    491 unlet! g:java_ignore_markdown
    492 let g:java_ignore_markdown = 28
    493      endtry
    494    catch /\<E48[45]:/
    495      call s:ReportOnce(v:exception)
    496      let s:no_support = 1
    497    finally
    498      unlet! b:current_syntax
    499 
    500      if exists("s:markdown_fenced_languages_copy")
    501 let g:markdown_fenced_languages = s:markdown_fenced_languages_copy
    502 unlet s:markdown_fenced_languages_copy
    503      endif
    504 
    505      if exists("s:html_syntax_folding_copy")
    506 let g:html_syntax_folding = s:html_syntax_folding_copy
    507 unlet s:html_syntax_folding_copy
    508      endif
    509 
    510      if exists("s:no_support")
    511 unlet s:no_support
    512 unlockvar s:with_markdown
    513 let s:with_markdown = 0
    514 lockvar s:with_markdown
    515 hi clear markdownCode
    516 hi clear markdownCodeBlock
    517 hi clear markdownCodeDelimiter
    518 hi clear markdownLinkDelimiter
    519      endif
    520    endtry
    521  endif
    522 
    523  " HTML enables spell checking for all text that is not in a syntax
    524  " item (:syntax spell toplevel); instead, limit spell checking to
    525  " items matchable with syntax groups containing the @Spell cluster.
    526  try
    527    syntax spell default
    528  catch /\<E390:/
    529    call s:ReportOnce(v:exception)
    530  endtry
    531 
    532  if s:with_markdown
    533    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 THE
    540    " DEFINITION ORDER.
    541    syn match markdownLineStart		contained "^\s*///\s*[<@]\@!" contains=@markdownBlock,javaMarkdownCommentTitle,javaMarkdownCommentMask nextgroup=@markdownBlock,htmlSpecialChar
    542    " 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,javaMarkdownCommentMask
    544    syn match markdownH2		contained "^\s*/// \{,3}.\+\r\=\n\s*/// \{,3}-\+\s*$" contains=@markdownInline,markdownHeadingRule,markdownAutomaticLink,javaMarkdownCommentMask
    545    " 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 oneline
    547    syn region markdownH2		contained matchgroup=markdownH2Delimiter start=" \{,3}##\s" end="#*\s*$" keepend contains=@markdownInline,markdownAutomaticLink oneline
    548    syn match markdownHeadingRule	contained "^\s*/// \{,3}[=-]\+\s*$" contains=javaMarkdownCommentMask
    549    " See https://spec.commonmark.org/0.31.2/#thematic-breaks.
    550    syn match markdownRule		contained "^\s*/// \{,3}\*\s*\*\%(\s*\*\)\+\s*$" contains=javaMarkdownCommentMask
    551    syn match markdownRule		contained "^\s*/// \{,3}_\s*_\%(\s*_\)\+\s*$" contains=javaMarkdownCommentMask
    552    syn match markdownRule		contained "^\s*/// \{,3}-\s*-\%(\s*-\)\+\s*$" contains=javaMarkdownCommentMask
    553    " 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=javaMarkdownCommentMask
    555    " See https://spec.commonmark.org/0.31.2/#code-spans.
    556    syn region markdownCode		contained matchgroup=markdownCodeDelimiter start="\z(`\+\) \=" end=" \=\z1" keepend contains=markdownLineStart,javaMarkdownCommentMask
    557    " 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=javaMarkdownCommentMask
    559    syn region markdownCodeBlock	contained start="^\s*/// \{,3}\z(\~\~\~\+\)" end="^\s*/// \{,3}\z1\~*" keepend contains=javaMarkdownCommentMask
    560    " 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 skipwhite
    562    " See https://spec.commonmark.org/0.31.2/#link-label.
    563    syn region markdownId		contained matchgroup=markdownIdDelimiter start="\[\%([\t ]\]\)\@!" end="\]" contains=javaMarkdownSkipBrackets,javaMarkdownCommentMask
    564    " 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 skipwhite
    568 
    569    for s:name in ['markdownFootnoteDefinition', 'markdownFootnote']
    570      if hlexists(s:name)
    571 exec 'syn clear ' . s:name
    572      endif
    573    endfor
    574 
    575    unlet s:name
    576 
    577    " COMBAK: Footnotes are recognised by "markdown.vim", but are not
    578    " in CommonMark.  See https://pandoc.org/MANUAL.html#footnotes.
    579 """"syn match markdownFootnoteDefinition contained "^\s*///\s*\[^[^\]]\+\]:" contains=javaMarkdownCommentMask
    580 
    581    hi def link javaMarkdownComment	Comment
    582    hi def link javaMarkdownCommentMask	javaMarkdownComment
    583    hi def link javaMarkdownCommentTitle SpecialComment
    584    hi def link javaMarkdownShortcutLink htmlLink
    585  endif
    586 
    587  if s:with_html
    588    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,javaTitleSkipBlock
    591    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
    592    hi def link javaDocComment		Comment
    593    hi def link javaCommentTitle	SpecialComment
    594  endif
    595 
    596  " The members of javaDocTags are sub-grouped according to the Java
    597  " version of their introduction, and sub-group members in turn are
    598  " arranged in alphabetical order, so that future newer members can
    599  " be pre-sorted and appended without disturbing the current member
    600  " placement.
    601  " Since they only have significance in javaCommentTitle, neither
    602  " 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,javaDocSpecTag
    604 
    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,javaDocIndexTag
    610  syn region javaDocIndexTag	contained start="{@index\>" end="}" contains=javaDocIndexTag,javaIndexSkipBlock
    611  syn region javaLinkSkipBlock	contained transparent start="{\%(@link\>\)\@!" end="}" contains=javaLinkSkipBlock,javaDocLinkTag
    612  syn region javaDocLinkTag	contained start="{@link\>" end="}" contains=javaDocLinkTag,javaLinkSkipBlock
    613  syn region javaLinkplainSkipBlock contained transparent start="{\%(@linkplain\>\)\@!" end="}" contains=javaLinkplainSkipBlock,javaDocLinkplainTag
    614  syn region javaDocLinkplainTag contained start="{@linkplain\>" end="}" contains=javaDocLinkplainTag,javaLinkplainSkipBlock
    615  syn region javaLiteralSkipBlock contained transparent start="{\%(@literal\>\)\@!" end="}" contains=javaLiteralSkipBlock,javaDocLiteralTag
    616  syn region javaDocLiteralTag	contained start="{@literal\>" end="}" contains=javaDocLiteralTag,javaLiteralSkipBlock
    617  syn region javaSystemPropertySkipBlock contained transparent start="{\%(@systemProperty\>\)\@!" end="}" contains=javaSystemPropertySkipBlock,javaDocSystemPropertyTag
    618  syn region javaDocSystemPropertyTag contained start="{@systemProperty\>" end="}" contains=javaDocSystemPropertyTag,javaSystemPropertySkipBlock
    619  syn region javaValueSkipBlock	contained transparent start="{\%(@value\>\)\@!" end="}" contains=javaValueSkipBlock,javaDocValueTag
    620  syn region javaDocValueTag	contained start="{@value\>" end="}" contains=javaDocValueTag,javaValueSkipBlock
    621 
    622  syn match  javaDocParam	contained "\s\zs\S\+"
    623  syn match  javaDocExceptionTag contained "@exception\s\+\S\+" contains=javaDocParam
    624  syn match  javaDocParamTag	contained "@param\s\+\S\+" contains=javaDocParam
    625  syn match  javaDocSinceTag	contained "@since\s\+\S\+" contains=javaDocParam
    626  syn match  javaDocThrowsTag	contained "@throws\s\+\S\+" contains=javaDocParam
    627  syn match  javaDocSpecTag	contained "@spec\_s\+\S\+\ze\_s\+\S\+" contains=javaDocParam
    628 
    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 skipempty
    639 
    640  if s:with_html
    641    syn match  javaDocSeeTagStar contained "^\s*\*\+\%(\s*{\=@\|/\|$\)\@!" nextgroup=javaDocSeeTag1,javaDocSeeTag2,javaDocSeeTag3,javaDocSeeTag4 skipwhite skipempty
    642    hi def link javaDocSeeTagStar javaDocComment
    643  endif
    644 
    645  if s:with_markdown
    646    syn match  javaDocSeeTagSlash contained "^\s*///\%(\s*{\=@\|$\)\@!" nextgroup=javaDocSeeTag1,javaDocSeeTag2,javaDocSeeTag3,javaDocSeeTag4 skipwhite skipempty
    647    hi def link javaDocSeeTagSlash javaMarkdownComment
    648  endif
    649 
    650  syn match  javaDocSeeTag1	contained @"\_[^"]\+"@
    651  syn match  javaDocSeeTag2	contained @<a\s\+\_.\{-}</a>@ contains=@javaHtml extend
    652  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_markdown
    657 ""  syn match  javaDocSeeTag4	contained @\[.\+\]\s\=\%(\[.\+\]\|(.\+)\)@ contains=@javaMarkdown extend
    658 ""  hi def link javaDocSeeTag4	Special
    659 ""endif
    660 
    661  syn region javaCodeSkipBlock	contained transparent start="{\%(@code\>\)\@!" end="}" contains=javaCodeSkipBlock,javaDocCodeTag
    662  syn region javaDocCodeTag	contained start="{@code\>" end="}" contains=javaDocCodeTag,javaCodeSkipBlock
    663 
    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,javaCommentMarkupTag
    666  syn region javaDocSnippetTag	contained start="{@snippet\>" end="}" contains=javaDocSnippetTag,javaSnippetSkipBlock,javaDocSnippetTagAttr,javaCommentMarkupTag
    667 
    668  syntax case match
    669  hi def link javaDocParam		Function
    670 
    671  hi def link javaDocAuthorTag		Special
    672  hi def link javaDocCodeTag		Special
    673  hi def link javaDocDeprecatedTag	Special
    674  hi def link javaDocDocRootTag		Special
    675  hi def link javaDocExceptionTag	Special
    676  hi def link javaDocHiddenTag		Special
    677  hi def link javaDocIndexTag		Special
    678  hi def link javaDocInheritDocTag	Special
    679  hi def link javaDocLinkTag		Special
    680  hi def link javaDocLinkplainTag	Special
    681  hi def link javaDocLiteralTag		Special
    682  hi def link javaDocParamTag		Special
    683  hi def link javaDocReturnTag		Special
    684  hi def link javaDocSeeTag		Special
    685  hi def link javaDocSeeTag1		String
    686  hi def link javaDocSeeTag2		Special
    687  hi def link javaDocSeeTag3		Function
    688  hi def link javaDocSerialTag		Special
    689  hi def link javaDocSerialDataTag	Special
    690  hi def link javaDocSerialFieldTag	Special
    691  hi def link javaDocSinceTag		Special
    692  hi def link javaDocSnippetTag		Special
    693  hi def link javaDocSpecTag		Special
    694  hi def link javaDocSystemPropertyTag	Special
    695  hi def link javaDocThrowsTag		Special
    696  hi def link javaDocValueTag		Special
    697  hi def link javaDocVersionTag		Special
    698 endif
    699 
    700 " match the special comment /**/
    701 syn match   javaComment		"/\*\*/"
    702 
    703 " Strings and constants
    704 syn match   javaSpecialError	contained "\\."
    705 syn match   javaSpecialCharError contained "[^']"
    706 " Escape Sequences (JLS-17, §3.10.7):
    707 syn match   javaSpecialChar	contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
    708 syn region  javaString		start=+"+ end=+"+ end=+$+ contains=javaSpecialChar,javaSpecialError,@Spell
    709 syn region  javaString		start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecialChar,javaSpecialError,javaTextBlockError,@Spell
    710 syn match   javaTextBlockError	+"""\s*"""+
    711 
    712 if s:ff.IsAnyRequestedPreviewFeatureOf([430])
    713  syn region javaStrTemplEmbExp	contained matchgroup=javaStrTempl start="\\{" end="}" contains=TOP,javaImportDeclBlock
    714  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	Macro
    717 endif
    718 
    719 syn match   javaCharacter	"'[^']*'" contains=javaSpecialChar,javaSpecialCharError
    720 syn match   javaCharacter	"'\\''" contains=javaSpecialChar
    721 syn match   javaCharacter	"'[^\\]'"
    722 " Integer literals (JLS-17, §3.10.1):
    723 syn keyword javaNumber		0 0l 0L
    724 syn 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\+\>\.":
    727 syn match   javaNumber		"\<\d\%(_*\d\)*\."
    728 syn match   javaNumber		"\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
    729 syn match   javaNumber		"\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
    730 syn match   javaNumber		"\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
    731 " Hexadecimal floating-point literals (JLS-17, §3.10.2):
    732 syn match   javaNumber		"\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
    733 
    734 " Unicode characters
    735 syn match   javaSpecial "\\u\x\x\x\x"
    736 
    737 " Method declarations (JLS-17, §8.4.3, §8.4.4, §9.4).
    738 if exists("g:java_highlight_functions")
    739  syn cluster javaFuncParams contains=javaAnnotation,@javaClasses,javaGenerics,javaType,javaVarArg,javaComment,javaLineComment
    740 
    741  if exists("g:java_highlight_signature")
    742    syn cluster javaFuncParams add=javaParamModifier
    743    hi def link javaFuncDefStart javaFuncDef
    744  else
    745    syn cluster javaFuncParams add=javaScopeDecl,javaConceptKind,javaStorageClass,javaExternal,javaTypeParamSection
    746  endif
    747 
    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, enum
    752    " constants (JLS-17, §8.9.1), and constructors (JLS-17, §8.1.7):
    753    " at any _conventional_ indentation, skip over all fields with
    754    " "[^=]*", all records with "\<record\s", and let the "*Skip*"
    755    " definitions take care of constructor declarations and enum
    756    " 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 with
    760    " javaFuncDef, do not look with javaConstructorSkipDeclarator for
    761    " 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 to
    764    " 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 enums
    768    " and tell apart their constants from method declarations.
    769    syn region javaTopEnumBlock contained transparent matchgroup=javaTopEnumBlockStart start="{" end="}" contains=@javaTop,javaEnumSkipConstant
    770    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 @javaTop
    772    " in order to not include javaFuncDef.
    773    syn region javaParenE transparent matchgroup=javaParen start="(" end=")" contains=@javaEnumConstants,javaInParen
    774    syn region javaParenE transparent matchgroup=javaParen start="\[" end="\]" contains=@javaEnumConstants
    775    syn cluster javaEnumConstants contains=TOP,javaTopEnumDeclaration,javaImportDeclBlock,javaFuncDef,javaParenT
    776    unlet s:indent s:last
    777  else
    778    " 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  endif
    784 endif
    785 
    786 if exists("g:java_highlight_debug")
    787  " Strings and constants
    788  syn match   javaDebugSpecial		contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
    789  syn region  javaDebugString		contained start=+"+ end=+"+ contains=javaDebugSpecial
    790  syn region  javaDebugString		contained start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaDebugSpecial,javaDebugTextBlockError
    791 
    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	Macro
    799  endif
    800 
    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 0L
    806  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 false
    813  syn keyword javaDebugType		contained null this super
    814  syn region  javaDebugParen		contained start=+(+ end=+)+ contains=javaDebug.*,javaDebugParen
    815 
    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=javaDebugParen
    818 " FIXME: What API does "p" belong to?
    819 " syn match javaDebug "\<p\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
    820  syn match javaDebug "\<\K\k*\.printStackTrace\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
    821 " FIXME: What API do "trace*" belong to?
    822 " syn match javaDebug "\<trace[SL]\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
    823 
    824  hi def link javaDebug			Debug
    825  hi def link javaDebugString		DebugString
    826  hi def link javaDebugTextBlockError	Error
    827  hi def link javaDebugType		DebugType
    828  hi def link javaDebugBoolean		DebugBoolean
    829  hi def link javaDebugNumber		Debug
    830  hi def link javaDebugSpecial		DebugSpecial
    831  hi def link javaDebugSpecialCharacter	DebugSpecial
    832  hi def link javaDebugCharacter	DebugString
    833  hi def link javaDebugParen		Debug
    834 
    835  hi def link DebugString		String
    836  hi def link DebugSpecial		Special
    837  hi def link DebugBoolean		Boolean
    838  hi def link DebugType			Type
    839 endif
    840 
    841 " Complement javaBlock and javaInParen for highlighting.
    842 syn region javaBlockOther transparent matchgroup=javaBlockOtherStart start="{" end="}"
    843 
    844 " Try not to fold top-level-type bodies under assumption that there is
    845 " but one such body.
    846 exec '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" at
    849 " https://web.archive.org/web/20010821025330/java.sun.com/docs/books/jls/first_edition/html/1.1Update.html#12959.
    850 if exists("g:java_mark_braces_in_parens_as_errors")
    851  syn match javaInParen contained "[{}]"
    852  hi def link javaInParen javaError
    853 endif
    854 
    855 " catch errors caused by wrong parenthesis
    856 syn region  javaParenT	transparent matchgroup=javaParen start="(" end=")" contains=@javaTop,javaInParen,javaParenT1
    857 syn region  javaParenT1 contained transparent matchgroup=javaParen1 start="(" end=")" contains=@javaTop,javaInParen,javaParenT2
    858 syn region  javaParenT2 contained transparent matchgroup=javaParen2 start="(" end=")" contains=@javaTop,javaInParen,javaParenT
    859 syn match   javaParenError ")"
    860 " catch errors caused by wrong square parenthesis
    861 syn region  javaParenT	transparent matchgroup=javaParen start="\[" end="\]" contains=@javaTop,javaParenT1
    862 syn region  javaParenT1 contained transparent matchgroup=javaParen1 start="\[" end="\]" contains=@javaTop,javaParenT2
    863 syn region  javaParenT2 contained transparent matchgroup=javaParen2 start="\[" end="\]" contains=@javaTop,javaParenT
    864 syn match   javaParenError "\]"
    865 
    866 " Lambda expressions (JLS-17, §15.27) and method reference expressions
    867 " (JLS-17, §15.13).
    868 if exists("g:java_highlight_functions")
    869  syn match javaMethodRef ":::\@!"
    870 
    871  if exists("g:java_highlight_signature")
    872    let s:ff.LambdaDef = s:ff.LeftConstant
    873  else
    874    let s:ff.LambdaDef = s:ff.RightConstant
    875  endif
    876 
    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 of
    881  " 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 final
    894  syn keyword javaLambdaVarType contained var
    895  hi def link javaParamModifier		javaConceptKind
    896  hi def link javaLambdaVarType		javaOperator
    897  hi def link javaLambdaDef		javaFuncDef
    898  hi def link javaLambdaDefStart	javaFuncDef
    899  hi def link javaMethodRef		javaFuncDef
    900  hi def link javaFuncDef		Function
    901 endif
    902 
    903 " The @javaTop cluster comprises non-contained Java syntax groups.
    904 " Note that the syntax file "aidl.vim" relies on its availability.
    905 syn cluster javaTop contains=TOP,javaTopEnumDeclaration
    906 
    907 if !exists("g:java_minlines")
    908  let g:java_minlines = 10
    909 endif
    910 
    911 " Note that variations of a /*/ balanced comment, e.g., /*/*/, /*//*/,
    912 " /* /*/, /*  /*/, etc., may have their rightmost /*/ part accepted
    913 " as a comment start by ':syntax sync ccomment'; consider alternatives
    914 " to make synchronisation start further towards file's beginning by
    915 " bumping up g:java_minlines or issuing ':syntax sync fromstart' or
    916 " preferring &foldmethod set to 'syntax'.
    917 exec "syn sync ccomment javaComment minlines=" . g:java_minlines
    918 
    919 " The default highlighting.
    920 hi def link javaVarArg			Function
    921 hi def link javaBranch			Conditional
    922 hi def link javaConditional		Conditional
    923 hi def link javaRepeat			Repeat
    924 hi def link javaExceptions		Exception
    925 hi def link javaAssert			Statement
    926 hi def link javaStorageClass		StorageClass
    927 hi def link javaMethodDecl		javaStorageClass
    928 hi def link javaClassDecl		javaStorageClass
    929 hi def link javaScopeDecl		javaStorageClass
    930 hi def link javaConceptKind		javaStorageClass
    931 
    932 hi def link javaBoolean			Boolean
    933 hi def link javaSpecial			Special
    934 hi def link javaSpecialError		Error
    935 hi def link javaSpecialCharError	Error
    936 hi def link javaString			String
    937 hi def link javaCharacter		Character
    938 hi def link javaSpecialChar		SpecialChar
    939 hi def link javaNumber			Number
    940 hi def link javaError			Error
    941 hi def link javaError2			javaError
    942 hi def link javaTextBlockError		Error
    943 hi def link javaParenError		javaError
    944 hi def link javaStatement		Statement
    945 hi def link javaOperator		Operator
    946 hi def link javaConstant		Constant
    947 hi def link javaTypedef			Typedef
    948 hi def link javaTodo			Todo
    949 hi def link javaAnnotation		PreProc
    950 hi def link javaAnnotationStart		javaAnnotation
    951 hi def link javaType			Type
    952 hi def link javaExternal		Include
    953 hi def link javaModuleImport		Statement
    954 
    955 hi def link javaUserLabel		Label
    956 hi def link javaUserLabelRef		javaUserLabel
    957 hi def link javaLabel			Label
    958 hi def link javaLabelDefault		javaLabel
    959 hi def link javaLabelVarType		javaOperator
    960 
    961 hi def link javaComment			Comment
    962 hi def link javaCommentStar		javaComment
    963 hi def link javaLineComment		Comment
    964 hi def link javaCommentMarkupTagAttr	javaHtmlArg
    965 hi def link javaCommentString		javaString
    966 hi def link javaComment2String		javaString
    967 hi def link javaCommentCharacter	javaCharacter
    968 hi def link javaCommentError		javaError
    969 hi def link javaCommentStart		javaComment
    970 
    971 hi def link javaHtmlArg			Type
    972 hi def link javaHtmlString		String
    973 
    974 let b:current_syntax = "java"
    975 
    976 if g:main_syntax == 'java'
    977  unlet g:main_syntax
    978 endif
    979 
    980 if exists("s:clear_java_ignore_html")
    981  unlet! s:clear_java_ignore_html g:java_ignore_html
    982 endif
    983 
    984 if exists("s:clear_java_ignore_markdown")
    985  unlet! s:clear_java_ignore_markdown g:java_ignore_markdown
    986 endif
    987 
    988 let b:spell_options = "contained"
    989 let &cpo = s:cpo_save
    990 unlet s:cpo_save s:ff s:vv s:with_html s:with_markdown
    991 
    992 " See ":help vim9-mix".
    993 if !has("vim9script")
    994  finish
    995 endif
    996 
    997 if exists("g:java_foldtext_show_first_or_second_line")
    998  def! s:LazyPrefix(prefix: string, dashes: string, count: number): string
    999    return empty(prefix)
   1000      ? printf('+-%s%3d lines: ', dashes, count)
   1001      : prefix
   1002  enddef
   1003 
   1004  def! s:JavaSyntaxFoldTextExpr(): string
   1005    # Piggyback on NGETTEXT.
   1006    const summary: string = foldtext()
   1007    return getline(v:foldstart) !~ '/\*\+\s*$'
   1008      ? summary
   1009      : LazyPrefix(matchstr(summary, '^+-\+\s*\d\+\s.\{-1,}:\s'),
   1010 		v:folddashes,
   1011 		(v:foldend - v:foldstart + 1)) ..
   1012   getline(v:foldstart + 1)
   1013  enddef
   1014 
   1015  setlocal foldtext=s:JavaSyntaxFoldTextExpr()
   1016  delfunction! g:JavaSyntaxFoldTextExpr
   1017 endif
   1018 " vim: fdm=syntax sw=2 ts=8 noet sta