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) {
|
||||
findReceiverIntroducingConflicts(result, function, newReceiverInfo)
|
||||
findInternalExplicitReceiverConflicts(refUsages.get(), result, originalReceiverInfo)
|
||||
findReceiverToParameterInSafeCallsConflicts(refUsages.get(), result, info)
|
||||
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(
|
||||
result: MultiMap<PsiElement, String>,
|
||||
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
|
||||
newParameters[0].name = "a"
|
||||
}
|
||||
|
||||
fun testReceiverInSafeCall() = doTestConflict { receiverParameterInfo = null }
|
||||
}
|
||||
Reference in New Issue
Block a user