Clang libtooling:确定宏扩展位置

时间:2015-09-20 19:38:28

标签: clang llvm libtooling

我有一个标题header.h,其宏定义扩展为类定义,源文件test.cpp包含header.h并使用此宏。然后我使用RecursiveASTVisitor访问所有CXXRecordDecl

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

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

提前致谢。

1 个答案:

答案 0 :(得分:2)

找到解决方案。

所需方法是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
}