TL;DR:在基于给定类型创建新的java类型时,如何保留Javadoc、行和块注释?
长:
通过使用JDT的无头eclipse应用程序,我正在批处理将大量类型(Java类)基于不想要的基类转换为Java枚举类型。我的方法是根据类型信息创建一个新的EnumDeclaration,并根据初始类类型的FieldDeclarations (导出serialVersionUID)添加EnumConstantDeclarations。在此之后,我简单地将原始MethodDeclaration的克隆添加到新创建的EnumDeclaration的BodyDelcaration中,从而添加EnumDeclarations(不包括构造函数)。一旦我这样做了,这是非常直截了当的感谢伟大的API,我做以下.
// create the EnumDeclaration from the given UnwantedClass CompilationUnit
final EnumDeclaration enumTypeDeclaration = createEnumDeclaration(cu, astRoot, methodDeclarations, ast);
// Find the original UnwantedClass TypeDeclaration and replace it with the new EnumDeclaration
astRoot.accept(new ASTVisitor() {
@Override
public boolean visit(final TypeDeclaration node) {
rewriter.replace(node, enumTypeDeclaration, null);
return false;
}
});...to将原来的Type类替换为新的EnumDeclaration。这几乎是完美的。唯一缺少的是原始Line类型的-、Block和JavadocComment元素。我发现您至少可以通过以下方法检索所有Comment实例:
List<Comment> comments = cu.getCommentList();
if (comments != null) {
for (Comment comment : comments) {
comment.accept(visitor);
}
}这给了我所有的注释,但我还没有弄清楚如何将Comment实例映射到BodyDeclaration,因为这些Comment实例基本上是在Source文件中自由浮动的,并且仅由它们的startPosition在Source文件中链接。
有getAlternateRoot方法,但我也没有成功地利用这个方法。
问题是:如何从原始类型中保存Comment实例,并将它们放在新类型中的正确位置?
发布于 2020-11-09 10:38:14
似乎没有直接的方法来解决这个问题,因为java文件中的javadoc (或一般的注释)与它们要注释的实际代码没有直接关系。开发人员的常识是,我们通常将注释放在注释的代码之上。因此,我采取了以下方法来解决这个问题:
中。
注释的添加并不像我想象的那么直接,因为在新的JSL中,您不能简单地在javadoc中设置注释字符串(仅在JSL2中支持,但在这个版本中我们没有枚举)。因此,我使用了以下代码:
private void setJavadoc(final BodyDeclaration bodyDeclaration, final CommentEntry commentEntry) {
final Javadoc javadoc = (Javadoc) ASTNode.copySubtree(ast, commentEntry.getComment());
final TagElement tagElement = ast.newTagElement();
final TextElement textElement = ast.newTextElement();
textElement.setText(commentEntry.getText());
tagElement.fragments().add(textElement);
javadoc.tags().add(tagElement);
bodyDeclaration.setJavadoc(javadoc);
}如您所见,即使包含标记,实际的注释文本也可以通过使用TextElement简单地添加。为了使它更完美,您可能需要对先前从源文件中提取的注释文本进行子字符串,因为它将包含/**和*/。
https://stackoverflow.com/questions/64692774
复制相似问题