From 266a7a67f0e2ce8ce3ad15937d19c26d9a35cc3a Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Wed, 29 Jan 2020 16:28:37 +0700 Subject: [PATCH] Create `ProhibitUseSiteTargetAnnotationsOnSuperTypesMigrationInspection` #KT-36258 Fixed --- idea/resources/META-INF/plugin-common.xml | 10 +++++ ...argetAnnotationsOnSuperTypesMigration.html | 5 +++ .../idea/inspections/RemoveAnnotationFix.kt | 15 ++++++-- ...otationsOnSuperTypesMigrationInspection.kt | 25 ++++++++++++ .../kotlin/idea/quickfix/QuickFixRegistrar.kt | 3 ++ .../.inspection | 1 + .../simple.kt | 10 +++++ .../simple.kt.after | 10 +++++ .../simple2.kt | 10 +++++ .../simple2.kt.after | 10 +++++ .../simple3.kt | 10 +++++ .../simple3.kt.after | 10 +++++ .../simple4.kt | 10 +++++ .../simple4.kt.after | 10 +++++ .../simple5.kt | 11 ++++++ .../LocalInspectionTestGenerated.java | 38 +++++++++++++++++++ 16 files changed, 184 insertions(+), 4 deletions(-) create mode 100644 idea/resources/inspectionDescriptions/ProhibitUseSiteTargetAnnotationsOnSuperTypesMigration.html create mode 100644 idea/src/org/jetbrains/kotlin/idea/inspections/migration/ProhibitUseSiteTargetAnnotationsOnSuperTypesMigrationInspection.kt create mode 100644 idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/.inspection create mode 100644 idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple.kt create mode 100644 idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple.kt.after create mode 100644 idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple2.kt create mode 100644 idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple2.kt.after create mode 100644 idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple3.kt create mode 100644 idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple3.kt.after create mode 100644 idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple4.kt create mode 100644 idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple4.kt.after create mode 100644 idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple5.kt diff --git a/idea/resources/META-INF/plugin-common.xml b/idea/resources/META-INF/plugin-common.xml index dbf6b0c3414..c5f0d77ca89 100644 --- a/idea/resources/META-INF/plugin-common.xml +++ b/idea/resources/META-INF/plugin-common.xml @@ -3159,6 +3159,16 @@ language="kotlin" /> + + + + Since Kotlin 1.4, annotations on superclass are meaningless. + + diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/RemoveAnnotationFix.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/RemoveAnnotationFix.kt index d3dc0ffee0f..99fc7439d11 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/RemoveAnnotationFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/RemoveAnnotationFix.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -13,12 +13,12 @@ import org.jetbrains.kotlin.idea.quickfix.KotlinSingleIntentionActionFactory import org.jetbrains.kotlin.psi.KtAnnotationEntry import org.jetbrains.kotlin.psi.KtFile -class RemoveAnnotationFix(private val name: String, annotationEntry: KtAnnotationEntry) : +class RemoveAnnotationFix(private val text: String = "Remove annotation", annotationEntry: KtAnnotationEntry) : KotlinQuickFixAction(annotationEntry) { - override fun getText() = name + override fun getText() = text - override fun getFamilyName() = name + override fun getFamilyName() = text override fun invoke(project: Project, editor: Editor?, file: KtFile) { element?.delete() @@ -30,4 +30,11 @@ class RemoveAnnotationFix(private val name: String, annotationEntry: KtAnnotatio return RemoveAnnotationFix("Remove @JvmOverloads annotation", annotationEntry) } } + + companion object : KotlinSingleIntentionActionFactory() { + override fun createAction(diagnostic: Diagnostic): RemoveAnnotationFix? { + val annotationEntry = diagnostic.psiElement as? KtAnnotationEntry ?: return null + return RemoveAnnotationFix(annotationEntry = annotationEntry) + } + } } \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/migration/ProhibitUseSiteTargetAnnotationsOnSuperTypesMigrationInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/migration/ProhibitUseSiteTargetAnnotationsOnSuperTypesMigrationInspection.kt new file mode 100644 index 00000000000..bbd3579cf9c --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/migration/ProhibitUseSiteTargetAnnotationsOnSuperTypesMigrationInspection.kt @@ -0,0 +1,25 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.inspections.migration + +import com.intellij.codeInspection.CleanupLocalInspectionTool +import org.jetbrains.kotlin.config.LanguageVersion +import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.idea.configuration.MigrationInfo +import org.jetbrains.kotlin.idea.configuration.isLanguageVersionUpdate +import org.jetbrains.kotlin.idea.quickfix.migration.MigrationFix +import org.jetbrains.kotlin.psi.KtAnnotationEntry + + +class ProhibitUseSiteTargetAnnotationsOnSuperTypesMigrationInspection : + AbstractDiagnosticBasedMigrationInspection(Errors.ANNOTATION_ON_SUPERCLASS, KtAnnotationEntry::class.java), + MigrationFix, + CleanupLocalInspectionTool { + override fun isApplicable(migrationInfo: MigrationInfo): Boolean { + return migrationInfo.isLanguageVersionUpdate(LanguageVersion.KOTLIN_1_3, LanguageVersion.KOTLIN_1_4) + } +} + diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index c388dd73d46..055995650aa 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -630,6 +630,9 @@ class QuickFixRegistrar : QuickFixContributor { NOT_A_FUNCTION_LABEL.registerFactory(RemoveReturnLabelFix) NOT_A_FUNCTION_LABEL_WARNING.registerFactory(RemoveReturnLabelFix) + ANNOTATION_ON_SUPERCLASS.registerFactory(RemoveAnnotationFix) + ANNOTATION_ON_SUPERCLASS_WARNING.registerFactory(RemoveAnnotationFix) + ACCIDENTAL_OVERRIDE.registerFactory(MakePrivateAndOverrideMemberFix.AccidentalOverrideFactory) } diff --git a/idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/.inspection b/idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/.inspection new file mode 100644 index 00000000000..7e6eb3577cc --- /dev/null +++ b/idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/.inspection @@ -0,0 +1 @@ +org.jetbrains.kotlin.idea.inspections.migration.ProhibitUseSiteTargetAnnotationsOnSuperTypesMigrationInspection diff --git a/idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple.kt b/idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple.kt new file mode 100644 index 00000000000..2449b165088 --- /dev/null +++ b/idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple.kt @@ -0,0 +1,10 @@ +// LANGUAGE_VERSION: 1.4 +// DISABLE-ERRORS + +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/idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple.kt.after b/idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple.kt.after new file mode 100644 index 00000000000..a53909da74c --- /dev/null +++ b/idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple.kt.after @@ -0,0 +1,10 @@ +// LANGUAGE_VERSION: 1.4 +// DISABLE-ERRORS + +interface Foo + +annotation class Ann + +class E : @get:Ann @set:Ann @setparam:Ann Foo + +interface G : @Ann Foo \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple2.kt b/idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple2.kt new file mode 100644 index 00000000000..2cc5cfad90e --- /dev/null +++ b/idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple2.kt @@ -0,0 +1,10 @@ +// LANGUAGE_VERSION: 1.4 +// DISABLE-ERRORS + +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/idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple2.kt.after b/idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple2.kt.after new file mode 100644 index 00000000000..aad07269d42 --- /dev/null +++ b/idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple2.kt.after @@ -0,0 +1,10 @@ +// LANGUAGE_VERSION: 1.4 +// DISABLE-ERRORS + +interface Foo + +annotation class Ann + +class E : @field:Ann @set:Ann @setparam:Ann Foo + +interface G : @Ann Foo \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple3.kt b/idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple3.kt new file mode 100644 index 00000000000..873ccefc5e5 --- /dev/null +++ b/idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple3.kt @@ -0,0 +1,10 @@ +// LANGUAGE_VERSION: 1.4 +// DISABLE-ERRORS + +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/idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple3.kt.after b/idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple3.kt.after new file mode 100644 index 00000000000..3cd3cee423c --- /dev/null +++ b/idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple3.kt.after @@ -0,0 +1,10 @@ +// LANGUAGE_VERSION: 1.4 +// DISABLE-ERRORS + +interface Foo + +annotation class Ann + +class E : @field:Ann @get:Ann @setparam:Ann Foo + +interface G : @Ann Foo \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple4.kt b/idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple4.kt new file mode 100644 index 00000000000..255b0f19724 --- /dev/null +++ b/idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple4.kt @@ -0,0 +1,10 @@ +// LANGUAGE_VERSION: 1.4 +// DISABLE-ERRORS + +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/idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple4.kt.after b/idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple4.kt.after new file mode 100644 index 00000000000..9544cf3d4ae --- /dev/null +++ b/idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple4.kt.after @@ -0,0 +1,10 @@ +// LANGUAGE_VERSION: 1.4 +// DISABLE-ERRORS + +interface Foo + +annotation class Ann + +class E : @field:Ann @get:Ann @set:Ann Foo + +interface G : @Ann Foo \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple5.kt b/idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple5.kt new file mode 100644 index 00000000000..24c72bbd4fe --- /dev/null +++ b/idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple5.kt @@ -0,0 +1,11 @@ +// LANGUAGE_VERSION: 1.4 +// PROBLEM: none +// DISABLE-ERRORS + +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/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java index b1caf88262b..5340a4a4f6e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -6639,6 +6639,44 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest { } } + @TestMetadata("idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class ProhibitUseSiteTargetAnnotationsOnSuperTypesMigration extends AbstractLocalInspectionTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + public void testAllFilesPresentInProhibitUseSiteTargetAnnotationsOnSuperTypesMigration() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration"), Pattern.compile("^([\\w\\-_]+)\\.(kt|kts)$"), null, true); + } + + @TestMetadata("simple.kt") + public void testSimple() throws Exception { + runTest("idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple.kt"); + } + + @TestMetadata("simple2.kt") + public void testSimple2() throws Exception { + runTest("idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple2.kt"); + } + + @TestMetadata("simple3.kt") + public void testSimple3() throws Exception { + runTest("idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple3.kt"); + } + + @TestMetadata("simple4.kt") + public void testSimple4() throws Exception { + runTest("idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple4.kt"); + } + + @TestMetadata("simple5.kt") + public void testSimple5() throws Exception { + runTest("idea/testData/inspectionsLocal/prohibitUseSiteTargetAnnotationsOnSuperTypesMigration/simple5.kt"); + } + } + @TestMetadata("idea/testData/inspectionsLocal/recursiveEqualsCall") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)