Предположим, мой очень простой процессор p0 поддерживает аннотацию @X. Предположим, что он вызывается в раунде 1 с помощью TypeElement, аннотированного @X. Предположим, что в результате он генерирует простой исходный файл Java, что приводит к предупреждению компилятора. Например:
Код: Выделить всё
package foo;
public class FooBecauseOfX {} // warning; implicit constructor
Я заметил, что (не считая виртуального нулевого раунда) существует три раунда обработки аннотаций. (Я наивно ожидал двух.)
Вот что происходит в раундах, и я пытаюсь понять это поведение во всей полноте:
(Первоначально: происходит «виртуальный» раунд 0, давая некоторые корневые элементы. Я это понимаю.)
Я понимаю раунд 1 из 3:
- набор аннотаций @X, как и ожидалось (находится в объекте, который он аннотирует)
Код: Выделить всё
@X - набор корневых элементов (начиная с раунда 0) является надмножеством набора элемента аннотированного типа, как и ожидалось (есть и другие элементы, которые компилируются)
- возвращает соответствующий TypeElement, как и ожидалось.
Код: Выделить всё
roundEnvironment.getElementsAnnotatedWith(x) - (p0 генерирует FooBecauseOfX.)
- набор аннотаций пуст
- набор корневых элементов равен FooBecauseOfX (только что написанный файл; обратите внимание, что он полностью не аннотирован)
- очевидно, что теперь roundEnvironment.getElementsAnnotatedWith(x) возвращает пустой набор
- набор аннотаций пуст, как и ожидалось
- набор корневых элементов пуст, как и ожидалось
- возвращает true, как и ожидалось.
Код: Выделить всё
roundEnvironment.processingOver()
Мои вопросы:
- Почему p0 запрашивается на обработку во втором раунде? Сгенерированный файл вообще не имеет аннотаций, а также аннотаций, поддерживаемых p0. Я понимаю, что процессоры должны быть устойчивыми при наличии пустых наборов аннотаций; Я просто не понимаю, зачем вообще здесь задействован p0. Это потому, что если «процессору было предложено выполнить обработку в данном раунде, ему будет предложено выполнить обработку в последующих раундах, включая последний раунд, даже если для обработки нет аннотаций»?
- (В основном просто раздражает.) Есть ли какой-нибудь способ избежать того, чтобы компилятор выплеснул предупреждение три раза? Я удивлен, что предупреждение появляется три раза, учитывая, что файл создается в первом раунде.
Подробнее здесь: https://stackoverflow.com/questions/799 ... -generated
Мобильная версия