blob: aec2955533e55aa59afbb1466da2993bae014a91 [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 Budavei100a6652024-03-02 01:11:14 +03005" Last Change: 2024 Mar 01
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
182if exists("java_comment_strings")
183 syn region javaCommentString contained start=+"+ end=+"+ end=+$+ end=+\*/+me=s-1,he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200184 syn region javaComment2String contained start=+"+ end=+$\|"+ contains=javaSpecial,javaSpecialChar,@Spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000185 syn match javaCommentCharacter contained "'\\[^']\{1,6\}'" contains=javaSpecialChar
186 syn match javaCommentCharacter contained "'\\''" contains=javaSpecialChar
187 syn match javaCommentCharacter contained "'[^\\]'"
188 syn cluster javaCommentSpecial add=javaCommentString,javaCommentCharacter,javaNumber
189 syn cluster javaCommentSpecial2 add=javaComment2String,javaCommentCharacter,javaNumber
190endif
191syn region javaComment start="/\*" end="\*/" contains=@javaCommentSpecial,javaTodo,@Spell
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200192syn match javaCommentStar contained "^\s*\*[^/]"me=e-1
193syn match javaCommentStar contained "^\s*\*$"
194syn match javaLineComment "//.*" contains=@javaCommentSpecial2,javaTodo,@Spell
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200195hi def link javaCommentString javaString
196hi def link javaComment2String javaString
197hi def link javaCommentCharacter javaCharacter
Bram Moolenaar071d4272004-06-13 20:20:40 +0000198
199syn cluster javaTop add=javaComment,javaLineComment
200
201if !exists("java_ignore_javadoc") && main_syntax != 'jsp'
202 syntax case ignore
203 " syntax coloring for javadoc comments (HTML)
Bram Moolenaar63f32602022-06-09 20:45:54 +0100204 syntax include @javaHtml syntax/html.vim
Bram Moolenaar071d4272004-06-13 20:20:40 +0000205 unlet b:current_syntax
Bram Moolenaar5c736222010-01-06 20:54:52 +0100206 " HTML enables spell checking for all text that is not in a syntax item. This
207 " is wrong for Java (all identifiers would be spell-checked), so it's undone
208 " here.
209 syntax spell default
210
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200211 syn region javaDocComment start="/\*\*" end="\*/" keepend contains=javaCommentTitle,@javaHtml,javaDocTags,javaDocSeeTag,javaTodo,@Spell
212 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 +0000213
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +0200214 syn region javaDocTags contained start="{@\(code\|link\|linkplain\|inherit[Dd]oc\|doc[rR]oot\|value\)" end="}"
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200215 syn match javaDocTags contained "@\(param\|exception\|throws\|since\)\s\+\S\+" contains=javaDocParam
216 syn match javaDocParam contained "\s\S\+"
217 syn match javaDocTags contained "@\(version\|author\|return\|deprecated\|serial\|serialField\|serialData\)\>"
218 syn region javaDocSeeTag contained matchgroup=javaDocTags start="@see\s\+" matchgroup=NONE end="\_."re=e-1 contains=javaDocSeeTagParam
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000219 syn match javaDocSeeTagParam contained @"\_[^"]\+"\|<a\s\+\_.\{-}</a>\|\(\k\|\.\)*\(#\k\+\((\_[^)]\+)\)\=\)\=@ extend
Bram Moolenaar071d4272004-06-13 20:20:40 +0000220 syntax case match
221endif
222
223" match the special comment /**/
224syn match javaComment "/\*\*/"
225
226" Strings and constants
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200227syn match javaSpecialError contained "\\."
Bram Moolenaar071d4272004-06-13 20:20:40 +0000228syn match javaSpecialCharError contained "[^']"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300229" Escape Sequences (JLS-17, ยง3.10.7):
230syn match javaSpecialChar contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[btnfr"'\\]\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000231syn region javaString start=+"+ end=+"+ end=+$+ contains=javaSpecialChar,javaSpecialError,@Spell
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300232" The next line is commented out, it can cause a crash for a long line
Bram Moolenaar071d4272004-06-13 20:20:40 +0000233"syn match javaStringError +"\([^"\\]\|\\.\)*$+
234syn match javaCharacter "'[^']*'" contains=javaSpecialChar,javaSpecialCharError
235syn match javaCharacter "'\\''" contains=javaSpecialChar
236syn match javaCharacter "'[^\\]'"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300237" Integer literals (JLS-17, ยง3.10.1):
238syn keyword javaNumber 0 0l 0L
239syn match javaNumber "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
240" Decimal floating-point literals (JLS-17, ยง3.10.2):
241" Against "\<\d\+\>\.":
242syn match javaNumber "\<\d\%(_*\d\)*\."
243syn match javaNumber "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
244syn match javaNumber "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
245syn match javaNumber "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
246" Hexadecimal floating-point literals (JLS-17, ยง3.10.2):
247syn match javaNumber "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000248
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300249" Unicode characters
250syn match javaSpecial "\\u\x\x\x\x"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000251
252syn cluster javaTop add=javaString,javaCharacter,javaNumber,javaSpecial,javaStringError
253
254if exists("java_highlight_functions")
255 if java_highlight_functions == "indent"
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100256 syn match javaFuncDef "^\(\t\| \{8\}\)[_$a-zA-Z][_$a-zA-Z0-9_. \[\]<>]*([^-+*/]*)" contains=javaScopeDecl,javaType,javaStorageClass,@javaClasses,javaAnnotation
257 syn region javaFuncDef start=+^\(\t\| \{8\}\)[$_a-zA-Z][$_a-zA-Z0-9_. \[\]<>]*([^-+*/]*,\s*+ end=+)+ contains=javaScopeDecl,javaType,javaStorageClass,@javaClasses,javaAnnotation
258 syn match javaFuncDef "^ [$_a-zA-Z][$_a-zA-Z0-9_. \[\]<>]*([^-+*/]*)" contains=javaScopeDecl,javaType,javaStorageClass,@javaClasses,javaAnnotation
259 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 +0000260 else
261 " This line catches method declarations at any indentation>0, but it assumes
262 " two things:
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200263 " 1. class names are always capitalized (ie: Button)
264 " 2. method names are never capitalized (except constructors, of course)
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100265 "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 +0100266 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 +0000267 endif
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100268 syn match javaLambdaDef "\<\K\k*\>\%(\<default\>\)\@<!\s*->"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000269 syn match javaBraces "[{}]"
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100270 syn cluster javaTop add=javaFuncDef,javaBraces,javaLambdaDef
Bram Moolenaar071d4272004-06-13 20:20:40 +0000271endif
272
273if exists("java_highlight_debug")
274
275 " Strings and constants
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300276 syn match javaDebugSpecial contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[btnfr"'\\]\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000277 syn region javaDebugString contained start=+"+ end=+"+ contains=javaDebugSpecial
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300278 syn match javaDebugStringError contained +"\%([^"\\]\|\\.\)*$+
Bram Moolenaar071d4272004-06-13 20:20:40 +0000279 syn match javaDebugCharacter contained "'[^\\]'"
280 syn match javaDebugSpecialCharacter contained "'\\.'"
281 syn match javaDebugSpecialCharacter contained "'\\''"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300282 syn keyword javaDebugNumber contained 0 0l 0L
283 syn match javaNumber contained "\<\d\%(_*\d\)*\."
284 syn match javaDebugNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
285 syn match javaDebugNumber contained "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
286 syn match javaDebugNumber contained "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
287 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
288 syn match javaDebugNumber contained "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000289 syn keyword javaDebugBoolean contained true false
290 syn keyword javaDebugType contained null this super
291 syn region javaDebugParen start=+(+ end=+)+ contained contains=javaDebug.*,javaDebugParen
292
293 " to make this work you must define the highlighting for these groups
294 syn match javaDebug "\<System\.\(out\|err\)\.print\(ln\)*\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000295 syn match javaDebug "\<p\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
Bram Moolenaar071d4272004-06-13 20:20:40 +0000296 syn match javaDebug "[A-Za-z][a-zA-Z0-9_]*\.printStackTrace\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
297 syn match javaDebug "\<trace[SL]\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
298
299 syn cluster javaTop add=javaDebug
300
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200301 hi def link javaDebug Debug
302 hi def link javaDebugString DebugString
303 hi def link javaDebugStringError javaError
304 hi def link javaDebugType DebugType
305 hi def link javaDebugBoolean DebugBoolean
306 hi def link javaDebugNumber Debug
307 hi def link javaDebugSpecial DebugSpecial
308 hi def link javaDebugSpecialCharacter DebugSpecial
309 hi def link javaDebugCharacter DebugString
310 hi def link javaDebugParen Debug
Bram Moolenaar071d4272004-06-13 20:20:40 +0000311
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200312 hi def link DebugString String
313 hi def link DebugSpecial Special
314 hi def link DebugBoolean Boolean
315 hi def link DebugType Type
Bram Moolenaar071d4272004-06-13 20:20:40 +0000316endif
317
318if exists("java_mark_braces_in_parens_as_errors")
319 syn match javaInParen contained "[{}]"
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200320 hi def link javaInParen javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000321 syn cluster javaTop add=javaInParen
322endif
323
324" catch errors caused by wrong parenthesis
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100325syn region javaParenT transparent matchgroup=javaParen start="(" end=")" contains=@javaTop,javaParenT1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000326syn region javaParenT1 transparent matchgroup=javaParen1 start="(" end=")" contains=@javaTop,javaParenT2 contained
327syn region javaParenT2 transparent matchgroup=javaParen2 start="(" end=")" contains=@javaTop,javaParenT contained
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200328syn match javaParenError ")"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000329" catch errors caused by wrong square parenthesis
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100330syn region javaParenT transparent matchgroup=javaParen start="\[" end="\]" contains=@javaTop,javaParenT1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000331syn region javaParenT1 transparent matchgroup=javaParen1 start="\[" end="\]" contains=@javaTop,javaParenT2 contained
332syn region javaParenT2 transparent matchgroup=javaParen2 start="\[" end="\]" contains=@javaTop,javaParenT contained
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200333syn match javaParenError "\]"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000334
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200335hi def link javaParenError javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000336
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100337if exists("java_highlight_functions")
338 syn match javaLambdaDef "([a-zA-Z0-9_<>\[\], \t]*)\s*->"
339 " needs to be defined after the parenthesis error catcher to work
340endif
341
Bram Moolenaar071d4272004-06-13 20:20:40 +0000342if !exists("java_minlines")
343 let java_minlines = 10
344endif
345exec "syn sync ccomment javaComment minlines=" . java_minlines
346
347" The default highlighting.
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200348hi def link javaLambdaDef Function
349hi def link javaFuncDef Function
350hi def link javaVarArg Function
351hi def link javaBraces Function
352hi def link javaBranch Conditional
353hi def link javaUserLabelRef javaUserLabel
354hi def link javaLabel Label
355hi def link javaUserLabel Label
356hi def link javaConditional Conditional
357hi def link javaRepeat Repeat
358hi def link javaExceptions Exception
359hi def link javaAssert Statement
360hi def link javaStorageClass StorageClass
361hi def link javaMethodDecl javaStorageClass
362hi def link javaClassDecl javaStorageClass
363hi def link javaScopeDecl javaStorageClass
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100364hi def link javaConceptKind NonText
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200365
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200366hi def link javaBoolean Boolean
367hi def link javaSpecial Special
368hi def link javaSpecialError Error
369hi def link javaSpecialCharError Error
370hi def link javaString String
371hi def link javaCharacter Character
372hi def link javaSpecialChar SpecialChar
373hi def link javaNumber Number
374hi def link javaError Error
375hi def link javaStringError Error
376hi def link javaStatement Statement
377hi def link javaOperator Operator
378hi def link javaComment Comment
379hi def link javaDocComment Comment
380hi def link javaLineComment Comment
381hi def link javaConstant Constant
382hi def link javaTypedef Typedef
383hi def link javaTodo Todo
384hi def link javaAnnotation PreProc
Bram Moolenaar071d4272004-06-13 20:20:40 +0000385
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200386hi def link javaCommentTitle SpecialComment
387hi def link javaDocTags Special
388hi def link javaDocParam Function
389hi def link javaDocSeeTagParam Function
390hi def link javaCommentStar javaComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000391
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200392hi def link javaType Type
393hi def link javaExternal Include
Bram Moolenaar071d4272004-06-13 20:20:40 +0000394
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200395hi def link htmlComment Special
396hi def link htmlCommentPart Special
397hi def link javaSpaceError Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000398
Bram Moolenaar63f32602022-06-09 20:45:54 +0100399if s:isModuleInfoDeclarationCurrentBuffer()
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200400 hi def link javaModuleStorageClass StorageClass
401 hi def link javaModuleStmt Statement
402 hi def link javaModuleExternal Include
403endif
404
Bram Moolenaar071d4272004-06-13 20:20:40 +0000405let b:current_syntax = "java"
406
407if main_syntax == 'java'
408 unlet main_syntax
409endif
410
Bram Moolenaar63f32602022-06-09 20:45:54 +0100411delfunction! s:isModuleInfoDeclarationCurrentBuffer
Bram Moolenaar071d4272004-06-13 20:20:40 +0000412let b:spell_options="contained"
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +0200413let &cpo = s:cpo_save
414unlet s:cpo_save
Bram Moolenaar071d4272004-06-13 20:20:40 +0000415
416" vim: ts=8