如何以Clang格式打印IfStmt的条件语句?
我正在为clang编译器开发一个插件,并希望使用字符串形式的if语句的条件表达式。也就是说,考虑到:如何以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
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