[IR] Fix annotation arguments comparison when expression is expect enum
...actualized via typealias. This caused false-positive report of `ACTUAL_ANNOTATION_CONFLICTING_DEFAULT_ARGUMENT_VALUE`. In such case it's incorrect to compare signatures, because classes have different `ClassId`s. Instead, classes could be compared using `areCompatibleExpectActualTypes` which actualizes both types, and then enum value names compared. ^KT-62104 ^KT-59940
This commit is contained in:
committed by
Space Team
parent
67a46eba9c
commit
faae5f9b38
+6
@@ -1024,6 +1024,12 @@ public class FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated extends Abst
|
|||||||
runTest("compiler/testData/diagnostics/tests/multiplatform/defaultArguments/annotationsViaActualTypeAlias2.kt");
|
runTest("compiler/testData/diagnostics/tests/multiplatform/defaultArguments/annotationsViaActualTypeAlias2.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("annotationsViaActualTypeAliasExpectEnumArg.kt")
|
||||||
|
public void testAnnotationsViaActualTypeAliasExpectEnumArg() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/multiplatform/defaultArguments/annotationsViaActualTypeAliasExpectEnumArg.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("companionMethodViaActualTypealias.kt")
|
@TestMetadata("companionMethodViaActualTypealias.kt")
|
||||||
public void testCompanionMethodViaActualTypealias() throws Exception {
|
public void testCompanionMethodViaActualTypealias() throws Exception {
|
||||||
|
|||||||
+6
@@ -1024,6 +1024,12 @@ public class FirOldFrontendMPPDiagnosticsWithPsiTestGenerated extends AbstractFi
|
|||||||
runTest("compiler/testData/diagnostics/tests/multiplatform/defaultArguments/annotationsViaActualTypeAlias2.kt");
|
runTest("compiler/testData/diagnostics/tests/multiplatform/defaultArguments/annotationsViaActualTypeAlias2.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("annotationsViaActualTypeAliasExpectEnumArg.kt")
|
||||||
|
public void testAnnotationsViaActualTypeAliasExpectEnumArg() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/multiplatform/defaultArguments/annotationsViaActualTypeAliasExpectEnumArg.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("companionMethodViaActualTypealias.kt")
|
@TestMetadata("companionMethodViaActualTypealias.kt")
|
||||||
public void testCompanionMethodViaActualTypealias() throws Exception {
|
public void testCompanionMethodViaActualTypealias() throws Exception {
|
||||||
|
|||||||
+2
-1
@@ -28,7 +28,8 @@ internal fun IrExpectActualMatchingContext.areIrExpressionConstValuesEqual(
|
|||||||
getClassIdAfterActualization(classId)
|
getClassIdAfterActualization(classId)
|
||||||
}
|
}
|
||||||
|
|
||||||
a is IrGetEnumValue && b is IrGetEnumValue -> equalBy(a, b) { it.symbol.signature?.toString() }
|
a is IrGetEnumValue && b is IrGetEnumValue ->
|
||||||
|
areCompatibleExpectActualTypes(a.type, b.type) && equalBy(a, b) { it.symbol.owner.name }
|
||||||
|
|
||||||
a is IrVararg && b is IrVararg -> {
|
a is IrVararg && b is IrVararg -> {
|
||||||
collectionArgumentsCompatibilityCheckStrategy.areCompatible(a.elements, b.elements) { f, s ->
|
collectionArgumentsCompatibilityCheckStrategy.areCompatible(a.elements, b.elements) { f, s ->
|
||||||
|
|||||||
+27
@@ -0,0 +1,27 @@
|
|||||||
|
// MODULE: m1-common
|
||||||
|
// FILE: common.kt
|
||||||
|
expect enum class E {
|
||||||
|
FOO, BAR
|
||||||
|
}
|
||||||
|
|
||||||
|
expect annotation class Matching(val e: E = E.FOO)
|
||||||
|
|
||||||
|
expect annotation class NonMatching(val e: E = E.BAR)
|
||||||
|
|
||||||
|
// MODULE: m2-jvm()()(m1-common)
|
||||||
|
// FILE: jvm.kt
|
||||||
|
actual typealias E = EJava
|
||||||
|
actual typealias Matching = AJava
|
||||||
|
<!ACTUAL_ANNOTATION_CONFLICTING_DEFAULT_ARGUMENT_VALUE!>actual typealias NonMatching = AJava<!>
|
||||||
|
|
||||||
|
// FILE: EJava.java
|
||||||
|
public enum EJava {
|
||||||
|
FOO, BAR;
|
||||||
|
|
||||||
|
EJava() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: AJava.java
|
||||||
|
public @interface AJava {
|
||||||
|
EJava e() default EJava.FOO;
|
||||||
|
}
|
||||||
+27
@@ -0,0 +1,27 @@
|
|||||||
|
// MODULE: m1-common
|
||||||
|
// FILE: common.kt
|
||||||
|
expect enum class E {
|
||||||
|
FOO, BAR
|
||||||
|
}
|
||||||
|
|
||||||
|
expect annotation class Matching(val e: E = E.FOO)
|
||||||
|
|
||||||
|
expect annotation class NonMatching(val e: E = E.BAR)
|
||||||
|
|
||||||
|
// MODULE: m2-jvm()()(m1-common)
|
||||||
|
// FILE: jvm.kt
|
||||||
|
actual typealias E = EJava
|
||||||
|
actual typealias Matching = AJava
|
||||||
|
actual typealias <!ACTUAL_ANNOTATION_CONFLICTING_DEFAULT_ARGUMENT_VALUE!>NonMatching<!> = AJava
|
||||||
|
|
||||||
|
// FILE: EJava.java
|
||||||
|
public enum EJava {
|
||||||
|
FOO, BAR;
|
||||||
|
|
||||||
|
EJava() {}
|
||||||
|
}
|
||||||
|
|
||||||
|
// FILE: AJava.java
|
||||||
|
public @interface AJava {
|
||||||
|
EJava e() default EJava.FOO;
|
||||||
|
}
|
||||||
Generated
+6
@@ -24061,6 +24061,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
|
|||||||
runTest("compiler/testData/diagnostics/tests/multiplatform/defaultArguments/annotationsViaActualTypeAlias2.kt");
|
runTest("compiler/testData/diagnostics/tests/multiplatform/defaultArguments/annotationsViaActualTypeAlias2.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("annotationsViaActualTypeAliasExpectEnumArg.kt")
|
||||||
|
public void testAnnotationsViaActualTypeAliasExpectEnumArg() throws Exception {
|
||||||
|
runTest("compiler/testData/diagnostics/tests/multiplatform/defaultArguments/annotationsViaActualTypeAliasExpectEnumArg.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("companionMethodViaActualTypealias.kt")
|
@TestMetadata("companionMethodViaActualTypealias.kt")
|
||||||
public void testCompanionMethodViaActualTypealias() throws Exception {
|
public void testCompanionMethodViaActualTypealias() throws Exception {
|
||||||
|
|||||||
Reference in New Issue
Block a user