Создание java-кода разбора деревьев и оценка его для тестирования

Нам нужно генерировать исходный код Java. Мы делаем это, моделируя абстрактное синтаксическое дерево и используем дерево, которое генерирует текст исходного кода. Это все хорошо.

Поскольку мой код AST немного стар, он не поддерживает аннотации и дженерики. Поэтому я просматриваю открытые проекты, которые нужно использовать для будущих проектов с потребностями генерации кода. И здесь возникает реальная проблема. Мы хотим проверить, что генерируемый код имеет правильное поведение.

Вот где я получил идею фактически оценить AST вместо генерации исходного кода java, скомпилировать его и запустить тесты против этого кода. Оценщик ускорил бы единичные тесты, и можно было бы оценивать меньшие фрагменты сгенерированного кода, например, только метод, делающий "единицы" более разумными.

До сих пор я нашел проект com.sun.codemodel, который кажется довольно приятным, поскольку он является современным (поддержка функций java5 и 6). Основанное на АСТ решение для создания кода.

Кто-нибудь знает, есть ли другой проект, который позволил бы мне непосредственно оценить части АСТ (например, один сгенерированный метод)?

Ответ 1

Чтобы оценить Java, вам нужен весь семантический анализ, который вместе с ним ( "какова область действия этого идентификатора? Какой тип у него есть?" ), а также интерпретатор.

Чтобы получить этот семантический анализ, вам нужно больше, чем просто AST: вам нужно полное разрешение имен (построение таблицы символов) и разрешение по типу (определение типов выражений и проверка того, что выражения действительны в том контексте, в котором они найдены), а также поиск в классе (к которому относится фактический метод foo)?

С этим вы можете построить построение интерпретатора путем сканирования по деревьям в порядке выполнения. Вам также потребуется создать диспетчер хранилища; вам может не понадобиться полный сборщик мусора, но вам что-то понадобится. Вам также понадобится переводчик для .class файлов, если вы действительно хотите что-то запустить, а это значит, что вам нужен синтаксический анализатор (и имя/тип разрешения для файлов классов тоже).

Я не знаю, имеет ли Eclipse все это (по крайней мере, часть менеджера хранилища, которую вы можете получить бесплатно:). Я бы отчасти ожидал этого, учитывая, что его оригинальный дизайн был для поддержки разработки Java, но я был очень разочарован множеством инструментов на протяжении многих лет.

DMS Software Reengineering Toolkit - это программный анализ/трансформация, которая обрабатывает многие языки. Он имеет полный Java front end, включая парсинг, построение АСТ, построение таблицы символов и разрешение имен, разрешение по типу, построение графиков вызовов (необходимо решить вызовы виртуальных функций), и для чтения с разрешением имени используется программа чтения .class. Таким образом, это будет хорошей основой для создания переводчика.

DMS может также создавать произвольные АСТ, а затем генерировать исходный код из них, поэтому он также будет обрабатывать конец генерации кода.

[Причина, по которой DMS существует, - это "сильно разочарованная" часть].

Ответ 2

Я не уверен, что это то, что вы ищете, но проект Eclipse JDT обеспечивает очень хороший обзор Java AST (включая функции Java 5 и 6). Он имеет ряд утилит и инструментов для просмотра/перезаписи кода (не обязательно генерации). Все они лицензированы в рамках публичной лицензии Eclipse.

Вы можете получить дополнительную информацию по адресу http://eclipse.org/jdt/