我需要在所有项目中找到所有Java类型(classe,interface,enum,annotation)'工作空间的源目录,名称为String。例如,输入"测试"将返回名称以&#34开始的所有Java类型;测试"在所有项目源目录中定义。我尝试用JDT的SearchEngine处理这个问题,如下所示
SearchPattern pattern = SearchPattern.createPattern("Test",
IJavaSearchConstants.TYPE, IJavaSearchConstants.DECLARATIONS,
SearchPattern.R_PREFIX_MATCH);
IJavaSearchScope scope = SearchEngine.createWorkspaceScope();
SearchRequestor requestor = new SearchRequestor() {
public void acceptSearchMatch(SearchMatch match) {
System.out.println("Found: " + match.getElement());
}
};
SearchEngine searchEngine = new SearchEngine();
try {
searchEngine.search(pattern, new SearchParticipant[] { SearchEngine
.getDefaultSearchParticipant() }, scope, requestor,
null);
} catch (CoreException e) {
e.printStackTrace();
}
上面的代码返回了一些不在Eclipse工作区中的java类型。例如:
找到:TestSimple(未打开)[在TestSimple.class [in< default> [in / home / me / test]]]
TestSimple.java是从我的主目录中的命令行创建的文件,它与Eclipse项目无关。 (我的Eclipse工作区在/ home / me / eclipse / workspace中定义。)我不确定为什么它包含在搜索结果中? SearchEngine是处理这种情况的最佳方式,因为我只需要java类型的名称,我不需要在类,如字段,方法或引用中的任何内容?感谢
答案 0 :(得分:0)
您可能希望构建一个更有限的搜索范围,然后向每个IJavaProject询问其所有包片段根(IJavaProject#getAllPackageFragmentRoots()
),并仅包括从K_SOURCE
返回IPackageFragmentRoot#getKind()
的那些避免从引用的库中获取类型。对名称的搜索不应该比命中已经存储的索引做更多的事情。你不能仅仅依赖文件名,因为它会完全错过内部类。