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");