Clang libtooling:确定宏扩展位置

Clang libtooling: determine macro expansion location

我有一个 header header.h,它有一个扩展为 class 定义的宏定义和一个包含 header.h 并使用的源文件 test.cpp这个宏。然后我使用 RecursiveASTVisitor 访问所有 CXXRecordDecl 的。

当我访问作为宏扩展的 CXXRecordDecl(在 test.cpp 中)并查询其 SourceLocationdump() 时,该位置指向 header.h - 宏定义的位置。

我需要为这个 CXXRecordDecl 获取的是宏扩展的 SourceLocation - 在我的例子中它应该是 test.cpp.

提前致谢。

找到解决方案。

所需方法是 SourceManager 的 getFileLoc(SourceLocation loc),其中 "returns the expansion location" if loc "is a macro location"。

我的代码获取正常 class 定义和宏扩展定义的源位置:

bool VisitCXXRecordDecl(CXXRecordDecl* record)
{
    SourceLocation loc = record->getLocStart();
    SourceLocation locExp = m_sourceManager.getFileLoc(loc);
    // if record is a macro expansion in test.cpp, locExp points to test.cpp
    // if record is not a macro expansion, locExp correctly points to matching source file
}