Skip to content

Instantly share code, notes, and snippets.

@dkandalov
Last active February 2, 2024 20:12
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dkandalov/7248184 to your computer and use it in GitHub Desktop.
Save dkandalov/7248184 to your computer and use it in GitHub Desktop.
IntelliJ plugin to find all recursive methods in project (can be executed using https://github.com/dkandalov/live-plugin). This is a follow up for this talk http://skillsmatter.com/podcast/nosql/using-graphs-for-source-code-analysis
import com.intellij.internal.psiView.PsiViewerDialog
import com.intellij.openapi.project.Project
import com.intellij.psi.JavaRecursiveElementVisitor
import com.intellij.psi.PsiFileSystemItem
import com.intellij.psi.PsiJavaFile
import com.intellij.psi.PsiMethod
import com.intellij.psi.PsiMethodCallExpression
import static liveplugin.PluginUtil.*
if (isIdeStartup) return
doInBackground("Looking for recursive methods") {
runReadAction {
show(findRecursiveMethodsIn(project).collect{it.parent.name + "#" + it.name}.join("\n"))
}
}
Collection<PsiMethod> findRecursiveMethodsIn(Project project) {
def result = new HashSet()
allPsiItemsIn(project).each { PsiFileSystemItem psiItem ->
if (!(psiItem instanceof PsiJavaFile)) return
def recursiveMethods = allMethodsIn(psiItem).findAll{ isRecursive(it) }
result.addAll(recursiveMethods)
}
result
}
boolean isRecursive(PsiMethod method) {
def result = false
method.acceptChildren(new JavaRecursiveElementVisitor() {
@Override void visitMethodCallExpression(PsiMethodCallExpression methodCall) {
if (methodCall.methodExpression.resolve() == method) result = true
else super.visitMethodCallExpression(methodCall)
}
})
result
}
List<PsiMethod> allMethodsIn(PsiJavaFile javaFile) {
def result = []
javaFile.acceptChildren(new JavaRecursiveElementVisitor() {
@Override void visitMethod(PsiMethod method) {
if (method.containingClass.interface) return
result << method
}
})
result
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment