Last active
February 2, 2024 20:12
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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