如何以编程方式执行Java IDE为方法引用执行的搜索?

时间:2013-07-03 18:24:10

标签: java eclipse intellij-idea intellij-plugin static-code-analysis

你知道找到eclipse的所有引用功能(搜索>参考>工作区或Ctrl-Shift-G)?我该如何以编程方式运行?

我有一个庞大的代码库,我需要审核安全违规,并需要链接大约十几个条件。

那里有库可以用Java分析大型项目(我有1GB的源文件)吗?以下是我需要回答的问题:

  • 传入接口列表,查找这些接口的所有实现
  • 搜索该列表以查看我们的安全库
  • 搜索上面列表中引用的每个方法,以确认已进行了正确的授权库调用。

我可以在一天内手动执行此操作,但宁可花2写一个漂亮的脚本来为我做这项工作。

我可以使用哪些代码来编写Eclipse这些常见任务的脚本?理想情况下,我想执行命令行,因此它们可以重复和编写脚本,但显然会采取我能得到的。

2 个答案:

答案 0 :(得分:1)

您可以在IntelliJ IDEA中编写自己的插件来完成此任务。

以编程方式,您可以利用 PSI (程序结构界面)树来搜索各种代码元素(类,变量,方法,语句等),浏览代码库然后执行任何操作你需要做的。

以下是一些参考资料:

  1. IntelliJ IDEA Plugin Development

  2. PSI Cookbook

  3. PsiViewer Plugin

  4. 您需要做的所有事情(查找实现,搜索调用,搜索特定语句的方法)都是可能的。

    如果您下载IntelliJ IDEA社区版的源代码,您可以查看代码并查看这些内容是如何完成的。

    或者您可以在此处发布特定问题(使用intellij-plugin标记),像CrazyCoder这样的人可能非常友好地帮助您:)

    关于代码库的范围(你说1 GB?),你只需要尝试一下,看看你如何去做。最糟糕的情况是,您可以分析部分代码库。

    在任何情况下,IntelliJ IDEA中的插件开发都非常强大 ,我建议您使用此方法进行任何类型的Java代码分析或重构,您希望自己以编程方式进行控制(并且尚未涵盖开箱即用的重构)。

    祝你好运!

答案 1 :(得分:0)

六年后,所以这可能对您没有太大帮助。也许会帮助别人...

我有许多有用的Eclipse JDT搜索方法here,它们使用SearchEngine等。例如:

    /**
     * Collects the methods that access the specified member
     * @param element the field or method whose accessors are being determined
     * @param scope the elements being examined, e.g. this class or this package
     * @return the collection of methods that access the indicated member
     */
    public static Set<IMethod> calculateCallingMethods(
            IJavaElement element,
            IJavaSearchScope scope)
            throws CoreException {
        SearchEngine searchEngine = new SearchEngine();
        SearchParticipant[] participants =
            new SearchParticipant[] { SearchEngine.getDefaultSearchParticipant() };
        SearchPattern callingMethodPattern = SearchPattern.createPattern(
                element, REFERENCES);
        MethodCollector methodCollector = new MethodCollector();
        searchEngine.search(callingMethodPattern, participants, scope,
                methodCollector, null);
        Set<IMethod> callers = methodCollector.getResults();
        return callers;
}