2016-06-02 4 views
1

私はASTの一部を次のように持っています。 enter image description hereClangのOpaqueValueExprの子を取得する方法AST

このBinaryOperatorのコードは次のとおりです。

self.contentMode = UIViewContentModeScaleAspectFit; 

それから私は、このコード行の情報を取得するためにASTVisitorを使用しています。

bool VisitBinaryOperator(BinaryOperator *node) { 

    ObjCPropertyRefExpr *lvalue = dyn_cast<ObjCPropertyRefExpr>(node->getLHS()); 

    if (lvalue && \ 
     lvalue->isMessagingSetter() && \ 
     lvalue->getSetterSelector().getAsString() == "setContentMode:") 
    { 
     OpaqueValueExpr *rvalue = dyn_cast<OpaqueValueExpr>(node->getRHS()); 

     // I want to get DeclRefExpr of UIViewContentModeScaleAspectFit here. 
    } 
    return true; 
} 

私はlvalue権利を得ることができますが、どのように私は、ASTの最後の行でDeclRefExprを得ることができます。

答えて

2

OpaqueValueExprが別の式を保持している場合は、getSourceExpr()というメソッドを使用してアクセスできます。

あなたのAST内で、ソース式は暗黙的なキャストになりますが、これは目標ではありません。この目的のために、ClangのExprクラスには、IgnoreImpCastsIgnoreParensのような '無視'方式のファミリがあります。これらのメソッドは、あなたの場合のように、基礎となる表現にアクセスするために使用されました。例えば

表現aImplicitCastExprを入力しており、それがタイプDeclRefExprの一部bを保持している場合、その後、a->IgnoreImpCasts()bへのポインタを返します。しかし、bのメソッドを呼び出すと、bが返されます。ここで

は、あなたの質問に答えるためのコードです:

Expr *SE = rvalue->getSourceExpr()->IgnoreImpCasts(); 
if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(SE)) { 
    // do you magic with DeclRefExpr here 
} 
関連する問題