From 242c1cf5f0814fbe9df02b4b85a63298b30b4b67 Mon Sep 17 00:00:00 2001 From: Vladimir Sukharev Date: Tue, 17 Oct 2023 10:18:36 +0000 Subject: [PATCH] [FIR] Fix disappeared REPEATED_ANNOTATION for dynamic types https://youtrack.jetbrains.com/issue/KT-59916/K2-Disappeared-REPEATEDANNOTATION FirAnnotationChecker does not detect repeated annotation on dynamic type, since FirTypeResolverImpl wrongly did not convert source annotations to attributes of ConeDynamicType. This MR improves FirTypeResolverImpl to convert attributes of FirDynamicTypeRef to annotations and attach them to ConeDynamicType. Merge-request: KT-MR-12551 Merged-by: Vladimir Sukharev --- ...osticCompilerTestFE10TestdataTestGenerated.java | 6 ++++++ ...iagnosticCompilerFE10TestDataTestGenerated.java | 6 ++++++ ...ghtTreeOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ .../FirPsiOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ .../org/jetbrains/kotlin/fir/types/TypeUtils.kt | 9 +++++++-- .../resolve/providers/impl/FirTypeResolverImpl.kt | 9 ++++++++- .../typealiasWithAnnotatedAbstractClass.kt | 14 ++++++++++++++ .../dynamicTypes/typealiasWithAnnotatedDynamic.kt | 1 + ...ypealiasWithAnnotatedDynamicInAbstractClass.kt} | 8 +++----- .../test/runners/DiagnosticTestGenerated.java | 6 ++++++ ...irPsiJsOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ .../ir/DiagnosticsWithJsStdLibTestGenerated.java | 6 ++++++ 12 files changed, 75 insertions(+), 8 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/annotations/typealiasWithAnnotatedAbstractClass.kt rename compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/{typealiasWithAnnotatedDynamic.fir.kt => typealiasWithAnnotatedDynamicInAbstractClass.kt} (58%) diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java index 4766b5b1aa8..43ba6785e88 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java @@ -2136,6 +2136,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/annotations/typeParameterAsAnnotation.kt"); } + @Test + @TestMetadata("typealiasWithAnnotatedAbstractClass.kt") + public void testTypealiasWithAnnotatedAbstractClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/typealiasWithAnnotatedAbstractClass.kt"); + } + @Test @TestMetadata("UnresolvedAnnotationOnObject.kt") public void testUnresolvedAnnotationOnObject() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java index 25efd81454c..7efa64395ad 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java @@ -2136,6 +2136,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/annotations/typeParameterAsAnnotation.kt"); } + @Test + @TestMetadata("typealiasWithAnnotatedAbstractClass.kt") + public void testTypealiasWithAnnotatedAbstractClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/typealiasWithAnnotatedAbstractClass.kt"); + } + @Test @TestMetadata("UnresolvedAnnotationOnObject.kt") public void testUnresolvedAnnotationOnObject() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java index dadf134757a..2692e96fc6f 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java @@ -2136,6 +2136,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/annotations/typeParameterAsAnnotation.kt"); } + @Test + @TestMetadata("typealiasWithAnnotatedAbstractClass.kt") + public void testTypealiasWithAnnotatedAbstractClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/typealiasWithAnnotatedAbstractClass.kt"); + } + @Test @TestMetadata("UnresolvedAnnotationOnObject.kt") public void testUnresolvedAnnotationOnObject() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java index 721e9fea8f5..a483e42185a 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java @@ -2142,6 +2142,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/annotations/typeParameterAsAnnotation.kt"); } + @Test + @TestMetadata("typealiasWithAnnotatedAbstractClass.kt") + public void testTypealiasWithAnnotatedAbstractClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/typealiasWithAnnotatedAbstractClass.kt"); + } + @Test @TestMetadata("UnresolvedAnnotationOnObject.kt") public void testUnresolvedAnnotationOnObject() throws Exception { diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt index e99e958c533..c1c965ecb54 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt @@ -98,8 +98,13 @@ fun ConeDefinitelyNotNullType.Companion.create( } @OptIn(DynamicTypeConstructor::class) -fun ConeDynamicType.Companion.create(session: FirSession): ConeDynamicType = - ConeDynamicType(session.builtinTypes.nothingType.type, session.builtinTypes.nullableAnyType.type) +fun ConeDynamicType.Companion.create( + session: FirSession, + attributes: ConeAttributes = ConeAttributes.Empty, +) = ConeDynamicType( + session.builtinTypes.nothingType.type.withAttributes(attributes), + session.builtinTypes.nullableAnyType.type.withAttributes(attributes), +) /** * This call is required if you want to use a type with annotations that are linked to a declaration from this declaration inside another diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirTypeResolverImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirTypeResolverImpl.kt index e76a074b2d0..976989a0934 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirTypeResolverImpl.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirTypeResolverImpl.kt @@ -417,7 +417,14 @@ class FirTypeResolverImpl(private val session: FirSession) : FirTypeResolver() { FirTypeResolutionResult(resolvedType, (result as? TypeResolutionResult.Resolved)?.typeCandidate?.diagnostic) } is FirFunctionTypeRef -> createFunctionType(typeRef, scopeClassDeclaration.containerDeclaration) - is FirDynamicTypeRef -> FirTypeResolutionResult(ConeDynamicType.create(session), diagnostic = null) + is FirDynamicTypeRef -> { + val attributes = typeRef.annotations.computeTypeAttributes( + session, + containerDeclaration = scopeClassDeclaration.containerDeclaration, + shouldExpandTypeAliases = true + ) + FirTypeResolutionResult(ConeDynamicType.create(session, attributes), diagnostic = null) + } is FirIntersectionTypeRef -> { val leftType = typeRef.leftType.coneType if (leftType is ConeTypeParameterType) { diff --git a/compiler/testData/diagnostics/tests/annotations/typealiasWithAnnotatedAbstractClass.kt b/compiler/testData/diagnostics/tests/annotations/typealiasWithAnnotatedAbstractClass.kt new file mode 100644 index 00000000000..f82ea66fc3f --- /dev/null +++ b/compiler/testData/diagnostics/tests/annotations/typealiasWithAnnotatedAbstractClass.kt @@ -0,0 +1,14 @@ +// FIR_IDENTICAL +@Target(AnnotationTarget.TYPE) +annotation class Ann1 + +@Target(AnnotationTarget.TYPE) +annotation class Ann2 + +abstract class AnnGenList : List<@Ann1 T> {} +typealias TestAnnGen1 = AnnGenList +typealias TestAnnGen2 = AnnGenList<@Ann2 String> +typealias TestAnnGen3 = AnnGenList<@Ann1 String> // KT-62602: should REPEATED_ANNOTATION diagnostic be raised here? + +fun useAnnGen1(x: TestAnnGen1) = x +fun useAnnGen2(x: TestAnnGen2) = x diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/typealiasWithAnnotatedDynamic.kt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/typealiasWithAnnotatedDynamic.kt index ec903aa9d3f..e379b73dd4d 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/typealiasWithAnnotatedDynamic.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/typealiasWithAnnotatedDynamic.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL @Target(AnnotationTarget.TYPE) annotation class Ann1 diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/typealiasWithAnnotatedDynamic.fir.kt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/typealiasWithAnnotatedDynamicInAbstractClass.kt similarity index 58% rename from compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/typealiasWithAnnotatedDynamic.fir.kt rename to compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/typealiasWithAnnotatedDynamicInAbstractClass.kt index b68ceadab24..71d93d8478b 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/typealiasWithAnnotatedDynamic.fir.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/typealiasWithAnnotatedDynamicInAbstractClass.kt @@ -1,16 +1,14 @@ +// FIR_IDENTICAL @Target(AnnotationTarget.TYPE) annotation class Ann1 @Target(AnnotationTarget.TYPE) annotation class Ann2 -typealias AnnGenList = List<@Ann1 T> +abstract class AnnGenList : List<@Ann1 T> {} typealias TestAnnGen1 = AnnGenList typealias TestAnnGen2 = AnnGenList<@Ann2 dynamic> -typealias TestAnnGen3 = AnnGenList<@Ann1 dynamic> +typealias TestAnnGen3 = AnnGenList<@Ann1 dynamic> // KT-62602: should REPEATED_ANNOTATION diagnostic be raised here? fun useAnnGen1(x: TestAnnGen1) = x fun useAnnGen2(x: TestAnnGen2) = x - -fun testUseAnnGen1(x: List) = useAnnGen1(x) -fun testUseAnnGen2(x: List) = useAnnGen2(x) diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index bdea7cf4cd9..fac4aa49966 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -2142,6 +2142,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/annotations/typeParameterAsAnnotation.kt"); } + @Test + @TestMetadata("typealiasWithAnnotatedAbstractClass.kt") + public void testTypealiasWithAnnotatedAbstractClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/annotations/typealiasWithAnnotatedAbstractClass.kt"); + } + @Test @TestMetadata("UnresolvedAnnotationOnObject.kt") public void testUnresolvedAnnotationOnObject() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsOldFrontendDiagnosticsTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsOldFrontendDiagnosticsTestGenerated.java index 4692054a0f6..e8b99696315 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsOldFrontendDiagnosticsTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsOldFrontendDiagnosticsTestGenerated.java @@ -428,6 +428,12 @@ public class FirPsiJsOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiJ runTest("compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/typealiasWithAnnotatedDynamic.kt"); } + @Test + @TestMetadata("typealiasWithAnnotatedDynamicInAbstractClass.kt") + public void testTypealiasWithAnnotatedDynamicInAbstractClass() throws Exception { + runTest("compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/typealiasWithAnnotatedDynamicInAbstractClass.kt"); + } + @Test @TestMetadata("typealiasWithDynamic.kt") public void testTypealiasWithDynamic() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/DiagnosticsWithJsStdLibTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/DiagnosticsWithJsStdLibTestGenerated.java index 8e349e27336..6d0de8a16c2 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/DiagnosticsWithJsStdLibTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/DiagnosticsWithJsStdLibTestGenerated.java @@ -428,6 +428,12 @@ public class DiagnosticsWithJsStdLibTestGenerated extends AbstractDiagnosticsTes runTest("compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/typealiasWithAnnotatedDynamic.kt"); } + @Test + @TestMetadata("typealiasWithAnnotatedDynamicInAbstractClass.kt") + public void testTypealiasWithAnnotatedDynamicInAbstractClass() throws Exception { + runTest("compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/typealiasWithAnnotatedDynamicInAbstractClass.kt"); + } + @Test @TestMetadata("typealiasWithDynamic.kt") public void testTypealiasWithDynamic() throws Exception {