Clang libtooling: определить расположение макроса

У меня есть заголовок header.h с макроопределением, которое расширяется до определения класса и исходного файла test.cpp который включает в себя header.h и использует этот макрос. Тогда я использую RecursiveASTVisitor посетить всех CXXRecordDecl"S.

Когда я посещаю CXXRecordDecl, который является расширением макроса (в test.cpp) и запрашиваю его SourceLocation а также dump() это, местоположение указывает на header.h - расположение макроопределения.

Что мне нужно получить для этого CXXRecordDecl является SourceLocation расширения макроса - в моем случае это должно быть test.cpp,

Заранее спасибо.

1 ответ

Решение

Нашел решение.

Обязательным методом является метод getFileLoc(SourceLocation loc) SourceManager, который "возвращает местоположение расширения", если loc msgstr "это макро расположение".

Мой код, чтобы получить исходное местоположение для нормальных определений классов и определений в виде расширений макросов:

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
}
Другие вопросы по тегам