blob: c2cba1a5f984302117d2f001cfd815e074555e47 [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 Budavei94c5d8a2024-06-19 20:10:47 +02006" Last Change: 2024 Jun 19
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'
17endif
18
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +020019let s:cpo_save = &cpo
20set cpo&vim
21
Aliaksei Budaveid3952e82024-05-11 00:39:31 +030022"""" STRIVE TO REMAIN COMPATIBLE FOR AT LEAST VIM 7.0.
23let s:ff = {}
24
25function! s:ff.LeftConstant(x, y) abort
26 return a:x
27endfunction
28
29function! s:ff.RightConstant(x, y) abort
30 return a:y
31endfunction
32
33if !exists("*s:ReportOnce")
34 function s:ReportOnce(message) abort
35 echomsg 'syntax/java.vim: ' . a:message
36 endfunction
37else
38 function! s:ReportOnce(dummy)
39 endfunction
40endif
41
Aliaksei Budavei371bab02024-06-16 09:42:55 +030042function! JavaSyntaxFoldTextExpr() abort
43 return getline(v:foldstart) !~ '/\*\+\s*$'
44 \ ? foldtext()
45 \ : printf('+-%s%3d lines: ',
46 \ v:folddashes,
47 \ (v:foldend - v:foldstart + 1)) .
48 \ getline(v:foldstart + 1)
49endfunction
50
51" E120 for "fdt=s:JavaSyntaxFoldTextExpr()" before v8.2.3900.
52setlocal foldtext=JavaSyntaxFoldTextExpr()
53
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020054" Admit the ASCII dollar sign to keyword characters (JLS-17, §3.8):
Aliaksei Budaveid3952e82024-05-11 00:39:31 +030055try
56 exec 'syntax iskeyword ' . &l:iskeyword . ',$'
57catch /\<E410:/
58 call s:ReportOnce(v:exception)
59 setlocal iskeyword+=$
60endtry
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020061
Bram Moolenaar071d4272004-06-13 20:20:40 +000062" some characters that cannot be in a java program (outside a string)
63syn match javaError "[\\@`]"
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +010064syn match javaError "<<<\|\.\.\|=>\|||=\|&&=\|\*\/"
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +020065
Bram Moolenaar071d4272004-06-13 20:20:40 +000066" use separate name so that it can be deleted in javacc.vim
67syn match javaError2 "#\|=<"
Bram Moolenaarf37506f2016-08-31 22:22:10 +020068hi def link javaError2 javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +000069
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020070" Keywords (JLS-17, §3.9):
Bram Moolenaar071d4272004-06-13 20:20:40 +000071syn keyword javaExternal native package
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020072syn match javaExternal "\<import\>\%(\s\+static\>\)\="
Bram Moolenaar071d4272004-06-13 20:20:40 +000073syn keyword javaError goto const
74syn keyword javaConditional if else switch
75syn keyword javaRepeat while for do
76syn keyword javaBoolean true false
77syn keyword javaConstant null
78syn keyword javaTypedef this super
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +020079syn keyword javaOperator new instanceof
80syn match javaOperator "\<var\>\%(\s*(\)\@!"
Aliaksei Budaveid3952e82024-05-11 00:39:31 +030081
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +010082" Since the yield statement, which could take a parenthesised operand,
83" and _qualified_ yield methods get along within the switch block
84" (JLS-17, §3.8), it seems futile to make a region definition for this
85" block; instead look for the _yield_ word alone, and if found,
86" backtrack (arbitrarily) 80 bytes, at most, on the matched line and,
87" if necessary, on the line before that (h: \@<=), trying to match
88" neither a method reference nor a qualified method invocation.
Aliaksei Budaveid3952e82024-05-11 00:39:31 +030089try
90 syn match javaOperator "\%(\%(::\|\.\)[[:space:]\n]*\)\@80<!\<yield\>"
91 let s:ff.Peek = s:ff.LeftConstant
92catch /\<E59:/
93 call s:ReportOnce(v:exception)
94 syn match javaOperator "\%(\%(::\|\.\)[[:space:]\n]*\)\@<!\<yield\>"
95 let s:ff.Peek = s:ff.RightConstant
96endtry
97
Bram Moolenaar071d4272004-06-13 20:20:40 +000098syn keyword javaType boolean char byte short int long float double
99syn keyword javaType void
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100100syn keyword javaStatement return
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200101syn keyword javaStorageClass static synchronized transient volatile strictfp serializable
Bram Moolenaar071d4272004-06-13 20:20:40 +0000102syn keyword javaExceptions throw try catch finally
103syn keyword javaAssert assert
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200104syn keyword javaMethodDecl throws
105" Differentiate a "MyClass.class" literal from the keyword "class".
Bram Moolenaar071d4272004-06-13 20:20:40 +0000106syn match javaTypedef "\.\s*\<class\>"ms=s+1
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200107syn keyword javaClassDecl enum extends implements interface
108syn match javaClassDecl "\<permits\>\%(\s*(\)\@!"
109syn match javaClassDecl "\<record\>\%(\s*(\)\@!"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000110syn match javaClassDecl "^class\>"
111syn match javaClassDecl "[^.]\s*\<class\>"ms=s+1
Aliaksei Budavei40524742024-04-14 19:57:00 +0300112syn match javaAnnotation "@\%(\K\k*\.\)*\K\k*\>"
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300113syn region javaAnnotation transparent matchgroup=javaAnnotationStart start=/@\%(\K\k*\.\)*\K\k*(/ end=/)/ skip=/\/\*.\{-}\*\/\|\/\/.*$/ contains=javaAnnotation,javaParenT,javaBlock,javaString,javaBoolean,javaNumber,javaTypedef,javaComment,javaLineComment
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200114syn match javaClassDecl "@interface\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000115syn keyword javaBranch break continue nextgroup=javaUserLabelRef skipwhite
116syn match javaUserLabelRef "\k\+" contained
Bram Moolenaarc9b4b052006-04-30 18:54:39 +0000117syn match javaVarArg "\.\.\."
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200118syn keyword javaScopeDecl public protected private
119syn keyword javaConceptKind abstract final
120syn match javaConceptKind "\<non-sealed\>"
121syn match javaConceptKind "\<sealed\>\%(\s*(\)\@!"
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100122syn match javaConceptKind "\<default\>\%(\s*\%(:\|->\)\)\@!"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000123
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200124" Note that a "module-info" file will be recognised with an arbitrary
125" file extension (or no extension at all) so that more than one such
126" declaration for the same Java module can be maintained for modular
127" testing in a project without attendant confusion for IDEs, with the
128" ".java\=" extension used for a production version and an arbitrary
129" extension used for a testing version.
130let s:module_info_cur_buf = fnamemodify(bufname("%"), ":t") =~ '^module-info\%(\.class\>\)\@!'
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300131lockvar s:module_info_cur_buf
132
133if !(v:version < 704)
134 " Request the new regexp engine for [:upper:] and [:lower:].
135 let [s:ff.Engine, s:ff.UpperCase, s:ff.LowerCase] = repeat([s:ff.LeftConstant], 3)
136else
137 " XXX: \C\<[^a-z0-9]\k*\> rejects "type", but matches "τύπος".
138 " XXX: \C\<[^A-Z0-9]\k*\> rejects "Method", but matches "Μέθοδος".
139 let [s:ff.Engine, s:ff.UpperCase, s:ff.LowerCase] = repeat([s:ff.RightConstant], 3)
140endif
Bram Moolenaar63f32602022-06-09 20:45:54 +0100141
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200142" Java modules (since Java 9, for "module-info.java" file).
143if s:module_info_cur_buf
144 syn keyword javaModuleStorageClass module transitive
145 syn keyword javaModuleStmt open requires exports opens uses provides
146 syn keyword javaModuleExternal to with
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200147endif
148
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000149if exists("java_highlight_java_lang_ids")
150 let java_highlight_all=1
151endif
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200152if exists("java_highlight_all") || exists("java_highlight_java") || exists("java_highlight_java_lang")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000153 " java.lang.*
Bram Moolenaar63f32602022-06-09 20:45:54 +0100154 "
155 " The keywords of javaR_JavaLang, javaC_JavaLang, javaE_JavaLang,
156 " and javaX_JavaLang are sub-grouped according to the Java version
157 " of their introduction, and sub-group keywords (that is, class
158 " names) are arranged in alphabetical order, so that future newer
159 " keywords can be pre-sorted and appended without disturbing
160 " the current keyword placement. The below _match_es follow suit.
161
Aliaksei Budavei63d68c22024-03-26 20:12:05 +0300162 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 +0000163 syn cluster javaClasses add=javaR_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200164 hi def link javaR_JavaLang javaR_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100165 " Member enumerations:
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300166 exec 'syn match javaC_JavaLang "\%(\<Thread\.\)\@' . s:ff.Peek('7', '') . '<=\<State\>"'
167 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<UnicodeScript\>"'
168 exec 'syn match javaC_JavaLang "\%(\<ProcessBuilder\.Redirect\.\)\@' . s:ff.Peek('24', '') . '<=\<Type\>"'
169 exec 'syn match javaC_JavaLang "\%(\<StackWalker\.\)\@' . s:ff.Peek('12', '') . '<=\<Option\>"'
170 exec 'syn match javaC_JavaLang "\%(\<System\.Logger\.\)\@' . s:ff.Peek('14', '') . '<=\<Level\>"'
Bram Moolenaar63f32602022-06-09 20:45:54 +0100171 " Member classes:
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300172 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<Subset\>"'
173 exec 'syn match javaC_JavaLang "\%(\<Character\.\)\@' . s:ff.Peek('10', '') . '<=\<UnicodeBlock\>"'
174 exec 'syn match javaC_JavaLang "\%(\<ProcessBuilder\.\)\@' . s:ff.Peek('15', '') . '<=\<Redirect\>"'
175 exec 'syn match javaC_JavaLang "\%(\<ModuleLayer\.\)\@' . s:ff.Peek('12', '') . '<=\<Controller\>"'
176 exec 'syn match javaC_JavaLang "\%(\<Runtime\.\)\@' . s:ff.Peek('8', '') . '<=\<Version\>"'
177 exec 'syn match javaC_JavaLang "\%(\<System\.\)\@' . s:ff.Peek('7', '') . '<=\<LoggerFinder\>"'
178 exec 'syn match javaC_JavaLang "\%(\<Enum\.\)\@' . s:ff.Peek('5', '') . '<=\<EnumDesc\>"'
Bram Moolenaar63f32602022-06-09 20:45:54 +0100179 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
180 syn match javaC_JavaLang "\<System\>" " See javaDebug.
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200181 " As of JDK 21, java.lang.Compiler is no more (deprecated in JDK 9).
Aliaksei Budavei63d68c22024-03-26 20:12:05 +0300182 syn keyword javaLangDeprecated Compiler
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000183 syn cluster javaClasses add=javaC_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200184 hi def link javaC_JavaLang javaC_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100185 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 +0000186 syn cluster javaClasses add=javaE_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200187 hi def link javaE_JavaLang javaE_Java
Bram Moolenaar63f32602022-06-09 20:45:54 +0100188 syn keyword javaX_JavaLang ClassNotFoundException CloneNotSupportedException Exception IllegalAccessException InstantiationException InterruptedException NoSuchMethodException Throwable NoSuchFieldException ReflectiveOperationException
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000189 syn cluster javaClasses add=javaX_JavaLang
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200190 hi def link javaX_JavaLang javaX_Java
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000191
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200192 hi def link javaR_Java javaR_
193 hi def link javaC_Java javaC_
194 hi def link javaE_Java javaE_
195 hi def link javaX_Java javaX_
196 hi def link javaX_ javaExceptions
197 hi def link javaR_ javaExceptions
198 hi def link javaE_ javaExceptions
199 hi def link javaC_ javaConstant
Bram Moolenaar8ada17c2006-01-19 22:16:24 +0000200
Bram Moolenaar071d4272004-06-13 20:20:40 +0000201 syn keyword javaLangObject clone equals finalize getClass hashCode
202 syn keyword javaLangObject notify notifyAll toString wait
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200203 hi def link javaLangObject javaConstant
Bram Moolenaar071d4272004-06-13 20:20:40 +0000204endif
205
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300206if filereadable(expand("<sfile>:p:h") . "/javaid.vim")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000207 source <sfile>:p:h/javaid.vim
208endif
209
210if exists("java_space_errors")
211 if !exists("java_no_trail_space_error")
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200212 syn match javaSpaceError "\s\+$"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000213 endif
214 if !exists("java_no_tab_space_error")
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200215 syn match javaSpaceError " \+\t"me=e-1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000216 endif
217endif
218
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300219exec 'syn match javaUserLabel "^\s*\<\K\k*\>\%(\<default\>\)\@' . s:ff.Peek('7', '') . '<!\s*:"he=e-1'
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100220syn region javaLabelRegion transparent matchgroup=javaLabel start="\<case\>" matchgroup=NONE end=":\|->" contains=javaLabelCastType,javaLabelNumber,javaCharacter,javaString,javaConstant,@javaClasses,javaLabelDefault,javaLabelVarType,javaLabelWhenClause
221syn region javaLabelRegion transparent matchgroup=javaLabel start="\<default\>\%(\s*\%(:\|->\)\)\@=" matchgroup=NONE end=":\|->" oneline
222" Consider grouped _default_ _case_ labels, i.e.
223" case null, default ->
224" case null: default:
225syn keyword javaLabelDefault contained default
226syn keyword javaLabelVarType contained var
227syn keyword javaLabelCastType contained char byte short int
228" Allow for the contingency of the enclosing region not being able to
229" _keep_ its _end_, e.g. case ':':.
Aliaksei Budaveid6b4afb2024-06-09 19:39:52 +0300230syn 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 +0100231syn match javaLabelNumber contained "\<0\>[lL]\@!"
232syn match javaLabelNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)\>[lL]\@!"
233hi def link javaLabelDefault javaLabel
234hi def link javaLabelVarType javaOperator
235hi def link javaLabelNumber javaNumber
236hi def link javaLabelCastType javaType
Bram Moolenaar071d4272004-06-13 20:20:40 +0000237
Bram Moolenaar071d4272004-06-13 20:20:40 +0000238" Comments
239syn keyword javaTodo contained TODO FIXME XXX
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300240
Bram Moolenaar071d4272004-06-13 20:20:40 +0000241if exists("java_comment_strings")
242 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 +0300243 syn region javaCommentString contained start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecial,javaCommentStar,javaSpecialChar,@Spell,javaSpecialError,javaTextBlockError
244 syn region javaComment2String contained start=+"+ end=+$\|"+ contains=javaSpecial,javaSpecialChar,@Spell
Bram Moolenaar071d4272004-06-13 20:20:40 +0000245 syn match javaCommentCharacter contained "'\\[^']\{1,6\}'" contains=javaSpecialChar
246 syn match javaCommentCharacter contained "'\\''" contains=javaSpecialChar
247 syn match javaCommentCharacter contained "'[^\\]'"
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300248 syn cluster javaCommentSpecial add=javaCommentString,javaCommentCharacter,javaNumber,javaStrTempl
249 syn cluster javaCommentSpecial2 add=javaComment2String,javaCommentCharacter,javaNumber,javaStrTempl
Bram Moolenaar071d4272004-06-13 20:20:40 +0000250endif
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300251
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300252syn region javaComment matchgroup=javaCommentStart start="/\*" end="\*/" contains=@javaCommentSpecial,javaTodo,javaCommentError,javaSpaceError,@Spell fold
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200253syn match javaCommentStar contained "^\s*\*[^/]"me=e-1
254syn match javaCommentStar contained "^\s*\*$"
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300255syn match javaLineComment "//.*" contains=@javaCommentSpecial2,javaTodo,javaCommentMarkupTag,javaSpaceError,@Spell
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300256syn match javaCommentMarkupTag contained "@\%(end\|highlight\|link\|replace\|start\)\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
257syn match javaCommentMarkupTagAttr contained "\<region\>" nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300258exec '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 +0300259hi def link javaCommentMarkupTagAttr htmlArg
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200260hi def link javaCommentString javaString
261hi def link javaComment2String javaString
262hi def link javaCommentCharacter javaCharacter
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300263syn match javaCommentError contained "/\*"me=e-1 display
264hi def link javaCommentError javaError
265hi def link javaCommentStart javaComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000266
Bram Moolenaar071d4272004-06-13 20:20:40 +0000267if !exists("java_ignore_javadoc") && main_syntax != 'jsp'
268 syntax case ignore
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300269
270 " Include HTML syntax coloring for Javadoc comments.
Bram Moolenaar63f32602022-06-09 20:45:54 +0100271 syntax include @javaHtml syntax/html.vim
Bram Moolenaar071d4272004-06-13 20:20:40 +0000272 unlet b:current_syntax
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300273
274 " HTML enables spell checking for all text that is not in a syntax
275 " item (:syntax spell toplevel); instead, limit spell checking to
276 " items matchable with syntax groups containing the @Spell cluster.
277 try
278 syntax spell default
279 catch /\<E390:/
280 call s:ReportOnce(v:exception)
281 endtry
Bram Moolenaar5c736222010-01-06 20:54:52 +0100282
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300283 syn region javaDocComment start="/\*\*" end="\*/" keepend contains=javaCommentTitle,@javaHtml,javaDocTags,javaDocSeeTag,javaDocCodeTag,javaDocSnippetTag,javaTodo,javaCommentError,javaSpaceError,@Spell fold
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300284 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 +0300285 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 +0300286 syn region javaDocTags contained start="{@\%(li\%(teral\|nk\%(plain\)\=\)\|inherit[Dd]oc\|doc[rR]oot\|value\)\>" end="}"
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300287 syn match javaDocTags contained "@\%(param\|exception\|throws\|since\)\s\+\S\+" contains=javaDocParam
288 syn match javaDocParam contained "\s\S\+"
289 syn match javaDocTags contained "@\%(version\|author\|return\|deprecated\|serial\%(Field\|Data\)\=\)\>"
290 syn region javaDocSeeTag contained matchgroup=javaDocTags start="@see\s\+" matchgroup=NONE end="\_."re=e-1 contains=javaDocSeeTagParam
291 syn match javaDocSeeTagParam contained @"\_[^"]\+"\|<a\s\+\_.\{-}</a>\|\%(\k\|\.\)*\%(#\k\+\%((\_[^)]*)\)\=\)\=@ contains=@javaHtml extend
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300292 syn region javaCodeSkipBlock contained transparent start="{\%(@code\>\)\@!" end="}" contains=javaCodeSkipBlock,javaDocCodeTag
293 syn region javaDocCodeTag contained start="{@code\>" end="}" contains=javaDocCodeTag,javaCodeSkipBlock
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300294 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 +0300295 syn region javaSnippetSkipBlock contained transparent start="{\%(@snippet\>\)\@!" end="}" contains=javaSnippetSkipBlock,javaDocSnippetTag,javaCommentMarkupTag
296 syn region javaDocSnippetTag contained start="{@snippet\>" end="}" contains=javaDocSnippetTag,javaSnippetSkipBlock,javaDocSnippetTagAttr,javaCommentMarkupTag
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300297
Bram Moolenaar071d4272004-06-13 20:20:40 +0000298 syntax case match
299endif
300
301" match the special comment /**/
302syn match javaComment "/\*\*/"
303
304" Strings and constants
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200305syn match javaSpecialError contained "\\."
Bram Moolenaar071d4272004-06-13 20:20:40 +0000306syn match javaSpecialCharError contained "[^']"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300307" Escape Sequences (JLS-17, §3.10.7):
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300308syn match javaSpecialChar contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000309syn region javaString start=+"+ end=+"+ end=+$+ contains=javaSpecialChar,javaSpecialError,@Spell
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300310syn region javaString start=+"""[ \t\x0c\r]*$+hs=e+1 end=+"""+he=s-1 contains=javaSpecialChar,javaSpecialError,javaTextBlockError,@Spell
311syn match javaTextBlockError +"""\s*"""+
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300312syn region javaStrTemplEmbExp contained matchgroup=javaStrTempl start="\\{" end="}" contains=TOP
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300313exec 'syn region javaStrTempl start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,@Spell'
314exec '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 +0000315syn match javaCharacter "'[^']*'" contains=javaSpecialChar,javaSpecialCharError
316syn match javaCharacter "'\\''" contains=javaSpecialChar
317syn match javaCharacter "'[^\\]'"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300318" Integer literals (JLS-17, §3.10.1):
319syn keyword javaNumber 0 0l 0L
320syn match javaNumber "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
321" Decimal floating-point literals (JLS-17, §3.10.2):
322" Against "\<\d\+\>\.":
323syn match javaNumber "\<\d\%(_*\d\)*\."
324syn match javaNumber "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
325syn match javaNumber "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
326syn match javaNumber "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
327" Hexadecimal floating-point literals (JLS-17, §3.10.2):
328syn match javaNumber "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000329
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300330" Unicode characters
331syn match javaSpecial "\\u\x\x\x\x"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000332
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200333" Method declarations (JLS-17, §8.4.3, §8.4.4, §9.4).
Bram Moolenaar071d4272004-06-13 20:20:40 +0000334if exists("java_highlight_functions")
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200335 syn cluster javaFuncParams contains=javaAnnotation,@javaClasses,javaType,javaVarArg,javaComment,javaLineComment
336
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300337 if java_highlight_functions =~# '^indent[1-8]\=$'
338 let s:last = java_highlight_functions[-1 :]
339 let s:indent = s:last != 't' ? repeat("\x20", s:last) : "\t"
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200340 syn cluster javaFuncParams add=javaScopeDecl,javaConceptKind,javaStorageClass,javaExternal
Aliaksei Budaveic4d0c8c2024-04-29 21:24:35 +0300341 " Try to not match other type members, initialiser blocks, enum
342 " constants (JLS-17, §8.9.1), and constructors (JLS-17, §8.1.7):
343 " at any _conventional_ indentation, skip over all fields with
344 " "[^=]*", all records with "\<record\s", and let the "*Skip*"
345 " definitions take care of constructor declarations and enum
346 " constants (with no support for @Foo(value = "bar")).
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300347 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 +0300348 " As long as package-private constructors cannot be matched with
349 " javaFuncDef, do not look with javaConstructorSkipDeclarator for
350 " them.
351 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'
352 exec 'syn match javaEnumSkipArgumentativeConstant transparent +^' . s:indent . '\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)*\K\k*\s*\ze(+ contains=javaAnnotation'
353 unlet s:indent s:last
Bram Moolenaar071d4272004-06-13 20:20:40 +0000354 else
Aliaksei Budavei40524742024-04-14 19:57:00 +0300355 " This is the "style" variant (:help ft-java-syntax).
Aliaksei Budaveia4c085a2024-04-24 21:04:25 +0200356 syn cluster javaFuncParams add=javaScopeDecl,javaConceptKind,javaStorageClass,javaExternal
357
358 " Match arbitrarily indented camelCasedName method declarations.
359 " Match: [@ɐ] [abstract] [<α, β>] Τʬ[<γ>][[][]] μʭʭ(/* ... */);
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300360 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 +0000361 endif
Bram Moolenaar071d4272004-06-13 20:20:40 +0000362endif
363
364if exists("java_highlight_debug")
Bram Moolenaar071d4272004-06-13 20:20:40 +0000365 " Strings and constants
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300366 syn match javaDebugSpecial contained "\\\%(u\x\x\x\x\|[0-3]\o\o\|\o\o\=\|[bstnfr"'\\]\)"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000367 syn region javaDebugString contained start=+"+ end=+"+ contains=javaDebugSpecial
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300368 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 +0300369 " The highlight groups of java{StrTempl,Debug{,Paren,StrTempl}}\,
370 " share one colour by default. Do not conflate unrelated parens.
371 syn region javaDebugStrTemplEmbExp contained matchgroup=javaDebugStrTempl start="\\{" end="}" contains=javaComment,javaLineComment,javaDebug\%(Paren\)\@!.*
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300372 exec 'syn region javaDebugStrTempl contained start=+\%(\.[[:space:]\n]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ contains=javaDebugStrTemplEmbExp,javaDebugSpecial'
373 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 +0300374 syn match javaDebugTextBlockError contained +"""\s*"""+
Bram Moolenaar071d4272004-06-13 20:20:40 +0000375 syn match javaDebugCharacter contained "'[^\\]'"
376 syn match javaDebugSpecialCharacter contained "'\\.'"
377 syn match javaDebugSpecialCharacter contained "'\\''"
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300378 syn keyword javaDebugNumber contained 0 0l 0L
Aliaksei Budaveib3030b62024-03-03 17:51:01 +0300379 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\."
Aliaksei Budavei100a6652024-03-02 01:11:14 +0300380 syn match javaDebugNumber contained "\<\%(0\%([xX]\x\%(_*\x\)*\|_*\o\%(_*\o\)*\|[bB][01]\%(_*[01]\)*\)\|[1-9]\%(_*\d\)*\)[lL]\=\>"
381 syn match javaDebugNumber contained "\%(\<\d\%(_*\d\)*\.\%(\d\%(_*\d\)*\)\=\|\.\d\%(_*\d\)*\)\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\=\>"
382 syn match javaDebugNumber contained "\<\d\%(_*\d\)*[eE][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
383 syn match javaDebugNumber contained "\<\d\%(_*\d\)*\%([eE][-+]\=\d\%(_*\d\)*\)\=[fFdD]\>"
384 syn match javaDebugNumber contained "\<0[xX]\%(\x\%(_*\x\)*\.\=\|\%(\x\%(_*\x\)*\)\=\.\x\%(_*\x\)*\)[pP][-+]\=\d\%(_*\d\)*[fFdD]\=\>"
Bram Moolenaar071d4272004-06-13 20:20:40 +0000385 syn keyword javaDebugBoolean contained true false
386 syn keyword javaDebugType contained null this super
387 syn region javaDebugParen start=+(+ end=+)+ contained contains=javaDebug.*,javaDebugParen
388
Aliaksei Budavei40524742024-04-14 19:57:00 +0300389 " To make this work, define the highlighting for these groups.
390 syn match javaDebug "\<System\.\%(out\|err\)\.print\%(ln\)\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
391" FIXME: What API does "p" belong to?
392" syn match javaDebug "\<p\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
393 syn match javaDebug "\<\K\k*\.printStackTrace\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
394" FIXME: What API do "trace*" belong to?
395" syn match javaDebug "\<trace[SL]\=\s*("me=e-1 contains=javaDebug.* nextgroup=javaDebugParen
Bram Moolenaar071d4272004-06-13 20:20:40 +0000396
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200397 hi def link javaDebug Debug
398 hi def link javaDebugString DebugString
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300399 hi def link javaDebugStrTempl Macro
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300400 hi def link javaDebugTextBlockError Error
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200401 hi def link javaDebugType DebugType
402 hi def link javaDebugBoolean DebugBoolean
403 hi def link javaDebugNumber Debug
404 hi def link javaDebugSpecial DebugSpecial
405 hi def link javaDebugSpecialCharacter DebugSpecial
406 hi def link javaDebugCharacter DebugString
407 hi def link javaDebugParen Debug
Bram Moolenaar071d4272004-06-13 20:20:40 +0000408
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200409 hi def link DebugString String
410 hi def link DebugSpecial Special
411 hi def link DebugBoolean Boolean
412 hi def link DebugType Type
Bram Moolenaar071d4272004-06-13 20:20:40 +0000413endif
414
Aliaksei Budavei94c5d8a2024-06-19 20:10:47 +0200415" Try not to fold top-level-type bodies under assumption that there is
416" but one such body.
417exec 'syn region javaBlock transparent start="\%(^\|^\S[^:]\+\)\@' . s:ff.Peek('120', '') . '<!{" end="}" fold'
418
Bram Moolenaar071d4272004-06-13 20:20:40 +0000419if exists("java_mark_braces_in_parens_as_errors")
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300420 syn match javaInParen contained "[{}]"
421 hi def link javaInParen javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000422endif
423
424" catch errors caused by wrong parenthesis
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300425syn region javaParenT transparent matchgroup=javaParen start="(" end=")" contains=@javaTop,javaInParen,javaParenT1
426syn region javaParenT1 transparent matchgroup=javaParen1 start="(" end=")" contains=@javaTop,javaInParen,javaParenT2 contained
427syn region javaParenT2 transparent matchgroup=javaParen2 start="(" end=")" contains=@javaTop,javaInParen,javaParenT contained
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200428syn match javaParenError ")"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000429" catch errors caused by wrong square parenthesis
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100430syn region javaParenT transparent matchgroup=javaParen start="\[" end="\]" contains=@javaTop,javaParenT1
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000431syn region javaParenT1 transparent matchgroup=javaParen1 start="\[" end="\]" contains=@javaTop,javaParenT2 contained
432syn region javaParenT2 transparent matchgroup=javaParen2 start="\[" end="\]" contains=@javaTop,javaParenT contained
Bram Moolenaar00a927d2010-05-14 23:24:24 +0200433syn match javaParenError "\]"
Bram Moolenaar293ee4d2004-12-09 21:34:53 +0000434
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200435hi def link javaParenError javaError
Bram Moolenaar071d4272004-06-13 20:20:40 +0000436
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300437" Lambda expressions (JLS-17, §15.27).
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100438if exists("java_highlight_functions")
Aliaksei Budavei40524742024-04-14 19:57:00 +0300439 " Make ()-matching definitions after the parenthesis error catcher.
Aliaksei Budavei7129f2a2024-05-31 12:11:34 +0300440 "
441 " Match: ([@A [@B ...] final] var a[, var b, ...]) ->
442 " | ([@A [@B ...] final] T[<α>][[][]] a[, T b, ...]) ->
443 " There is no recognition of expressions interspersed with comments
444 " or of expressions whose parameterised parameter types are written
445 " across multiple lines.
446 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'
447 " Match: () ->
448 " | (a[, b, ...]) ->
449 exec 'syn match javaLambdaDef "\k\@' . s:ff.Peek('4', '') . '<!([[:space:]\n]*\%(\<\K\k*\>\%(,[[:space:]\n]*\)\=\)*)[[:space:]\n]*->"'
450 " Match: a ->
451 exec 'syn match javaLambdaDef "\<\K\k*\>\%(\<default\>\)\@' . s:ff.Peek('7', '') . '<![[:space:]\n]*->"'
452
453 syn keyword javaParamModifier contained final
454 hi def link javaParamModifier javaConceptKind
455 syn keyword javaLambdaVarType contained var
456 hi def link javaLambdaVarType javaOperator
Bram Moolenaarf3c2afb2015-03-02 23:16:07 +0100457endif
458
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300459" The @javaTop cluster comprises non-contained Java syntax groups.
460" Note that the syntax file "aidl.vim" relies on its availability.
Aliaksei Budavei94c5d8a2024-06-19 20:10:47 +0200461syn cluster javaTop contains=TOP
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300462
Bram Moolenaar071d4272004-06-13 20:20:40 +0000463if !exists("java_minlines")
464 let java_minlines = 10
465endif
Aliaksei Budavei8e59a7b2024-03-25 18:18:28 +0300466
467" Note that variations of a /*/ balanced comment, e.g., /*/*/, /*//*/,
468" /* /*/, /* /*/, etc., may have their rightmost /*/ part accepted
469" as a comment start by ':syntax sync ccomment'; consider alternatives
470" to make synchronisation start further towards file's beginning by
471" bumping up g:java_minlines or issuing ':syntax sync fromstart' or
472" preferring &foldmethod set to 'syntax'.
Bram Moolenaar071d4272004-06-13 20:20:40 +0000473exec "syn sync ccomment javaComment minlines=" . java_minlines
474
475" The default highlighting.
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200476hi def link javaLambdaDef Function
477hi def link javaFuncDef Function
478hi def link javaVarArg Function
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200479hi def link javaBranch Conditional
480hi def link javaUserLabelRef javaUserLabel
481hi def link javaLabel Label
482hi def link javaUserLabel Label
483hi def link javaConditional Conditional
484hi def link javaRepeat Repeat
485hi def link javaExceptions Exception
486hi def link javaAssert Statement
487hi def link javaStorageClass StorageClass
488hi def link javaMethodDecl javaStorageClass
489hi def link javaClassDecl javaStorageClass
490hi def link javaScopeDecl javaStorageClass
Aliaksei Budavei9ecf02c2024-02-28 21:30:22 +0100491hi def link javaConceptKind NonText
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200492
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200493hi def link javaBoolean Boolean
494hi def link javaSpecial Special
495hi def link javaSpecialError Error
496hi def link javaSpecialCharError Error
497hi def link javaString String
Aliaksei Budaveia2c65802024-03-09 20:03:11 +0300498hi def link javaStrTempl Macro
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200499hi def link javaCharacter Character
500hi def link javaSpecialChar SpecialChar
501hi def link javaNumber Number
502hi def link javaError Error
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300503hi def link javaTextBlockError Error
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200504hi def link javaStatement Statement
505hi def link javaOperator Operator
506hi def link javaComment Comment
507hi def link javaDocComment Comment
508hi def link javaLineComment Comment
509hi def link javaConstant Constant
510hi def link javaTypedef Typedef
511hi def link javaTodo Todo
512hi def link javaAnnotation PreProc
Aliaksei Budavei902b7662024-06-13 18:30:09 +0300513hi def link javaAnnotationStart javaAnnotation
Bram Moolenaar071d4272004-06-13 20:20:40 +0000514
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200515hi def link javaCommentTitle SpecialComment
516hi def link javaDocTags Special
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300517hi def link javaDocCodeTag Special
518hi def link javaDocSnippetTag Special
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200519hi def link javaDocParam Function
520hi def link javaDocSeeTagParam Function
521hi def link javaCommentStar javaComment
Bram Moolenaar071d4272004-06-13 20:20:40 +0000522
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200523hi def link javaType Type
524hi def link javaExternal Include
Bram Moolenaar071d4272004-06-13 20:20:40 +0000525
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200526hi def link htmlComment Special
527hi def link htmlCommentPart Special
Aliaksei Budavei3e72bf12024-03-22 21:32:48 +0300528hi def link htmlArg Type
529hi def link htmlString String
Bram Moolenaarf37506f2016-08-31 22:22:10 +0200530hi def link javaSpaceError Error
Bram Moolenaar071d4272004-06-13 20:20:40 +0000531
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200532if s:module_info_cur_buf
533 hi def link javaModuleStorageClass StorageClass
534 hi def link javaModuleStmt Statement
535 hi def link javaModuleExternal Include
Bram Moolenaar91f84f62018-07-29 15:07:52 +0200536endif
537
Bram Moolenaar071d4272004-06-13 20:20:40 +0000538let b:current_syntax = "java"
539
540if main_syntax == 'java'
541 unlet main_syntax
542endif
543
Aliaksei Budavei5ccdcc42024-04-04 21:51:18 +0200544let b:spell_options = "contained"
Bram Moolenaar0c5fa7d2012-10-05 22:26:30 +0200545let &cpo = s:cpo_save
Aliaksei Budaveid3952e82024-05-11 00:39:31 +0300546unlet s:module_info_cur_buf s:ff s:cpo_save
Bram Moolenaar071d4272004-06-13 20:20:40 +0000547
Aliaksei Budavei371bab02024-06-16 09:42:55 +0300548" See ":help vim9-mix".
549if !has("vim9script")
550 finish
551endif
552
553def! s:JavaSyntaxFoldTextExpr(): string
554 return getline(v:foldstart) !~ '/\*\+\s*$'
555 ? foldtext()
556 : printf('+-%s%3d lines: ',
557 v:folddashes,
558 (v:foldend - v:foldstart + 1)) ..
559 getline(v:foldstart + 1)
560enddef
561
562setlocal foldtext=s:JavaSyntaxFoldTextExpr()
563delfunction! g:JavaSyntaxFoldTextExpr
Aliaksei Budavei06bdac12024-05-10 15:49:06 +0300564" vim: sw=2 ts=8 noet sta