您的插件可以使用 JDT API 来搜索工作区中的 Java 项目以找到 Java 元素(例如,方法引用、字段声明和接口的实现器等)。
Java 搜索的入口点是 SearchEngine 类。可以搜索 Java 元素内的特定模式和将搜索范围限定为特定的元素。可以使用 createSearchPattern 来创建搜索模式。使用 createJavaSearchScope 来限定模式的作用域。确定模式和作用域之后,使用 search 方法来收集结果。
将把搜索结果报告给 IJavaSearchResultCollector, 必须实现它才能访问结果。
搜索操作将使用一种模式来描述搜索性质,并使用作用域来限制搜索范围。
搜索模式定义如何找到搜索结果。可以根据 Java 元素(参见 createSearchPattern(IJavaElement, int))或根据字符串(参见 createSearchPattern(String, int, int, boolean))来创建搜索模式。后一种方法支持通配符(即,“*”),并且可以用来扩大搜索结果。
例如,按如下所示完成创建一种搜索模式来搜索对给定方法的引用:
// Get the method IMethod method = ...; // Create search pattern ISearchPattern pattern = SearchEngine.createSearchPattern(method, IJavaSearchConstants.REFERENCES);
或者创建一种搜索模式来搜索以“Obj”开头的所有类型的声明:
// Create search pattern ISearchPattern pattern = SearchEngine.createSearchPattern("Obj*", IJavaSearchConstants.TYPE, IJavaSearchConstants.DECLARATIONS, true);
下列搜索模式是受支持的:
如果您对给定项目甚至是给定包中的搜索结果感兴趣,或者如果您知道搜索结果只能在给定类型的层次结构中,则可以使用 createJavaSearchScope(IJavaElement[]) 或 createHierarchyScope(IType) 来创建适当的搜索范围。
例如,按如下所示来完成创建给定包的搜索范围:
// Get the package IPackageFragment pkg = ...; // Create search scope IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] {pkg});
或者按如下所示创建给定类型的层次结构的搜索范围:
// Get the type IType type = ...; // Create search scope IJavaSearchScope scope = SearchEngine.createHierarchyScope(type);
最后,可以创建整个工作区的搜索范围:
// Create search scope IJavaSearchScope scope = SearchEngine.createWorkspaceScope();
一旦创建了搜索模式和搜索范围,并且实现了 IJavaSearchResultCollector,就可以按如下所示开始搜索查询:
// Get the search pattern ISearchPattern pattern = ...; // Get the search scope IJavaSearchScope scope = ...; // Get the search result collector IJavaSearchResultCollector collector = ...; // Search SearchEngine searchEngine = new SearchEngine(); searchEngine.search(ResourcesPlugin.getWorkspace(), pattern, scope, collector);
使用 aboutToStart 方法将搜索开始的通知发送到了搜索结果收集器中。然后,使用 accept 方法报告了每个搜索结果。最后,完成指示搜索已结束。
使用 accept 方法来报告搜索结果。下面的段落详细描述了此方法的每个自变量。
搜索结果可以与 Java 元素(例如,类型声明)相对应,或者它可以包含在 Java 元素(例如,对方法内的类型的引用)中。搜索引擎总是试图找到与搜索结果相对应或者包含搜索结果的最内层 Java 元素。例如,按名称搜索类型声明可能会找到本地类型声明。由于 Java 模型不表示本地类型,因此,为结果收集器提供包含此本地类型声明的方法。
搜索引擎还试图为结果收集器提供包含 Java 元素的资源。因此,如果 Java 元素是编译单元中的方法,则资源是相应的 IFile。如果元素包含在 .jar 文件中,则资源是该 .jar 文件(如果此 .jar 文件在工作区中的话)。如果它是外部 .jar 文件,则资源为空。
源位置是相对于包含搜索结果的编译单元来给定的。如果搜索结果包含在 .jar 文件中,则源位置相对于所连接的源。如果没有任何源与 .jar 文件相连,则源位置为(-1, -1)。
在大多数情况下,搜索结果是准确的,这意味着搜索引擎能够确定给定的匹配是否是所请求的内容。但是,在某些情况下,搜索引擎无法做到这一点,在这些情况下,匹配是不准确的。下面是导致匹配不准确的一些可能原因: