From 9a4fbd35bd532a740afa5528a7d928cc45fdd362 Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Tue, 21 Apr 2015 19:30:11 +0300 Subject: [PATCH] Supported Kotlin usages of Java class in automatic variable renamer. --- .../rename/AutomaticVariableRenamer.kt | 21 ++++++++++++------- .../after/usage.kt | 5 ++++- .../before/usage.kt | 5 ++++- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/AutomaticVariableRenamer.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/AutomaticVariableRenamer.kt index 3c30161bec2..65771574228 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/AutomaticVariableRenamer.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/AutomaticVariableRenamer.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.idea.refactoring.rename import com.intellij.openapi.util.text.StringUtil +import com.intellij.psi.PsiClass import com.intellij.psi.PsiElement import com.intellij.psi.PsiNamedElement import com.intellij.psi.util.PsiTreeUtil @@ -37,16 +38,19 @@ import org.jetbrains.kotlin.psi.JetParameter import org.jetbrains.kotlin.psi.JetVariableDeclaration import org.jetbrains.kotlin.psi.psiUtil.isAncestor import org.jetbrains.kotlin.resolve.DescriptorUtils +import org.jetbrains.kotlin.resolve.source.PsiSourceElement import org.jetbrains.kotlin.types.JetType import java.util.ArrayList import java.util.LinkedHashMap -public class AutomaticVariableRenamer(klass: JetClass, newClassName: String, usages: Collection) : AutomaticRenamer() { +public class AutomaticVariableRenamer( + klass: PsiNamedElement, // PsiClass or JetClass + newClassName: String, + usages: Collection +) : AutomaticRenamer() { private val toUnpluralize = ArrayList() init { - val classType = (klass.resolveToDescriptor() as ClassDescriptor).getDefaultType() - for (usage in usages) { val usageElement = usage.getElement() ?: continue @@ -58,7 +62,7 @@ public class AutomaticVariableRenamer(klass: JetClass, newClassName: String, usa if (parameterOrVariable.getTypeReference()?.isAncestor(usageElement) != true) continue val type = (parameterOrVariable.resolveToDescriptor() as VariableDescriptor).getType() - if (type.isCollectionLikeOf(classType)) { + if (type.isCollectionLikeOf(klass)) { toUnpluralize.add(parameterOrVariable) } @@ -91,21 +95,22 @@ public class AutomaticVariableRenamer(klass: JetClass, newClassName: String, usa } } -private fun JetType.isCollectionLikeOf(elementType: JetType): Boolean { +private fun JetType.isCollectionLikeOf(classPsiElement: PsiNamedElement): Boolean { val klass = this.getConstructor().getDeclarationDescriptor() as? ClassDescriptor ?: return false if (KotlinBuiltIns.isArray(this) || DescriptorUtils.isSubclass(klass, KotlinBuiltIns.getInstance().getCollection())) { val typeArgument = this.getArguments().singleOrNull()?.getType() ?: return false - return elementType == typeArgument || typeArgument.isCollectionLikeOf(elementType) + val typePsiElement = ((typeArgument.getConstructor().getDeclarationDescriptor() as? ClassDescriptor)?.getSource() as? PsiSourceElement)?.psi + return classPsiElement == typePsiElement || typeArgument.isCollectionLikeOf(classPsiElement) } return false } public class AutomaticVariableRenamerFactory: AutomaticRenamerFactory { - override fun isApplicable(element: PsiElement) = element is JetClass + override fun isApplicable(element: PsiElement) = element is JetClass || element is PsiClass override fun createRenamer(element: PsiElement, newName: String, usages: Collection) = - AutomaticVariableRenamer(element as JetClass, newName, usages) + AutomaticVariableRenamer(element as PsiNamedElement, newName, usages) override fun isEnabled() = JavaRefactoringSettings.getInstance().isToRenameVariables() override fun setEnabled(enabled: Boolean) = JavaRefactoringSettings.getInstance().setRenameVariables(enabled) diff --git a/idea/testData/refactoring/rename/automaticRenamerForJavaClass/after/usage.kt b/idea/testData/refactoring/rename/automaticRenamerForJavaClass/after/usage.kt index b63595935ef..36c030fc881 100644 --- a/idea/testData/refactoring/rename/automaticRenamerForJavaClass/after/usage.kt +++ b/idea/testData/refactoring/rename/automaticRenamerForJavaClass/after/usage.kt @@ -1,3 +1,6 @@ class BarImpl : Bar() -object BarObj : Bar() \ No newline at end of file +object BarObj : Bar() + +val bar: Bar = Bar() +val bars: Array = throw Error() \ No newline at end of file diff --git a/idea/testData/refactoring/rename/automaticRenamerForJavaClass/before/usage.kt b/idea/testData/refactoring/rename/automaticRenamerForJavaClass/before/usage.kt index 1437cd9640a..f5343afbb19 100644 --- a/idea/testData/refactoring/rename/automaticRenamerForJavaClass/before/usage.kt +++ b/idea/testData/refactoring/rename/automaticRenamerForJavaClass/before/usage.kt @@ -1,3 +1,6 @@ class FooImpl : Foo() -object FooObj : Foo() \ No newline at end of file +object FooObj : Foo() + +val foo: Foo = Foo() +val foos: Array = throw Error() \ No newline at end of file