如何以Clang格式打印IfStmt的条件语句?

如何以Clang格式打印IfStmt的条件语句?,clang,clang++,llvm-clang,Clang,Clang++,Llvm Clang,我正在为clang编译器开发一个插件,并希望使用字符串形式的if语句的条件表达式。也就是说,考虑到: if (a + b + c > 10) return; 以及对表示它的IfStmt节点的引用,我希望获得字符串“a+b+c>10” 我怀疑这是不可能的,但如果有人有任何见解,我们将不胜感激。我相信您可能希望尝试查看printpery中定义的Stmt函数,该函数继承自IfStmt。这将有望使您接近您想要的内容。提取IfStmt的条件部分,获取其开始和结束位置,并使用它查询lexer

我正在为clang编译器开发一个插件,并希望使用字符串形式的if语句的条件表达式。也就是说,考虑到:

if (a + b + c > 10)
    return;
以及对表示它的IfStmt节点的引用,我希望获得字符串“a+b+c>10”


我怀疑这是不可能的,但如果有人有任何见解,我们将不胜感激。

我相信您可能希望尝试查看
printpery
中定义的
Stmt
函数,该函数继承自
IfStmt
。这将有望使您接近您想要的内容。

提取IfStmt的条件部分,获取其开始和结束位置,并使用它查询lexer以获取底层源代码

using namespace clang;

class IfStmtVisitor
  : public RecursiveASTVisitor<IfStmtVisitor> {
  SourceManager &sm; // Initialize me!
  CompilerInstance &ci;  // Initialize me!

  bool VisitIfStmt(IfStmt *stmt) {
    Expr *expr = stmt->getCond();
    bool invalid;

    CharSourceRange conditionRange =
        CharSourceRange::getTokenRange(expr->getLocStart(), expr->getLocEnd());
    StringRef str =
        Lexer::getSourceText(conditionRange, sm, ci.getLangOpts(), &invalid);
    if (invalid) {
      return false;
    }
    llvm::outs() << "Condition: " << str << "\n";
    return true;
  }
};
输出:

Condition string: a + b + c > 10
Condition string: a + b + c > 10