Я разрабатываю плагин, который принимает все перечисления в рабочей области, который реализует определенный интерфейс (IDomain), анализирует код (используя AST), вносит некоторые изменения в перечисление и помечает его как обработанный с аннотацией (@IDomainInfo).
Например, требуется что-то вроде этого:
public
enum SomeEnum implements IDomain {
// ...
}
И генерирует что-то вроде этого:
public @IDomainInfo(domainId = 1)
enum SomeEnum implements IDomain {
// Some changes here...
}
Идея @IDomainInfo заключается в том, что аннотированные перечисления больше не должны обрабатываться плагином.
В основном, что я делаю, чтобы выполнить задачу, это выполнить поиск с помощью API JavaSearch, чтобы найти все перечисления, реализующие IDomain (простая задача), и в результате я получаю список IJavaElements (которые на самом деле являются экземплярами IType). Затем я вызываю метод, который выполняет итерацию по результирующему списку и создает новый список всех экземпляров IType, которые не аннотированы @IDomainInfo, а затем обрабатываю результирующий список: для каждого неаннотированного IType сделайте некоторую работу, аннотируйте IType с помощью @ Аннотация IDomainInfo (с использованием AST), а затем сохранить результаты обратно в файл (с помощью IFile, чтобы я мог видеть изменения без обновления, и фактически, если у меня открыто перечисление в редакторе, я вижу, что оно обновляется мгновенно: -)
Все это прекрасно работает, но если я открою аннотированное перечисление @IDomainInfo (только для тестирования), затем удалю @IDomainInfo, сохраню файл (я уверен) и затем вызову действие, которое выполняет всю работу, которую я описанный выше, когда я добираюсь до части, которая фильтрует аннотированный IType от неаннотированных, код выглядит примерно так:
for (IType type : typeList) {
IAnnotation annotation = type.getAnnotation(“IDomainInfo”);
if (!annotation.exists()) {
// The annotation does not exist, so add the type to the
// list of elements to update and go on...
ret.add(type);
continue;
}
// Something else here...
}
Что ж, получается, что для файла, который я только что сохранил, IType обнаруживает аннотацию, которую я только что удалил, как будто она все еще там. Если я закрою и снова открою затмение, все будет работать нормально.
Теперь я только что проверил и трижды проверил свой код, так что я уверен, что я не сохраняю устаревшую копию старого IType без изменений в версии с аннотациями (все мои IType взяты из свежего поиска java звоните каждый раз, когда я запускаю действие).
Итак, вопрос в том, что я могу делать не так? Я имею в виду, что я только что прочитал JavaCore API много раз, чтобы проверить, могу ли я использовать его неправильно или у меня есть какой-то концептуальный недостаток, но на самом деле я понятия не имею, это похоже на , если eclipse будет кэшировать игнорирование IType изменения, которые я только что сделал в редакторе : - /
Если у кого-то есть идея, я буду очень признателен: -)