How to extract comments and match to declaration with RecursiveASTVisitor in libclang c++?

前端 未结 2 1425
渐次进展
渐次进展 2020-12-30 06:35

I am writing a utility which is supposed to parse C++ (and C) header files, extract the structs, enums, fields etc. and generate code in other languages based on the extract

相关标签:
2条回答
  • 2020-12-30 07:13

    The above answer is perfect. But to make the API getRawCommentForDeclNoCache return normal comments like // or /* you need to provide option "-fparse-all-comments" while invoking clang. Because by default clang parses only Doxygen style comments.

    0 讨论(0)
  • 2020-12-30 07:15

    With some more digging up, I found this:

    For any relevant visited Decl (VisitXXXDecl), I can do this:

    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
        }
    
        // ...
    }
    

    Note that this identifies (as far as I could see...) comments which are in the line(s) above (and adjacent!) to the current declaration in the code, and which are in one of the following formats:

    • /// Comment
    • /** Comment */
    • //! Comment

    For example, in the following case:

    /// A field with a long long comment
    /// A two-liner
    long long LongLongData;
    

    raw will be:

    /// A field with a long long comment
        /// A two-liner
    

    And brief will be:

    A field with a long long comment A two-liner
    

    Either way, it's good enough for my needs.

    0 讨论(0)
提交回复
热议问题