Clang 重写:定位调用表达式的顶部

Clang Rewrite: Locate top of a call expression

我正在对源代码进行一些 clang 重写。我想在语句前插入一行。就像如果我从 if 语句内部调用,如下所示:

if (cmp(a,b) > 0 && cmp(c,d) < 0){
//do something
}

我想重写 if 语句之前的注释,如下所示:

//there are call inside
if (cmp(a,b) > 0 && cmp(c,d) < 0){
//do something
}

到目前为止我能做的是,我可以用 VisitCallExpr() 检测到调用。但是我怎么能找到那个if语句之前的位置来写评论呢。 N.B。这里的 if 语句也可以是 for,如下所示:

for (int a = 0; a < range(s); a++){
//do something
}

任何人都可以帮我找到一个方法来做到这一点。

我找到了一种方法来做到这一点,尽管这不是一种通用的方法。我已经就该问题提出了另一个问题。但是,如果我们在这里只考虑指定的情况,如下所示:

// add something here
if (cmp(a,b)){
//do something
}

我们可以用一个简单的 AST 匹配器来做:

Matcher.addMatcher(ifStmt(hasCondition(callExpr()))
                           .bind("call_from_if"),&handleIFCALL);

和处理程序定义应该是这样的:

class IFCALL : public MatchFinder::MatchCallback {
public:
  IFCALL(Rewriter &Rewrite) : Rewrite(Rewrite) {}

  virtual void run(const MatchFinder::MatchResult &Result) {
    const IfStmt *statement =
        Result.Nodes.getNodeAs<clang::IfStmt>("call_from_if");

      SourceLocation ST = statement->getLocStart();
      std::stringstream SSBefore;
      SSBefore << "\n \\ if statement have call inside \n";
      Rewrite.InsertText(ST, SSBefore.str(), true, true);
    }
  }

private:
  Rewriter &Rewrite;
};

这个 link 帮助我找到这个解决方案: https://jonasdevlieghere.com/understanding-the-clang-ast/

新一期的link如下: