[ 
https://issues.apache.org/jira/browse/GROOVY-12697?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18138436#comment-18138436
 ] 

ASF GitHub Bot commented on GROOVY-12697:
-----------------------------------------

codeconsole opened a new pull request, #3218:
URL: https://github.com/apache/groovy/pull/3218

   RegexChecker's afterVisitMethod visitor dereferenced the result of 
findConstExp(..., Integer) without a null check in two places: the 
Matcher.group(...) check and the matcher[...][...] subscript check. Any 
argument that is not an Integer constant, which is every group(String) call on 
a named group as well as group(int) or a subscript with a variable index, made 
the extension throw a NullPointerException that the compiler surfaced as 
"General error during canonicalization: Cannot get property 'value' on null 
object". Code that is correct at runtime could not be compiled with the 
extension enabled.
   
   This change makes both checks skip arguments that are not constants, so a 
variable index or name is left to the runtime as before the checker was 
involved, and adds the obvious check for a constant group name: when the regex 
is known, the checker records its named-capturing group names next to the group 
count it already records, and group(String) with a name the regex does not 
define is reported as a static type error ("Invalid group name 'third' for 
regex with named groups first, second", or "... for regex with no named 
groups"), mirroring the existing "Invalid group count" diagnostic. The names 
are propagated along the same paths as the group count (declaration, 
Pattern.matcher() on a tracked pattern), through one small helper that replaces 
four copies of the same copy-if-present code.
   
   Group names are collected by scanning the (already compiled) regex text for 
named-group openers, tolerating whitespace inside the angle brackets as the JDK 
does in COMMENTS mode. The scan can only over-approximate (openers in escaped 
or quoted contexts are picked up too), so it can never report a name the regex 
really defines; Pattern.namedGroups() was not used because it needs JDK 20 and 
the build targets 17.
   
   Testing: three regression tests in RegexCheckerTest cover the =~, 
Pattern-variable and Pattern.compile(...).matcher(...) forms with existing, 
missing and non-constant group names and indices, plus the original reproducer. 
They fail on master before the change (two with the compiler failure, one 
because no diagnostic is produced) and pass with it; the rest of the class and 
:groovy-typecheckers:test, lintGate and rat pass. The ten standalone scripts 
used to reproduce the problem were also rerun against a distribution built from 
this branch: the eight that failed now either compile and print the expected 
value or produce the new diagnostic.
   
   Suggested backport: GROOVY_6_0_X (6.0.0 is affected).
   




> RegexChecker fails inside the compiler on Matcher.group(String) and 
> non-constant group lookups
> ----------------------------------------------------------------------------------------------
>
>                 Key: GROOVY-12697
>                 URL: https://issues.apache.org/jira/browse/GROOVY-12697
>             Project: Groovy
>          Issue Type: Bug
>    Affects Versions: 6.0.0
>            Reporter: Scott Murphy Heiberg
>            Priority: Major
>




--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to