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

^KT-62655 Fixed
This commit is contained in:
Nikita Bobko
2023-10-18 15:06:12 +02:00
committed by Space Team
parent a537ab898e
commit 1d4ab50047
19 changed files with 22 additions and 206 deletions
@@ -863,10 +863,6 @@ public interface Errors {
DiagnosticFactory1<KtCallableDeclaration, K1ExpectActualMemberDiff<CallableMemberDescriptor, ClassDescriptor>>
TYPE_PARAMETER_NAMES_CHANGED_IN_NON_FINAL_EXPECT_CLASSIFIER_ACTUALIZATION_WARNING = DiagnosticFactory1.create(WARNING, TYPE_PARAMETERS_OR_DECLARATION_SIGNATURE);
DiagnosticFactory3<KtClassLikeDeclaration, ClassifierDescriptorWithTypeParameters, List<Name>, ClassDescriptor>
ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_SUPERTYPES_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING =
DiagnosticFactory3.create(WARNING, DECLARATION_NAME);
DiagnosticFactory0<KtClassLikeDeclaration> EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING = DiagnosticFactory0.create(WARNING, EXPECT_ACTUAL_MODIFIER);
DiagnosticFactory0<PsiElement> OPTIONAL_EXPECTATION_NOT_ON_EXPECTED = DiagnosticFactory0.create(ERROR);
@@ -437,16 +437,6 @@ public class DefaultErrorMessages {
"{0}. This warning will become an error in future releases. Also see https://youtrack.jetbrains.com/issue/KT-22841 for more details",
ExpectActualScopeDiffRenderer.INSTANCE);
MAP.put(ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_SUPERTYPES_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING,
"{0}: actual class and its non-final expect class must declare exactly the same supertypes. " +
"Actual class declares the following supertypes that are not presented in expect class: {1}.\n" +
"This error happens because the expect class ''{2}'' is non-final. " +
"This warning will become an error in future releases.\n" +
"Also see https://youtrack.jetbrains.com/issue/KT-22841 for more details",
CAPITALIZED_DECLARATION_NAME_WITH_KIND_AND_PLATFORM,
new ListRenderer<>(TO_STRING, (elem) -> "'" + elem + "'"),
NAME);
MAP.put(EXPECT_ACTUAL_CLASSIFIERS_ARE_IN_BETA_WARNING,
"'expect'/'actual' classes (including interfaces, objects, annotations, enums, and 'actual' typealiases) are in Beta. " +
"You can use -Xexpect-actual-classes flag to suppress this warning. " +
@@ -34,33 +34,10 @@ object ActualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker :
@Suppress("USELESS_CAST") // K2 warning suppression, TODO: KT-62472
descriptor as ClassifierDescriptorWithTypeParameters
checkSupertypes(expect, actual, context, declaration, descriptor)
checkExpectActualScopeDiff(expect, actual, context, declaration, descriptor)
}
}
private fun checkSupertypes(
expect: ClassDescriptor,
actual: ClassDescriptor,
context: DeclarationCheckerContext,
declaration: KtClassLikeDeclaration,
descriptor: ClassifierDescriptorWithTypeParameters,
) {
val addedSupertypes = (actual.getSuperInterfaces() + listOfNotNull(actual.getSuperClassNotAny())).map(ClassDescriptor::fqNameSafe) -
(expect.getSuperInterfaces() + listOfNotNull(expect.getSuperClassNotAny())).map(ClassDescriptor::fqNameSafe).toSet()
if (addedSupertypes.isNotEmpty()) {
context.trace.report(
Errors.ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_SUPERTYPES_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING.on(
declaration,
descriptor,
addedSupertypes.map(FqName::shortName),
expect,
)
)
}
}
private fun checkExpectActualScopeDiff(
expect: ClassDescriptor,
actual: ClassDescriptor,
@@ -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
open class InjectedEmptySuperClass()
actual open class Foo : InjectedEmptySuperClass() {
actual fun existingMethod() {}
actual val existingParam: Int = 904
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// MODULE: m1-common
// FILE: common.kt
@@ -11,7 +12,7 @@ expect open class Foo {
open class InjectedEmptySuperClass()
actual open <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_SUPERTYPES_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>class Foo<!> : InjectedEmptySuperClass() {
actual open class Foo : InjectedEmptySuperClass() {
actual fun existingMethod() {}
actual val existingParam: Int = 904
}
@@ -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
open class Injector {
fun injectedMethod() {}
}
actual open class Foo : Injector() {
actual fun existingMethod() {}
actual val existingParam: Int = 904
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// MODULE: m1-common
// FILE: common.kt
@@ -13,7 +14,7 @@ open class Injector {
fun injectedMethod() {}
}
actual open <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_SUPERTYPES_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>class Foo<!> : Injector() {
actual open class Foo : Injector() {
actual fun existingMethod() {}
actual val existingParam: Int = 904
}
@@ -1,24 +0,0 @@
// WITH_STDLIB
// MODULE: m1-common
// FILE: common.kt
expect open class Base {
fun injected()
}
expect open class Foo {
fun existingMethod()
val existingParam: Int
}
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open class Base {
actual 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
@@ -18,7 +19,7 @@ actual open class Base {
actual fun injected() {}
}
actual open <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_SUPERTYPES_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>class Foo<!> : Base() {
actual open class Foo : Base() {
actual fun existingMethod() {}
actual val existingParam: Int = 904
}
@@ -1,26 +0,0 @@
// WITH_STDLIB
// MODULE: m1-common
// FILE: common.kt
expect open class Base {
fun injected()
}
expect open class Foo {
fun existingMethod()
val existingParam: Int
}
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open class Base {
actual fun injected() {}
}
open class Transitive : Base()
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
@@ -20,7 +21,7 @@ actual open class Base {
open class Transitive : Base()
actual open <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_SUPERTYPES_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>class Foo<!> : Transitive() {
actual open class Foo : Transitive() {
actual fun existingMethod() {}
actual val existingParam: Int = 904
}
@@ -1,24 +0,0 @@
// WITH_STDLIB
// MODULE: m1-common
// FILE: common.kt
expect open class Base {
fun injected()
}
expect open class Foo {
fun existingMethod()
val existingParam: Int
}
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open class Base {
actual 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
@@ -18,7 +19,7 @@ actual open class Base {
actual fun injected() {}
}
actual open <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_SUPERTYPES_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>class Foo<!> : Base() {
actual open class Foo : Base() {
actual fun existingMethod() {}
actual val existingParam: Int = 904
}
@@ -1,26 +0,0 @@
// WITH_STDLIB
// MODULE: m1-common
// FILE: common.kt
expect open class Base<T> {
fun injected(param: T)
}
expect open class Foo {
fun existingMethod()
val existingParam: Int
}
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
actual open class Base<T> {
actual fun injected(param: T) {}
}
open class Transitive : Base<String>()
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
@@ -20,7 +21,7 @@ actual open class Base<T> {
open class Transitive : Base<String>()
actual open <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_SUPERTYPES_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>class Foo<!> : Transitive() {
actual open class Foo : Transitive() {
actual fun existingMethod() {}
actual val existingParam: Int = 904
}
@@ -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, ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_SUPERTYPES_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, ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_SUPERTYPES_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>C5<!><F, G> = MutableMap<G, F><!>
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_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, ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_SUPERTYPES_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, ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_SUPERTYPES_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, ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_SUPERTYPES_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, ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_SUPERTYPES_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>C9<!><K> = MutableList<in K><!>
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><!>
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, ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_SUPERTYPES_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>C10<!><L> = Tmp<L><!>
<!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><!>
@@ -1,18 +0,0 @@
// MODULE: m1-common
// FILE: common.kt
expect open class Foo {
open fun bar(): String
}
// MODULE: m2-jvm()()(m1-common)
// FILE: jvm.kt
interface Bar {
fun bar(): String
}
val bar: Bar
get() = null!!
actual open class Foo : Bar by bar
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// MODULE: m1-common
// FILE: common.kt
@@ -15,4 +16,4 @@ interface Bar {
val bar: Bar
get() = null!!
actual open <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_SUPERTYPES_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>class Foo<!> : Bar by bar
actual open class Foo : Bar by bar
@@ -12,4 +12,4 @@ public expect abstract class AbstractMutableMap<K, V> : MutableMap<K, V> {
import java.util.AbstractMap
public actual abstract <!ACTUAL_CLASSIFIER_MUST_HAVE_THE_SAME_SUPERTYPES_AS_NON_FINAL_EXPECT_CLASSIFIER_WARNING!>class AbstractMutableMap<!><K, V>() : MutableMap<K, V>, AbstractMap<K, V>()
public actual abstract class AbstractMutableMap<K, V>() : MutableMap<K, V>, AbstractMap<K, V>()