Извлечение объявлений функций из заголовочного файла C/C++ с использованием clang
У меня есть следующая рекурсивная реализация посетителя AST.
class ExampleVisitor : public clang::RecursiveASTVisitor<ExampleVisitor>{
private:
clang::ASTContext* ast_context_; // used for getting additional AST info
public:
explicit ExampleVisitor(clang::CompilerInstance* ci)
: ast_context_(&(ci->getASTContext())) // initialize private members
virtual bool VisitFunctionDecl(clang::FunctionDecl* func)
{
numFunctions++;
foo(func);
return true;
}};
Функция foo печатает имена объявленных функций для данного входного файла.
В этой реализации foo печатает функции, которые объявлены во входном файле, а также выводит все объявления функций из включенных заголовочных файлов. Как я могу изменить этот код для печати только функций, объявленных в данном входном файле?
1 ответ
Решение
Попробуйте использовать SourceManager, чтобы определить, находится ли FunctionDecl в главном файле модуля перевода:
virtual bool VisitFunctionDecl(clang::FunctionDecl* func)
{
clang::SourceManager &sm(ast_context_->getSourceManager());
bool const inMainFile(
sm.isInMainFile(sm.getExpansionLoc(func->getLocStart())));
if(inMainFile){
numFunctions++;
foo(func);
}
else{
std::cout << "Skipping '" << func->getNameAsString()
<< "' not in main file\n";
}
return true;
}};
Я случайно узнал, что есть AST Matcher, который называется isExpansionInMainFile
, Я получил приведенный выше код из источника для этого сопоставителя в cfe-3.9.0.src/include/clang/ASTMatchers/ASTMatchers.h, строки 209-14.