steveire updated this revision to Diff 319660. steveire added a comment. Update
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D94865/new/ https://reviews.llvm.org/D94865 Files: clang/docs/LibASTMatchersReference.html clang/include/clang/ASTMatchers/ASTMatchers.h clang/lib/ASTMatchers/ASTMatchersInternal.cpp clang/lib/ASTMatchers/Dynamic/Registry.cpp clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp
Index: clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp =================================================================== --- clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp +++ clang/unittests/ASTMatchers/ASTMatchersNarrowingTest.cpp @@ -863,6 +863,47 @@ mapAnyOf(unaryOperator, cxxOperatorCallExpr) .with(hasAnyOperatorName("+", "!"), forFunction(functionDecl(hasName("opFree"))))))); + + Code = R"cpp( +struct ConstructorTakesInt +{ + ConstructorTakesInt(int i) {} +}; + +void callTakesInt(int i) +{ + +} + +void doCall() +{ + callTakesInt(42); +} + +void doConstruct() +{ + ConstructorTakesInt cti(42); +} +)cpp"; + + EXPECT_TRUE(matches( + Code, traverse(TK_IgnoreUnlessSpelledInSource, + invocation(forFunction(functionDecl(hasName("doCall"))), + hasArgument(0, integerLiteral(equals(42))), + hasAnyArgument(integerLiteral(equals(42))), + forEachArgumentWithParam( + integerLiteral(equals(42)), + parmVarDecl(hasName("i"))))))); + + EXPECT_TRUE(matches( + Code, + traverse( + TK_IgnoreUnlessSpelledInSource, + invocation(forFunction(functionDecl(hasName("doConstruct"))), + hasArgument(0, integerLiteral(equals(42))), + hasAnyArgument(integerLiteral(equals(42))), + forEachArgumentWithParam(integerLiteral(equals(42)), + parmVarDecl(hasName("i"))))))); } TEST_P(ASTMatchersTest, IsDerivedFrom) { Index: clang/lib/ASTMatchers/Dynamic/Registry.cpp =================================================================== --- clang/lib/ASTMatchers/Dynamic/Registry.cpp +++ clang/lib/ASTMatchers/Dynamic/Registry.cpp @@ -152,6 +152,7 @@ REGISTER_MATCHER(builtinType); REGISTER_MATCHER(cStyleCastExpr); REGISTER_MATCHER(callExpr); + REGISTER_MATCHER(invocation); REGISTER_MATCHER(caseStmt); REGISTER_MATCHER(castExpr); REGISTER_MATCHER(characterLiteral); Index: clang/lib/ASTMatchers/ASTMatchersInternal.cpp =================================================================== --- clang/lib/ASTMatchers/ASTMatchersInternal.cpp +++ clang/lib/ASTMatchers/ASTMatchersInternal.cpp @@ -924,6 +924,9 @@ const internal::MapAnyOfMatcher<BinaryOperator, CXXOperatorCallExpr, CXXRewrittenBinaryOperator> binaryOperation; +const internal::MapAnyOfMatcher<CallExpr, CXXConstructExpr, + CXXUnresolvedConstructExpr, ObjCMessageExpr> + invocation; const internal::VariadicDynCastAllOfMatcher<Stmt, UnaryOperator> unaryOperator; const internal::VariadicDynCastAllOfMatcher<Stmt, ConditionalOperator> conditionalOperator; Index: clang/include/clang/ASTMatchers/ASTMatchers.h =================================================================== --- clang/include/clang/ASTMatchers/ASTMatchers.h +++ clang/include/clang/ASTMatchers/ASTMatchers.h @@ -2829,6 +2829,44 @@ CXXRewrittenBinaryOperator> binaryOperation; +/// Matches function calls and constructor calls +/// +/// Because CallExpr and CXXConstructExpr do not share a common +/// base class with API accessing arguments etc, AST Matchers for code +/// which should match both are typically duplicated. This matcher +/// removes the need for duplication. +/// +/// Given code +/// \code +/// struct ConstructorTakesInt +/// { +/// ConstructorTakesInt(int i) {} +/// }; +/// +/// void callTakesInt(int i) +/// { +/// } +/// +/// void doCall() +/// { +/// callTakesInt(42); +/// } +/// +/// void doConstruct() +/// { +/// ConstructorTakesInt cti(42); +/// } +/// \endcode +/// +/// The matcher +/// \code +/// invocation(hasArgument(0, integerLiteral(equals(42)))) +/// \endcode +/// matches the expression in both doCall and doConstruct +extern const internal::MapAnyOfMatcher< + CallExpr, CXXConstructExpr, CXXUnresolvedConstructExpr, ObjCMessageExpr> + invocation; + /// Matches unary expressions that have a specific type of argument. /// /// Given Index: clang/docs/LibASTMatchersReference.html =================================================================== --- clang/docs/LibASTMatchersReference.html +++ clang/docs/LibASTMatchersReference.html @@ -5613,6 +5613,40 @@ </pre></td></tr> +<tr><td>Matcher<*></td><td class="name" onclick="toggle('invocation0')"><a name="invocation0Anchor">invocation</a></td><td>Matcher<*>...Matcher<*></td></tr> +<tr><td colspan="4" class="doc" id="invocation0"><pre>Matches function calls and constructor calls + +Because CallExpr and CXXConstructExpr do not share a common +base class with API accessing arguments etc, AST Matchers for code +which should match both are typically duplicated. This matcher +removes the need for duplication. + +Given code +struct ConstructorTakesInt +{ + ConstructorTakesInt(int i) {} +}; + +void callTakesInt(int i) +{ +} + +void doCall() +{ + callTakesInt(42); +} + +void doConstruct() +{ + ConstructorTakesInt cti(42); +} + +The matcher +invocation(hasArgument(0, integerLiteral(equals(42)))) +matches the expression in both doCall and doConstruct +</pre></td></tr> + + <tr><td>Matcher<*></td><td class="name" onclick="toggle('eachOf0')"><a name="eachOf0Anchor">eachOf</a></td><td>Matcher<*>, ..., Matcher<*></td></tr> <tr><td colspan="4" class="doc" id="eachOf0"><pre>Matches if any of the given matchers matches.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits