From 6abf13be41c5bba15c2a67b4a96caef558e875dc Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Thu, 26 Nov 2015 21:21:48 +0300 Subject: [PATCH] Extract Function: Consider member property with invoke() a receiver candidate #KT-9774 Fixed --- .../introduce/extractionEngine/ExtractionData.kt | 6 +++--- .../extractThis/propertyWithExplicitInvoke.kt | 7 +++++++ .../extractThis/propertyWithExplicitInvoke.kt.after | 9 +++++++++ .../extractThis/propertyWithImplicitInvoke.kt | 7 +++++++ .../extractThis/propertyWithImplicitInvoke.kt.after | 9 +++++++++ .../introduce/ExtractionTestGenerated.java | 12 ++++++++++++ 6 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 idea/testData/refactoring/extractFunction/parameters/extractThis/propertyWithExplicitInvoke.kt create mode 100644 idea/testData/refactoring/extractFunction/parameters/extractThis/propertyWithExplicitInvoke.kt.after create mode 100644 idea/testData/refactoring/extractFunction/parameters/extractThis/propertyWithImplicitInvoke.kt create mode 100644 idea/testData/refactoring/extractFunction/parameters/extractThis/propertyWithImplicitInvoke.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractionData.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractionData.kt index c31570b8bdd..3666bbbea87 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractionData.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/extractionEngine/ExtractionData.kt @@ -46,7 +46,6 @@ import org.jetbrains.kotlin.resolve.calls.model.VariableAsFunctionResolvedCall import org.jetbrains.kotlin.resolve.calls.resolvedCallUtil.getImplicitReceiverValue import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory import org.jetbrains.kotlin.resolve.calls.tasks.isSynthesizedInvoke -import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitReceiver import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor import org.jetbrains.kotlin.types.KotlinType @@ -235,12 +234,13 @@ data class ExtractionData( val originalFunctionCall = originalResolvedCall?.functionCall val originalVariableCall = originalResolvedCall?.variableCall val invokeDescriptor = originalFunctionCall?.resultingDescriptor - if (invokeDescriptor != null && isSynthesizedInvoke(invokeDescriptor) && invokeDescriptor.isExtension) { + if (invokeDescriptor != null) { + val invokeDeclaration = getDeclaration(invokeDescriptor, context) ?: synthesizedInvokeDeclaration val variableResolveResult = originalResolveResult.copy(resolvedCall = originalVariableCall!!, descriptor = originalVariableCall.resultingDescriptor) val functionResolveResult = originalResolveResult.copy(resolvedCall = originalFunctionCall!!, descriptor = originalFunctionCall.resultingDescriptor, - declaration = synthesizedInvokeDeclaration) + declaration = invokeDeclaration) referencesInfo.add(ResolvedReferenceInfo(newRef, variableResolveResult, smartCast, possibleTypes)) referencesInfo.add(ResolvedReferenceInfo(newRef, functionResolveResult, smartCast, possibleTypes)) } diff --git a/idea/testData/refactoring/extractFunction/parameters/extractThis/propertyWithExplicitInvoke.kt b/idea/testData/refactoring/extractFunction/parameters/extractThis/propertyWithExplicitInvoke.kt new file mode 100644 index 00000000000..2d15e00e4a2 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/parameters/extractThis/propertyWithExplicitInvoke.kt @@ -0,0 +1,7 @@ +// PARAM_DESCRIPTOR: public final class A defined in root package +// PARAM_TYPES: A +// SIBLING: +class A { + val foo: () -> String = { "OK" } + fun bar() = foo.invoke() +} \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/parameters/extractThis/propertyWithExplicitInvoke.kt.after b/idea/testData/refactoring/extractFunction/parameters/extractThis/propertyWithExplicitInvoke.kt.after new file mode 100644 index 00000000000..4d893f94b57 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/parameters/extractThis/propertyWithExplicitInvoke.kt.after @@ -0,0 +1,9 @@ +// PARAM_DESCRIPTOR: public final class A defined in root package +// PARAM_TYPES: A +// SIBLING: +class A { + val foo: () -> String = { "OK" } + fun bar() = s() +} + +private fun A.s() = foo.invoke() \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/parameters/extractThis/propertyWithImplicitInvoke.kt b/idea/testData/refactoring/extractFunction/parameters/extractThis/propertyWithImplicitInvoke.kt new file mode 100644 index 00000000000..5b4382cdf16 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/parameters/extractThis/propertyWithImplicitInvoke.kt @@ -0,0 +1,7 @@ +// PARAM_DESCRIPTOR: public final class A defined in root package +// PARAM_TYPES: A +// SIBLING: +class A { + val foo: () -> String = { "OK" } + fun bar() = foo() +} \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/parameters/extractThis/propertyWithImplicitInvoke.kt.after b/idea/testData/refactoring/extractFunction/parameters/extractThis/propertyWithImplicitInvoke.kt.after new file mode 100644 index 00000000000..67d690fff9d --- /dev/null +++ b/idea/testData/refactoring/extractFunction/parameters/extractThis/propertyWithImplicitInvoke.kt.after @@ -0,0 +1,9 @@ +// PARAM_DESCRIPTOR: public final class A defined in root package +// PARAM_TYPES: A +// SIBLING: +class A { + val foo: () -> String = { "OK" } + fun bar() = s() +} + +private fun A.s() = foo() \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java index bb5e10eb065..99fd40ce24c 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java @@ -2270,6 +2270,18 @@ public class ExtractionTestGenerated extends AbstractExtractionTest { doExtractFunctionTest(fileName); } + @TestMetadata("propertyWithExplicitInvoke.kt") + public void testPropertyWithExplicitInvoke() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/parameters/extractThis/propertyWithExplicitInvoke.kt"); + doExtractFunctionTest(fileName); + } + + @TestMetadata("propertyWithImplicitInvoke.kt") + public void testPropertyWithImplicitInvoke() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/parameters/extractThis/propertyWithImplicitInvoke.kt"); + doExtractFunctionTest(fileName); + } + @TestMetadata("qualifiedThis.kt") public void testQualifiedThis() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/parameters/extractThis/qualifiedThis.kt");