diff --git a/idea/idea-analysis/idea-analysis.iml b/idea/idea-analysis/idea-analysis.iml index 3523fabbbf3..e624de9592d 100644 --- a/idea/idea-analysis/idea-analysis.iml +++ b/idea/idea-analysis/idea-analysis.iml @@ -35,5 +35,6 @@ + \ No newline at end of file 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 3f49603a055..6c1dac649e2 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 @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.idea.search.usagesSearch.operators +import com.intellij.openapi.components.ServiceManager import com.intellij.psi.PsiElement import com.intellij.psi.PsiReference import com.intellij.psi.search.SearchRequestCollector @@ -27,6 +28,7 @@ import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance +import org.jetbrains.uast.* class InvokeOperatorReferenceSearcher( targetFunction: PsiElement, @@ -35,6 +37,15 @@ class InvokeOperatorReferenceSearcher( optimizer: SearchRequestCollector, options: KotlinReferencesSearchOptions ) : OperatorReferenceSearcher(targetFunction, searchScope, consumer, optimizer, options, wordsToSearch = emptyList()) { + private val callArgumentsSize: Int? + + init { + val uastContext = ServiceManager.getService(targetFunction.project, UastContext::class.java) + val uMethod = uastContext.convertOpt(targetDeclaration, null) + val uastParameters = uMethod?.uastParameters + + callArgumentsSize = if (uastParameters != null && uastParameters.none { it.uastInitializer != null }) uastParameters.size else null + } override fun processPossibleReceiverExpression(expression: KtExpression) { val callExpression = expression.parent as? KtCallExpression ?: return @@ -44,6 +55,12 @@ class InvokeOperatorReferenceSearcher( override fun isReferenceToCheck(ref: PsiReference) = ref is KtInvokeFunctionReference override fun extractReference(element: KtElement): PsiReference? { - return (element as? KtCallExpression)?.references?.firstIsInstance() + val callExpression = element as? KtCallExpression ?: return null + + if (callArgumentsSize != null && callArgumentsSize != callExpression.valueArguments.size) { + return null + } + + return callExpression.references.firstIsInstance() } } \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/conventions/invoke.0.kt b/idea/testData/findUsages/kotlin/conventions/invoke.0.kt index fee1763a7b9..8988752c597 100644 --- a/idea/testData/findUsages/kotlin/conventions/invoke.0.kt +++ b/idea/testData/findUsages/kotlin/conventions/invoke.0.kt @@ -26,4 +26,8 @@ class C(): B(12) { fun cTest(c: C) { c(5) + + some(12, "Irrelevant usage") } + +fun some(i: Int, s: String) {} diff --git a/idea/testData/findUsages/kotlin/conventions/invoke.log b/idea/testData/findUsages/kotlin/conventions/invoke.log index 8ea9945459f..a3daec3c81d 100644 --- a/idea/testData/findUsages/kotlin/conventions/invoke.log +++ b/idea/testData/findUsages/kotlin/conventions/invoke.log @@ -1,8 +1,6 @@ Checked type of pack.f() Checked type of v Resolved c(5) -Resolved f() -Resolved f() Resolved f()(2) Resolved listOf(Obj)[0](1) Resolved v(1)