Для поиска в проектах Java в рабочей области таких элементов Java, как ссылок на методы, объявлений полей, средств реализации интерфейса и т.д. пользовательский модуль может использовать API JDT.
Точкой входа для поиска Java является класс SearchEngine. Можно выполнять поиск по шаблону внутри элемента Java и задавать область поиска определенных элементов. Шаблоны поиска можно создавать с помощью createPattern. Область действия шаблона задается с помощью createJavaSearchScope. После того как шаблон и область действия определены, для сбора результатов поиска вызывается метод search.
Результаты поиска передаются в SearchRequestor, который необходимо расширить для получения доступа к результатам.
Операция поиска будет использовать как шаблон для описания типа поиска, так и область, ограничивающую исследуемый диапазон.
Шаблон поиска определяет, как искать результаты. Шаблон поиска можно создать или из элемента Java (см. createPatternPattern(IJavaElement, int)), или из строки (см. createPattern(String, int, int, int)). Второй метод поддерживает символы подстановки (то есть символы '*') и может применяться для расширения результатов поиска.
Например, шаблон для поиска ссылок на метод создается следующим образом:
// Получение метода IMethod method = ...; // Создание шаблона поиска SearchPattern pattern = SearchPattern.createPattern(method, IJavaSearchConstants.REFERENCES);
а шаблон для поиска объявлений всех типов, начинающихся с "Obj", создается так:
// Создание шаблона поиска SearchPattern pattern = SearchPattern.createPattern("Obj*", IJavaSearchConstants.TYPE, IJavaSearchConstants.DECLARATIONS, SearchPattern.R_PATTERN_MATCH | SearchPattern.R_CASE_SENSITIVE);
Поддерживаются следующие шаблоны поиска:
Если вас интересуют результаты поиска в данном проекте или даже в данном пакете, или если известно, что результаты могут находиться только в иерархии данного типа, то вы можете создать подходящую область поиска с помощью метода createJavaSearchScope(IJavaElement[]) или createHierarchyScope(IType).
Например, область поиска для данного пакета создается следующим образом:
// Получение пакета IPackageFragment pkg = ...; // Создание области поиска IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new IJavaElement[] {pkg});
Область поиска для иерархии данного типа создается так:
// Получение типа IType type = ...; // Создание области поиска IJavaSearchScope scope = SearchEngine.createHierarchyScope(type);
Наконец, можно создать область поиска для всей рабочей области:
// Создание области поиска IJavaSearchScope scope = SearchEngine.createWorkspaceScope();
После того как шаблон и область поиска созданы, а SearchRequestor расширен, можно запускать поисковый запрос:
// Получение шаблона поиска SearchPattern pattern = ...; // Получение области поиска IJavaSearchScope scope = ...; // Получение инициатора поиска (search requestor) SearchRequestor requestor = ...; // Поиск SearchEngine searchEngine = new SearchEngine(); searchEngine.search(pattern, new SearchParticipant[] {SearchEngine.getDefaultSearchParticipant()}, scope, requestor, null);
С помощью метода beginReporting инициатору поиска (search requestor) отправляется уведомление о начале поиска. Затем с помощью метода acceptSearchMatch выполняется сбор результатов поиска. И, наконец, метод endReporting указывает, что поиск завершен.
Для составления отчета о результатах поиска используется метод acceptSearchMatch. Подробное описание результатов поиска приводится ниже.
Результат поиска может соответствовать элементу Java (например, объявлению типа), либо он может содержаться в элементе Java (например, ссылка на тип внутри метода). Средство поиска всегда пытается найти самый внутренний элемент Java, который соответствует результату поиска или содержит этот результат. Например, при поиске ссылок на метод ссылка может быть найдена в инициализаторе. Инициализатор, который содержит эту ссылку на метод, является элементом результата поиска.
Средство поиска пытается также найти ресурс, содержащий элемент Java. Поэтому в том случае, когда элемент Java представляет собой метод в единице компиляции, то ресурс - это соответствующий IFile. Если элемент содержится в файле .jar, то ресурс - этот файл .jar (если данный файл .jar находится в рабочей области). Однако, если файл .jar - внешний, то ресурс будет null.
Позиции в файле исходного кода выдаются относительно единицы компиляции, содержащей результат поиска. Если результат поиска содержится в файле .jar, то позиции указываются относительно прикрепленного исходного кода. Если к файлу .jar не прикреплен никакой файл исходного кода, то позиции будут (-1, -1).
В большинстве случае результаты поиска будут точными; это значит, что средству поиска удалось определить, что данное совпадение - именно то, которое запрашивалось. Однако в некоторых случаях средство поиска не в состоянии сделать это, поэтому совпадение будет неточным. Причины, по которым совпадение может быть неточным, перечислены ниже: