15

我正在编写一个实用程序,它应该解析 C++(和 C)头文件,提取结构、枚举、字段等,并根据提取的信息生成其他语言的代码。我决定为此使用 libclang。

我正在使用 a RecursiveASTVisitor,似乎我能够提取我需要的所有信息,除了评论。

我希望读取出现在每个声明(字段、结构、类、枚举)正上方的注释,并在我用其他语言生成代码时添加其文本。

问题是我看到的所有使用注释的示例都使用CxCursor了clang的C接口,我不知道如何CxCursor在我的上下文中获取。

那么-如何在仍在使用的同时提取评论RecursiveASTVisitor

4

2 回答 2

20

随着一些更多的挖掘,我发现了这个:

对于任何相关的已访问 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

无论哪种方式,它都足以满足我的需求。

于 2014-08-13T19:07:14.943 回答
15

上面的答案是完美的。但是要使 APIgetRawCommentForDeclNoCache返回正常的注释,就像// or /*您需要在调用 clang 时提供选项“-fparse-all-comments”一样。因为默认情况下,clang 只解析 Doxygen 样式的注释。

于 2017-01-19T07:52:18.313 回答