blob: 1f0c1580318c1bde9a6cc6b7c89e1f67afae7cb0 [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 Budavei63d68c22024-03-26 20:12:05 +03005" Last Change: 2024 Mar 25
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
Bram Moolenaar071d4272004-06-13 20:20:40 +000022" some characters that cannot be in a java program (outside a string)
23syn match javaError "[\\@`]"
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +010024syn match javaError "<<<\|\.\.\|=>\|||=\|&&=\|\*\/"
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +020025
Bram Moolenaar071d4272004-06-13 20:20:40 +000026" use separate name so that it can be deleted in javacc.vim
27syn match javaError2 "#\|=<"
Bram Moolenaarf37506f2016-08-31 22:22:10 +020028hi def link javaError2 javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +000029
Bram Moolenaar071d4272004-06-13 20:20:40 +000030" keyword definitions
31syn keyword javaExternal native package
Bram Moolenaarc9b4b052006-04-30 18:54:39 +000032syn match javaExternal "\<import\>\(\s\+static\>\)\?"
Bram Moolenaar071d4272004-06-13 20:20:40 +000033syn keyword javaError goto const
34syn keyword javaConditional if else switch
35syn keyword javaRepeat while for do
36syn keyword javaBoolean true false
37syn keyword javaConstant null
38syn keyword javaTypedef this super
Bram Moolenaar91f84f62018-07-29 15:07:52 +020039syn keyword javaOperator var new instanceof
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +010040" Since the yield statement, which could take a parenthesised operand,
41" and _qualified_ yield methods get along within the switch block
42" (JLS-17, ยง3.8), it seems futile to make a region definition for this
43" block; instead look for the _yield_ word alone, and if found,
44" backtrack (arbitrarily) 80 bytes, at most, on the matched line and,
45" if necessary, on the line before that (h: \@<=), trying to match
46" neither a method reference nor a qualified method invocation.
47syn match javaOperator "\%(\%(::\|\.\)[[:space:]\n]*\)\@80<!\<yield\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +000048syn keyword javaType boolean char byte short int long float double
49syn keyword javaType void
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +010050syn keyword javaStatement return
Bram Moolenaar071d4272004-06-13 20:20:40 +000051syn keyword javaStorageClass static synchronized transient volatile final strictfp serializable
52syn keyword javaExceptions throw try catch finally
53syn keyword javaAssert assert
54syn keyword javaMethodDecl synchronized throws
55syn keyword javaClassDecl extends implements interface
56" to differentiate the keyword class from MyClass.class we use a match here
57syn match javaTypedef "\.\s*\<class\>"ms=s+1
58syn keyword javaClassDecl enum
59syn match javaClassDecl "^class\>"
60syn match javaClassDecl "[^.]\s*\<class\>"ms=s+1
Bram Moolenaar91f84f62018-07-29 15:07:52 +020061syn 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 +020062syn match javaClassDecl "@interface\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +000063syn keyword javaBranch break continue nextgroup=javaUserLabelRef skipwhite
64syn match javaUserLabelRef "\k\+" contained
Bram Moolenaarc9b4b052006-04-30 18:54:39 +000065syn match javaVarArg "\.\.\."
Bram Moolenaar071d4272004-06-13 20:20:40 +000066syn keyword javaScopeDecl public protected private abstract
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +010067syn match javaConceptKind "\<default\>\%(\s*\%(:\|->\)\)\@!"
Bram Moolenaar071d4272004-06-13 20:20:40 +000068
Bram Moolenaar63f32602022-06-09 20:45:54 +010069function s:isModuleInfoDeclarationCurrentBuffer() abort
70 return fnamemodify(bufname("%"), ":t") =~ '^module-info\%(\.class\>\)\@!'
71endfunction
72
Bram Moolenaar91f84f62018-07-29 15:07:52 +020073" Java Modules(Since Java 9, for "module-info.java" file)
Bram Moolenaar63f32602022-06-09 20:45:54 +010074if s:isModuleInfoDeclarationCurrentBuffer()
Bram Moolenaar91f84f62018-07-29 15:07:52 +020075 syn keyword javaModuleStorageClass module transitive
76 syn keyword javaModuleStmt open requires exports opens uses provides
77 syn keyword javaModuleExternal to with
78 syn cluster javaTop add=javaModuleStorageClass,javaModuleStmt,javaModuleExternal
79endif
80
Bram Moolenaar8ada17c2006-01-19 22:16:24 +000081if exists("java_highlight_java_lang_ids")
82 let java_highlight_all=1
83endif
Bram Moolenaar91f84f62018-07-29 15:07:52 +020084if exists("java_highlight_all") || exists("java_highlight_java") || exists("java_highlight_java_lang")
Bram Moolenaar071d4272004-06-13 20:20:40 +000085 " java.lang.*
Bram Moolenaar63f32602022-06-09 20:45:54 +010086 "
87 " The keywords of javaR_JavaLang, javaC_JavaLang, javaE_JavaLang,
88 " and javaX_JavaLang are sub-grouped according to the Java version
89 " of their introduction, and sub-group keywords (that is, class
90 " names) are arranged in alphabetical order, so that future newer
91 " keywords can be pre-sorted and appended without disturbing
92 " the current keyword placement. The below _match_es follow suit.
93
Aliaksei Budavei63d68c22024-03-26 20:12:05 +030094 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 +000095 syn cluster javaTop add=javaR_JavaLang
96 syn cluster javaClasses add=javaR_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +020097 hi def link javaR_JavaLang javaR_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +010098 " Member enumerations:
99 syn match javaC_JavaLang "\%(\<Thread\.\)\@<=\<State\>"
100 syn match javaC_JavaLang "\%(\<Character\.\)\@<=\<UnicodeScript\>"
101 syn match javaC_JavaLang "\%(\<ProcessBuilder\.Redirect\.\)\@<=\<Type\>"
102 syn match javaC_JavaLang "\%(\<StackWalker\.\)\@<=\<Option\>"
103 syn match javaC_JavaLang "\%(\<System\.Logger\.\)\@<=\<Level\>"
104 " Member classes:
105 syn match javaC_JavaLang "\%(\<Character\.\)\@<=\<Subset\>"
106 syn match javaC_JavaLang "\%(\<Character\.\)\@<=\<UnicodeBlock\>"
107 syn match javaC_JavaLang "\%(\<ProcessBuilder\.\)\@<=\<Redirect\>"
108 syn match javaC_JavaLang "\%(\<ModuleLayer\.\)\@<=\<Controller\>"
109 syn match javaC_JavaLang "\%(\<Runtime\.\)\@<=\<Version\>"
110 syn match javaC_JavaLang "\%(\<System\.\)\@<=\<LoggerFinder\>"
111 syn match javaC_JavaLang "\%(\<Enum\.\)\@<=\<EnumDesc\>"
112 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
113 syn match javaC_JavaLang "\<System\>" " See javaDebug.
Aliaksei Budavei63d68c22024-03-26 20:12:05 +0300114 " As of Java 21, java.lang.Compiler is no more (deprecated in Java 9).
115 syn keyword javaLangDeprecated Compiler
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000116 syn cluster javaTop add=javaC_JavaLang
117 syn cluster javaClasses add=javaC_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200118 hi def link javaC_JavaLang javaC_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100119 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 +0000120 syn cluster javaTop add=javaE_JavaLang
121 syn cluster javaClasses add=javaE_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200122 hi def link javaE_JavaLang javaE_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100123 syn keyword javaX_JavaLang ClassNotFoundException CloneNotSupportedException Exception IllegalAccessException InstantiationException InterruptedException NoSuchMethodException Throwable NoSuchFieldException ReflectiveOperationException
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000124 syn cluster javaTop add=javaX_JavaLang
125 syn cluster javaClasses add=javaX_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200126 hi def link javaX_JavaLang javaX_Java
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000127
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200128 hi def link javaR_Java javaR_
129 hi def link javaC_Java javaC_
130 hi def link javaE_Java javaE_
131 hi def link javaX_Java javaX_
132 hi def link javaX_ javaExceptions
133 hi def link javaR_ javaExceptions
134 hi def link javaE_ javaExceptions
135 hi def link javaC_ javaConstant
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000136
Bram Moolenaar071d4272004-06-13 20:20:40 +0000137 syn keyword javaLangObject clone equals finalize getClass hashCode
138 syn keyword javaLangObject notify notifyAll toString wait
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200139 hi def link javaLangObject javaConstant
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000140 syn cluster javaTop add=javaLangObject
Bram Moolenaar071d4272004-06-13 20:20:40 +0000141endif
142
143if filereadable(expand("<sfile>:p:h")."/javaid.vim")
144 source <sfile>:p:h/javaid.vim
145endif
146
147if exists("java_space_errors")
148 if !exists("java_no_trail_space_error")
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200149 syn match javaSpaceError "\s\+$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000150 endif
151 if !exists("java_no_tab_space_error")
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200152 syn match javaSpaceError " \+\t"me=e-1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000153 endif
154endif
155
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100156syn match javaUserLabel "^\s*\<\K\k*\>\%(\<default\>\)\@<!\s*:"he=e-1
157syn region javaLabelRegion transparent matchgroup=javaLabel start="\<case\>" matchgroup=NONE end=":\|->" contains=javaLabelCastType,javaLabelNumber,javaCharacter,javaString,javaConstant,@javaClasses,javaLabelDefault,javaLabelVarType,javaLabelWhenClause
158syn region javaLabelRegion transparent matchgroup=javaLabel start="\<default\>\%(\s*\%(:\|->\)\)\@=" matchgroup=NONE end=":\|->" oneline
159" Consider grouped _default_ _case_ labels, i.e.
160" case null, default ->
161" case null: default:
162syn keyword javaLabelDefault contained default
163syn keyword javaLabelVarType contained var
164syn keyword javaLabelCastType contained char byte short int
165" Allow for the contingency of the enclosing region not being able to
166" _keep_ its _end_, e.g. case ':':.
167syn region javaLabelWhenClause contained transparent matchgroup=javaLabel start="\<when\>" matchgroup=NONE end=":"me=e-1 end="->"me=e-2 contains=TOP,javaExternal
168syn match javaLabelNumber contained "\<0\>[lL]\@!"
169syn match javaLabelNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)\>[lL]\@!"
170hi def link javaLabelDefault javaLabel
171hi def link javaLabelVarType javaOperator
172hi def link javaLabelNumber javaNumber
173hi def link javaLabelCastType javaType
Bram Moolenaar071d4272004-06-13 20:20:40 +0000174
Bram Moolenaarb6b046b2011-12-30 13:11:27 +0100175" highlighting C++ keywords as errors removed, too many people find it
176" annoying. Was: if !exists("java_allow_cpp_keywords")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000177
178" The following cluster contains all java groups except the contained ones
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100179syn 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 +0000180
181
182" Comments
183syn keyword javaTodo contained TODO FIXME XXX
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300184
Bram Moolenaar071d4272004-06-13 20:20:40 +0000185if exists("java_comment_strings")
186 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 +0300187 syn region javaCommentString contained start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell,javaSpecialError,javaTextBlockError
188 syn region javaComment2String contained start=+"+ end=+$\|"+ contains=javaSpecial,javaSpecialChar,@Spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000189 syn match javaCommentCharacter contained "'\\[^']\{1,6\}'" contains=javaSpecialChar
190 syn match javaCommentCharacter contained "'\\''" contains=javaSpecialChar
191 syn match javaCommentCharacter contained "'[^\\]'"
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300192 syn cluster javaCommentSpecial add=javaCommentString,javaCommentCharacter,javaNumber,javaStrTempl
193 syn cluster javaCommentSpecial2 add=javaComment2String,javaCommentCharacter,javaNumber,javaStrTempl
Bram Moolenaar071d4272004-06-13 20:20:40 +0000194endif
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300195
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300196syn region javaComment matchgroup=javaCommentStart start="/\*" end="\*/" contains=@javaCommentSpecial,javaTodo,javaCommentError,javaSpaceError,@Spell
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200197syn match javaCommentStar contained "^\s*\*[^/]"me=e-1
198syn match javaCommentStar contained "^\s*\*$"
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300199syn match javaLineComment "//.*" contains=@javaCommentSpecial2,javaTodo,javaCommentMarkupTag,javaSpaceError,@Spell
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300200syn match javaCommentMarkupTag contained "@\%(end\|highlight\|link\|replace\|start\)\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
201syn match javaCommentMarkupTagAttr contained "\<region\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
202syn 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 +0300203hi def link javaCommentMarkupTagAttr htmlArg
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200204hi def link javaCommentString javaString
205hi def link javaComment2String javaString
206hi def link javaCommentCharacter javaCharacter
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300207syn match javaCommentError contained "/\*"me=e-1 display
208hi def link javaCommentError javaError
209hi def link javaCommentStart javaComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000210
211syn cluster javaTop add=javaComment,javaLineComment
212
213if !exists("java_ignore_javadoc") && main_syntax != 'jsp'
214 syntax case ignore
215 " syntax coloring for javadoc comments (HTML)
Bram Moolenaar63f32602022-06-09 20:45:54 +0100216 syntax include @javaHtml syntax/html.vim
Bram Moolenaar071d4272004-06-13 20:20:40 +0000217 unlet b:current_syntax
Bram Moolenaar5c736222010-01-06 20:54:52 +0100218 " HTML enables spell checking for all text that is not in a syntax item. This
219 " is wrong for Java (all identifiers would be spell-checked), so it's undone
220 " here.
221 syntax spell default
222
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300223 syn region javaDocComment start="/\*\*" end="\*/" keepend contains=javaCommentTitle,@javaHtml,javaDocTags,javaDocSeeTag,javaDocCodeTag,javaDocSnippetTag,javaTodo,javaCommentError,javaSpaceError,@Spell
224 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
225 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 +0300226 syn region javaDocTags contained start="{@\%(li\%(teral\|nk\%(plain\)\=\)\|inherit[Dd]oc\|doc[rR]oot\|value\)\>" end="}"
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300227 syn match javaDocTags contained "@\%(param\|exception\|throws\|since\)\s\+\S\+" contains=javaDocParam
228 syn match javaDocParam contained "\s\S\+"
229 syn match javaDocTags contained "@\%(version\|author\|return\|deprecated\|serial\%(Field\|Data\)\=\)\>"
230 syn region javaDocSeeTag contained matchgroup=javaDocTags start="@see\s\+" matchgroup=NONE end="\_."re=e-1 contains=javaDocSeeTagParam
231 syn match javaDocSeeTagParam contained @"\_[^"]\+"\|<a\s\+\_.\{-}</a>\|\%(\k\|\.\)*\%(#\k\+\%((\_[^)]*)\)\=\)\=@ contains=@javaHtml extend
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300232 syn region javaCodeSkipBlock contained transparent start="{\%(@code\>\)\@!" end="}" contains=javaCodeSkipBlock,javaDocCodeTag
233 syn region javaDocCodeTag contained start="{@code\>" end="}" contains=javaDocCodeTag,javaCodeSkipBlock
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300234 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 +0300235 syn region javaSnippetSkipBlock contained transparent start="{\%(@snippet\>\)\@!" end="}" contains=javaSnippetSkipBlock,javaDocSnippetTag,javaCommentMarkupTag
236 syn region javaDocSnippetTag contained start="{@snippet\>" end="}" contains=javaDocSnippetTag,javaSnippetSkipBlock,javaDocSnippetTagAttr,javaCommentMarkupTag
Bram Moolenaar071d4272004-06-13 20:20:40 +0000237 syntax case match
238endif
239
240" match the special comment /**/
241syn match javaComment "/\*\*/"
242
243" Strings and constants
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200244syn match javaSpecialError contained "\\."
Bram Moolenaar071d4272004-06-13 20:20:40 +0000245syn match javaSpecialCharError contained "[^']"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300246" Escape Sequences (JLS-17, ยง3.10.7):
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300247syn match javaSpecialChar contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000248syn region javaString start=+"+ end=+"+ end=+$+ contains=javaSpecialChar,javaSpecialError,@Spell
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300249syn region javaString start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecialChar,javaSpecialError,javaTextBlockError,@Spell
250syn match javaTextBlockError +"""\s*"""+
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300251syn region javaStrTemplEmbExp contained matchgroup=javaStrTempl start="\\{" end="}" contains=TOP
252syn region javaStrTempl start=+\%(\.[[:space:]\n]*\)\@<="+ end=+"+ contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,@Spell
253syn 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 +0300254" The next line is commented out, it can cause a crash for a long line
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300255"syn match javaStringError +"\%([^"\\]\|\\.\)*$+
Bram Moolenaar071d4272004-06-13 20:20:40 +0000256syn match javaCharacter "'[^']*'" contains=javaSpecialChar,javaSpecialCharError
257syn match javaCharacter "'\\''" contains=javaSpecialChar
258syn match javaCharacter "'[^\\]'"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300259" Integer literals (JLS-17, ยง3.10.1):
260syn keyword javaNumber 0 0l 0L
261syn match javaNumber "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
262" Decimal floating-point literals (JLS-17, ยง3.10.2):
263" Against "\<\d\+\>\.":
264syn match javaNumber "\<\d\%(_*\d\)*\."
265syn match javaNumber "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
266syn match javaNumber "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
267syn match javaNumber "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
268" Hexadecimal floating-point literals (JLS-17, ยง3.10.2):
269syn match javaNumber "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000270
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300271" Unicode characters
272syn match javaSpecial "\\u\x\x\x\x"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000273
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300274syn cluster javaTop add=javaString,javaStrTempl,javaCharacter,javaNumber,javaSpecial,javaStringError,javaTextBlockError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000275
276if exists("java_highlight_functions")
277 if java_highlight_functions == "indent"
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100278 syn match javaFuncDef "^\(\t\| \{8\}\)[_$a-zA-Z][_$a-zA-Z0-9_. \[\]<>]*([^-+*/]*)" contains=javaScopeDecl,javaType,javaStorageClass,@javaClasses,javaAnnotation
279 syn region javaFuncDef start=+^\(\t\| \{8\}\)[$_a-zA-Z][$_a-zA-Z0-9_. \[\]<>]*([^-+*/]*,\s*+ end=+)+ contains=javaScopeDecl,javaType,javaStorageClass,@javaClasses,javaAnnotation
280 syn match javaFuncDef "^ [$_a-zA-Z][$_a-zA-Z0-9_. \[\]<>]*([^-+*/]*)" contains=javaScopeDecl,javaType,javaStorageClass,@javaClasses,javaAnnotation
281 syn region javaFuncDef start=+^ [$_a-zA-Z][$_a-zA-Z0-9_. \[\]<>]*([^-+*/]*,\s*+ end=+)+ contains=javaScopeDecl,javaType,javaStorageClass,@javaClasses,javaAnnotation
Bram Moolenaar071d4272004-06-13 20:20:40 +0000282 else
283 " This line catches method declarations at any indentation>0, but it assumes
284 " two things:
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200285 " 1. class names are always capitalized (ie: Button)
286 " 2. method names are never capitalized (except constructors, of course)
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100287 "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 Budavei9ecf02c2024-02-28 21:30:22 +0100288 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,javaType,javaStorageClass,javaComment,javaLineComment,@javaClasses,javaAnnotation
Bram Moolenaar071d4272004-06-13 20:20:40 +0000289 endif
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100290 syn match javaLambdaDef "\<\K\k*\>\%(\<default\>\)\@<!\s*->"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000291 syn match javaBraces "[{}]"
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100292 syn cluster javaTop add=javaFuncDef,javaBraces,javaLambdaDef
Bram Moolenaar071d4272004-06-13 20:20:40 +0000293endif
294
295if exists("java_highlight_debug")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000296 " Strings and constants
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300297 syn match javaDebugSpecial contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000298 syn region javaDebugString contained start=+"+ end=+"+ contains=javaDebugSpecial
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300299 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 +0300300 " The highlight groups of java{StrTempl,Debug{,Paren,StrTempl}}\,
301 " share one colour by default. Do not conflate unrelated parens.
302 syn region javaDebugStrTemplEmbExp contained matchgroup=javaDebugStrTempl start="\\{" end="}" contains=javaComment,javaLineComment,javaDebug\%(Paren\)\@!.*
303 syn region javaDebugStrTempl contained start=+\%(\.[[:space:]\n]*\)\@<="+ end=+"+ contains=javaDebugStrTemplEmbExp,javaDebugSpecial
304 syn region javaDebugStrTempl contained start=+\%(\.[[:space:]\n]*\)\@<="""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaDebugStrTemplEmbExp,javaDebugSpecial,javaDebugTextBlockError
305 " The next line is commented out, it can cause a crash for a long line
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300306" syn match javaDebugStringError contained +"\%([^"\\]\|\\.\)*$+
307 syn match javaDebugTextBlockError contained +"""\s*"""+
Bram Moolenaar071d4272004-06-13 20:20:40 +0000308 syn match javaDebugCharacter contained "'[^\\]'"
309 syn match javaDebugSpecialCharacter contained "'\\.'"
310 syn match javaDebugSpecialCharacter contained "'\\''"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300311 syn keyword javaDebugNumber contained 0 0l 0L
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300312 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\."
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300313 syn match javaDebugNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
314 syn match javaDebugNumber contained "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
315 syn match javaDebugNumber contained "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
316 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
317 syn match javaDebugNumber contained "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000318 syn keyword javaDebugBoolean contained true false
319 syn keyword javaDebugType contained null this super
320 syn region javaDebugParen start=+(+ end=+)+ contained contains=javaDebug.*,javaDebugParen
321
322 " to make this work you must define the highlighting for these groups
323 syn match javaDebug "\<System\.\(out\|err\)\.print\(ln\)*\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000324 syn match javaDebug "\<p\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
Bram Moolenaar071d4272004-06-13 20:20:40 +0000325 syn match javaDebug "[A-Za-z][a-zA-Z0-9_]*\.printStackTrace\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
326 syn match javaDebug "\<trace[SL]\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
327
328 syn cluster javaTop add=javaDebug
329
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200330 hi def link javaDebug Debug
331 hi def link javaDebugString DebugString
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300332 hi def link javaDebugStrTempl Macro
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200333 hi def link javaDebugStringError javaError
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300334 hi def link javaDebugTextBlockError javaDebugStringError
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200335 hi def link javaDebugType DebugType
336 hi def link javaDebugBoolean DebugBoolean
337 hi def link javaDebugNumber Debug
338 hi def link javaDebugSpecial DebugSpecial
339 hi def link javaDebugSpecialCharacter DebugSpecial
340 hi def link javaDebugCharacter DebugString
341 hi def link javaDebugParen Debug
Bram Moolenaar071d4272004-06-13 20:20:40 +0000342
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200343 hi def link DebugString String
344 hi def link DebugSpecial Special
345 hi def link DebugBoolean Boolean
346 hi def link DebugType Type
Bram Moolenaar071d4272004-06-13 20:20:40 +0000347endif
348
349if exists("java_mark_braces_in_parens_as_errors")
350 syn match javaInParen contained "[{}]"
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200351 hi def link javaInParen javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000352 syn cluster javaTop add=javaInParen
353endif
354
355" catch errors caused by wrong parenthesis
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100356syn region javaParenT transparent matchgroup=javaParen start="(" end=")" contains=@javaTop,javaParenT1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000357syn region javaParenT1 transparent matchgroup=javaParen1 start="(" end=")" contains=@javaTop,javaParenT2 contained
358syn region javaParenT2 transparent matchgroup=javaParen2 start="(" end=")" contains=@javaTop,javaParenT contained
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200359syn match javaParenError ")"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000360" catch errors caused by wrong square parenthesis
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100361syn region javaParenT transparent matchgroup=javaParen start="\[" end="\]" contains=@javaTop,javaParenT1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000362syn region javaParenT1 transparent matchgroup=javaParen1 start="\[" end="\]" contains=@javaTop,javaParenT2 contained
363syn region javaParenT2 transparent matchgroup=javaParen2 start="\[" end="\]" contains=@javaTop,javaParenT contained
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200364syn match javaParenError "\]"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000365
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200366hi def link javaParenError javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000367
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100368if exists("java_highlight_functions")
369 syn match javaLambdaDef "([a-zA-Z0-9_<>\[\], \t]*)\s*->"
370 " needs to be defined after the parenthesis error catcher to work
371endif
372
Bram Moolenaar071d4272004-06-13 20:20:40 +0000373if !exists("java_minlines")
374 let java_minlines = 10
375endif
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300376
377" Note that variations of a /*/ balanced comment, e.g., /*/*/, /*//*/,
378" /* /*/, /* /*/, etc., may have their rightmost /*/ part accepted
379" as a comment start by ':syntax sync ccomment'; consider alternatives
380" to make synchronisation start further towards file's beginning by
381" bumping up g:java_minlines or issuing ':syntax sync fromstart' or
382" preferring &foldmethod set to 'syntax'.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000383exec "syn sync ccomment javaComment minlines=" . java_minlines
384
385" The default highlighting.
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200386hi def link javaLambdaDef Function
387hi def link javaFuncDef Function
388hi def link javaVarArg Function
389hi def link javaBraces Function
390hi def link javaBranch Conditional
391hi def link javaUserLabelRef javaUserLabel
392hi def link javaLabel Label
393hi def link javaUserLabel Label
394hi def link javaConditional Conditional
395hi def link javaRepeat Repeat
396hi def link javaExceptions Exception
397hi def link javaAssert Statement
398hi def link javaStorageClass StorageClass
399hi def link javaMethodDecl javaStorageClass
400hi def link javaClassDecl javaStorageClass
401hi def link javaScopeDecl javaStorageClass
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100402hi def link javaConceptKind NonText
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200403
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200404hi def link javaBoolean Boolean
405hi def link javaSpecial Special
406hi def link javaSpecialError Error
407hi def link javaSpecialCharError Error
408hi def link javaString String
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300409hi def link javaStrTempl Macro
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200410hi def link javaCharacter Character
411hi def link javaSpecialChar SpecialChar
412hi def link javaNumber Number
413hi def link javaError Error
414hi def link javaStringError Error
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300415hi def link javaTextBlockError javaStringError
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200416hi def link javaStatement Statement
417hi def link javaOperator Operator
418hi def link javaComment Comment
419hi def link javaDocComment Comment
420hi def link javaLineComment Comment
421hi def link javaConstant Constant
422hi def link javaTypedef Typedef
423hi def link javaTodo Todo
424hi def link javaAnnotation PreProc
Bram Moolenaar071d4272004-06-13 20:20:40 +0000425
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200426hi def link javaCommentTitle SpecialComment
427hi def link javaDocTags Special
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300428hi def link javaDocCodeTag Special
429hi def link javaDocSnippetTag Special
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200430hi def link javaDocParam Function
431hi def link javaDocSeeTagParam Function
432hi def link javaCommentStar javaComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000433
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200434hi def link javaType Type
435hi def link javaExternal Include
Bram Moolenaar071d4272004-06-13 20:20:40 +0000436
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200437hi def link htmlComment Special
438hi def link htmlCommentPart Special
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300439hi def link htmlArg Type
440hi def link htmlString String
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200441hi def link javaSpaceError Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000442
Bram Moolenaar63f32602022-06-09 20:45:54 +0100443if s:isModuleInfoDeclarationCurrentBuffer()
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200444 hi def link javaModuleStorageClass StorageClass
445 hi def link javaModuleStmt Statement
446 hi def link javaModuleExternal Include
447endif
448
Bram Moolenaar071d4272004-06-13 20:20:40 +0000449let b:current_syntax = "java"
450
451if main_syntax == 'java'
452 unlet main_syntax
453endif
454
Bram Moolenaar63f32602022-06-09 20:45:54 +0100455delfunction! s:isModuleInfoDeclarationCurrentBuffer
Bram Moolenaar071d4272004-06-13 20:20:40 +0000456let b:spell_options="contained"
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +0200457let &cpo = s:cpo_save
458unlet s:cpo_save
Bram Moolenaar071d4272004-06-13 20:20:40 +0000459
460" vim: ts=8