return nullptr;
}
-static const Expr *evaluateDeclExpr(const Decl *D) {
- if (!D)
- return nullptr;
- if (auto *Var = dyn_cast<VarDecl>(D))
- return Var->getInit();
- else if (auto *Field = dyn_cast<FieldDecl>(D))
- return Field->getInClassInitializer();
- return nullptr;
-}
-
-static const Expr *evaluateCompoundStmtExpr(const CompoundStmt *CS) {
- assert(CS && "invalid compound statement");
- for (auto *bodyIterator : CS->body()) {
- if (const auto *E = dyn_cast<Expr>(bodyIterator))
- return E;
+CXEvalResult clang_Cursor_Evaluate(CXCursor C) {
+ if (clang_getCursorKind(C) == CXCursor_CompoundStmt) {
+ const CompoundStmt *compoundStmt = cast<CompoundStmt>(getCursorStmt(C));
+ Expr *expr = nullptr;
+ for (auto *bodyIterator : compoundStmt->body()) {
+ if ((expr = dyn_cast<Expr>(bodyIterator))) {
+ break;
+ }
+ }
+ if (expr)
+ return const_cast<CXEvalResult>(
+ reinterpret_cast<const void *>(evaluateExpr(expr, C)));
}
- return nullptr;
-}
-CXEvalResult clang_Cursor_Evaluate(CXCursor C) {
- if (const Expr *E =
- clang_getCursorKind(C) == CXCursor_CompoundStmt
- ? evaluateCompoundStmtExpr(cast<CompoundStmt>(getCursorStmt(C)))
- : evaluateDeclExpr(getCursorDecl(C)))
- return const_cast<CXEvalResult>(
- reinterpret_cast<const void *>(evaluateExpr(const_cast<Expr *>(E), C)));
+ const Decl *D = getCursorDecl(C);
+ if (D) {
+ const Expr *expr = nullptr;
+ if (auto *Var = dyn_cast<VarDecl>(D)) {
+ expr = Var->getInit();
+ } else if (auto *Field = dyn_cast<FieldDecl>(D)) {
+ expr = Field->getInClassInitializer();
+ }
+ if (expr)
+ return const_cast<CXEvalResult>(reinterpret_cast<const void *>(
+ evaluateExpr(const_cast<Expr *>(expr), C)));
+ return nullptr;
+ }
return nullptr;
}