Supported Kotlin usages of Java class in automatic variable renamer.
This commit is contained in:
@@ -17,6 +17,7 @@
|
|||||||
package org.jetbrains.kotlin.idea.refactoring.rename
|
package org.jetbrains.kotlin.idea.refactoring.rename
|
||||||
|
|
||||||
import com.intellij.openapi.util.text.StringUtil
|
import com.intellij.openapi.util.text.StringUtil
|
||||||
|
import com.intellij.psi.PsiClass
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.psi.PsiNamedElement
|
import com.intellij.psi.PsiNamedElement
|
||||||
import com.intellij.psi.util.PsiTreeUtil
|
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.JetVariableDeclaration
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.isAncestor
|
import org.jetbrains.kotlin.psi.psiUtil.isAncestor
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||||
|
import org.jetbrains.kotlin.resolve.source.PsiSourceElement
|
||||||
import org.jetbrains.kotlin.types.JetType
|
import org.jetbrains.kotlin.types.JetType
|
||||||
import java.util.ArrayList
|
import java.util.ArrayList
|
||||||
import java.util.LinkedHashMap
|
import java.util.LinkedHashMap
|
||||||
|
|
||||||
public class AutomaticVariableRenamer(klass: JetClass, newClassName: String, usages: Collection<UsageInfo>) : AutomaticRenamer() {
|
public class AutomaticVariableRenamer(
|
||||||
|
klass: PsiNamedElement, // PsiClass or JetClass
|
||||||
|
newClassName: String,
|
||||||
|
usages: Collection<UsageInfo>
|
||||||
|
) : AutomaticRenamer() {
|
||||||
private val toUnpluralize = ArrayList<JetNamedDeclaration>()
|
private val toUnpluralize = ArrayList<JetNamedDeclaration>()
|
||||||
|
|
||||||
init {
|
init {
|
||||||
val classType = (klass.resolveToDescriptor() as ClassDescriptor).getDefaultType()
|
|
||||||
|
|
||||||
for (usage in usages) {
|
for (usage in usages) {
|
||||||
val usageElement = usage.getElement() ?: continue
|
val usageElement = usage.getElement() ?: continue
|
||||||
|
|
||||||
@@ -58,7 +62,7 @@ public class AutomaticVariableRenamer(klass: JetClass, newClassName: String, usa
|
|||||||
|
|
||||||
if (parameterOrVariable.getTypeReference()?.isAncestor(usageElement) != true) continue
|
if (parameterOrVariable.getTypeReference()?.isAncestor(usageElement) != true) continue
|
||||||
val type = (parameterOrVariable.resolveToDescriptor() as VariableDescriptor).getType()
|
val type = (parameterOrVariable.resolveToDescriptor() as VariableDescriptor).getType()
|
||||||
if (type.isCollectionLikeOf(classType)) {
|
if (type.isCollectionLikeOf(klass)) {
|
||||||
toUnpluralize.add(parameterOrVariable)
|
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
|
val klass = this.getConstructor().getDeclarationDescriptor() as? ClassDescriptor ?: return false
|
||||||
if (KotlinBuiltIns.isArray(this) || DescriptorUtils.isSubclass(klass, KotlinBuiltIns.getInstance().getCollection())) {
|
if (KotlinBuiltIns.isArray(this) || DescriptorUtils.isSubclass(klass, KotlinBuiltIns.getInstance().getCollection())) {
|
||||||
val typeArgument = this.getArguments().singleOrNull()?.getType() ?: return false
|
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
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public class AutomaticVariableRenamerFactory: AutomaticRenamerFactory {
|
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<UsageInfo>) =
|
override fun createRenamer(element: PsiElement, newName: String, usages: Collection<UsageInfo>) =
|
||||||
AutomaticVariableRenamer(element as JetClass, newName, usages)
|
AutomaticVariableRenamer(element as PsiNamedElement, newName, usages)
|
||||||
|
|
||||||
override fun isEnabled() = JavaRefactoringSettings.getInstance().isToRenameVariables()
|
override fun isEnabled() = JavaRefactoringSettings.getInstance().isToRenameVariables()
|
||||||
override fun setEnabled(enabled: Boolean) = JavaRefactoringSettings.getInstance().setRenameVariables(enabled)
|
override fun setEnabled(enabled: Boolean) = JavaRefactoringSettings.getInstance().setRenameVariables(enabled)
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
class BarImpl : Bar()
|
class BarImpl : Bar()
|
||||||
|
|
||||||
object BarObj : Bar()
|
object BarObj : Bar()
|
||||||
|
|
||||||
|
val bar: Bar = Bar()
|
||||||
|
val bars: Array<Bar> = throw Error()
|
||||||
@@ -1,3 +1,6 @@
|
|||||||
class FooImpl : Foo()
|
class FooImpl : Foo()
|
||||||
|
|
||||||
object FooObj : Foo()
|
object FooObj : Foo()
|
||||||
|
|
||||||
|
val foo: Foo = Foo()
|
||||||
|
val foos: Array<Foo> = throw Error()
|
||||||
Reference in New Issue
Block a user