Author: george.karpenkov Date: Tue Mar 6 18:32:44 2018 New Revision: 326865
URL: http://llvm.org/viewvc/llvm-project?rev=326865&view=rev Log: [ASTMatcher] Extend hasAnyArgument to ObjCMessageExpr Currently hasArgument works with both ObjC messages and function calls, but not hasAnyArgument. This patch fixes that discrepancy, as it's often more convenient to use hasAnyArgument. On a more general note, it would be great to have a common superclass for objc-call and function call, and a matcher matching that, but that's probably a job for another commit. Differential Revision: https://reviews.llvm.org/D44169 Modified: cfe/trunk/docs/LibASTMatchersReference.html cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp Modified: cfe/trunk/docs/LibASTMatchersReference.html URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/LibASTMatchersReference.html?rev=326865&r1=326864&r2=326865&view=diff ============================================================================== --- cfe/trunk/docs/LibASTMatchersReference.html (original) +++ cfe/trunk/docs/LibASTMatchersReference.html Tue Mar 6 18:32:44 2018 @@ -4342,7 +4342,7 @@ and parmVarDecl(...) <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CXXConstructExpr.html">CXXConstructExpr</a>></td><td class="name" onclick="toggle('hasAnyArgument1')"><a name="hasAnyArgument1Anchor">hasAnyArgument</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> <tr><td colspan="4" class="doc" id="hasAnyArgument1"><pre>Matches any argument of a call expression or a constructor call -expression. +expression, or an ObjC-message-send expression. Given void x(int, int, int) { int y; x(1, y, 42); } @@ -4350,6 +4350,12 @@ callExpr(hasAnyArgument(declRefExpr())) matches x(1, y, 42) with hasAnyArgument(...) matching y + +For ObjectiveC, given + @interface I - (void) f:(int) y; @end + void foo(I *i) { [i f:12] } +objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) + matches [i f:12] </pre></td></tr> @@ -4689,7 +4695,7 @@ and parmVarDecl(...) <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1CallExpr.html">CallExpr</a>></td><td class="name" onclick="toggle('hasAnyArgument0')"><a name="hasAnyArgument0Anchor">hasAnyArgument</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> <tr><td colspan="4" class="doc" id="hasAnyArgument0"><pre>Matches any argument of a call expression or a constructor call -expression. +expression, or an ObjC-message-send expression. Given void x(int, int, int) { int y; x(1, y, 42); } @@ -4697,6 +4703,12 @@ callExpr(hasAnyArgument(declRefExpr())) matches x(1, y, 42) with hasAnyArgument(...) matching y + +For ObjectiveC, given + @interface I - (void) f:(int) y; @end + void foo(I *i) { [i f:12] } +objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) + matches [i f:12] </pre></td></tr> @@ -5634,6 +5646,25 @@ nestedNameSpecifier(specifiesType( </pre></td></tr> +<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasAnyArgument2')"><a name="hasAnyArgument2Anchor">hasAnyArgument</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> +<tr><td colspan="4" class="doc" id="hasAnyArgument2"><pre>Matches any argument of a call expression or a constructor call +expression, or an ObjC-message-send expression. + +Given + void x(int, int, int) { int y; x(1, y, 42); } +callExpr(hasAnyArgument(declRefExpr())) + matches x(1, y, 42) +with hasAnyArgument(...) + matching y + +For ObjectiveC, given + @interface I - (void) f:(int) y; @end + void foo(I *i) { [i f:12] } +objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) + matches [i f:12] +</pre></td></tr> + + <tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1ObjCMessageExpr.html">ObjCMessageExpr</a>></td><td class="name" onclick="toggle('hasArgument2')"><a name="hasArgument2Anchor">hasArgument</a></td><td>unsigned N, Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1Expr.html">Expr</a>> InnerMatcher</td></tr> <tr><td colspan="4" class="doc" id="hasArgument2"><pre>Matches the n'th argument of a call expression or a constructor call expression. Modified: cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h?rev=326865&r1=326864&r2=326865&view=diff ============================================================================== --- cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h (original) +++ cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h Tue Mar 6 18:32:44 2018 @@ -3412,7 +3412,7 @@ AST_MATCHER(CXXCtorInitializer, isMember } /// \brief Matches any argument of a call expression or a constructor call -/// expression. +/// expression, or an ObjC-message-send expression. /// /// Given /// \code @@ -3422,9 +3422,18 @@ AST_MATCHER(CXXCtorInitializer, isMember /// matches x(1, y, 42) /// with hasAnyArgument(...) /// matching y +/// +/// For ObjectiveC, given +/// \code +/// @interface I - (void) f:(int) y; @end +/// void foo(I *i) { [i f:12]; } +/// \endcode +/// objcMessageExpr(hasAnyArgument(integerLiteral(equals(12)))) +/// matches [i f:12] AST_POLYMORPHIC_MATCHER_P(hasAnyArgument, AST_POLYMORPHIC_SUPPORTED_TYPES(CallExpr, - CXXConstructExpr), + CXXConstructExpr, + ObjCMessageExpr), internal::Matcher<Expr>, InnerMatcher) { for (const Expr *Arg : Node.arguments()) { BoundNodesTreeBuilder Result(*Builder); Modified: cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp?rev=326865&r1=326864&r2=326865&view=diff ============================================================================== --- cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp (original) +++ cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp Tue Mar 6 18:32:44 2018 @@ -403,11 +403,18 @@ TEST(Matcher, Argument) { } TEST(Matcher, AnyArgument) { - StatementMatcher CallArgumentY = callExpr( - hasAnyArgument( - ignoringParenImpCasts(declRefExpr(to(varDecl(hasName("y"))))))); + auto HasArgumentY = hasAnyArgument( + ignoringParenImpCasts(declRefExpr(to(varDecl(hasName("y")))))); + StatementMatcher CallArgumentY = callExpr(HasArgumentY); + StatementMatcher ObjCCallArgumentY = objcMessageExpr(HasArgumentY); EXPECT_TRUE(matches("void x(int, int) { int y; x(1, y); }", CallArgumentY)); EXPECT_TRUE(matches("void x(int, int) { int y; x(y, 42); }", CallArgumentY)); + EXPECT_TRUE(matchesObjC("@interface I -(void)f:(int) y; @end " + "void x(I* i) { int y; [i f:y]; }", + ObjCCallArgumentY)); + EXPECT_FALSE(matchesObjC("@interface I -(void)f:(int) z; @end " + "void x(I* i) { int z; [i f:z]; }", + ObjCCallArgumentY)); EXPECT_TRUE(notMatches("void x(int, int) { x(1, 2); }", CallArgumentY)); StatementMatcher ImplicitCastedArgument = callExpr( _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits