Proper implement 'classForImplicitThis'

This commit is contained in:
Mikhael Bogdanov
2019-07-18 14:47:57 +02:00
parent a9f0d1a53b
commit 74e49d91ca
9 changed files with 45 additions and 7 deletions
@@ -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 /* <this> */)
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
@@ -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()
}
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
open class Base(val callback: () -> String)
class Outer {
@@ -1,4 +1,3 @@
// IGNORE_BACKEND: JVM_IR
open class Base(val callback: () -> String)
class Outer {
@@ -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");
@@ -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");
@@ -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");
@@ -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");
@@ -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");