diff options
| author | Manuel Klimek <klimek@google.com> | 2014-05-27 10:04:12 +0000 |
|---|---|---|
| committer | Manuel Klimek <klimek@google.com> | 2014-05-27 10:04:12 +0000 |
| commit | 909b5c94c072516d980013073be9ca2cd8993f67 (patch) | |
| tree | cc9a9703f078f8ce3b57dfb524d5d4acef4a8a23 | |
| parent | 73458c95ac7e4c6a1cb24166030ecce65ed33101 (diff) | |
| download | bcm5719-llvm-909b5c94c072516d980013073be9ca2cd8993f67.tar.gz bcm5719-llvm-909b5c94c072516d980013073be9ca2cd8993f67.zip | |
Adds child traversal matchers for IfStmt's then and else branches.
llvm-svn: 209649
| -rw-r--r-- | clang/docs/LibASTMatchersReference.html | 18 | ||||
| -rw-r--r-- | clang/include/clang/ASTMatchers/ASTMatchers.h | 24 | ||||
| -rw-r--r-- | clang/unittests/ASTMatchers/ASTMatchersTest.cpp | 11 |
3 files changed, 53 insertions, 0 deletions
diff --git a/clang/docs/LibASTMatchersReference.html b/clang/docs/LibASTMatchersReference.html index 3b862cd8611..90351e0602c 100644 --- a/clang/docs/LibASTMatchersReference.html +++ b/clang/docs/LibASTMatchersReference.html @@ -3100,6 +3100,24 @@ hasConditionVariableStatement(...) </pre></td></tr> +<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('hasElse0')"><a name="hasElse0Anchor">hasElse</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> +<tr><td colspan="4" class="doc" id="hasElse0"><pre>Matches the else-statement of an if statement. + +Examples matches the if statement + (matcher = ifStmt(hasElse(boolLiteral(equals(true))))) + if (false) false; else true; +</pre></td></tr> + + +<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1IfStmt.html">IfStmt</a>></td><td class="name" onclick="toggle('hasThen0')"><a name="hasThen0Anchor">hasThen</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> +<tr><td colspan="4" class="doc" id="hasThen0"><pre>Matches the then-statement of an if statement. + +Examples matches the if statement + (matcher = ifStmt(hasThen(boolLiteral(equals(true))))) + if (false) true; else false; +</pre></td></tr> + + <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ImplicitCastExpr.html">ImplicitCastExpr</a>></td><td class="name" onclick="toggle('hasImplicitDestinationType0')"><a name="hasImplicitDestinationType0Anchor">hasImplicitDestinationType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr> <tr><td colspan="4" class="doc" id="hasImplicitDestinationType0"><pre>Matches implicit casts whose destination type matches a given matcher. diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h b/clang/include/clang/ASTMatchers/ASTMatchers.h index 30f0264aaf5..3636def66d2 100644 --- a/clang/include/clang/ASTMatchers/ASTMatchers.h +++ b/clang/include/clang/ASTMatchers/ASTMatchers.h @@ -2334,6 +2334,30 @@ AST_POLYMORPHIC_MATCHER_P( InnerMatcher.matches(*Condition, Finder, Builder)); } +/// \brief Matches the then-statement of an if statement. +/// +/// Examples matches the if statement +/// (matcher = ifStmt(hasThen(boolLiteral(equals(true))))) +/// \code +/// if (false) true; else false; +/// \endcode +AST_MATCHER_P(IfStmt, hasThen, internal::Matcher<Stmt>, InnerMatcher) { + const Stmt *const Then = Node.getThen(); + return (Then != nullptr && InnerMatcher.matches(*Then, Finder, Builder)); +} + +/// \brief Matches the else-statement of an if statement. +/// +/// Examples matches the if statement +/// (matcher = ifStmt(hasElse(boolLiteral(equals(true))))) +/// \code +/// if (false) false; else true; +/// \endcode +AST_MATCHER_P(IfStmt, hasElse, internal::Matcher<Stmt>, InnerMatcher) { + const Stmt *const Else = Node.getElse(); + return (Else != nullptr && InnerMatcher.matches(*Else, Finder, Builder)); +} + /// \brief Matches if a node equals a previously bound node. /// /// Matches a node if it equals the node previously bound to \p ID. diff --git a/clang/unittests/ASTMatchers/ASTMatchersTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersTest.cpp index 4ce56fd0238..9d9b2a15b79 100644 --- a/clang/unittests/ASTMatchers/ASTMatchersTest.cpp +++ b/clang/unittests/ASTMatchers/ASTMatchersTest.cpp @@ -1966,6 +1966,17 @@ TEST(Matcher, Conditions) { EXPECT_TRUE(notMatches("void x() { if (1) {} }", Condition)); } +TEST(IfStmt, ChildTraversalMatchers) { + EXPECT_TRUE(matches("void f() { if (false) true; else false; }", + ifStmt(hasThen(boolLiteral(equals(true)))))); + EXPECT_TRUE(notMatches("void f() { if (false) false; else true; }", + ifStmt(hasThen(boolLiteral(equals(true)))))); + EXPECT_TRUE(matches("void f() { if (false) false; else true; }", + ifStmt(hasElse(boolLiteral(equals(true)))))); + EXPECT_TRUE(notMatches("void f() { if (false) true; else false; }", + ifStmt(hasElse(boolLiteral(equals(true)))))); +} + TEST(MatchBinaryOperator, HasOperatorName) { StatementMatcher OperatorOr = binaryOperator(hasOperatorName("||")); |

