Change Signature: Warn about safe call receiver being transformed to value argument
#KT-8744 Fixed
This commit is contained in:
+23
@@ -584,6 +584,7 @@ class KotlinChangeSignatureUsageProcessor : ChangeSignatureUsageProcessor {
|
|||||||
if (function is KtCallableDeclaration && newReceiverInfo != originalReceiverInfo) {
|
if (function is KtCallableDeclaration && newReceiverInfo != originalReceiverInfo) {
|
||||||
findReceiverIntroducingConflicts(result, function, newReceiverInfo)
|
findReceiverIntroducingConflicts(result, function, newReceiverInfo)
|
||||||
findInternalExplicitReceiverConflicts(refUsages.get(), result, originalReceiverInfo)
|
findInternalExplicitReceiverConflicts(refUsages.get(), result, originalReceiverInfo)
|
||||||
|
findReceiverToParameterInSafeCallsConflicts(refUsages.get(), result, info)
|
||||||
findThisLabelConflicts(refUsages, result, info, function)
|
findThisLabelConflicts(refUsages, result, info, function)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -674,6 +675,28 @@ class KotlinChangeSignatureUsageProcessor : ChangeSignatureUsageProcessor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun findReceiverToParameterInSafeCallsConflicts(
|
||||||
|
usages: Array<UsageInfo>,
|
||||||
|
result: MultiMap<PsiElement, String>,
|
||||||
|
changeInfo: KotlinChangeInfo
|
||||||
|
) {
|
||||||
|
val originalReceiverInfo = changeInfo.methodDescriptor.receiver
|
||||||
|
if (originalReceiverInfo == null || originalReceiverInfo !in changeInfo.getNonReceiverParameters()) return
|
||||||
|
|
||||||
|
for (usageInfo in usages) {
|
||||||
|
if (!(usageInfo is KotlinFunctionCallUsage || usageInfo is KotlinPropertyCallUsage)) continue
|
||||||
|
|
||||||
|
val callElement = usageInfo.element as? KtElement ?: continue
|
||||||
|
val qualifiedExpression = callElement.getQualifiedExpressionForSelector()
|
||||||
|
if (qualifiedExpression is KtSafeQualifiedExpression) {
|
||||||
|
result.putValue(
|
||||||
|
callElement,
|
||||||
|
"Receiver can't be safely transformed to value argument: ${CommonRefactoringUtil.htmlEmphasize(qualifiedExpression.text)}"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun findReceiverIntroducingConflicts(
|
private fun findReceiverIntroducingConflicts(
|
||||||
result: MultiMap<PsiElement, String>,
|
result: MultiMap<PsiElement, String>,
|
||||||
callable: PsiElement,
|
callable: PsiElement,
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
interface A {
|
||||||
|
val parent: A?
|
||||||
|
}
|
||||||
|
|
||||||
|
fun A.<caret>ext(): Int = 1 + (parent?.ext() ?: 0)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Receiver can't be safely transformed to value argument: parent?.ext()
|
||||||
+2
@@ -949,4 +949,6 @@ class KotlinChangeSignatureTest : KotlinCodeInsightTestCase() {
|
|||||||
receiverParameterInfo = null
|
receiverParameterInfo = null
|
||||||
newParameters[0].name = "a"
|
newParameters[0].name = "a"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun testReceiverInSafeCall() = doTestConflict { receiverParameterInfo = null }
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user