diff --git a/src/main/java/org/openrewrite/staticanalysis/ReplaceLambdaWithMethodReference.java b/src/main/java/org/openrewrite/staticanalysis/ReplaceLambdaWithMethodReference.java index b00fddfdf..f07b3e67a 100644 --- a/src/main/java/org/openrewrite/staticanalysis/ReplaceLambdaWithMethodReference.java +++ b/src/main/java/org/openrewrite/staticanalysis/ReplaceLambdaWithMethodReference.java @@ -211,7 +211,14 @@ public J visitLambda(J.Lambda lambda, ExecutionContext ctx) { if (isLambdaInGenericAndOverloadedContext()) { return l; } - J.MemberReference updated = newStaticMethodReference(methodType, true, lambda.getType()).withPrefix(lambda.getPrefix()); + JavaType.FullyQualified containingType = methodType.getDeclaringType(); + if (!methodType.hasFlags(Flag.Static) && select != null) { + JavaType.FullyQualified selectType = TypeUtils.asFullyQualified(select.getType()); + if (selectType != null) { + containingType = selectType; + } + } + J.MemberReference updated = newInstanceMethodReference(className(containingType, true), methodType, lambda.getType()).withPrefix(lambda.getPrefix()); doAfterVisit(service(ImportService.class).shortenFullyQualifiedTypeReferencesIn(updated)); return updated; } diff --git a/src/test/java/org/openrewrite/staticanalysis/ReplaceLambdaWithMethodReferenceTest.java b/src/test/java/org/openrewrite/staticanalysis/ReplaceLambdaWithMethodReferenceTest.java index a0ebbd1fc..d5c04d5a7 100644 --- a/src/test/java/org/openrewrite/staticanalysis/ReplaceLambdaWithMethodReferenceTest.java +++ b/src/test/java/org/openrewrite/staticanalysis/ReplaceLambdaWithMethodReferenceTest.java @@ -1878,6 +1878,62 @@ record R(String s) {} ); } + @Issue("https://github.com/openrewrite/rewrite-static-analysis/issues/906") + @Test + void useReceiverTypeWhenDeclaringTypeIsPackagePrivate() { + rewriteRun( + //language=java + java( + """ + package com.helloworld.internal; + + import java.util.Optional; + + abstract class Base { + public Optional getValue() { + return Optional.empty(); + } + } + """ + ), + //language=java + java( + """ + package com.helloworld.internal; + + public class Child extends Base {} + """ + ), + //language=java + java( + """ + package com.helloworld; + + import com.helloworld.internal.Child; + import java.util.Optional; + + public class Main { + String get(final Optional opt) { + return opt.flatMap(s -> s.getValue()).orElse(""); + } + } + """, + """ + package com.helloworld; + + import com.helloworld.internal.Child; + import java.util.Optional; + + public class Main { + String get(final Optional opt) { + return opt.flatMap(Child::getValue).orElse(""); + } + } + """ + ) + ); + } + @Issue("https://github.com/openrewrite/rewrite-static-analysis/issues/20") @Test void castToTypeParameterInLambda() {