c++ - 如何在 libclang c++ 中使用 RecursiveASTVisitor 提取注释并匹配声明?

标签 c++ comments libclang

我正在编写一个实用程序,它应该解析 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/

相关文章:

compiler-construction - 如何在 libclang 中刷新 AST

keyboard-shortcuts - 在 Mathematica 7 中取消/注释代码的键盘快捷键?

c++ - 一个程序如何与另一个程序交互?

c++ - C++ 的自定义运行时类型系统/库

c++ - 将数组中的某些整数相加

python - 在多行语句之间添加注释(带续行)

perl - Perl中多行注释的常见解决方法是什么?

libclang - 从 libclang 的 CXType 中删除 CV 类型限定符

c++ - libclang 获取成员声明

c++ - 如何在 Linux 上用 C++ 确定键盘按键被按下