Clang libtooling:确定宏扩展位置

LVK*_*LVK 3 llvm clang libtooling

我有一个header.h带有宏定义的标头,该宏定义扩展为类定义和一个test.cpp包含header.h并使用该宏的源文件。然后我用来RecursiveASTVisitor访问所有CXXRecordDecl的。

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

我需要为这个 CXXRecordDecl 获取的是SourceLocation宏扩展 - 在我的情况下它应该是test.cpp

提前致谢。

LVK*_*LVK 5

找到解决方案。

所需的方法是 SourceManager 的getFileLoc(SourceLocation loc)loc ,如果“是宏位置”,则“返回扩展位置” 。

我的代码用于获取普通类定义和宏扩展定义的源位置:

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
}
Run Code Online (Sandbox Code Playgroud)