使用ASTMatcher

时间:2017-02-16 15:42:26

标签: c++ clang abstract-syntax-tree clang-query

当类中有两个或更多类似的访问说明符时,我需要在C ++代码中捕获案例。 假设有两个类

class A{
public:
    int b;
public:
    int a;
}

class B{
public:
    int a;
}

如何匹配A级(因为它有两个'公共)但不是B级与ASTMatcher?

1 个答案:

答案 0 :(得分:0)

这位匹配者抓住了“公开”声明:

accessSpecDecl(
  isPublic(),
  hasAncestor(cxxRecordDecl().bind("crd"))).bind("asd")

在回调类中,您可以跟踪匹配器为给定结构声明获取的匹配数,例如使用std::map<string,int>

struct report_public : public MatchCallback{
  using map_t = std::map<string,int>;
  using map_it = map_t::iterator;

  map_t count;

  void run(MatchResult const & result){
    AccessSpecDecl const * asd = result.Nodes.getNodeAs<AccessSpecDecl>("asd");
    CXXRecordDecl const * crd = result.Nodes.getNodeAs<CXXRecordDecl>("crd");
    if(asd && crd){
      string const struct_name = crd->getNameAsString();
      map_it it = count.find(struct_name);
      if(it != count.end()) count[struct_name]++;
      else count[struct_name] = 1;
    }
    else { /* error handling */}
    return;
  } // run
}; // report_public