From 0a5aa2b60c4831695697974c755623871682e38f Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Thu, 2 Aug 2018 08:21:06 +0300 Subject: [PATCH] "Convert lambda to reference": fix case with extension 'this' #KT-21999 Fixed --- .../ConvertLambdaToReferenceIntention.kt | 3 ++- ...onOuterScope.kt => extensionOuterScope.kt} | 0 ....kt.after => extensionOuterScope.kt.after} | 0 .../memberInScopeFunction.kt | 14 +++++++++++++ .../memberInScopeFunction.kt.after | 14 +++++++++++++ .../memberInScopeFunction2.kt | 14 +++++++++++++ .../memberInScopeFunction2.kt.after | 14 +++++++++++++ .../intentions/IntentionTestGenerated.java | 20 ++++++++++++++----- 8 files changed, 73 insertions(+), 6 deletions(-) rename idea/testData/intentions/convertLambdaToReference/{extentionOuterScope.kt => extensionOuterScope.kt} (100%) rename idea/testData/intentions/convertLambdaToReference/{extentionOuterScope.kt.after => extensionOuterScope.kt.after} (100%) create mode 100644 idea/testData/intentions/convertLambdaToReference/memberInScopeFunction.kt create mode 100644 idea/testData/intentions/convertLambdaToReference/memberInScopeFunction.kt.after create mode 100644 idea/testData/intentions/convertLambdaToReference/memberInScopeFunction2.kt create mode 100644 idea/testData/intentions/convertLambdaToReference/memberInScopeFunction2.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt index fc43fc781de..3b657372380 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertLambdaToReferenceIntention.kt @@ -37,6 +37,7 @@ import org.jetbrains.kotlin.resolve.BindingContext.REFERENCE_TARGET import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.calls.components.hasDefaultValue import org.jetbrains.kotlin.resolve.descriptorUtil.isCompanionObject +import org.jetbrains.kotlin.resolve.scopes.receivers.ExtensionReceiver import org.jetbrains.kotlin.resolve.scopes.utils.getImplicitReceiversHierarchy import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor import org.jetbrains.kotlin.types.isDynamic @@ -234,7 +235,7 @@ open class ConvertLambdaToReferenceIntention(text: String) : val descriptor by lazy { receiver?.type?.constructor?.declarationDescriptor } val receiverText = when { receiver == null || descriptor?.isCompanionObject() == true -> "" - lambdaExpression.getResolutionScope().getImplicitReceiversHierarchy().size == 1 -> "this" + receiver is ExtensionReceiver || lambdaExpression.getResolutionScope().getImplicitReceiversHierarchy().size == 1 -> "this" else -> descriptor?.name?.let { "this@$it" } ?: return null } "$receiverText::${singleStatement.getCallReferencedName()}" diff --git a/idea/testData/intentions/convertLambdaToReference/extentionOuterScope.kt b/idea/testData/intentions/convertLambdaToReference/extensionOuterScope.kt similarity index 100% rename from idea/testData/intentions/convertLambdaToReference/extentionOuterScope.kt rename to idea/testData/intentions/convertLambdaToReference/extensionOuterScope.kt diff --git a/idea/testData/intentions/convertLambdaToReference/extentionOuterScope.kt.after b/idea/testData/intentions/convertLambdaToReference/extensionOuterScope.kt.after similarity index 100% rename from idea/testData/intentions/convertLambdaToReference/extentionOuterScope.kt.after rename to idea/testData/intentions/convertLambdaToReference/extensionOuterScope.kt.after diff --git a/idea/testData/intentions/convertLambdaToReference/memberInScopeFunction.kt b/idea/testData/intentions/convertLambdaToReference/memberInScopeFunction.kt new file mode 100644 index 00000000000..cca4a10a531 --- /dev/null +++ b/idea/testData/intentions/convertLambdaToReference/memberInScopeFunction.kt @@ -0,0 +1,14 @@ +// WITH_RUNTIME +fun foo(f: () -> Unit) {} + +class Bar { + fun bar() {} +} + +class Test { + fun test() { + with(Bar()) { + foo { bar() } + } + } +} diff --git a/idea/testData/intentions/convertLambdaToReference/memberInScopeFunction.kt.after b/idea/testData/intentions/convertLambdaToReference/memberInScopeFunction.kt.after new file mode 100644 index 00000000000..43672dbce50 --- /dev/null +++ b/idea/testData/intentions/convertLambdaToReference/memberInScopeFunction.kt.after @@ -0,0 +1,14 @@ +// WITH_RUNTIME +fun foo(f: () -> Unit) {} + +class Bar { + fun bar() {} +} + +class Test { + fun test() { + with(Bar()) { + foo(this::bar) + } + } +} diff --git a/idea/testData/intentions/convertLambdaToReference/memberInScopeFunction2.kt b/idea/testData/intentions/convertLambdaToReference/memberInScopeFunction2.kt new file mode 100644 index 00000000000..415998d99c9 --- /dev/null +++ b/idea/testData/intentions/convertLambdaToReference/memberInScopeFunction2.kt @@ -0,0 +1,14 @@ +// WITH_RUNTIME +fun foo(f: () -> Unit) {} + +class Bar { + fun bar() {} +} + +class Test { + fun test() { + Bar().run { + foo { bar() } + } + } +} diff --git a/idea/testData/intentions/convertLambdaToReference/memberInScopeFunction2.kt.after b/idea/testData/intentions/convertLambdaToReference/memberInScopeFunction2.kt.after new file mode 100644 index 00000000000..e5d804b2853 --- /dev/null +++ b/idea/testData/intentions/convertLambdaToReference/memberInScopeFunction2.kt.after @@ -0,0 +1,14 @@ +// WITH_RUNTIME +fun foo(f: () -> Unit) {} + +class Bar { + fun bar() {} +} + +class Test { + fun test() { + Bar().run { + foo(this::bar) + } + } +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index 9d5dadfa725..a2917f8c508 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -5210,16 +5210,16 @@ public class IntentionTestGenerated extends AbstractIntentionTest { runTest("idea/testData/intentions/convertLambdaToReference/extension.kt"); } + @TestMetadata("extensionOuterScope.kt") + public void testExtensionOuterScope() throws Exception { + runTest("idea/testData/intentions/convertLambdaToReference/extensionOuterScope.kt"); + } + @TestMetadata("extensionProperty.kt") public void testExtensionProperty() throws Exception { runTest("idea/testData/intentions/convertLambdaToReference/extensionProperty.kt"); } - @TestMetadata("extentionOuterScope.kt") - public void testExtentionOuterScope() throws Exception { - runTest("idea/testData/intentions/convertLambdaToReference/extentionOuterScope.kt"); - } - @TestMetadata("fqNameForReceiver.kt") public void testFqNameForReceiver() throws Exception { runTest("idea/testData/intentions/convertLambdaToReference/fqNameForReceiver.kt"); @@ -5285,6 +5285,16 @@ public class IntentionTestGenerated extends AbstractIntentionTest { runTest("idea/testData/intentions/convertLambdaToReference/memberInLambdaArgument.kt"); } + @TestMetadata("memberInScopeFunction.kt") + public void testMemberInScopeFunction() throws Exception { + runTest("idea/testData/intentions/convertLambdaToReference/memberInScopeFunction.kt"); + } + + @TestMetadata("memberInScopeFunction2.kt") + public void testMemberInScopeFunction2() throws Exception { + runTest("idea/testData/intentions/convertLambdaToReference/memberInScopeFunction2.kt"); + } + @TestMetadata("memberOuterScope.kt") public void testMemberOuterScope() throws Exception { runTest("idea/testData/intentions/convertLambdaToReference/memberOuterScope.kt");