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