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 procura podem ser criados utilizando createPattern. O escopo de um padrão é criado utilizandocreateJavaSearchScope. Depois de definidos o padrão e o escopo, o método search é utilizado para coletar os resultados.
Os resultados da procura são relatados a um SearchRequestor, que você deve estender 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. Também é possível criar um padrão de procura a partir de um elemento Java (consulte createPatternPattern(IJavaElement, int)) ou a partir de uma cadeia (consulte createPattern(String, int, int, int).) 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 SearchPattern pattern = SearchPattern.createPattern(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 SearchPattern pattern = SearchPattern.createPattern("Obj*", IJavaSearchConstants.TYPE, IJavaSearchConstants.DECLARATIONS, SearchPattern.R_PATTERN_MATCH | SearchPattern.R_CASE_SENSITIVE);
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 procura e um escopo de procura e de ter estendido SearchRequestor, será possível iniciar uma consulta de procura da seguinte maneira:
// Obter o padrão de pesquisa SearchPattern pattern = ...; // Obter o escopo de pesquisa IJavaSearchScope scope = ...; // Obter o solicitante da procura SearchRequestor requestor = ...; // Pesquisar SearchEngine searchEngine = new SearchEngine(); searchEngine.search(pattern, new SearchParticipant[] {SearchEngine.getDefaultSearchParticipant()}, scope, requestor, null);
Uma notificação do início da procura é enviada ao solicitante da procura utilizando o método beginReporting. A seguir, cada resultado da procura é relatado utilizando o método acceptSearchMatch. Finalmente, endReporting indica que a procura terminou.
Os resultados da procura são relatados utilizando o método acceptSearchMatch. Os parágrafos a seguir detalham a correspondência da procura.
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 procura de referências de um método poderia localizar tal referência em um inicializador. O inicializador que contém essa referência de método é o elemento da correspondência de pesquisa.
O mecanismo de procura também tenta localizar o recurso que contém o elemento Java. 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: