runtime(java): Manage byte limits for variable-width lookbehind assertions

Commit: 
https://github.com/vim/vim/commit/7132935413dfda47e015015dbbc5b9eb097b90d6
Author: Aliaksei Budavei <0x000...@gmail.com>
Date:   Fri Aug 8 10:50:19 2025 +0200

    runtime(java): Manage byte limits for variable-width lookbehind assertions
    
    Raise the byte limits from 80 to 120 for "javaFuncDef" and
    "java*CommentTitle"; and support selecting other arbitrary
    values with
    ------------------------------------------------------------
            let g:java_lookbehind_byte_counts = {
                    \ 'javaMarkdownCommentTitle': 240,
            \ }
    ------------------------------------------------------------
    
    for related groups of syntax definitions, referring to their
    names with dictionary keys.
    
    Over-80-Byte-Limit Lookbehind Examples:
    
https://raw.githubusercontent.com/openjdk/jdk/refs/tags/jdk-24%2B36/src/java.base/share/classes/sun/security/x509/NamedX509Key.java
 [Lines 43 & 44]
    
https://raw.githubusercontent.com/openjdk/jdk/refs/tags/jdk-24%2B36/src/jdk.compiler/share/classes/com/sun/tools/javac/util/GraphUtils.java
 [Line 154]
    
    closes: #17921
    
    Signed-off-by: Aliaksei Budavei <0x000...@gmail.com>
    Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/runtime/doc/syntax.txt b/runtime/doc/syntax.txt
index 968853970..321f94889 100644
--- a/runtime/doc/syntax.txt
+++ b/runtime/doc/syntax.txt
@@ -1,4 +1,4 @@
-*syntax.txt*   For Vim version 9.1.  Last change: 2025 Aug 07
+*syntax.txt*   For Vim version 9.1.  Last change: 2025 Aug 08
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -2231,6 +2231,15 @@ Certain modifiers are incompatible with each other, e.g. 
`abstract` and
 and can be differently highlighted as a group than other modifiers with >
        :hi link javaConceptKind NonText
 
+All instances of variable-width lookbehind assertions (|/\@<!| and |/\@<=|),
+resorted to in syntax item definitions, are confined to arbitrary byte counts.
+Another arbitrary value can be selected for a related group of definitions.
+For example: >
+       :let g:java_lookbehind_byte_counts = {'javaMarkdownCommentTitle': 240}
+Where each key name of this dictionary is the name of a syntax item.  The use
+of these assertions in syntax items may vary among revisions, so no definitive
+set of supported key names is committed to.
+
 If you notice highlighting errors while scrolling backwards, which are fixed
 when redrawing with CTRL-L, try setting the "g:java_minlines" variable to
 a larger number: >
diff --git a/runtime/syntax/java.vim b/runtime/syntax/java.vim
index 5df1d4fa3..22b86ed9d 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 <clau...@fleiner.com>
 " Repository:          https://github.com/zzzyxwvut/java-vim.git
-" Last Change:         2025 Jun 22
+" Last Change:         2025 Aug 07
 
 " Please check ":help java.vim" for comments on some of the options
 " available.
@@ -125,11 +125,29 @@ endif
 " if necessary, on the line before that (h: \@<=), trying to match
 " neither a method reference nor a qualified method invocation.
 try
-  syn match  javaOperator      "\%(\%(::\|\.\)[[:space:]
]*\)\@80<!\<yield\>"
+  if !empty(get(g:, 'java_lookbehind_byte_counts', {}))
+    exec 'syn match javaOperator "\%(\%(::\|\.\)[[:space:]
]*\)\@' . max([0, get(g:java_lookbehind_byte_counts, 'javaOperator', 80)]) . 
'<!\<yield\>"'
+
+    function! s:ff.PeekFor(item, count) abort
+      return string(max([0, get(g:java_lookbehind_byte_counts, a:item, 
a:count)]))
+    endfunction
+  else
+    syn match  javaOperator    "\%(\%(::\|\.\)[[:space:]
]*\)\@80<!\<yield\>"
+
+    function! s:ff.PeekFor(dummy, count) abort
+      return string(a:count)
+    endfunction
+  endif
+
   let s:ff.Peek = s:ff.LeftConstant
 catch /\<E59:/
   call s:ReportOnce(v:exception)
   syn match  javaOperator      "\%(\%(::\|\.\)[[:space:]
]*\)\@<!\<yield\>"
+
+  function! s:ff.PeekFor(dummy_a, dummy_b) abort
+    return ""
+  endfunction
+
   let s:ff.Peek = s:ff.RightConstant
 endtry
 
@@ -308,7 +326,7 @@ if exists("g:java_highlight_generics")
   " Match sections of generic methods and constructors and their
   " parameterised use.
   exec 'syn region javaTypeParamSection transparent matchgroup=javaGenericsCX 
start=/' . s:ff.Engine('\%#=2', '') . '\%(^\|\s\)\@' . s:ff.Peek('1', '') . 
'<=<\%(\%([^(){}]\|
\)\+[[: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\+\)\=\<\K\k*\>\s*(\)\@=/ end=/>/ 
contains=javaGenerics,@javaTypeParams'
-  exec 'syn region javaTypeParamSection transparent matchgroup=javaGenericsCX 
start=/\%(\%(\<new\|::\|\.\)[[:space:]
]*\)\@' . s:ff.Peek('80', '') . '<=<>\@!/ end=/>/ 
contains=javaGenerics,@javaTypeParams'
+  exec 'syn region javaTypeParamSection transparent matchgroup=javaGenericsCX 
start=/\%(\%(\<new\|::\|\.\)[[:space:]
]*\)\@' . s:ff.PeekFor('javaTypeParamSection', 80) . '<=<>\@!/ end=/>/ 
contains=javaGenerics,@javaTypeParams'
 
   for s:ctx in [{'gsg': 'javaGenerics', 'ghg': 'javaGenericsC1', 'csg': 
'javaGenericsX', 'c': ''},
       \ {'gsg': 'javaGenericsX', 'ghg': 'javaGenericsC2', 'csg': 
'javaGenerics', 'c': ' contained'}]
@@ -376,7 +394,7 @@ syn match   javaCommentStar contained "^\s*\*$"
 syn match   javaLineComment    "//.*" 
contains=@javaCommentSpecial2,javaTodo,javaCommentMarkupTag,javaSpaceError,@Spell
 syn match   javaCommentMarkupTag contained 
"@\%(end\|highlight\|link\|replace\|start\)\>" 
nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
 syn match   javaCommentMarkupTagAttr contained "\<region\>" 
nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite
-exec 'syn region javaCommentMarkupTagAttr contained transparent 
matchgroup=javaHtmlArg 
start=/\<\%(re\%(gex\|gion\|placement\)\|substring\|t\%(arget\|ype\)\)\%(\s*=\)\@=/
 matchgroup=javaHtmlString end=/\%(=\s*\)\@' . s:ff.Peek('80', '') . 
'<=\%("[^"]\+"\|' . "\x27[^\x27]\+\x27" . '\|\%([.-]\|\k\)\+\)/ 
nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite oneline'
+exec 'syn region javaCommentMarkupTagAttr contained transparent 
matchgroup=javaHtmlArg 
start=/\<\%(re\%(gex\|gion\|placement\)\|substring\|t\%(arget\|ype\)\)\%(\s*=\)\@=/
 matchgroup=javaHtmlString end=/\%(=\s*\)\@' . 
s:ff.PeekFor('javaCommentMarkupTagAttr', 80) . '<=\%("[^"]\+"\|' . 
"\x27[^\x27]\+\x27" . '\|\%([.-]\|\k\)\+\)/ 
nextgroup=javaCommentMarkupTagAttr,javaSpaceError skipwhite oneline'
 syn match   javaCommentError contained "/\*"me=e-1 display
 
 if !exists("g:java_ignore_javadoc") && (s:with_html || s:with_markdown) && 
g:main_syntax != 'jsp'
@@ -476,9 +494,9 @@ if !exists("g:java_ignore_javadoc") && (s:with_html || 
s:with_markdown) && g:mai
   if s:with_markdown
     syn region javaMarkdownComment     start="///" skip="^\s*///.*$" end="^" 
keepend 
contains=javaMarkdownCommentTitle,javaMarkdownShortcutLink,@javaMarkdown,@javaDocTags,javaTodo,@Spell
 nextgroup=javaMarkdownCommentTitle fold
     syn match javaMarkdownCommentMask  contained "^\s*///"
-    exec 'syn region javaMarkdownCommentTitle contained 
matchgroup=javaMarkdownComment start="\%(///.*
\=
\s*\)\@' . s:ff.Peek('80', '') . '<!///" matchgroup=javaMarkdownCommentTitle 
end="\.$" end="\.[         
]\@=" end="
\%(\s*///\s*$\)\@=" end="\%(^\s*///\s*\)\@' . s:ff.Peek('80', '') . 
'<=@"me=s-2,he=s-1 
contains=javaMarkdownShortcutLink,@javaMarkdown,javaMarkdownCommentMask,javaTodo,@Spell,@javaDocTags'
-    exec 'syn region javaMarkdownCommentTitle contained 
matchgroup=javaMarkdownComment start="\%(///.*
\=
\s*\)\@' . s:ff.Peek('80', '') . '<!///\s*\%({@return\>\)\@=" 
matchgroup=javaMarkdownCommentTitle end="}\%(\s*\.*\)*" 
contains=javaMarkdownShortcutLink,@javaMarkdown,javaMarkdownCommentMask,javaTodo,@Spell,@javaDocTags,javaTitleSkipBlock'
-    exec 'syn region javaMarkdownCommentTitle contained 
matchgroup=javaMarkdownComment start="\%(///.*
\=
\s*\)\@' . s:ff.Peek('80', '') . '<!///\s*\%({@summary\>\)\@=" 
matchgroup=javaMarkdownCommentTitle end="}" 
contains=javaMarkdownShortcutLink,@javaMarkdown,javaMarkdownCommentMask,javaTodo,@Spell,@javaDocTags,javaTitleSkipBlock'
+    exec 'syn region javaMarkdownCommentTitle contained 
matchgroup=javaMarkdownComment start="\%(///.*
\=
\s*\)\@' . s:ff.PeekFor('javaMarkdownCommentTitle', 120) . '<!///" 
matchgroup=javaMarkdownCommentTitle end="\.$" end="\.[       
]\@=" end="
\%(\s*///\s*$\)\@=" end="\%(^\s*///\s*\)\@' . 
s:ff.PeekFor('javaMarkdownCommentTitle', 120) . '<=@"me=s-2,he=s-1 
contains=javaMarkdownShortcutLink,@javaMarkdown,javaMarkdownCommentMask,javaTodo,@Spell,@javaDocTags'
+    exec 'syn region javaMarkdownCommentTitle contained 
matchgroup=javaMarkdownComment start="\%(///.*
\=
\s*\)\@' . s:ff.PeekFor('javaMarkdownCommentTitle', 120) . 
'<!///\s*\%({@return\>\)\@=" matchgroup=javaMarkdownCommentTitle 
end="}\%(\s*\.*\)*" 
contains=javaMarkdownShortcutLink,@javaMarkdown,javaMarkdownCommentMask,javaTodo,@Spell,@javaDocTags,javaTitleSkipBlock'
+    exec 'syn region javaMarkdownCommentTitle contained 
matchgroup=javaMarkdownComment start="\%(///.*
\=
\s*\)\@' . s:ff.PeekFor('javaMarkdownCommentTitle', 120) . 
'<!///\s*\%({@summary\>\)\@=" matchgroup=javaMarkdownCommentTitle end="}" 
contains=javaMarkdownShortcutLink,@javaMarkdown,javaMarkdownCommentMask,javaTodo,@Spell,@javaDocTags,javaTitleSkipBlock'
 
     " REDEFINE THE MARKDOWN ITEMS ANCHORED WITH "^", OBSERVING THE
     " DEFINITION ORDER.
@@ -530,7 +548,7 @@ if !exists("g:java_ignore_javadoc") && (s:with_html || 
s:with_markdown) && g:mai
 
   if s:with_html
     syn region javaDocComment  start="/\*\*" end="\*/" keepend 
contains=javaCommentTitle,@javaHtml,@javaDocTags,javaTodo,javaCommentError,javaSpaceError,@Spell
 fold
-    exec 'syn region javaCommentTitle contained matchgroup=javaDocComment 
start="/\*\*" matchgroup=javaCommentTitle end="\.$" end="\.[         
]\@=" 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'
+    exec 'syn region javaCommentTitle contained matchgroup=javaDocComment 
start="/\*\*" matchgroup=javaCommentTitle end="\.$" end="\.[         
]\@=" end="\%(^\s*\**\s*\)\@' . s:ff.PeekFor('javaCommentTitle', 120) . 
'<=@"me=s-2,he=s-1 end="\*/"me=s-1,he=s-1 
contains=@javaHtml,javaCommentStar,javaTodo,javaCommentError,javaSpaceError,@Spell,@javaDocTags'
     syn region javaCommentTitle        contained matchgroup=javaDocComment 
start="/\*\*\s*
\=
\=\s*\**\s*\%({@return\>\)\@=" matchgroup=javaCommentTitle end="}\%(\s*\.*\)*" 
contains=@javaHtml,javaCommentStar,javaTodo,javaCommentError,javaSpaceError,@Spell,@javaDocTags,javaTitleSkipBlock
     syn region javaCommentTitle        contained matchgroup=javaDocComment 
start="/\*\*\s*
\=
\=\s*\**\s*\%({@summary\>\)\@=" matchgroup=javaCommentTitle end="}" 
contains=@javaHtml,javaCommentStar,javaTodo,javaCommentError,javaSpaceError,@Spell,@javaDocTags,javaTitleSkipBlock
     hi def link javaDocComment         Comment
@@ -605,7 +623,7 @@ if !exists("g:java_ignore_javadoc") && (s:with_html || 
s:with_markdown) && g:mai
   syn region javaCodeSkipBlock contained transparent start="{\%(@code\>\)\@!" 
end="}" contains=javaCodeSkipBlock,javaDocCodeTag
   syn region javaDocCodeTag    contained start="{@code\>" end="}" 
contains=javaDocCodeTag,javaCodeSkipBlock
 
-  exec 'syn region javaDocSnippetTagAttr contained transparent 
matchgroup=javaHtmlArg start=/\<\%(class\|file\|id\|lang\|region\)\%(\s*=\)\@=/ 
matchgroup=javaHtmlString end=/:$/ end=/\%(=\s*\)\@' . s:ff.Peek('80', '') . 
'<=\%("[^"]\+"\|' . "\x27[^\x27]\+\x27" . '\|\%([.\/-]\|\k\)\+\)/ 
nextgroup=javaDocSnippetTagAttr skipwhite skipnl'
+  exec 'syn region javaDocSnippetTagAttr contained transparent 
matchgroup=javaHtmlArg start=/\<\%(class\|file\|id\|lang\|region\)\%(\s*=\)\@=/ 
matchgroup=javaHtmlString end=/:$/ end=/\%(=\s*\)\@' . 
s:ff.PeekFor('javaDocSnippetTagAttr', 80) . '<=\%("[^"]\+"\|' . 
"\x27[^\x27]\+\x27" . '\|\%([.\/-]\|\k\)\+\)/ nextgroup=javaDocSnippetTagAttr 
skipwhite skipnl'
   syn region javaSnippetSkipBlock contained transparent 
start="{\%(@snippet\>\)\@!" end="}" 
contains=javaSnippetSkipBlock,javaDocSnippetTag,javaCommentMarkupTag
   syn region javaDocSnippetTag contained start="{@snippet\>" end="}" 
contains=javaDocSnippetTag,javaSnippetSkipBlock,javaDocSnippetTagAttr,javaCommentMarkupTag
 
@@ -655,8 +673,8 @@ syn match   javaTextBlockError      +"""\s*"""+
 
 if s:ff.IsAnyRequestedPreviewFeatureOf([430])
   syn region javaStrTemplEmbExp        contained matchgroup=javaStrTempl 
start="\{" end="}" contains=TOP
-  exec 'syn region javaStrTempl start=+\%(\.[[:space:]
]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ 
contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,@Spell'
-  exec 'syn region javaStrTempl start=+\%(\.[[:space:]
]*\)\@' . s:ff.Peek('80', '') . '<="""[         \x0c
]*$+hs=e+1 end=+"""+he=s-1 
contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,javaTextBlockError,@Spell'
+  exec 'syn region javaStrTempl start=+\%(\.[[:space:]
]*\)\@' . s:ff.PeekFor('javaStrTempl', 80) . '<="+ end=+"+ 
contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,@Spell'
+  exec 'syn region javaStrTempl start=+\%(\.[[:space:]
]*\)\@' . s:ff.PeekFor('javaStrTempl', 80) . '<="""[    \x0c
]*$+hs=e+1 end=+"""+he=s-1 
contains=javaStrTemplEmbExp,javaSpecialChar,javaSpecialError,javaTextBlockError,@Spell'
   hi def link javaStrTempl     Macro
 endif
 
