diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt index 67c1aebb8c9..be4bd6626eb 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.renderer.render import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.BindingContext.FUNCTION import org.jetbrains.kotlin.resolve.BindingContext.REFERENCE_TARGET +import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.calls.callUtil.getParameterForArgument import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.calls.components.hasDefaultValue @@ -248,6 +249,7 @@ open class ConvertLambdaToReferenceIntention(textGetter: () -> String) : SelfTar lambdaParameterType.getReceiverTypeFromFunctionType()?.fqName?.asString() receiver == null || descriptor?.isCompanionObject() == true -> "" receiver is ExtensionReceiver || + descriptor?.let { DescriptorUtils.isAnonymousObject(it) } == true || lambdaExpression.getResolutionScope().getImplicitReceiversHierarchy().size == 1 -> "this" else -> descriptor?.name?.let { "this@$it" } } ?: return null diff --git a/idea/testData/intentions/convertLambdaToReference/inAnonymousObject.kt b/idea/testData/intentions/convertLambdaToReference/inAnonymousObject.kt new file mode 100644 index 00000000000..f6064789c8d --- /dev/null +++ b/idea/testData/intentions/convertLambdaToReference/inAnonymousObject.kt @@ -0,0 +1,15 @@ +interface I { + fun foo(i: Int) +} + +fun create(): I { + return object : I { + override fun foo(i: Int) { + bar { baz(it) } + } + + fun bar(f: (Int) -> Unit) {} + + fun baz(i: Int) {} + } +} diff --git a/idea/testData/intentions/convertLambdaToReference/inAnonymousObject.kt.after b/idea/testData/intentions/convertLambdaToReference/inAnonymousObject.kt.after new file mode 100644 index 00000000000..99ecbcadf7b --- /dev/null +++ b/idea/testData/intentions/convertLambdaToReference/inAnonymousObject.kt.after @@ -0,0 +1,15 @@ +interface I { + fun foo(i: Int) +} + +fun create(): I { + return object : I { + override fun foo(i: Int) { + bar(this::baz) + } + + fun bar(f: (Int) -> Unit) {} + + fun baz(i: Int) {} + } +} diff --git a/idea/testData/intentions/convertLambdaToReference/inAnonymousObject2.kt b/idea/testData/intentions/convertLambdaToReference/inAnonymousObject2.kt new file mode 100644 index 00000000000..0bf5f6aa6eb --- /dev/null +++ b/idea/testData/intentions/convertLambdaToReference/inAnonymousObject2.kt @@ -0,0 +1,17 @@ +interface I { + fun foo(i: Int) +} + +class C { + fun create(): I { + return object : I { + override fun foo(i: Int) { + bar { baz(it) } + } + + fun bar(f: (Int) -> Unit) {} + + fun baz(i: Int) {} + } + } +} \ No newline at end of file diff --git a/idea/testData/intentions/convertLambdaToReference/inAnonymousObject2.kt.after b/idea/testData/intentions/convertLambdaToReference/inAnonymousObject2.kt.after new file mode 100644 index 00000000000..1360817e766 --- /dev/null +++ b/idea/testData/intentions/convertLambdaToReference/inAnonymousObject2.kt.after @@ -0,0 +1,17 @@ +interface I { + fun foo(i: Int) +} + +class C { + fun create(): I { + return object : I { + override fun foo(i: Int) { + bar(this::baz) + } + + fun bar(f: (Int) -> Unit) {} + + fun baz(i: Int) {} + } + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index 83a20c21150..e217ba355c0 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -5060,6 +5060,16 @@ public class IntentionTestGenerated extends AbstractIntentionTest { runTest("idea/testData/intentions/convertLambdaToReference/goodNamedOrder.kt"); } + @TestMetadata("inAnonymousObject.kt") + public void testInAnonymousObject() throws Exception { + runTest("idea/testData/intentions/convertLambdaToReference/inAnonymousObject.kt"); + } + + @TestMetadata("inAnonymousObject2.kt") + public void testInAnonymousObject2() throws Exception { + runTest("idea/testData/intentions/convertLambdaToReference/inAnonymousObject2.kt"); + } + @TestMetadata("inner.kt") public void testInner() throws Exception { runTest("idea/testData/intentions/convertLambdaToReference/inner.kt");