From 4b00a43b227331dae8e0ce62dbeea058c7137888 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 13 May 2021 10:08:34 +0300 Subject: [PATCH] FIR: add ANNOTATION_ON_SUPERCLASS diagnostic --- .../checkers/generator/diagnostics/FirDiagnosticsList.kt | 2 ++ .../kotlin/fir/analysis/diagnostics/FirErrors.kt | 2 ++ .../checkers/declaration/FirSupertypesChecker.kt | 8 ++++++++ .../fir/analysis/diagnostics/FirDefaultErrorMessages.kt | 2 ++ .../tests/annotations/withUseSiteTarget/kt23992.fir.kt | 2 +- .../annotations/withUseSiteTarget/kt23992_after.fir.kt | 9 --------- .../tests/annotations/withUseSiteTarget/kt23992_after.kt | 1 + .../api/fir/diagnostics/KtFirDataClassConverters.kt | 7 +++++++ .../frontend/api/fir/diagnostics/KtFirDiagnostics.kt | 5 +++++ .../frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt | 8 ++++++++ 10 files changed, 36 insertions(+), 10 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/kt23992_after.fir.kt diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt index ebe0cdc78c1..832ea6d7aef 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -170,6 +170,8 @@ object DIAGNOSTICS_LIST : DiagnosticList() { val DEPRECATED_SINCE_KOTLIN_WITHOUT_DEPRECATED by error(PositioningStrategy.REFERENCED_NAME_BY_QUALIFIED) val DEPRECATED_SINCE_KOTLIN_WITH_DEPRECATED_LEVEL by error(PositioningStrategy.REFERENCED_NAME_BY_QUALIFIED) val DEPRECATED_SINCE_KOTLIN_OUTSIDE_KOTLIN_SUBPACKAGE by error(PositioningStrategy.REFERENCED_NAME_BY_QUALIFIED) + + val ANNOTATION_ON_SUPERCLASS by error() } val EXPOSED_VISIBILITY by object : DiagnosticGroup("Exposed visibility") { diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index d04e0898f9f..5b390cbff12 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -33,6 +33,7 @@ import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.lexer.KtModifierKeywordToken import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtAnnotation +import org.jetbrains.kotlin.psi.KtAnnotationEntry import org.jetbrains.kotlin.psi.KtArrayAccessExpression import org.jetbrains.kotlin.psi.KtBinaryExpression import org.jetbrains.kotlin.psi.KtBinaryExpressionWithTypeRHS @@ -176,6 +177,7 @@ object FirErrors { val DEPRECATED_SINCE_KOTLIN_WITHOUT_DEPRECATED by error0(SourceElementPositioningStrategies.REFERENCED_NAME_BY_QUALIFIED) val DEPRECATED_SINCE_KOTLIN_WITH_DEPRECATED_LEVEL by error0(SourceElementPositioningStrategies.REFERENCED_NAME_BY_QUALIFIED) val DEPRECATED_SINCE_KOTLIN_OUTSIDE_KOTLIN_SUBPACKAGE by error0(SourceElementPositioningStrategies.REFERENCED_NAME_BY_QUALIFIED) + val ANNOTATION_ON_SUPERCLASS by error0() // Exposed visibility val EXPOSED_TYPEALIAS_EXPANDED_TYPE by error3(SourceElementPositioningStrategies.DECLARATION_NAME) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirSupertypesChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirSupertypesChecker.kt index a30eb948d74..721cbb3b6b0 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirSupertypesChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirSupertypesChecker.kt @@ -72,6 +72,14 @@ object FirSupertypesChecker : FirClassChecker() { singletonInSupertypeReported = true } } + + for (annotation in superTypeRef.annotations) { + withSuppressedDiagnostics(annotation, context) { + if (annotation.useSiteTarget != null) { + reporter.reportOn(annotation.source, FirErrors.ANNOTATION_ON_SUPERCLASS, context) + } + } + } } } } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt index 05eb20aac8a..27f7add5a51 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt @@ -37,6 +37,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ACCESSOR_FOR_DELE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ANNOTATION_ARGUMENT_MUST_BE_CONST import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ANNOTATION_CLASS_CONSTRUCTOR_CALL import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ANNOTATION_CLASS_MEMBER +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ANNOTATION_ON_SUPERCLASS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ANNOTATION_PARAMETER_DEFAULT_VALUE_MUST_BE_CONSTANT import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ANNOTATION_USED_AS_ANNOTATION_ARGUMENT import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ANONYMOUS_FUNCTION_PARAMETER_WITH_DEFAULT_VALUE @@ -474,6 +475,7 @@ class FirDefaultErrorMessages : DefaultErrorMessages.Extension { DEPRECATED_SINCE_KOTLIN_OUTSIDE_KOTLIN_SUBPACKAGE, "DeprecatedSinceKotlin annotation cannot be used outside 'kotlin' subpackages" ) + map.put(ANNOTATION_ON_SUPERCLASS, "Annotations on superclass are meaningless") // Exposed visibility group // # map.put( diff --git a/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/kt23992.fir.kt b/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/kt23992.fir.kt index 2164ebed7f8..9f9e6edc898 100644 --- a/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/kt23992.fir.kt +++ b/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/kt23992.fir.kt @@ -4,6 +4,6 @@ interface Foo annotation class Ann -class E : @field:Ann @get:Ann @set:Ann @setparam:Ann Foo +class E : @field:Ann @get:Ann @set:Ann @setparam:Ann Foo interface G : @Ann Foo \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/kt23992_after.fir.kt b/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/kt23992_after.fir.kt deleted file mode 100644 index d85a79c1c5e..00000000000 --- a/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/kt23992_after.fir.kt +++ /dev/null @@ -1,9 +0,0 @@ -// !LANGUAGE: +ProhibitUseSiteTargetAnnotationsOnSuperTypes - -interface Foo - -annotation class Ann - -class E : @field:Ann @get:Ann @set:Ann @setparam:Ann Foo - -interface G : @Ann Foo \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/kt23992_after.kt b/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/kt23992_after.kt index 35d9da9d040..cbb6cd7774c 100644 --- a/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/kt23992_after.kt +++ b/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/kt23992_after.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !LANGUAGE: +ProhibitUseSiteTargetAnnotationsOnSuperTypes interface Foo diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt index c7e67c964d2..cc82805b21f 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.fir.declarations.FirTypeParameter import org.jetbrains.kotlin.fir.declarations.FirVariable import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.psi.KtAnnotation +import org.jetbrains.kotlin.psi.KtAnnotationEntry import org.jetbrains.kotlin.psi.KtArrayAccessExpression import org.jetbrains.kotlin.psi.KtBinaryExpression import org.jetbrains.kotlin.psi.KtBinaryExpressionWithTypeRHS @@ -600,6 +601,12 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.ANNOTATION_ON_SUPERCLASS) { firDiagnostic -> + AnnotationOnSuperclassImpl( + firDiagnostic as FirPsiDiagnostic<*>, + token, + ) + } add(FirErrors.EXPOSED_TYPEALIAS_EXPANDED_TYPE) { firDiagnostic -> ExposedTypealiasExpandedTypeImpl( firDiagnostic.a, diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt index 2bfdcd28b53..43134979767 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.lexer.KtModifierKeywordToken import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtAnnotation +import org.jetbrains.kotlin.psi.KtAnnotationEntry import org.jetbrains.kotlin.psi.KtArrayAccessExpression import org.jetbrains.kotlin.psi.KtBinaryExpression import org.jetbrains.kotlin.psi.KtBinaryExpressionWithTypeRHS @@ -429,6 +430,10 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = DeprecatedSinceKotlinOutsideKotlinSubpackage::class } + abstract class AnnotationOnSuperclass : KtFirDiagnostic() { + override val diagnosticClass get() = AnnotationOnSuperclass::class + } + abstract class ExposedTypealiasExpandedType : KtFirDiagnostic() { override val diagnosticClass get() = ExposedTypealiasExpandedType::class abstract val elementVisibility: EffectiveVisibility diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index 1bf06d6286a..b4c28341e7d 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.idea.frontend.api.types.KtType import org.jetbrains.kotlin.lexer.KtModifierKeywordToken import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtAnnotation +import org.jetbrains.kotlin.psi.KtAnnotationEntry import org.jetbrains.kotlin.psi.KtArrayAccessExpression import org.jetbrains.kotlin.psi.KtBinaryExpression import org.jetbrains.kotlin.psi.KtBinaryExpressionWithTypeRHS @@ -697,6 +698,13 @@ internal class DeprecatedSinceKotlinOutsideKotlinSubpackageImpl( override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) } +internal class AnnotationOnSuperclassImpl( + firDiagnostic: FirPsiDiagnostic<*>, + override val token: ValidityToken, +) : KtFirDiagnostic.AnnotationOnSuperclass(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) +} + internal class ExposedTypealiasExpandedTypeImpl( override val elementVisibility: EffectiveVisibility, override val restrictingDeclaration: KtSymbol,