2013-08-28 26 views
2

我正在编写一个铿锵声工具,并试图弄清楚如何评估一个字符串字符串赋予对程序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); 

,但我不知道如何初始化resultinfo参数。

任何线索?

回答

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(); 
2

访问我意识到THI s是一个老问题,但是当我不能使用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")) 
     ) 
    ) 
)