From 733e596eed26cb4cb3ca63e76fc7d3fc404799e3 Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Wed, 29 Jan 2020 20:10:32 +0700 Subject: [PATCH] Create `WarningOnMainUnusedParameterMigrationInspection` #KT-36256 Fixed --- idea/resources/META-INF/plugin-common.xml | 10 +++++ ...WarningOnMainUnusedParameterMigration.html | 5 +++ ...nMainUnusedParameterMigrationInspection.kt | 44 +++++++++++++++++++ .../RemoveUnusedFunctionParameterFix.kt | 29 ++++++------ .../.inspection | 1 + .../simple.kt | 9 ++++ .../simple.kt.after | 9 ++++ .../LocalInspectionTestGenerated.java | 18 ++++++++ 8 files changed, 109 insertions(+), 16 deletions(-) create mode 100644 idea/resources/inspectionDescriptions/WarningOnMainUnusedParameterMigration.html create mode 100644 idea/src/org/jetbrains/kotlin/idea/inspections/migration/WarningOnMainUnusedParameterMigrationInspection.kt create mode 100644 idea/testData/inspectionsLocal/warningOnMainUnusedParameterMigration/.inspection create mode 100644 idea/testData/inspectionsLocal/warningOnMainUnusedParameterMigration/simple.kt create mode 100644 idea/testData/inspectionsLocal/warningOnMainUnusedParameterMigration/simple.kt.after diff --git a/idea/resources/META-INF/plugin-common.xml b/idea/resources/META-INF/plugin-common.xml index 64839e8325b..8c82d776f25 100644 --- a/idea/resources/META-INF/plugin-common.xml +++ b/idea/resources/META-INF/plugin-common.xml @@ -3179,6 +3179,16 @@ language="kotlin" /> + + + + Since Kotlin 1.4, a main function with an unused parameter has a compiler warning UNUSED_PARAMETER. + + diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/migration/WarningOnMainUnusedParameterMigrationInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/migration/WarningOnMainUnusedParameterMigrationInspection.kt new file mode 100644 index 00000000000..76e2d1b4a9a --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/migration/WarningOnMainUnusedParameterMigrationInspection.kt @@ -0,0 +1,44 @@ +/* + * 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.codeInsight.intention.IntentionAction +import com.intellij.codeInspection.CleanupLocalInspectionTool +import org.jetbrains.kotlin.config.LanguageVersion +import org.jetbrains.kotlin.descriptors.FunctionDescriptor +import org.jetbrains.kotlin.diagnostics.Diagnostic +import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.idea.MainFunctionDetector +import org.jetbrains.kotlin.idea.configuration.MigrationInfo +import org.jetbrains.kotlin.idea.configuration.isLanguageVersionUpdate +import org.jetbrains.kotlin.idea.project.languageVersionSettings +import org.jetbrains.kotlin.idea.quickfix.RemoveUnusedFunctionParameterFix +import org.jetbrains.kotlin.idea.quickfix.migration.MigrationFix +import org.jetbrains.kotlin.idea.search.usagesSearch.descriptor +import org.jetbrains.kotlin.psi.KtNamedFunction +import org.jetbrains.kotlin.psi.KtParameter + + +class WarningOnMainUnusedParameterMigrationInspection : + AbstractDiagnosticBasedMigrationInspection( + Errors.UNUSED_PARAMETER, + KtParameter::class.java, + ::createIntentionActionForMainFunction, + ), + MigrationFix, + CleanupLocalInspectionTool { + override fun isApplicable(migrationInfo: MigrationInfo): Boolean { + return migrationInfo.isLanguageVersionUpdate(LanguageVersion.KOTLIN_1_3, LanguageVersion.KOTLIN_1_4) + } +} + +private fun createIntentionActionForMainFunction(diagnostic: Diagnostic): IntentionAction? { + val parameter = diagnostic.psiElement as? KtParameter ?: return null + val ownerFunction = parameter.ownerFunction as? KtNamedFunction ?: return null + val mainFunctionDetector = MainFunctionDetector(parameter.languageVersionSettings) { it.descriptor as? FunctionDescriptor } + if (!mainFunctionDetector.isMain(ownerFunction)) return null + return RemoveUnusedFunctionParameterFix(parameter, false) +} \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveUnusedFunctionParameterFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveUnusedFunctionParameterFix.kt index b2557f5a765..f93d299294c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveUnusedFunctionParameterFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveUnusedFunctionParameterFix.kt @@ -1,17 +1,6 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * 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.quickfix @@ -30,7 +19,8 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode -class RemoveUnusedFunctionParameterFix(parameter: KtParameter) : KotlinQuickFixAction(parameter) { +class RemoveUnusedFunctionParameterFix(parameter: KtParameter, private val checkUsages: Boolean = true) : + KotlinQuickFixAction(parameter) { override fun getFamilyName() = ChangeFunctionSignatureFix.FAMILY_NAME override fun getText() = element?.let { "Remove parameter '${it.name}'" } ?: "" @@ -40,6 +30,13 @@ class RemoveUnusedFunctionParameterFix(parameter: KtParameter) : KotlinQuickFixA override fun invoke(project: Project, editor: Editor?, file: KtFile) { val parameter = element ?: return val parameterList = parameter.parent as? KtParameterList ?: return + if (!checkUsages) { + runWriteAction { + parameterList.removeParameter(parameter) + } + return + } + val parameterDescriptor = parameter.resolveToParameterDescriptorIfAny(BodyResolveMode.FULL) ?: return val parameterSize = parameterList.parameters.size val typeParameters = typeParameters(parameter.typeReference) @@ -81,7 +78,7 @@ class RemoveUnusedFunctionParameterFix(parameter: KtParameter) : KotlinQuickFixA if (typeReference == null) return emptyList() val parameterParent = typeReference.getParentOfTypesAndPredicate( true, - KtNamedFunction::class.java, KtProperty::class.java, KtClass::class.java + KtNamedFunction::class.java, KtProperty::class.java, KtClass::class.java, ) { true } return typeReference.typeElement ?.collectDescendantsOfType { true } @@ -89,7 +86,7 @@ class RemoveUnusedFunctionParameterFix(parameter: KtParameter) : KotlinQuickFixA val typeParameter = it.reference?.resolve() as? KtTypeParameter ?: return@mapNotNull null val parent = typeParameter.getParentOfTypesAndPredicate( true, - KtNamedFunction::class.java, KtProperty::class.java, KtClass::class.java + KtNamedFunction::class.java, KtProperty::class.java, KtClass::class.java, ) { true } if (parent == parameterParent) typeParameter else null } ?: emptyList() diff --git a/idea/testData/inspectionsLocal/warningOnMainUnusedParameterMigration/.inspection b/idea/testData/inspectionsLocal/warningOnMainUnusedParameterMigration/.inspection new file mode 100644 index 00000000000..476cab87fc1 --- /dev/null +++ b/idea/testData/inspectionsLocal/warningOnMainUnusedParameterMigration/.inspection @@ -0,0 +1 @@ +org.jetbrains.kotlin.idea.inspections.migration.WarningOnMainUnusedParameterMigrationInspection diff --git a/idea/testData/inspectionsLocal/warningOnMainUnusedParameterMigration/simple.kt b/idea/testData/inspectionsLocal/warningOnMainUnusedParameterMigration/simple.kt new file mode 100644 index 00000000000..1f7052296cd --- /dev/null +++ b/idea/testData/inspectionsLocal/warningOnMainUnusedParameterMigration/simple.kt @@ -0,0 +1,9 @@ +// LANGUAGE_VERSION: 1.4 +// ERROR: Too many arguments for public fun main(): Unit defined in root package in file simple.kt + +fun main(args: Array) { +} + +fun b() { + main(arrayOf("test")) +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/warningOnMainUnusedParameterMigration/simple.kt.after b/idea/testData/inspectionsLocal/warningOnMainUnusedParameterMigration/simple.kt.after new file mode 100644 index 00000000000..840387fa2f5 --- /dev/null +++ b/idea/testData/inspectionsLocal/warningOnMainUnusedParameterMigration/simple.kt.after @@ -0,0 +1,9 @@ +// LANGUAGE_VERSION: 1.4 +// ERROR: Too many arguments for public fun main(): Unit defined in root package in file simple.kt + +fun main() { +} + +fun b() { + main(arrayOf("test")) +} \ 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 bd89c2c29f7..3cd6d9e208e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -13325,6 +13325,24 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest { } } + @TestMetadata("idea/testData/inspectionsLocal/warningOnMainUnusedParameterMigration") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class WarningOnMainUnusedParameterMigration extends AbstractLocalInspectionTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + public void testAllFilesPresentInWarningOnMainUnusedParameterMigration() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/testData/inspectionsLocal/warningOnMainUnusedParameterMigration"), Pattern.compile("^([\\w\\-_]+)\\.(kt|kts)$"), null, true); + } + + @TestMetadata("simple.kt") + public void testSimple() throws Exception { + runTest("idea/testData/inspectionsLocal/warningOnMainUnusedParameterMigration/simple.kt"); + } + } + @TestMetadata("idea/testData/inspectionsLocal/whenWithOnlyElse") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)