diff --git a/src/main/java/org/openrewrite/java/migrate/AddMissingMethodImplementation.java b/src/main/java/org/openrewrite/java/migrate/AddMissingMethodImplementation.java index ed8ccfa8ca..009812415d 100644 --- a/src/main/java/org/openrewrite/java/migrate/AddMissingMethodImplementation.java +++ b/src/main/java/org/openrewrite/java/migrate/AddMissingMethodImplementation.java @@ -23,6 +23,7 @@ import org.openrewrite.java.MethodMatcher; import org.openrewrite.java.search.UsesType; import org.openrewrite.java.tree.J; +import org.openrewrite.java.tree.JavaType; import org.openrewrite.java.tree.TypeUtils; import static org.openrewrite.java.tree.J.ClassDeclaration.Kind.Type.Interface; @@ -79,6 +80,14 @@ public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration cs, Execution .anyMatch(methodDeclaration -> methodMatcher.matches(methodDeclaration, classDecl))) { return classDecl; } + // If a superclass already provides the method, don't add it. + JavaType.FullyQualified supertype = classDecl.getType() != null ? classDecl.getType().getSupertype() : null; + while (supertype != null) { + if (supertype.getMethods().stream().anyMatch(methodMatcher::matches)) { + return classDecl; + } + supertype = supertype.getSupertype(); + } return classDecl.withBody(JavaTemplate.builder(methodTemplateString) .build() diff --git a/src/test/java/org/openrewrite/java/migrate/AddMissingMethodImplementationTest.java b/src/test/java/org/openrewrite/java/migrate/AddMissingMethodImplementationTest.java index eed261e744..dcc11f09d9 100644 --- a/src/test/java/org/openrewrite/java/migrate/AddMissingMethodImplementationTest.java +++ b/src/test/java/org/openrewrite/java/migrate/AddMissingMethodImplementationTest.java @@ -133,4 +133,22 @@ protected void m1() { ); } + @Test + void skipWhenSuperclassAlreadyHasMethod() { + //language=java + rewriteRun( + java( + """ + interface I1 {} + class SuperClass implements I1 { + public void m1() { + System.out.println("m1 from super"); + } + } + class SubClass extends SuperClass {} + """ + ) + ); + } + }