From 018d4653e821804290e931443e4a5acfa9784633 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Wed, 14 Jun 2017 16:54:41 +0300 Subject: [PATCH] Fix search usages for invoke() extension operator (KT-18269) #KT-18269 Fixed --- .../operators/InvokeOperatorReferenceSearcher.kt | 14 ++++++++++++-- .../kotlin/conventions/invokeExtension.0.kt | 11 +++++++++++ .../kotlin/conventions/invokeExtension.log | 6 ++++++ .../kotlin/conventions/invokeExtension.results.txt | 2 ++ .../kotlin/findUsages/FindUsagesTestGenerated.java | 6 ++++++ 5 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 idea/testData/findUsages/kotlin/conventions/invokeExtension.0.kt create mode 100644 idea/testData/findUsages/kotlin/conventions/invokeExtension.log create mode 100644 idea/testData/findUsages/kotlin/conventions/invokeExtension.results.txt diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/operators/InvokeOperatorReferenceSearcher.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/operators/InvokeOperatorReferenceSearcher.kt index 6c1dac649e2..af72eee2a01 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/operators/InvokeOperatorReferenceSearcher.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/operators/InvokeOperatorReferenceSearcher.kt @@ -27,8 +27,11 @@ import org.jetbrains.kotlin.idea.search.ideaExtensions.KotlinReferencesSearchOpt import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.psiUtil.isExtensionDeclaration import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance -import org.jetbrains.uast.* +import org.jetbrains.uast.UMethod +import org.jetbrains.uast.UastContext +import org.jetbrains.uast.convertOpt class InvokeOperatorReferenceSearcher( targetFunction: PsiElement, @@ -44,7 +47,14 @@ class InvokeOperatorReferenceSearcher( val uMethod = uastContext.convertOpt(targetDeclaration, null) val uastParameters = uMethod?.uastParameters - callArgumentsSize = if (uastParameters != null && uastParameters.none { it.uastInitializer != null }) uastParameters.size else null + val isStableNumberOfArguments = uastParameters != null && uastParameters.none { it.uastInitializer != null } + callArgumentsSize = if (isStableNumberOfArguments) { + val numberOfArguments = uastParameters!!.size + when { + targetFunction.isExtensionDeclaration() -> numberOfArguments - 1 + else -> numberOfArguments + } + } else null } override fun processPossibleReceiverExpression(expression: KtExpression) { diff --git a/idea/testData/findUsages/kotlin/conventions/invokeExtension.0.kt b/idea/testData/findUsages/kotlin/conventions/invokeExtension.0.kt new file mode 100644 index 00000000000..2d4751fe101 --- /dev/null +++ b/idea/testData/findUsages/kotlin/conventions/invokeExtension.0.kt @@ -0,0 +1,11 @@ +// PSI_ELEMENT: org.jetbrains.kotlin.psi.KtNamedFunction +// OPTIONS: usages +package pack + +class P +operator fun P.invoke() = 1 + +fun f(p: P) { + p() + p.invoke() +} \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/conventions/invokeExtension.log b/idea/testData/findUsages/kotlin/conventions/invokeExtension.log new file mode 100644 index 00000000000..c9eea523122 --- /dev/null +++ b/idea/testData/findUsages/kotlin/conventions/invokeExtension.log @@ -0,0 +1,6 @@ +Resolved p() +Searched references to pack.P +Searched references to parameter p of pack.f(p: P) in non-Java files +Used plain search of pack.invoke() in LocalSearchScope: + CLASS:P + FUN:invoke \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/conventions/invokeExtension.results.txt b/idea/testData/findUsages/kotlin/conventions/invokeExtension.results.txt new file mode 100644 index 00000000000..aef5e2e314d --- /dev/null +++ b/idea/testData/findUsages/kotlin/conventions/invokeExtension.results.txt @@ -0,0 +1,2 @@ +Function call 10 p.invoke() +Implicit 'invoke' 9 p() \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesTestGenerated.java b/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesTestGenerated.java index a1b923bc32e..8a0b2fec71a 100644 --- a/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/findUsages/FindUsagesTestGenerated.java @@ -133,6 +133,12 @@ public class FindUsagesTestGenerated extends AbstractFindUsagesTest { doTest(fileName); } + @TestMetadata("invokeExtension.0.kt") + public void testInvokeExtension() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/conventions/invokeExtension.0.kt"); + doTest(fileName); + } + @TestMetadata("plus.0.kt") public void testPlus() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/findUsages/kotlin/conventions/plus.0.kt");