A proper modality calculation was missing in IR fake override construction algorithm

#KT-41765 Fixed
This commit is contained in:
Alexander Gorshenev
2020-09-10 20:56:01 +03:00
parent 2886f48795
commit 744f290fc4
10 changed files with 99 additions and 18 deletions
@@ -15345,6 +15345,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTest("compiler/testData/codegen/box/ir/kt40083.kt");
}
@TestMetadata("kt41765.kt")
public void testKt41765() throws Exception {
runTest("compiler/testData/codegen/box/ir/kt41765.kt");
}
@TestMetadata("objectClass.kt")
public void testObjectClass() throws Exception {
runTest("compiler/testData/codegen/box/ir/objectClass.kt");
@@ -6,17 +6,14 @@
package org.jetbrains.kotlin.ir.overrides
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
import org.jetbrains.kotlin.ir.descriptors.WrappedPropertyDescriptor
import org.jetbrains.kotlin.ir.descriptors.WrappedSimpleFunctionDescriptor
import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.symbols.impl.IrPropertySymbolImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.util.collectAndFilterRealOverrides
import org.jetbrains.kotlin.ir.util.isReal
import org.jetbrains.kotlin.ir.util.render
import org.jetbrains.kotlin.resolve.OverridingUtil.OverrideCompatibilityInfo
@@ -284,7 +281,11 @@ class IrOverridingUtil(
if (!hasOpen && hasAbstract) {
return if (transformAbstractToClassModality) current.modality else Modality.ABSTRACT
}
return getMinimalModality(members, transformAbstractToClassModality, current.modality)
val realOverrides = members
.map{ originals[it]!! }
.collectAndFilterRealOverrides()
return getMinimalModality(realOverrides, transformAbstractToClassModality, current.modality)
}
private fun areEquivalent(a: IrOverridableMember, b: IrOverridableMember) = (a == b)
@@ -33,27 +33,47 @@ val IrFunction.target: IrFunction get() = when (this) {
fun IrSimpleFunction.collectRealOverrides(toSkip: (IrSimpleFunction) -> Boolean = { false }): Set<IrSimpleFunction> {
if (isReal && !toSkip(this)) return setOf(this)
val visited = mutableSetOf<IrSimpleFunction>()
val realOverrides = mutableSetOf<IrSimpleFunction>()
return this.overriddenSymbols
.map { it.owner }
.collectAndFilterRealOverrides {
require(it is IrSimpleFunction) { "Expected IrSimpleFunction: ${it.render()}" }
toSkip(it)
}
.map { it as IrSimpleFunction }
.toSet()
}
fun collectRealOverrides(func: IrSimpleFunction) {
if (!visited.add(func)) return
fun Collection<IrOverridableMember>.collectAndFilterRealOverrides(toSkip: (IrOverridableMember) -> Boolean = { false }): Set<IrOverridableMember> {
if (func.isReal && !toSkip(func)) {
realOverrides += func
val visited = mutableSetOf<IrOverridableMember>()
val realOverrides = mutableSetOf<IrOverridableMember>()
fun overriddenSymbols(declaration: IrOverridableMember) = when (declaration) {
is IrSimpleFunction -> declaration.overriddenSymbols
is IrProperty -> (declaration.getter ?: declaration.setter)
?.overriddenSymbols?.mapNotNull { it.owner.correspondingPropertySymbol }
?: emptyList()
else -> error("Unexpected overridable member: ${declaration.render()}")
}
fun collectRealOverrides(member: IrOverridableMember) {
if (!visited.add(member)) return
if (member.isReal && !toSkip(member)) {
realOverrides += member
} else {
func.overriddenSymbols.forEach { collectRealOverrides(it.owner) }
overriddenSymbols(member).forEach { collectRealOverrides(it.owner as IrOverridableMember) }
}
}
overriddenSymbols.forEach { collectRealOverrides(it.owner) }
this.forEach { collectRealOverrides(it) }
fun excludeRepeated(func: IrSimpleFunction) {
if (!visited.add(func)) return
fun excludeRepeated(member: IrOverridableMember) {
if (!visited.add(member)) return
func.overriddenSymbols.forEach {
overriddenSymbols(member).forEach {
realOverrides.remove(it.owner)
excludeRepeated(it.owner)
excludeRepeated(it.owner as IrOverridableMember)
}
}
+25
View File
@@ -0,0 +1,25 @@
// MODULE: lib
// FILE: lib.kt
// KT-41765
interface X {
override fun toString() :String
}
interface Y
abstract class A: Y, X
// MODULE: main(lib)
// FILE: main.kt
class B: A() {
override fun toString() = "BBB"
}
fun box(): String {
if (B().toString() == "BBB") return "OK"
return "FAIL"
}
@@ -16740,6 +16740,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/ir/kt40083.kt");
}
@TestMetadata("kt41765.kt")
public void testKt41765() throws Exception {
runTest("compiler/testData/codegen/box/ir/kt41765.kt");
}
@TestMetadata("objectClass.kt")
public void testObjectClass() throws Exception {
runTest("compiler/testData/codegen/box/ir/objectClass.kt");
@@ -16740,6 +16740,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/ir/kt40083.kt");
}
@TestMetadata("kt41765.kt")
public void testKt41765() throws Exception {
runTest("compiler/testData/codegen/box/ir/kt41765.kt");
}
@TestMetadata("objectClass.kt")
public void testObjectClass() throws Exception {
runTest("compiler/testData/codegen/box/ir/objectClass.kt");
@@ -15345,6 +15345,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/ir/kt40083.kt");
}
@TestMetadata("kt41765.kt")
public void testKt41765() throws Exception {
runTest("compiler/testData/codegen/box/ir/kt41765.kt");
}
@TestMetadata("objectClass.kt")
public void testObjectClass() throws Exception {
runTest("compiler/testData/codegen/box/ir/objectClass.kt");
@@ -13355,6 +13355,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes
runTest("compiler/testData/codegen/box/ir/kt40083.kt");
}
@TestMetadata("kt41765.kt")
public void testKt41765() throws Exception {
runTest("compiler/testData/codegen/box/ir/kt41765.kt");
}
@TestMetadata("objectClass.kt")
public void testObjectClass() throws Exception {
runTest("compiler/testData/codegen/box/ir/objectClass.kt");
@@ -13355,6 +13355,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/ir/kt40083.kt");
}
@TestMetadata("kt41765.kt")
public void testKt41765() throws Exception {
runTest("compiler/testData/codegen/box/ir/kt41765.kt");
}
@TestMetadata("objectClass.kt")
public void testObjectClass() throws Exception {
runTest("compiler/testData/codegen/box/ir/objectClass.kt");
@@ -13420,6 +13420,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/ir/kt40083.kt");
}
@TestMetadata("kt41765.kt")
public void testKt41765() throws Exception {
runTest("compiler/testData/codegen/box/ir/kt41765.kt");
}
@TestMetadata("objectClass.kt")
public void testObjectClass() throws Exception {
runTest("compiler/testData/codegen/box/ir/objectClass.kt");