Fixed other parameter references broken in new parameter values in conventional Change Signature

This commit is contained in:
Valentin Kipyatkov
2020-03-26 14:40:07 +02:00
parent 0adfa0357a
commit 88cd129549
4 changed files with 76 additions and 73 deletions
@@ -40,40 +40,27 @@ class KotlinParameterInfo @JvmOverloads constructor(
) : ParameterInfo { ) : ParameterInfo {
var currentTypeInfo: KotlinTypeInfo = originalTypeInfo var currentTypeInfo: KotlinTypeInfo = originalTypeInfo
val defaultValueParameterReferences: Map<PsiReference, DeclarationDescriptor> val defaultValueParameterReferences: Map<PsiReference, DeclarationDescriptor> by lazy { collectDefaultValueParameterReferences(defaultValueForCall) }
private fun collectDefaultValueParameterReferences(defaultValueForCall: KtExpression?): Map<PsiReference, DeclarationDescriptor> {
val file = defaultValueForCall?.containingFile as? KtFile ?: return emptyMap()
if (!file.isPhysical && file.analysisContext == null) return emptyMap()
init {
val file = defaultValueForCall?.containingFile as? KtFile
defaultValueParameterReferences =
if (defaultValueForCall != null && file != null && (file.isPhysical || file.analysisContext != null)) {
val project = file.project val project = file.project
val map = LinkedHashMap<PsiReference, DeclarationDescriptor>() val map = LinkedHashMap<PsiReference, DeclarationDescriptor>()
defaultValueForCall!!.accept( defaultValueForCall.accept(
object : KtTreeVisitorVoid() { object : KtTreeVisitorVoid() {
private fun selfParameterOrNull(parameter: DeclarationDescriptor?): ValueParameterDescriptor? { private fun selfParameterOrNull(parameter: DeclarationDescriptor?): ValueParameterDescriptor? {
return if (parameter is ValueParameterDescriptor && return (parameter as? ValueParameterDescriptor)
compareDescriptors(project, parameter.containingDeclaration, callableDescriptor) ?.takeIf { compareDescriptors(project, parameter.containingDeclaration, callableDescriptor) }
) {
parameter
} else null
} }
private fun selfReceiverOrNull(receiverDescriptor: DeclarationDescriptor?): DeclarationDescriptor? { private fun selfReceiverOrNull(receiverDescriptor: DeclarationDescriptor?): DeclarationDescriptor? {
if (compareDescriptors( if (compareDescriptors(project, receiverDescriptor, callableDescriptor.extensionReceiverParameter?.containingDeclaration)) {
project,
receiverDescriptor,
callableDescriptor.extensionReceiverParameter?.containingDeclaration
)
) {
return receiverDescriptor return receiverDescriptor
} }
if (compareDescriptors( if (compareDescriptors(project, receiverDescriptor, callableDescriptor.dispatchReceiverParameter?.containingDeclaration)) {
project,
receiverDescriptor,
callableDescriptor.dispatchReceiverParameter?.containingDeclaration
)
) {
return receiverDescriptor return receiverDescriptor
} }
return null return null
@@ -83,10 +70,7 @@ class KotlinParameterInfo @JvmOverloads constructor(
return selfReceiverOrNull(receiver?.declarationDescriptor) return selfReceiverOrNull(receiver?.declarationDescriptor)
} }
private fun getRelevantDescriptor( private fun getRelevantDescriptor(expression: KtSimpleNameExpression, ref: KtReference): DeclarationDescriptor? {
expression: KtSimpleNameExpression,
ref: KtReference
): DeclarationDescriptor? {
val context = expression.analyze(BodyResolveMode.PARTIAL) val context = expression.analyze(BodyResolveMode.PARTIAL)
val descriptor = ref.resolveToDescriptors(context).singleOrNull() val descriptor = ref.resolveToDescriptors(context).singleOrNull()
@@ -115,11 +99,7 @@ class KotlinParameterInfo @JvmOverloads constructor(
} }
} }
) )
return map
map
} else {
emptyMap()
}
} }
override fun getOldIndex(): Int = originalIndex override fun getOldIndex(): Int = originalIndex
@@ -0,0 +1,7 @@
fun <caret>foo(p1: Int, p2: Int) {
}
fun bar() {
foo(1, 1 * 1)
foo(2, 2 * 2)
}
@@ -0,0 +1,7 @@
fun <caret>foo(p1: Int) {
}
fun bar() {
foo(1)
foo(2)
}
@@ -1599,4 +1599,13 @@ class KotlinChangeSignatureTest : KotlinLightCodeInsightFixtureTestCase() {
fun testRemoveLambdaParameter2() { fun testRemoveLambdaParameter2() {
doTest { removeParameter(0) } doTest { removeParameter(0) }
} }
fun testNewParamValueRefsOtherParam() {
doTest {
val parameterInfo = KotlinParameterInfo(originalBaseFunctionDescriptor, -1, "p2", KotlinTypeInfo(false, BUILT_INS.intType))
val codeFragment = KtPsiFactory(project).createExpressionCodeFragment("p1 * p1", context)
parameterInfo.defaultValueForCall = codeFragment.getContentElement()!!
addParameter(parameterInfo)
}
}
} }