Rename: Do not use Change Signature for parameter renaming
This commit is contained in:
+18
-36
@@ -17,54 +17,36 @@
|
|||||||
package org.jetbrains.kotlin.idea.refactoring.rename
|
package org.jetbrains.kotlin.idea.refactoring.rename
|
||||||
|
|
||||||
import com.intellij.psi.PsiElement
|
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.listeners.RefactoringElementListener
|
import com.intellij.refactoring.listeners.RefactoringElementListener
|
||||||
import com.intellij.usageView.UsageInfo
|
import com.intellij.usageView.UsageInfo
|
||||||
import com.intellij.util.xml.impl.GenericDomValueReference
|
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
|
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
|
||||||
import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinChangeSignatureConfiguration
|
import org.jetbrains.kotlin.idea.refactoring.getAffectedCallables
|
||||||
import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinMethodDescriptor
|
import org.jetbrains.kotlin.psi.KtCallableDeclaration
|
||||||
import org.jetbrains.kotlin.idea.refactoring.changeSignature.modify
|
|
||||||
import org.jetbrains.kotlin.idea.refactoring.changeSignature.runChangeSignature
|
|
||||||
import org.jetbrains.kotlin.psi.KtNamedFunction
|
import org.jetbrains.kotlin.psi.KtNamedFunction
|
||||||
import org.jetbrains.kotlin.psi.KtParameter
|
import org.jetbrains.kotlin.psi.KtParameter
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext
|
|
||||||
import org.jetbrains.kotlin.resolve.OverrideResolver
|
import org.jetbrains.kotlin.resolve.OverrideResolver
|
||||||
|
|
||||||
class RenameKotlinParameterProcessor : RenameKotlinPsiProcessor() {
|
class RenameKotlinParameterProcessor : RenameKotlinPsiProcessor() {
|
||||||
override fun canProcessElement(element: PsiElement): Boolean {
|
override fun canProcessElement(element: PsiElement) = element is KtParameter && element.ownerFunction is KtNamedFunction
|
||||||
return element is KtParameter && element.parent.parent is KtNamedFunction
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun renameElement(element: PsiElement, newName: String, usages: Array<out UsageInfo>, listener: RefactoringElementListener?) {
|
override fun prepareRenaming(element: PsiElement, newName: String, allRenames: MutableMap<PsiElement, String>, scope: SearchScope) {
|
||||||
// Workaround for usages in XML files
|
if (element !is KtParameter) return
|
||||||
// TODO: Do not use Change Signature for parameter rename as it's less efficient and loses some usages
|
|
||||||
for (usage in usages) {
|
|
||||||
(usage.reference as? GenericDomValueReference<*>)?.handleElementRename(newName)
|
|
||||||
}
|
|
||||||
|
|
||||||
val function = (element as KtParameter).parent.parent as KtNamedFunction
|
val function = element.ownerFunction ?: return
|
||||||
val paramIndex = function.valueParameters.indexOf(element)
|
val originalDescriptor = function.resolveToDescriptor() as FunctionDescriptor
|
||||||
assert(paramIndex != -1, { "couldn't find parameter in parent ${element.getElementTextWithContext()}" })
|
val affectedCallables = getAffectedCallables(element.project, OverrideResolver.getDeepestSuperDeclarations(originalDescriptor))
|
||||||
|
for (callable in affectedCallables) {
|
||||||
val functionDescriptor = function.resolveToDescriptor() as? FunctionDescriptor ?: return
|
val parameter: PsiNamedElement? = when (callable) {
|
||||||
val parameterDescriptor = functionDescriptor.valueParameters[paramIndex]
|
is KtCallableDeclaration -> callable.valueParameters.firstOrNull { it.name == element.name }
|
||||||
|
is PsiMethod -> callable.parameterList.parameters.firstOrNull { it.name == element.name }
|
||||||
val parameterNameChangedOnOverride = parameterDescriptor.overriddenDescriptors.any {
|
else -> null
|
||||||
overriddenParameter -> OverrideResolver.shouldReportParameterNameOverrideWarning(parameterDescriptor, overriddenParameter)
|
|
||||||
}
|
|
||||||
|
|
||||||
val changeSignatureConfiguration = object : KotlinChangeSignatureConfiguration {
|
|
||||||
override fun configure(originalDescriptor: KotlinMethodDescriptor): KotlinMethodDescriptor {
|
|
||||||
val paramInfoIndex = if (functionDescriptor.extensionReceiverParameter != null) paramIndex + 1 else paramIndex
|
|
||||||
return originalDescriptor.modify { it.renameParameter(paramInfoIndex, newName) }
|
|
||||||
}
|
}
|
||||||
|
if (parameter == null) continue
|
||||||
override fun performSilently(affectedFunctions: Collection<PsiElement>) = true
|
allRenames[parameter] = newName
|
||||||
|
|
||||||
override fun forcePerformForSelectedFunctionOnly() = parameterNameChangedOnOverride
|
|
||||||
}
|
}
|
||||||
|
|
||||||
runChangeSignature(element.project, functionDescriptor, changeSignatureConfiguration, element, "Rename parameter")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user