diff options
author | Haojian Wu <hokein.wu@gmail.com> | 2021-02-01 13:45:42 +0100 |
---|---|---|
committer | Haojian Wu <hokein.wu@gmail.com> | 2021-02-04 09:15:30 +0100 |
commit | 6c1a23303de9d957cf45ebd04daba862519e393d (patch) | |
tree | e695be4dad1732d59efceb7c49d1a1b08de1ac34 /clang/lib/Tooling/Syntax/BuildTree.cpp | |
parent | f245b7ad36ff8bd85cddbe9784f7efe6dee577c0 (diff) | |
download | llvm-6c1a23303de9d957cf45ebd04daba862519e393d.zip llvm-6c1a23303de9d957cf45ebd04daba862519e393d.tar.gz llvm-6c1a23303de9d957cf45ebd04daba862519e393d.tar.bz2 |
[Syntax] Support condition for IfStmt.
Differential Revision: https://reviews.llvm.org/D95782
Diffstat (limited to 'clang/lib/Tooling/Syntax/BuildTree.cpp')
-rw-r--r-- | clang/lib/Tooling/Syntax/BuildTree.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/clang/lib/Tooling/Syntax/BuildTree.cpp b/clang/lib/Tooling/Syntax/BuildTree.cpp index 7654e3d..62573b6 100644 --- a/clang/lib/Tooling/Syntax/BuildTree.cpp +++ b/clang/lib/Tooling/Syntax/BuildTree.cpp @@ -800,6 +800,30 @@ public: return true; } + bool TraverseIfStmt(IfStmt *S) { + bool Result = [&, this]() { + if (S->getInit() && !TraverseStmt(S->getInit())) { + return false; + } + // In cases where the condition is an initialized declaration in a + // statement, we want to preserve the declaration and ignore the + // implicit condition expression in the syntax tree. + if (S->hasVarStorage()) { + if (!TraverseStmt(S->getConditionVariableDeclStmt())) + return false; + } else if (S->getCond() && !TraverseStmt(S->getCond())) + return false; + + if (S->getThen() && !TraverseStmt(S->getThen())) + return false; + if (S->getElse() && !TraverseStmt(S->getElse())) + return false; + return true; + }(); + WalkUpFromIfStmt(S); + return Result; + } + bool TraverseCXXForRangeStmt(CXXForRangeStmt *S) { // We override to traverse range initializer as VarDecl. // RAV traverses it as a statement, we produce invalid node kinds in that @@ -1426,6 +1450,10 @@ public: bool WalkUpFromIfStmt(IfStmt *S) { Builder.markChildToken(S->getIfLoc(), syntax::NodeRole::IntroducerKeyword); + Stmt *ConditionStatement = S->getCond(); + if (S->hasVarStorage()) + ConditionStatement = S->getConditionVariableDeclStmt(); + Builder.markStmtChild(ConditionStatement, syntax::NodeRole::Condition); Builder.markStmtChild(S->getThen(), syntax::NodeRole::ThenStatement); Builder.markChildToken(S->getElseLoc(), syntax::NodeRole::ElseKeyword); Builder.markStmtChild(S->getElse(), syntax::NodeRole::ElseStatement); |