Странная проблема с кешем JavaCore IType - PullRequest
5 голосов
/ 06 января 2010

Я разрабатываю плагин, который принимает все перечисления в рабочей области, который реализует определенный интерфейс (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 изменения, которые я только что сделал в редакторе : - /

Если у кого-то есть идея, я буду очень признателен: -)

1 Ответ

0 голосов
/ 18 декабря 2013

Когда или как называется ваш плагин? Вы зарегистрировали прослушиватель ресурсов или это разработчик проекта или что-то еще? Если он вызывается слушателем ресурса, возможно, ваш плагин читает «основную копию» вашего IType, которая еще не сохранена. Следовательно, ваши изменения все еще находятся в рабочей копии.

...