@@ -699,7 +717,7 @@ if exists("g:java_highlight_functions")
     " definitions take care of constructor declarations and enum
     " constants (with no support for @Foo(value = "bar")).  Also,
     " reject inlined declarations with "[^{]" for signature.
-    exec 'syn region javaFuncDef ' . s:ff.GroupArgs('transparent 
matchgroup=javaFuncDefStart', '') . ' start="' . s:ff.PeekTo('\%(', '') . '^' . 
s:indent . '\%(<\%(/\*.\{-}\*/\|[^(){}>]\|
\)\+>\+\s\+\|\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)\+\)\=\%(\<\K\k*\>\.\)*\K\k*\>[^={]*\%(\<record\)\@'
 . s:ff.Peek('6', '') . '<!\s' . s:ff.PeekFrom('\)\@' . s:ff.Peek('80', '') . 
'<=', '') . '\K\k*\s*(" end=")" contains=@javaFuncParams'
+    exec 'syn region javaFuncDef ' . s:ff.GroupArgs('transparent 
matchgroup=javaFuncDefStart', '') . ' start="' . s:ff.PeekTo('\%(', '') . '^' . 
s:indent . '\%(<\%(/\*.\{-}\*/\|[^(){}>]\|
\)\+>\+\s\+\|\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)\+\)\=\%(\<\K\k*\>\.\)*\K\k*\>[^={]*\%(\<record\)\@'
 . s:ff.Peek('6', '') . '<!\s' . s:ff.PeekFrom('\)\@' . 
s:ff.PeekFor('javaFuncDef', 120) . '<=', '') . '\K\k*\s*(" end=")" 
contains=@javaFuncParams'
     " As long as package-private constructors cannot be matched with
     " javaFuncDef, do not look with javaConstructorSkipDeclarator for
     " them.  (Approximate "javaTypeParamSection" if necessary.)
@@ -710,7 +728,7 @@ if exists("g:java_highlight_functions")
     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\+\)\=\<enum\_s\+\)\@'
 . s:ff.Peek('80', '') . '<=\K\k*\%(\_s\+implements\_s.\+\)\=\_s*{/ end=/}/ 
contains=@javaTop,javaEnumSkipConstant'
+    exec 'syn region javaTopEnumDeclaration transparent 
start=/\%(^\%(\%(@\%(\K\k*\.\)*\K\k*\>\)\s\+\)*\%(p\%(ublic\|rotected\|rivate\)\s\+\)\=\%(strictfp\s\+\)\=\<enum\_s\+\)\@'
 . s:ff.PeekFor('javaTopEnumDeclaration', 80) . 
'<=\K\k*\%(\_s\+implements\_s.\+\)\=\_s*{/ end=/}/ 
contains=@javaTop,javaEnumSkipConstant'
     " (3) Define a base variant of javaParenT without using @javaTop
     " in order to not include javaFuncDef.
     syn region javaParenE transparent matchgroup=javaParen start="(" end=")" 
contains=@javaEnumConstants,javaInParen
@@ -722,7 +740,7 @@ if exists("g:java_highlight_functions")
 
     " Match arbitrarily indented camelCasedName method declarations.
     " Match: [@蓯] [abstract] [<伪, 尾>] 韦尸[<纬>][[][]] 渭虱虱(/* ... */);
-    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'
+    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.PeekFor('javaFuncDef', 120) . '<=', '') . '\<' . 
s:ff.LowerCase('[$_[:lower:]]', '[^A-Z0-9]') . '\k*\>\s*(/ end=/)/ 
skip=/\/\*.\{-}\*\/\|\/\/.*$/ contains=@javaFuncParams'
   endif
 endif
 
@@ -736,8 +754,8 @@ if exists("g:java_highlight_debug")
     " The highlight groups of java{StrTempl,Debug{,Paren,StrTempl}}\,
     " share one colour by default. Do not conflate unrelated parens.
     syn region javaDebugStrTemplEmbExp contained matchgroup=javaDebugStrTempl 
start="\{" end="}" contains=javaComment,javaLineComment,javaDebug\%(Paren\)\@!.*
-    exec 'syn region javaDebugStrTempl contained start=+\%(\.[[:space:]
]*\)\@' . s:ff.Peek('80', '') . '<="+ end=+"+ 
contains=javaDebugStrTemplEmbExp,javaDebugSpecial'
-    exec 'syn region javaDebugStrTempl contained start=+\%(\.[[:space:]
]*\)\@' . s:ff.Peek('80', '') . '<="""[         \x0c
]*$+hs=e+1 end=+"""+he=s-1 
contains=javaDebugStrTemplEmbExp,javaDebugSpecial,javaDebugTextBlockError'
+    exec 'syn region javaDebugStrTempl contained start=+\%(\.[[:space:]
]*\)\@' . s:ff.PeekFor('javaDebugStrTempl', 80) . '<="+ end=+"+ 
contains=javaDebugStrTemplEmbExp,javaDebugSpecial'
+    exec 'syn region javaDebugStrTempl contained start=+\%(\.[[:space:]
]*\)\@' . s:ff.PeekFor('javaDebugStrTempl', 80) . '<="""[       \x0c
]*$+hs=e+1 end=+"""+he=s-1 
contains=javaDebugStrTemplEmbExp,javaDebugSpecial,javaDebugTextBlockError'
     hi def link javaDebugStrTempl      Macro
   endif
 
