blob: 1f71f9e4ee6db4afa2387319861d9ccf12297d0f [file] [log] [blame]
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +02001" Vim syntax file
Aliaksei Budavei40524742024-04-14 19:57:00 +03002" Language: Java
3" Maintainer: Aliaksei Budavei <0x000c70 AT gmail DOT com>
4" Former Maintainer: Claudio Fleiner <claudio@fleiner.com>
5" Repository: https://github.com/zzzyxwvut/java-vim.git
Aliaksei Budavei902b7662024-06-13 18:30:09 +03006" Last Change: 2024 Jun 10
Bram Moolenaar071d4272004-06-13 20:20:40 +00007
8" Please check :help java.vim for comments on some of the options available.
9
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020010" quit when a syntax file was already loaded
Bram Moolenaar071d4272004-06-13 20:20:40 +000011if !exists("main_syntax")
Bram Moolenaar89bcfda2016-08-30 23:26:57 +020012 if exists("b:current_syntax")
Bram Moolenaar071d4272004-06-13 20:20:40 +000013 finish
14 endif
15 " we define it here so that included files can test for it
16 let main_syntax='java'
Bram Moolenaar5c736222010-01-06 20:54:52 +010017 syn region javaFold start="{" end="}" transparent fold
Bram Moolenaar071d4272004-06-13 20:20:40 +000018endif
19
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +020020let s:cpo_save = &cpo
21set cpo&vim
22
Aliaksei Budaveid3952e82024-05-11 00:39:31 +030023"""" STRIVE TO REMAIN COMPATIBLE FOR AT LEAST VIM 7.0.
24let s:ff = {}
25
26function! s:ff.LeftConstant(x, y) abort
27 return a:x
28endfunction
29
30function! s:ff.RightConstant(x, y) abort
31 return a:y
32endfunction
33
34if !exists("*s:ReportOnce")
35 function s:ReportOnce(message) abort
36 echomsg 'syntax/java.vim: ' . a:message
37 endfunction
38else
39 function! s:ReportOnce(dummy)
40 endfunction
41endif
42
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020043" Admit the ASCII dollar sign to keyword characters (JLS-17, §3.8):
Aliaksei Budaveid3952e82024-05-11 00:39:31 +030044try
45 exec 'syntax iskeyword ' . &l:iskeyword . ',$'
46catch /\<E410:/
47 call s:ReportOnce(v:exception)
48 setlocal iskeyword+=$
49endtry
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020050
Bram Moolenaar071d4272004-06-13 20:20:40 +000051" some characters that cannot be in a java program (outside a string)
52syn match javaError "[\\@`]"
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +010053syn match javaError "<<<\|\.\.\|=>\|||=\|&&=\|\*\/"
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +020054
Bram Moolenaar071d4272004-06-13 20:20:40 +000055" use separate name so that it can be deleted in javacc.vim
56syn match javaError2 "#\|=<"
Bram Moolenaarf37506f2016-08-31 22:22:10 +020057hi def link javaError2 javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +000058
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020059" Keywords (JLS-17, §3.9):
Bram Moolenaar071d4272004-06-13 20:20:40 +000060syn keyword javaExternal native package
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020061syn match javaExternal "\<import\>\%(\s\+static\>\)\="
Bram Moolenaar071d4272004-06-13 20:20:40 +000062syn keyword javaError goto const
63syn keyword javaConditional if else switch
64syn keyword javaRepeat while for do
65syn keyword javaBoolean true false
66syn keyword javaConstant null
67syn keyword javaTypedef this super
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020068syn keyword javaOperator new instanceof
69syn match javaOperator "\<var\>\%(\s*(\)\@!"
Aliaksei Budaveid3952e82024-05-11 00:39:31 +030070
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +010071" Since the yield statement, which could take a parenthesised operand,
72" and _qualified_ yield methods get along within the switch block
73" (JLS-17, §3.8), it seems futile to make a region definition for this
74" block; instead look for the _yield_ word alone, and if found,
75" backtrack (arbitrarily) 80 bytes, at most, on the matched line and,
76" if necessary, on the line before that (h: \@<=), trying to match
77" neither a method reference nor a qualified method invocation.
Aliaksei Budaveid3952e82024-05-11 00:39:31 +030078try
79 syn match javaOperator "\%(\%(::\|\.\)[[:space:]\n]*\)\@80<!\<yield\>"
80 let s:ff.Peek = s:ff.LeftConstant
81catch /\<E59:/
82 call s:ReportOnce(v:exception)
83 syn match javaOperator "\%(\%(::\|\.\)[[:space:]\n]*\)\@<!\<yield\>"
84 let s:ff.Peek = s:ff.RightConstant
85endtry
86
Bram Moolenaar071d4272004-06-13 20:20:40 +000087syn keyword javaType boolean char byte short int long float double
88syn keyword javaType void
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +010089syn keyword javaStatement return
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020090syn keyword javaStorageClass static synchronized transient volatile strictfp serializable
Bram Moolenaar071d4272004-06-13 20:20:40 +000091syn keyword javaExceptions throw try catch finally
92syn keyword javaAssert assert
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020093syn keyword javaMethodDecl throws
94" Differentiate a "MyClass.class" literal from the keyword "class".
Bram Moolenaar071d4272004-06-13 20:20:40 +000095syn match javaTypedef "\.\s*\<class\>"ms=s+1
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020096syn keyword javaClassDecl enum extends implements interface
97syn match javaClassDecl "\<permits\>\%(\s*(\)\@!"
98syn match javaClassDecl "\<record\>\%(\s*(\)\@!"
Bram Moolenaar071d4272004-06-13 20:20:40 +000099syn match javaClassDecl "^class\>"
100syn match javaClassDecl "[^.]\s*\<class\>"ms=s+1
Aliaksei Budavei40524742024-04-14 19:57:00 +0300101syn match javaAnnotation "@\%(\K\k*\.\)*\K\k*\>"
Aliaksei Budavei902b7662024-06-13 18:30:09 +0300102syn region javaAnnotation transparent matchgroup=javaAnnotationStart start=/@\%(\K\k*\.\)*\K\k*(/ end=/)/ skip=/\/\*.\{-}\*\/\|\/\/.*$/ contains=javaAnnotation,javaParenT,javaBraces,javaString,javaBoolean,javaNumber,javaTypedef,javaComment,javaLineComment
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200103syn match javaClassDecl "@interface\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000104syn keyword javaBranch break continue nextgroup=javaUserLabelRef skipwhite
105syn match javaUserLabelRef "\k\+" contained
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000106syn match javaVarArg "\.\.\."
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200107syn keyword javaScopeDecl public protected private
108syn keyword javaConceptKind abstract final
109syn match javaConceptKind "\<non-sealed\>"
110syn match javaConceptKind "\<sealed\>\%(\s*(\)\@!"
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100111syn match javaConceptKind "\<default\>\%(\s*\%(:\|->\)\)\@!"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000112
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200113" Note that a "module-info" file will be recognised with an arbitrary
114" file extension (or no extension at all) so that more than one such
115" declaration for the same Java module can be maintained for modular
116" testing in a project without attendant confusion for IDEs, with the
117" ".java\=" extension used for a production version and an arbitrary
118" extension used for a testing version.
119let s:module_info_cur_buf = fnamemodify(bufname("%"), ":t") =~ '^module-info\%(\.class\>\)\@!'
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300120lockvar s:module_info_cur_buf
121
122if !(v:version < 704)
123 " Request the new regexp engine for [:upper:] and [:lower:].
124 let [s:ff.Engine, s:ff.UpperCase, s:ff.LowerCase] = repeat([s:ff.LeftConstant], 3)
125else
126 " XXX: \C\<[^a-z0-9]\k*\> rejects "type", but matches "τύπος".
127 " XXX: \C\<[^A-Z0-9]\k*\> rejects "Method", but matches "Μέθοδος".
128 let [s:ff.Engine, s:ff.UpperCase, s:ff.LowerCase] = repeat([s:ff.RightConstant], 3)
129endif
Bram Moolenaar63f32602022-06-09 20:45:54 +0100130
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200131" Java modules (since Java 9, for "module-info.java" file).
132if s:module_info_cur_buf
133 syn keyword javaModuleStorageClass module transitive
134 syn keyword javaModuleStmt open requires exports opens uses provides
135 syn keyword javaModuleExternal to with
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200136endif
137
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000138if exists("java_highlight_java_lang_ids")
139 let java_highlight_all=1
140endif
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200141if exists("java_highlight_all") || exists("java_highlight_java") || exists("java_highlight_java_lang")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000142 " java.lang.*
Bram Moolenaar63f32602022-06-09 20:45:54 +0100143 "
144 " The keywords of javaR_JavaLang, javaC_JavaLang, javaE_JavaLang,
145 " and javaX_JavaLang are sub-grouped according to the Java version
146 " of their introduction, and sub-group keywords (that is, class
147 " names) are arranged in alphabetical order, so that future newer
148 " keywords can be pre-sorted and appended without disturbing
149 " the current keyword placement. The below _match_es follow suit.
150
Aliaksei Budavei63d68c22024-03-26 20:12:05 +0300151 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 +0000152 syn cluster javaClasses add=javaR_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200153 hi def link javaR_JavaLang javaR_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100154 " Member enumerations:
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300155 exec 'syn match javaC_JavaLang "\%(\<Thread\.\)\@' . s:ff.Peek('7', '') . '<=\<State\>"'
156 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<UnicodeScript\>"'
157 exec 'syn match javaC_JavaLang "\%(\<ProcessBuilder\.Redirect\.\)\@' . s:ff.Peek('24', '') . '<=\<Type\>"'
158 exec 'syn match javaC_JavaLang "\%(\<StackWalker\.\)\@' . s:ff.Peek('12', '') . '<=\<Option\>"'
159 exec 'syn match javaC_JavaLang "\%(\<System\.Logger\.\)\@' . s:ff.Peek('14', '') . '<=\<Level\>"'
Bram Moolenaar63f32602022-06-09 20:45:54 +0100160 " Member classes:
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300161 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<Subset\>"'
162 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<UnicodeBlock\>"'
163 exec 'syn match javaC_JavaLang "\%(\<ProcessBuilder\.\)\@' . s:ff.Peek('15', '') . '<=\<Redirect\>"'
164 exec 'syn match javaC_JavaLang "\%(\<ModuleLayer\.\)\@' . s:ff.Peek('12', '') . '<=\<Controller\>"'
165 exec 'syn match javaC_JavaLang "\%(\<Runtime\.\)\@' . s:ff.Peek('8', '') . '<=\<Version\>"'
166 exec 'syn match javaC_JavaLang "\%(\<System\.\)\@' . s:ff.Peek('7', '') . '<=\<LoggerFinder\>"'
167 exec 'syn match javaC_JavaLang "\%(\<Enum\.\)\@' . s:ff.Peek('5', '') . '<=\<EnumDesc\>"'
Bram Moolenaar63f32602022-06-09 20:45:54 +0100168 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
169 syn match javaC_JavaLang "\<System\>" " See javaDebug.
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200170 " As of JDK 21, java.lang.Compiler is no more (deprecated in JDK 9).
Aliaksei Budavei63d68c22024-03-26 20:12:05 +0300171 syn keyword javaLangDeprecated Compiler
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000172 syn cluster javaClasses add=javaC_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200173 hi def link javaC_JavaLang javaC_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100174 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 +0000175 syn cluster javaClasses add=javaE_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200176 hi def link javaE_JavaLang javaE_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100177 syn keyword javaX_JavaLang ClassNotFoundException CloneNotSupportedException Exception IllegalAccessException InstantiationException InterruptedException NoSuchMethodException Throwable NoSuchFieldException ReflectiveOperationException
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000178 syn cluster javaClasses add=javaX_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200179 hi def link javaX_JavaLang javaX_Java
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000180
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200181 hi def link javaR_Java javaR_
182 hi def link javaC_Java javaC_
183 hi def link javaE_Java javaE_
184 hi def link javaX_Java javaX_
185 hi def link javaX_ javaExceptions
186 hi def link javaR_ javaExceptions
187 hi def link javaE_ javaExceptions
188 hi def link javaC_ javaConstant
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000189
Bram Moolenaar071d4272004-06-13 20:20:40 +0000190 syn keyword javaLangObject clone equals finalize getClass hashCode
191 syn keyword javaLangObject notify notifyAll toString wait
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200192 hi def link javaLangObject javaConstant
Bram Moolenaar071d4272004-06-13 20:20:40 +0000193endif
194
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300195if filereadable(expand("<sfile>:p:h") . "/javaid.vim")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000196 source <sfile>:p:h/javaid.vim
197endif
198
199if exists("java_space_errors")
200 if !exists("java_no_trail_space_error")
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200201 syn match javaSpaceError "\s\+$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000202 endif
203 if !exists("java_no_tab_space_error")
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200204 syn match javaSpaceError " \+\t"me=e-1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000205 endif
206endif
207
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300208exec 'syn match javaUserLabel "^\s*\<\K\k*\>\%(\<default\>\)\@' . s:ff.Peek('7', '') . '<!\s*:"he=e-1'
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100209syn region javaLabelRegion transparent matchgroup=javaLabel start="\<case\>" matchgroup=NONE end=":\|->" contains=javaLabelCastType,javaLabelNumber,javaCharacter,javaString,javaConstant,@javaClasses,javaLabelDefault,javaLabelVarType,javaLabelWhenClause
210syn region javaLabelRegion transparent matchgroup=javaLabel start="\<default\>\%(\s*\%(:\|->\)\)\@=" matchgroup=NONE end=":\|->" oneline
211" Consider grouped _default_ _case_ labels, i.e.
212" case null, default ->
213" case null: default:
214syn keyword javaLabelDefault contained default
215syn keyword javaLabelVarType contained var
216syn keyword javaLabelCastType contained char byte short int
217" Allow for the contingency of the enclosing region not being able to
218" _keep_ its _end_, e.g. case ':':.
Aliaksei Budaveid6b4afb2024-06-09 19:39:52 +0300219syn region javaLabelWhenClause contained transparent matchgroup=javaLabel start="\<when\>" matchgroup=NONE end=":"me=e-1 end="->"me=e-2 contains=TOP,javaExternal,javaLambdaDef
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100220syn match javaLabelNumber contained "\<0\>[lL]\@!"
221syn match javaLabelNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)\>[lL]\@!"
222hi def link javaLabelDefault javaLabel
223hi def link javaLabelVarType javaOperator
224hi def link javaLabelNumber javaNumber
225hi def link javaLabelCastType javaType
Bram Moolenaar071d4272004-06-13 20:20:40 +0000226
Bram Moolenaar071d4272004-06-13 20:20:40 +0000227" Comments
228syn keyword javaTodo contained TODO FIXME XXX
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300229
Bram Moolenaar071d4272004-06-13 20:20:40 +0000230if exists("java_comment_strings")
231 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 +0300232 syn region javaCommentString contained start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell,javaSpecialError,javaTextBlockError
233 syn region javaComment2String contained start=+"+ end=+$\|"+ contains=javaSpecial,javaSpecialChar,@Spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000234 syn match javaCommentCharacter contained "'\\[^']\{1,6\}'" contains=javaSpecialChar
235 syn match javaCommentCharacter contained "'\\''" contains=javaSpecialChar
236 syn match javaCommentCharacter contained "'[^\\]'"
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300237 syn cluster javaCommentSpecial add=javaCommentString,javaCommentCharacter,javaNumber,javaStrTempl
238 syn cluster javaCommentSpecial2 add=javaComment2String,javaCommentCharacter,javaNumber,javaStrTempl
Bram Moolenaar071d4272004-06-13 20:20:40 +0000239endif
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300240
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300241syn region javaComment matchgroup=javaCommentStart start="/\*" end="\*/" contains=@javaCommentSpecial,javaTodo,javaCommentError,javaSpaceError,@Spell
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200242syn match javaCommentStar contained "^\s*\*[^/]"me=e-1
243syn match javaCommentStar contained "^\s*\*$"
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300244syn match javaLineComment "//.*" contains=@javaCommentSpecial2,javaTodo,javaCommentMarkupTag,javaSpaceError,@Spell
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300245syn match javaCommentMarkupTag contained "@\%(end\|highlight\|link\|replace\|start\)\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
246syn match javaCommentMarkupTagAttr contained "\<region\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300247exec 'syn region javaCommentMarkupTagAttr contained transparent matchgroup=htmlArg start=/\<\%(re\%(gex\|gion\|placement\)\|substring\|t\%(arget\|ype\)\)\%(\s*=\)\@=/ matchgroup=htmlString end=/\%(=\s*\)\@' . s:ff.Peek('80', '') . '<=\%("[^"]\+"\|' . "\x27[^\x27]\\+\x27" . '\|\%([.-]\|\k\)\+\)/ nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite oneline'
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300248hi def link javaCommentMarkupTagAttr htmlArg
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200249hi def link javaCommentString javaString
250hi def link javaComment2String javaString
251hi def link javaCommentCharacter javaCharacter
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300252syn match javaCommentError contained "/\*"me=e-1 display
253hi def link javaCommentError javaError
254hi def link javaCommentStart javaComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000255
Bram Moolenaar071d4272004-06-13 20:20:40 +0000256if !exists("java_ignore_javadoc") && main_syntax != 'jsp'
257 syntax case ignore
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300258
259 " Include HTML syntax coloring for Javadoc comments.
Bram Moolenaar63f32602022-06-09 20:45:54 +0100260 syntax include @javaHtml syntax/html.vim
Bram Moolenaar071d4272004-06-13 20:20:40 +0000261 unlet b:current_syntax
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300262
263 " HTML enables spell checking for all text that is not in a syntax
264 " item (:syntax spell toplevel); instead, limit spell checking to
265 " items matchable with syntax groups containing the @Spell cluster.
266 try
267 syntax spell default
268 catch /\<E390:/
269 call s:ReportOnce(v:exception)
270 endtry
Bram Moolenaar5c736222010-01-06 20:54:52 +0100271
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300272 syn region javaDocComment start="/\*\*" end="\*/" keepend contains=javaCommentTitle,@javaHtml,javaDocTags,javaDocSeeTag,javaDocCodeTag,javaDocSnippetTag,javaTodo,javaCommentError,javaSpaceError,@Spell
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300273 exec 'syn region javaCommentTitle contained matchgroup=javaDocComment start="/\*\*" matchgroup=javaCommentTitle end="\.$" end="\.[ \t\r]\@=" end="\%(^\s*\**\s*\)\@' . s:ff.Peek('80', '') . '<=@"me=s-2,he=s-1 end="\*/"me=s-1,he=s-1 contains=@javaHtml,javaCommentStar,javaTodo,javaCommentError,javaSpaceError,@Spell,javaDocTags,javaDocSeeTag,javaDocCodeTag,javaDocSnippetTag'
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300274 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 +0300275 syn region javaDocTags contained start="{@\%(li\%(teral\|nk\%(plain\)\=\)\|inherit[Dd]oc\|doc[rR]oot\|value\)\>" end="}"
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300276 syn match javaDocTags contained "@\%(param\|exception\|throws\|since\)\s\+\S\+" contains=javaDocParam
277 syn match javaDocParam contained "\s\S\+"
278 syn match javaDocTags contained "@\%(version\|author\|return\|deprecated\|serial\%(Field\|Data\)\=\)\>"
279 syn region javaDocSeeTag contained matchgroup=javaDocTags start="@see\s\+" matchgroup=NONE end="\_."re=e-1 contains=javaDocSeeTagParam
280 syn match javaDocSeeTagParam contained @"\_[^"]\+"\|<a\s\+\_.\{-}</a>\|\%(\k\|\.\)*\%(#\k\+\%((\_[^)]*)\)\=\)\=@ contains=@javaHtml extend
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300281 syn region javaCodeSkipBlock contained transparent start="{\%(@code\>\)\@!" end="}" contains=javaCodeSkipBlock,javaDocCodeTag
282 syn region javaDocCodeTag contained start="{@code\>" end="}" contains=javaDocCodeTag,javaCodeSkipBlock
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300283 exec 'syn region javaDocSnippetTagAttr contained transparent matchgroup=htmlArg start=/\<\%(class\|file\|id\|lang\|region\)\%(\s*=\)\@=/ matchgroup=htmlString end=/:$/ end=/\%(=\s*\)\@' . s:ff.Peek('80', '') . '<=\%("[^"]\+"\|' . "\x27[^\x27]\\+\x27" . '\|\%([.\\/-]\|\k\)\+\)/ nextgroup=javaDocSnippetTagAttr skipwhite skipnl'
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300284 syn region javaSnippetSkipBlock contained transparent start="{\%(@snippet\>\)\@!" end="}" contains=javaSnippetSkipBlock,javaDocSnippetTag,javaCommentMarkupTag
285 syn region javaDocSnippetTag contained start="{@snippet\>" end="}" contains=javaDocSnippetTag,javaSnippetSkipBlock,javaDocSnippetTagAttr,javaCommentMarkupTag
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300286
Bram Moolenaar071d4272004-06-13 20:20:40 +0000287 syntax case match
288endif
289
290" match the special comment /**/
291syn match javaComment "/\*\*/"
292
293" Strings and constants
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200294syn match javaSpecialError contained "\\."
Bram Moolenaar071d4272004-06-13 20:20:40 +0000295syn match javaSpecialCharError contained "[^']"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300296" Escape Sequences (JLS-17, §3.10.7):
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300297syn match javaSpecialChar contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000298syn region javaString start=+"+ end=+"+ end=+$+ contains=javaSpecialChar,javaSpecialError,@Spell
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300299syn region javaString start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecialChar,javaSpecialError,javaTextBlockError,@Spell
300syn match javaTextBlockError +"""\s*"""+
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300301syn region javaStrTemplEmbExp contained matchgroup=javaStrTempl start="\\{" end="}" contains=TOP
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300302exec 'syn region javaStrTempl start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,@Spell'
303exec 'syn region javaStrTempl start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,javaTextBlockError,@Spell'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000304syn match javaCharacter "'[^']*'" contains=javaSpecialChar,javaSpecialCharError
305syn match javaCharacter "'\\''" contains=javaSpecialChar
306syn match javaCharacter "'[^\\]'"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300307" Integer literals (JLS-17, §3.10.1):
308syn keyword javaNumber 0 0l 0L
309syn match javaNumber "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
310" Decimal floating-point literals (JLS-17, §3.10.2):
311" Against "\<\d\+\>\.":
312syn match javaNumber "\<\d\%(_*\d\)*\."
313syn match javaNumber "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
314syn match javaNumber "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
315syn match javaNumber "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
316" Hexadecimal floating-point literals (JLS-17, §3.10.2):
317syn match javaNumber "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000318
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300319" Unicode characters
320syn match javaSpecial "\\u\x\x\x\x"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000321
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200322" Method declarations (JLS-17, §8.4.3, §8.4.4, §9.4).
Bram Moolenaar071d4272004-06-13 20:20:40 +0000323if exists("java_highlight_functions")
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200324 syn cluster javaFuncParams contains=javaAnnotation,@javaClasses,javaType,javaVarArg,javaComment,javaLineComment
325
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300326 if java_highlight_functions =~# '^indent[1-8]\=$'
327 let s:last = java_highlight_functions[-1 :]
328 let s:indent = s:last != 't' ? repeat("\x20", s:last) : "\t"
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200329 syn cluster javaFuncParams add=javaScopeDecl,javaConceptKind,javaStorageClass,javaExternal
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300330 " Try to not match other type members, initialiser blocks, enum
331 " constants (JLS-17, §8.9.1), and constructors (JLS-17, §8.1.7):
332 " at any _conventional_ indentation, skip over all fields with
333 " "[^=]*", all records with "\<record\s", and let the "*Skip*"
334 " definitions take care of constructor declarations and enum
335 " constants (with no support for @Foo(value = "bar")).
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300336 exec 'syn region javaFuncDef start=+^' . s:indent . '\%(<[^>]\+>\+\s\+\|\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)\+\)\=\%(\<\K\k*\>\.\)*\K\k*\>[^=]*\%(\<record\)\@' . s:ff.Peek('6', '') . '<!\s\K\k*\s*(+ end=+)+ contains=@javaFuncParams'
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300337 " As long as package-private constructors cannot be matched with
338 " javaFuncDef, do not look with javaConstructorSkipDeclarator for
339 " them.
340 exec 'syn match javaConstructorSkipDeclarator transparent +^' . s:indent . '\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)*p\%(ublic\|rotected\|rivate\)\s\+\%(<[^>]\+>\+\s\+\)\=\K\k*\s*\ze(+ contains=javaAnnotation,javaScopeDecl'
341 exec 'syn match javaEnumSkipArgumentativeConstant transparent +^' . s:indent . '\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)*\K\k*\s*\ze(+ contains=javaAnnotation'
342 unlet s:indent s:last
Bram Moolenaar071d4272004-06-13 20:20:40 +0000343 else
Aliaksei Budavei40524742024-04-14 19:57:00 +0300344 " This is the "style" variant (:help ft-java-syntax).
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200345 syn cluster javaFuncParams add=javaScopeDecl,javaConceptKind,javaStorageClass,javaExternal
346
347 " Match arbitrarily indented camelCasedName method declarations.
348 " Match: [@ɐ] [abstract] [<α, β>] Τʬ[<γ>][[][]] μʭʭ(/* ... */);
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300349 exec 'syn region javaFuncDef start=/' . s:ff.Engine('\%#=2', '') . '^\s\+\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)*\%(p\%(ublic\|rotected\|rivate\)\s\+\)\=\%(\%(abstract\|default\)\s\+\|\%(\%(final\|\%(native\|strictfp\)\|s\%(tatic\|ynchronized\)\)\s\+\)*\)\=\%(<.*[[:space:]-]\@' . s:ff.Peek('1', '') . '<!>\s\+\)\=\%(void\|\%(b\%(oolean\|yte\)\|char\|short\|int\|long\|float\|double\|\%(\<\K\k*\>\.\)*\<' . s:ff.UpperCase('[$_[:upper:]]', '[^a-z0-9]') . '\k*\>\%(<[^(){}]*[[:space:]-]\@' . s:ff.Peek('1', '') . '<!>\)\=\)\%(\[\]\)*\)\s\+\<' . s:ff.LowerCase('[$_[:lower:]]', '[^A-Z0-9]') . '\k*\>\s*(/ end=/)/ skip=/\/\*.\{-}\*\/\|\/\/.*$/ contains=@javaFuncParams'
Bram Moolenaar071d4272004-06-13 20:20:40 +0000350 endif
Aliaksei Budavei40524742024-04-14 19:57:00 +0300351
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300352 syn match javaBraces "[{}]"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000353endif
354
355if exists("java_highlight_debug")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000356 " Strings and constants
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300357 syn match javaDebugSpecial contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000358 syn region javaDebugString contained start=+"+ end=+"+ contains=javaDebugSpecial
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300359 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 +0300360 " The highlight groups of java{StrTempl,Debug{,Paren,StrTempl}}\,
361 " share one colour by default. Do not conflate unrelated parens.
362 syn region javaDebugStrTemplEmbExp contained matchgroup=javaDebugStrTempl start="\\{" end="}" contains=javaComment,javaLineComment,javaDebug\%(Paren\)\@!.*
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300363 exec 'syn region javaDebugStrTempl contained start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ contains=javaDebugStrTemplEmbExp,javaDebugSpecial'
364 exec 'syn region javaDebugStrTempl contained start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaDebugStrTemplEmbExp,javaDebugSpecial,javaDebugTextBlockError'
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300365 syn match javaDebugTextBlockError contained +"""\s*"""+
Bram Moolenaar071d4272004-06-13 20:20:40 +0000366 syn match javaDebugCharacter contained "'[^\\]'"
367 syn match javaDebugSpecialCharacter contained "'\\.'"
368 syn match javaDebugSpecialCharacter contained "'\\''"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300369 syn keyword javaDebugNumber contained 0 0l 0L
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300370 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\."
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300371 syn match javaDebugNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
372 syn match javaDebugNumber contained "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
373 syn match javaDebugNumber contained "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
374 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
375 syn match javaDebugNumber contained "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000376 syn keyword javaDebugBoolean contained true false
377 syn keyword javaDebugType contained null this super
378 syn region javaDebugParen start=+(+ end=+)+ contained contains=javaDebug.*,javaDebugParen
379
Aliaksei Budavei40524742024-04-14 19:57:00 +0300380 " To make this work, define the highlighting for these groups.
381 syn match javaDebug "\<System\.\%(out\|err\)\.print\%(ln\)\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
382" FIXME: What API does "p" belong to?
383" syn match javaDebug "\<p\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
384 syn match javaDebug "\<\K\k*\.printStackTrace\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
385" FIXME: What API do "trace*" belong to?
386" syn match javaDebug "\<trace[SL]\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
Bram Moolenaar071d4272004-06-13 20:20:40 +0000387
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200388 hi def link javaDebug Debug
389 hi def link javaDebugString DebugString
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300390 hi def link javaDebugStrTempl Macro
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300391 hi def link javaDebugTextBlockError Error
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200392 hi def link javaDebugType DebugType
393 hi def link javaDebugBoolean DebugBoolean
394 hi def link javaDebugNumber Debug
395 hi def link javaDebugSpecial DebugSpecial
396 hi def link javaDebugSpecialCharacter DebugSpecial
397 hi def link javaDebugCharacter DebugString
398 hi def link javaDebugParen Debug
Bram Moolenaar071d4272004-06-13 20:20:40 +0000399
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200400 hi def link DebugString String
401 hi def link DebugSpecial Special
402 hi def link DebugBoolean Boolean
403 hi def link DebugType Type
Bram Moolenaar071d4272004-06-13 20:20:40 +0000404endif
405
406if exists("java_mark_braces_in_parens_as_errors")
407 syn match javaInParen contained "[{}]"
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200408 hi def link javaInParen javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000409endif
410
411" catch errors caused by wrong parenthesis
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100412syn region javaParenT transparent matchgroup=javaParen start="(" end=")" contains=@javaTop,javaParenT1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000413syn region javaParenT1 transparent matchgroup=javaParen1 start="(" end=")" contains=@javaTop,javaParenT2 contained
414syn region javaParenT2 transparent matchgroup=javaParen2 start="(" end=")" contains=@javaTop,javaParenT contained
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200415syn match javaParenError ")"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000416" catch errors caused by wrong square parenthesis
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100417syn region javaParenT transparent matchgroup=javaParen start="\[" end="\]" contains=@javaTop,javaParenT1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000418syn region javaParenT1 transparent matchgroup=javaParen1 start="\[" end="\]" contains=@javaTop,javaParenT2 contained
419syn region javaParenT2 transparent matchgroup=javaParen2 start="\[" end="\]" contains=@javaTop,javaParenT contained
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200420syn match javaParenError "\]"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000421
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200422hi def link javaParenError javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000423
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300424" Lambda expressions (JLS-17, §15.27).
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100425if exists("java_highlight_functions")
Aliaksei Budavei40524742024-04-14 19:57:00 +0300426 " Make ()-matching definitions after the parenthesis error catcher.
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300427 "
428 " Match: ([@A [@B ...] final] var a[, var b, ...]) ->
429 " | ([@A [@B ...] final] T[<α>][[][]] a[, T b, ...]) ->
430 " There is no recognition of expressions interspersed with comments
431 " or of expressions whose parameterised parameter types are written
432 " across multiple lines.
433 exec 'syn match javaLambdaDef "\k\@' . s:ff.Peek('4', '') . '<!([[:space:]\n]*\%(\%(@\%(\K\k*\.\)*\K\k*\>\%((\_.\{-1,})\)\{-,1}[[:space:]\n]\+\)*\%(final[[:space:]\n]\+\)\=\%(\<\K\k*\>\.\)*\<\K\k*\>\%(<[^(){}]*[[:space:]-]\@' . s:ff.Peek('1', '') . '<!>\)\=\%(\%(\%(\[\]\)\+\|\.\.\.\)\)\=[[:space:]\n]\+\<\K\k*\>\%(\[\]\)*\%(,[[:space:]\n]*\)\=\)\+)[[:space:]\n]*->" contains=javaAnnotation,javaParamModifier,javaLambdaVarType,javaType,@javaClasses,javaVarArg'
434 " Match: () ->
435 " | (a[, b, ...]) ->
436 exec 'syn match javaLambdaDef "\k\@' . s:ff.Peek('4', '') . '<!([[:space:]\n]*\%(\<\K\k*\>\%(,[[:space:]\n]*\)\=\)*)[[:space:]\n]*->"'
437 " Match: a ->
438 exec 'syn match javaLambdaDef "\<\K\k*\>\%(\<default\>\)\@' . s:ff.Peek('7', '') . '<![[:space:]\n]*->"'
439
440 syn keyword javaParamModifier contained final
441 hi def link javaParamModifier javaConceptKind
442 syn keyword javaLambdaVarType contained var
443 hi def link javaLambdaVarType javaOperator
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100444endif
445
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300446" The @javaTop cluster comprises non-contained Java syntax groups.
447" Note that the syntax file "aidl.vim" relies on its availability.
448syn cluster javaTop contains=TOP,javaDocComment,javaFold,javaParenError,javaParenT
449
Bram Moolenaar071d4272004-06-13 20:20:40 +0000450if !exists("java_minlines")
451 let java_minlines = 10
452endif
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300453
454" Note that variations of a /*/ balanced comment, e.g., /*/*/, /*//*/,
455" /* /*/, /* /*/, etc., may have their rightmost /*/ part accepted
456" as a comment start by ':syntax sync ccomment'; consider alternatives
457" to make synchronisation start further towards file's beginning by
458" bumping up g:java_minlines or issuing ':syntax sync fromstart' or
459" preferring &foldmethod set to 'syntax'.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000460exec "syn sync ccomment javaComment minlines=" . java_minlines
461
462" The default highlighting.
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200463hi def link javaLambdaDef Function
464hi def link javaFuncDef Function
465hi def link javaVarArg Function
466hi def link javaBraces Function
467hi def link javaBranch Conditional
468hi def link javaUserLabelRef javaUserLabel
469hi def link javaLabel Label
470hi def link javaUserLabel Label
471hi def link javaConditional Conditional
472hi def link javaRepeat Repeat
473hi def link javaExceptions Exception
474hi def link javaAssert Statement
475hi def link javaStorageClass StorageClass
476hi def link javaMethodDecl javaStorageClass
477hi def link javaClassDecl javaStorageClass
478hi def link javaScopeDecl javaStorageClass
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100479hi def link javaConceptKind NonText
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200480
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200481hi def link javaBoolean Boolean
482hi def link javaSpecial Special
483hi def link javaSpecialError Error
484hi def link javaSpecialCharError Error
485hi def link javaString String
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300486hi def link javaStrTempl Macro
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200487hi def link javaCharacter Character
488hi def link javaSpecialChar SpecialChar
489hi def link javaNumber Number
490hi def link javaError Error
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300491hi def link javaTextBlockError Error
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200492hi def link javaStatement Statement
493hi def link javaOperator Operator
494hi def link javaComment Comment
495hi def link javaDocComment Comment
496hi def link javaLineComment Comment
497hi def link javaConstant Constant
498hi def link javaTypedef Typedef
499hi def link javaTodo Todo
500hi def link javaAnnotation PreProc
Aliaksei Budavei902b7662024-06-13 18:30:09 +0300501hi def link javaAnnotationStart javaAnnotation
Bram Moolenaar071d4272004-06-13 20:20:40 +0000502
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200503hi def link javaCommentTitle SpecialComment
504hi def link javaDocTags Special
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300505hi def link javaDocCodeTag Special
506hi def link javaDocSnippetTag Special
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200507hi def link javaDocParam Function
508hi def link javaDocSeeTagParam Function
509hi def link javaCommentStar javaComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000510
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200511hi def link javaType Type
512hi def link javaExternal Include
Bram Moolenaar071d4272004-06-13 20:20:40 +0000513
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200514hi def link htmlComment Special
515hi def link htmlCommentPart Special
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300516hi def link htmlArg Type
517hi def link htmlString String
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200518hi def link javaSpaceError Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000519
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200520if s:module_info_cur_buf
521 hi def link javaModuleStorageClass StorageClass
522 hi def link javaModuleStmt Statement
523 hi def link javaModuleExternal Include
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200524endif
525
Bram Moolenaar071d4272004-06-13 20:20:40 +0000526let b:current_syntax = "java"
527
528if main_syntax == 'java'
529 unlet main_syntax
530endif
531
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200532let b:spell_options = "contained"
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +0200533let &cpo = s:cpo_save
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300534unlet s:module_info_cur_buf s:ff s:cpo_save
Bram Moolenaar071d4272004-06-13 20:20:40 +0000535
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300536" vim: sw=2 ts=8 noet sta