[FIR] Check for subtyping during actualization of supertypes of expect class
^KT-59356 Fixed
This commit is contained in:
committed by
Space Team
parent
ac92c129bf
commit
1b24b95cde
+6
@@ -169,6 +169,12 @@ public class FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated extends Abst
|
|||||||
runTest("compiler/testData/diagnostics/tests/multiplatform/smartcastOnMemberPropertyFromCommonClass.kt");
|
runTest("compiler/testData/diagnostics/tests/multiplatform/smartcastOnMemberPropertyFromCommonClass.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("supertypeActualizationWithAny.kt")
|
||||||
|
public void testSupertypeActualizationWithAny() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/multiplatform/supertypeActualizationWithAny.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("varSetterVisibility.kt")
|
@TestMetadata("varSetterVisibility.kt")
|
||||||
public void testVarSetterVisibility() throws Exception {
|
public void testVarSetterVisibility() throws Exception {
|
||||||
|
|||||||
+6
@@ -169,6 +169,12 @@ public class FirOldFrontendMPPDiagnosticsWithPsiTestGenerated extends AbstractFi
|
|||||||
runTest("compiler/testData/diagnostics/tests/multiplatform/smartcastOnMemberPropertyFromCommonClass.kt");
|
runTest("compiler/testData/diagnostics/tests/multiplatform/smartcastOnMemberPropertyFromCommonClass.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("supertypeActualizationWithAny.kt")
|
||||||
|
public void testSupertypeActualizationWithAny() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/multiplatform/supertypeActualizationWithAny.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("varSetterVisibility.kt")
|
@TestMetadata("varSetterVisibility.kt")
|
||||||
public void testVarSetterVisibility() throws Exception {
|
public void testVarSetterVisibility() throws Exception {
|
||||||
|
|||||||
+12
@@ -33669,6 +33669,18 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr
|
|||||||
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("transitiveSuperclassActualization.kt")
|
||||||
|
public void testTransitiveSuperclassActualization() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/transitiveSuperclassActualization.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("transitiveSuperclassActualization_java.kt")
|
||||||
|
public void testTransitiveSuperclassActualization_java() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/transitiveSuperclassActualization_java.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("valueClasses.kt")
|
@TestMetadata("valueClasses.kt")
|
||||||
public void testValueClasses() throws Exception {
|
public void testValueClasses() throws Exception {
|
||||||
|
|||||||
+12
@@ -33669,6 +33669,18 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo
|
|||||||
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("transitiveSuperclassActualization.kt")
|
||||||
|
public void testTransitiveSuperclassActualization() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/transitiveSuperclassActualization.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("transitiveSuperclassActualization_java.kt")
|
||||||
|
public void testTransitiveSuperclassActualization_java() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/transitiveSuperclassActualization_java.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("valueClasses.kt")
|
@TestMetadata("valueClasses.kt")
|
||||||
public void testValueClasses() throws Exception {
|
public void testValueClasses() throws Exception {
|
||||||
|
|||||||
+20
-1
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.name.ClassId
|
|||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.resolve.calls.mpp.ExpectActualMatchingContext
|
import org.jetbrains.kotlin.resolve.calls.mpp.ExpectActualMatchingContext
|
||||||
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
||||||
|
import org.jetbrains.kotlin.types.TypeCheckerState
|
||||||
import org.jetbrains.kotlin.types.Variance
|
import org.jetbrains.kotlin.types.Variance
|
||||||
import org.jetbrains.kotlin.types.model.*
|
import org.jetbrains.kotlin.types.model.*
|
||||||
import org.jetbrains.kotlin.utils.addIfNotNull
|
import org.jetbrains.kotlin.utils.addIfNotNull
|
||||||
@@ -43,6 +44,9 @@ class FirExpectActualMatchingContext(
|
|||||||
override val allowClassActualizationWithWiderVisibility: Boolean
|
override val allowClassActualizationWithWiderVisibility: Boolean
|
||||||
get() = true
|
get() = true
|
||||||
|
|
||||||
|
override val allowTransitiveSupertypesActualization: Boolean
|
||||||
|
get() = true
|
||||||
|
|
||||||
private fun CallableSymbolMarker.asSymbol(): FirCallableSymbol<*> = this as FirCallableSymbol<*>
|
private fun CallableSymbolMarker.asSymbol(): FirCallableSymbol<*> = this as FirCallableSymbol<*>
|
||||||
private fun FunctionSymbolMarker.asSymbol(): FirFunctionSymbol<*> = this as FirFunctionSymbol<*>
|
private fun FunctionSymbolMarker.asSymbol(): FirFunctionSymbol<*> = this as FirFunctionSymbol<*>
|
||||||
private fun PropertySymbolMarker.asSymbol(): FirPropertySymbol = this as FirPropertySymbol
|
private fun PropertySymbolMarker.asSymbol(): FirPropertySymbol = this as FirPropertySymbol
|
||||||
@@ -144,6 +148,9 @@ class FirExpectActualMatchingContext(
|
|||||||
override val RegularClassSymbolMarker.superTypes: List<KotlinTypeMarker>
|
override val RegularClassSymbolMarker.superTypes: List<KotlinTypeMarker>
|
||||||
get() = asSymbol().resolvedSuperTypes
|
get() = asSymbol().resolvedSuperTypes
|
||||||
|
|
||||||
|
override val RegularClassSymbolMarker.defaultType: KotlinTypeMarker
|
||||||
|
get() = asSymbol().defaultType()
|
||||||
|
|
||||||
override fun RegularClassSymbolMarker.collectAllMembers(isActualDeclaration: Boolean): List<FirBasedSymbol<*>> {
|
override fun RegularClassSymbolMarker.collectAllMembers(isActualDeclaration: Boolean): List<FirBasedSymbol<*>> {
|
||||||
val symbol = asSymbol()
|
val symbol = asSymbol()
|
||||||
val session = when (isActualDeclaration) {
|
val session = when (isActualDeclaration) {
|
||||||
@@ -256,12 +263,24 @@ class FirExpectActualMatchingContext(
|
|||||||
if (actualType == null) return false
|
if (actualType == null) return false
|
||||||
|
|
||||||
return AbstractTypeChecker.equalTypes(
|
return AbstractTypeChecker.equalTypes(
|
||||||
actualSession.typeContext.newTypeCheckerState(errorTypesEqualToAnything = true, stubTypesEqualToAnything = false),
|
createTypeCheckerState(),
|
||||||
expectType,
|
expectType,
|
||||||
actualType
|
actualType
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun actualTypeIsSubtypeOfExpectType(expectType: KotlinTypeMarker, actualType: KotlinTypeMarker): Boolean {
|
||||||
|
return AbstractTypeChecker.isSubtypeOf(
|
||||||
|
createTypeCheckerState(),
|
||||||
|
subType = actualType,
|
||||||
|
superType = expectType
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun createTypeCheckerState(): TypeCheckerState {
|
||||||
|
return actualSession.typeContext.newTypeCheckerState(errorTypesEqualToAnything = true, stubTypesEqualToAnything = false)
|
||||||
|
}
|
||||||
|
|
||||||
override fun RegularClassSymbolMarker.isNotSamInterface(): Boolean {
|
override fun RegularClassSymbolMarker.isNotSamInterface(): Boolean {
|
||||||
val type = asSymbol().defaultType()
|
val type = asSymbol().defaultType()
|
||||||
val isSam = FirSamResolver(actualSession, scopeSession).isSamType(type)
|
val isSam = FirSamResolver(actualSession, scopeSession).isSamType(type)
|
||||||
|
|||||||
+26
-3
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.name.ClassId
|
|||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.resolve.calls.mpp.ExpectActualMatchingContext
|
import org.jetbrains.kotlin.resolve.calls.mpp.ExpectActualMatchingContext
|
||||||
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
||||||
|
import org.jetbrains.kotlin.types.TypeCheckerState
|
||||||
import org.jetbrains.kotlin.types.Variance
|
import org.jetbrains.kotlin.types.Variance
|
||||||
import org.jetbrains.kotlin.types.model.*
|
import org.jetbrains.kotlin.types.model.*
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.UnsafeCastFunction
|
import org.jetbrains.kotlin.utils.addToStdlib.UnsafeCastFunction
|
||||||
@@ -36,6 +37,9 @@ internal abstract class IrExpectActualMatchingContext(
|
|||||||
override val allowClassActualizationWithWiderVisibility: Boolean
|
override val allowClassActualizationWithWiderVisibility: Boolean
|
||||||
get() = true
|
get() = true
|
||||||
|
|
||||||
|
override val allowTransitiveSupertypesActualization: Boolean
|
||||||
|
get() = true
|
||||||
|
|
||||||
private inline fun <R> CallableSymbolMarker.processIr(
|
private inline fun <R> CallableSymbolMarker.processIr(
|
||||||
onFunction: (IrFunction) -> R,
|
onFunction: (IrFunction) -> R,
|
||||||
onProperty: (IrProperty) -> R,
|
onProperty: (IrProperty) -> R,
|
||||||
@@ -161,6 +165,9 @@ internal abstract class IrExpectActualMatchingContext(
|
|||||||
override val RegularClassSymbolMarker.superTypes: List<KotlinTypeMarker>
|
override val RegularClassSymbolMarker.superTypes: List<KotlinTypeMarker>
|
||||||
get() = asIr().superTypes
|
get() = asIr().superTypes
|
||||||
|
|
||||||
|
override val RegularClassSymbolMarker.defaultType: KotlinTypeMarker
|
||||||
|
get() = asIr().defaultType
|
||||||
|
|
||||||
override val CallableSymbolMarker.isExpect: Boolean
|
override val CallableSymbolMarker.isExpect: Boolean
|
||||||
get() = processIr(
|
get() = processIr(
|
||||||
onFunction = { it.isExpect },
|
onFunction = { it.isExpect },
|
||||||
@@ -312,15 +319,31 @@ internal abstract class IrExpectActualMatchingContext(
|
|||||||
* When we match return types of (1) and (2) they both will have original type `S`, but from
|
* When we match return types of (1) and (2) they both will have original type `S`, but from
|
||||||
* perspective of module `platform` it should be replaced with `String`
|
* perspective of module `platform` it should be replaced with `String`
|
||||||
*/
|
*/
|
||||||
val actualizedExpectType = actualizingSubstitutor.substitute(expectType as IrType)
|
val actualizedExpectType = expectType.actualize()
|
||||||
val actualizedActualType = actualizingSubstitutor.substitute(actualType as IrType)
|
val actualizedActualType = actualType.actualize()
|
||||||
return AbstractTypeChecker.equalTypes(
|
return AbstractTypeChecker.equalTypes(
|
||||||
typeContext.newTypeCheckerState(errorTypesEqualToAnything = true, stubTypesEqualToAnything = false),
|
createTypeCheckerState(),
|
||||||
actualizedExpectType,
|
actualizedExpectType,
|
||||||
actualizedActualType
|
actualizedActualType
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun createTypeCheckerState(): TypeCheckerState {
|
||||||
|
return typeContext.newTypeCheckerState(errorTypesEqualToAnything = true, stubTypesEqualToAnything = false)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun actualTypeIsSubtypeOfExpectType(expectType: KotlinTypeMarker, actualType: KotlinTypeMarker): Boolean {
|
||||||
|
return AbstractTypeChecker.isSubtypeOf(
|
||||||
|
createTypeCheckerState(),
|
||||||
|
subType = actualType.actualize(),
|
||||||
|
superType = expectType.actualize()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun KotlinTypeMarker.actualize(): IrType {
|
||||||
|
return actualizingSubstitutor.substitute(this as IrType)
|
||||||
|
}
|
||||||
|
|
||||||
private val actualizingSubstitutor = ActualizingSubstitutor()
|
private val actualizingSubstitutor = ActualizingSubstitutor()
|
||||||
|
|
||||||
private inner class ActualizingSubstitutor : AbstractIrTypeSubstitutor() {
|
private inner class ActualizingSubstitutor : AbstractIrTypeSubstitutor() {
|
||||||
|
|||||||
+47
-11
@@ -122,17 +122,7 @@ object AbstractExpectActualCompatibilityChecker {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Subtract kotlin.Any from supertypes because it's implicitly added if no explicit supertype is specified,
|
if (!areCompatibleSupertypes(expectClassSymbol, actualClass, substitutor)) {
|
||||||
// and not added if an explicit supertype _is_ specified
|
|
||||||
val expectSupertypes = expectClassSymbol.superTypes.filterNot { it.typeConstructor().isAnyConstructor() }
|
|
||||||
val actualSupertypes = actualClass.superTypes.filterNot { it.typeConstructor().isAnyConstructor() }
|
|
||||||
if (
|
|
||||||
expectSupertypes.map { substitutor.safeSubstitute(it) }.any { expectSupertype ->
|
|
||||||
actualSupertypes.none { actualSupertype ->
|
|
||||||
areCompatibleExpectActualTypes(expectSupertype, actualSupertype)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
) {
|
|
||||||
return Incompatible.Supertypes
|
return Incompatible.Supertypes
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -145,6 +135,52 @@ object AbstractExpectActualCompatibilityChecker {
|
|||||||
return ExpectActualCompatibility.Compatible
|
return ExpectActualCompatibility.Compatible
|
||||||
}
|
}
|
||||||
|
|
||||||
|
context(ExpectActualMatchingContext<*>)
|
||||||
|
private fun areCompatibleSupertypes(
|
||||||
|
expectClassSymbol: RegularClassSymbolMarker,
|
||||||
|
actualClassSymbol: RegularClassSymbolMarker,
|
||||||
|
substitutor: TypeSubstitutorMarker,
|
||||||
|
): Boolean {
|
||||||
|
return when (allowTransitiveSupertypesActualization) {
|
||||||
|
false -> areCompatibleSupertypesOneByOne(expectClassSymbol, actualClassSymbol, substitutor)
|
||||||
|
true -> areCompatibleSupertypesTransitive(expectClassSymbol, actualClassSymbol, substitutor)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
context(ExpectActualMatchingContext<*>)
|
||||||
|
private fun areCompatibleSupertypesOneByOne(
|
||||||
|
expectClassSymbol: RegularClassSymbolMarker,
|
||||||
|
actualClassSymbol: RegularClassSymbolMarker,
|
||||||
|
substitutor: TypeSubstitutorMarker,
|
||||||
|
): Boolean {
|
||||||
|
// Subtract kotlin.Any from supertypes because it's implicitly added if no explicit supertype is specified,
|
||||||
|
// and not added if an explicit supertype _is_ specified
|
||||||
|
val expectSupertypes = expectClassSymbol.superTypes.filterNot { it.typeConstructor().isAnyConstructor() }
|
||||||
|
val actualSupertypes = actualClassSymbol.superTypes.filterNot { it.typeConstructor().isAnyConstructor() }
|
||||||
|
return expectSupertypes.all { expectSupertype ->
|
||||||
|
val substitutedExpectType = substitutor.safeSubstitute(expectSupertype)
|
||||||
|
actualSupertypes.any { actualSupertype ->
|
||||||
|
areCompatibleExpectActualTypes(substitutedExpectType, actualSupertype)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
context(ExpectActualMatchingContext<*>)
|
||||||
|
private fun areCompatibleSupertypesTransitive(
|
||||||
|
expectClassSymbol: RegularClassSymbolMarker,
|
||||||
|
actualClassSymbol: RegularClassSymbolMarker,
|
||||||
|
substitutor: TypeSubstitutorMarker,
|
||||||
|
): Boolean {
|
||||||
|
val expectSupertypes = expectClassSymbol.superTypes.filterNot { it.typeConstructor().isAnyConstructor() }
|
||||||
|
val actualType = actualClassSymbol.defaultType
|
||||||
|
return expectSupertypes.all { expectSupertype ->
|
||||||
|
actualTypeIsSubtypeOfExpectType(
|
||||||
|
expectType = substitutor.safeSubstitute(expectSupertype),
|
||||||
|
actualType = actualType
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
context(ExpectActualMatchingContext<*>)
|
context(ExpectActualMatchingContext<*>)
|
||||||
private fun areCompatibleClassScopes(
|
private fun areCompatibleClassScopes(
|
||||||
expectClassSymbol: RegularClassSymbolMarker,
|
expectClassSymbol: RegularClassSymbolMarker,
|
||||||
|
|||||||
+14
@@ -50,6 +50,14 @@ interface ExpectActualMatchingContext<T : DeclarationSymbolMarker> : TypeSystemC
|
|||||||
val allowClassActualizationWithWiderVisibility: Boolean
|
val allowClassActualizationWithWiderVisibility: Boolean
|
||||||
get() = false
|
get() = false
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This flag determines strategy for matching supertypes between expect and actual class
|
||||||
|
* - `false` means that expect and actual supertypes are matched one by one
|
||||||
|
* - `true` means that type of actual class should be subtype of each expect supertype of the expect class
|
||||||
|
*/
|
||||||
|
val allowTransitiveSupertypesActualization: Boolean
|
||||||
|
get() = false
|
||||||
|
|
||||||
val RegularClassSymbolMarker.classId: ClassId
|
val RegularClassSymbolMarker.classId: ClassId
|
||||||
val TypeAliasSymbolMarker.classId: ClassId
|
val TypeAliasSymbolMarker.classId: ClassId
|
||||||
val CallableSymbolMarker.callableId: CallableId
|
val CallableSymbolMarker.callableId: CallableId
|
||||||
@@ -74,6 +82,7 @@ interface ExpectActualMatchingContext<T : DeclarationSymbolMarker> : TypeSystemC
|
|||||||
val CallableSymbolMarker.visibility: Visibility
|
val CallableSymbolMarker.visibility: Visibility
|
||||||
|
|
||||||
val RegularClassSymbolMarker.superTypes: List<KotlinTypeMarker>
|
val RegularClassSymbolMarker.superTypes: List<KotlinTypeMarker>
|
||||||
|
val RegularClassSymbolMarker.defaultType: KotlinTypeMarker
|
||||||
|
|
||||||
val CallableSymbolMarker.isExpect: Boolean
|
val CallableSymbolMarker.isExpect: Boolean
|
||||||
val CallableSymbolMarker.isInline: Boolean
|
val CallableSymbolMarker.isInline: Boolean
|
||||||
@@ -125,6 +134,11 @@ interface ExpectActualMatchingContext<T : DeclarationSymbolMarker> : TypeSystemC
|
|||||||
actualType: KotlinTypeMarker?,
|
actualType: KotlinTypeMarker?,
|
||||||
): Boolean
|
): Boolean
|
||||||
|
|
||||||
|
fun actualTypeIsSubtypeOfExpectType(
|
||||||
|
expectType: KotlinTypeMarker,
|
||||||
|
actualType: KotlinTypeMarker
|
||||||
|
): Boolean
|
||||||
|
|
||||||
fun RegularClassSymbolMarker.isNotSamInterface(): Boolean
|
fun RegularClassSymbolMarker.isNotSamInterface(): Boolean
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
+8
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.types.model.*
|
|||||||
import org.jetbrains.kotlin.types.typeUtil.asTypeProjection
|
import org.jetbrains.kotlin.types.typeUtil.asTypeProjection
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.UnsafeCastFunction
|
import org.jetbrains.kotlin.utils.addToStdlib.UnsafeCastFunction
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.castAll
|
import org.jetbrains.kotlin.utils.addToStdlib.castAll
|
||||||
|
import org.jetbrains.kotlin.utils.addToStdlib.shouldNotBeCalled
|
||||||
import org.jetbrains.kotlin.utils.keysToMap
|
import org.jetbrains.kotlin.utils.keysToMap
|
||||||
|
|
||||||
class ClassicExpectActualMatchingContext(val platformModule: ModuleDescriptor) : ExpectActualMatchingContext<MemberDescriptor>,
|
class ClassicExpectActualMatchingContext(val platformModule: ModuleDescriptor) : ExpectActualMatchingContext<MemberDescriptor>,
|
||||||
@@ -212,6 +213,13 @@ class ClassicExpectActualMatchingContext(val platformModule: ModuleDescriptor) :
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override val RegularClassSymbolMarker.defaultType: KotlinTypeMarker
|
||||||
|
get() = asDescriptor().defaultType
|
||||||
|
|
||||||
|
override fun actualTypeIsSubtypeOfExpectType(expectType: KotlinTypeMarker, actualType: KotlinTypeMarker): Boolean {
|
||||||
|
shouldNotBeCalled("Checking for subtyping is used only in FIR and IR implementations")
|
||||||
|
}
|
||||||
|
|
||||||
@OptIn(TypeRefinement::class)
|
@OptIn(TypeRefinement::class)
|
||||||
private fun areCompatibleTypesViaTypeRefinement(a: KotlinType, b: KotlinType): Boolean {
|
private fun areCompatibleTypesViaTypeRefinement(a: KotlinType, b: KotlinType): Boolean {
|
||||||
val typeRefinerForPlatformModule = platformModule.getKotlinTypeRefiner().let { moduleRefiner ->
|
val typeRefinerForPlatformModule = platformModule.getKotlinTypeRefiner().let { moduleRefiner ->
|
||||||
|
|||||||
+31
@@ -0,0 +1,31 @@
|
|||||||
|
// IGNORE_BACKEND_K1: ANY
|
||||||
|
// IGNORE_REASON: new rules for supertypes matching are implemented only in K2
|
||||||
|
// IGNORE_BACKEND_K2: JS_IR
|
||||||
|
// IGNORE_REASON: `JsName` in js.translator/testData/_commonFiles/testUtils.kt is invisible for some reason
|
||||||
|
// IGNORE_BACKEND: WASM
|
||||||
|
// IGNORE_REASON: wasm tests don't support IGNORE_BACKEND_K1 directive
|
||||||
|
// LANGUAGE: +MultiPlatformProjects
|
||||||
|
// ISSUE: KT-59356
|
||||||
|
|
||||||
|
// MODULE: common
|
||||||
|
// FILE: common.kt
|
||||||
|
open class A {
|
||||||
|
open fun foo(): String = "Fail"
|
||||||
|
}
|
||||||
|
expect class C() : A
|
||||||
|
|
||||||
|
fun commonBox(): String {
|
||||||
|
return C().foo()
|
||||||
|
}
|
||||||
|
|
||||||
|
// MODULE: platform-jvm()()(common)
|
||||||
|
// FILE: main.kt
|
||||||
|
open class B : A() {
|
||||||
|
override fun foo(): String = "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
actual class C actual constructor() : B()
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
return commonBox()
|
||||||
|
}
|
||||||
Vendored
+39
@@ -0,0 +1,39 @@
|
|||||||
|
// TARGET_BACKEND: JVM_IR
|
||||||
|
// IGNORE_BACKEND_K1: ANY
|
||||||
|
// IGNORE_REASON: new rules for supertypes matching are implemented only in K2
|
||||||
|
// LANGUAGE: +MultiPlatformProjects
|
||||||
|
// ISSUE: KT-59356
|
||||||
|
|
||||||
|
// MODULE: common
|
||||||
|
open class A {
|
||||||
|
open fun foo(): String = "Fail"
|
||||||
|
}
|
||||||
|
expect class C1() : A
|
||||||
|
expect class C2() : A
|
||||||
|
|
||||||
|
fun commonBox(): String {
|
||||||
|
return C1().foo() + C2().foo()
|
||||||
|
}
|
||||||
|
|
||||||
|
// MODULE: platform-jvm()()(common)
|
||||||
|
// FILE: A_J.java
|
||||||
|
public class A_J {}
|
||||||
|
|
||||||
|
// FILE: B_J.java
|
||||||
|
public class B_J extends A_J {
|
||||||
|
public String foo() { return "O"; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: C2_J.java
|
||||||
|
public class C2_J extends B_J {
|
||||||
|
public String foo() { return "K"; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: main.kt
|
||||||
|
actual typealias A = A_J
|
||||||
|
actual class C1 : B_J()
|
||||||
|
actual typealias C2 = C2_J
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
return commonBox()
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
|
// MODULE: m1-common
|
||||||
|
expect open class A
|
||||||
|
expect class B : A
|
||||||
|
|
||||||
|
// MODULE: m1-jvm()()(m1-common)
|
||||||
|
actual typealias A = Any
|
||||||
|
actual class B
|
||||||
Generated
+6
@@ -22558,6 +22558,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
|
|||||||
runTest("compiler/testData/diagnostics/tests/multiplatform/smartcastOnMemberPropertyFromCommonClass.kt");
|
runTest("compiler/testData/diagnostics/tests/multiplatform/smartcastOnMemberPropertyFromCommonClass.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("supertypeActualizationWithAny.kt")
|
||||||
|
public void testSupertypeActualizationWithAny() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/multiplatform/supertypeActualizationWithAny.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("varSetterVisibility.kt")
|
@TestMetadata("varSetterVisibility.kt")
|
||||||
public void testVarSetterVisibility() throws Exception {
|
public void testVarSetterVisibility() throws Exception {
|
||||||
|
|||||||
+6
@@ -32085,6 +32085,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("transitiveSuperclassActualization.kt")
|
||||||
|
public void testTransitiveSuperclassActualization() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/transitiveSuperclassActualization.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("widerVisibilityInActualClassifier.kt")
|
@TestMetadata("widerVisibilityInActualClassifier.kt")
|
||||||
public void testWiderVisibilityInActualClassifier() throws Exception {
|
public void testWiderVisibilityInActualClassifier() throws Exception {
|
||||||
|
|||||||
+12
@@ -33669,6 +33669,18 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("transitiveSuperclassActualization.kt")
|
||||||
|
public void testTransitiveSuperclassActualization() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/transitiveSuperclassActualization.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("transitiveSuperclassActualization_java.kt")
|
||||||
|
public void testTransitiveSuperclassActualization_java() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/transitiveSuperclassActualization_java.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("valueClasses.kt")
|
@TestMetadata("valueClasses.kt")
|
||||||
public void testValueClasses() throws Exception {
|
public void testValueClasses() throws Exception {
|
||||||
|
|||||||
+12
@@ -33669,6 +33669,18 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack
|
|||||||
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("transitiveSuperclassActualization.kt")
|
||||||
|
public void testTransitiveSuperclassActualization() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/transitiveSuperclassActualization.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("transitiveSuperclassActualization_java.kt")
|
||||||
|
public void testTransitiveSuperclassActualization_java() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/transitiveSuperclassActualization_java.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("valueClasses.kt")
|
@TestMetadata("valueClasses.kt")
|
||||||
public void testValueClasses() throws Exception {
|
public void testValueClasses() throws Exception {
|
||||||
|
|||||||
+5
@@ -27360,6 +27360,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
|||||||
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/nonExternalEquals.kt");
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/nonExternalEquals.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("transitiveSuperclassActualization.kt")
|
||||||
|
public void testTransitiveSuperclassActualization() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/transitiveSuperclassActualization.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("widerVisibilityInActualClassifier.kt")
|
@TestMetadata("widerVisibilityInActualClassifier.kt")
|
||||||
public void testWiderVisibilityInActualClassifier() throws Exception {
|
public void testWiderVisibilityInActualClassifier() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/widerVisibilityInActualClassifier.kt");
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/widerVisibilityInActualClassifier.kt");
|
||||||
|
|||||||
+6
@@ -23439,6 +23439,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
|||||||
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("transitiveSuperclassActualization.kt")
|
||||||
|
public void testTransitiveSuperclassActualization() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/transitiveSuperclassActualization.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("widerVisibilityInActualClassifier.kt")
|
@TestMetadata("widerVisibilityInActualClassifier.kt")
|
||||||
public void testWiderVisibilityInActualClassifier() throws Exception {
|
public void testWiderVisibilityInActualClassifier() throws Exception {
|
||||||
|
|||||||
+6
@@ -23607,6 +23607,12 @@ public class FirJsCodegenBoxTestGenerated extends AbstractFirJsCodegenBoxTest {
|
|||||||
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("transitiveSuperclassActualization.kt")
|
||||||
|
public void testTransitiveSuperclassActualization() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/transitiveSuperclassActualization.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("widerVisibilityInActualClassifier.kt")
|
@TestMetadata("widerVisibilityInActualClassifier.kt")
|
||||||
public void testWiderVisibilityInActualClassifier() throws Exception {
|
public void testWiderVisibilityInActualClassifier() throws Exception {
|
||||||
|
|||||||
+6
@@ -23607,6 +23607,12 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
|
|||||||
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("transitiveSuperclassActualization.kt")
|
||||||
|
public void testTransitiveSuperclassActualization() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/transitiveSuperclassActualization.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("widerVisibilityInActualClassifier.kt")
|
@TestMetadata("widerVisibilityInActualClassifier.kt")
|
||||||
public void testWiderVisibilityInActualClassifier() throws Exception {
|
public void testWiderVisibilityInActualClassifier() throws Exception {
|
||||||
|
|||||||
+6
@@ -23607,6 +23607,12 @@ public class IrJsES6CodegenBoxTestGenerated extends AbstractIrJsES6CodegenBoxTes
|
|||||||
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("transitiveSuperclassActualization.kt")
|
||||||
|
public void testTransitiveSuperclassActualization() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/transitiveSuperclassActualization.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("widerVisibilityInActualClassifier.kt")
|
@TestMetadata("widerVisibilityInActualClassifier.kt")
|
||||||
public void testWiderVisibilityInActualClassifier() throws Exception {
|
public void testWiderVisibilityInActualClassifier() throws Exception {
|
||||||
|
|||||||
+6
@@ -26673,6 +26673,12 @@ public class FirNativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTe
|
|||||||
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("transitiveSuperclassActualization.kt")
|
||||||
|
public void testTransitiveSuperclassActualization() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/transitiveSuperclassActualization.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("widerVisibilityInActualClassifier.kt")
|
@TestMetadata("widerVisibilityInActualClassifier.kt")
|
||||||
public void testWiderVisibilityInActualClassifier() throws Exception {
|
public void testWiderVisibilityInActualClassifier() throws Exception {
|
||||||
|
|||||||
+6
@@ -27279,6 +27279,12 @@ public class FirNativeCodegenBoxTestNoPLGenerated extends AbstractNativeCodegenB
|
|||||||
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("transitiveSuperclassActualization.kt")
|
||||||
|
public void testTransitiveSuperclassActualization() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/transitiveSuperclassActualization.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("widerVisibilityInActualClassifier.kt")
|
@TestMetadata("widerVisibilityInActualClassifier.kt")
|
||||||
public void testWiderVisibilityInActualClassifier() throws Exception {
|
public void testWiderVisibilityInActualClassifier() throws Exception {
|
||||||
|
|||||||
+6
@@ -26371,6 +26371,12 @@ public class NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTest
|
|||||||
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("transitiveSuperclassActualization.kt")
|
||||||
|
public void testTransitiveSuperclassActualization() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/transitiveSuperclassActualization.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("widerVisibilityInActualClassifier.kt")
|
@TestMetadata("widerVisibilityInActualClassifier.kt")
|
||||||
public void testWiderVisibilityInActualClassifier() throws Exception {
|
public void testWiderVisibilityInActualClassifier() throws Exception {
|
||||||
|
|||||||
+6
@@ -26674,6 +26674,12 @@ public class NativeCodegenBoxTestNoPLGenerated extends AbstractNativeCodegenBoxT
|
|||||||
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("transitiveSuperclassActualization.kt")
|
||||||
|
public void testTransitiveSuperclassActualization() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/transitiveSuperclassActualization.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("widerVisibilityInActualClassifier.kt")
|
@TestMetadata("widerVisibilityInActualClassifier.kt")
|
||||||
public void testWiderVisibilityInActualClassifier() throws Exception {
|
public void testWiderVisibilityInActualClassifier() throws Exception {
|
||||||
|
|||||||
Generated
+5
@@ -20968,6 +20968,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest
|
|||||||
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/removeExpectDeclarationsFromMetadata.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("transitiveSuperclassActualization.kt")
|
||||||
|
public void testTransitiveSuperclassActualization() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/transitiveSuperclassActualization.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("widerVisibilityInActualClassifier.kt")
|
@TestMetadata("widerVisibilityInActualClassifier.kt")
|
||||||
public void testWiderVisibilityInActualClassifier() throws Exception {
|
public void testWiderVisibilityInActualClassifier() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/widerVisibilityInActualClassifier.kt");
|
runTest("compiler/testData/codegen/box/multiplatform/k2/basic/widerVisibilityInActualClassifier.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user