Я использую последние версии eclipse, java и https://marketplace.eclipse.org/content/m2e-apt для обработки аннотаций. У меня есть процессор, который обрабатывает одну аннотацию и просматривает методы в аннотированном классе, берет все неприватные методы и создает интерфейс, содержащий их (который будет реализовывать аннотированный класс). Таким образом, в основном этот класс реализует интерфейс, который будет сгенерирован. Допустим, у нас есть классы A и B, которые, аннотированные, будут генерировать интерфейсы IntA и IntB в том же пакете, что и соответствующие методы. Допустим, у меня есть метод в классе A с типом возвращаемого значения IntB.
В своих процессорах аннотаций я расширяю AbstractProcessor и использую такие вещи, как TypeElement и TypeMirror ( ((ExecutableElement)element).getReturnType(), чтобы получить TypeMirror возвращаемого значения ExecutableElement, соответствующего методу из аннотированного класса). Затем я использую toString() для этого TypeMirror, чтобы записать возвращаемое значение метода в сгенерированный интерфейс.
Проблема в том, что если IntA сгенерирован до IntB, этот метод, написанный на IntA, будет иметь метод, возвращающий IntB без его полного имени (поскольку процессор ничего не знает о IntB, поскольку он еще не был сгенерирован), поэтому генерируется ошибка в Инта. Если я что-то изменю в классе A (затем сохраню, что заставит Eclipse постепенно генерировать файлы, что повлияет только на файлы, сгенерированные аннотацией в классе A), эта ошибка решается, так как IntB уже сгенерирован и может напишите полное имя в качестве возвращаемого значения этого метода.
Я обнаружил, что, написав полное имя для возвращаемого значения метода, возвращающего IntB в классе A, я могу избежать этой проблемы. Однако я хотел бы, если это так, чтобы процессор обрабатывал этот класс позже, когда IntB уже сгенерирован.
Как я могу задержать процесс аннотации для класса А?
PS: до сих пор я создал механизм, в котором он проверяет возвращаемое значение каждого метода для следующего оператора (element.getReturnType().getKind() == TypeKind.ERROR), и в этом случае я выбрасываю исключение и добавляю это элемент в списке, который будет обработан в другом раунде. Не сработало, так как еще несколько раз обрабатывал элемент с теми же проблемами. Также я попытался вернуть false методу process(), переопределенному из AbstractProcessor, и все равно не сработало.