@@ -786,7 +804,7 @@ syn region javaBlockOther transparent 
matchgroup=javaBlockOtherStart start="{" e
 
 " Try not to fold top-level-type bodies under assumption that there is
 " but one such body.
-exec 'syn region javaBlock transparent matchgroup=javaBlockStart 
start="\%(^\|^\S[^:]\+\)\@' . s:ff.Peek('120', '') . '<!{" end="}" fold'
+exec 'syn region javaBlock transparent matchgroup=javaBlockStart 
start="\%(^\|^\S[^:]\+\)\@' . s:ff.PeekFor('javaBlock', 120) . '<!{" end="}" 
fold'
 
 " See "D.2.1 Anonymous Classes" at
 " 
https://web.archive.org/web/20010821025330/java.sun.com/docs/books/jls/first_edition/html/1.1Update.html#12959.
diff --git a/runtime/syntax/testdir/dumps/java_enfoldment_00.dump 
b/runtime/syntax/testdir/dumps/java_enfoldment_00.dump
index 3f696ea7f..5fa18d715 100644
--- a/runtime/syntax/testdir/dumps/java_enfoldment_00.dump
+++ b/runtime/syntax/testdir/dumps/java_enfoldment_00.dump
@@ -1,9 +1,9 @@
 | +0#0000e05#a8a8a8255@1>/+0&#ffffff0@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| 
|s|e|t|l|o|c|a|l| |f|o|l|d|e|n|a|b|l|e| |f|o|l|d|c|o|l|u|m|n|=|2| 
|f|o|l|d|m|e|t|h|o|d|=|s|y|n|t|a|x| +0#0000000&@4
 | +0#0000e05#a8a8a8255@1|/+0&#ffffff0@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |l|e|t| 
|g|:|j|a|v|a|_|f|o|l|d|t|e|x|t|_|s|h|o|w|_|f|i|r|s|t|_|o|r|_|s|e|c|o|n|d|_|l|i|n|e|
 |=| |1| +0#0000000&@5
+| +0#0000e05#a8a8a8255@1|/+0&#ffffff0@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |l|e|t| 
|g|:|j|a|v|a|_|l|o@1|k|b|e|h|i|n|d|_|b|y|t|e|_|c|o|u|n|t|s| |=| 
|{|'|j|a|v|a|B|l|o|c|k|'|:| |-|1|}| +0#0000000&@1
 | +0#0000e05#a8a8a8255@1|/+0&#ffffff0@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| 
|h|i|g|h|l|i|g|h|t| |l|i|n|k| |j|a|v|a|B|l|o|c|k|O|t|h|e|r|S|t|a|r|t| 
|S|t|r|u|c|t|u|r|e| +0#0000000&@10
 | +0#0000e05#a8a8a8255@1|/+0&#ffffff0@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| 
|h|i|g|h|l|i|g|h|t| |l|i|n|k| |j|a|v|a|B|l|o|c|k|S|t|a|r|t| |T|o|d|o| 
+0#0000000&@20
 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
-| +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
 |++0#0000e05#a8a8a8255| |+|-@1| |1|9| |l|i|n|e|s|:| 
|@|S|u|p@1|r|e|s@1|W|a|r|n|i|n|g|s|(|{|-@39
 | @1|c+0#00e0003#ffffff0|l|a|s@1| +0#0000000&|F|o|l|d|i|n|g|T|e|s|t|s| 
|{+0#00e0003&| +0#0000000&@52
 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@3|i+0#00e0003&|n|t|e|r|f|a|c|e| 
+0#0000000&|F|o|l|d|e|n|a|b|l|e| @48
diff --git a/runtime/syntax/testdir/dumps/java_enfoldment_02.dump 
b/runtime/syntax/testdir/dumps/java_enfoldment_02.dump
index 1e455ead1..d64bafad5 100644
--- a/runtime/syntax/testdir/dumps/java_enfoldment_02.dump
+++ b/runtime/syntax/testdir/dumps/java_enfoldment_02.dump
@@ -15,6 +15,6 @@
 | +0#0000e05#a8a8a8255@1|/+0&#ffffff0@1| |{| +0#0000000&@68
 | +0#0000e05#a8a8a8255@1|/+0&#ffffff0@1| |}| +0#0000000&@68
 | +0#0000e05#a8a8a8255@1| +0#0000000#ffffff0@72
-|++0#0000e05#a8a8a8255| |+|-@1| @1|2| |l|i|n|e|s|:| |1|2@1|||.@54
-|~+0#4040ff13#ffffff0| @73
-| +0#0000000&@56|9|7|,|2|-|1| @7|B|o|t| 
+| +0#0000e05#a8a8a8255@1|/+0&#ffffff0|*| |1|2@1|||.@65
+| +0&#a8a8a8255@1|.+0&#ffffff0@23|*|/| 
+0#0000000&|i+0#00e0003&|n|t|e|r|f|a|c|e| +0#0000000&|F|o|l|d|e|n|a|b|l|e| 
|{+0#00e0003&| +0#0000000&@23
+@57|9|7|,|2|-|1| @7|9|8|%| 
diff --git a/runtime/syntax/testdir/dumps/java_enfoldment_03.dump 
b/runtime/syntax/testdir/dumps/java_enfoldment_03.dump
new file mode 100644
index 000000000..3391d41b3
--- /dev/null
+++ b/runtime/syntax/testdir/dumps/java_enfoldment_03.dump
@@ -0,0 +1,20 @@
+| +0#0000e05#a8a8a8255@1|/+0&#ffffff0|*| |1|2@1|||.@65
+| +0&#a8a8a8255@1|.+0&#ffffff0@23|*|/| 
+0#0000000&|i+0#00e0003&|n|t|e|r|f|a|c|e| +0#0000000&|F|o|l|d|e|n|a|b|l|e| 
|{+0#00e0003&| +0#0000000&@23
+| +0#0000e05#a8a8a8255@1>}+0#00e0003#ffffff0| +0#0000000&@71
+|~+0#4040ff13&| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+|~| @73
+| +0#0000000&@56|1|2@1|,|1| @8|B|o|t| 
diff --git a/runtime/syntax/testdir/dumps/java_unfoldment_00.dump 
b/runtime/syntax/testdir/dumps/java_unfoldment_00.dump
index 5fe284c13..d6e5cc9cd 100644
--- a/runtime/syntax/testdir/dumps/java_unfoldment_00.dump
+++ b/runtime/syntax/testdir/dumps/java_unfoldment_00.dump
@@ -1,9 +1,9 @@
 >/+0#0000e05#ffffff0@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |s|e|t|l|o|c|a|l| 
 >|n|o|f|o|l|d|e|n|a|b|l|e| +0#0000000&@35
 |/+0#0000e05&@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |l|e|t| 
|g|:|j|a|v|a|_|m|a|r|k|_|b|r|a|c|e|s|_|i|n|_|p|a|r|e|n|s|_|a|s|_|e|r@1|o|r|s| 
|=| |1| +0#0000000&@10
+|/+0#0000e05&@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |l|e|t| 
|g|:|j|a|v|a|_|l|o@1|k|b|e|h|i|n|d|_|b|y|t|e|_|c|o|u|n|t|s| |=| 
|{|'|j|a|v|a|B|l|o|c|k|'|:| |-|1|}| +0#0000000&@3
 |/+0#0000e05&@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |h|i|g|h|l|i|g|h|t| |l|i|n|k| 
|j|a|v|a|B|l|o|c|k|O|t|h|e|r|S|t|a|r|t| |S|t|r|u|c|t|u|r|e| +0#0000000&@12
 |/+0#0000e05&@1| |V|I|M|_|T|E|S|T|_|S|E|T|U|P| |h|i|g|h|l|i|g|h|t| |l|i|n|k| 
|j|a|v|a|B|l|o|c|k|S|t|a|r|t| |T|o|d|o| +0#0000000&@22
 @75
-@75
 @4|@+0#e000e06&|S|u|p@1|r|e|s@1|W|a|r|n|i|n|g|s|(|{+0#0000001#ffff4012| 
+0#0000000#ffffff0@51
 @4|"@2| @67
 | +0#e000002&@3|b|e|s|p|o|k|e| +0#0000000&@63
diff --git a/runtime/syntax/testdir/dumps/java_unfoldment_06.dump 
b/runtime/syntax/testdir/dumps/java_unfoldment_06.dump
index bfec99fa3..3c6bf631a 100644
--- a/runtime/syntax/testdir/dumps/java_unfoldment_06.dump
+++ b/runtime/syntax/testdir/dumps/java_unfoldment_06.dump
@@ -16,5 +16,5 @@
 |/+0#0000e05&@1| |}| +0#0000000&@70
 @75
 |/+0#0000e05&|*| |1|2@1|||.@67
-@20|*|/| +0#0000000&|i+0#00e0003&|n|t|e|r|f|a|c|e| 
+0#0000000&|U|n|f|o|l|d|e|n|a|b|l|e| |{+0#0000001#ffff4012| 
+0#0000000#ffffff0@27
+@20|*|/| +0#0000000&|i+0#00e0003&|n|t|e|r|f|a|c|e| 
+0#0000000&|U|n|f|o|l|d|e|n|a|b|l|e| |{+0#00e0003&| +0#0000000&@27
 @57|1|0|9|,|1| @8|9@1|%| 
diff --git a/runtime/syntax/testdir/dumps/java_unfoldment_07.dump 
b/runtime/syntax/testdir/dumps/java_unfoldment_07.dump
index 69c530d59..5afae5646 100644
--- a/runtime/syntax/testdir/dumps/java_unfoldment_07.dump
+++ b/runtime/syntax/testdir/dumps/java_unfoldment_07.dump
@@ -1,6 +1,6 @@
 |/+0#0000e05#ffffff0|*| |1|2@1|||.@67
-@20|*|/| +0#0000000&|i+0#00e0003&|n|t|e|r|f|a|c|e| 
+0#0000000&|U|n|f|o|l|d|e|n|a|b|l|e| |{+0#0000001#ffff4012| 
+0#0000000#ffffff0@27
->}+0#0000001#ffff4012| +0#0000000#ffffff0@73
+@20|*|/| +0#0000000&|i+0#00e0003&|n|t|e|r|f|a|c|e| 
+0#0000000&|U|n|f|o|l|d|e|n|a|b|l|e| |{+0#00e0003&| +0#0000000&@27
+>}+0#00e0003&| +0#0000000&@73
 |~+0#4040ff13&| @73
 |~| @73
 |~| @73
diff --git a/runtime/syntax/testdir/input/java_enfoldment.java 
b/runtime/syntax/testdir/input/java_enfoldment.java
index 4bfa5d65c..27f43798d 100644
--- a/runtime/syntax/testdir/input/java_enfoldment.java
+++ b/runtime/syntax/testdir/input/java_enfoldment.java
@@ -1,9 +1,9 @@
 // VIM_TEST_SETUP setlocal foldenable foldcolumn=2 foldmethod=syntax
 // VIM_TEST_SETUP let g:java_foldtext_show_first_or_second_line = 1
+// VIM_TEST_SETUP let g:java_lookbehind_byte_counts = {'javaBlock': -1}
 // VIM_TEST_SETUP highlight link javaBlockOtherStart Structure
 // VIM_TEST_SETUP highlight link javaBlockStart Todo
 
-
        @SuppressWarnings({
        """
        bespoke
diff --git a/runtime/syntax/testdir/input/java_unfoldment.java 
b/runtime/syntax/testdir/input/java_unfoldment.java
index 92dd949d7..3d8bb6855 100644
--- a/runtime/syntax/testdir/input/java_unfoldment.java
+++ b/runtime/syntax/testdir/input/java_unfoldment.java
@@ -1,9 +1,9 @@
 // VIM_TEST_SETUP setlocal nofoldenable
 // VIM_TEST_SETUP let g:java_mark_braces_in_parens_as_errors = 1
+// VIM_TEST_SETUP let g:java_lookbehind_byte_counts = {'javaBlock': -1}
 // VIM_TEST_SETUP highlight link javaBlockOtherStart Structure
 // VIM_TEST_SETUP highlight link javaBlockStart Todo
 
-
        @SuppressWarnings({
        """
        bespoke

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_dev+unsubscr...@googlegroups.com.
To view this discussion visit 
https://groups.google.com/d/msgid/vim_dev/E1ukIxO-0027g7-1g%40256bit.org.

Raspunde prin e-mail lui