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 867f02f713b..f3f1edbef97 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 @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.idea.codeInsight.JetFileReferencesResolver import org.jetbrains.kotlin.idea.core.compareDescriptors import org.jetbrains.kotlin.idea.core.refactoring.getContextForContainingDeclarationBody import org.jetbrains.kotlin.idea.util.psi.patternMatching.JetPsiRange +import org.jetbrains.kotlin.idea.util.psi.patternMatching.JetPsiUnifier import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelector import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType @@ -213,7 +214,9 @@ data class ExtractionData( if (parent is JetUserType && (parent.getParent() as? JetUserType)?.getQualifier() == parent) continue val descriptor = context[BindingContext.REFERENCE_TARGET, ref] - val isBadRef = !compareDescriptors(project, originalResolveResult.descriptor, descriptor) || smartCast != null + val isBadRef = !(compareDescriptors(project, originalResolveResult.descriptor, descriptor) + && originalContext.diagnostics.forElement(originalResolveResult.originalRefExpr) == context.diagnostics.forElement(ref)) + || smartCast != null if (isBadRef && !originalResolveResult.declaration.isInsideOf(originalElements)) { val originalResolvedCall = originalResolveResult.resolvedCall as? VariableAsFunctionResolvedCall val originalFunctionCall = originalResolvedCall?.functionCall diff --git a/idea/testData/refactoring/extractFunction/parameters/extractThis/missingReceiver.kt b/idea/testData/refactoring/extractFunction/parameters/extractThis/missingReceiver.kt new file mode 100644 index 00000000000..941a0f25584 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/parameters/extractThis/missingReceiver.kt @@ -0,0 +1,14 @@ +// PARAM_TYPES: kotlin.String +// PARAM_DESCRIPTOR: internal final fun kotlin.String.foo(): kotlin.Unit defined in X + +fun print(a: Any) { + +} + +class X { + fun String.foo() { + print(extension) + } + + val String.extension: Int get() = length() +} \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/parameters/extractThis/missingReceiver.kt.after b/idea/testData/refactoring/extractFunction/parameters/extractThis/missingReceiver.kt.after new file mode 100644 index 00000000000..ef79504739a --- /dev/null +++ b/idea/testData/refactoring/extractFunction/parameters/extractThis/missingReceiver.kt.after @@ -0,0 +1,18 @@ +// PARAM_TYPES: kotlin.String +// PARAM_DESCRIPTOR: internal final fun kotlin.String.foo(): kotlin.Unit defined in X + +fun print(a: Any) { + +} + +class X { + fun String.foo() { + __dummyTestFun__() + } + + private fun String.__dummyTestFun__() { + print(extension) + } + + val String.extension: Int get() = length() +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java index a6ac3eca9ac..1d659de3d14 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java @@ -1979,6 +1979,12 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest { doExtractFunctionTest(fileName); } + @TestMetadata("missingReceiver.kt") + public void testMissingReceiver() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/parameters/extractThis/missingReceiver.kt"); + doExtractFunctionTest(fileName); + } + @TestMetadata("paramAsExplicitInvoke.kt") public void testParamAsExplicitInvoke() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/parameters/extractThis/paramAsExplicitInvoke.kt");