From 8d48d899d0d4370acbb4e9dca2bb3d97602a0e55 Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Wed, 29 Jan 2020 17:55:01 +0700 Subject: [PATCH] Create `ProhibitRepeatedUseSiteTargetAnnotationsMigrationInspection` #KT-36257 Fixed --- idea/resources/META-INF/plugin-common.xml | 10 +++++ ...atedUseSiteTargetAnnotationsMigration.html | 5 +++ ...iteTargetAnnotationsMigrationInspection.kt | 25 +++++++++++ .../kotlin/idea/quickfix/QuickFixRegistrar.kt | 3 ++ .../.inspection | 1 + .../simple.kt | 21 +++++++++ .../simple.kt.after | 20 +++++++++ .../simple2.kt | 22 ++++++++++ .../simple3.kt | 21 +++++++++ .../simple3.kt.after | 20 +++++++++ .../simple4.kt | 21 +++++++++ .../simple4.kt.after | 20 +++++++++ .../simple5.kt | 21 +++++++++ .../simple5.kt.after | 21 +++++++++ .../simple6.kt | 22 ++++++++++ .../LocalInspectionTestGenerated.java | 43 +++++++++++++++++++ 16 files changed, 296 insertions(+) create mode 100644 idea/resources/inspectionDescriptions/ProhibitRepeatedUseSiteTargetAnnotationsMigration.html create mode 100644 idea/src/org/jetbrains/kotlin/idea/inspections/migration/ProhibitRepeatedUseSiteTargetAnnotationsMigrationInspection.kt create mode 100644 idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/.inspection create mode 100644 idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple.kt create mode 100644 idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple.kt.after create mode 100644 idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple2.kt create mode 100644 idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple3.kt create mode 100644 idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple3.kt.after create mode 100644 idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple4.kt create mode 100644 idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple4.kt.after create mode 100644 idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple5.kt create mode 100644 idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple5.kt.after create mode 100644 idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple6.kt diff --git a/idea/resources/META-INF/plugin-common.xml b/idea/resources/META-INF/plugin-common.xml index c5f0d77ca89..64839e8325b 100644 --- a/idea/resources/META-INF/plugin-common.xml +++ b/idea/resources/META-INF/plugin-common.xml @@ -3169,6 +3169,16 @@ language="kotlin" /> + + + +Since Kotlin 1.4, it's forbidden to repeat annotation on property accessors. + + diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/migration/ProhibitRepeatedUseSiteTargetAnnotationsMigrationInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/migration/ProhibitRepeatedUseSiteTargetAnnotationsMigrationInspection.kt new file mode 100644 index 00000000000..afc0ea7d0d2 --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/migration/ProhibitRepeatedUseSiteTargetAnnotationsMigrationInspection.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 ProhibitRepeatedUseSiteTargetAnnotationsMigrationInspection : + AbstractDiagnosticBasedMigrationInspection(Errors.REPEATED_ANNOTATION, 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 055995650aa..41468f6425c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -633,6 +633,9 @@ class QuickFixRegistrar : QuickFixContributor { ANNOTATION_ON_SUPERCLASS.registerFactory(RemoveAnnotationFix) ANNOTATION_ON_SUPERCLASS_WARNING.registerFactory(RemoveAnnotationFix) + REPEATED_ANNOTATION.registerFactory(RemoveAnnotationFix) + REPEATED_ANNOTATION_WARNING.registerFactory(RemoveAnnotationFix) + ACCIDENTAL_OVERRIDE.registerFactory(MakePrivateAndOverrideMemberFix.AccidentalOverrideFactory) } diff --git a/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/.inspection b/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/.inspection new file mode 100644 index 00000000000..eaabebddc2c --- /dev/null +++ b/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/.inspection @@ -0,0 +1 @@ +org.jetbrains.kotlin.idea.inspections.migration.ProhibitRepeatedUseSiteTargetAnnotationsMigrationInspection diff --git a/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple.kt b/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple.kt new file mode 100644 index 00000000000..fc74b9a5b70 --- /dev/null +++ b/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple.kt @@ -0,0 +1,21 @@ +// LANGUAGE_VERSION: 1.4 +// DISABLE-ERRORS + +annotation class Ann(val x: Int) + +@get:Ann(10) +val a: String + @Ann(20) get() = "foo" + +@set:Ann(10) +var b: String = "" + @Ann(20) set(value) { field = value } + +@setparam:Ann(10) +var c = " " + set(@Ann(20) x) {} + +@get:Ann(10) +@get:Ann(20) +val d: String +@Ann(30) @Ann(40) get() = "foo" \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple.kt.after b/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple.kt.after new file mode 100644 index 00000000000..3ef51c35f5f --- /dev/null +++ b/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple.kt.after @@ -0,0 +1,20 @@ +// LANGUAGE_VERSION: 1.4 +// DISABLE-ERRORS + +annotation class Ann(val x: Int) + +val a: String + @Ann(20) get() = "foo" + +@set:Ann(10) +var b: String = "" + @Ann(20) set(value) { field = value } + +@setparam:Ann(10) +var c = " " + set(@Ann(20) x) {} + +@get:Ann(10) +@get:Ann(20) +val d: String +@Ann(30) @Ann(40) get() = "foo" \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple2.kt b/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple2.kt new file mode 100644 index 00000000000..a3d50b47f78 --- /dev/null +++ b/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple2.kt @@ -0,0 +1,22 @@ +// LANGUAGE_VERSION: 1.4 +// DISABLE-ERRORS +// PROBLEM: none + +annotation class Ann(val x: Int) + +@get:Ann(10) +val a: String + @Ann(20) get() = "foo" + +@set:Ann(10) +var b: String = "" + @Ann(20) set(value) { field = value } + +@setparam:Ann(10) +var c = " " + set(@Ann(20) x) {} + +@get:Ann(10) +@get:Ann(20) +val d: String + @Ann(30) @Ann(40) get() = "foo" \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple3.kt b/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple3.kt new file mode 100644 index 00000000000..0bf30d96edc --- /dev/null +++ b/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple3.kt @@ -0,0 +1,21 @@ +// LANGUAGE_VERSION: 1.4 +// DISABLE-ERRORS + +annotation class Ann(val x: Int) + +@get:Ann(10) +val a: String + @Ann(20) get() = "foo" + +@set:Ann(10) +var b: String = "" + @Ann(20) set(value) { field = value } + +@setparam:Ann(10) +var c = " " + set(@Ann(20) x) {} + +@get:Ann(10) +@get:Ann(20) +val d: String + @Ann(30) @Ann(40) get() = "foo" \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple3.kt.after b/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple3.kt.after new file mode 100644 index 00000000000..d9cfde7e59c --- /dev/null +++ b/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple3.kt.after @@ -0,0 +1,20 @@ +// LANGUAGE_VERSION: 1.4 +// DISABLE-ERRORS + +annotation class Ann(val x: Int) + +@get:Ann(10) +val a: String + @Ann(20) get() = "foo" + +var b: String = "" + @Ann(20) set(value) { field = value } + +@setparam:Ann(10) +var c = " " + set(@Ann(20) x) {} + +@get:Ann(10) +@get:Ann(20) +val d: String + @Ann(30) @Ann(40) get() = "foo" \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple4.kt b/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple4.kt new file mode 100644 index 00000000000..95dbb1d71ff --- /dev/null +++ b/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple4.kt @@ -0,0 +1,21 @@ +// LANGUAGE_VERSION: 1.4 +// DISABLE-ERRORS + +annotation class Ann(val x: Int) + +@get:Ann(10) +val a: String + @Ann(20) get() = "foo" + +@set:Ann(10) +var b: String = "" + @Ann(20) set(value) { field = value } + +@setparam:Ann(10) +var c = " " + set(@Ann(20) x) {} + +@get:Ann(10) +@get:Ann(20) +val d: String + @Ann(30) @Ann(40) get() = "foo" \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple4.kt.after b/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple4.kt.after new file mode 100644 index 00000000000..be57905a510 --- /dev/null +++ b/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple4.kt.after @@ -0,0 +1,20 @@ +// LANGUAGE_VERSION: 1.4 +// DISABLE-ERRORS + +annotation class Ann(val x: Int) + +@get:Ann(10) +val a: String + @Ann(20) get() = "foo" + +@set:Ann(10) +var b: String = "" + @Ann(20) set(value) { field = value } + +var c = " " + set(@Ann(20) x) {} + +@get:Ann(10) +@get:Ann(20) +val d: String + @Ann(30) @Ann(40) get() = "foo" \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple5.kt b/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple5.kt new file mode 100644 index 00000000000..e899ee5736d --- /dev/null +++ b/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple5.kt @@ -0,0 +1,21 @@ +// LANGUAGE_VERSION: 1.4 +// DISABLE-ERRORS + +annotation class Ann(val x: Int) + +@get:Ann(10) +val a: String + @Ann(20) get() = "foo" + +@set:Ann(10) +var b: String = "" + @Ann(20) set(value) { field = value } + +@setparam:Ann(10) +var c = " " + set(@Ann(20) x) {} + +@get:Ann(10) +@get:Ann(20) +val d: String + @Ann(30) @Ann(40) get() = "foo" \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple5.kt.after b/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple5.kt.after new file mode 100644 index 00000000000..1516a4225d1 --- /dev/null +++ b/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple5.kt.after @@ -0,0 +1,21 @@ +// LANGUAGE_VERSION: 1.4 +// DISABLE-ERRORS + +annotation class Ann(val x: Int) + +@get:Ann(10) +val a: String + @Ann(20) get() = "foo" + +@set:Ann(10) +var b: String = "" + @Ann(20) set(value) { field = value } + +@setparam:Ann(10) +var c = " " + set(@Ann(20) x) {} + +@get:Ann(10) +@get:Ann(20) +val d: String + @Ann(30) get() = "foo" \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple6.kt b/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple6.kt new file mode 100644 index 00000000000..f123306b2b2 --- /dev/null +++ b/idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple6.kt @@ -0,0 +1,22 @@ +// LANGUAGE_VERSION: 1.4 +// DISABLE-ERRORS +// PROBLEM: none + +annotation class Ann(val x: Int) + +@get:Ann(10) +val a: String + @Ann(20) get() = "foo" + +@set:Ann(10) +var b: String = "" + @Ann(20) set(value) { field = value } + +@setparam:Ann(10) +var c = " " + set(@Ann(20) x) {} + +@get:Ann(10) +@get:Ann(20) +val d: String + @Ann(30) @Ann(40) get() = "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 5340a4a4f6e..bd89c2c29f7 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -6621,6 +6621,49 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest { } } + @TestMetadata("idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class ProhibitRepeatedUseSiteTargetAnnotationsMigration extends AbstractLocalInspectionTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + public void testAllFilesPresentInProhibitRepeatedUseSiteTargetAnnotationsMigration() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration"), Pattern.compile("^([\\w\\-_]+)\\.(kt|kts)$"), null, true); + } + + @TestMetadata("simple.kt") + public void testSimple() throws Exception { + runTest("idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple.kt"); + } + + @TestMetadata("simple2.kt") + public void testSimple2() throws Exception { + runTest("idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple2.kt"); + } + + @TestMetadata("simple3.kt") + public void testSimple3() throws Exception { + runTest("idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple3.kt"); + } + + @TestMetadata("simple4.kt") + public void testSimple4() throws Exception { + runTest("idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple4.kt"); + } + + @TestMetadata("simple5.kt") + public void testSimple5() throws Exception { + runTest("idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple5.kt"); + } + + @TestMetadata("simple6.kt") + public void testSimple6() throws Exception { + runTest("idea/testData/inspectionsLocal/prohibitRepeatedUseSiteTargetAnnotationsMigration/simple6.kt"); + } + } + @TestMetadata("idea/testData/inspectionsLocal/prohibitTypeParametersForLocalVariablesMigration") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)