如何在Clang中打印IfStmt的条件语句?

时间:2015-08-11 01:53:33

标签: clang clang++ llvm-clang

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

if (a + b + c > 10)
    return;

以及对代表它的IfStmt节点的引用,我想获得字符串“a + b + c> 10”。

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

2 个答案:

答案 0 :(得分:1)

提取IfStmt的条件部分,获取其开始和结束位置,并使用它来查询词法分析器以获取基础源代码。

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;
  }
};

输入来源:

bool f(int a, int b, int c)
{
  if (a + b + c > 10)
    return true;
  return false;
}

输出:

Condition string: a + b + c > 10

答案 1 :(得分:0)

我相信您可能想尝试查看printPrettyStmt继承的IfStmt函数。这应该有希望让你接近你想要的。