blob: c059de603c773054c86dfafb04727cd22adf496a [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 Budaveia2c65802024-03-09 20:03:11 +03005" Last Change: 2024 Mar 06
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
94 syn keyword javaR_JavaLang ArithmeticException ArrayIndexOutOfBoundsException ArrayStoreException ClassCastException IllegalArgumentException IllegalMonitorStateException IllegalThreadStateException IndexOutOfBoundsException NegativeArraySizeException NullPointerException NumberFormatException RuntimeException SecurityException StringIndexOutOfBoundsException IllegalStateException UnsupportedOperationException EnumConstantNotPresentException TypeNotPresentException IllegalCallerException LayerInstantiationException
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.
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000114 syn cluster javaTop add=javaC_JavaLang
115 syn cluster javaClasses add=javaC_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200116 hi def link javaC_JavaLang javaC_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100117 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 +0000118 syn cluster javaTop add=javaE_JavaLang
119 syn cluster javaClasses add=javaE_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200120 hi def link javaE_JavaLang javaE_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100121 syn keyword javaX_JavaLang ClassNotFoundException CloneNotSupportedException Exception IllegalAccessException InstantiationException InterruptedException NoSuchMethodException Throwable NoSuchFieldException ReflectiveOperationException
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000122 syn cluster javaTop add=javaX_JavaLang
123 syn cluster javaClasses add=javaX_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200124 hi def link javaX_JavaLang javaX_Java
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000125
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200126 hi def link javaR_Java javaR_
127 hi def link javaC_Java javaC_
128 hi def link javaE_Java javaE_
129 hi def link javaX_Java javaX_
130 hi def link javaX_ javaExceptions
131 hi def link javaR_ javaExceptions
132 hi def link javaE_ javaExceptions
133 hi def link javaC_ javaConstant
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000134
Bram Moolenaar071d4272004-06-13 20:20:40 +0000135 syn keyword javaLangObject clone equals finalize getClass hashCode
136 syn keyword javaLangObject notify notifyAll toString wait
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200137 hi def link javaLangObject javaConstant
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000138 syn cluster javaTop add=javaLangObject
Bram Moolenaar071d4272004-06-13 20:20:40 +0000139endif
140
141if filereadable(expand("<sfile>:p:h")."/javaid.vim")
142 source <sfile>:p:h/javaid.vim
143endif
144
145if exists("java_space_errors")
146 if !exists("java_no_trail_space_error")
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200147 syn match javaSpaceError "\s\+$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000148 endif
149 if !exists("java_no_tab_space_error")
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200150 syn match javaSpaceError " \+\t"me=e-1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000151 endif
152endif
153
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100154syn match javaUserLabel "^\s*\<\K\k*\>\%(\<default\>\)\@<!\s*:"he=e-1
155syn region javaLabelRegion transparent matchgroup=javaLabel start="\<case\>" matchgroup=NONE end=":\|->" contains=javaLabelCastType,javaLabelNumber,javaCharacter,javaString,javaConstant,@javaClasses,javaLabelDefault,javaLabelVarType,javaLabelWhenClause
156syn region javaLabelRegion transparent matchgroup=javaLabel start="\<default\>\%(\s*\%(:\|->\)\)\@=" matchgroup=NONE end=":\|->" oneline
157" Consider grouped _default_ _case_ labels, i.e.
158" case null, default ->
159" case null: default:
160syn keyword javaLabelDefault contained default
161syn keyword javaLabelVarType contained var
162syn keyword javaLabelCastType contained char byte short int
163" Allow for the contingency of the enclosing region not being able to
164" _keep_ its _end_, e.g. case ':':.
165syn region javaLabelWhenClause contained transparent matchgroup=javaLabel start="\<when\>" matchgroup=NONE end=":"me=e-1 end="->"me=e-2 contains=TOP,javaExternal
166syn match javaLabelNumber contained "\<0\>[lL]\@!"
167syn match javaLabelNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)\>[lL]\@!"
168hi def link javaLabelDefault javaLabel
169hi def link javaLabelVarType javaOperator
170hi def link javaLabelNumber javaNumber
171hi def link javaLabelCastType javaType
Bram Moolenaar071d4272004-06-13 20:20:40 +0000172
Bram Moolenaarb6b046b2011-12-30 13:11:27 +0100173" highlighting C++ keywords as errors removed, too many people find it
174" annoying. Was: if !exists("java_allow_cpp_keywords")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000175
176" The following cluster contains all java groups except the contained ones
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100177syn 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 +0000178
179
180" Comments
181syn keyword javaTodo contained TODO FIXME XXX
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300182
Bram Moolenaar071d4272004-06-13 20:20:40 +0000183if exists("java_comment_strings")
184 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 +0300185 syn region javaCommentString contained start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell,javaSpecialError,javaTextBlockError
186 syn region javaComment2String contained start=+"+ end=+$\|"+ contains=javaSpecial,javaSpecialChar,@Spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000187 syn match javaCommentCharacter contained "'\\[^']\{1,6\}'" contains=javaSpecialChar
188 syn match javaCommentCharacter contained "'\\''" contains=javaSpecialChar
189 syn match javaCommentCharacter contained "'[^\\]'"
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300190 syn cluster javaCommentSpecial add=javaCommentString,javaCommentCharacter,javaNumber,javaStrTempl
191 syn cluster javaCommentSpecial2 add=javaComment2String,javaCommentCharacter,javaNumber,javaStrTempl
Bram Moolenaar071d4272004-06-13 20:20:40 +0000192endif
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300193
Bram Moolenaar071d4272004-06-13 20:20:40 +0000194syn region javaComment start="/\*" end="\*/" contains=@javaCommentSpecial,javaTodo,@Spell
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200195syn match javaCommentStar contained "^\s*\*[^/]"me=e-1
196syn match javaCommentStar contained "^\s*\*$"
197syn match javaLineComment "//.*" contains=@javaCommentSpecial2,javaTodo,@Spell
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200198hi def link javaCommentString javaString
199hi def link javaComment2String javaString
200hi def link javaCommentCharacter javaCharacter
Bram Moolenaar071d4272004-06-13 20:20:40 +0000201
202syn cluster javaTop add=javaComment,javaLineComment
203
204if !exists("java_ignore_javadoc") && main_syntax != 'jsp'
205 syntax case ignore
206 " syntax coloring for javadoc comments (HTML)
Bram Moolenaar63f32602022-06-09 20:45:54 +0100207 syntax include @javaHtml syntax/html.vim
Bram Moolenaar071d4272004-06-13 20:20:40 +0000208 unlet b:current_syntax
Bram Moolenaar5c736222010-01-06 20:54:52 +0100209 " HTML enables spell checking for all text that is not in a syntax item. This
210 " is wrong for Java (all identifiers would be spell-checked), so it's undone
211 " here.
212 syntax spell default
213
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200214 syn region javaDocComment start="/\*\*" end="\*/" keepend contains=javaCommentTitle,@javaHtml,javaDocTags,javaDocSeeTag,javaTodo,@Spell
215 syn region javaCommentTitle contained matchgroup=javaDocComment start="/\*\*" matchgroup=javaCommentTitle keepend end="\.$" end="\.[ \t\r<&]"me=e-1 end="[^{]@"me=s-2,he=s-1 end="\*/"me=s-1,he=s-1 contains=@javaHtml,javaCommentStar,javaTodo,@Spell,javaDocTags,javaDocSeeTag
Bram Moolenaar071d4272004-06-13 20:20:40 +0000216
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +0200217 syn region javaDocTags contained start="{@\(code\|link\|linkplain\|inherit[Dd]oc\|doc[rR]oot\|value\)" end="}"
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200218 syn match javaDocTags contained "@\(param\|exception\|throws\|since\)\s\+\S\+" contains=javaDocParam
219 syn match javaDocParam contained "\s\S\+"
220 syn match javaDocTags contained "@\(version\|author\|return\|deprecated\|serial\|serialField\|serialData\)\>"
221 syn region javaDocSeeTag contained matchgroup=javaDocTags start="@see\s\+" matchgroup=NONE end="\_."re=e-1 contains=javaDocSeeTagParam
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000222 syn match javaDocSeeTagParam contained @"\_[^"]\+"\|<a\s\+\_.\{-}</a>\|\(\k\|\.\)*\(#\k\+\((\_[^)]\+)\)\=\)\=@ extend
Bram Moolenaar071d4272004-06-13 20:20:40 +0000223 syntax case match
224endif
225
226" match the special comment /**/
227syn match javaComment "/\*\*/"
228
229" Strings and constants
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200230syn match javaSpecialError contained "\\."
Bram Moolenaar071d4272004-06-13 20:20:40 +0000231syn match javaSpecialCharError contained "[^']"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300232" Escape Sequences (JLS-17, ยง3.10.7):
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300233syn match javaSpecialChar contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000234syn region javaString start=+"+ end=+"+ end=+$+ contains=javaSpecialChar,javaSpecialError,@Spell
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300235syn region javaString start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecialChar,javaSpecialError,javaTextBlockError,@Spell
236syn match javaTextBlockError +"""\s*"""+
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300237syn region javaStrTemplEmbExp contained matchgroup=javaStrTempl start="\\{" end="}" contains=TOP
238syn region javaStrTempl start=+\%(\.[[:space:]\n]*\)\@<="+ end=+"+ contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,@Spell
239syn 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 +0300240" The next line is commented out, it can cause a crash for a long line
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300241"syn match javaStringError +"\%([^"\\]\|\\.\)*$+
Bram Moolenaar071d4272004-06-13 20:20:40 +0000242syn match javaCharacter "'[^']*'" contains=javaSpecialChar,javaSpecialCharError
243syn match javaCharacter "'\\''" contains=javaSpecialChar
244syn match javaCharacter "'[^\\]'"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300245" Integer literals (JLS-17, ยง3.10.1):
246syn keyword javaNumber 0 0l 0L
247syn match javaNumber "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
248" Decimal floating-point literals (JLS-17, ยง3.10.2):
249" Against "\<\d\+\>\.":
250syn match javaNumber "\<\d\%(_*\d\)*\."
251syn match javaNumber "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
252syn match javaNumber "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
253syn match javaNumber "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
254" Hexadecimal floating-point literals (JLS-17, ยง3.10.2):
255syn match javaNumber "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000256
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300257" Unicode characters
258syn match javaSpecial "\\u\x\x\x\x"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000259
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300260syn cluster javaTop add=javaString,javaStrTempl,javaCharacter,javaNumber,javaSpecial,javaStringError,javaTextBlockError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000261
262if exists("java_highlight_functions")
263 if java_highlight_functions == "indent"
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100264 syn match javaFuncDef "^\(\t\| \{8\}\)[_$a-zA-Z][_$a-zA-Z0-9_. \[\]<>]*([^-+*/]*)" contains=javaScopeDecl,javaType,javaStorageClass,@javaClasses,javaAnnotation
265 syn region javaFuncDef start=+^\(\t\| \{8\}\)[$_a-zA-Z][$_a-zA-Z0-9_. \[\]<>]*([^-+*/]*,\s*+ end=+)+ contains=javaScopeDecl,javaType,javaStorageClass,@javaClasses,javaAnnotation
266 syn match javaFuncDef "^ [$_a-zA-Z][$_a-zA-Z0-9_. \[\]<>]*([^-+*/]*)" contains=javaScopeDecl,javaType,javaStorageClass,@javaClasses,javaAnnotation
267 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 +0000268 else
269 " This line catches method declarations at any indentation>0, but it assumes
270 " two things:
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200271 " 1. class names are always capitalized (ie: Button)
272 " 2. method names are never capitalized (except constructors, of course)
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100273 "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 +0100274 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 +0000275 endif
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100276 syn match javaLambdaDef "\<\K\k*\>\%(\<default\>\)\@<!\s*->"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000277 syn match javaBraces "[{}]"
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100278 syn cluster javaTop add=javaFuncDef,javaBraces,javaLambdaDef
Bram Moolenaar071d4272004-06-13 20:20:40 +0000279endif
280
281if exists("java_highlight_debug")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000282 " Strings and constants
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300283 syn match javaDebugSpecial contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000284 syn region javaDebugString contained start=+"+ end=+"+ contains=javaDebugSpecial
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300285 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 +0300286 " The highlight groups of java{StrTempl,Debug{,Paren,StrTempl}}\,
287 " share one colour by default. Do not conflate unrelated parens.
288 syn region javaDebugStrTemplEmbExp contained matchgroup=javaDebugStrTempl start="\\{" end="}" contains=javaComment,javaLineComment,javaDebug\%(Paren\)\@!.*
289 syn region javaDebugStrTempl contained start=+\%(\.[[:space:]\n]*\)\@<="+ end=+"+ contains=javaDebugStrTemplEmbExp,javaDebugSpecial
290 syn region javaDebugStrTempl contained start=+\%(\.[[:space:]\n]*\)\@<="""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaDebugStrTemplEmbExp,javaDebugSpecial,javaDebugTextBlockError
291 " The next line is commented out, it can cause a crash for a long line
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300292" syn match javaDebugStringError contained +"\%([^"\\]\|\\.\)*$+
293 syn match javaDebugTextBlockError contained +"""\s*"""+
Bram Moolenaar071d4272004-06-13 20:20:40 +0000294 syn match javaDebugCharacter contained "'[^\\]'"
295 syn match javaDebugSpecialCharacter contained "'\\.'"
296 syn match javaDebugSpecialCharacter contained "'\\''"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300297 syn keyword javaDebugNumber contained 0 0l 0L
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300298 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\."
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300299 syn match javaDebugNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
300 syn match javaDebugNumber contained "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
301 syn match javaDebugNumber contained "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
302 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
303 syn match javaDebugNumber contained "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000304 syn keyword javaDebugBoolean contained true false
305 syn keyword javaDebugType contained null this super
306 syn region javaDebugParen start=+(+ end=+)+ contained contains=javaDebug.*,javaDebugParen
307
308 " to make this work you must define the highlighting for these groups
309 syn match javaDebug "\<System\.\(out\|err\)\.print\(ln\)*\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000310 syn match javaDebug "\<p\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
Bram Moolenaar071d4272004-06-13 20:20:40 +0000311 syn match javaDebug "[A-Za-z][a-zA-Z0-9_]*\.printStackTrace\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
312 syn match javaDebug "\<trace[SL]\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
313
314 syn cluster javaTop add=javaDebug
315
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200316 hi def link javaDebug Debug
317 hi def link javaDebugString DebugString
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300318 hi def link javaDebugStrTempl Macro
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200319 hi def link javaDebugStringError javaError
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300320 hi def link javaDebugTextBlockError javaDebugStringError
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200321 hi def link javaDebugType DebugType
322 hi def link javaDebugBoolean DebugBoolean
323 hi def link javaDebugNumber Debug
324 hi def link javaDebugSpecial DebugSpecial
325 hi def link javaDebugSpecialCharacter DebugSpecial
326 hi def link javaDebugCharacter DebugString
327 hi def link javaDebugParen Debug
Bram Moolenaar071d4272004-06-13 20:20:40 +0000328
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200329 hi def link DebugString String
330 hi def link DebugSpecial Special
331 hi def link DebugBoolean Boolean
332 hi def link DebugType Type
Bram Moolenaar071d4272004-06-13 20:20:40 +0000333endif
334
335if exists("java_mark_braces_in_parens_as_errors")
336 syn match javaInParen contained "[{}]"
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200337 hi def link javaInParen javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000338 syn cluster javaTop add=javaInParen
339endif
340
341" catch errors caused by wrong parenthesis
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100342syn region javaParenT transparent matchgroup=javaParen start="(" end=")" contains=@javaTop,javaParenT1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000343syn region javaParenT1 transparent matchgroup=javaParen1 start="(" end=")" contains=@javaTop,javaParenT2 contained
344syn region javaParenT2 transparent matchgroup=javaParen2 start="(" end=")" contains=@javaTop,javaParenT contained
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200345syn match javaParenError ")"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000346" catch errors caused by wrong square parenthesis
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100347syn region javaParenT transparent matchgroup=javaParen start="\[" end="\]" contains=@javaTop,javaParenT1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000348syn region javaParenT1 transparent matchgroup=javaParen1 start="\[" end="\]" contains=@javaTop,javaParenT2 contained
349syn region javaParenT2 transparent matchgroup=javaParen2 start="\[" end="\]" contains=@javaTop,javaParenT contained
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200350syn match javaParenError "\]"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000351
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200352hi def link javaParenError javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000353
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100354if exists("java_highlight_functions")
355 syn match javaLambdaDef "([a-zA-Z0-9_<>\[\], \t]*)\s*->"
356 " needs to be defined after the parenthesis error catcher to work
357endif
358
Bram Moolenaar071d4272004-06-13 20:20:40 +0000359if !exists("java_minlines")
360 let java_minlines = 10
361endif
362exec "syn sync ccomment javaComment minlines=" . java_minlines
363
364" The default highlighting.
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200365hi def link javaLambdaDef Function
366hi def link javaFuncDef Function
367hi def link javaVarArg Function
368hi def link javaBraces Function
369hi def link javaBranch Conditional
370hi def link javaUserLabelRef javaUserLabel
371hi def link javaLabel Label
372hi def link javaUserLabel Label
373hi def link javaConditional Conditional
374hi def link javaRepeat Repeat
375hi def link javaExceptions Exception
376hi def link javaAssert Statement
377hi def link javaStorageClass StorageClass
378hi def link javaMethodDecl javaStorageClass
379hi def link javaClassDecl javaStorageClass
380hi def link javaScopeDecl javaStorageClass
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100381hi def link javaConceptKind NonText
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200382
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200383hi def link javaBoolean Boolean
384hi def link javaSpecial Special
385hi def link javaSpecialError Error
386hi def link javaSpecialCharError Error
387hi def link javaString String
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300388hi def link javaStrTempl Macro
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200389hi def link javaCharacter Character
390hi def link javaSpecialChar SpecialChar
391hi def link javaNumber Number
392hi def link javaError Error
393hi def link javaStringError Error
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300394hi def link javaTextBlockError javaStringError
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200395hi def link javaStatement Statement
396hi def link javaOperator Operator
397hi def link javaComment Comment
398hi def link javaDocComment Comment
399hi def link javaLineComment Comment
400hi def link javaConstant Constant
401hi def link javaTypedef Typedef
402hi def link javaTodo Todo
403hi def link javaAnnotation PreProc
Bram Moolenaar071d4272004-06-13 20:20:40 +0000404
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200405hi def link javaCommentTitle SpecialComment
406hi def link javaDocTags Special
407hi def link javaDocParam Function
408hi def link javaDocSeeTagParam Function
409hi def link javaCommentStar javaComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000410
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200411hi def link javaType Type
412hi def link javaExternal Include
Bram Moolenaar071d4272004-06-13 20:20:40 +0000413
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200414hi def link htmlComment Special
415hi def link htmlCommentPart Special
416hi def link javaSpaceError Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000417
Bram Moolenaar63f32602022-06-09 20:45:54 +0100418if s:isModuleInfoDeclarationCurrentBuffer()
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200419 hi def link javaModuleStorageClass StorageClass
420 hi def link javaModuleStmt Statement
421 hi def link javaModuleExternal Include
422endif
423
Bram Moolenaar071d4272004-06-13 20:20:40 +0000424let b:current_syntax = "java"
425
426if main_syntax == 'java'
427 unlet main_syntax
428endif
429
Bram Moolenaar63f32602022-06-09 20:45:54 +0100430delfunction! s:isModuleInfoDeclarationCurrentBuffer
Bram Moolenaar071d4272004-06-13 20:20:40 +0000431let b:spell_options="contained"
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +0200432let &cpo = s:cpo_save
433unlet s:cpo_save
Bram Moolenaar071d4272004-06-13 20:20:40 +0000434
435" vim: ts=8