[IR] Fix incorrect matching of nested classes when actualized via typealias

Also, add tests for the cases when expect and actual nested classes
have no compatible matching to check new logic doesn't crash.

^KT-31636
This commit is contained in:
Roman Efremov
2023-11-20 14:06:04 +01:00
committed by Space Team
parent d343e40ac5
commit 205690b220
22 changed files with 228 additions and 129 deletions
@@ -16,5 +16,5 @@ annotation class AnnImpl {
actual typealias Ann = AnnImpl
<!ACTUAL_ANNOTATIONS_NOT_MATCH_EXPECT!>@AnnImpl.Nested
actual fun foo() {}<!>
@AnnImpl.Nested
actual fun foo() {}
@@ -1,20 +0,0 @@
// MODULE: m1-common
// FILE: common.kt
expect annotation class Ann() {
annotation class Nested()
}
@Ann.Nested
expect fun foo()
// MODULE: m1-jvm()()(m1-common)
// FILE: jvm.kt
annotation class AnnImpl {
annotation class Nested
}
actual typealias Ann = AnnImpl
@AnnImpl.Nested
actual fun foo() {}
@@ -0,0 +1,9 @@
// FIR_IDENTICAL
// MODULE: m1-common
// FILE: common.kt
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
class FooImpl
actual typealias <!ACTUAL_WITHOUT_EXPECT!>Foo<!> = FooImpl
@@ -23,5 +23,5 @@ class FooImpl {
actual typealias Foo = FooImpl
actual annotation class Ann(
actual val p: KClass<*> = <!ACTUAL_ANNOTATION_CONFLICTING_DEFAULT_ARGUMENT_VALUE!>FooImpl.Nested::class<!>
actual val p: KClass<*> = FooImpl.Nested::class
)
@@ -1,27 +0,0 @@
// MODULE: m1-common
// FILE: common.kt
import kotlin.reflect.KClass
expect annotation class Ann(
val p: KClass<*> = Foo.Nested::class
)
expect class Foo {
class Nested
}
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
import kotlin.reflect.KClass
class FooImpl {
class Nested
}
actual typealias Foo = FooImpl
actual annotation class Ann(
actual val p: KClass<*> = FooImpl.Nested::class
)
@@ -1,8 +1,8 @@
// MODULE: m1-common
// FILE: common.kt
<!EXPECT_ACTUAL_INCOMPATIBILITY{JVM}!>expect class DefaultArgsInNestedClass {
<!EXPECT_ACTUAL_INCOMPATIBILITY{JVM}!>annotation class Nested<!EXPECT_ACTUAL_INCOMPATIBILITY{JVM}!>(val p: String = "")<!><!>
}<!>
expect class DefaultArgsInNestedClass {
annotation class Nested(val p: String = "")
}
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
@@ -10,5 +10,5 @@ class DefaultArgsInNestedClassImpl {
annotation class Nested(val p: String = "")
}
// Incompatible because of bug KT-31636
// Incompatible in K1 because of bug KT-31636
actual typealias DefaultArgsInNestedClass = DefaultArgsInNestedClassImpl
@@ -10,5 +10,5 @@ class DefaultArgsInNestedClassImpl {
annotation class Nested(val p: String = "")
}
// Incompatible because of bug KT-31636
// Incompatible in K1 because of bug KT-31636
actual typealias <!NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS!>DefaultArgsInNestedClass<!> = DefaultArgsInNestedClassImpl
@@ -1,14 +0,0 @@
// MODULE: m1-common
// FILE: common.kt
expect class DefaultArgsInNestedClass {
annotation class Nested(val p: String = "")
}
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
class DefaultArgsInNestedClassImpl {
annotation class Nested(val p: String = "")
}
// Incompatible because of bug KT-31636
actual typealias <!NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS!>DefaultArgsInNestedClass<!> = DefaultArgsInNestedClassImpl
@@ -1,17 +1,15 @@
// FIR_IDENTICAL
// MODULE: m1-common
// FILE: common.kt
expect class Foo {
class Inner {
fun foo(p: List<Inner>)
}
class Inner
}
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
class FooImpl {
class Inner {
fun foo(p: List<Inner>) {}
}
class Inner
class Extra
}
actual typealias Foo = FooImpl
@@ -1,16 +1,16 @@
// MODULE: m1-common
// FILE: common.kt
<!EXPECT_ACTUAL_INCOMPATIBILITY{JVM}!>expect class Foo {
<!EXPECT_ACTUAL_INCOMPATIBILITY{JVM}!>class Inner<!EXPECT_ACTUAL_INCOMPATIBILITY{JVM}!>()<!><!>
}<!>
expect class Foo {
class Inner()
}
<!EXPECT_ACTUAL_INCOMPATIBILITY{JVM}!>expect class SeveralInner {
<!EXPECT_ACTUAL_INCOMPATIBILITY{JVM}!>class Inner1 {
<!EXPECT_ACTUAL_INCOMPATIBILITY{JVM}!>class Inner2 {
<!EXPECT_ACTUAL_INCOMPATIBILITY{JVM}!>class Inner3<!EXPECT_ACTUAL_INCOMPATIBILITY{JVM}!>()<!><!>
}<!>
}<!>
}<!>
expect class SeveralInner {
class Inner1 {
class Inner2 {
class Inner3()
}
}
}
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
@@ -1,31 +0,0 @@
// MODULE: m1-common
// FILE: common.kt
expect class Foo {
class Inner()
}
expect class SeveralInner {
class Inner1 {
class Inner2 {
class Inner3()
}
}
}
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
class FooImpl {
class Inner
}
actual typealias Foo = FooImpl
class SeveralInnerImpl {
class Inner1 {
class Inner2 {
class Inner3
}
}
}
actual typealias SeveralInner = SeveralInnerImpl
@@ -1,10 +1,10 @@
// MODULE: m1-common
// FILE: common.kt
<!EXPECT_ACTUAL_INCOMPATIBILITY{JVM}!>expect class Foo {
<!EXPECT_ACTUAL_INCOMPATIBILITY{JVM}!>class Inner {
<!EXPECT_ACTUAL_MISMATCH{JVM}!>fun foo(p: List<Inner>)<!>
}<!>
}<!>
expect class Foo {
class Inner {
fun foo(p: List<Inner>)
}
}
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
@@ -0,0 +1,14 @@
// MODULE: m1-common()()()
// FILE: common.kt
<!EXPECT_ACTUAL_INCOMPATIBILITY{JVM}!>expect class Foo {
class Inner
<!NO_ACTUAL_FOR_EXPECT{JVM}!>class AbsentOnactual<!>
}<!>
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
class FooImpl {
class Inner
}
actual typealias <!NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS!>Foo<!> = FooImpl
@@ -0,0 +1,14 @@
// MODULE: m1-common()()()
// FILE: common.kt
expect class Foo {
class Inner
class AbsentOnactual
}
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
class FooImpl {
class Inner
}
actual typealias <!NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS!>Foo<!> = FooImpl
@@ -0,0 +1,14 @@
// MODULE: m1-common()()()
// FILE: common.kt
expect class Foo {
class Inner
class AbsentOnactual
}
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
class FooImpl {
class Inner
}
actual typealias <!NO_ACTUAL_CLASS_MEMBER_FOR_EXPECTED_CLASS!>Foo<!> = FooImpl