Skip to content

BlockStatementTemplateGenerator is not correctly handling ParameterizedTypes #20

@pway99

Description

@pway99

Problem

Most likely associated with templating J.NewClass nodes

Example diff

   private boolean done = false; // true iff at EOF
private Writable key, spareKey, value;

-  private Converter<K> keyConverter = o -> (K) o;
+  private Converter<K> keyConverter = /*~~(Recipe failed with an exception.
+java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0
+  java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
+  java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
+  java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:266)
+  java.base/java.util.Objects.checkIndex(Objects.java:359)
+  java.base/java.util.ArrayList.get(ArrayList.java:427)
+  org.openrewrite.java.internal.template.JavaTemplateParser.compileTemplate(JavaTemplateParser.java:247)
+  org.openrewrite.java.internal.template.JavaTemplateParser.parseBlockStatements(JavaTemplateParser.java:166)
+  org.openrewrite.java.JavaTemplate$2.maybeReplaceStatement(JavaTemplate.java:482)
+  ...)~~>*/o -> (K) o;

private Converter<V> valConverter = o -> (V) o;

https://github.com/apache/avro/blob/3c4f5adccffd894c106e81132f39d96cab4c20b3/lang/java/mapred/src/main/java/org/apache/avro/mapred/SequenceFileReader.java#L59

Recipes in example diff:

  • org.openrewrite.java.cleanup.ReplaceLambdaWithMethodReference

also check:

     //  predictable node names
final AtomicInteger suffix = new AtomicInteger();
binder.bind(new TypeLiteral<Supplier<String>>() {
-      }).toInstance(new Supplier<String>() {
+      }).toInstance(/*~~(Recipe failed with an exception.
+java.lang.IllegalArgumentException: Expected a template that would generate exactly one statement to replace one statement, but generated 4. Template:
+() -> {return null;}
+  org.openrewrite.java.JavaTemplate$2.maybeReplaceStatement(JavaTemplate.java:486)
+  org.openrewrite.java.JavaTemplate$2.visitStatement(JavaTemplate.java:475)
+  org.openrewrite.java.JavaTemplate$2.visitStatement(JavaTemplate.java:102)
+  org.openrewrite.java.JavaVisitor.visitNewClass(JavaVisitor.java:921)
+  org.openrewrite.java.tree.J$NewClass.acceptJava(J.java:3950)
+  org.openrewrite.java.tree.J.accept(J.java:60)
+  org.openrewrite.TreeVisitor.visit(TreeVisitor.java:248)
+  org.openrewrite.TreeVisitor.visit(TreeVisitor.java:144)
+  ...)~~>*/new Supplier<String>() {
  @Override
  public String get() {
     return suffix.getAndIncrement() + "";

https://github.com/apache/jclouds/blob/d913a5603727d10d6b85afa68c5ed6f6027f3e94/providers/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/GoogleComputeEngineTestModule.java#L88-L93

Recipes in example diff:

  • org.openrewrite.java.cleanup.UseLambdaForFunctionalInterface

References:

  • View original result
  • Recipe ID: org.openrewrite.java.cleanup.ReplaceLambdaWithMethodReference
  • Recipe Name: undefined
  • Repository: apache/avro/master
  • Created at Thu Oct 13 2022 10:46:06 GMT-0700 (Pacific Daylight Time)

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type
    No fields configured for issues without a type.

    Projects

    Status

    Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions