diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index eb95a507353..1be29d61c02 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -519,6 +519,7 @@ + callable.valueParameters.firstOrNull { it.name == element.name } + is PsiMethod -> callable.parameterList.parameters.firstOrNull { it.name == element.name } + else -> null + } + if (parameter == null) continue + myElements += parameter + } + suggestAllNames(element.name, newName.quoteIfNeeded()) + } + + override fun getDialogTitle() = "Rename Parameters" + + override fun getDialogDescription() = "Rename parameter in hierarchy to:" + + override fun entityName() = "Parameter" + + override fun isSelectedByDefault() = true +} + +class AutomaticParameterRenamerFactory : AutomaticRenamerFactory { + override fun isApplicable(element: PsiElement) = element is KtParameter && element.ownerFunction is KtNamedFunction + + override fun getOptionName() = RefactoringBundle.message("rename.parameters.hierarchy")!! + + override fun isEnabled() = JavaRefactoringSettings.getInstance().isRenameParameterInHierarchy + + override fun setEnabled(enabled: Boolean) { + JavaRefactoringSettings.getInstance().isRenameParameterInHierarchy = enabled + } + + override fun createRenamer(element: PsiElement, newName: String, usages: Collection): AutomaticRenamer { + return AutomaticParameterRenamer(element as KtParameter, newName) + } +} \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinParameterProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinParameterProcessor.kt index 245def3719e..f1d9679041a 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinParameterProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinParameterProcessor.kt @@ -17,21 +17,12 @@ package org.jetbrains.kotlin.idea.refactoring.rename import com.intellij.psi.PsiElement -import com.intellij.psi.PsiMethod -import com.intellij.psi.PsiNamedElement -import com.intellij.psi.search.SearchScope import com.intellij.refactoring.JavaRefactoringSettings import com.intellij.refactoring.listeners.RefactoringElementListener import com.intellij.usageView.UsageInfo import org.jetbrains.kotlin.asJava.namedUnwrappedElement -import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.VariableDescriptor import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor -import org.jetbrains.kotlin.idea.core.getDeepestSuperDeclarations -import org.jetbrains.kotlin.idea.core.quoteIfNeeded -import org.jetbrains.kotlin.idea.refactoring.canRefactor -import org.jetbrains.kotlin.idea.refactoring.getAffectedCallables -import org.jetbrains.kotlin.psi.KtCallableDeclaration import org.jetbrains.kotlin.psi.KtFunction import org.jetbrains.kotlin.psi.KtNamedDeclaration import org.jetbrains.kotlin.psi.KtParameter @@ -63,26 +54,6 @@ class RenameKotlinParameterProcessor : RenameKotlinPsiProcessor() { result += collisions } - override fun prepareRenaming(element: PsiElement, newName: String?, allRenames: MutableMap, scope: SearchScope) { - super.prepareRenaming(element, newName, allRenames, scope) - - if (element !is KtParameter || newName == null) return - - val function = element.ownerFunction ?: return - val originalDescriptor = function.resolveToDescriptor() as FunctionDescriptor - val affectedCallables = getAffectedCallables(element.project, originalDescriptor.getDeepestSuperDeclarations()) - for (callable in affectedCallables) { - if (!callable.canRefactor()) continue - val parameter: PsiNamedElement? = when (callable) { - is KtCallableDeclaration -> callable.valueParameters.firstOrNull { it.name == element.name } - is PsiMethod -> callable.parameterList.parameters.firstOrNull { it.name == element.name } - else -> null - } - if (parameter == null) continue - allRenames[parameter] = newName.quoteIfNeeded() - } - } - override fun renameElement(element: PsiElement, newName: String?, usages: Array, listener: RefactoringElementListener?) { super.renameElement(element, newName, usages, listener) diff --git a/idea/testData/refactoring/rename/automaticRenamerParameter/after/main.kt b/idea/testData/refactoring/rename/automaticRenamerParameter/after/main.kt index da334eaffd7..13b208b9d48 100644 --- a/idea/testData/refactoring/rename/automaticRenamerParameter/after/main.kt +++ b/idea/testData/refactoring/rename/automaticRenamerParameter/after/main.kt @@ -1,12 +1,12 @@ package testing interface Trait { - open fun foo(aa: Int, b: String) { + open fun foo(a: Int, b: String) { } } open class Super { - open fun foo(aa: Int, b: String) { + open fun foo(a: Int, b: String) { } } diff --git a/idea/testData/refactoring/rename/automaticRenamerParameterInExtension/after/main.kt b/idea/testData/refactoring/rename/automaticRenamerParameterInExtension/after/main.kt index 4f81920253b..e1b7e1c7a7d 100644 --- a/idea/testData/refactoring/rename/automaticRenamerParameterInExtension/after/main.kt +++ b/idea/testData/refactoring/rename/automaticRenamerParameterInExtension/after/main.kt @@ -1,12 +1,12 @@ package testing interface Trait { - open fun Int.foo(aa: Int, b: String) { + open fun Int.foo(a: Int, b: String) { } } open class Super { - open fun Int.foo(aa: Int, b: String) { + open fun Int.foo(a: Int, b: String) { } } diff --git a/idea/testData/refactoring/rename/parameterHierarchyLeaf/after/J.java b/idea/testData/refactoring/rename/parameterHierarchyLeaf/after/J.java new file mode 100644 index 00000000000..74fd3f4892a --- /dev/null +++ b/idea/testData/refactoring/rename/parameterHierarchyLeaf/after/J.java @@ -0,0 +1,17 @@ +class J1 implements Foo { + public void foo(String s) { + + } +} + +class J2 extends J1 { + public void foo(String s) { + + } +} + +class J3 extends Foo1 { + public void foo(String s) { + + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/parameterHierarchyLeaf/after/test.kt b/idea/testData/refactoring/rename/parameterHierarchyLeaf/after/test.kt new file mode 100644 index 00000000000..a22db1a5029 --- /dev/null +++ b/idea/testData/refactoring/rename/parameterHierarchyLeaf/after/test.kt @@ -0,0 +1,15 @@ +interface Foo { + fun foo(s: String) +} + +open class Foo1 : Foo { + override fun foo(s: String) { } +} + +class Foo2 : Foo { + override fun foo(x: String) { } +} + +class Foo3 : Foo1() { + override fun foo(s: String) { } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/parameterHierarchyLeaf/before/J.java b/idea/testData/refactoring/rename/parameterHierarchyLeaf/before/J.java new file mode 100644 index 00000000000..74fd3f4892a --- /dev/null +++ b/idea/testData/refactoring/rename/parameterHierarchyLeaf/before/J.java @@ -0,0 +1,17 @@ +class J1 implements Foo { + public void foo(String s) { + + } +} + +class J2 extends J1 { + public void foo(String s) { + + } +} + +class J3 extends Foo1 { + public void foo(String s) { + + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/parameterHierarchyLeaf/before/test.kt b/idea/testData/refactoring/rename/parameterHierarchyLeaf/before/test.kt new file mode 100644 index 00000000000..484402d2c10 --- /dev/null +++ b/idea/testData/refactoring/rename/parameterHierarchyLeaf/before/test.kt @@ -0,0 +1,15 @@ +interface Foo { + fun foo(s: String) +} + +open class Foo1 : Foo { + override fun foo(s: String) { } +} + +class Foo2 : Foo { + override fun foo(/*rename*/s: String) { } +} + +class Foo3 : Foo1() { + override fun foo(s: String) { } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/parameterHierarchyLeaf/parameterHierarchyLeaf.test b/idea/testData/refactoring/rename/parameterHierarchyLeaf/parameterHierarchyLeaf.test new file mode 100644 index 00000000000..ec57f250b06 --- /dev/null +++ b/idea/testData/refactoring/rename/parameterHierarchyLeaf/parameterHierarchyLeaf.test @@ -0,0 +1,5 @@ +{ + "type": "MARKED_ELEMENT", + "mainFile": "test.kt", + "newName": "x" +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/parameterHierarchyMiddle/after/J.java b/idea/testData/refactoring/rename/parameterHierarchyMiddle/after/J.java new file mode 100644 index 00000000000..459aff74887 --- /dev/null +++ b/idea/testData/refactoring/rename/parameterHierarchyMiddle/after/J.java @@ -0,0 +1,17 @@ +class J1 implements Foo { + public void foo(String s) { + + } +} + +class J2 extends J1 { + public void foo(String s) { + + } +} + +class J3 extends Foo1 { + public void foo(String x) { + + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/parameterHierarchyMiddle/after/test.kt b/idea/testData/refactoring/rename/parameterHierarchyMiddle/after/test.kt new file mode 100644 index 00000000000..2231ff02059 --- /dev/null +++ b/idea/testData/refactoring/rename/parameterHierarchyMiddle/after/test.kt @@ -0,0 +1,15 @@ +interface Foo { + fun foo(s: String) +} + +open class Foo1 : Foo { + override fun foo(x: String) { } +} + +class Foo2 : Foo { + override fun foo(s: String) { } +} + +class Foo3 : Foo1() { + override fun foo(x: String) { } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/parameterHierarchyMiddle/before/J.java b/idea/testData/refactoring/rename/parameterHierarchyMiddle/before/J.java new file mode 100644 index 00000000000..74fd3f4892a --- /dev/null +++ b/idea/testData/refactoring/rename/parameterHierarchyMiddle/before/J.java @@ -0,0 +1,17 @@ +class J1 implements Foo { + public void foo(String s) { + + } +} + +class J2 extends J1 { + public void foo(String s) { + + } +} + +class J3 extends Foo1 { + public void foo(String s) { + + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/parameterHierarchyMiddle/before/test.kt b/idea/testData/refactoring/rename/parameterHierarchyMiddle/before/test.kt new file mode 100644 index 00000000000..38bb35a8703 --- /dev/null +++ b/idea/testData/refactoring/rename/parameterHierarchyMiddle/before/test.kt @@ -0,0 +1,15 @@ +interface Foo { + fun foo(s: String) +} + +open class Foo1 : Foo { + override fun foo(/*rename*/s: String) { } +} + +class Foo2 : Foo { + override fun foo(s: String) { } +} + +class Foo3 : Foo1() { + override fun foo(s: String) { } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/parameterHierarchyMiddle/parameterHierarchyMiddle.test b/idea/testData/refactoring/rename/parameterHierarchyMiddle/parameterHierarchyMiddle.test new file mode 100644 index 00000000000..ec57f250b06 --- /dev/null +++ b/idea/testData/refactoring/rename/parameterHierarchyMiddle/parameterHierarchyMiddle.test @@ -0,0 +1,5 @@ +{ + "type": "MARKED_ELEMENT", + "mainFile": "test.kt", + "newName": "x" +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/parameterHierarchyRoot/after/J.java b/idea/testData/refactoring/rename/parameterHierarchyRoot/after/J.java new file mode 100644 index 00000000000..4749bd4934b --- /dev/null +++ b/idea/testData/refactoring/rename/parameterHierarchyRoot/after/J.java @@ -0,0 +1,17 @@ +class J1 implements Foo { + public void foo(String x) { + + } +} + +class J2 extends J1 { + public void foo(String x) { + + } +} + +class J3 extends Foo1 { + public void foo(String x) { + + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/parameterHierarchyRoot/after/test.kt b/idea/testData/refactoring/rename/parameterHierarchyRoot/after/test.kt new file mode 100644 index 00000000000..999eaeb5ffc --- /dev/null +++ b/idea/testData/refactoring/rename/parameterHierarchyRoot/after/test.kt @@ -0,0 +1,15 @@ +interface Foo { + fun foo(x: String) +} + +open class Foo1 : Foo { + override fun foo(x: String) { } +} + +class Foo2 : Foo { + override fun foo(x: String) { } +} + +class Foo3 : Foo1() { + override fun foo(x: String) { } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/parameterHierarchyRoot/before/J.java b/idea/testData/refactoring/rename/parameterHierarchyRoot/before/J.java new file mode 100644 index 00000000000..74fd3f4892a --- /dev/null +++ b/idea/testData/refactoring/rename/parameterHierarchyRoot/before/J.java @@ -0,0 +1,17 @@ +class J1 implements Foo { + public void foo(String s) { + + } +} + +class J2 extends J1 { + public void foo(String s) { + + } +} + +class J3 extends Foo1 { + public void foo(String s) { + + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/parameterHierarchyRoot/before/test.kt b/idea/testData/refactoring/rename/parameterHierarchyRoot/before/test.kt new file mode 100644 index 00000000000..6856dac1fce --- /dev/null +++ b/idea/testData/refactoring/rename/parameterHierarchyRoot/before/test.kt @@ -0,0 +1,15 @@ +interface Foo { + fun foo(/*rename*/s: String) +} + +open class Foo1 : Foo { + override fun foo(s: String) { } +} + +class Foo2 : Foo { + override fun foo(s: String) { } +} + +class Foo3 : Foo1() { + override fun foo(s: String) { } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/parameterHierarchyRoot/parameterHierarchyRoot.test b/idea/testData/refactoring/rename/parameterHierarchyRoot/parameterHierarchyRoot.test new file mode 100644 index 00000000000..ec57f250b06 --- /dev/null +++ b/idea/testData/refactoring/rename/parameterHierarchyRoot/parameterHierarchyRoot.test @@ -0,0 +1,5 @@ +{ + "type": "MARKED_ELEMENT", + "mainFile": "test.kt", + "newName": "x" +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java index e512cc45ce0..146a6654ebb 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java @@ -414,6 +414,24 @@ public class RenameTestGenerated extends AbstractRenameTest { doTest(fileName); } + @TestMetadata("parameterHierarchyLeaf/parameterHierarchyLeaf.test") + public void testParameterHierarchyLeaf_ParameterHierarchyLeaf() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/rename/parameterHierarchyLeaf/parameterHierarchyLeaf.test"); + doTest(fileName); + } + + @TestMetadata("parameterHierarchyMiddle/parameterHierarchyMiddle.test") + public void testParameterHierarchyMiddle_ParameterHierarchyMiddle() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/rename/parameterHierarchyMiddle/parameterHierarchyMiddle.test"); + doTest(fileName); + } + + @TestMetadata("parameterHierarchyRoot/parameterHierarchyRoot.test") + public void testParameterHierarchyRoot_ParameterHierarchyRoot() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/rename/parameterHierarchyRoot/parameterHierarchyRoot.test"); + doTest(fileName); + } + @TestMetadata("parameterRedeclaration/parameterRedeclaration.test") public void testParameterRedeclaration_ParameterRedeclaration() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/rename/parameterRedeclaration/parameterRedeclaration.test");