From bb78466ee2380404bb3b3a0e1972f2b6e70d6fc8 Mon Sep 17 00:00:00 2001 From: Knut Wannheden Date: Sat, 2 Mar 2024 10:58:41 +0100 Subject: [PATCH] Bring `language-parser-builder` in shape again Since the OpenRewrite 8 changes the `langauge-parser-builder` hasn't been working properly anymore. Mostly due to the `JavaTemplate` API changes. --- .../language-parser-builder/build.gradle.kts | 6 ++ .../model/java/generate/GenerateModel.java | 2 +- .../src/model/java/generate/WriteModel.java | 56 +++++++++++-------- .../java/generate/WritePaddingAccessors.java | 2 +- .../src/model/java/generate/WritePrinter.java | 2 +- .../java/generate/WriteVisitorMethods.java | 4 +- 6 files changed, 45 insertions(+), 27 deletions(-) diff --git a/tools/language-parser-builder/build.gradle.kts b/tools/language-parser-builder/build.gradle.kts index 561ca7b251e..938488e495c 100644 --- a/tools/language-parser-builder/build.gradle.kts +++ b/tools/language-parser-builder/build.gradle.kts @@ -27,6 +27,12 @@ dependencies { modelImplementation("ch.qos.logback:logback-classic:latest.release") } +tasks.register("runGenerator") { + mainClass = "generate.GenerateModel" + classpath = sourceSets.getByName("model").runtimeClasspath + workingDir = file("../..") +} + license { header = file("../../gradle/licenseHeader.txt") } diff --git a/tools/language-parser-builder/src/model/java/generate/GenerateModel.java b/tools/language-parser-builder/src/model/java/generate/GenerateModel.java index 7668724129b..0ead10722b2 100644 --- a/tools/language-parser-builder/src/model/java/generate/GenerateModel.java +++ b/tools/language-parser-builder/src/model/java/generate/GenerateModel.java @@ -97,7 +97,7 @@ public void generate() { .collect(toList())), ctx).getChangeset().getAllResults()); results.addAll(new WritePrinter(modelClasses) .run(new InMemoryLargeSourceSet(jp().parse(List.of( - Paths.get("tools/language-parser-builder/src/main/java/org/openrewrite/toml/tree/TomlContainer.java")), null, ctx) + Paths.get("tools/language-parser-builder/src/main/java/org/openrewrite/toml/internal/TomlPrinter.java")), null, ctx) .collect(toList())), ctx).getChangeset().getAllResults()); writeResults(results); diff --git a/tools/language-parser-builder/src/model/java/generate/WriteModel.java b/tools/language-parser-builder/src/model/java/generate/WriteModel.java index 23932272851..2ff04188d96 100644 --- a/tools/language-parser-builder/src/model/java/generate/WriteModel.java +++ b/tools/language-parser-builder/src/model/java/generate/WriteModel.java @@ -16,6 +16,7 @@ package generate; import lombok.RequiredArgsConstructor; +import org.openrewrite.Cursor; import org.openrewrite.ExecutionContext; import org.openrewrite.Recipe; import org.openrewrite.internal.ListUtils; @@ -66,9 +67,9 @@ public String getDescription() { """ ).javaParser(parser).build(); - final JavaTemplate idField = JavaTemplate.builder("@EqualsAndHashCode.Include UUID id;").javaParser(parser).build(); + final JavaTemplate idField = JavaTemplate.builder("@EqualsAndHashCode.Include UUID id;").imports("java.util.UUID").javaParser(parser).build(); final JavaTemplate prefixField = JavaTemplate.builder("Space prefix;").javaParser(parser).build(); - final JavaTemplate markersField = JavaTemplate.builder("Markers markers;").javaParser(parser).build(); + final JavaTemplate markersField = JavaTemplate.builder("Markers markers;").imports("org.openrewrite.marker.Markers").javaParser(parser).build(); final JavaTemplate paddingField = JavaTemplate.builder("@Nullable @NonFinal transient WeakReference padding;").javaParser(parser).build(); final JavaTemplate implementsTree = JavaTemplate.builder("Toml").javaParser(parser).build(); @@ -170,14 +171,14 @@ public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, Ex boolean padded = c.getBody().getStatements().stream().anyMatch(this::isPadded); if (c.getImplements() == null) { - c = implementsTree.apply(getCursor(), c.getCoordinates().addImplementsClause()); + c = implementsTree.apply(updateCursor(c), c.getCoordinates().addImplementsClause()); } - c = markersField.apply(getCursor(), c.getBody().getCoordinates().firstStatement()); - c = prefixField.apply(getCursor(), c.getBody().getCoordinates().firstStatement()); - c = idField.apply(getCursor(), c.getBody().getCoordinates().firstStatement()); - c = acceptMethod.apply(getCursor(), c.getBody().getCoordinates().lastStatement(), classDecl.getSimpleName()); + c = markersField.apply(updateCursor(c), c.getBody().getCoordinates().firstStatement()); + c = prefixField.apply(updateCursor(c), c.getBody().getCoordinates().firstStatement()); + c = idField.apply(updateCursor(c), c.getBody().getCoordinates().firstStatement()); + c = acceptMethod.apply(updateCursor(c), c.getBody().getCoordinates().lastStatement(), classDecl.getSimpleName()); for (Statement statement : c.getBody().getStatements()) { if (statement instanceof J.VariableDeclarations varDec) { @@ -196,24 +197,24 @@ public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, Ex case "TomlContainer" -> writeContainerGetterWithers(c, varDec, elementType); case "TomlLeftPadded" -> writePaddedGetterWithers(c, varDec, elementType, "Left"); case "TomlRightPadded" -> writePaddedGetterWithers(c, varDec, elementType, "Right"); - default -> withGetterAnnotations.apply(getCursor(), varDec.getCoordinates() - .addAnnotation(Comparator.comparing(J.Annotation::getSimpleName))); + default -> writeModelGetterWithers(c, varDec); }; } else if (padded) { - c = withGetterAnnotations.apply(getCursor(), varDec.getCoordinates() - .addAnnotation(Comparator.comparing(J.Annotation::getSimpleName))); + c = writeModelGetterWithers(c, varDec); } + } else if (padded) { + c = writeModelGetterWithers(c, varDec); } } } if (padded) { - c = paddedModel.apply(getCursor(), c.getCoordinates().replaceAnnotations()); - c = paddingField.apply(getCursor(), c.getBody().getCoordinates().firstStatement()); - c = getPadding.apply(getCursor(), c.getBody().getCoordinates().lastStatement()); - c = paddingClass.apply(getCursor(), c.getBody().getCoordinates().lastStatement(), c.getSimpleName()); + c = paddedModel.apply(updateCursor(c), c.getCoordinates().replaceAnnotations()); + c = paddingField.apply(updateCursor(c), c.getBody().getCoordinates().firstStatement()); + c = getPadding.apply(updateCursor(c), c.getBody().getCoordinates().lastStatement()); + c = paddingClass.apply(updateCursor(c), c.getBody().getCoordinates().lastStatement(), c.getSimpleName()); } else { - c = valueModel.apply(getCursor(), c.getCoordinates().replaceAnnotations()); + c = valueModel.apply(updateCursor(c), c.getCoordinates().replaceAnnotations()); } List statements = c.getBody().getStatements(); @@ -231,20 +232,30 @@ public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, Ex return c; } + private J.ClassDeclaration writeModelGetterWithers(J.ClassDeclaration c, J.VariableDeclarations varDec) { + return c.withBody(c.getBody().withStatements(ListUtils.map(c.getBody().getStatements(), statement -> { + if (statement == varDec) { + Cursor cursor = new Cursor(new Cursor(updateCursor(c), c.getBody()), varDec); + statement = withGetterAnnotations.apply(cursor, varDec.getCoordinates().addAnnotation(Comparator.comparing(J.Annotation::getSimpleName))); + } + return statement; + }))); + } + private J.ClassDeclaration writeContainerGetterWithers(J.ClassDeclaration c, J.VariableDeclarations varDec, JavaType.FullyQualified elementType) { String name = varDec.getVariables().get(0).getSimpleName(); String capitalizedName = name.substring(0, 1).toUpperCase() + name.substring(1); String elementTypeName = elementType.getClassName(); String modelTypeName = c.getSimpleName(); - c = unwrappedContainerGetterWither.apply(getCursor(), c.getBody().getCoordinates().lastStatement(), + J.Block body = unwrappedContainerGetterWither.apply(new Cursor(updateCursor(c), c.getBody()), c.getBody().getCoordinates().lastStatement(), elementTypeName, capitalizedName, name, modelTypeName, capitalizedName, elementTypeName, name, capitalizedName, name, name, name); - return c; + return c.withBody(body); } private J.ClassDeclaration writePaddedGetterWithers(J.ClassDeclaration c, J.VariableDeclarations varDec, JavaType.FullyQualified elementType, @@ -255,26 +266,27 @@ private J.ClassDeclaration writePaddedGetterWithers(J.ClassDeclaration c, J.Vari String elementTypeName = elementType.getClassName(); String modelTypeName = c.getSimpleName(); + J.Block body = c.getBody(); if (nullable) { StringJoiner newModelArguments = new StringJoiner(", "); - for (Statement statement : c.getBody().getStatements()) { + for (Statement statement : body.getStatements()) { if (statement instanceof J.VariableDeclarations) { newModelArguments.add(statement == varDec ? "null" : ((J.VariableDeclarations) statement).getVariables() .get(0).getSimpleName()); } } - c = nullableUnwrappedPaddedGetterWither.apply(getCursor(), c.getBody().getCoordinates().lastStatement(), + body = nullableUnwrappedPaddedGetterWither.apply(new Cursor(getCursor(), body), body.getCoordinates().lastStatement(), elementTypeName, capitalizedName, name, name, modelTypeName, capitalizedName, elementTypeName, name, name, name, modelTypeName, newModelArguments.toString(), capitalizedName, leftOrRight, name, name); } else { - c = unwrappedPaddedGetterWither.apply(getCursor(), c.getBody().getCoordinates().lastStatement(), + body = unwrappedPaddedGetterWither.apply(new Cursor(getCursor(), body), body.getCoordinates().lastStatement(), elementTypeName, capitalizedName, name, modelTypeName, capitalizedName, elementTypeName, name, capitalizedName, leftOrRight, name, name); } - return c; + return c.withBody(body); } boolean isPadded(Statement statement) { diff --git a/tools/language-parser-builder/src/model/java/generate/WritePaddingAccessors.java b/tools/language-parser-builder/src/model/java/generate/WritePaddingAccessors.java index 0c930573442..3eb3ff742de 100644 --- a/tools/language-parser-builder/src/model/java/generate/WritePaddingAccessors.java +++ b/tools/language-parser-builder/src/model/java/generate/WritePaddingAccessors.java @@ -117,7 +117,7 @@ private J.ClassDeclaration writePaddedGetterWithers(J.ClassDeclaration c, J.Vari } } - c = paddedGetterWither.apply(getCursor(), c.getBody().getCoordinates().lastStatement(), + c = paddedGetterWither.apply(updateCursor(c), c.getBody().getCoordinates().lastStatement(), nullable ? "@Nullable " : "", leftOrRight, elementTypeName, capitalizedName, name, modelTypeName, capitalizedName, nullable ? "@Nullable " : "", leftOrRight, diff --git a/tools/language-parser-builder/src/model/java/generate/WritePrinter.java b/tools/language-parser-builder/src/model/java/generate/WritePrinter.java index 4c8ba391b70..05319cf765b 100644 --- a/tools/language-parser-builder/src/model/java/generate/WritePrinter.java +++ b/tools/language-parser-builder/src/model/java/generate/WritePrinter.java @@ -117,7 +117,7 @@ public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, Ex .build(); try { - c = visitMethod.apply(getCursor(), c.getBody().getCoordinates().lastStatement(), + c = visitMethod.apply(updateCursor(c), c.getBody().getCoordinates().lastStatement(), modelTypeName, modelTypeName, paramName, paramName, paramName, diff --git a/tools/language-parser-builder/src/model/java/generate/WriteVisitorMethods.java b/tools/language-parser-builder/src/model/java/generate/WriteVisitorMethods.java index b33e14a6300..bff8b9d0279 100644 --- a/tools/language-parser-builder/src/model/java/generate/WriteVisitorMethods.java +++ b/tools/language-parser-builder/src/model/java/generate/WriteVisitorMethods.java @@ -138,7 +138,7 @@ public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, Ex } } } - c = visitMethod.apply(getCursor(), c.getBody().getCoordinates().lastStatement(), + c = visitMethod.apply(updateCursor(c), c.getBody().getCoordinates().lastStatement(), modelTypeName, modelTypeName, paramName, modelTypeName, varName, paramName, varName, varName, varName, @@ -168,7 +168,7 @@ public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, Ex for (J.ClassDeclaration modelClass : missingVisitorMethods(c)) { String modelTypeName = modelClass.getSimpleName(); String paramName = modelTypeName.substring(0, 1).toLowerCase() + modelTypeName.substring(1); - c = isoVisitMethod.apply(getCursor(), c.getBody().getCoordinates().lastStatement(), + c = isoVisitMethod.apply(updateCursor(c), c.getBody().getCoordinates().lastStatement(), modelTypeName, modelTypeName, modelTypeName, paramName, modelTypeName, modelTypeName, paramName); }