FIR2IR: Fix mapping for intersection overrides of deserialized properties

This commit is contained in:
Denis.Zharkov
2021-01-22 11:44:30 +03:00
parent fdf0934ade
commit 3a3d2ee3e9
10 changed files with 68 additions and 4 deletions
@@ -1065,7 +1065,7 @@ class Fir2IrDeclarationStorage(
val irProperty = fir.convertWithOffsets { startOffset, endOffset ->
symbolTable.declareProperty(signature, { symbol }) {
val isFakeOverride =
fir.isSubstitutionOverride &&
fir.isSubstitutionOrIntersectionOverride &&
firPropertySymbol.dispatchReceiverClassOrNull() !=
firPropertySymbol.originalForSubstitutionOverride?.dispatchReceiverClassOrNull()
Fir2IrLazyProperty(
@@ -210,6 +210,11 @@ public class FirCompileKotlinAgainstKotlinTestGenerated extends AbstractFirCompi
runTest("compiler/testData/compileKotlinAgainstKotlin/internalWithOtherModuleName.kt");
}
@TestMetadata("intersectionOverrideProperies.kt")
public void testIntersectionOverrideProperies() throws Exception {
runTest("compiler/testData/compileKotlinAgainstKotlin/intersectionOverrideProperies.kt");
}
@TestMetadata("jvmField.kt")
public void testJvmField() throws Exception {
runTest("compiler/testData/compileKotlinAgainstKotlin/jvmField.kt");
@@ -32,6 +32,7 @@ var FirCallableDeclaration<*>.containingClassAttr: ConeClassLikeLookupTag? by Fi
val FirCallableDeclaration<*>.isIntersectionOverride get() = origin == FirDeclarationOrigin.IntersectionOverride
val FirCallableDeclaration<*>.isSubstitutionOverride get() = origin == FirDeclarationOrigin.SubstitutionOverride
val FirCallableDeclaration<*>.isSubstitutionOrIntersectionOverride get() = isSubstitutionOverride || isIntersectionOverride
inline val <reified D : FirCallableDeclaration<*>> D.originalForSubstitutionOverride: D?
get() = if (isSubstitutionOverride) originalForSubstitutionOverrideAttr else null
@@ -1,6 +1,5 @@
// DONT_TARGET_EXACT_BACKEND: WASM
// WASM_MUTE_REASON: STDLIB_COLLECTIONS
// IGNORE_BACKEND_FIR: JVM_IR
// KJS_WITH_FULL_RUNTIME
// IGNORE_BACKEND: NATIVE
@@ -0,0 +1,39 @@
// TARGET_BACKEND: JVM
// FILE: A.kt
package a
interface IrSymbol {
val owner: Any
}
interface IrFunction
interface IrSimpleFunction : IrFunction {
val name: String
}
interface IrFunctionSymbol : IrSymbol {
override val owner: IrFunction
}
interface IrBindableSymbol<B : Any> : IrSymbol {
override val owner: B
}
interface IrSimpleFunctionSymbol : IrFunctionSymbol, IrBindableSymbol<IrSimpleFunction>
// FILE: B.kt
import a.*
fun foo(x: IrSimpleFunctionSymbol): String {
return x.owner.name
}
fun box(): String {
return foo(object : IrSimpleFunctionSymbol {
override val owner: IrSimpleFunction
get() = object : IrSimpleFunction {
override val name: String
get() = "OK"
}
})
}
+2 -2
View File
@@ -261,7 +261,7 @@ FILE fqName:<root> fileName:/MultiList.kt
correspondingProperty: PROPERTY FAKE_OVERRIDE name:size visibility:public modality:ABSTRACT [fake_override,val]
overridden:
public abstract fun <get-size> (): kotlin.Int declared in kotlin.collections.List
public abstract fun <get-size> (): kotlin.Int declared in java.util.ArrayList
public abstract fun <get-size> (): kotlin.Int [fake_override] declared in java.util.ArrayList
$this: VALUE_PARAMETER name:<this> type:kotlin.collections.List<E of kotlin.collections.List>
FUN FAKE_OVERRIDE name:spliterator visibility:public modality:OPEN <> ($this:java.util.Collection<E of java.util.Collection>) returnType:@[FlexibleNullability] java.util.Spliterator<<root>.Some<T of <root>.SomeList>?> [fake_override]
overridden:
@@ -471,7 +471,7 @@ FILE fqName:<root> fileName:/MultiList.kt
correspondingProperty: PROPERTY FAKE_OVERRIDE name:size visibility:public modality:ABSTRACT [fake_override,val]
overridden:
public abstract fun <get-size> (): kotlin.Int declared in kotlin.collections.List
public abstract fun <get-size> (): kotlin.Int declared in java.util.ArrayList
public abstract fun <get-size> (): kotlin.Int [fake_override] declared in java.util.ArrayList
$this: VALUE_PARAMETER name:<this> type:kotlin.collections.List<E of kotlin.collections.List>
FUN FAKE_OVERRIDE name:spliterator visibility:public modality:OPEN <> ($this:java.util.Collection<E of java.util.Collection>) returnType:@[FlexibleNullability] java.util.Spliterator<<root>.Some<kotlin.String>?> [fake_override]
overridden:
@@ -209,6 +209,11 @@ public class CompileKotlinAgainstKotlinTestGenerated extends AbstractCompileKotl
runTest("compiler/testData/compileKotlinAgainstKotlin/internalWithOtherModuleName.kt");
}
@TestMetadata("intersectionOverrideProperies.kt")
public void testIntersectionOverrideProperies() throws Exception {
runTest("compiler/testData/compileKotlinAgainstKotlin/intersectionOverrideProperies.kt");
}
@TestMetadata("jvmField.kt")
public void testJvmField() throws Exception {
runTest("compiler/testData/compileKotlinAgainstKotlin/jvmField.kt");
@@ -210,6 +210,11 @@ public class IrCompileKotlinAgainstKotlinTestGenerated extends AbstractIrCompile
runTest("compiler/testData/compileKotlinAgainstKotlin/internalWithOtherModuleName.kt");
}
@TestMetadata("intersectionOverrideProperies.kt")
public void testIntersectionOverrideProperies() throws Exception {
runTest("compiler/testData/compileKotlinAgainstKotlin/intersectionOverrideProperies.kt");
}
@TestMetadata("jvmField.kt")
public void testJvmField() throws Exception {
runTest("compiler/testData/compileKotlinAgainstKotlin/jvmField.kt");
@@ -210,6 +210,11 @@ public class JvmIrAgainstOldBoxTestGenerated extends AbstractJvmIrAgainstOldBoxT
runTest("compiler/testData/compileKotlinAgainstKotlin/internalWithOtherModuleName.kt");
}
@TestMetadata("intersectionOverrideProperies.kt")
public void testIntersectionOverrideProperies() throws Exception {
runTest("compiler/testData/compileKotlinAgainstKotlin/intersectionOverrideProperies.kt");
}
@TestMetadata("jvmField.kt")
public void testJvmField() throws Exception {
runTest("compiler/testData/compileKotlinAgainstKotlin/jvmField.kt");
@@ -210,6 +210,11 @@ public class JvmOldAgainstIrBoxTestGenerated extends AbstractJvmOldAgainstIrBoxT
runTest("compiler/testData/compileKotlinAgainstKotlin/internalWithOtherModuleName.kt");
}
@TestMetadata("intersectionOverrideProperies.kt")
public void testIntersectionOverrideProperies() throws Exception {
runTest("compiler/testData/compileKotlinAgainstKotlin/intersectionOverrideProperies.kt");
}
@TestMetadata("jvmField.kt")
public void testJvmField() throws Exception {
runTest("compiler/testData/compileKotlinAgainstKotlin/jvmField.kt");