diff --git a/idea/src/org/jetbrains/kotlin/idea/codeInliner/CodeInliner.kt b/idea/src/org/jetbrains/kotlin/idea/codeInliner/CodeInliner.kt index f0476083c61..a64526c1e7e 100644 --- a/idea/src/org/jetbrains/kotlin/idea/codeInliner/CodeInliner.kt +++ b/idea/src/org/jetbrains/kotlin/idea/codeInliner/CodeInliner.kt @@ -91,8 +91,8 @@ class CodeInliner( if (receiver == null) { val receiverValue = if (descriptor.isExtension) resolvedCall.extensionReceiver else resolvedCall.dispatchReceiver - val resolutionScope = elementToBeReplaced.getResolutionScope(bindingContext, elementToBeReplaced.getResolutionFacade()) if (receiverValue is ImplicitReceiver) { + val resolutionScope = elementToBeReplaced.getResolutionScope(bindingContext, elementToBeReplaced.getResolutionFacade()) receiver = receiverValue.asExpression(resolutionScope, psiFactory) receiverType = receiverValue.type } @@ -100,14 +100,11 @@ class CodeInliner( receiver?.mark(RECEIVER_VALUE_KEY) - //TODO: this@ for (thisExpression in codeToInline.collectDescendantsOfType()) { - if (receiver != null) { + // for this@ClassName we have only option to keep it as is (although it's sometimes incorrect but we have no other options) + if (thisExpression.labelQualifier == null && receiver != null) { codeToInline.replaceExpression(thisExpression, receiver) } - else { - thisExpression.mark(RECEIVER_VALUE_KEY) - } } val introduceValuesForParameters = processValueParameterUsages(callableForParameters) diff --git a/idea/testData/quickfix/deprecatedSymbolUsage/toOuterClassMethod.kt b/idea/testData/quickfix/deprecatedSymbolUsage/toOuterClassMethod.kt index 622d132157f..d8a5bdc6d57 100644 --- a/idea/testData/quickfix/deprecatedSymbolUsage/toOuterClassMethod.kt +++ b/idea/testData/quickfix/deprecatedSymbolUsage/toOuterClassMethod.kt @@ -1,5 +1,5 @@ // "Replace with 'newFun(this)'" "true" -// ERROR: Unresolved reference: newFun +// ERROR: Unresolved reference: @Outer class Outer { inner class Inner { diff --git a/idea/testData/quickfix/deprecatedSymbolUsage/toOuterClassMethod.kt.after b/idea/testData/quickfix/deprecatedSymbolUsage/toOuterClassMethod.kt.after index 8e0b1975a7f..10cadc10340 100644 --- a/idea/testData/quickfix/deprecatedSymbolUsage/toOuterClassMethod.kt.after +++ b/idea/testData/quickfix/deprecatedSymbolUsage/toOuterClassMethod.kt.after @@ -1,5 +1,5 @@ // "Replace with 'newFun(this)'" "true" -// ERROR: Unresolved reference: newFun +// ERROR: Unresolved reference: @Outer class Outer { inner class Inner { @@ -11,5 +11,5 @@ class Outer { } fun foo(inner: Outer.Inner) { - inner.newFun(inner) + this@Outer.newFun(inner) } diff --git a/idea/testData/refactoring/inline/function/ExtensionAndDispatchReceivers.kt b/idea/testData/refactoring/inline/function/ExtensionAndDispatchReceivers.kt new file mode 100644 index 00000000000..2129e465961 --- /dev/null +++ b/idea/testData/refactoring/inline/function/ExtensionAndDispatchReceivers.kt @@ -0,0 +1,11 @@ +class Extended { val extMember = 1 } + +class ExtContext { + val ctxMember = 2 + + fun Extended.extend() = extMember + ctxMember + + fun call(extended: Extended) { + val v = extended.extend() + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/function/ExtensionAndDispatchReceivers.kt.after b/idea/testData/refactoring/inline/function/ExtensionAndDispatchReceivers.kt.after new file mode 100644 index 00000000000..06086ea97ae --- /dev/null +++ b/idea/testData/refactoring/inline/function/ExtensionAndDispatchReceivers.kt.after @@ -0,0 +1,9 @@ +class Extended { val extMember = 1 } + +class ExtContext { + val ctxMember = 2 + + fun call(extended: Extended) { + val v = extended.extMember + ctxMember + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/function/OuterClassReceiver.kt b/idea/testData/refactoring/inline/function/OuterClassReceiver.kt new file mode 100644 index 00000000000..89370cbb986 --- /dev/null +++ b/idea/testData/refactoring/inline/function/OuterClassReceiver.kt @@ -0,0 +1,17 @@ +class Test { + inner class Inner { + fun bar() { + listOf("").forEach { + foo(it) + } + } + + fun foo(v: String) { + bizz(v) + } + } + + fun bizz(v:String) { + v.toString() + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/inline/function/OuterClassReceiver.kt.after b/idea/testData/refactoring/inline/function/OuterClassReceiver.kt.after new file mode 100644 index 00000000000..07c00527d75 --- /dev/null +++ b/idea/testData/refactoring/inline/function/OuterClassReceiver.kt.after @@ -0,0 +1,14 @@ +class Test { + inner class Inner { + fun bar() { + listOf("").forEach { + bizz(it) + } + } + + } + + fun bizz(v:String) { + v.toString() + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/inline/InlineTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/inline/InlineTestGenerated.java index a069c20fda5..1b285cad319 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/inline/InlineTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/inline/InlineTestGenerated.java @@ -50,6 +50,12 @@ public class InlineTestGenerated extends AbstractInlineTest { doTest(fileName); } + @TestMetadata("ExtensionAndDispatchReceivers.kt") + public void testExtensionAndDispatchReceivers() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/inline/function/ExtensionAndDispatchReceivers.kt"); + doTest(fileName); + } + @TestMetadata("InStringTemplates.kt") public void testInStringTemplates() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/inline/function/InStringTemplates.kt"); @@ -74,6 +80,12 @@ public class InlineTestGenerated extends AbstractInlineTest { doTest(fileName); } + @TestMetadata("OuterClassReceiver.kt") + public void testOuterClassReceiver() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/inline/function/OuterClassReceiver.kt"); + doTest(fileName); + } + @TestMetadata("Reference.kt") public void testReference() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/inline/function/Reference.kt");