JEP 217: Annotations Pipeline 2.0
Конвейер обработки аннотаций 2.0
| Ответственный | Joel Borggrén-Franck |
| Тип | Feature |
| Область | Implementation |
| Статус | Closed / Delivered |
| Выпуск | 9 |
| Компонент | tools / javac |
| Обсуждение | compiler dash dev at openjdk dot java dot net |
| Трудоёмкость | L |
| Длительность | L |
| Связан с | JEP 215: Tiered Attribution for javac |
| Рецензенты | Alex Buckley, Jonathan Gibbons, Maurizio Cimadamore |
| Одобрен | Brian Goetz |
| Создан | 2014/06/23 21:29 |
| Обновлён | 2016/07/12 21:03 |
| Задача | 8047926 |
Аннотация
Перепроектировать конвейер обработки аннотаций javac, чтобы он лучше отвечал требованиям аннотаций и инструментов, которые обрабатывают аннотации.
Цели
-
Компилятор должен корректно работать с аннотациями и аннотациями типов: в создаваемых class-файлах должны быть правильно сформированные атрибуты для всех видов аннотаций.
-
Рефлексия во время компиляции (
javax.lang.modelиjavax.annotation.processing) должна правильно обрабатывать все аннотации в позициях, видимых в сигнатурах. -
Рефлексия во время выполнения (Core Reflection) должна правильно работать с аннотациями в class-файлах.
-
Checkers Framework должен продолжать работать.
-
Java Compiler API должен и дальше работать так, как задумано.
Что не является целью
Новые возможности языка и новые API добавляться не будут. Обновление поддержки аннотаций в связанных инструментах, таких как javadoc и javap, не является целью.
Мотивация
В Java SE 8 появились две новые возможности, связанные с аннотациями: Repeating Annotations (JEP 120) и Annotations on Java Types (JSR 308 / JEP 104). Кроме того, Lambda Expressions (JSR 335 / JEP 126) добавили новую синтаксическую позицию для аннотаций. Ни одной из этих возможностей не существовало, когда конвейер обработки аннотаций javac был изначально задуман. Их можно сочетать друг с другом, что приводит к таким конструкциям:
Function<String, String> fss = (@Anno @Anno String s) -> s;
Существующий конвейер обработки аннотаций не мог обрабатывать такие случаи без доработки. Поэтому исходную архитектуру пришлось растягивать, чтобы вместить новые сценарии использования, и в результате реализация стала хрупкой и трудной в сопровождении. Цель этой работы — заменить устаревшую архитектуру новой, которая поддерживает новые сценарии более простым способом, благодаря чему код станет более корректным и удобным в сопровождении.
Описание
Провести рефакторинг конвейера обработки аннотаций javac. Внешне это не должно быть заметно, за исключением тех мест, где мы исправляем ошибки и повышаем корректность. Первый шаг — расширить тестовое покрытие, чтобы мы могли измерять и оценивать критерии завершения. После этого последует серия постепенных рефакторингов. Эта работа будет выполняться в рамках проекта OpenJDK Annotations Pipeline 2.0 Project.
У инструмента javadoc есть связанные проблемы с аннотациями типов. Однако javadoc сейчас существенно перерабатывается в рамках проекта Javadoc.Next Project. Часть этой работы — перевод javadoc на API javax.lang.model вместо более старого API com.sun.javadoc. Поэтому работа над javadoc, которая обеспечила бы правильное отображение аннотаций, в том числе аннотаций типов, не является целью этого проекта. Ожидается, что в рамках проекта JavaDoc.Next инструмент javadoc будет доработан так, чтобы использовать изменения API javax.lang.model, которые являются одной из целей этого проекта.
Тестирование
Уже есть хорошее покрытие значительного набора сквозных сценариев использования аннотаций. Сюда входят JCK и регрессионные тесты langtools. Большая часть этой работы — разработка дополнительных тестов, которые позволят измерять критерии успеха.
Мы создадим тесты, которые проверяют сочетание новых возможностей Java SE 8, упомянутых выше.