@@ -3878,36 +3878,35 @@ static const ExprEvalResult* evaluateExpr(Expr *expr, CXCursor C) {
3878
3878
return nullptr ;
3879
3879
}
3880
3880
3881
- CXEvalResult clang_Cursor_Evaluate (CXCursor C) {
3882
- if (clang_getCursorKind (C) == CXCursor_CompoundStmt) {
3883
- const CompoundStmt *compoundStmt = cast<CompoundStmt>(getCursorStmt (C));
3884
- Expr *expr = nullptr ;
3885
- for (auto *bodyIterator : compoundStmt->body ()) {
3886
- if ((expr = dyn_cast<Expr>(bodyIterator))) {
3887
- break ;
3888
- }
3889
- }
3890
- if (expr)
3891
- return const_cast <CXEvalResult>(
3892
- reinterpret_cast <const void *>(evaluateExpr (expr, C)));
3893
- }
3894
-
3895
- const Decl *D = getCursorDecl (C);
3896
- if (D) {
3897
- const Expr *expr = nullptr ;
3898
- if (auto *Var = dyn_cast<VarDecl>(D)) {
3899
- expr = Var->getInit ();
3900
- } else if (auto *Field = dyn_cast<FieldDecl>(D)) {
3901
- expr = Field->getInClassInitializer ();
3902
- }
3903
- if (expr)
3904
- return const_cast <CXEvalResult>(reinterpret_cast <const void *>(
3905
- evaluateExpr (const_cast <Expr *>(expr), C)));
3881
+ static const Expr *evaluateDeclExpr (const Decl *D) {
3882
+ if (!D)
3906
3883
return nullptr ;
3884
+ if (auto *Var = dyn_cast<VarDecl>(D))
3885
+ return Var->getInit ();
3886
+ else if (auto *Field = dyn_cast<FieldDecl>(D))
3887
+ return Field->getInClassInitializer ();
3888
+ return nullptr ;
3889
+ }
3890
+
3891
+ static const Expr *evaluateCompoundStmtExpr (const CompoundStmt *CS) {
3892
+ assert (CS && " invalid compound statement" );
3893
+ for (auto *bodyIterator : CS->body ()) {
3894
+ if (const auto *E = dyn_cast<Expr>(bodyIterator))
3895
+ return E;
3907
3896
}
3908
3897
return nullptr ;
3909
3898
}
3910
3899
3900
+ CXEvalResult clang_Cursor_Evaluate (CXCursor C) {
3901
+ if (const Expr *E =
3902
+ clang_getCursorKind (C) == CXCursor_CompoundStmt
3903
+ ? evaluateCompoundStmtExpr (cast<CompoundStmt>(getCursorStmt (C)))
3904
+ : evaluateDeclExpr (getCursorDecl (C)))
3905
+ return const_cast <CXEvalResult>(
3906
+ reinterpret_cast <const void *>(evaluateExpr (const_cast <Expr *>(E), C)));
3907
+ return nullptr ;
3908
+ }
3909
+
3911
3910
unsigned clang_Cursor_hasAttrs (CXCursor C) {
3912
3911
const Decl *D = getCursorDecl (C);
3913
3912
if (!D) {
0 commit comments