From 260b8ae4317ef89f5830676f1a310ad84863f116 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Wed, 15 Apr 2015 16:48:08 +0300 Subject: [PATCH] Automatic renaming subclasses. #KT-4642 in progress --- idea/src/META-INF/plugin.xml | 1 + .../rename/AutomaticInheritorRenamer.kt | 61 +++++++++++++++++++ .../automaticRenamer/after/javaUsage.java | 3 + .../rename/automaticRenamer/after/main.kt | 6 +- .../automaticRenamer/before/javaUsage.java | 3 + .../rename/automaticRenamer/before/main.kt | 6 +- 6 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 idea/src/org/jetbrains/kotlin/idea/refactoring/rename/AutomaticInheritorRenamer.kt create mode 100644 idea/testData/refactoring/rename/automaticRenamer/after/javaUsage.java create mode 100644 idea/testData/refactoring/rename/automaticRenamer/before/javaUsage.java diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index 395e8941429..e93bd43bb77 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -306,6 +306,7 @@ + diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/AutomaticInheritorRenamer.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/AutomaticInheritorRenamer.kt new file mode 100644 index 00000000000..43d744cbb59 --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/AutomaticInheritorRenamer.kt @@ -0,0 +1,61 @@ +/* + * 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. + */ + +package org.jetbrains.kotlin.idea.refactoring.rename + +import com.intellij.psi.PsiClass +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiNamedElement +import com.intellij.psi.search.searches.ClassInheritorsSearch +import com.intellij.refactoring.JavaRefactoringSettings +import com.intellij.refactoring.RefactoringBundle +import com.intellij.refactoring.rename.naming.AutomaticRenamer +import com.intellij.refactoring.rename.naming.AutomaticRenamerFactory +import com.intellij.refactoring.rename.naming.InheritorRenamer +import com.intellij.usageView.UsageInfo +import org.jetbrains.kotlin.asJava.LightClassUtil +import org.jetbrains.kotlin.asJava.unwrapped +import org.jetbrains.kotlin.psi.JetClass + +public class AutomaticInheritorRenamer(klass: JetClass, newName: String): AutomaticRenamer() { + init { + val lightClass = LightClassUtil.getPsiClass(klass) + if (lightClass != null) { + for (inheritorLightClass in ClassInheritorsSearch.search(lightClass, true).findAll()) { + if (inheritorLightClass.getName() != null) { + myElements.add(inheritorLightClass.unwrapped as PsiNamedElement) + } + } + } + + suggestAllNames(klass.getName(), newName) + } + + override fun getDialogTitle() = RefactoringBundle.message("rename.inheritors.title") + override fun getDialogDescription() = RefactoringBundle.message("rename.inheritors.with.the.following.names.to") + override fun entityName() = RefactoringBundle.message("entity.name.inheritor") +} + +public class AutomaticInheritorRenamerFactory : AutomaticRenamerFactory { + override fun isApplicable(element: PsiElement) = element is JetClass + override fun getOptionName() = RefactoringBundle.message("rename.inheritors") + override fun isEnabled() = JavaRefactoringSettings.getInstance().isToRenameInheritors() + override fun setEnabled(enabled: Boolean) = JavaRefactoringSettings.getInstance().setRenameInheritors(enabled) + + override fun createRenamer(element: PsiElement, newName: String, usages: Collection): AutomaticRenamer { + return AutomaticInheritorRenamer(element as JetClass, newName) + } +} diff --git a/idea/testData/refactoring/rename/automaticRenamer/after/javaUsage.java b/idea/testData/refactoring/rename/automaticRenamer/after/javaUsage.java new file mode 100644 index 00000000000..39a29d62929 --- /dev/null +++ b/idea/testData/refactoring/rename/automaticRenamer/after/javaUsage.java @@ -0,0 +1,3 @@ +class JavaBar extends Bar { + +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/automaticRenamer/after/main.kt b/idea/testData/refactoring/rename/automaticRenamer/after/main.kt index 60b7edced3e..008288a7f7d 100644 --- a/idea/testData/refactoring/rename/automaticRenamer/after/main.kt +++ b/idea/testData/refactoring/rename/automaticRenamer/after/main.kt @@ -1,4 +1,4 @@ -class Bar : Throwable() +open class Bar : Throwable() val bar: Bar = Bar() val bar1: Bar = Bar() @@ -33,3 +33,7 @@ fun topLevel(bar: Bar) { fun collectionLikes(bars: List>, foos: List>) { } + +class BarImpl : Bar() + +object BarObj : Bar() \ No newline at end of file diff --git a/idea/testData/refactoring/rename/automaticRenamer/before/javaUsage.java b/idea/testData/refactoring/rename/automaticRenamer/before/javaUsage.java new file mode 100644 index 00000000000..0b5052a974d --- /dev/null +++ b/idea/testData/refactoring/rename/automaticRenamer/before/javaUsage.java @@ -0,0 +1,3 @@ +class JavaFoo extends Foo { + +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/automaticRenamer/before/main.kt b/idea/testData/refactoring/rename/automaticRenamer/before/main.kt index 2f7e7deaae0..c9adfff0620 100644 --- a/idea/testData/refactoring/rename/automaticRenamer/before/main.kt +++ b/idea/testData/refactoring/rename/automaticRenamer/before/main.kt @@ -1,4 +1,4 @@ -class Foo : Throwable() +open class Foo : Throwable() val foo: Foo = Foo() val foo1: Foo = Foo() @@ -33,3 +33,7 @@ fun topLevel(foo: Foo) { fun collectionLikes(foos: List>, foos: List>) { } + +class FooImpl : Foo() + +object FooObj : Foo() \ No newline at end of file