This revision was automatically updated to reflect the committed changes. Closed by commit rC328618: [ASTMatchers] Add isAssignmentOperator matcher (authored by szepet, committed by ).
Changed prior to commit: https://reviews.llvm.org/D44893?vs=139769&id=139900#toc Repository: rC Clang https://reviews.llvm.org/D44893 Files: docs/LibASTMatchersReference.html include/clang/ASTMatchers/ASTMatchers.h lib/ASTMatchers/Dynamic/Registry.cpp unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp
Index: docs/LibASTMatchersReference.html =================================================================== --- docs/LibASTMatchersReference.html +++ docs/LibASTMatchersReference.html @@ -1926,6 +1926,19 @@ </pre></td></tr> +<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('isAssignmentOperator0')"><a name="isAssignmentOperator0Anchor">isAssignmentOperator</a></td></tr> +<tr><td colspan="4" class="doc" id="isAssignmentOperator0"><pre>Matches all kinds of assignment operators. + +Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) + if (a == b) + a += b; + +Example 2: matches s1 = s2 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) + struct S { S& operator=(const S&); }; + void x() { S s1, s2; s1 = s2; }) +</pre></td></tr> + + <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXBoolLiteralExpr.html">CXXBoolLiteralExpr</a>></td><td class="name" onclick="toggle('equals5')"><a name="equals5Anchor">equals</a></td><td>bool Value</td></tr> <tr><td colspan="4" class="doc" id="equals5"><pre></pre></td></tr> @@ -2306,6 +2319,19 @@ </pre></td></tr> +<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXOperatorCallExpr.html">CXXOperatorCallExpr</a>></td><td class="name" onclick="toggle('isAssignmentOperator1')"><a name="isAssignmentOperator1Anchor">isAssignmentOperator</a></td></tr> +<tr><td colspan="4" class="doc" id="isAssignmentOperator1"><pre>Matches all kinds of assignment operators. + +Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) + if (a == b) + a += b; + +Example 2: matches s1 = s2 (matcher = cxxOperatorCallExpr(isAssignmentOperator())) + struct S { S& operator=(const S&); }; + void x() { S s1, s2; s1 = s2; }) +</pre></td></tr> + + <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXRecordDecl.html">CXXRecordDecl</a>></td><td class="name" onclick="toggle('hasDefinition0')"><a name="hasDefinition0Anchor">hasDefinition</a></td><td></td></tr> <tr><td colspan="4" class="doc" id="hasDefinition0"><pre>Matches a class declaration that is defined. Index: include/clang/ASTMatchers/ASTMatchers.h =================================================================== --- include/clang/ASTMatchers/ASTMatchers.h +++ include/clang/ASTMatchers/ASTMatchers.h @@ -4003,6 +4003,26 @@ return Name == Node.getOpcodeStr(Node.getOpcode()); } +/// \brief Matches on all kinds of assignment operators. +/// +/// Example 1: matches a += b (matcher = binaryOperator(isAssignmentOperator())) +/// \code +/// if (a == b) +/// a += b; +/// \endcode +/// +/// Example 2: matches s1 = s2 +/// (matcher = cxxOperatorCallExpr(isAssignmentOperator())) +/// \code +/// struct S { S& operator=(const S&); }; +/// void x() { S s1, s2; s1 = s2; }) +/// \endcode +AST_POLYMORPHIC_MATCHER(isAssignmentOperator, + AST_POLYMORPHIC_SUPPORTED_TYPES(BinaryOperator, + CXXOperatorCallExpr)) { + return Node.isAssignmentOp(); +} + /// \brief Matches the left hand side of binary operator expressions. /// /// Example matches a (matcher = binaryOperator(hasLHS())) Index: lib/ASTMatchers/Dynamic/Registry.cpp =================================================================== --- lib/ASTMatchers/Dynamic/Registry.cpp +++ lib/ASTMatchers/Dynamic/Registry.cpp @@ -322,6 +322,7 @@ REGISTER_MATCHER(isAnyPointer); REGISTER_MATCHER(isArray); REGISTER_MATCHER(isArrow); + REGISTER_MATCHER(isAssignmentOperator); REGISTER_MATCHER(isBaseInitializer); REGISTER_MATCHER(isBitField); REGISTER_MATCHER(isCatchAll); Index: unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp =================================================================== --- unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp +++ unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp @@ -2139,5 +2139,20 @@ functionDecl(hasTrailingReturn()))); } +TEST(IsAssignmentOperator, Basic) { + StatementMatcher BinAsgmtOperator = binaryOperator(isAssignmentOperator()); + StatementMatcher CXXAsgmtOperator = + cxxOperatorCallExpr(isAssignmentOperator()); + + EXPECT_TRUE(matches("void x() { int a; a += 1; }", BinAsgmtOperator)); + EXPECT_TRUE(matches("void x() { int a; a = 2; }", BinAsgmtOperator)); + EXPECT_TRUE(matches("void x() { int a; a &= 3; }", BinAsgmtOperator)); + EXPECT_TRUE(matches("struct S { S& operator=(const S&); };" + "void x() { S s1, s2; s1 = s2; }", + CXXAsgmtOperator)); + EXPECT_TRUE( + notMatches("void x() { int a; if(a == 0) return; }", BinAsgmtOperator)); +} + } // namespace ast_matchers } // namespace clang
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits