diff options
Diffstat (limited to 'clang/tools/libclang/CIndex.cpp')
| -rw-r--r-- | clang/tools/libclang/CIndex.cpp | 47 |
1 files changed, 23 insertions, 24 deletions
diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index bc791954fc7..15b2df84935 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -3902,36 +3902,35 @@ static const ExprEvalResult* evaluateExpr(Expr *expr, CXCursor C) { return nullptr; } -CXEvalResult clang_Cursor_Evaluate(CXCursor 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))); +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; +} - const CompoundStmt *compoundStmt = dyn_cast_or_null<CompoundStmt>(getCursorStmt(C)); - if (compoundStmt) { - 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))); +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; } 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))); + return nullptr; +} + unsigned clang_Cursor_hasAttrs(CXCursor C) { const Decl *D = getCursorDecl(C); if (!D) { |

