diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index 9ceb8cfa08d..b0bf1bf5966 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -196,6 +196,9 @@ class QuickFixRegistrar : QuickFixContributor { VIRTUAL_MEMBER_HIDDEN.registerFactory(AddOverrideToEqualsHashCodeToStringActionFactory) UNUSED_VARIABLE.registerFactory(RemovePsiElementSimpleFix.RemoveVariableFactory) + UNUSED_VARIABLE.registerFactory(RenameToUnderscoreFix.Factory) + + UNUSED_DESTRUCTURED_PARAMETER_ENTRY.registerFactory(RenameToUnderscoreFix.Factory) SENSELESS_COMPARISON.registerFactory(SimplifyComparisonFix) @@ -273,6 +276,7 @@ class QuickFixRegistrar : QuickFixContributor { TOO_MANY_ARGUMENTS.registerFactory(ChangeFunctionSignatureFix) NO_VALUE_FOR_PARAMETER.registerFactory(ChangeFunctionSignatureFix) UNUSED_PARAMETER.registerFactory(RemoveUnusedFunctionParameterFix) + UNUSED_PARAMETER.registerFactory(RenameToUnderscoreFix.Factory) EXPECTED_PARAMETERS_NUMBER_MISMATCH.registerFactory(ChangeFunctionLiteralSignatureFix) EXPECTED_PARAMETER_TYPE_MISMATCH.registerFactory(ChangeTypeFix) diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/RenameToUnderscoreFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/RenameToUnderscoreFix.kt new file mode 100644 index 00000000000..9f79b35f226 --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/RenameToUnderscoreFix.kt @@ -0,0 +1,48 @@ +/* + * Copyright 2010-2016 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. + */ + +package org.jetbrains.kotlin.idea.quickfix + +import com.intellij.codeInsight.intention.IntentionAction +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.diagnostics.Diagnostic +import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.psi.* + +class RenameToUnderscoreFix(element: KtCallableDeclaration) : KotlinQuickFixAction(element) { + override fun getText() = "Rename to _" + override fun getFamilyName() = text + + override fun invoke(project: Project, editor: Editor?, file: KtFile) { + element.nameIdentifier?.replace(KtPsiFactory(project).createIdentifier("_")) + } + + companion object Factory : KotlinSingleIntentionActionFactory() { + override fun createAction(diagnostic: Diagnostic): IntentionAction? { + val declaration: KtCallableDeclaration? = when (diagnostic.factory) { + Errors.UNUSED_PARAMETER -> diagnostic.psiElement as? KtParameter + Errors.UNUSED_VARIABLE, Errors.UNUSED_DESTRUCTURED_PARAMETER_ENTRY -> + diagnostic.psiElement as? KtDestructuringDeclarationEntry + else -> null + } + + if (declaration?.nameIdentifier == null) return null + + return RenameToUnderscoreFix(declaration) + } + } +} diff --git a/idea/testData/quickfix/decreaseVisibility/exposedParameterType.kt b/idea/testData/quickfix/decreaseVisibility/exposedParameterType.kt index 57333374ac1..074e7ef3835 100644 --- a/idea/testData/quickfix/decreaseVisibility/exposedParameterType.kt +++ b/idea/testData/quickfix/decreaseVisibility/exposedParameterType.kt @@ -3,6 +3,7 @@ // ACTION: Make 'Nested' internal // ACTION: Make 'Nested' public // ACTION: Remove parameter 'arg' +// ACTION: Rename to _ // ACTION: Convert to expression body // ERROR: 'internal' function exposes its 'private' parameter type argument Nested // ERROR: Cannot access 'Nested': it is private in 'Outer' diff --git a/idea/testData/quickfix/renameToUnderscore/commonDestructuring.kt b/idea/testData/quickfix/renameToUnderscore/commonDestructuring.kt new file mode 100644 index 00000000000..b1ef404fa7c --- /dev/null +++ b/idea/testData/quickfix/renameToUnderscore/commonDestructuring.kt @@ -0,0 +1,8 @@ +// "Rename to _" "true" + +data class A(val x: String, val y: Int) + +fun bar() { + val (x, y) = A("", 1) + y.hashCode() +} diff --git a/idea/testData/quickfix/renameToUnderscore/commonDestructuring.kt.after b/idea/testData/quickfix/renameToUnderscore/commonDestructuring.kt.after new file mode 100644 index 00000000000..9cf6cddbcbb --- /dev/null +++ b/idea/testData/quickfix/renameToUnderscore/commonDestructuring.kt.after @@ -0,0 +1,8 @@ +// "Rename to _" "true" + +data class A(val x: String, val y: Int) + +fun bar() { + val (_, y) = A("", 1) + y.hashCode() +} diff --git a/idea/testData/quickfix/renameToUnderscore/forDestructuring.kt b/idea/testData/quickfix/renameToUnderscore/forDestructuring.kt new file mode 100644 index 00000000000..f24f4e2f8d9 --- /dev/null +++ b/idea/testData/quickfix/renameToUnderscore/forDestructuring.kt @@ -0,0 +1,9 @@ +// "Rename to _" "true" + +data class A(val x: String, val y: Int) + +fun bar(z: List) { + for ((x, y) in z) { + y.hashCode() + } +} diff --git a/idea/testData/quickfix/renameToUnderscore/forDestructuring.kt.after b/idea/testData/quickfix/renameToUnderscore/forDestructuring.kt.after new file mode 100644 index 00000000000..e9f0bf95ff0 --- /dev/null +++ b/idea/testData/quickfix/renameToUnderscore/forDestructuring.kt.after @@ -0,0 +1,9 @@ +// "Rename to _" "true" + +data class A(val x: String, val y: Int) + +fun bar(z: List) { + for ((_, y) in z) { + y.hashCode() + } +} diff --git a/idea/testData/quickfix/renameToUnderscore/lambdaDestructuring.kt b/idea/testData/quickfix/renameToUnderscore/lambdaDestructuring.kt new file mode 100644 index 00000000000..15eac5c908f --- /dev/null +++ b/idea/testData/quickfix/renameToUnderscore/lambdaDestructuring.kt @@ -0,0 +1,13 @@ +// "Rename to _" "true" + +data class A(val x: String, val y: Int) + +fun foo(block: (A) -> Unit) { + block(A("", 1)) +} + +fun bar() { + foo { (x, y: Int) -> + y.hashCode() + } +} diff --git a/idea/testData/quickfix/renameToUnderscore/lambdaDestructuring.kt.after b/idea/testData/quickfix/renameToUnderscore/lambdaDestructuring.kt.after new file mode 100644 index 00000000000..6f0aaad4ccc --- /dev/null +++ b/idea/testData/quickfix/renameToUnderscore/lambdaDestructuring.kt.after @@ -0,0 +1,13 @@ +// "Rename to _" "true" + +data class A(val x: String, val y: Int) + +fun foo(block: (A) -> Unit) { + block(A("", 1)) +} + +fun bar() { + foo { (_, y: Int) -> + y.hashCode() + } +} diff --git a/idea/testData/quickfix/renameToUnderscore/lambdaParameter.kt b/idea/testData/quickfix/renameToUnderscore/lambdaParameter.kt new file mode 100644 index 00000000000..3e7e93847dc --- /dev/null +++ b/idea/testData/quickfix/renameToUnderscore/lambdaParameter.kt @@ -0,0 +1,10 @@ +// "Rename to _" "true" +fun foo(block: (String, Int) -> Unit) { + block("", 1) +} + +fun bar() { + foo { x: String, y: Int -> + y.hashCode() + } +} diff --git a/idea/testData/quickfix/renameToUnderscore/lambdaParameter.kt.after b/idea/testData/quickfix/renameToUnderscore/lambdaParameter.kt.after new file mode 100644 index 00000000000..70fee6f50c7 --- /dev/null +++ b/idea/testData/quickfix/renameToUnderscore/lambdaParameter.kt.after @@ -0,0 +1,10 @@ +// "Rename to _" "true" +fun foo(block: (String, Int) -> Unit) { + block("", 1) +} + +fun bar() { + foo { _: String, y: Int -> + y.hashCode() + } +} diff --git a/idea/testData/quickfix/renameToUnderscore/noActionForCommonVal.kt b/idea/testData/quickfix/renameToUnderscore/noActionForCommonVal.kt new file mode 100644 index 00000000000..fd24aaf4da8 --- /dev/null +++ b/idea/testData/quickfix/renameToUnderscore/noActionForCommonVal.kt @@ -0,0 +1,8 @@ +// "Rename to _" "false" +// ACTION: Remove variable 'x' +// ACTION: Specify type explicitly +// ACTION: Split property declaration + +fun bar() { + val x = 1 +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index bfbeab0503c..9902af6f332 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -7419,6 +7419,45 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { } } + @TestMetadata("idea/testData/quickfix/renameToUnderscore") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class RenameToUnderscore extends AbstractQuickFixTest { + public void testAllFilesPresentInRenameToUnderscore() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/renameToUnderscore"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), true); + } + + @TestMetadata("commonDestructuring.kt") + public void testCommonDestructuring() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/renameToUnderscore/commonDestructuring.kt"); + doTest(fileName); + } + + @TestMetadata("forDestructuring.kt") + public void testForDestructuring() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/renameToUnderscore/forDestructuring.kt"); + doTest(fileName); + } + + @TestMetadata("lambdaDestructuring.kt") + public void testLambdaDestructuring() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/renameToUnderscore/lambdaDestructuring.kt"); + doTest(fileName); + } + + @TestMetadata("lambdaParameter.kt") + public void testLambdaParameter() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/renameToUnderscore/lambdaParameter.kt"); + doTest(fileName); + } + + @TestMetadata("noActionForCommonVal.kt") + public void testNoActionForCommonVal() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/renameToUnderscore/noActionForCommonVal.kt"); + doTest(fileName); + } + } + @TestMetadata("idea/testData/quickfix/renameUnresolvedReference") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)