[FE 1.0] 2/2 Don't report a warning when new members are added to open expect actualization

^KT-62655 Fixed
This commit is contained in:
Nikita Bobko
2023-10-19 17:58:50 +02:00
committed by Space Team
parent 1d4ab50047
commit fa89b8b0f1
55 changed files with 172 additions and 457 deletions
@@ -1,19 +0,0 @@
// MODULE: m1-common
// FILE: common.kt
expect open class Foo {
fun existingMethod()
val existingParam: Int
}
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual typealias Foo = FooImpl
open class FooImpl {
fun existingMethod() {}
val existingParam: Int = 904
fun injectedMethod() {} // accidential override can happen with this injected fun. That's why it's prohibited
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// MODULE: m1-common
// FILE: common.kt
@@ -9,11 +10,11 @@ expect open class Foo {
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual typealias <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>Foo<!> = FooImpl
actual typealias Foo = FooImpl
open class FooImpl {
fun existingMethod() {}
val existingParam: Int = 904
fun injectedMethod() {} // accidential override can happen with this injected fun. That's why it's prohibited
fun injectedMethod() {}
}
@@ -1,15 +0,0 @@
// MODULE: m1-common
// FILE: common.kt
expect open class Foo {
fun foo()
}
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open class Foo {
actual fun foo() {}
fun Int.foo() {} // accidential override can happen with this injected fun. That's why it's prohibited
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// MODULE: m1-common
// FILE: common.kt
@@ -8,8 +9,8 @@ expect open class Foo {
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>class Foo<!> {
actual open class Foo {
actual fun foo() {}
fun Int.<!NON_ACTUAL_MEMBER_DECLARED_IN_EXPECT_NON_FINAL_CLASSIFIER_ACTUALIZATION_WARNING!>foo<!>() {} // accidential override can happen with this injected fun. That's why it's prohibited
fun Int.foo() {}
}
@@ -1,15 +0,0 @@
// MODULE: m1-common
// FILE: common.kt
open class Base {
fun <T> foo(t: T) {}
}
expect open class Foo : Base
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open class Foo : Base() {
fun <T : Comparable<T>> foo(t: T) {}
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// MODULE: m1-common
// FILE: common.kt
@@ -10,6 +11,6 @@ expect open class Foo : Base
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>class Foo<!> : Base() {
fun <T : Comparable<T>> <!NON_ACTUAL_MEMBER_DECLARED_IN_EXPECT_NON_FINAL_CLASSIFIER_ACTUALIZATION_WARNING!>foo<!>(t: T) {}
actual open class Foo : Base() {
fun <T : Comparable<T>> foo(t: T) {}
}
@@ -1,17 +0,0 @@
// MODULE: m1-common
// FILE: common.kt
expect open class Foo {
fun existingMethod()
val existingParam: Int
}
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open class Foo {
actual fun existingMethod() {}
actual val existingParam: Int = 904
internal fun injectedMethod() {} // accidential override can happen with this injected fun. That's why it's prohibited
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// MODULE: m1-common
// FILE: common.kt
@@ -9,9 +10,9 @@ expect open class Foo {
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>class Foo<!> {
actual open class Foo {
actual fun existingMethod() {}
actual val existingParam: Int = 904
internal fun <!NON_ACTUAL_MEMBER_DECLARED_IN_EXPECT_NON_FINAL_CLASSIFIER_ACTUALIZATION_WARNING!>injectedMethod<!>() {} // accidential override can happen with this injected fun. That's why it's prohibited
internal fun injectedMethod() {}
}
@@ -1,17 +0,0 @@
// MODULE: m1-common
// FILE: common.kt
expect open class Foo {
fun existingMethod()
val existingParam: Int
}
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open class Foo {
actual fun existingMethod() {}
actual val existingParam: Int = 904
protected fun injectedMethod() {} // accidential override can happen with this injected fun. That's why it's prohibited
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// MODULE: m1-common
// FILE: common.kt
@@ -9,9 +10,9 @@ expect open class Foo {
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>class Foo<!> {
actual open class Foo {
actual fun existingMethod() {}
actual val existingParam: Int = 904
protected fun <!NON_ACTUAL_MEMBER_DECLARED_IN_EXPECT_NON_FINAL_CLASSIFIER_ACTUALIZATION_WARNING!>injectedMethod<!>() {} // accidential override can happen with this injected fun. That's why it's prohibited
protected fun injectedMethod() {}
}
@@ -1,17 +0,0 @@
// MODULE: m1-common
// FILE: common.kt
expect open class Foo {
fun existingMethod()
val existingParam: Int
}
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open class Foo {
actual fun existingMethod() {}
actual val existingParam: Int = 904
fun injectedMethod() {} // accidential override can happen with this injected fun. That's why it's prohibited
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// MODULE: m1-common
// FILE: common.kt
@@ -9,9 +10,9 @@ expect open class Foo {
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>class Foo<!> {
actual open class Foo {
actual fun existingMethod() {}
actual val existingParam: Int = 904
fun <!NON_ACTUAL_MEMBER_DECLARED_IN_EXPECT_NON_FINAL_CLASSIFIER_ACTUALIZATION_WARNING!>injectedMethod<!>() {} // accidential override can happen with this injected fun. That's why it's prohibited
fun injectedMethod() {}
}
@@ -1,19 +0,0 @@
// MODULE: m1-common
// FILE: common.kt
expect open class Foo {
fun existingMethod()
}
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual typealias Foo = FooImpl
// FILE: Foo.java
public class FooImpl {
public void existingMethod() {}
public void injectedMethod() {}
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// MODULE: m1-common
// FILE: common.kt
@@ -8,7 +9,7 @@ expect open class Foo {
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual typealias <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>Foo<!> = FooImpl
actual typealias Foo = FooImpl
// FILE: Foo.java
@@ -1,15 +0,0 @@
// MODULE: m1-common
// FILE: common.kt
expect open class Foo {
fun foo()
}
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open class Foo {
actual fun foo() {}
fun foo(overloaded: Int) {} // accidential override can happen with this injected fun. That's why it's prohibited
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// MODULE: m1-common
// FILE: common.kt
@@ -8,8 +9,8 @@ expect open class Foo {
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>class Foo<!> {
actual open class Foo {
actual fun foo() {}
fun <!NON_ACTUAL_MEMBER_DECLARED_IN_EXPECT_NON_FINAL_CLASSIFIER_ACTUALIZATION_WARNING!>foo<!>(overloaded: Int) {} // accidential override can happen with this injected fun. That's why it's prohibited
fun foo(overloaded: Int) {}
}
@@ -1,15 +0,0 @@
// MODULE: m1-common
// FILE: common.kt
open class Base<T> {
open fun foo(t: T) {}
}
expect open class Foo<R> : Base<R>
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open class Foo<R>() : Base<R>() {
fun <T> foo(t: T) {}
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// MODULE: m1-common
// FILE: common.kt
@@ -10,6 +11,6 @@ expect open class Foo<R> : Base<R>
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>class Foo<!><R>() : Base<R>() {
fun <T> <!NON_ACTUAL_MEMBER_DECLARED_IN_EXPECT_NON_FINAL_CLASSIFIER_ACTUALIZATION_WARNING!>foo<!>(t: T) {}
actual open class Foo<R>() : Base<R>() {
fun <T> foo(t: T) {}
}
@@ -1,17 +0,0 @@
// MODULE: m1-common
// FILE: common.kt
expect open class Foo {
fun existingFun()
val existingParam: Int
}
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open class Foo {
actual fun existingFun() {}
actual val existingParam: Int = 904
val injectedProperty = 1
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// MODULE: m1-common
// FILE: common.kt
@@ -9,9 +10,9 @@ expect open class Foo {
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>class Foo<!> {
actual open class Foo {
actual fun existingFun() {}
actual val existingParam: Int = 904
val <!NON_ACTUAL_MEMBER_DECLARED_IN_EXPECT_NON_FINAL_CLASSIFIER_ACTUALIZATION_WARNING!>injectedProperty<!> = 1
val injectedProperty = 1
}
@@ -1,15 +0,0 @@
// MODULE: m1-common
// FILE: common.kt
expect open class Foo {
fun foo(): Int
}
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open class Foo {
actual fun foo(): Int = 904
val foo: Int = 42
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// MODULE: m1-common
// FILE: common.kt
@@ -8,8 +9,8 @@ expect open class Foo {
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>class Foo<!> {
actual open class Foo {
actual fun foo(): Int = 904
val <!NON_ACTUAL_MEMBER_DECLARED_IN_EXPECT_NON_FINAL_CLASSIFIER_ACTUALIZATION_WARNING!>foo<!>: Int = 42
val foo: Int = 42
}
@@ -1,15 +0,0 @@
// MODULE: m1-common
// FILE: common.kt
open class Base {
open fun foo(t: String) {}
}
expect open class Foo : Base
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open class Foo : Base() {
open fun foo(vararg t: String) {} // injected
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// MODULE: m1-common
// FILE: common.kt
@@ -10,6 +11,6 @@ expect open class Foo : Base
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>class Foo<!> : Base() {
open fun <!NON_ACTUAL_MEMBER_DECLARED_IN_EXPECT_NON_FINAL_CLASSIFIER_ACTUALIZATION_WARNING!>foo<!>(vararg t: String) {} // injected
actual open class Foo : Base() {
open fun foo(vararg t: String) {} // injected
}
@@ -1,14 +0,0 @@
// MODULE: m1-common
// FILE: common.kt
expect open class Foo {
fun <T> foo(t: T)
}
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open class Foo {
actual fun <T> foo(t: T) {}
fun foo(t: String) {}
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// MODULE: m1-common
// FILE: common.kt
@@ -8,7 +9,7 @@ expect open class Foo {
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>class Foo<!> {
actual open class Foo {
actual fun <T> foo(t: T) {}
fun <!NON_ACTUAL_MEMBER_DECLARED_IN_EXPECT_NON_FINAL_CLASSIFIER_ACTUALIZATION_WARNING!>foo<!>(t: String) {}
fun foo(t: String) {}
}
@@ -1,22 +0,0 @@
// MODULE: m1-common
// FILE: common.kt
// Rules for expect actual matching are ad-hoc for nested classes. That's why this test exist
expect class Outer {
open class Foo {
fun existingMethod()
val existingParam: Int
}
}
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual class Outer {
actual open class Foo {
actual fun existingMethod() {}
actual val existingParam: Int = 904
fun injectedMethod() {} // accidential override can happen with this injected fun. That's why it's prohibited
}
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// MODULE: m1-common
// FILE: common.kt
@@ -13,10 +14,10 @@ expect class Outer {
// FILE: jvm.kt
actual class Outer {
actual open <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>class Foo<!> {
actual open class Foo {
actual fun existingMethod() {}
actual val existingParam: Int = 904
fun <!NON_ACTUAL_MEMBER_DECLARED_IN_EXPECT_NON_FINAL_CLASSIFIER_ACTUALIZATION_WARNING!>injectedMethod<!>() {} // accidential override can happen with this injected fun. That's why it's prohibited
fun injectedMethod() {}
}
}
@@ -0,0 +1,21 @@
// MODULE: m1-common
// FILE: common.kt
expect open class Base
expect open class Foo : Base {
fun foo(param: Int)
}
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open class Base {
open fun foo(): Any = ""
}
actual open class Foo : Base() {
override fun foo(): String = ""
actual fun foo(param: Int) {}
}
@@ -0,0 +1,21 @@
// MODULE: m1-common
// FILE: common.kt
expect open class Base
expect open class Foo : Base {
fun foo(param: Int)
}
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open class Base {
open fun foo(): Any = ""
}
actual open <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>class Foo<!> : Base() {
override fun foo(): <!RETURN_TYPE_CHANGED_IN_NON_FINAL_EXPECT_CLASSIFIER_ACTUALIZATION_WARNING!>String<!> = ""
actual fun foo(param: Int) {}
}
@@ -20,8 +20,8 @@ actual open <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_C
actual fun existingMethod() {}
actual val existingParam: Int = 904
fun <!NON_ACTUAL_MEMBER_DECLARED_IN_EXPECT_NON_FINAL_CLASSIFIER_ACTUALIZATION_WARNING!>injectedMethod<!>() {}
val <!NON_ACTUAL_MEMBER_DECLARED_IN_EXPECT_NON_FINAL_CLASSIFIER_ACTUALIZATION_WARNING!>injectedProperty<!>: Int = 42
fun injectedMethod() {}
val injectedProperty: Int = 42
override fun overrideReturnType(): <!RETURN_TYPE_CHANGED_IN_NON_FINAL_EXPECT_CLASSIFIER_ACTUALIZATION_WARNING!>String<!> = ""
<!MODALITY_CHANGED_IN_NON_FINAL_EXPECT_CLASSIFIER_ACTUALIZATION_WARNING!>final<!> override fun overrideModality1(): Any = ""
<!MODALITY_CHANGED_IN_NON_FINAL_EXPECT_CLASSIFIER_ACTUALIZATION_WARNING!>final<!> override fun overrideModality2(): Any = ""
@@ -14,9 +14,9 @@ expect open class Foo : Base {
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>class Base<!> {
actual open class Base {
actual fun existingMethodInBase() {}
open fun <!NON_ACTUAL_MEMBER_DECLARED_IN_EXPECT_NON_FINAL_CLASSIFIER_ACTUALIZATION_WARNING!>injected<!>(): Any = ""
open fun injected(): Any = ""
}
actual open <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>class Foo<!> : Base() {
@@ -16,9 +16,9 @@ expect open class Foo : Transitive {
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>class Base<!><T> {
actual open class Base<T> {
actual fun existingMethodInBase(param: T) {}
open fun <!NON_ACTUAL_MEMBER_DECLARED_IN_EXPECT_NON_FINAL_CLASSIFIER_ACTUALIZATION_WARNING!>injected<!>(param: T): Any = ""
open fun injected(param: T): Any = ""
}
actual open <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>class Foo<!> : Transitive() {
@@ -1,25 +0,0 @@
// WITH_STDLIB
// MODULE: m1-common
// FILE: common.kt
expect open class Base {
fun existingMethodInBase()
}
expect open class Foo : Base {
fun existingMethod()
val existingParam: Int
}
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open class Base {
actual fun existingMethodInBase() {}
fun injected() {}
}
actual open class Foo : Base() {
actual fun existingMethod() {}
actual val existingParam: Int = 904
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// WITH_STDLIB
// MODULE: m1-common
// FILE: common.kt
@@ -14,9 +15,9 @@ expect open class Foo : Base {
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>class Base<!> {
actual open class Base {
actual fun existingMethodInBase() {}
fun <!NON_ACTUAL_MEMBER_DECLARED_IN_EXPECT_NON_FINAL_CLASSIFIER_ACTUALIZATION_WARNING!>injected<!>() {}
fun injected() {}
}
actual open class Foo : Base() {
@@ -1,27 +0,0 @@
// WITH_STDLIB
// MODULE: m1-common
// FILE: common.kt
expect open class Base<T>() {
fun existingMethodInBase(param: T)
}
open class Transitive : Base<String>()
expect open class Foo : Transitive {
fun existingMethod()
val existingParam: Int
}
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open class Base<T> {
actual fun existingMethodInBase(param: T) {}
fun injected() {}
}
actual open class Foo : Transitive() {
actual fun existingMethod() {}
actual val existingParam: Int = 904
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// WITH_STDLIB
// MODULE: m1-common
// FILE: common.kt
@@ -16,9 +17,9 @@ expect open class Foo : Transitive {
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>class Base<!><T> {
actual open class Base<T> {
actual fun existingMethodInBase(param: T) {}
fun <!NON_ACTUAL_MEMBER_DECLARED_IN_EXPECT_NON_FINAL_CLASSIFIER_ACTUALIZATION_WARNING!>injected<!>() {}
fun injected() {}
}
actual open class Foo : Transitive() {
@@ -1,27 +0,0 @@
// WITH_STDLIB
// MODULE: m1-common
// FILE: common.kt
expect open class Base() {
fun existingMethodInBase()
}
expect open class Foo : Base {
fun existingMethod()
val existingParam: Int
}
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual typealias Base = BaseImpl
open class BaseImpl {
fun existingMethodInBase() {}
fun injected() {}
}
actual open class Foo : Base() {
actual fun existingMethod() {}
actual val existingParam: Int = 904
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// WITH_STDLIB
// MODULE: m1-common
// FILE: common.kt
@@ -14,7 +15,7 @@ expect open class Foo : Base {
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual typealias <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>Base<!> = BaseImpl
actual typealias Base = BaseImpl
open class BaseImpl {
fun existingMethodInBase() {}
@@ -1,29 +0,0 @@
// WITH_STDLIB
// MODULE: m1-common
// FILE: common.kt
expect open class Base<T>() {
fun existingMethodInBase(param: T)
}
open class Transitive : Base<String>()
expect open class Foo : Transitive {
fun existingMethod()
val existingParam: Int
}
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual typealias Base<T> = BaseImpl<T>
open class BaseImpl<T> {
fun existingMethodInBase(param: T) {}
fun injected() {}
}
actual open class Foo : Transitive() {
actual fun existingMethod() {}
actual val existingParam: Int = 904
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// WITH_STDLIB
// MODULE: m1-common
// FILE: common.kt
@@ -16,7 +17,7 @@ expect open class Foo : Transitive {
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual typealias <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>Base<!><T> = BaseImpl<T>
actual typealias Base<T> = BaseImpl<T>
open class BaseImpl<T> {
fun existingMethodInBase(param: T) {}
@@ -22,16 +22,16 @@ class B<T>
actual typealias C1 = String
<!ACTUAL_TYPE_ALIAS_TO_CLASS_WITH_DECLARATION_SITE_VARIANCE!>actual typealias C2<A> = List<String><!>
<!ACTUAL_TYPE_ALIAS_TO_CLASS_WITH_DECLARATION_SITE_VARIANCE!>actual typealias C3<B> = List<B><!>
actual typealias <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>C4<!><D, E> = MutableMap<D, E>
<!ACTUAL_TYPE_ALIAS_WITH_COMPLEX_SUBSTITUTION!>actual typealias <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>C5<!><F, G> = MutableMap<G, F><!>
actual typealias C4<D, E> = MutableMap<D, E>
<!ACTUAL_TYPE_ALIAS_WITH_COMPLEX_SUBSTITUTION!>actual typealias C5<F, G> = MutableMap<G, F><!>
<!ACTUAL_TYPE_ALIAS_WITH_COMPLEX_SUBSTITUTION!>actual typealias C51 = MutableMap<String, String><!>
<!ACTUAL_TYPE_ALIAS_WITH_COMPLEX_SUBSTITUTION!>actual typealias C52<F> = MutableMap<F, String><!>
<!ACTUAL_TYPE_ALIAS_WITH_COMPLEX_SUBSTITUTION!>actual typealias C53<T> = A<A<T>><!>
<!ACTUAL_TYPE_ALIAS_WITH_COMPLEX_SUBSTITUTION!>actual typealias C54<T> = B<List<String>><!>
actual typealias <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>C6<!><H> = MutableList<H>
<!ACTUAL_TYPE_ALIAS_WITH_USE_SITE_VARIANCE!>actual typealias <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>C7<!><I> = MutableList<out I><!>
<!ACTUAL_TYPE_ALIAS_WITH_USE_SITE_VARIANCE!>actual typealias <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>C8<!><J> = MutableList<*><!>
<!ACTUAL_TYPE_ALIAS_WITH_USE_SITE_VARIANCE!>actual typealias <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>C9<!><K> = MutableList<in K><!>
actual typealias C6<H> = MutableList<H>
<!ACTUAL_TYPE_ALIAS_WITH_USE_SITE_VARIANCE!>actual typealias C7<I> = MutableList<out I><!>
<!ACTUAL_TYPE_ALIAS_WITH_USE_SITE_VARIANCE!>actual typealias C8<J> = MutableList<*><!>
<!ACTUAL_TYPE_ALIAS_WITH_USE_SITE_VARIANCE!>actual typealias C9<K> = MutableList<in K><!>
typealias Tmp<K> = MutableList<K>
<!ACTUAL_TYPE_ALIAS_NOT_TO_CLASS!>actual typealias <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>C10<!><L> = Tmp<L><!>
<!ACTUAL_TYPE_ALIAS_NOT_TO_CLASS!>actual typealias C10<L> = Tmp<L><!>
@@ -32,7 +32,7 @@ expect fun StringDemoInterface.plusK(): <!NO_ACTUAL_FOR_EXPECT{JS}!>String<!>
// TARGET_PLATFORM: JS
// FILE: StringDemoInterface.kt
actual typealias <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>StringDemoInterface<!> = KotlinXStringDemoInterface
actual typealias StringDemoInterface = KotlinXStringDemoInterface
actual fun StringDemoInterface.<!ACTUAL_WITHOUT_EXPECT("Actual function 'plusK'; The following declaration is incompatible because return type is different: public expect fun StringDemoInterface /* = KotlinXStringDemoInterface */.plusK(): String")!>plusK<!>() = <!RESOLUTION_TO_CLASSIFIER!>StringValue<!>(value).<!DEBUG_INFO_MISSING_UNRESOLVED!>plus<!>("K").<!DEBUG_INFO_MISSING_UNRESOLVED!>value<!>
@@ -1,22 +0,0 @@
// MODULE: common
// TARGET_PLATFORM: Common
expect open class A()
// MODULE: intermediate()()(common)
// TARGET_PLATFORM: Common
class B : A() {
fun foo(): String = "O"
}
fun getB(): B = B()
// MODULE: main()()(intermediate)
actual open class A actual constructor() {
fun bar(): String = "K"
}
fun box(): String {
val b = getB()
return b.foo() + b.bar()
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// MODULE: common
// TARGET_PLATFORM: Common
@@ -12,8 +13,8 @@ class B : A() {
fun getB(): B = B()
// MODULE: main()()(intermediate)
actual open <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>class A<!> actual constructor() {
fun <!NON_ACTUAL_MEMBER_DECLARED_IN_EXPECT_NON_FINAL_CLASSIFIER_ACTUALIZATION_WARNING!>bar<!>(): String = "K"
actual open class A actual constructor() {
fun bar(): String = "K"
}
fun box(): String {
@@ -21,18 +21,18 @@ class C : C2(), I2
// TARGET_PLATFORM: JVM
// FILE: main.kt
actual open <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>class C1<!> {
fun <!NON_ACTUAL_MEMBER_DECLARED_IN_EXPECT_NON_FINAL_CLASSIFIER_ACTUALIZATION_WARNING!>f<!>() {}
actual open class C1 {
fun f() {}
}
<!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>actual interface I1<!> {
fun <!NON_ACTUAL_MEMBER_DECLARED_IN_EXPECT_NON_FINAL_CLASSIFIER_ACTUALIZATION_WARNING!>f<!>() {}
actual interface I1 {
fun f() {}
}
actual abstract <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>class C2<!> actual constructor() {
fun <!NON_ACTUAL_MEMBER_DECLARED_IN_EXPECT_NON_FINAL_CLASSIFIER_ACTUALIZATION_WARNING!>g<!>() {}
actual abstract class C2 actual constructor() {
fun g() {}
}
<!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>actual interface I2<!> {
fun <!NON_ACTUAL_MEMBER_DECLARED_IN_EXPECT_NON_FINAL_CLASSIFIER_ACTUALIZATION_WARNING!>g<!>()
actual interface I2 {
fun g()
}
@@ -16,10 +16,10 @@ class B : A()
// TARGET_PLATFORM: JVM
// FILE: main.kt
<!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>actual interface S1<!> {
fun <!NON_ACTUAL_MEMBER_DECLARED_IN_EXPECT_NON_FINAL_CLASSIFIER_ACTUALIZATION_WARNING!>f<!>() {}
actual interface S1 {
fun f() {}
}
<!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_MEMBERS_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>actual interface S2<!> {
fun <!NON_ACTUAL_MEMBER_DECLARED_IN_EXPECT_NON_FINAL_CLASSIFIER_ACTUALIZATION_WARNING!>f<!>() {}
actual interface S2 {
fun f() {}
}