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