Извлечение объявлений функций из заголовочного файла 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.

Другие вопросы по тегам