From 74e49d91cacc2435c6ccf2078337553f08d0969e Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Thu, 18 Jul 2019 14:47:57 +0200 Subject: [PATCH] Proper implement 'classForImplicitThis' --- .../backend/common/lower/InnerClassesLowering.kt | 13 ++++++++----- .../codegen/box/classes/inner/extensionWithOuter.kt | 12 ++++++++++++ .../outerCapturedInInlineLambda.kt | 1 - .../outerCapturedInInlineLambda2.kt | 1 - .../codegen/BlackBoxCodegenTestGenerated.java | 5 +++++ .../codegen/LightAnalysisModeTestGenerated.java | 5 +++++ .../codegen/ir/IrBlackBoxCodegenTestGenerated.java | 5 +++++ .../ir/semantics/IrJsCodegenBoxTestGenerated.java | 5 +++++ .../test/semantics/JsCodegenBoxTestGenerated.java | 5 +++++ 9 files changed, 45 insertions(+), 7 deletions(-) create mode 100644 compiler/testData/codegen/box/classes/inner/extensionWithOuter.kt diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InnerClassesLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InnerClassesLowering.kt index a027ddd1bed..807d6beb197 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InnerClassesLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InnerClassesLowering.kt @@ -33,11 +33,14 @@ import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid class InnerClassesLowering(val context: BackendContext) : ClassLoweringPass { private val IrValueSymbol.classForImplicitThis: IrClass? // TODO: is this the correct way to get the class? - // -1 means value is either IMPLICIT or EXTENSION receiver - get() = if (this is IrValueParameterSymbol && owner.index == -1 && owner.name.isSpecial /* */) - owner.type.classOrNull?.owner - else - null + get() = + if (this is IrValueParameterSymbol && owner.index == -1 && + (owner == (owner.parent as? IrFunction)?.dispatchReceiverParameter || + owner == (owner.parent as? IrClass)?.thisReceiver) + ) { + owner.type.classOrNull?.owner + } else + null override fun lower(irClass: IrClass) { if (!irClass.isInner) return diff --git a/compiler/testData/codegen/box/classes/inner/extensionWithOuter.kt b/compiler/testData/codegen/box/classes/inner/extensionWithOuter.kt new file mode 100644 index 00000000000..b297d114c6a --- /dev/null +++ b/compiler/testData/codegen/box/classes/inner/extensionWithOuter.kt @@ -0,0 +1,12 @@ +class Outer(val value: String) { + + inner class Inner { + fun Outer.foo() = value + } +} + +fun Outer.Inner.test() = Outer("OK").foo() + +fun box(): String { + return Outer("Fail").Inner().test() +} \ No newline at end of file diff --git a/compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerCapturedInInlineLambda.kt b/compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerCapturedInInlineLambda.kt index 185afa77134..42833d259ec 100644 --- a/compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerCapturedInInlineLambda.kt +++ b/compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerCapturedInInlineLambda.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR open class Base(val callback: () -> String) class Outer { diff --git a/compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerCapturedInInlineLambda2.kt b/compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerCapturedInInlineLambda2.kt index 1d8ea921f17..4b135115783 100644 --- a/compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerCapturedInInlineLambda2.kt +++ b/compiler/testData/codegen/box/closures/captureInSuperConstructorCall/outerCapturedInInlineLambda2.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR open class Base(val callback: () -> String) class Outer { diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 8241eed7bf8..84a1a6f41ba 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -3667,6 +3667,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/classes/inner"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true); } + @TestMetadata("extensionWithOuter.kt") + public void testExtensionWithOuter() throws Exception { + runTest("compiler/testData/codegen/box/classes/inner/extensionWithOuter.kt"); + } + @TestMetadata("instantiateInDerived.kt") public void testInstantiateInDerived() throws Exception { runTest("compiler/testData/codegen/box/classes/inner/instantiateInDerived.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 71df3aec22f..6874c2e4f55 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -3667,6 +3667,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/classes/inner"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true); } + @TestMetadata("extensionWithOuter.kt") + public void testExtensionWithOuter() throws Exception { + runTest("compiler/testData/codegen/box/classes/inner/extensionWithOuter.kt"); + } + @TestMetadata("instantiateInDerived.kt") public void testInstantiateInDerived() throws Exception { runTest("compiler/testData/codegen/box/classes/inner/instantiateInDerived.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 30a1f6d1e4d..2eec769c665 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -3647,6 +3647,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/classes/inner"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM_IR, true); } + @TestMetadata("extensionWithOuter.kt") + public void testExtensionWithOuter() throws Exception { + runTest("compiler/testData/codegen/box/classes/inner/extensionWithOuter.kt"); + } + @TestMetadata("instantiateInDerived.kt") public void testInstantiateInDerived() throws Exception { runTest("compiler/testData/codegen/box/classes/inner/instantiateInDerived.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java index 7b6ca898a2c..12e1e47fc42 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrJsCodegenBoxTestGenerated.java @@ -3052,6 +3052,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/classes/inner"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JS_IR, true); } + @TestMetadata("extensionWithOuter.kt") + public void testExtensionWithOuter() throws Exception { + runTest("compiler/testData/codegen/box/classes/inner/extensionWithOuter.kt"); + } + @TestMetadata("instantiateInDerived.kt") public void testInstantiateInDerived() throws Exception { runTest("compiler/testData/codegen/box/classes/inner/instantiateInDerived.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java index 864772d306f..3562080a77f 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/JsCodegenBoxTestGenerated.java @@ -3052,6 +3052,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/classes/inner"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JS, true); } + @TestMetadata("extensionWithOuter.kt") + public void testExtensionWithOuter() throws Exception { + runTest("compiler/testData/codegen/box/classes/inner/extensionWithOuter.kt"); + } + @TestMetadata("instantiateInDerived.kt") public void testInstantiateInDerived() throws Exception { runTest("compiler/testData/codegen/box/classes/inner/instantiateInDerived.kt");