Как добавить фрагмент кода в тело метода с помощью JDT/AST

Я пытаюсь создать исходный код Java с помощью JDT/AST. Теперь у меня MethodDeclaration и хочу добавить фрагмент кода (из другого источника) в тело метода. Фрагмент кода может содержать любой код Java, даже синтаксически недействительный код. Я просто не могу найти способ сделать это.

С помощью JCodeModel вы должны использовать метод JBlock # directStatement (String s).

Есть ли способ сделать это с помощью JDT/AST?

Ответы

Ответ 1

Поскольку у вас есть хорошо сформированное дерево для остальной части приложения, и вы хотите вставить не-правильно сформированный текст в определенном месте, вы в значительной степени не можете сделать это с помощью стандартной вставки дерева node механизмы.

Важно то, что вы создаете текст для действительного текста программы с вставленным фрагментом в нужном месте. Где-то там должна быть часть логики, которая печатает AST как текст. Что вам нужно сделать, так это попросить, чтобы AST был напечатан в виде текста, и уловил его в середине этого процесса в нужном месте, чтобы вставить произвольный текст.

В нашем инструменте DMS Software Reengineering Toolkit есть входные/выходные файлы print- node в его симпатичном принтере, чтобы это происходило.

Если такие вещи не существуют в JDT/AST, вы можете попытаться изменить свой симпатичный принтер, чтобы дать вам этот крючок. Кроме того, вы можете рассмотреть возможность изменения JDT/AST путем добавления другого дерева node типа, который не является частью стандартного набора, который просто содержит произвольный текст, но действует как метод node. Предположительно каждый node управляет тем, что напечатано; то вы можете определить красивую печать для этого дерева node, чтобы заставить его выводить текст.

Окончательное действительно взломанное решение: вставьте абсолютно действующий АСТ, куда будет отправлен произвольный текст, содержащий где-то фиктивный идентификатор с уникальным именем, например ZZZ. Затем напечатайте AST до строки и выполните последующую обработку строки, чтобы заменить фиктивные деревья, содержащие уникальное имя, фактическим пользовательским текстом.

Ответ 2

Сначала вам нужно разобрать фрагмент кода в AST. Вы можете использовать ASTParser API для этой цели.

Можно получить проблемы компиляции единицы компиляции (см. CompilationUnit.getProblems()).

Существует несколько способов: изменить код Java с помощью JDT. Я предлагаю вам рассмотреть API ASTRewrite для модификации тела метода.