[FIR] Fix lookup order for statics in super chains

The order was reversed and the static in the top-most class
in the inheritance hierarchy would be found instead of the
lowest one.
This commit is contained in:
Mads Ager
2021-01-29 11:51:54 +01:00
committed by Mikhail Glukhikh
parent 4ec369ac5b
commit 593fb8770b
7 changed files with 59 additions and 4 deletions
@@ -35588,6 +35588,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTest("compiler/testData/codegen/box/statics/protectedStaticAndInline.kt"); runTest("compiler/testData/codegen/box/statics/protectedStaticAndInline.kt");
} }
@Test
@TestMetadata("simpleStaticInJavaSuperChain.kt")
public void testSimpleStaticInJavaSuperChain() throws Exception {
runTest("compiler/testData/codegen/box/statics/simpleStaticInJavaSuperChain.kt");
}
@Test @Test
@TestMetadata("syntheticAccessor.kt") @TestMetadata("syntheticAccessor.kt")
public void testSyntheticAccessor() throws Exception { public void testSyntheticAccessor() throws Exception {
@@ -180,7 +180,7 @@ fun SessionHolder.collectImplicitReceivers(
throw IllegalArgumentException("Incorrect label & receiver owner: ${owner.javaClass}") throw IllegalArgumentException("Incorrect label & receiver owner: ${owner.javaClass}")
} }
} }
return ImplicitReceivers(implicitReceiverValue, implicitCompanionValues.asReversed()) return ImplicitReceivers(implicitReceiverValue, implicitCompanionValues)
} }
fun SessionHolder.collectTowerDataElementsForClass(owner: FirClass<*>, defaultType: ConeKotlinType): TowerElementsForClass { fun SessionHolder.collectTowerDataElementsForClass(owner: FirClass<*>, defaultType: ConeKotlinType): TowerElementsForClass {
@@ -221,8 +221,8 @@ fun SessionHolder.collectTowerDataElementsForClass(owner: FirClass<*>, defaultTy
owner.staticScope(this), owner.staticScope(this),
companionReceiver, companionReceiver,
companionObject?.staticScope(this), companionObject?.staticScope(this),
superClassesStaticsAndCompanionReceivers, superClassesStaticsAndCompanionReceivers.asReversed(),
allImplicitCompanionValues allImplicitCompanionValues.asReversed()
) )
} }
@@ -234,6 +234,8 @@ class TowerElementsForClass(
val staticScope: FirScope?, val staticScope: FirScope?,
val companionReceiver: ImplicitReceiverValue<*>?, val companionReceiver: ImplicitReceiverValue<*>?,
val companionStaticScope: FirScope?, val companionStaticScope: FirScope?,
// Ordered from inner scopes to outer scopes.
val superClassesStaticsAndCompanionReceivers: List<FirTowerDataElement>, val superClassesStaticsAndCompanionReceivers: List<FirTowerDataElement>,
// Ordered from inner scopes to outer scopes.
val implicitCompanionValues: List<ImplicitReceiverValue<*>> val implicitCompanionValues: List<ImplicitReceiverValue<*>>
) )
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM // TARGET_BACKEND: JVM
// FILE: Base.java // FILE: Base.java
@@ -0,0 +1,31 @@
// TARGET_BACKEND: JVM
// FILE: A.java
public class A {
public static String s = "A.s: NOT OK";
public static String f() {
return "A.f: NOT OK";
}
public static class B extends A {
public static String s = "OK";
public static String f() {
return "OK";
}
}
}
// FILE: Kotlin.kt
class Kotlin: A.B() {
fun getS() = s
fun callF() = f()
}
fun box(): String {
val kotlin = Kotlin()
if (kotlin.getS() != "OK") return "fail1"
return kotlin.callF()
}
@@ -35788,6 +35788,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/statics/protectedStaticAndInline.kt"); runTest("compiler/testData/codegen/box/statics/protectedStaticAndInline.kt");
} }
@Test
@TestMetadata("simpleStaticInJavaSuperChain.kt")
public void testSimpleStaticInJavaSuperChain() throws Exception {
runTest("compiler/testData/codegen/box/statics/simpleStaticInJavaSuperChain.kt");
}
@Test @Test
@TestMetadata("syntheticAccessor.kt") @TestMetadata("syntheticAccessor.kt")
public void testSyntheticAccessor() throws Exception { public void testSyntheticAccessor() throws Exception {
@@ -35588,6 +35588,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/statics/protectedStaticAndInline.kt"); runTest("compiler/testData/codegen/box/statics/protectedStaticAndInline.kt");
} }
@Test
@TestMetadata("simpleStaticInJavaSuperChain.kt")
public void testSimpleStaticInJavaSuperChain() throws Exception {
runTest("compiler/testData/codegen/box/statics/simpleStaticInJavaSuperChain.kt");
}
@Test @Test
@TestMetadata("syntheticAccessor.kt") @TestMetadata("syntheticAccessor.kt")
public void testSyntheticAccessor() throws Exception { public void testSyntheticAccessor() throws Exception {
@@ -29277,6 +29277,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/statics/protectedStaticAndInline.kt"); runTest("compiler/testData/codegen/box/statics/protectedStaticAndInline.kt");
} }
@TestMetadata("simpleStaticInJavaSuperChain.kt")
public void testSimpleStaticInJavaSuperChain() throws Exception {
runTest("compiler/testData/codegen/box/statics/simpleStaticInJavaSuperChain.kt");
}
@TestMetadata("syntheticAccessor.kt") @TestMetadata("syntheticAccessor.kt")
public void testSyntheticAccessor() throws Exception { public void testSyntheticAccessor() throws Exception {
runTest("compiler/testData/codegen/box/statics/syntheticAccessor.kt"); runTest("compiler/testData/codegen/box/statics/syntheticAccessor.kt");