问题描述
我正在使用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对象(如果有)?
1楼
您可以在包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
注意:大多数这些包/类都是内部的。