Search statics java declarations through star imports

This commit is contained in:
Nikolay Krasko
2017-05-02 19:02:29 +03:00
parent 2d51d72708
commit c0b545085a
6 changed files with 74 additions and 25 deletions
@@ -272,23 +272,42 @@ class ExpressionsOfTypeProcessor(
})
}
private class StaticMemberRequestResultProcessor(val psiMember: PsiMember) : RequestResultProcessor(psiMember) {
private class StaticMemberRequestResultProcessor(val psiMember: PsiMember, classes: List<PsiClass>) : RequestResultProcessor(psiMember) {
val possibleClassesNames: Set<String> = runReadAction { classes.map { it.qualifiedName }.filterNotNullTo(HashSet()) }
override fun processTextOccurrence(element: PsiElement, offsetInElement: Int, consumer: Processor<PsiReference>): 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 ->
@@ -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
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
@@ -0,0 +1,5 @@
import JavaClassWI.Other.*
fun bar() {
INSTANCE()
}
@@ -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
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
@@ -1 +1,2 @@
Implicit 'invoke' 4 INSTANCE()
[javaInvokeWithStaticImport.0.kt] Implicit 'invoke' 4 INSTANCE()
[javaInvokeWithStaticImport.1.kt] Implicit 'invoke' 4 INSTANCE()
@@ -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