From 6dd41b617aca60225e8850984622955e1dc87f74 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 19 May 2021 10:52:03 +0300 Subject: [PATCH] FIR: position INAPPLICABLE_FILE_TARGET on file use-site (when possible) --- .../generator/diagnostics/DiagnosticData.kt | 1 + .../generator/diagnostics/FirDiagnosticsList.kt | 14 +++++++------- .../kotlin/fir/analysis/diagnostics/FirErrors.kt | 14 +++++++------- .../diagnostics/LightTreePositioningStrategies.kt | 15 +++++++++++++++ .../SourceElementPositioningStrategies.kt | 5 +++++ .../kotlin/diagnostics/PositioningStrategies.kt | 6 ++++++ .../diagnosticFileAnnotationInWrongPlace.fir.kt | 6 +++--- .../diagnosticWithoutPackage.fir.kt | 2 +- ...osticWithoutPackageWithSimpleAnnotation.fir.kt | 8 -------- ...iagnosticWithoutPackageWithSimpleAnnotation.kt | 1 + .../fileAnnotationWithoutColon_after.fir.kt | 4 ++-- .../fileAnnotationWithoutColon_before.fir.kt | 4 ++-- .../api/fir/diagnostics/KtFirDiagnostics.kt | 14 +++++++------- .../api/fir/diagnostics/KtFirDiagnosticsImpl.kt | 14 +++++++------- 14 files changed, 64 insertions(+), 44 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/diagnosticWithoutPackageWithSimpleAnnotation.fir.kt diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticData.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticData.kt index 93812060e61..68ad1b5be95 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticData.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticData.kt @@ -70,6 +70,7 @@ enum class PositioningStrategy(private val strategy: String? = null) { FUN_INTERFACE, RESERVED_UNDERSCORE, QUESTION_MARK_BY_TYPE, + ANNOTATION_USE_SITE, ; 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 2832e456178..75e79d7a297 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 @@ -180,19 +180,19 @@ object DIAGNOSTICS_LIST : DiagnosticList() { parameter("actualTarget") parameter("useSiteTarget") } - val INAPPLICABLE_TARGET_ON_PROPERTY by error { + val INAPPLICABLE_TARGET_ON_PROPERTY by error { parameter("useSiteDescription") } - val INAPPLICABLE_TARGET_PROPERTY_IMMUTABLE by error { + val INAPPLICABLE_TARGET_PROPERTY_IMMUTABLE by error { parameter("useSiteDescription") } - val INAPPLICABLE_TARGET_PROPERTY_HAS_NO_DELEGATE by error() - val INAPPLICABLE_TARGET_PROPERTY_HAS_NO_BACKING_FIELD by error() - val INAPPLICABLE_PARAM_TARGET by error() - val REDUNDANT_ANNOTATION_TARGET by warning { + val INAPPLICABLE_TARGET_PROPERTY_HAS_NO_DELEGATE by error() + val INAPPLICABLE_TARGET_PROPERTY_HAS_NO_BACKING_FIELD by error() + val INAPPLICABLE_PARAM_TARGET by error() + val REDUNDANT_ANNOTATION_TARGET by warning { parameter("useSiteDescription") } - val INAPPLICABLE_FILE_TARGET by error() + val INAPPLICABLE_FILE_TARGET by error(PositioningStrategy.ANNOTATION_USE_SITE) } 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 e07f14ece75..06a6588b0b8 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 @@ -181,13 +181,13 @@ object FirErrors { val RESTRICTED_RETENTION_FOR_EXPRESSION_ANNOTATION by error0() val WRONG_ANNOTATION_TARGET by error1() val WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET by error2() - val INAPPLICABLE_TARGET_ON_PROPERTY by error1() - val INAPPLICABLE_TARGET_PROPERTY_IMMUTABLE by error1() - val INAPPLICABLE_TARGET_PROPERTY_HAS_NO_DELEGATE by error0() - val INAPPLICABLE_TARGET_PROPERTY_HAS_NO_BACKING_FIELD by error0() - val INAPPLICABLE_PARAM_TARGET by error0() - val REDUNDANT_ANNOTATION_TARGET by warning1() - val INAPPLICABLE_FILE_TARGET by error0() + val INAPPLICABLE_TARGET_ON_PROPERTY by error1() + val INAPPLICABLE_TARGET_PROPERTY_IMMUTABLE by error1() + val INAPPLICABLE_TARGET_PROPERTY_HAS_NO_DELEGATE by error0() + val INAPPLICABLE_TARGET_PROPERTY_HAS_NO_BACKING_FIELD by error0() + val INAPPLICABLE_PARAM_TARGET by error0() + val REDUNDANT_ANNOTATION_TARGET by warning1() + val INAPPLICABLE_FILE_TARGET by error0(SourceElementPositioningStrategies.ANNOTATION_USE_SITE) // Exposed visibility val EXPOSED_TYPEALIAS_EXPANDED_TYPE by error3(SourceElementPositioningStrategies.DECLARATION_NAME) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt index 3cf25b920e7..fe6cd5706db 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/LightTreePositioningStrategies.kt @@ -706,6 +706,21 @@ object LightTreePositioningStrategies { return super.mark(node, startOffset, endOffset, tree) } } + + val ANNOTATION_USE_SITE: LightTreePositioningStrategy = object : LightTreePositioningStrategy() { + override fun mark( + node: LighterASTNode, + startOffset: Int, + endOffset: Int, + tree: FlyweightCapableTreeStructure + ): List { + val useSiteTarget = tree.findChildByType(node, KtNodeTypes.ANNOTATION_TARGET) + if (useSiteTarget != null) { + return markElement(useSiteTarget, startOffset, endOffset, tree, node) + } + return super.mark(node, startOffset, endOffset, tree) + } + } } fun FirSourceElement.hasValOrVar(): Boolean = diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategies.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategies.kt index 1bf1639849f..caf28ff409e 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategies.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/SourceElementPositioningStrategies.kt @@ -242,4 +242,9 @@ object SourceElementPositioningStrategies { LightTreePositioningStrategies.QUESTION_MARK_BY_TYPE, PositioningStrategies.QUESTION_MARK_BY_TYPE ) + + val ANNOTATION_USE_SITE = SourceElementPositioningStrategy( + LightTreePositioningStrategies.ANNOTATION_USE_SITE, + PositioningStrategies.ANNOTATION_USE_SITE + ) } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt index 7ec15f9614f..4d61d97b49d 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/PositioningStrategies.kt @@ -865,6 +865,12 @@ object PositioningStrategies { } } + val ANNOTATION_USE_SITE: PositioningStrategy = object : PositioningStrategy() { + override fun mark(element: KtAnnotationEntry): List { + return markElement(element.useSiteTarget ?: element) + } + } + /** * @param locateReferencedName whether to remove any nested parentheses while locating the reference element. This is useful for diff --git a/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/diagnosticFileAnnotationInWrongPlace.fir.kt b/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/diagnosticFileAnnotationInWrongPlace.fir.kt index b22a99f7de2..6483447f8ac 100644 --- a/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/diagnosticFileAnnotationInWrongPlace.fir.kt +++ b/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/diagnosticFileAnnotationInWrongPlace.fir.kt @@ -1,12 +1,12 @@ package bar -@file:foo +@file:foo val prop -@file:[bar baz] +@file:[bar baz] fun func() {} -@file:[baz] +@file:[baz] class C @file: diff --git a/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/diagnosticWithoutPackage.fir.kt b/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/diagnosticWithoutPackage.fir.kt index 8d55b7067c7..1749fa5e321 100644 --- a/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/diagnosticWithoutPackage.fir.kt +++ b/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/diagnosticWithoutPackage.fir.kt @@ -1,6 +1,6 @@ @file:foo @foo @bar -@file:[baz] +@file:[baz] fun test() {} annotation class foo diff --git a/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/diagnosticWithoutPackageWithSimpleAnnotation.fir.kt b/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/diagnosticWithoutPackageWithSimpleAnnotation.fir.kt deleted file mode 100644 index 33c6a444e7a..00000000000 --- a/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/diagnosticWithoutPackageWithSimpleAnnotation.fir.kt +++ /dev/null @@ -1,8 +0,0 @@ -@file:foo -@foo @bar -@file: baz -fun test() {} - -annotation class foo -annotation class bar -annotation class baz \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/diagnosticWithoutPackageWithSimpleAnnotation.kt b/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/diagnosticWithoutPackageWithSimpleAnnotation.kt index 605ecb7ea5c..933c16da42f 100644 --- a/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/diagnosticWithoutPackageWithSimpleAnnotation.kt +++ b/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/diagnosticWithoutPackageWithSimpleAnnotation.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL @file:foo @foo @bar @file: baz diff --git a/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/fileAnnotationWithoutColon_after.fir.kt b/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/fileAnnotationWithoutColon_after.fir.kt index ea487f9be3c..524c3e605dc 100644 --- a/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/fileAnnotationWithoutColon_after.fir.kt +++ b/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/fileAnnotationWithoutColon_after.fir.kt @@ -1,9 +1,9 @@ // !LANGUAGE: +RestrictionOfWrongAnnotationsWithUseSiteTargetsOnTypes // !DIAGNOSTICS: -UNUSED_PARAMETER -fun test1(@file Suppress("") x: Int) {} +fun test1(@file Suppress("") x: Int) {} -@file @Suppress("") +@file @Suppress("") fun test2() {} class OnType(x: @file Suppress("") Int) diff --git a/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/fileAnnotationWithoutColon_before.fir.kt b/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/fileAnnotationWithoutColon_before.fir.kt index 7ec8df1ebc4..f946ec19e84 100644 --- a/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/fileAnnotationWithoutColon_before.fir.kt +++ b/compiler/testData/diagnostics/tests/annotations/withUseSiteTarget/fileAnnotationWithoutColon_before.fir.kt @@ -1,9 +1,9 @@ // !LANGUAGE: -RestrictionOfWrongAnnotationsWithUseSiteTargetsOnTypes // !DIAGNOSTICS: -UNUSED_PARAMETER -fun test1(@file Suppress("") x: Int) {} +fun test1(@file Suppress("") x: Int) {} -@file @Suppress("") +@file @Suppress("") fun test2() {} class OnType(x: @file Suppress("") Int) 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 25a7b5665c7..92afb22279d 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 @@ -449,34 +449,34 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { abstract val useSiteTarget: String } - abstract class InapplicableTargetOnProperty : KtFirDiagnostic() { + abstract class InapplicableTargetOnProperty : KtFirDiagnostic() { override val diagnosticClass get() = InapplicableTargetOnProperty::class abstract val useSiteDescription: String } - abstract class InapplicableTargetPropertyImmutable : KtFirDiagnostic() { + abstract class InapplicableTargetPropertyImmutable : KtFirDiagnostic() { override val diagnosticClass get() = InapplicableTargetPropertyImmutable::class abstract val useSiteDescription: String } - abstract class InapplicableTargetPropertyHasNoDelegate : KtFirDiagnostic() { + abstract class InapplicableTargetPropertyHasNoDelegate : KtFirDiagnostic() { override val diagnosticClass get() = InapplicableTargetPropertyHasNoDelegate::class } - abstract class InapplicableTargetPropertyHasNoBackingField : KtFirDiagnostic() { + abstract class InapplicableTargetPropertyHasNoBackingField : KtFirDiagnostic() { override val diagnosticClass get() = InapplicableTargetPropertyHasNoBackingField::class } - abstract class InapplicableParamTarget : KtFirDiagnostic() { + abstract class InapplicableParamTarget : KtFirDiagnostic() { override val diagnosticClass get() = InapplicableParamTarget::class } - abstract class RedundantAnnotationTarget : KtFirDiagnostic() { + abstract class RedundantAnnotationTarget : KtFirDiagnostic() { override val diagnosticClass get() = RedundantAnnotationTarget::class abstract val useSiteDescription: String } - abstract class InapplicableFileTarget : KtFirDiagnostic() { + abstract class InapplicableFileTarget : KtFirDiagnostic() { override val diagnosticClass get() = InapplicableFileTarget::class } 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 ce1fd75b4f9..1e2e45ab631 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 @@ -733,7 +733,7 @@ internal class InapplicableTargetOnPropertyImpl( override val useSiteDescription: String, firDiagnostic: FirPsiDiagnostic<*>, override val token: ValidityToken, -) : KtFirDiagnostic.InapplicableTargetOnProperty(), KtAbstractFirDiagnostic { +) : KtFirDiagnostic.InapplicableTargetOnProperty(), KtAbstractFirDiagnostic { override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) } @@ -741,28 +741,28 @@ internal class InapplicableTargetPropertyImmutableImpl( override val useSiteDescription: String, firDiagnostic: FirPsiDiagnostic<*>, override val token: ValidityToken, -) : KtFirDiagnostic.InapplicableTargetPropertyImmutable(), KtAbstractFirDiagnostic { +) : KtFirDiagnostic.InapplicableTargetPropertyImmutable(), KtAbstractFirDiagnostic { override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) } internal class InapplicableTargetPropertyHasNoDelegateImpl( firDiagnostic: FirPsiDiagnostic<*>, override val token: ValidityToken, -) : KtFirDiagnostic.InapplicableTargetPropertyHasNoDelegate(), KtAbstractFirDiagnostic { +) : KtFirDiagnostic.InapplicableTargetPropertyHasNoDelegate(), KtAbstractFirDiagnostic { override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) } internal class InapplicableTargetPropertyHasNoBackingFieldImpl( firDiagnostic: FirPsiDiagnostic<*>, override val token: ValidityToken, -) : KtFirDiagnostic.InapplicableTargetPropertyHasNoBackingField(), KtAbstractFirDiagnostic { +) : KtFirDiagnostic.InapplicableTargetPropertyHasNoBackingField(), KtAbstractFirDiagnostic { override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) } internal class InapplicableParamTargetImpl( firDiagnostic: FirPsiDiagnostic<*>, override val token: ValidityToken, -) : KtFirDiagnostic.InapplicableParamTarget(), KtAbstractFirDiagnostic { +) : KtFirDiagnostic.InapplicableParamTarget(), KtAbstractFirDiagnostic { override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) } @@ -770,14 +770,14 @@ internal class RedundantAnnotationTargetImpl( override val useSiteDescription: String, firDiagnostic: FirPsiDiagnostic<*>, override val token: ValidityToken, -) : KtFirDiagnostic.RedundantAnnotationTarget(), KtAbstractFirDiagnostic { +) : KtFirDiagnostic.RedundantAnnotationTarget(), KtAbstractFirDiagnostic { override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) } internal class InapplicableFileTargetImpl( firDiagnostic: FirPsiDiagnostic<*>, override val token: ValidityToken, -) : KtFirDiagnostic.InapplicableFileTarget(), KtAbstractFirDiagnostic { +) : KtFirDiagnostic.InapplicableFileTarget(), KtAbstractFirDiagnostic { override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) }