我正在编写一个实用程序,它应该解析 C++(和 C)头文件,提取结构、枚举、字段等,并根据提取的信息生成其他语言的代码。为此,我决定使用 libclang。
我正在使用 RecursiveASTVisitor
,似乎我能够提取我需要的所有信息,除了注释。
我希望在读取每个声明(字段、结构、类、枚举)正上方的注释,并在我生成其他语言的代码时添加其文本。
问题是我看到的所有使用注释的示例都使用 CxCursor
和 clang 的 C 接口(interface),我不知道如何在我的代码中获取 CxCursor
上下文。
那么 - 如何在仍然使用 RecursiveASTVisitor
的同时提取评论?
最佳答案
经过进一步挖掘,我发现了这个:
对于任何相关的已访问声明(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
}
// ...
}
请注意,这标识(据我所知...)代码中当前声明的上方(和相邻!)行中的注释,并且采用以下格式之一:
///评论
/** 注释*/
//!评论
例如,在下面的情况下:
/// A field with a long long comment
/// A two-liner
long long LongLongData;
原始
将是:
/// A field with a long long comment
/// A two-liner
brief
将是:
A field with a long long comment A two-liner
无论哪种方式,它都足以满足我的需求。
关于c++ - 如何在 libclang c++ 中使用 RecursiveASTVisitor 提取注释并匹配声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25275212/