[KMP] Allow matching expect ctorless final classes to objects

both directly and via typealias.

This is a possible fix to KT-59747
This commit is contained in:
marat.akhin
2023-07-20 18:16:06 +02:00
committed by Space Team
parent 6df9ce23f7
commit ae4fab8483
30 changed files with 1273 additions and 1 deletions
@@ -0,0 +1,47 @@
// MODULE: m1-common
// FILE: common.kt
expect class E01
<!INCOMPATIBLE_MATCHING{JVM}!>expect class E02()<!>
<!INCOMPATIBLE_MATCHING{JVM}!>expect open class E03<!>
<!INCOMPATIBLE_MATCHING{JVM}!>expect class E04 {
constructor()
}<!>
<!INCOMPATIBLE_MATCHING{JVM}!>expect class E05(e: E01)<!>
<!INCOMPATIBLE_MATCHING{JVM}!>expect class E06 {
constructor(e: E02)
}<!>
<!INCOMPATIBLE_MATCHING{JVM}!>expect interface I01<!>
expect class M01 {
fun foo()
}
<!INCOMPATIBLE_MATCHING{JVM}!>expect enum class ENUM01<!>
<!INCOMPATIBLE_MATCHING{JVM}!>expect annotation class ANNO01<!>
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual object E01
actual object <!NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS!>E02<!>
actual object <!ACTUAL_WITHOUT_EXPECT!>E03<!>
actual object <!NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS!>E04<!>
actual object <!NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS!>E05<!>
actual object <!NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS!>E06<!>
actual object <!ACTUAL_WITHOUT_EXPECT!>I01<!>
actual object M01 {
actual fun foo() {}
}
actual object <!ACTUAL_WITHOUT_EXPECT!>ENUM01<!>
actual object <!ACTUAL_WITHOUT_EXPECT!>ANNO01<!>
@@ -0,0 +1,47 @@
// MODULE: m1-common
// FILE: common.kt
expect class E01
expect class E02()
expect open class E03
expect class E04 {
constructor()
}
expect class E05(e: E01)
expect class E06 {
constructor(e: E02)
}
expect interface I01
expect class M01 {
fun foo()
}
expect enum class ENUM01
expect annotation class ANNO01
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual object E01
actual <!ACTUAL_WITHOUT_EXPECT!>object<!> E02
actual <!ACTUAL_WITHOUT_EXPECT!>object<!> E03
actual <!ACTUAL_WITHOUT_EXPECT!>object<!> E04
actual <!ACTUAL_WITHOUT_EXPECT!>object<!> E05
actual <!ACTUAL_WITHOUT_EXPECT!>object<!> E06
actual <!ACTUAL_WITHOUT_EXPECT!>object<!> I01
actual object M01 {
actual fun foo() {}
}
actual <!ACTUAL_WITHOUT_EXPECT!>object<!> ENUM01
actual <!ACTUAL_WITHOUT_EXPECT!>object<!> ANNO01
@@ -0,0 +1,49 @@
// MODULE: m1-common
// FILE: common.kt
expect class E01
<!INCOMPATIBLE_MATCHING{JVM}!>expect class E02()<!>
<!INCOMPATIBLE_MATCHING{JVM}!>expect open class E03<!>
<!INCOMPATIBLE_MATCHING{JVM}!>expect class E04 {
constructor()
}<!>
<!INCOMPATIBLE_MATCHING{JVM}!>expect class E05(e: E01)<!>
<!INCOMPATIBLE_MATCHING{JVM}!>expect class E06 {
constructor(e: E02)
}<!>
<!INCOMPATIBLE_MATCHING{JVM}!>expect interface I01<!>
expect class M01 {
fun foo()
}
<!INCOMPATIBLE_MATCHING{JVM}!>expect enum class ENUM01<!>
<!INCOMPATIBLE_MATCHING{JVM}!>expect annotation class ANNO01<!>
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
object ActualObject {
fun foo() {}
}
actual typealias E01 = ActualObject
actual typealias <!NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS!>E02<!> = ActualObject
actual typealias <!ACTUAL_WITHOUT_EXPECT!>E03<!> = ActualObject
actual typealias <!NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS!>E04<!> = ActualObject
actual typealias <!NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS!>E05<!> = ActualObject
actual typealias <!NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS!>E06<!> = ActualObject
actual typealias <!ACTUAL_WITHOUT_EXPECT!>I01<!> = ActualObject
actual typealias M01 = ActualObject
actual typealias <!ACTUAL_WITHOUT_EXPECT!>ENUM01<!> = ActualObject
actual typealias <!ACTUAL_WITHOUT_EXPECT!>ANNO01<!> = ActualObject
@@ -0,0 +1,49 @@
// MODULE: m1-common
// FILE: common.kt
expect class E01
expect class E02()
expect open class E03
expect class E04 {
constructor()
}
expect class E05(e: E01)
expect class E06 {
constructor(e: E02)
}
expect interface I01
expect class M01 {
fun foo()
}
expect enum class ENUM01
expect annotation class ANNO01
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
object ActualObject {
fun foo() {}
}
actual typealias E01 = ActualObject
actual typealias <!ACTUAL_WITHOUT_EXPECT!>E02<!> = ActualObject
actual typealias <!ACTUAL_WITHOUT_EXPECT!>E03<!> = ActualObject
actual typealias <!ACTUAL_WITHOUT_EXPECT!>E04<!> = ActualObject
actual typealias <!ACTUAL_WITHOUT_EXPECT!>E05<!> = ActualObject
actual typealias <!ACTUAL_WITHOUT_EXPECT!>E06<!> = ActualObject
actual typealias <!ACTUAL_WITHOUT_EXPECT!>I01<!> = ActualObject
actual typealias M01 = ActualObject
actual typealias <!ACTUAL_WITHOUT_EXPECT!>ENUM01<!> = ActualObject
actual typealias <!ACTUAL_WITHOUT_EXPECT!>ANNO01<!> = ActualObject