mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-06 07:14:42 +01:00
[ASTMatchers] Added BinaryOperator hasOperands matcher
Summary: Adds a matcher called `hasOperands` for `BinaryOperator`'s when you need to match both sides but the order isn't important, usually on commutative operators. Reviewers: klimek, aaron.ballman, gribozavr2, alexfh Reviewed By: aaron.ballman Subscribers: cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D80054
This commit is contained in:
@@ -5033,6 +5033,18 @@ Example matches a (matcher = binaryOperator(hasLHS()))
|
||||
</pre></td></tr>
|
||||
|
||||
|
||||
<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasOperands0')"><a name="hasOperands0Anchor">hasOperands</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> Matcher1, Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> Matcher2</td></tr>
|
||||
<tr><td colspan="4" class="doc" id="hasOperands0"><pre>Matches if both matchers match with opposite sides of the binary operator.
|
||||
|
||||
Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
|
||||
integerLiteral(equals(2)))
|
||||
1 + 2 // Match
|
||||
2 + 1 // Match
|
||||
1 + 1 // No match
|
||||
2 + 2 // No match
|
||||
</pre></td></tr>
|
||||
|
||||
|
||||
<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1BinaryOperator.html">BinaryOperator</a>></td><td class="name" onclick="toggle('hasRHS0')"><a name="hasRHS0Anchor">hasRHS</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr>
|
||||
<tr><td colspan="4" class="doc" id="hasRHS0"><pre>Matches the right hand side of binary operator expressions.
|
||||
|
||||
|
||||
@@ -4869,6 +4869,23 @@ inline internal::Matcher<BinaryOperator> hasEitherOperand(
|
||||
return anyOf(hasLHS(InnerMatcher), hasRHS(InnerMatcher));
|
||||
}
|
||||
|
||||
/// Matches if both matchers match with opposite sides of the binary operator.
|
||||
///
|
||||
/// Example matcher = binaryOperator(hasOperands(integerLiteral(equals(1),
|
||||
/// integerLiteral(equals(2)))
|
||||
/// \code
|
||||
/// 1 + 2 // Match
|
||||
/// 2 + 1 // Match
|
||||
/// 1 + 1 // No match
|
||||
/// 2 + 2 // No match
|
||||
/// \endcode
|
||||
inline internal::Matcher<BinaryOperator>
|
||||
hasOperands(const internal::Matcher<Expr> &Matcher1,
|
||||
const internal::Matcher<Expr> &Matcher2) {
|
||||
return anyOf(allOf(hasLHS(Matcher1), hasRHS(Matcher2)),
|
||||
allOf(hasLHS(Matcher2), hasRHS(Matcher1)));
|
||||
}
|
||||
|
||||
/// Matches if the operand of a unary operator matches.
|
||||
///
|
||||
/// Example matches true (matcher = hasUnaryOperand(
|
||||
|
||||
@@ -294,6 +294,7 @@ RegistryMaps::RegistryMaps() {
|
||||
REGISTER_MATCHER(hasName);
|
||||
REGISTER_MATCHER(hasNullSelector);
|
||||
REGISTER_MATCHER(hasObjectExpression);
|
||||
REGISTER_MATCHER(hasOperands);
|
||||
REGISTER_MATCHER(hasOperatorName);
|
||||
REGISTER_MATCHER(hasOverloadedOperatorName);
|
||||
REGISTER_MATCHER(hasParameter);
|
||||
|
||||
@@ -1160,6 +1160,17 @@ TEST(MatchBinaryOperator, HasEitherOperand) {
|
||||
EXPECT_TRUE(notMatches("void x() { true || true; }", HasOperand));
|
||||
}
|
||||
|
||||
TEST(MatchBinaryOperator, HasOperands) {
|
||||
StatementMatcher HasOperands = binaryOperator(
|
||||
hasOperands(integerLiteral(equals(1)), integerLiteral(equals(2))));
|
||||
EXPECT_TRUE(matches("void x() { 1 + 2; }", HasOperands));
|
||||
EXPECT_TRUE(matches("void x() { 2 + 1; }", HasOperands));
|
||||
EXPECT_TRUE(notMatches("void x() { 1 + 1; }", HasOperands));
|
||||
EXPECT_TRUE(notMatches("void x() { 2 + 2; }", HasOperands));
|
||||
EXPECT_TRUE(notMatches("void x() { 0 + 0; }", HasOperands));
|
||||
EXPECT_TRUE(notMatches("void x() { 0 + 1; }", HasOperands));
|
||||
}
|
||||
|
||||
TEST(Matcher, BinaryOperatorTypes) {
|
||||
// Integration test that verifies the AST provides all binary operators in
|
||||
// a way we expect.
|
||||
|
||||
Reference in New Issue
Block a user