From b739db3c3573fb24daf1e97c42746d617dea4692 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 21 Mar 2018 09:53:38 +0300 Subject: [PATCH] Fix parameter handling in "Move suspicious reference into parentheses" Related to KT-21743 --- ...spiciousCallableReferenceIntoParenthesesInspection.kt | 9 +++++++-- .../parameterOuter.kt | 6 ++++++ .../parameterOuter.kt.after | 6 ++++++ .../idea/inspections/LocalInspectionTestGenerated.java | 6 ++++++ 4 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 idea/testData/inspectionsLocal/moveSuspiciousCallableReferenceIntoParentheses/parameterOuter.kt create mode 100644 idea/testData/inspectionsLocal/moveSuspiciousCallableReferenceIntoParentheses/parameterOuter.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/MoveSuspiciousCallableReferenceIntoParenthesesInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/MoveSuspiciousCallableReferenceIntoParenthesesInspection.kt index 278fec89f2b..3a692860647 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/MoveSuspiciousCallableReferenceIntoParenthesesInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/MoveSuspiciousCallableReferenceIntoParenthesesInspection.kt @@ -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}" } diff --git a/idea/testData/inspectionsLocal/moveSuspiciousCallableReferenceIntoParentheses/parameterOuter.kt b/idea/testData/inspectionsLocal/moveSuspiciousCallableReferenceIntoParentheses/parameterOuter.kt new file mode 100644 index 00000000000..7a351028eba --- /dev/null +++ b/idea/testData/inspectionsLocal/moveSuspiciousCallableReferenceIntoParentheses/parameterOuter.kt @@ -0,0 +1,6 @@ +// FIX: Move suspicious callable reference into parentheses '()' +// WITH_RUNTIME + +fun foo(bar: Int) { + listOf(1,2,3).map { bar::plus } +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/moveSuspiciousCallableReferenceIntoParentheses/parameterOuter.kt.after b/idea/testData/inspectionsLocal/moveSuspiciousCallableReferenceIntoParentheses/parameterOuter.kt.after new file mode 100644 index 00000000000..c8c55ef2ef4 --- /dev/null +++ b/idea/testData/inspectionsLocal/moveSuspiciousCallableReferenceIntoParentheses/parameterOuter.kt.after @@ -0,0 +1,6 @@ +// FIX: Move suspicious callable reference into parentheses '()' +// WITH_RUNTIME + +fun foo(bar: Int) { + listOf(1,2,3).map(bar::plus) +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java index 3c70b9257c7..e82b446d5b0 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -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");