2016-06-02 9 views
1

Ich habe einen Teil von AST als das Bild folgte. enter image description hereWie bekomme ich die Kinder von OpaqueValueExpr in Clang AST

Der Code dieses BinaryOperator ist:

self.contentMode = UIViewContentModeScaleAspectFit; 

Dann ASTVisitor Ich verwende die Informationen dieser Zeile Code zu erhalten.

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

kann ich die lvalue richtig, aber wie kann ich die DeclRefExpr in der letzten Zeile des AST erhalten.

Antwort

2

OpaqueValueExpr einen anderen Ausdruck enthält, können Sie mit der Methode getSourceExpr() darauf zugreifen.

Innerhalb Ihrer AST wird der Quellausdruck eine implizite Umwandlung sein, was nicht das Ziel ist. Zu diesem Zweck hat Clangs Expr Klasse eine Familie von "Ignorier" -Methoden wie IgnoreImpCasts oder IgnoreParens. Diese Methoden greifen wie in Ihrem Fall auf den zugrunde liegenden Ausdruck zu.

Zum Beispiel, wenn ein Ausdruck a hat ImplicitCastExpr geben und es hält einige b vom Typ DeclRefExpr, dann a->IgnoreImpCasts() Zeiger auf b zurück. Wenn wir die Methode jedoch auf b aufrufen, wird b selbst zurückgegeben.

Hier Code Ihre Frage zu beantworten:

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