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
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.
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 *///! CommentFor 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.