[FE 1.0] Report a more precise diagnostic when parameter modifiers (vararg) are changed in actualization
^KT-62747 Fixed
This commit is contained in:
+6
@@ -448,6 +448,12 @@ public class FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated extends Abst
|
||||
runTest("compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeSetterVisibilityInOverride.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("changeVarargModifierInOverride.kt")
|
||||
public void testChangeVarargModifierInOverride() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeVarargModifierInOverride.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("changeVisibilityInOverride.kt")
|
||||
public void testChangeVisibilityInOverride() throws Exception {
|
||||
|
||||
+6
@@ -448,6 +448,12 @@ public class FirOldFrontendMPPDiagnosticsWithPsiTestGenerated extends AbstractFi
|
||||
runTest("compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeSetterVisibilityInOverride.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("changeVarargModifierInOverride.kt")
|
||||
public void testChangeVarargModifierInOverride() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeVarargModifierInOverride.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("changeVisibilityInOverride.kt")
|
||||
public void testChangeVisibilityInOverride() throws Exception {
|
||||
|
||||
@@ -856,6 +856,8 @@ public interface Errors {
|
||||
PROPERTY_KIND_CHANGED_IN_NON_FINAL_EXPECT_CLASSIFIER_ACTUALIZATION_WARNING = DiagnosticFactory1.create(WARNING, VAL_OR_VAR_NODE);
|
||||
DiagnosticFactory1<KtCallableDeclaration, K1ExpectActualMemberDiff<CallableMemberDescriptor, ClassDescriptor>>
|
||||
LATEINIT_CHANGED_IN_NON_FINAL_EXPECT_CLASSIFIER_ACTUALIZATION_WARNING = DiagnosticFactory1.create(WARNING, LATEINIT_MODIFIER);
|
||||
DiagnosticFactory1<KtCallableDeclaration, K1ExpectActualMemberDiff<CallableMemberDescriptor, ClassDescriptor>>
|
||||
VARARG_CHANGED_IN_NON_FINAL_EXPECT_CLASSIFIER_ACTUALIZATION_WARNING = DiagnosticFactory1.create(WARNING, LATEINIT_MODIFIER);
|
||||
DiagnosticFactory1<KtCallableDeclaration, K1ExpectActualMemberDiff<CallableMemberDescriptor, ClassDescriptor>>
|
||||
TYPE_PARAMETER_NAMES_CHANGED_IN_NON_FINAL_EXPECT_CLASSIFIER_ACTUALIZATION_WARNING = DiagnosticFactory1.create(WARNING, TYPE_PARAMETERS_OR_DECLARATION_SIGNATURE);
|
||||
|
||||
|
||||
+3
@@ -424,6 +424,9 @@ public class DefaultErrorMessages {
|
||||
MAP.put(LATEINIT_CHANGED_IN_NON_FINAL_EXPECT_CLASSIFIER_ACTUALIZATION_WARNING,
|
||||
"{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(VARARG_CHANGED_IN_NON_FINAL_EXPECT_CLASSIFIER_ACTUALIZATION_WARNING,
|
||||
"{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(SETTER_VISIBILITY_CHANGED_IN_NON_FINAL_EXPECT_CLASSIFIER_ACTUALIZATION_WARNING,
|
||||
"{0}. This warning will become an error in future releases. Also see https://youtrack.jetbrains.com/issue/KT-22841 for more details",
|
||||
ExpectActualScopeDiffRenderer.INSTANCE);
|
||||
|
||||
+2
@@ -223,6 +223,8 @@ private fun BindingTrace.reportIfPossible(diff: K1ExpectActualMemberDiff<Callabl
|
||||
Errors.PROPERTY_KIND_CHANGED_IN_NON_FINAL_EXPECT_CLASSIFIER_ACTUALIZATION_WARNING.on(psi, diff)
|
||||
K1ExpectActualMemberDiff.Kind.LateinitChangedInOverride ->
|
||||
Errors.LATEINIT_CHANGED_IN_NON_FINAL_EXPECT_CLASSIFIER_ACTUALIZATION_WARNING.on(psi, diff)
|
||||
K1ExpectActualMemberDiff.Kind.VarargChangedInOverride ->
|
||||
Errors.VARARG_CHANGED_IN_NON_FINAL_EXPECT_CLASSIFIER_ACTUALIZATION_WARNING.on(psi, diff)
|
||||
K1ExpectActualMemberDiff.Kind.TypeParameterNamesChangedInOverride ->
|
||||
Errors.TYPE_PARAMETER_NAMES_CHANGED_IN_NON_FINAL_EXPECT_CLASSIFIER_ACTUALIZATION_WARNING.on(psi, diff)
|
||||
}
|
||||
|
||||
+5
-1
@@ -45,6 +45,10 @@ data class K1ExpectActualMemberDiff<out M, out C>(val kind: Kind, val actualMemb
|
||||
"{0}: the property modifiers (lateinit) of this member must be the same in the expect class and the actual class. " +
|
||||
"This error happens because the expect class ''{1}'' is non-final"
|
||||
),
|
||||
VarargChangedInOverride(
|
||||
"{0}: the parameter modifiers (vararg) of this member must be the same in the expect class and the actual class. " +
|
||||
"This error happens because the expect class ''{1}'' is non-final"
|
||||
),
|
||||
TypeParameterNamesChangedInOverride(
|
||||
"{0}: the type parameter names of this member must be the same in the expect class and the actual class. " +
|
||||
"This error happens because the expect class ''{1}'' is non-final"
|
||||
@@ -82,6 +86,6 @@ fun K1ExpectActualCompatibility.Incompatible<*>.toMemberDiffKind(): K1ExpectActu
|
||||
K1ExpectActualCompatibility.Incompatible.TypeParameterVariance -> null // Members are not allowed to have variance
|
||||
K1ExpectActualCompatibility.Incompatible.ValueParameterCrossinline -> null // inline fun can't be overridden
|
||||
K1ExpectActualCompatibility.Incompatible.ValueParameterNoinline -> null // inline fun can't be overridden
|
||||
K1ExpectActualCompatibility.Incompatible.ValueParameterVararg -> K1ExpectActualMemberDiff.Kind.NonPrivateCallableAdded
|
||||
K1ExpectActualCompatibility.Incompatible.ValueParameterVararg -> K1ExpectActualMemberDiff.Kind.VarargChangedInOverride
|
||||
K1ExpectActualCompatibility.Incompatible.Visibility -> K1ExpectActualMemberDiff.Kind.VisibilityChangedInOverride
|
||||
}
|
||||
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
// MODULE: m1-common
|
||||
// FILE: common.kt
|
||||
|
||||
open class Base {
|
||||
<!INCOMPATIBLE_MATCHING{JVM}!>open fun foo(vararg bar: Int) {}<!>
|
||||
}
|
||||
|
||||
<!INCOMPATIBLE_MATCHING{JVM}!>expect open class Foo : Base {
|
||||
}<!>
|
||||
|
||||
// MODULE: m2-jvm()()(m1-common)
|
||||
// FILE: jvm.kt
|
||||
|
||||
actual open class Foo : Base() {
|
||||
override fun foo(bar: IntArray) {}
|
||||
}
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
// MODULE: m1-common
|
||||
// FILE: common.kt
|
||||
|
||||
open class Base {
|
||||
open fun foo(vararg bar: Int) {}
|
||||
}
|
||||
|
||||
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() {
|
||||
override fun <!VARARG_CHANGED_IN_NON_FINAL_EXPECT_CLASSIFIER_ACTUALIZATION_WARNING!>foo<!>(bar: IntArray) {}
|
||||
}
|
||||
Generated
+6
@@ -23695,6 +23695,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
|
||||
runTest("compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeSetterVisibilityInOverride.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("changeVarargModifierInOverride.kt")
|
||||
public void testChangeVarargModifierInOverride() throws Exception {
|
||||
runTest("compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeVarargModifierInOverride.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("changeVisibilityInOverride.kt")
|
||||
public void testChangeVisibilityInOverride() throws Exception {
|
||||
|
||||
+5
-1
@@ -45,6 +45,10 @@ data class ExpectActualMemberDiff<out M, out C>(val kind: Kind, val actualMember
|
||||
"{0}: the property modifiers (lateinit) of this member must be the same in the expect class and the actual class. " +
|
||||
"This error happens because the expect class ''{1}'' is non-final"
|
||||
),
|
||||
VarargChangedInOverride(
|
||||
"{0}: the parameter modifiers (vararg) of this member must be the same in the expect class and the actual class. " +
|
||||
"This error happens because the expect class ''{1}'' is non-final"
|
||||
),
|
||||
TypeParameterNamesChangedInOverride(
|
||||
"{0}: the type parameter names of this member must be the same in the expect class and the actual class. " +
|
||||
"This error happens because the expect class ''{1}'' is non-final"
|
||||
@@ -82,6 +86,6 @@ fun ExpectActualCompatibility.Incompatible<*>.toMemberDiffKind(): ExpectActualMe
|
||||
ExpectActualCompatibility.Incompatible.TypeParameterVariance -> null // Members are not allowed to have variance
|
||||
ExpectActualCompatibility.Incompatible.ValueParameterCrossinline -> null // inline fun can't be overridden
|
||||
ExpectActualCompatibility.Incompatible.ValueParameterNoinline -> null // inline fun can't be overridden
|
||||
ExpectActualCompatibility.Incompatible.ValueParameterVararg -> ExpectActualMemberDiff.Kind.NonPrivateCallableAdded
|
||||
ExpectActualCompatibility.Incompatible.ValueParameterVararg -> ExpectActualMemberDiff.Kind.VarargChangedInOverride
|
||||
ExpectActualCompatibility.Incompatible.Visibility -> ExpectActualMemberDiff.Kind.VisibilityChangedInOverride
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user