Как получить доступ к комментариям из дерева компилятора Java, сгенерированного API?
Я использовал API дерева компилятора Java для генерации ast для исходных файлов Java. Однако я не могу получить доступ к комментариям в исходных файлах.
До сих пор я не смог найти способ извлечь комментарии из исходного файла... Есть ли способ, используя компилятор API или какой-либо другой инструмент?
5 ответов
Удалось решить проблему с помощью getsourceposition() и некоторых манипуляций со строками (регулярное выражение не требовалось)
Наш внешний интерфейс SD Java - это синтаксический анализатор Java, который создает AST (и необязательно таблицы символов). Он фиксирует комментарии непосредственно на узлах дерева.
Внешний интерфейс Java является членом семейства внешних языков компилятора (C, C++, C#, COBOL, JavaScript, ...), все из которых поддерживаются DMS Software Reengineering Toolkit. DMS предназначена для обработки языков в целях преобразования и, таким образом, может захватывать комментарии, макет и форматы, чтобы обеспечить возможность регенерации кода с максимальным сохранением исходного макета.
РЕДАКТИРОВАТЬ 29.03.2012: (в отличие от ответа, опубликованного для выполнения этого с ANTLR)
Чтобы получить комментарий об узле AST в DMS, нужно вызвать функцию DMS (lisp-like)
(AST:GetComments <node>)
которые предоставляют доступ к массиву комментариев, связанных с узлом AST. Можно узнать о длине этого массива (может быть нулевым) или для каждого элемента массива запросить любое из этих свойств: (AST:Get... FileIndex, Line, Column, EndLine, EndColumn, String (точный комментарий Unicode) содержание).
Комментарии, полученные через getCommentList
Метод CompilationUnit не будет иметь тела комментария. Также комментарии не будут посещаться, во время и AST Visit. Для того, чтобы посетить комментарии у нас есть звонок accept
метод для каждого комментария в списке комментариев.
for (Comment comment : (List<Comment>) compilationUnit.getCommentList()) {
comment.accept(new CommentVisitor(compilationUnit, classSource.split("\n")));
}
Тело комментариев можно получить, используя простую логику. В приведенном ниже AST Visitor для комментариев нам необходимо указать модуль класса Complied и исходный код класса во время инициализации.
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.BlockComment;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.LineComment;
public class CommentVisitor extends ASTVisitor {
CompilationUnit compilationUnit;
private String[] source;
public CommentVisitor(CompilationUnit compilationUnit, String[] source) {
super();
this.compilationUnit = compilationUnit;
this.source = source;
}
public boolean visit(LineComment node) {
int startLineNumber = compilationUnit.getLineNumber(node.getStartPosition()) - 1;
String lineComment = source[startLineNumber].trim();
System.out.println(lineComment);
return true;
}
public boolean visit(BlockComment node) {
int startLineNumber = compilationUnit.getLineNumber(node.getStartPosition()) - 1;
int endLineNumber = compilationUnit.getLineNumber(node.getStartPosition() + node.getLength()) - 1;
StringBuffer blockComment = new StringBuffer();
for (int lineCount = startLineNumber ; lineCount<= endLineNumber; lineCount++) {
String blockCommentLine = source[lineCount].trim();
blockComment.append(blockCommentLine);
if (lineCount != endLineNumber) {
blockComment.append("\n");
}
}
System.out.println(blockComment.toString());
return true;
}
public void preVisit(ASTNode node) {
}
}
Редактировать: перемещено разделение источника вне посетителя.
Только для записи. Теперь с Java 8 у вас есть целый интерфейс, чтобы играть с комментариями и подробностями документации здесь.
Вы можете использовать другой инструмент, например, грамматику Java ANTLR. javac
бесполезен для комментариев и, скорее всего, полностью их отбросит. Синтаксические анализаторы, на которых построены такие инструменты, как IDE, с большей вероятностью сохранят комментарии в своем AST.