首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重写CompilationUnit时保留类型、字段和方法注释

重写CompilationUnit时保留类型、字段和方法注释
EN

Stack Overflow用户
提问于 2020-11-05 07:26:16
回答 1查看 108关注 0票数 1

TL;DR:在基于给定类型创建新的java类型时,如何保留Javadoc、行和块注释?

长:

通过使用JDT的无头eclipse应用程序,我正在批处理将大量类型(Java类)基于不想要的基类转换为Java枚举类型。我的方法是根据类型信息创建一个新的EnumDeclaration,并根据初始类类型的FieldDeclarations (导出serialVersionUID)添加EnumConstantDeclarations。在此之后,我简单地将原始MethodDeclaration的克隆添加到新创建的EnumDeclarationBodyDelcaration中,从而添加EnumDeclarations(不包括构造函数)。一旦我这样做了,这是非常直截了当的感谢伟大的API,我做以下.

代码语言:javascript
复制
// 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类型的-、BlockJavadocComment元素。我发现您至少可以通过以下方法检索所有Comment实例:

代码语言:javascript
复制
List<Comment> comments = cu.getCommentList();
if (comments != null) {
  for (Comment comment : comments) {
    comment.accept(visitor);
  }
}

这给了我所有的注释,但我还没有弄清楚如何将Comment实例映射到BodyDeclaration,因为这些Comment实例基本上是在Source文件中自由浮动的,并且仅由它们的startPosition在Source文件中链接。

getAlternateRoot方法,但我也没有成功地利用这个方法。

问题是:如何从原始类型中保存Comment实例,并将它们放在新类型中的正确位置?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-09 10:38:14

似乎没有直接的方法来解决这个问题,因为java文件中的javadoc (或一般的注释)与它们要注释的实际代码没有直接关系。开发人员的常识是,我们通常将注释放在注释的代码之上。因此,我采取了以下方法来解决这个问题:

  1. 创建了一个基于起始位置的索引,该索引将一个整数(起始位置)映射到所谓的CommentEntry实例,这基本上是一个由org.eclipse.jdt.core.dom.Comment和实际文本组成的元组,我只需对编译单元的源字符串进行子串就可以提取该索引。
  2. ,我访问原始CompilationUnit并检索所有相关的ASTNode,它们在我的情况下是Type、Field和MethodDeclaration实例,并映射到它们的起始位置。
  3. 现在迭代了从1.的所有映射的CommentEntry位置,并将它们与ASTNode实例关联,它被映射到相同的位置(从2.的映射)。结果是使用ASTNode -> ->构建新的EnumDeclaration来查询地图。3.使用实际的ASTNode类型(TypeDeclaration只存在一次)、ASTNode的实际实例(我使用原始FieldDeclarations的属性来创建EnumConstants),或者使用ASTMatcher来识别正确的MethodDeclaration,因为我必须克隆它们才能将它们“复制”到新的EnumDeclaration Body部分

中。

注释的添加并不像我想象的那么直接,因为在新的JSL中,您不能简单地在javadoc中设置注释字符串(仅在JSL2中支持,但在这个版本中我们没有枚举)。因此,我使用了以下代码:

代码语言:javascript
复制
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简单地添加。为了使它更完美,您可能需要对先前从源文件中提取的注释文本进行子字符串,因为它将包含/**和*/。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64692774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档