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");