Переопределение номера строки в сгенерированном исходном коде Java - PullRequest
14 голосов
/ 10 февраля 2009

Есть ли способ переопределить номера строк в Java (например, с помощью какой-либо директивы препроцессора)?

Я "компилирую" язык высокого уровня, вплоть до байт-кода Java, используя Janino. Мне нужны ошибки компилятора, чтобы сообщить строку из исходного файла, а не сгенерированный код Java.

C # имеет директиву #line, и я успешно использовал ее для сопоставления номеров строк из исходного файла скомпилированным результатом. Мне нужно то же самое для Java.

Спасибо!

Ответы [ 5 ]

9 голосов
/ 10 февраля 2009

Я никогда не видел, чтобы он использовался для других целей, кроме JSP, но JSR-45 был разработан для использования с этой целью для любого исходного языка. Процесс включает создание второго файла в специальном формате («SMAP»), который сопоставляет номера строк в исходном источнике с номерами строк в сгенерированном исходном коде Java.

4 голосов
/ 10 февраля 2009

К сожалению, нет, в Java нет эквивалентной директивы #line. Лучшее, что вы можете сделать, это изменить источник после его создания, удалив / вставив символы новой строки, чтобы они соответствовали реальному источнику (или изменили генератор кода). Или вы можете изменить номера строк, хранящиеся в двоичных файлах классов после их компиляции, но это, вероятно, будет еще более болезненным.

3 голосов
/ 15 марта 2009

Используя Janino, вы можете получить из Scanner и переопределить метод location(). Этот метод возвращает объект Location. Вы можете переопределить метод read() для поиска аннотаций, например, в комментариях (добавленных во время генерации кода), которые содержат информацию о номере строки.

Вы просто передаете свой сканер методу SimpleCompiler.cook() и можете контролировать, какие имя файла, строка и столбец будут сообщены при ошибке.

3 голосов
/ 10 февраля 2009

Вместо генерации Java-кода в качестве промежуточного языка, вы можете попробовать использовать ассемблер JVM. Jasmin имеет приятный синтаксис, и вы можете свободно вставлять директивы .line в соответствующие места вашего кода. Вы также можете указать исходный файл, используя директиву .source.

Конечно, путь ассемблера может доставить больше хлопот, чем стоит :)

1 голос
/ 10 февраля 2009

Простого решения не существует. Одним из обходных путей может быть создание карты номеров строк из [вашего языка] в Java при генерации кода. Вы можете передать вывод компилятора и использовать карту для замены номеров строк в Java номерами строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...