blob: 22fc934a0cc6b5dc98b35bdbfb535f0a31d612da [file] [log] [blame]
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +02001" Vim syntax file
2" Language: Java
Bram Moolenaar00a927d2010-05-14 23:24:24 +02003" Maintainer: Claudio Fleiner <claudio@fleiner.com>
Bram Moolenaar91f84f62018-07-29 15:07:52 +02004" URL: https://github.com/fleiner/vim/blob/master/runtime/syntax/java.vim
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +02005" Last Change: 2024 Apr 04
Bram Moolenaar071d4272004-06-13 20:20:40 +00006
7" Please check :help java.vim for comments on some of the options available.
8
Bram Moolenaar89bcfda2016-08-30 23:26:57 +02009" quit when a syntax file was already loaded
Bram Moolenaar071d4272004-06-13 20:20:40 +000010if !exists("main_syntax")
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020011 if exists("b:current_syntax")
Bram Moolenaar071d4272004-06-13 20:20:40 +000012 finish
13 endif
14 " we define it here so that included files can test for it
15 let main_syntax='java'
Bram Moolenaar5c736222010-01-06 20:54:52 +010016 syn region javaFold start="{" end="}" transparent fold
Bram Moolenaar071d4272004-06-13 20:20:40 +000017endif
18
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +020019let s:cpo_save = &cpo
20set cpo&vim
21
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020022" Admit the ASCII dollar sign to keyword characters (JLS-17, §3.8):
23execute printf('syntax iskeyword %s,$', &l:iskeyword)
24
Bram Moolenaar071d4272004-06-13 20:20:40 +000025" some characters that cannot be in a java program (outside a string)
26syn match javaError "[\\@`]"
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +010027syn match javaError "<<<\|\.\.\|=>\|||=\|&&=\|\*\/"
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +020028
Bram Moolenaar071d4272004-06-13 20:20:40 +000029" use separate name so that it can be deleted in javacc.vim
30syn match javaError2 "#\|=<"
Bram Moolenaarf37506f2016-08-31 22:22:10 +020031hi def link javaError2 javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +000032
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020033" Keywords (JLS-17, §3.9):
Bram Moolenaar071d4272004-06-13 20:20:40 +000034syn keyword javaExternal native package
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020035syn match javaExternal "\<import\>\%(\s\+static\>\)\="
Bram Moolenaar071d4272004-06-13 20:20:40 +000036syn keyword javaError goto const
37syn keyword javaConditional if else switch
38syn keyword javaRepeat while for do
39syn keyword javaBoolean true false
40syn keyword javaConstant null
41syn keyword javaTypedef this super
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020042syn keyword javaOperator new instanceof
43syn match javaOperator "\<var\>\%(\s*(\)\@!"
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +010044" Since the yield statement, which could take a parenthesised operand,
45" and _qualified_ yield methods get along within the switch block
46" (JLS-17, §3.8), it seems futile to make a region definition for this
47" block; instead look for the _yield_ word alone, and if found,
48" backtrack (arbitrarily) 80 bytes, at most, on the matched line and,
49" if necessary, on the line before that (h: \@<=), trying to match
50" neither a method reference nor a qualified method invocation.
51syn match javaOperator "\%(\%(::\|\.\)[[:space:]\n]*\)\@80<!\<yield\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +000052syn keyword javaType boolean char byte short int long float double
53syn keyword javaType void
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +010054syn keyword javaStatement return
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020055syn keyword javaStorageClass static synchronized transient volatile strictfp serializable
Bram Moolenaar071d4272004-06-13 20:20:40 +000056syn keyword javaExceptions throw try catch finally
57syn keyword javaAssert assert
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020058syn keyword javaMethodDecl throws
59" Differentiate a "MyClass.class" literal from the keyword "class".
Bram Moolenaar071d4272004-06-13 20:20:40 +000060syn match javaTypedef "\.\s*\<class\>"ms=s+1
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020061syn keyword javaClassDecl enum extends implements interface
62syn match javaClassDecl "\<permits\>\%(\s*(\)\@!"
63syn match javaClassDecl "\<record\>\%(\s*(\)\@!"
Bram Moolenaar071d4272004-06-13 20:20:40 +000064syn match javaClassDecl "^class\>"
65syn match javaClassDecl "[^.]\s*\<class\>"ms=s+1
Bram Moolenaar91f84f62018-07-29 15:07:52 +020066syn match javaAnnotation "@\([_$a-zA-Z][_$a-zA-Z0-9]*\.\)*[_$a-zA-Z][_$a-zA-Z0-9]*\>" contains=javaString
Bram Moolenaar00a927d2010-05-14 23:24:24 +020067syn match javaClassDecl "@interface\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +000068syn keyword javaBranch break continue nextgroup=javaUserLabelRef skipwhite
69syn match javaUserLabelRef "\k\+" contained
Bram Moolenaarc9b4b052006-04-30 18:54:39 +000070syn match javaVarArg "\.\.\."
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020071syn keyword javaScopeDecl public protected private
72syn keyword javaConceptKind abstract final
73syn match javaConceptKind "\<non-sealed\>"
74syn match javaConceptKind "\<sealed\>\%(\s*(\)\@!"
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +010075syn match javaConceptKind "\<default\>\%(\s*\%(:\|->\)\)\@!"
Bram Moolenaar071d4272004-06-13 20:20:40 +000076
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020077" Note that a "module-info" file will be recognised with an arbitrary
78" file extension (or no extension at all) so that more than one such
79" declaration for the same Java module can be maintained for modular
80" testing in a project without attendant confusion for IDEs, with the
81" ".java\=" extension used for a production version and an arbitrary
82" extension used for a testing version.
83let s:module_info_cur_buf = fnamemodify(bufname("%"), ":t") =~ '^module-info\%(\.class\>\)\@!'
84lockvar s:module_info_cur_buf
Bram Moolenaar63f32602022-06-09 20:45:54 +010085
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020086" Java modules (since Java 9, for "module-info.java" file).
87if s:module_info_cur_buf
88 syn keyword javaModuleStorageClass module transitive
89 syn keyword javaModuleStmt open requires exports opens uses provides
90 syn keyword javaModuleExternal to with
91 syn cluster javaTop add=javaModuleStorageClass,javaModuleStmt,javaModuleExternal
Bram Moolenaar91f84f62018-07-29 15:07:52 +020092endif
93
Bram Moolenaar8ada17c2006-01-19 22:16:24 +000094if exists("java_highlight_java_lang_ids")
95 let java_highlight_all=1
96endif
Bram Moolenaar91f84f62018-07-29 15:07:52 +020097if exists("java_highlight_all") || exists("java_highlight_java") || exists("java_highlight_java_lang")
Bram Moolenaar071d4272004-06-13 20:20:40 +000098 " java.lang.*
Bram Moolenaar63f32602022-06-09 20:45:54 +010099 "
100 " The keywords of javaR_JavaLang, javaC_JavaLang, javaE_JavaLang,
101 " and javaX_JavaLang are sub-grouped according to the Java version
102 " of their introduction, and sub-group keywords (that is, class
103 " names) are arranged in alphabetical order, so that future newer
104 " keywords can be pre-sorted and appended without disturbing
105 " the current keyword placement. The below _match_es follow suit.
106
Aliaksei Budavei63d68c22024-03-26 20:12:05 +0300107 syn keyword javaR_JavaLang ArithmeticException ArrayIndexOutOfBoundsException ArrayStoreException ClassCastException IllegalArgumentException IllegalMonitorStateException IllegalThreadStateException IndexOutOfBoundsException NegativeArraySizeException NullPointerException NumberFormatException RuntimeException SecurityException StringIndexOutOfBoundsException IllegalStateException UnsupportedOperationException EnumConstantNotPresentException TypeNotPresentException IllegalCallerException LayerInstantiationException WrongThreadException MatchException
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000108 syn cluster javaTop add=javaR_JavaLang
109 syn cluster javaClasses add=javaR_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200110 hi def link javaR_JavaLang javaR_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100111 " Member enumerations:
112 syn match javaC_JavaLang "\%(\<Thread\.\)\@<=\<State\>"
113 syn match javaC_JavaLang "\%(\<Character\.\)\@<=\<UnicodeScript\>"
114 syn match javaC_JavaLang "\%(\<ProcessBuilder\.Redirect\.\)\@<=\<Type\>"
115 syn match javaC_JavaLang "\%(\<StackWalker\.\)\@<=\<Option\>"
116 syn match javaC_JavaLang "\%(\<System\.Logger\.\)\@<=\<Level\>"
117 " Member classes:
118 syn match javaC_JavaLang "\%(\<Character\.\)\@<=\<Subset\>"
119 syn match javaC_JavaLang "\%(\<Character\.\)\@<=\<UnicodeBlock\>"
120 syn match javaC_JavaLang "\%(\<ProcessBuilder\.\)\@<=\<Redirect\>"
121 syn match javaC_JavaLang "\%(\<ModuleLayer\.\)\@<=\<Controller\>"
122 syn match javaC_JavaLang "\%(\<Runtime\.\)\@<=\<Version\>"
123 syn match javaC_JavaLang "\%(\<System\.\)\@<=\<LoggerFinder\>"
124 syn match javaC_JavaLang "\%(\<Enum\.\)\@<=\<EnumDesc\>"
125 syn keyword javaC_JavaLang Boolean Character Class ClassLoader Compiler Double Float Integer Long Math Number Object Process Runtime SecurityManager String StringBuffer Thread ThreadGroup Byte Short Void InheritableThreadLocal Package RuntimePermission ThreadLocal StrictMath StackTraceElement Enum ProcessBuilder StringBuilder ClassValue Module ModuleLayer StackWalker Record
126 syn match javaC_JavaLang "\<System\>" " See javaDebug.
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200127 " As of JDK 21, java.lang.Compiler is no more (deprecated in JDK 9).
Aliaksei Budavei63d68c22024-03-26 20:12:05 +0300128 syn keyword javaLangDeprecated Compiler
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000129 syn cluster javaTop add=javaC_JavaLang
130 syn cluster javaClasses add=javaC_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200131 hi def link javaC_JavaLang javaC_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100132 syn keyword javaE_JavaLang AbstractMethodError ClassCircularityError ClassFormatError Error IllegalAccessError IncompatibleClassChangeError InstantiationError InternalError LinkageError NoClassDefFoundError NoSuchFieldError NoSuchMethodError OutOfMemoryError StackOverflowError ThreadDeath UnknownError UnsatisfiedLinkError VerifyError VirtualMachineError ExceptionInInitializerError UnsupportedClassVersionError AssertionError BootstrapMethodError
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000133 syn cluster javaTop add=javaE_JavaLang
134 syn cluster javaClasses add=javaE_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200135 hi def link javaE_JavaLang javaE_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100136 syn keyword javaX_JavaLang ClassNotFoundException CloneNotSupportedException Exception IllegalAccessException InstantiationException InterruptedException NoSuchMethodException Throwable NoSuchFieldException ReflectiveOperationException
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000137 syn cluster javaTop add=javaX_JavaLang
138 syn cluster javaClasses add=javaX_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200139 hi def link javaX_JavaLang javaX_Java
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000140
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200141 hi def link javaR_Java javaR_
142 hi def link javaC_Java javaC_
143 hi def link javaE_Java javaE_
144 hi def link javaX_Java javaX_
145 hi def link javaX_ javaExceptions
146 hi def link javaR_ javaExceptions
147 hi def link javaE_ javaExceptions
148 hi def link javaC_ javaConstant
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000149
Bram Moolenaar071d4272004-06-13 20:20:40 +0000150 syn keyword javaLangObject clone equals finalize getClass hashCode
151 syn keyword javaLangObject notify notifyAll toString wait
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200152 hi def link javaLangObject javaConstant
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000153 syn cluster javaTop add=javaLangObject
Bram Moolenaar071d4272004-06-13 20:20:40 +0000154endif
155
156if filereadable(expand("<sfile>:p:h")."/javaid.vim")
157 source <sfile>:p:h/javaid.vim
158endif
159
160if exists("java_space_errors")
161 if !exists("java_no_trail_space_error")
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200162 syn match javaSpaceError "\s\+$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000163 endif
164 if !exists("java_no_tab_space_error")
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200165 syn match javaSpaceError " \+\t"me=e-1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000166 endif
167endif
168
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100169syn match javaUserLabel "^\s*\<\K\k*\>\%(\<default\>\)\@<!\s*:"he=e-1
170syn region javaLabelRegion transparent matchgroup=javaLabel start="\<case\>" matchgroup=NONE end=":\|->" contains=javaLabelCastType,javaLabelNumber,javaCharacter,javaString,javaConstant,@javaClasses,javaLabelDefault,javaLabelVarType,javaLabelWhenClause
171syn region javaLabelRegion transparent matchgroup=javaLabel start="\<default\>\%(\s*\%(:\|->\)\)\@=" matchgroup=NONE end=":\|->" oneline
172" Consider grouped _default_ _case_ labels, i.e.
173" case null, default ->
174" case null: default:
175syn keyword javaLabelDefault contained default
176syn keyword javaLabelVarType contained var
177syn keyword javaLabelCastType contained char byte short int
178" Allow for the contingency of the enclosing region not being able to
179" _keep_ its _end_, e.g. case ':':.
180syn region javaLabelWhenClause contained transparent matchgroup=javaLabel start="\<when\>" matchgroup=NONE end=":"me=e-1 end="->"me=e-2 contains=TOP,javaExternal
181syn match javaLabelNumber contained "\<0\>[lL]\@!"
182syn match javaLabelNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)\>[lL]\@!"
183hi def link javaLabelDefault javaLabel
184hi def link javaLabelVarType javaOperator
185hi def link javaLabelNumber javaNumber
186hi def link javaLabelCastType javaType
Bram Moolenaar071d4272004-06-13 20:20:40 +0000187
Bram Moolenaarb6b046b2011-12-30 13:11:27 +0100188" highlighting C++ keywords as errors removed, too many people find it
189" annoying. Was: if !exists("java_allow_cpp_keywords")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000190
191" The following cluster contains all java groups except the contained ones
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100192syn cluster javaTop add=javaExternal,javaError,javaBranch,javaLabelRegion,javaConditional,javaRepeat,javaBoolean,javaConstant,javaTypedef,javaOperator,javaType,javaStatement,javaStorageClass,javaAssert,javaExceptions,javaMethodDecl,javaClassDecl,javaScopeDecl,javaConceptKind,javaError2,javaUserLabel,javaLangObject,javaAnnotation,javaVarArg
Bram Moolenaar071d4272004-06-13 20:20:40 +0000193
194
195" Comments
196syn keyword javaTodo contained TODO FIXME XXX
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300197
Bram Moolenaar071d4272004-06-13 20:20:40 +0000198if exists("java_comment_strings")
199 syn region javaCommentString contained start=+"+ end=+"+ end=+$+ end=+\*/+me=s-1,he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300200 syn region javaCommentString contained start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell,javaSpecialError,javaTextBlockError
201 syn region javaComment2String contained start=+"+ end=+$\|"+ contains=javaSpecial,javaSpecialChar,@Spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000202 syn match javaCommentCharacter contained "'\\[^']\{1,6\}'" contains=javaSpecialChar
203 syn match javaCommentCharacter contained "'\\''" contains=javaSpecialChar
204 syn match javaCommentCharacter contained "'[^\\]'"
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300205 syn cluster javaCommentSpecial add=javaCommentString,javaCommentCharacter,javaNumber,javaStrTempl
206 syn cluster javaCommentSpecial2 add=javaComment2String,javaCommentCharacter,javaNumber,javaStrTempl
Bram Moolenaar071d4272004-06-13 20:20:40 +0000207endif
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300208
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300209syn region javaComment matchgroup=javaCommentStart start="/\*" end="\*/" contains=@javaCommentSpecial,javaTodo,javaCommentError,javaSpaceError,@Spell
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200210syn match javaCommentStar contained "^\s*\*[^/]"me=e-1
211syn match javaCommentStar contained "^\s*\*$"
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300212syn match javaLineComment "//.*" contains=@javaCommentSpecial2,javaTodo,javaCommentMarkupTag,javaSpaceError,@Spell
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300213syn match javaCommentMarkupTag contained "@\%(end\|highlight\|link\|replace\|start\)\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
214syn match javaCommentMarkupTagAttr contained "\<region\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
215syn region javaCommentMarkupTagAttr contained transparent matchgroup=htmlArg start=/\<\%(re\%(gex\|gion\|placement\)\|substring\|t\%(arget\|ype\)\)\%(\s*=\)\@=/ matchgroup=htmlString end=/\%(=\s*\)\@<=\%("[^"]\+"\|'[^']\+'\|\%([.-]\|\k\)\+\)/ nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite oneline
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300216hi def link javaCommentMarkupTagAttr htmlArg
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200217hi def link javaCommentString javaString
218hi def link javaComment2String javaString
219hi def link javaCommentCharacter javaCharacter
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300220syn match javaCommentError contained "/\*"me=e-1 display
221hi def link javaCommentError javaError
222hi def link javaCommentStart javaComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000223
224syn cluster javaTop add=javaComment,javaLineComment
225
226if !exists("java_ignore_javadoc") && main_syntax != 'jsp'
227 syntax case ignore
228 " syntax coloring for javadoc comments (HTML)
Bram Moolenaar63f32602022-06-09 20:45:54 +0100229 syntax include @javaHtml syntax/html.vim
Bram Moolenaar071d4272004-06-13 20:20:40 +0000230 unlet b:current_syntax
Bram Moolenaar5c736222010-01-06 20:54:52 +0100231 " HTML enables spell checking for all text that is not in a syntax item. This
232 " is wrong for Java (all identifiers would be spell-checked), so it's undone
233 " here.
234 syntax spell default
235
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300236 syn region javaDocComment start="/\*\*" end="\*/" keepend contains=javaCommentTitle,@javaHtml,javaDocTags,javaDocSeeTag,javaDocCodeTag,javaDocSnippetTag,javaTodo,javaCommentError,javaSpaceError,@Spell
237 syn region javaCommentTitle contained matchgroup=javaDocComment start="/\*\*" matchgroup=javaCommentTitle end="\.$" end="\.[ \t\r]\@=" end="\%(^\s*\**\s*\)\@<=@"me=s-2,he=s-1 end="\*/"me=s-1,he=s-1 contains=@javaHtml,javaCommentStar,javaTodo,javaCommentError,javaSpaceError,@Spell,javaDocTags,javaDocSeeTag,javaDocCodeTag,javaDocSnippetTag
238 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,javaDocSeeTag,javaDocCodeTag,javaDocSnippetTag
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300239 syn region javaDocTags contained start="{@\%(li\%(teral\|nk\%(plain\)\=\)\|inherit[Dd]oc\|doc[rR]oot\|value\)\>" end="}"
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300240 syn match javaDocTags contained "@\%(param\|exception\|throws\|since\)\s\+\S\+" contains=javaDocParam
241 syn match javaDocParam contained "\s\S\+"
242 syn match javaDocTags contained "@\%(version\|author\|return\|deprecated\|serial\%(Field\|Data\)\=\)\>"
243 syn region javaDocSeeTag contained matchgroup=javaDocTags start="@see\s\+" matchgroup=NONE end="\_."re=e-1 contains=javaDocSeeTagParam
244 syn match javaDocSeeTagParam contained @"\_[^"]\+"\|<a\s\+\_.\{-}</a>\|\%(\k\|\.\)*\%(#\k\+\%((\_[^)]*)\)\=\)\=@ contains=@javaHtml extend
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300245 syn region javaCodeSkipBlock contained transparent start="{\%(@code\>\)\@!" end="}" contains=javaCodeSkipBlock,javaDocCodeTag
246 syn region javaDocCodeTag contained start="{@code\>" end="}" contains=javaDocCodeTag,javaCodeSkipBlock
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300247 syn region javaDocSnippetTagAttr contained transparent matchgroup=htmlArg start=/\<\%(class\|file\|id\|lang\|region\)\%(\s*=\)\@=/ matchgroup=htmlString end=/:$/ end=/\%(=\s*\)\@<=\%("[^"]\+"\|'[^']\+'\|\%([.\\/-]\|\k\)\+\)/ nextgroup=javaDocSnippetTagAttr skipwhite skipnl
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300248 syn region javaSnippetSkipBlock contained transparent start="{\%(@snippet\>\)\@!" end="}" contains=javaSnippetSkipBlock,javaDocSnippetTag,javaCommentMarkupTag
249 syn region javaDocSnippetTag contained start="{@snippet\>" end="}" contains=javaDocSnippetTag,javaSnippetSkipBlock,javaDocSnippetTagAttr,javaCommentMarkupTag
Bram Moolenaar071d4272004-06-13 20:20:40 +0000250 syntax case match
251endif
252
253" match the special comment /**/
254syn match javaComment "/\*\*/"
255
256" Strings and constants
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200257syn match javaSpecialError contained "\\."
Bram Moolenaar071d4272004-06-13 20:20:40 +0000258syn match javaSpecialCharError contained "[^']"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300259" Escape Sequences (JLS-17, §3.10.7):
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300260syn match javaSpecialChar contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000261syn region javaString start=+"+ end=+"+ end=+$+ contains=javaSpecialChar,javaSpecialError,@Spell
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300262syn region javaString start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecialChar,javaSpecialError,javaTextBlockError,@Spell
263syn match javaTextBlockError +"""\s*"""+
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300264syn region javaStrTemplEmbExp contained matchgroup=javaStrTempl start="\\{" end="}" contains=TOP
265syn region javaStrTempl start=+\%(\.[[:space:]\n]*\)\@<="+ end=+"+ contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,@Spell
266syn region javaStrTempl start=+\%(\.[[:space:]\n]*\)\@<="""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,javaTextBlockError,@Spell
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300267" The next line is commented out, it can cause a crash for a long line
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300268"syn match javaStringError +"\%([^"\\]\|\\.\)*$+
Bram Moolenaar071d4272004-06-13 20:20:40 +0000269syn match javaCharacter "'[^']*'" contains=javaSpecialChar,javaSpecialCharError
270syn match javaCharacter "'\\''" contains=javaSpecialChar
271syn match javaCharacter "'[^\\]'"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300272" Integer literals (JLS-17, §3.10.1):
273syn keyword javaNumber 0 0l 0L
274syn match javaNumber "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
275" Decimal floating-point literals (JLS-17, §3.10.2):
276" Against "\<\d\+\>\.":
277syn match javaNumber "\<\d\%(_*\d\)*\."
278syn match javaNumber "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
279syn match javaNumber "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
280syn match javaNumber "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
281" Hexadecimal floating-point literals (JLS-17, §3.10.2):
282syn match javaNumber "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000283
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300284" Unicode characters
285syn match javaSpecial "\\u\x\x\x\x"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000286
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300287syn cluster javaTop add=javaString,javaStrTempl,javaCharacter,javaNumber,javaSpecial,javaStringError,javaTextBlockError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000288
289if exists("java_highlight_functions")
290 if java_highlight_functions == "indent"
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200291 syn match javaFuncDef "^\(\t\| \{8\}\)[_$a-zA-Z][_$a-zA-Z0-9_. \[\]<>]*([^-+*/]*)" contains=javaScopeDecl,javaConceptKind,javaType,javaStorageClass,@javaClasses,javaAnnotation
292 syn region javaFuncDef start=+^\(\t\| \{8\}\)[$_a-zA-Z][$_a-zA-Z0-9_. \[\]<>]*([^-+*/]*,\s*+ end=+)+ contains=javaScopeDecl,javaConceptKind,javaType,javaStorageClass,@javaClasses,javaAnnotation
293 syn match javaFuncDef "^ [$_a-zA-Z][$_a-zA-Z0-9_. \[\]<>]*([^-+*/]*)" contains=javaScopeDecl,javaConceptKind,javaType,javaStorageClass,@javaClasses,javaAnnotation
294 syn region javaFuncDef start=+^ [$_a-zA-Z][$_a-zA-Z0-9_. \[\]<>]*([^-+*/]*,\s*+ end=+)+ contains=javaScopeDecl,javaConceptKind,javaType,javaStorageClass,@javaClasses,javaAnnotation
Bram Moolenaar071d4272004-06-13 20:20:40 +0000295 else
296 " This line catches method declarations at any indentation>0, but it assumes
297 " two things:
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200298 " 1. class names are always capitalized (ie: Button)
299 " 2. method names are never capitalized (except constructors, of course)
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100300 "syn region javaFuncDef start=+^\s\+\(\(public\|protected\|private\|static\|abstract\|final\|native\|synchronized\)\s\+\)*\(\(void\|boolean\|char\|byte\|short\|int\|long\|float\|double\|\([A-Za-z_][A-Za-z0-9_$]*\.\)*[A-Z][A-Za-z0-9_$]*\)\(<[^>]*>\)\=\(\[\]\)*\s\+[a-z][A-Za-z0-9_$]*\|[A-Z][A-Za-z0-9_$]*\)\s*([^0-9]+ end=+)+ contains=javaScopeDecl,javaType,javaStorageClass,javaComment,javaLineComment,@javaClasses
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200301 syn region javaFuncDef start=+^\s\+\%(\%(public\|protected\|private\|static\|\%(abstract\|default\)\|final\|native\|synchronized\)\s\+\)*\%(<.*>\s\+\)\?\%(\%(void\|boolean\|char\|byte\|short\|int\|long\|float\|double\|\%([A-Za-z_][A-Za-z0-9_$]*\.\)*[A-Z][A-Za-z0-9_$]*\)\%(<[^(){}]*>\)\=\%(\[\]\)*\s\+[a-z][A-Za-z0-9_$]*\|[A-Z][A-Za-z0-9_$]*\)\s*(+ end=+)+ contains=javaScopeDecl,javaConceptKind,javaType,javaStorageClass,javaComment,javaLineComment,@javaClasses,javaAnnotation
Bram Moolenaar071d4272004-06-13 20:20:40 +0000302 endif
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100303 syn match javaLambdaDef "\<\K\k*\>\%(\<default\>\)\@<!\s*->"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000304 syn match javaBraces "[{}]"
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100305 syn cluster javaTop add=javaFuncDef,javaBraces,javaLambdaDef
Bram Moolenaar071d4272004-06-13 20:20:40 +0000306endif
307
308if exists("java_highlight_debug")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000309 " Strings and constants
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300310 syn match javaDebugSpecial contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000311 syn region javaDebugString contained start=+"+ end=+"+ contains=javaDebugSpecial
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300312 syn region javaDebugString contained start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaDebugSpecial,javaDebugTextBlockError
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300313 " The highlight groups of java{StrTempl,Debug{,Paren,StrTempl}}\,
314 " share one colour by default. Do not conflate unrelated parens.
315 syn region javaDebugStrTemplEmbExp contained matchgroup=javaDebugStrTempl start="\\{" end="}" contains=javaComment,javaLineComment,javaDebug\%(Paren\)\@!.*
316 syn region javaDebugStrTempl contained start=+\%(\.[[:space:]\n]*\)\@<="+ end=+"+ contains=javaDebugStrTemplEmbExp,javaDebugSpecial
317 syn region javaDebugStrTempl contained start=+\%(\.[[:space:]\n]*\)\@<="""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaDebugStrTemplEmbExp,javaDebugSpecial,javaDebugTextBlockError
318 " The next line is commented out, it can cause a crash for a long line
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300319" syn match javaDebugStringError contained +"\%([^"\\]\|\\.\)*$+
320 syn match javaDebugTextBlockError contained +"""\s*"""+
Bram Moolenaar071d4272004-06-13 20:20:40 +0000321 syn match javaDebugCharacter contained "'[^\\]'"
322 syn match javaDebugSpecialCharacter contained "'\\.'"
323 syn match javaDebugSpecialCharacter contained "'\\''"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300324 syn keyword javaDebugNumber contained 0 0l 0L
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300325 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\."
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300326 syn match javaDebugNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
327 syn match javaDebugNumber contained "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
328 syn match javaDebugNumber contained "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
329 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
330 syn match javaDebugNumber contained "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000331 syn keyword javaDebugBoolean contained true false
332 syn keyword javaDebugType contained null this super
333 syn region javaDebugParen start=+(+ end=+)+ contained contains=javaDebug.*,javaDebugParen
334
335 " to make this work you must define the highlighting for these groups
336 syn match javaDebug "\<System\.\(out\|err\)\.print\(ln\)*\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000337 syn match javaDebug "\<p\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
Bram Moolenaar071d4272004-06-13 20:20:40 +0000338 syn match javaDebug "[A-Za-z][a-zA-Z0-9_]*\.printStackTrace\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
339 syn match javaDebug "\<trace[SL]\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
340
341 syn cluster javaTop add=javaDebug
342
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200343 hi def link javaDebug Debug
344 hi def link javaDebugString DebugString
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300345 hi def link javaDebugStrTempl Macro
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200346 hi def link javaDebugStringError javaError
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300347 hi def link javaDebugTextBlockError javaDebugStringError
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200348 hi def link javaDebugType DebugType
349 hi def link javaDebugBoolean DebugBoolean
350 hi def link javaDebugNumber Debug
351 hi def link javaDebugSpecial DebugSpecial
352 hi def link javaDebugSpecialCharacter DebugSpecial
353 hi def link javaDebugCharacter DebugString
354 hi def link javaDebugParen Debug
Bram Moolenaar071d4272004-06-13 20:20:40 +0000355
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200356 hi def link DebugString String
357 hi def link DebugSpecial Special
358 hi def link DebugBoolean Boolean
359 hi def link DebugType Type
Bram Moolenaar071d4272004-06-13 20:20:40 +0000360endif
361
362if exists("java_mark_braces_in_parens_as_errors")
363 syn match javaInParen contained "[{}]"
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200364 hi def link javaInParen javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000365 syn cluster javaTop add=javaInParen
366endif
367
368" catch errors caused by wrong parenthesis
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100369syn region javaParenT transparent matchgroup=javaParen start="(" end=")" contains=@javaTop,javaParenT1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000370syn region javaParenT1 transparent matchgroup=javaParen1 start="(" end=")" contains=@javaTop,javaParenT2 contained
371syn region javaParenT2 transparent matchgroup=javaParen2 start="(" end=")" contains=@javaTop,javaParenT contained
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200372syn match javaParenError ")"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000373" catch errors caused by wrong square parenthesis
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100374syn region javaParenT transparent matchgroup=javaParen start="\[" end="\]" contains=@javaTop,javaParenT1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000375syn region javaParenT1 transparent matchgroup=javaParen1 start="\[" end="\]" contains=@javaTop,javaParenT2 contained
376syn region javaParenT2 transparent matchgroup=javaParen2 start="\[" end="\]" contains=@javaTop,javaParenT contained
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200377syn match javaParenError "\]"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000378
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200379hi def link javaParenError javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000380
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100381if exists("java_highlight_functions")
382 syn match javaLambdaDef "([a-zA-Z0-9_<>\[\], \t]*)\s*->"
383 " needs to be defined after the parenthesis error catcher to work
384endif
385
Bram Moolenaar071d4272004-06-13 20:20:40 +0000386if !exists("java_minlines")
387 let java_minlines = 10
388endif
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300389
390" Note that variations of a /*/ balanced comment, e.g., /*/*/, /*//*/,
391" /* /*/, /* /*/, etc., may have their rightmost /*/ part accepted
392" as a comment start by ':syntax sync ccomment'; consider alternatives
393" to make synchronisation start further towards file's beginning by
394" bumping up g:java_minlines or issuing ':syntax sync fromstart' or
395" preferring &foldmethod set to 'syntax'.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000396exec "syn sync ccomment javaComment minlines=" . java_minlines
397
398" The default highlighting.
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200399hi def link javaLambdaDef Function
400hi def link javaFuncDef Function
401hi def link javaVarArg Function
402hi def link javaBraces Function
403hi def link javaBranch Conditional
404hi def link javaUserLabelRef javaUserLabel
405hi def link javaLabel Label
406hi def link javaUserLabel Label
407hi def link javaConditional Conditional
408hi def link javaRepeat Repeat
409hi def link javaExceptions Exception
410hi def link javaAssert Statement
411hi def link javaStorageClass StorageClass
412hi def link javaMethodDecl javaStorageClass
413hi def link javaClassDecl javaStorageClass
414hi def link javaScopeDecl javaStorageClass
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100415hi def link javaConceptKind NonText
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200416
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200417hi def link javaBoolean Boolean
418hi def link javaSpecial Special
419hi def link javaSpecialError Error
420hi def link javaSpecialCharError Error
421hi def link javaString String
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300422hi def link javaStrTempl Macro
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200423hi def link javaCharacter Character
424hi def link javaSpecialChar SpecialChar
425hi def link javaNumber Number
426hi def link javaError Error
427hi def link javaStringError Error
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300428hi def link javaTextBlockError javaStringError
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200429hi def link javaStatement Statement
430hi def link javaOperator Operator
431hi def link javaComment Comment
432hi def link javaDocComment Comment
433hi def link javaLineComment Comment
434hi def link javaConstant Constant
435hi def link javaTypedef Typedef
436hi def link javaTodo Todo
437hi def link javaAnnotation PreProc
Bram Moolenaar071d4272004-06-13 20:20:40 +0000438
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200439hi def link javaCommentTitle SpecialComment
440hi def link javaDocTags Special
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300441hi def link javaDocCodeTag Special
442hi def link javaDocSnippetTag Special
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200443hi def link javaDocParam Function
444hi def link javaDocSeeTagParam Function
445hi def link javaCommentStar javaComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000446
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200447hi def link javaType Type
448hi def link javaExternal Include
Bram Moolenaar071d4272004-06-13 20:20:40 +0000449
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200450hi def link htmlComment Special
451hi def link htmlCommentPart Special
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300452hi def link htmlArg Type
453hi def link htmlString String
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200454hi def link javaSpaceError Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000455
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200456if s:module_info_cur_buf
457 hi def link javaModuleStorageClass StorageClass
458 hi def link javaModuleStmt Statement
459 hi def link javaModuleExternal Include
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200460endif
461
Bram Moolenaar071d4272004-06-13 20:20:40 +0000462let b:current_syntax = "java"
463
464if main_syntax == 'java'
465 unlet main_syntax
466endif
467
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200468let b:spell_options = "contained"
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +0200469let &cpo = s:cpo_save
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200470unlet s:module_info_cur_buf s:cpo_save
Bram Moolenaar071d4272004-06-13 20:20:40 +0000471
472" vim: ts=8