From 09cff442077b893243137c7b703a3886548ff2e0 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Thu, 16 Apr 2015 20:50:29 +0300 Subject: [PATCH] Automatic renaming overloads in class or object. #KT-4642 fixed --- .../rename/AutomaticOverloadsRenamer.kt | 36 ++++++++++++------- .../after/JavaSub.java | 6 ++++ .../after/Klass.kt | 24 +++++++++++++ .../before/JavaSub.java | 6 ++++ .../before/Klass.kt | 24 +++++++++++++ .../automaticRenamerOverloadsClass/class.test | 7 ++++ .../after/JavaSuper.java | 7 ++++ .../after/Klass.kt | 14 ++++++++ .../before/JavaSuper.java | 7 ++++ .../before/Klass.kt | 14 ++++++++ .../overloads.test | 7 ++++ .../after/Object.kt | 19 ++++++++++ .../before/Object.kt | 19 ++++++++++ .../object.test | 7 ++++ .../rename/RenameTestGenerated.java | 18 ++++++++++ 15 files changed, 203 insertions(+), 12 deletions(-) create mode 100644 idea/testData/refactoring/rename/automaticRenamerOverloadsClass/after/JavaSub.java create mode 100644 idea/testData/refactoring/rename/automaticRenamerOverloadsClass/after/Klass.kt create mode 100644 idea/testData/refactoring/rename/automaticRenamerOverloadsClass/before/JavaSub.java create mode 100644 idea/testData/refactoring/rename/automaticRenamerOverloadsClass/before/Klass.kt create mode 100644 idea/testData/refactoring/rename/automaticRenamerOverloadsClass/class.test create mode 100644 idea/testData/refactoring/rename/automaticRenamerOverloadsJavaClass/after/JavaSuper.java create mode 100644 idea/testData/refactoring/rename/automaticRenamerOverloadsJavaClass/after/Klass.kt create mode 100644 idea/testData/refactoring/rename/automaticRenamerOverloadsJavaClass/before/JavaSuper.java create mode 100644 idea/testData/refactoring/rename/automaticRenamerOverloadsJavaClass/before/Klass.kt create mode 100644 idea/testData/refactoring/rename/automaticRenamerOverloadsJavaClass/overloads.test create mode 100644 idea/testData/refactoring/rename/automaticRenamerOverloadsObject/after/Object.kt create mode 100644 idea/testData/refactoring/rename/automaticRenamerOverloadsObject/before/Object.kt create mode 100644 idea/testData/refactoring/rename/automaticRenamerOverloadsObject/object.test diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/AutomaticOverloadsRenamer.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/AutomaticOverloadsRenamer.kt index 0abb3648761..fff4a9e83a3 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/AutomaticOverloadsRenamer.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/AutomaticOverloadsRenamer.kt @@ -28,22 +28,14 @@ import com.intellij.refactoring.rename.naming.AutomaticRenamerFactory import com.intellij.usageView.UsageInfo import org.jetbrains.kotlin.idea.stubindex.JetTopLevelFunctionByPackageIndex import org.jetbrains.kotlin.idea.stubindex.JetTopLevelFunctionFqnNameIndex +import org.jetbrains.kotlin.psi.JetClassBody +import org.jetbrains.kotlin.psi.JetClassOrObject import org.jetbrains.kotlin.psi.JetFile import org.jetbrains.kotlin.psi.JetNamedFunction public class AutomaticOverloadsRenamer(function: JetNamedFunction, newName: String) : AutomaticRenamer() { init { - val project = function.getProject() - val module = ProjectFileIndex.SERVICE.getInstance(project).getModuleForFile(function.getContainingFile().getVirtualFile()) - if (module != null) { - val searchScope = GlobalSearchScope.moduleScope(module) - val overloads = JetTopLevelFunctionFqnNameIndex.getInstance().get(function.getFqName()!!.asString(), project, searchScope) - for (overload in overloads) { - if (overload != function) { - myElements.add(overload) - } - } - } + myElements.addAll(function.getOverloads().filter { it != function }) suggestAllNames(function.getName(), newName) } @@ -53,10 +45,30 @@ public class AutomaticOverloadsRenamer(function: JetNamedFunction, newName: Stri override fun isSelectedByDefault(): Boolean = true } +private fun JetNamedFunction.getOverloads(): Collection { + val parent = getParent() + when (parent) { + is JetFile -> { + val module = ModuleUtilCore.findModuleForPsiElement(this) + if (module != null) { + val searchScope = GlobalSearchScope.moduleScope(module) + val fqName = getFqName() + if (fqName != null) { + return JetTopLevelFunctionFqnNameIndex.getInstance().get(fqName.asString(), getProject(), searchScope) + } + } + } + is JetClassBody -> { + return parent.getDeclarations().filterIsInstance().filter { it.getName() == this.getName() } + } + } + return emptyList() +} public class AutomaticOverloadsRenamerFactory : AutomaticRenamerFactory { override fun isApplicable(element: PsiElement): Boolean { - return element is JetNamedFunction && element.getName() != null && element.getParent() is JetFile + return element is JetNamedFunction && element.getName() != null + && (element.getParent() is JetFile || element.getParent() is JetClassBody) } override fun getOptionName() = RefactoringBundle.message("rename.overloads") diff --git a/idea/testData/refactoring/rename/automaticRenamerOverloadsClass/after/JavaSub.java b/idea/testData/refactoring/rename/automaticRenamerOverloadsClass/after/JavaSub.java new file mode 100644 index 00000000000..795b0db6740 --- /dev/null +++ b/idea/testData/refactoring/rename/automaticRenamerOverloadsClass/after/JavaSub.java @@ -0,0 +1,6 @@ +package testing; + +class JavaSub extends Klass { + void bar(int a) { + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/automaticRenamerOverloadsClass/after/Klass.kt b/idea/testData/refactoring/rename/automaticRenamerOverloadsClass/after/Klass.kt new file mode 100644 index 00000000000..e3146bf1b32 --- /dev/null +++ b/idea/testData/refactoring/rename/automaticRenamerOverloadsClass/after/Klass.kt @@ -0,0 +1,24 @@ +package testing + +open class Klass { + fun bar() { + "".bar() + } + + open fun bar(a: Int) { + } + + fun String.bar() { + } + +} + +class Sub : Klass() { + override fun bar(a: Int) { + } +} + +fun main(args: Array) { + Klass().bar() + Klass().bar(1) +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/automaticRenamerOverloadsClass/before/JavaSub.java b/idea/testData/refactoring/rename/automaticRenamerOverloadsClass/before/JavaSub.java new file mode 100644 index 00000000000..171f40b7235 --- /dev/null +++ b/idea/testData/refactoring/rename/automaticRenamerOverloadsClass/before/JavaSub.java @@ -0,0 +1,6 @@ +package testing; + +class JavaSub extends Klass { + void foo(int a) { + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/automaticRenamerOverloadsClass/before/Klass.kt b/idea/testData/refactoring/rename/automaticRenamerOverloadsClass/before/Klass.kt new file mode 100644 index 00000000000..c9e9a938657 --- /dev/null +++ b/idea/testData/refactoring/rename/automaticRenamerOverloadsClass/before/Klass.kt @@ -0,0 +1,24 @@ +package testing + +open class Klass { + fun foo() { + "".foo() + } + + open fun foo(a: Int) { + } + + fun String.foo() { + } + +} + +class Sub : Klass() { + override fun foo(a: Int) { + } +} + +fun main(args: Array) { + Klass().foo() + Klass().foo(1) +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/automaticRenamerOverloadsClass/class.test b/idea/testData/refactoring/rename/automaticRenamerOverloadsClass/class.test new file mode 100644 index 00000000000..5969ab60cf4 --- /dev/null +++ b/idea/testData/refactoring/rename/automaticRenamerOverloadsClass/class.test @@ -0,0 +1,7 @@ +{ + "type": "KOTLIN_FUNCTION", + "classId": "testing/Klass", + "oldName": "foo", + "newName": "bar", + "mainFile": "Klass.kt" +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/automaticRenamerOverloadsJavaClass/after/JavaSuper.java b/idea/testData/refactoring/rename/automaticRenamerOverloadsJavaClass/after/JavaSuper.java new file mode 100644 index 00000000000..8887a403ad6 --- /dev/null +++ b/idea/testData/refactoring/rename/automaticRenamerOverloadsJavaClass/after/JavaSuper.java @@ -0,0 +1,7 @@ +class JavaSuper { + void bar(int a) { + } + + void bar() { + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/automaticRenamerOverloadsJavaClass/after/Klass.kt b/idea/testData/refactoring/rename/automaticRenamerOverloadsJavaClass/after/Klass.kt new file mode 100644 index 00000000000..1801e980c49 --- /dev/null +++ b/idea/testData/refactoring/rename/automaticRenamerOverloadsJavaClass/after/Klass.kt @@ -0,0 +1,14 @@ +class Sub : JavaSuper() { + override fun bar(a: Int) { + } + + override fun bar() { + } +} + +fun main(args: Array) { + JavaSuper().bar() + JavaSuper().bar(1) + Sub().bar() + Sub().bar(1) +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/automaticRenamerOverloadsJavaClass/before/JavaSuper.java b/idea/testData/refactoring/rename/automaticRenamerOverloadsJavaClass/before/JavaSuper.java new file mode 100644 index 00000000000..a83c13ddde0 --- /dev/null +++ b/idea/testData/refactoring/rename/automaticRenamerOverloadsJavaClass/before/JavaSuper.java @@ -0,0 +1,7 @@ +class JavaSuper { + void foo(int a) { + } + + void foo() { + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/automaticRenamerOverloadsJavaClass/before/Klass.kt b/idea/testData/refactoring/rename/automaticRenamerOverloadsJavaClass/before/Klass.kt new file mode 100644 index 00000000000..84e11c11de7 --- /dev/null +++ b/idea/testData/refactoring/rename/automaticRenamerOverloadsJavaClass/before/Klass.kt @@ -0,0 +1,14 @@ +class Sub : JavaSuper() { + override fun foo(a: Int) { + } + + override fun foo() { + } +} + +fun main(args: Array) { + JavaSuper().foo() + JavaSuper().foo(1) + Sub().foo() + Sub().foo(1) +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/automaticRenamerOverloadsJavaClass/overloads.test b/idea/testData/refactoring/rename/automaticRenamerOverloadsJavaClass/overloads.test new file mode 100644 index 00000000000..aadb2d9d108 --- /dev/null +++ b/idea/testData/refactoring/rename/automaticRenamerOverloadsJavaClass/overloads.test @@ -0,0 +1,7 @@ +{ + "type": "JAVA_METHOD", + "classId": "/JavaSuper", + "methodSignature": "void foo()", + "newName": "bar", + "mainFile": "JavaSuper.java" +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/automaticRenamerOverloadsObject/after/Object.kt b/idea/testData/refactoring/rename/automaticRenamerOverloadsObject/after/Object.kt new file mode 100644 index 00000000000..d074f808a86 --- /dev/null +++ b/idea/testData/refactoring/rename/automaticRenamerOverloadsObject/after/Object.kt @@ -0,0 +1,19 @@ +package testing + +object Object { + fun bar() { + "".bar() + } + + fun bar(a: Int) { + } + + fun String.bar() { + } + +} + +fun main(args: Array) { + Object.bar() + Object.bar(1) +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/automaticRenamerOverloadsObject/before/Object.kt b/idea/testData/refactoring/rename/automaticRenamerOverloadsObject/before/Object.kt new file mode 100644 index 00000000000..f4359c85ac0 --- /dev/null +++ b/idea/testData/refactoring/rename/automaticRenamerOverloadsObject/before/Object.kt @@ -0,0 +1,19 @@ +package testing + +object Object { + fun foo() { + "".foo() + } + + fun foo(a: Int) { + } + + fun String.foo() { + } + +} + +fun main(args: Array) { + Object.foo() + Object.foo(1) +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/automaticRenamerOverloadsObject/object.test b/idea/testData/refactoring/rename/automaticRenamerOverloadsObject/object.test new file mode 100644 index 00000000000..426cad6a0af --- /dev/null +++ b/idea/testData/refactoring/rename/automaticRenamerOverloadsObject/object.test @@ -0,0 +1,7 @@ +{ + "type": "KOTLIN_FUNCTION", + "classId": "testing/Object", + "oldName": "foo", + "newName": "bar", + "mainFile": "Object.kt" +} \ 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 b9704e8c2f8..08a592326b9 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java @@ -53,6 +53,24 @@ public class RenameTestGenerated extends AbstractRenameTest { doTest(fileName); } + @TestMetadata("automaticRenamerOverloadsClass/class.test") + public void testAutomaticRenamerOverloadsClass_Class() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/rename/automaticRenamerOverloadsClass/class.test"); + doTest(fileName); + } + + @TestMetadata("automaticRenamerOverloadsJavaClass/overloads.test") + public void testAutomaticRenamerOverloadsJavaClass_Overloads() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/rename/automaticRenamerOverloadsJavaClass/overloads.test"); + doTest(fileName); + } + + @TestMetadata("automaticRenamerOverloadsObject/object.test") + public void testAutomaticRenamerOverloadsObject_Object() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/rename/automaticRenamerOverloadsObject/object.test"); + doTest(fileName); + } + @TestMetadata("defaultObject/defaultObject.test") public void testDefaultObject_DefaultObject() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/rename/defaultObject/defaultObject.test");