当前位置: 代码迷 >> java >> 如何将IASTComment链接到CDT ASTParser中的IASTDeclaration
  详细解决方案

如何将IASTComment链接到CDT ASTParser中的IASTDeclaration

热度:42   发布时间:2023-08-02 10:42:52.0

我正在使用CDT ASTParser来解析C / C ++源文件的一些内容。 例:

//Docs for function min
int min(int a[], int n) {
    //Comment here
}

int min1(){}

/*
Docs for function min2
*/
int min2(){}

通过使用ASTVisitor,我可以解析代码中的函数定义列表,但我不知道如何在定义代码之上“链接”IASTComment:

void handle(IASTTranslationUnit unit){
        unit.accept(new ASTVisitor() {
            { shouldVisitDeclarations = true; }

            @Override
            public int visit(IASTDeclaration declaration) {

                if (declaration instanceof IASTFunctionDefinition) {
                    IASTFunctionDefinition fnDefine = 
                            (IASTFunctionDefinition) declaration;
                    IASTFunctionDeclarator fnDeclare = fnDefine.getDeclarator();

                    System.out.printf("Function: %s, type: %s, comment: %s\n",
                            fnDeclare.getName().getRawSignature(),
                            fnDefine.getDeclSpecifier().getRawSignature(),
                            "Somehow get the comment above function define???"
                            );
                }
                return PROCESS_SKIP;
            }

            @Override
            public int visit(IASTComment comment) {
                System.out.println("Comment: " + comment.getRawSignature());
                return PROCESS_CONTINUE;
            }

        });

        for (IASTComment cmt: unit.getComments())
            System.out.println("Comment: " + cmt.getRawSignature());
    }

不推荐使用ASTVisitor类中的visit(IASTComment comment)IASTTranslationUnit.getComments()方法只返回整个源文件中的注释列表,此处没有结构。
那么,如何获取链接到函数定义的IASTComment对象(如果有)?

您可以在包org.eclipse.cdt.internal.core.dom.rewrite.commenthandler使用ASTCommenter.getCommentedNodeMap(IASTTranslationUnit) 该方法返回一个NodeCommentMap ,它将注释映射到AST中的节点。 可以为节点分配三种类型的注释。 在下面的示例中,方法声明是节点:

//this is a leading comment
void method() //this is a trailing comment
//this is a freestanding comment
{
...

NodeCommentMap.getOffsetIncludingComments(IASTNode)返回节点的偏移量,包括其指定的前导注释。 NodeCommentMap.getEndOffsetIncludingComments(IASTNode)返回节点的结束偏移量,包括其指定的尾随注释。 分配的独立评论必须由您自己处理。 您可以使用NodeCommentMap.getFreestandingCommentsForNode(IASTNode)获得独立评论。 至少我在cdt包中找不到任何默认方法。

如果您想了解更多信息,建议您阅读以下课程中的文档:

  • org.eclipse.cdt.internal.core.dom.rewrite.commenthandler.ASTCommenter
  • org.eclipse.cdt.core.parser.tests.rewrite.comenthandler.CommentHandlingTest
  • org.eclipse.cdt.internal.core.dom.rewrite.commenthandler.NodeCommenter

注意:大多数这些包/类都是内部的。

  相关解决方案