Seu plug-in pode utilizar a API do JDT para pesquisar projetos Java na área de trabalho de elementos Java, como referências de métodos, declarações de campo, implementadores de uma interface, etc.
O ponto de entrada da pesquisa Java é a classe SearchEngine. Você pode pesquisar determinados padrões em um elemento Java e criar um escopo de pesquisa para elementos específicos. Os padrões de pesquisa podem ser criados utilizandocreateSearchPattern. O escopo de um padrão é criado utilizandocreateJavaSearchScope. Depois de definidos o padrão e o escopo, o métodosearch é utilizado para coletar os resultados.
Os resultados da pesquisa são relatados a um IJavaSearchResultCollector,que você deve implementar para acessar os resultados.
Uma operação de pesquisa utilizará um padrão para descrever a natureza da pesquisa e um escopo para restringir a faixa de investigação.
Um padrão de pesquisa define como os resultados da pesquisa são encontrados. Você pode criar um padrão de pesquisa a partir de um elemento Java (consulte createSearchPattern(IJavaElement, int)) ou a partir de uma cadeia (consulte createSearchPattern(String, int, int, boolean).) O último método suporta caracteres curinga (por ex., '*') e pode ser utilizado para ampliar os resultados da pesquisa.
Por exemplo, a criação de um padrão de pesquisa para pesquisar referências a um determinado método é feita da seguinte forma:
// Obter o método IMethod method = ...; // Criar o padrão de pesquisa ISearchPattern pattern = SearchEngine.createSearchPattern(method, IJavaSearchConstants.REFERENCES);
Ou a criação de um padrão de pesquisa para pesquisar declarações de todos os tipos que comecem com "Obj":
// Criar o padrão de pesquisa ISearchPattern pattern = SearchEngine.createSearchPattern("Obj*", IJavaSearchConstants.TYPE, IJavaSearchConstants.DECLARATIONS, true);
Os seguintes padrões de pesquisa são suportados:
Se você estiver interessado nos resultados de pesquisa de um determinado projeto ou até mesmo de um determinado pacote, ou se souber que os resultados da pesquisa só podem estar em uma hierarquia de um determinado tipo, poderá criar o escopo de pesquisa apropriado utilizando createJavaSearchScope(IJavaElement[]) ou createHierarchyScope(IType).
Por exemplo, a criação de um escopo de pesquisa em um determinado pacote é feita da seguinte forma:
// Obter o pacote IPackageFragment pkg = ...; // Criar o escopo de pesquisa IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] {pkg});
Ou a criação de um escopo de pesquisa na hierarquia de um determinado tipo:
// Obter o tipo IType type = ...; // Criar o escopo de pesquisa IJavaSearchScope scope = SearchEngine.createHierarchyScope(type);
Finalmente, você pode criar um escopo de pesquisa em toda a área de trabalho:
// Criar o escopo de pesquisa IJavaSearchScope scope = SearchEngine.createWorkspaceScope();
Depois de ter criado um padrão de pesquisa e um escopo de pesquisa e de ter implementado IJavaSearchResultCollector, será possível iniciar uma consulta de pesquisa como a seguir:
// Obter o padrão de pesquisa ISearchPattern pattern = ...; // Obter o escopo de pesquisa IJavaSearchScope scope = ...; // Obter o coletor de resultados da pesquisa IJavaSearchResultCollector collector = ...; // Pesquisar SearchEngine searchEngine = new SearchEngine(); searchEngine.search(ResourcesPlugin.getWorkspace(), pattern, scope, collector);
Uma notificação do início da pesquisa é enviada ao coletor de resultados da pesquisa utilizando o método aboutToStart. Em seguida, cada resultado da pesquisa é relatado com o método accept. Finalmente, done indica que a pesquisa terminou.
Os resultados da pesquisa são relatados com o método accept. Os parágrafos a seguir detalham cada argumento para este método.
Um resultado de pesquisa pode corresponder a um elemento Java (por ex., uma declaração de tipo) ou pode estar contido em um elemento Java (por ex., uma referência a um tipo dentro de um método). O mecanismo de pesquisa sempre tenta localizar o elemento Java mais interno que corresponder ou contiver o resultado da pesquisa. Por exemplo, a pesquisa de declarações de tipo pelo nome pode encontrar uma declaração de tipo local. Como o gabarito Java não representa tipos locais, o método que contém esta declaração de tipo local é fornecido ao coletor de resultados.
O mecanismo de pesquisa também tenta fornecer o recurso que contém o elemento Java para o coletor de resultados. Portanto, se o elemento Java for um método em uma unidade de compilação, o recurso será o IFile correspondente. Se o elemento estiver contido em um arquivo .jar, o recurso será o arquivo .jar, se este arquivo .jar estiver na área de trabalho. Se for um arquivo .jar externo, o recurso será null.
As posições de origem são fornecidas em relação à unidade de compilação que contém o resultado da pesquisa. Se o resultado da pesquisa estiver contido em um arquivo .jar, as posições de origem serão relativas à origem conectada. Elas serão (-1, -1) se não houver origem conectada ao arquivo .jar.
Na maioria dos casos, os resultados da pesquisa são precisos, significando que o mecanismo de pesquisa conseguiu determinar que a correspondência fornecida era o que se esperava. No entanto, em alguns casos o mecanismo não é eficiente e a correspondência é inexata. Alguns motivos possíveis pelos quais uma correspondência seria inexata são: