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如下:
我正在对源代码进行一些 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如下: