2017-01-18 14 views
0

У меня есть следующая рекурсивная реализация посетителя AST.Извлечение объявлений функций из файла заголовка C/C++ с использованием clang

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 печатает функции, объявленные во входном файле, а также выгружает все объявления функций из включенных заголовочных файлов. Как я могу изменить этот код для печати только функций, объявленных в данном входном файле?

ответ

2

Попробуйте использовать 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; 
}}; 

я случайно узнал, что есть АСТ Сличитель называется isExpansionInMainFile. Я получил код выше от источника для этого матчи в cfe-3.9.0.src/include/clang/ASTMatchers/ASTMatchers.h строки 209-14.