我正在编写一个Clang工具,我正在试图弄清楚如何评估一个字符串文字给定访问程序的AST。鉴于以下计划:
class DHolder {
public:
DHolder(std::string s) {}
};
DHolder x("foo");
我在Clang工具中有以下代码:
const CXXConstructExpr *ctor = ... // constructs `x` above
const Expr *expr = ctor->getArg(0); // the "foo" expression
???
如何从代表Expr
字符串文字的"foo"
到我工具中的实际C ++字符串?我试过做类似的事情:
// From ExprConstant.cpp
Evaluate(result, info, expr);
但我不知道如何初始化result
和info
参数。
任何线索?
答案 0 :(得分:3)
我意识到这是一个老问题,但是当我无法使用stringLiteral()
绑定到任何参数(代码不是C ++ 11)时,我遇到了这个问题。例如,我有CXXMMemberCallExpr
:
addProperty(object, char*, char*, ...); // has 7 arguments, N=[0,6]
AST转储显示StringLiteral
之前是CXXBindTemporaryExpr
。因此,为了使我的memberCallExpr查询使用hasArgument(N,expr())
进行绑定,我将查询包装为bindTemporaryExpr()
(为了便于阅读,此处显示在单独的行中):
memberCallExpr(
hasArgument(6, bindTemporaryExpr(
hasDescendant(stringLiteral().bind("argument"))
)
)
)
答案 1 :(得分:1)
执行此操作的正确方法是使用AST匹配器匹配字符串文字并将名称绑定到它,以便稍后可以引用它,如下所示:
StatementMatcher m =
constructExpr(hasArgument(0, stringLiteral().bind("myLiteral"))).bind("myCtor");
然后在匹配回调中执行此操作:
const CXXConstructExpr *ctor =
result.Nodes.getNodeAs<CXXConstructExpr("optionMatcher");
const StringLiteral *optNameLiteral =
result.Nodes.getNodeAs<StringLiteral>("optName");
然后可以通过
访问文字optNameLiteral->getString().str();