Skip to content

GroovyParser fails on Gradle constructor-call list with typed constructor params and class fields (StringIndexOutOfBoundsException) #7463

@iw2rmb

Description

@iw2rmb

What version of OpenRewrite are you using?

I am using

  • OpenRewrite libraries via a custom Java runner (not rewrite Gradle/Maven plugin)
  • Failing run: org.openrewrite.recipe:rewrite-spring:6.28.2
    • this resolves org.openrewrite:rewrite-bom:8.77.2
    • includes rewrite-gradle:8.77.2 and rewrite-groovy:8.77.2
  • Retest run: org.openrewrite.recipe:rewrite-spring:6.30.1
    • this resolves org.openrewrite:rewrite-bom:8.80.1
    • includes rewrite-gradle:8.80.1 and rewrite-groovy:8.80.1
  • Project wrapper is Gradle 8.7 (gradle-wrapper.properties), but Gradle tasks are not invoked in this repro; only parsing of build.gradle is performed by OpenRewrite libraries.
  • Java: 17

I also retested with:

  • org.openrewrite.recipe:rewrite-spring:6.30.1 (same runner + same recipe class)

The failure still reproduces (different out-of-range index value).

How are you running OpenRewrite?

I am running OpenRewrite through a custom CLI container around OpenRewrite parser/recipe execution (not via rewrite Gradle plugin task directly).

What is the smallest, simplest way to reproduce the problem?

A reduced build.gradle-style Groovy snippet that reproduces the parser crash:

class SwaggerInfo {
final String swaggerPath, packagePath
def configOptions = [:]
def globalProperties = [:]

SwaggerInfo(String swaggerPath, String packagePath, Map configOptions, Map globalProperties) {
    this.swaggerPath = swaggerPath
    this.packagePath = packagePath
    this.configOptions = configOptions
    this.globalProperties = globalProperties
}

}

def swaggerList = [
new SwaggerInfo("a/a.json", "a", null, [apis: "A", models: "M1,M2"]),
new SwaggerInfo("b/b.json", "b", null, null),
]

Observed minimization behavior:

  • Keeping typed constructor params + class fields => parser crashes.
  • Making constructor params untyped => parser succeeds.
  • Keeping typed constructor params but removing class fields => parser succeeds.

What did you expect to see?

Successful parsing of the Gradle Groovy script (no GroovyParsingException).

What did you see instead?

GroovyParsingException with StringIndexOutOfBoundsException in GroovyParserVisitor during constructor-call/argument-list handling.

Production failure (rewrite-spring:6.28.2) reported:

  • String index out of range: 5003 (source file length was 5003 bytes)

Retest (rewrite-spring:6.30.1) reported:

What is the full stack trace of any errors you encountered?

Production (rewrite-spring:6.28.2):

java.lang.RuntimeException: org.openrewrite.groovy.GroovyParsingException: Failed to parse build-client-swagger.gradle, cursor position likely inaccurate.
at io.iw2rmb.ploy.orwcli.RewriteCliMain.lambda$run$0(RewriteCliMain.java:173)
at org.openrewrite.groovy.GroovyParser.lambda$parseInputs$3(GroovyParser.java:160)
...
Caused by: org.openrewrite.groovy.GroovyParsingException: Failed to parse build-client-swagger.gradle, cursor position likely inaccurate.
at org.openrewrite.groovy.GroovyParserVisitor.visit(GroovyParserVisitor.java:217)
at org.openrewrite.groovy.GroovyParser.lambda$parseInputs$3(GroovyParser.java:149)
... 30 more
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: 5003
at java.base/java.lang.StringLatin1.charAt(StringLatin1.java:48)
at java.base/java.lang.String.charAt(String.java:1517)
at org.openrewrite.groovy.GroovyParserVisitor$RewriteGroovyVisitor.visitArgumentlistExpression(GroovyParserVisitor.java:946)
at org.codehaus.groovy.ast.expr.ArgumentListExpression.visit(ArgumentListExpression.java:73)
at org.openrewrite.groovy.GroovyParserVisitor$RewriteGroovyVisitor.doVisit(GroovyParserVisitor.java:822)
at org.openrewrite.groovy.GroovyParserVisitor$RewriteGroovyVisitor.lambda$visitConstructorCallExpression$9(GroovyParserVisitor.java:1691)
at org.openrewrite.groovy.GroovyParserVisitor$RewriteGroovyVisitor.insideParentheses(GroovyParserVisitor.java:863)
at org.openrewrite.groovy.GroovyParserVisitor$RewriteGroovyVisitor.visitConstructorCallExpression(GroovyParserVisitor.java:1667)
at org.codehaus.groovy.ast.expr.ConstructorCallExpression.visit(ConstructorCallExpression.java:44)
...

Retest (rewrite-spring:6.30.1):

java.lang.RuntimeException: org.openrewrite.groovy.GroovyParsingException: Failed to parse build-client-swagger.gradle, cursor position likely inaccurate.
at io.iw2rmb.ploy.orwcli.RewriteCliMain.lambda$run$0(RewriteCliMain.java:173)
at org.openrewrite.groovy.GroovyParser.lambda$parseInputs$3(GroovyParser.java:160)
...
Caused by: org.openrewrite.groovy.GroovyParsingException: Failed to parse build-client-swagger.gradle, cursor position likely inaccurate.
at org.openrewrite.groovy.GroovyParserVisitor.visit(GroovyParserVisitor.java:217)
at org.openrewrite.groovy.GroovyParser.lambda$parseInputs$3(GroovyParser.java:149)
... 29 more
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: 4438
at java.base/java.lang.StringLatin1.charAt(StringLatin1.java:48)
at java.base/java.lang.String.charAt(String.java:1517)
at org.openrewrite.groovy.GroovyParserVisitor$RewriteGroovyVisitor.visitRightPadded(GroovyParserVisitor.java:835)
at org.openrewrite.groovy.GroovyParserVisitor$RewriteGroovyVisitor.lambda$visitMapExpression$14(GroovyParserVisitor.java:2026)
at org.openrewrite.groovy.GroovyParserVisitor$RewriteGroovyVisitor.insideParentheses(GroovyParserVisitor.java:863)
at org.openrewrite.groovy.GroovyParserVisitor$RewriteGroovyVisitor.visitMapExpression(GroovyParserVisitor.java:2017)
at org.openrewrite.groovy.GroovyParserVisitor$RewriteGroovyVisitor.visitArgumentlistExpression(GroovyParserVisitor.java:995)
at org.openrewrite.groovy.GroovyParserVisitor$RewriteGroovyVisitor.lambda$visitConstructorCallExpression$9(GroovyParserVisitor.java:1691)
at org.openrewrite.groovy.GroovyParserVisitor$RewriteGroovyVisitor.visitConstructorCallExpression(GroovyParserVisitor.java:1667)
...

Are you interested in contributing a fix to OpenRewrite?

I can help validate snapshots / candidate fixes quickly and provide additional minimized reproducer variants, but I am not planning to
implement the parser fix myself right now.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    Status

    No status

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions