我有以下递归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打印输入文件中声明的函数,并从包含的头文件中转储所有函数声明。如何修改此代码以仅打印在给定输入文件中声明的函数?
答案 0 :(得分: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
的AST匹配器。我从cfe-3.9.0.src / include / clang / ASTMatchers / ASTMatchers.h第209-14行的matcher来源获得了上面的代码。