Clang libtooling:确定宏扩展位置
Clang libtooling: determine macro expansion location
我有一个 header header.h
,它有一个扩展为 class 定义的宏定义和一个包含 header.h
并使用的源文件 test.cpp
这个宏。然后我使用 RecursiveASTVisitor
访问所有 CXXRecordDecl
的。
当我访问作为宏扩展的 CXXRecordDecl(在 test.cpp 中)并查询其 SourceLocation
和 dump()
时,该位置指向 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
}
我有一个 header header.h
,它有一个扩展为 class 定义的宏定义和一个包含 header.h
并使用的源文件 test.cpp
这个宏。然后我使用 RecursiveASTVisitor
访问所有 CXXRecordDecl
的。
当我访问作为宏扩展的 CXXRecordDecl(在 test.cpp 中)并查询其 SourceLocation
和 dump()
时,该位置指向 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
}