Fix parameter handling in "Move suspicious reference into parentheses"

Related to KT-21743
This commit is contained in:
Mikhail Glukhikh
2018-03-21 09:53:38 +03:00
parent fbd06dc74f
commit b739db3c35
4 changed files with 25 additions and 2 deletions

View File

@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.builtins.isBuiltinFunctionalTypeOrSubtype
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.caches.resolve.resolveToCall
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
import org.jetbrains.kotlin.idea.intentions.ConvertLambdaToReferenceIntention
import org.jetbrains.kotlin.idea.intentions.getCallableDescriptor
import org.jetbrains.kotlin.psi.KtCallableReferenceExpression
@@ -67,12 +68,16 @@ class MoveSuspiciousCallableReferenceIntoParenthesesInspection : AbstractKotlinI
""
} else {
val descriptor = receiverExpression.getCallableDescriptor()
if (descriptor == null || descriptor is ValueParameterDescriptor)
val literal = element.functionLiteral
if (descriptor == null ||
descriptor is ValueParameterDescriptor && descriptor.containingDeclaration == literal.resolveToDescriptorIfAny()
) {
callableReference.resolveToCall(BodyResolveMode.FULL)
?.let { it.extensionReceiver ?: it.dispatchReceiver }
?.let { "${it.type}" } ?: ""
else
} else {
receiverExpression.text
}
}
return "$receiver::${callableReference.text}"
}

View File

@@ -0,0 +1,6 @@
// FIX: Move suspicious callable reference into parentheses '()'
// WITH_RUNTIME
fun foo(bar: Int) {
listOf(1,2,3).map {<caret> bar::plus }
}

View File

@@ -0,0 +1,6 @@
// FIX: Move suspicious callable reference into parentheses '()'
// WITH_RUNTIME
fun foo(bar: Int) {
listOf(1,2,3).map(bar::plus)
}

View File

@@ -2361,6 +2361,12 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest {
doTest(fileName);
}
@TestMetadata("parameterOuter.kt")
public void testParameterOuter() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspectionsLocal/moveSuspiciousCallableReferenceIntoParentheses/parameterOuter.kt");
doTest(fileName);
}
@TestMetadata("variableReceiver.kt")
public void testVariableReceiver() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspectionsLocal/moveSuspiciousCallableReferenceIntoParentheses/variableReceiver.kt");