Change Signature: Warn about safe call receiver being transformed to value argument

#KT-8744 Fixed
This commit is contained in:
Alexey Sedunov
2016-02-05 15:18:57 +03:00
parent b3801ffac7
commit a9ddc4da1a
4 changed files with 31 additions and 0 deletions
@@ -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()
@@ -949,4 +949,6 @@ class KotlinChangeSignatureTest : KotlinCodeInsightTestCase() {
receiverParameterInfo = null
newParameters[0].name = "a"
}
fun testReceiverInSafeCall() = doTestConflict { receiverParameterInfo = null }
}