我正在编写一个实用程序,它应该解析C ++(和C)头文件,提取结构,枚举,字段等,并根据提取的信息生成其他语言的代码。我决定使用libclang。
我正在使用RecursiveASTVisitor
,似乎我能够提取我需要的所有信息,但评论除外。
我想在每个声明(字段,结构,类,枚举)的正上方读取注释,并在我用其他语言生成代码时添加其文本。
问题是我看到的所有使用评论的样本都使用CxCursor
而C语言接口是clang,我不知道如何在我的上下文中获取CxCursor
。
那么 - 如何在仍然使用RecursiveASTVisitor
时提取注释?
答案 0 :(得分:12)
随着更多的挖掘,我发现了这个:
对于任何相关的访问过的Decl(VisitXXXDecl
),我可以这样做:
virtual bool VisitDecl(Decl* d)
{
ASTContext& ctx = d->getASTContext();
SourceManager& sm = ctx.getSourceManager();
const RawComment* rc = d->getASTContext().getRawCommentForDeclNoCache(d);
if (rc)
{
//Found comment!
SourceRange range = rc->getSourceRange();
PresumedLoc startPos = sm.getPresumedLoc(range.getBegin());
PresumedLoc endPos = sm.getPresumedLoc(range.getEnd());
std::string raw = rc->getRawText(sm);
std::string brief = rc->getBriefText(ctx);
// ... Do something with positions or comments
}
// ...
}
请注意,这标识(据我所知......)注释,这些注释位于代码中当前声明的上方(和相邻!)行中,并且采用以下格式之一:
/// Comment
/** Comment */
//! Comment
例如,在以下情况中:
/// A field with a long long comment
/// A two-liner
long long LongLongData;
raw
将是:
/// A field with a long long comment
/// A two-liner
brief
将是:
A field with a long long comment A two-liner
无论哪种方式,它都足以满足我的需求。
答案 1 :(得分:6)
以上答案是完美的。但要使API getRawCommentForDeclNoCache
返回正常评论,例如// or /*
,您需要在调用clang时提供选项“ - fparse-all-comments”。因为默认情况下clang只解析Doxygen样式注释。