Skip to content
This repository was archived by the owner on Mar 28, 2020. It is now read-only.

Commit a0e59b0

Browse files
committed
[libclang] NFC, simplify clang_Cursor_Evaluate
Take advantage of early returns as suggested by Duncan in https://reviews.llvm.org/D49051 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@336591 91177308-0d34-0410-b5e6-96231b3b80d8 (cherry picked from commit 7a9552d)
1 parent f9c61eb commit a0e59b0

File tree

1 file changed

+24
-25
lines changed

1 file changed

+24
-25
lines changed

tools/libclang/CIndex.cpp

Lines changed: 24 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3878,36 +3878,35 @@ static const ExprEvalResult* evaluateExpr(Expr *expr, CXCursor C) {
38783878
return nullptr;
38793879
}
38803880

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)
39063883
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;
39073896
}
39083897
return nullptr;
39093898
}
39103899

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+
39113910
unsigned clang_Cursor_hasAttrs(CXCursor C) {
39123911
const Decl *D = getCursorDecl(C);
39133912
if (!D) {

0 commit comments

Comments
 (0)