From be999e6a0e5b251b2b37500d06636d4167334c6e Mon Sep 17 00:00:00 2001 From: Christian Clason Date: Sun, 23 Jun 2024 12:00:49 +0200 Subject: vim-patch:01a4fb1: runtime(java): Compose "g:java_highlight_signature" and "g:java_highlight_functions" With the variables defined, distinctly highlight parts of a method declaration header: its name and parameter list parens, from its type parameters, return type, and formal parameters; and distinctly highlight parts of a lambda expression: its parameter list parens and the arrow, from its formal parameters and identifiers. closes: vim/vim#15083 https://github.com/vim/vim/commit/01a4fb104dbee6a8b7ef20394a2a7c5b49cf49ca Co-authored-by: Aliaksei Budavei <0x000c70@gmail.com> --- runtime/doc/syntax.txt | 7 +++++ runtime/syntax/java.vim | 76 ++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 67 insertions(+), 16 deletions(-) diff --git a/runtime/doc/syntax.txt b/runtime/doc/syntax.txt index 3870b8d5f6..4b49a31604 100644 --- a/runtime/doc/syntax.txt +++ b/runtime/doc/syntax.txt @@ -1560,6 +1560,13 @@ However, if you follow the Java guidelines about how functions and classes are supposed to be named (with respect to upper- and lowercase) and there is any amount of indentation, you may want to set > :let java_highlight_functions="style" +In addition, you can combine any value of "java_highlight_functions" with > + :let java_highlight_signature=1 +to have the name of a function with its parameter list parens distinctly +highlighted from its type parameters, return type, and formal parameters; and +to have the parameter list parens of a lambda expression with its arrow +distinctly highlighted from its formal parameters or identifiers. + If neither setting does work for you, but you would still want headers of function declarations to be highlighted, modify the current syntax definitions or compose new ones. diff --git a/runtime/syntax/java.vim b/runtime/syntax/java.vim index b612ccaaad..4beeaad224 100644 --- a/runtime/syntax/java.vim +++ b/runtime/syntax/java.vim @@ -3,7 +3,7 @@ " Maintainer: Aliaksei Budavei <0x000c70 AT gmail DOT com> " Former Maintainer: Claudio Fleiner " Repository: https://github.com/zzzyxwvut/java-vim.git -" Last Change: 2024 Jun 19 +" Last Change: 2024 Jun 22 " Please check :help java.vim for comments on some of the options available. @@ -139,6 +139,12 @@ else let [s:ff.Engine, s:ff.UpperCase, s:ff.LowerCase] = repeat([s:ff.RightConstant], 3) endif +if exists("java_highlight_signature") + let [s:ff.PeekTo, s:ff.PeekFrom, s:ff.GroupArgs] = repeat([s:ff.LeftConstant], 3) +else + let [s:ff.PeekTo, s:ff.PeekFrom, s:ff.GroupArgs] = repeat([s:ff.RightConstant], 3) +endif + " Java modules (since Java 9, for "module-info.java" file). if s:module_info_cur_buf syn keyword javaModuleStorageClass module transitive @@ -228,9 +234,17 @@ if exists("java_highlight_all") || exists("java_highlight_java") || exists("ja hi def link javaE_ javaExceptions hi def link javaC_ javaConstant - syn keyword javaLangObject clone equals finalize getClass hashCode - syn keyword javaLangObject notify notifyAll toString wait - hi def link javaLangObject javaConstant + syn keyword javaLangObject getClass notify notifyAll wait + + " Lower the syntax priority of overridable java.lang.Object method + " names for zero-width matching (define g:java_highlight_signature + " and see their base declarations for java.lang.Object): + syn match javaLangObject "\" + syn match javaLangObject "\" + syn match javaLangObject "\" + syn match javaLangObject "\" + syn match javaLangObject "\" + hi def link javaLangObject javaConstant endif if filereadable(expand(":p:h") . "/javaid.vim") @@ -364,30 +378,49 @@ syn match javaSpecial "\\u\x\x\x\x" if exists("java_highlight_functions") syn cluster javaFuncParams contains=javaAnnotation,@javaClasses,javaGenerics,javaType,javaVarArg,javaComment,javaLineComment + if exists("java_highlight_signature") + syn keyword javaParamModifier contained final + syn cluster javaFuncParams add=javaParamModifier + hi def link javaParamModifier javaConceptKind + hi def link javaFuncDefStart javaFuncDef + else + syn cluster javaFuncParams add=javaScopeDecl,javaConceptKind,javaStorageClass,javaExternal + endif + if java_highlight_functions =~# '^indent[1-8]\=$' let s:last = java_highlight_functions[-1 :] let s:indent = s:last != 't' ? repeat("\x20", s:last) : "\t" - syn cluster javaFuncParams add=javaScopeDecl,javaConceptKind,javaStorageClass,javaExternal " Try to not match other type members, initialiser blocks, enum " constants (JLS-17, §8.9.1), and constructors (JLS-17, §8.1.7): " at any _conventional_ indentation, skip over all fields with " "[^=]*", all records with "\]\+>\+\s\+\|\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)\+\)\=\%(\<\K\k*\>\.\)*\K\k*\>[^=]*\%(\]\+>\+\s\+\|\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)\+\)\=\%(\<\K\k*\>\.\)*\K\k*\>[^={]*\%(\\)\s\+\)*p\%(ublic\|rotected\|rivate\)\s\+\%(<[^>]\+>\+\s\+\)\=\K\k*\s*\ze(+ contains=javaAnnotation,javaScopeDecl' - exec 'syn match javaEnumSkipArgumentativeConstant transparent +^' . s:indent . '\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)*\K\k*\s*\ze(+ contains=javaAnnotation' + 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,javaClassDecl,javaTypedef,javaGenerics' + " With a zero-width span for signature applicable on demand to + " javaFuncDef, make related adjustments: + " (1) Claim all enum constants of a line as a unit. + exec 'syn match javaEnumSkipConstant contained transparent /^' . s:indent . '\%(\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)*\K\k*\s*\%((.*)\)\=\s*[,;({]\s*\)\+/ contains=@javaEnumConstants' + " (2) Define a syntax group for top level enumerations and tell + " apart their constants from method declarations. + exec 'syn region javaTopEnumDeclaration transparent start=/\%(^\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)*\%(p\%(ublic\|rotected\|rivate\)\s\+\)\=\%(strictfp\s\+\)\=\] Τʬ[<γ>][[][]] μʭʭ(/* ... */); - 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' + exec 'syn region javaFuncDef ' . s:ff.GroupArgs('transparent matchgroup=javaFuncDefStart', '') . ' start=/' . s:ff.Engine('\%#=2', '') . s:ff.PeekTo('\%(', '') . '^\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.PeekFrom('\)\@' . s:ff.Peek('80', '') . '<=', '') . '\<' . s:ff.LowerCase('[$_[:lower:]]', '[^A-Z0-9]') . '\k*\>\s*(/ end=/)/ skip=/\/\*.\{-}\*\/\|\/\/.*$/ contains=@javaFuncParams' endif endif @@ -466,19 +499,29 @@ hi def link javaParenError javaError " Lambda expressions (JLS-17, §15.27). if exists("java_highlight_functions") + if exists("java_highlight_signature") + let s:ff.LambdaDef = s:ff.LeftConstant + else + let s:ff.LambdaDef = s:ff.RightConstant + endif + " Make ()-matching definitions after the parenthesis error catcher. " + " Note that here and elsewhere a single-line token is used for \z, + " with other tokens repeated as necessary, to overcome the lack of + " support for multi-line matching with \z. + " " Match: ([@A [@B ...] final] var a[, var b, ...]) -> " | ([@A [@B ...] final] T[<α>][[][]] a[, T b, ...]) -> " There is no recognition of expressions interspersed with comments " or of expressions whose parameterised parameter types are written " across multiple lines. - exec 'syn match javaLambdaDef "\k\@' . s:ff.Peek('4', '') . '\%((\_.\{-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,javaGenerics,javaVarArg' + exec 'syn ' . s:ff.LambdaDef('region javaLambdaDef transparent matchgroup=javaLambdaDefStart start=/', 'match javaLambdaDef "') . '\k\@' . s:ff.Peek('4', '') . '\%((\_.\{-1,})\)\{-,1}[[:space:]\n]\+\)*\%(final[[:space:]\n]\+\)\=\%(\<\K\k*\>\.\)*\<\K\k*\>\%(<[^(){}]*[[:space:]-]\@' . s:ff.Peek('1', '') . '\)\=\%(\%(\%(\[\]\)\+\|\.\.\.\)\)\=[[:space:]\n]\+\<\K\k*\>\%(\[\]\)*\%(,[[:space:]\n]*\)\=\)\+)[[:space:]\n]*' . s:ff.LambdaDef('\z(->\)\)\@=/ end=/)[[:space:]\n]*\z1/', '->"') . ' contains=javaAnnotation,javaParamModifier,javaLambdaVarType,javaType,@javaClasses,javaGenerics,javaVarArg' " Match: () -> " | (a[, b, ...]) -> - exec 'syn match javaLambdaDef "\k\@' . s:ff.Peek('4', '') . '\%(,[[:space:]\n]*\)\=\)*)[[:space:]\n]*->"' + exec 'syn ' . s:ff.LambdaDef('region javaLambdaDef transparent matchgroup=javaLambdaDefStart start=/', 'match javaLambdaDef "') . '\k\@' . s:ff.Peek('4', '') . '\%(,[[:space:]\n]*\)\=\)*)[[:space:]\n]*' . s:ff.LambdaDef('\z(->\)\)\@=/ end=/)[[:space:]\n]*\z1/', '->"') " Match: a -> - exec 'syn match javaLambdaDef "\<\K\k*\>\%(\\)\@' . s:ff.Peek('7', '') . '"' + exec 'syn ' . s:ff.LambdaDef('region javaLambdaDef transparent start=/', 'match javaLambdaDef "') . '\<\K\k*\>\%(\\)\@' . s:ff.Peek('7', '') . '\)\)\@=/ matchgroup=javaLambdaDefStart end=/\z1/', '[[:space:]\n]*->"') syn keyword javaParamModifier contained final hi def link javaParamModifier javaConceptKind @@ -488,7 +531,7 @@ endif " The @javaTop cluster comprises non-contained Java syntax groups. " Note that the syntax file "aidl.vim" relies on its availability. -syn cluster javaTop contains=TOP +syn cluster javaTop contains=TOP,javaTopEnumDeclaration if !exists("java_minlines") let java_minlines = 10 @@ -504,7 +547,8 @@ exec "syn sync ccomment javaComment minlines=" . java_minlines " The default highlighting. hi def link javaLambdaDef Function -hi def link javaFuncDef Function +hi def link javaLambdaDefStart Function +hi def link javaFuncDef Function hi def link javaVarArg Function hi def link javaBranch Conditional hi def link javaUserLabelRef javaUserLabel -- cgit