Skip to content

Commit 66f3666

Browse files
committed
feat(java): add class caller lookup functionality #358
Add `findCallers` method to JavaCallHelper for finding callers of PsiClass. This extends the existing method caller lookup to support class-level usage tracking, similar to the method-level functionality. Also updates JavaRelatedClassesProvider to handle PsiClass inputs.
1 parent 384830b commit 66f3666

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed

java/src/main/kotlin/cc/unitmesh/idea/provider/JavaRelatedClassesProvider.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class JavaRelatedClassesProvider : RelatedClassesProvider {
4343
): List<PsiNamedElement> {
4444
return when (element) {
4545
is PsiMethod -> runReadAction { JavaCallHelper.findCallers(project, element) }
46+
is PsiClass -> runReadAction { JavaCallHelper.findCallers(project, element) }
4647
else -> emptyList()
4748
}
4849
}

java/src/main/kotlin/cc/unitmesh/idea/util/JavaCallHelper.kt

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,24 @@
11
package cc.unitmesh.idea.util
22

3+
import com.intellij.find.FindManager
4+
import com.intellij.find.findUsages.JavaClassFindUsagesOptions
5+
import com.intellij.find.impl.FindManagerImpl
36
import com.intellij.openapi.application.runReadAction
47
import com.intellij.openapi.progress.ProgressManager
58
import com.intellij.openapi.progress.util.ProgressIndicatorBase
69
import com.intellij.openapi.project.Project
10+
import com.intellij.openapi.util.text.StringUtil
711
import com.intellij.psi.JavaRecursiveElementVisitor
12+
import com.intellij.psi.PsiClass
813
import com.intellij.psi.PsiMethod
914
import com.intellij.psi.PsiMethodCallExpression
1015
import com.intellij.psi.search.ProjectScope
1116
import com.intellij.psi.search.searches.ClassInheritorsSearch
1217
import com.intellij.psi.search.searches.MethodReferencesSearch
13-
import com.intellij.psi.util.*
14-
import kotlin.collections.flatten
18+
import com.intellij.psi.util.PsiTreeUtil
19+
import com.intellij.usageView.UsageInfo
20+
import com.intellij.util.CommonProcessors
21+
import com.intellij.util.Function
1522

1623
object JavaCallHelper {
1724
/**
@@ -69,4 +76,25 @@ object JavaCallHelper {
6976

7077
return callers.distinct()
7178
}
79+
80+
fun findCallers(project: Project, clazz: PsiClass): List<PsiMethod> {
81+
val options = JavaClassFindUsagesOptions(project)
82+
val processor = CommonProcessors.CollectProcessor<UsageInfo?>()
83+
val findUsagesManager = (FindManager.getInstance(project) as FindManagerImpl).findUsagesManager
84+
val handler = findUsagesManager.getFindUsagesHandler(clazz, true)
85+
86+
val callers: MutableList<PsiMethod> = ArrayList()
87+
88+
ProgressManager.getInstance().runProcess(Runnable {
89+
handler!!.processElementUsages(clazz, processor, options)
90+
91+
val usages = processor.getResults()
92+
val text = StringUtil.join<UsageInfo?>(usages, Function { u: UsageInfo? -> u!!.element!!.text }, ",")
93+
94+
println("Find usages: $text")
95+
}, ProgressIndicatorBase())
96+
97+
return callers
98+
}
7299
}
100+

0 commit comments

Comments
 (0)