From c0b545085ad368c4575fbb19f189a2ad2a849227 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Tue, 2 May 2017 19:02:29 +0300 Subject: [PATCH] Search statics java declarations through star imports --- .../ExpressionsOfTypeProcessor.kt | 61 ++++++++++++++----- .../java/findJavaMethodUsages/javaInvoke.log | 16 +++-- .../javaInvokeWithStaticImport.1.kt | 5 ++ .../javaInvokeWithStaticImport.log | 8 ++- .../javaInvokeWithStaticImport.results.txt | 3 +- .../conventions/components/dataClass.log | 6 +- 6 files changed, 74 insertions(+), 25 deletions(-) create mode 100644 idea/testData/findUsages/java/findJavaMethodUsages/javaInvokeWithStaticImport.1.kt diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/ExpressionsOfTypeProcessor.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/ExpressionsOfTypeProcessor.kt index fb23407d988..18bc64fd167 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/ExpressionsOfTypeProcessor.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/ExpressionsOfTypeProcessor.kt @@ -272,23 +272,42 @@ class ExpressionsOfTypeProcessor( }) } - private class StaticMemberRequestResultProcessor(val psiMember: PsiMember) : RequestResultProcessor(psiMember) { + private class StaticMemberRequestResultProcessor(val psiMember: PsiMember, classes: List) : RequestResultProcessor(psiMember) { + val possibleClassesNames: Set = runReadAction { classes.map { it.qualifiedName }.filterNotNullTo(HashSet()) } + override fun processTextOccurrence(element: PsiElement, offsetInElement: Int, consumer: Processor): Boolean { - if (element !is KtQualifiedExpression) return true + when (element) { + is KtQualifiedExpression -> { + val selectorExpression = element.selectorExpression ?: return true + val selectorReference = element.findReferenceAt(selectorExpression.startOffsetInParent) - val selectorExpression = element.selectorExpression ?: return true - val selectorReference = element.findReferenceAt(selectorExpression.startOffsetInParent) + val references = when (selectorReference) { + is PsiMultiReference -> selectorReference.references.toList() + else -> listOf(selectorReference) + }.filterNotNull() - val references = when (selectorReference) { - is PsiMultiReference -> selectorReference.references.toList() - else -> listOf(selectorReference) - }.filterNotNull() + for (ref in references) { + ProgressManager.checkCanceled() - for (ref in references) { - ProgressManager.checkCanceled() + if (ref.isReferenceTo(psiMember)) { + consumer.process(ref) + } + } + } - if (ref.isReferenceTo(psiMember)) { - consumer.process(ref) + is KtImportDirective -> { + if (element.isAllUnder) { + val fqName = element.importedFqName?.asString() + if (fqName != null && fqName in possibleClassesNames) { + val ref = element.importedReference + ?.getQualifiedElementSelector() + ?.references + ?.firstOrNull() + if (ref != null) { + consumer.process(ref) + } + } + } } } @@ -323,15 +342,25 @@ class ExpressionsOfTypeProcessor( } val searchRequestCollector = SearchRequestCollector(SearchSession()) - val resultProcessor = StaticMemberRequestResultProcessor(member) + val resultProcessor = StaticMemberRequestResultProcessor(member, classes) for (klass in classes) { val request = klass.name + "." + declarationName - testLog?.add("Searched references to static member in non-Java files by request $request") - + testLog?.add("Searched references to static ${member.name} in non-Java files by request $request") searchRequestCollector.searchWord( - request, classUseScope(klass).intersectWith(memberScope), UsageSearchContext.IN_CODE, true, member, resultProcessor) + request, + classUseScope(klass).intersectWith(memberScope), UsageSearchContext.IN_CODE, true, member, resultProcessor) + + val qualifiedName = runReadAction { klass.qualifiedName } + if (qualifiedName != null) { + val importAllUnderRequest = qualifiedName + ".*" + + testLog?.add("Searched references to static ${member.name} in non-Java files by request $importAllUnderRequest") + searchRequestCollector.searchWord( + importAllUnderRequest, + classUseScope(klass).intersectWith(memberScope), UsageSearchContext.IN_CODE, true, member, resultProcessor) + } } PsiSearchHelper.SERVICE.getInstance(project).processRequests(searchRequestCollector) { reference -> diff --git a/idea/testData/findUsages/java/findJavaMethodUsages/javaInvoke.log b/idea/testData/findUsages/java/findJavaMethodUsages/javaInvoke.log index f1a1b67220c..d83063f3690 100644 --- a/idea/testData/findUsages/java/findJavaMethodUsages/javaInvoke.log +++ b/idea/testData/findUsages/java/findJavaMethodUsages/javaInvoke.log @@ -3,6 +3,7 @@ Resolved INSTANCE() Resolved INSTANCE() Resolved INSTANCE() Resolved OJC() +Resolved OJC() Resolved c() Resolved o() Searched references to JavaClassInvoke @@ -11,8 +12,13 @@ Searched references to JavaClassInvoke.Other Searched references to JavaClassInvoke.OtherJavaClass Searched references to parameter c of f(c: JavaClassInvoke) in non-Java files Searched references to parameter o of foo(o: JavaClassInvoke.OtherJavaClass) in non-Java files -Searched references to static member in non-Java files by request AnotherOther.INSTANCE -Searched references to static member in non-Java files by request JavaClassInvoke.INSTANCE -Searched references to static member in non-Java files by request Other.INSTANCE -Searched references to static member in non-Java files by request OtherJavaClass.INSTANCE -Searched references to static member in non-Java files by request OtherJavaClass.OJC \ No newline at end of file +Searched references to static INSTANCE in non-Java files by request AnotherOther.INSTANCE +Searched references to static INSTANCE in non-Java files by request JavaClassInvoke.* +Searched references to static INSTANCE in non-Java files by request JavaClassInvoke.AnotherOther.* +Searched references to static INSTANCE in non-Java files by request JavaClassInvoke.INSTANCE +Searched references to static INSTANCE in non-Java files by request JavaClassInvoke.Other.* +Searched references to static INSTANCE in non-Java files by request JavaClassInvoke.OtherJavaClass.* +Searched references to static INSTANCE in non-Java files by request Other.INSTANCE +Searched references to static INSTANCE in non-Java files by request OtherJavaClass.INSTANCE +Searched references to static OJC in non-Java files by request JavaClassInvoke.OtherJavaClass.* +Searched references to static OJC in non-Java files by request OtherJavaClass.OJC \ No newline at end of file diff --git a/idea/testData/findUsages/java/findJavaMethodUsages/javaInvokeWithStaticImport.1.kt b/idea/testData/findUsages/java/findJavaMethodUsages/javaInvokeWithStaticImport.1.kt new file mode 100644 index 00000000000..8730842d07c --- /dev/null +++ b/idea/testData/findUsages/java/findJavaMethodUsages/javaInvokeWithStaticImport.1.kt @@ -0,0 +1,5 @@ +import JavaClassWI.Other.* + +fun bar() { + INSTANCE() +} diff --git a/idea/testData/findUsages/java/findJavaMethodUsages/javaInvokeWithStaticImport.log b/idea/testData/findUsages/java/findJavaMethodUsages/javaInvokeWithStaticImport.log index ef5f3ce40b5..6e749953a5b 100644 --- a/idea/testData/findUsages/java/findJavaMethodUsages/javaInvokeWithStaticImport.log +++ b/idea/testData/findUsages/java/findJavaMethodUsages/javaInvokeWithStaticImport.log @@ -1,6 +1,10 @@ Resolved INSTANCE() +Resolved INSTANCE() Searched imported static member PsiField:INSTANCE in [JetFile: javaInvokeWithStaticImport.0.kt] +Searched imported static member PsiField:INSTANCE in [JetFile: javaInvokeWithStaticImport.1.kt] Searched references to JavaClassWI Searched references to JavaClassWI.Other -Searched references to static member in non-Java files by request JavaClassWI.INSTANCE -Searched references to static member in non-Java files by request Other.INSTANCE \ No newline at end of file +Searched references to static INSTANCE in non-Java files by request JavaClassWI.* +Searched references to static INSTANCE in non-Java files by request JavaClassWI.INSTANCE +Searched references to static INSTANCE in non-Java files by request JavaClassWI.Other.* +Searched references to static INSTANCE in non-Java files by request Other.INSTANCE \ No newline at end of file diff --git a/idea/testData/findUsages/java/findJavaMethodUsages/javaInvokeWithStaticImport.results.txt b/idea/testData/findUsages/java/findJavaMethodUsages/javaInvokeWithStaticImport.results.txt index 0f28189c1d2..4a9a6249d4c 100644 --- a/idea/testData/findUsages/java/findJavaMethodUsages/javaInvokeWithStaticImport.results.txt +++ b/idea/testData/findUsages/java/findJavaMethodUsages/javaInvokeWithStaticImport.results.txt @@ -1 +1,2 @@ -Implicit 'invoke' 4 INSTANCE() \ No newline at end of file +[javaInvokeWithStaticImport.0.kt] Implicit 'invoke' 4 INSTANCE() +[javaInvokeWithStaticImport.1.kt] Implicit 'invoke' 4 INSTANCE() \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/conventions/components/dataClass.log b/idea/testData/findUsages/kotlin/conventions/components/dataClass.log index a18030600cb..d1396662f2e 100644 --- a/idea/testData/findUsages/kotlin/conventions/components/dataClass.log +++ b/idea/testData/findUsages/kotlin/conventions/components/dataClass.log @@ -10,6 +10,7 @@ Checked type of x2 Checked type of x2 Checked type of x3 Checked type of x3 +Checked type of x3 Checked type of x4 Checked type of x5 Checked type of y @@ -19,6 +20,7 @@ Checked type of y2 Checked type of y2 Checked type of y3 Checked type of y3 +Checked type of y3 Checked type of y4 Checked type of y5 Checked type of z @@ -33,6 +35,7 @@ Resolved (x1, y1, z1) Resolved (x2, y2) Resolved (x2, y2, z2) Resolved (x3, y3) +Resolved (x3, y3) Resolved (x3, y3, z3) Resolved (x4, y4, z4) Resolved (x5, y5, z5) @@ -50,7 +53,8 @@ Searched references to pack.A Searched references to pack.X Searched references to parameter p1 of test2(p1: JavaClass2, p2: JavaClass3) in non-Java files Searched references to parameter p2 of test2(p1: JavaClass2, p2: JavaClass3) in non-Java files -Searched references to static member in non-Java files by request JavaClass4.getNested +Searched references to static getNested in non-Java files by request JavaClass4.* +Searched references to static getNested in non-Java files by request JavaClass4.getNested Used plain search of parameter n of A(val n: Int, val s: String, val o: Any) in LocalSearchScope: CLASS:A CLASS:X