Index: cfe/trunk/docs/LibASTMatchersReference.html =================================================================== --- cfe/trunk/docs/LibASTMatchersReference.html +++ cfe/trunk/docs/LibASTMatchersReference.html @@ -5298,7 +5298,7 @@
Matches any parameter of a function declaration. +@@ -5347,7 +5354,8 @@ Matches any parameter of a function or ObjC method declaration. Does not match the 'this' parameter of a method. @@ -5308,6 +5308,13 @@ matches f(int x, int y, int z) {} with hasAnyParameter(...) matching int y + +For ObjectiveC, given + @interface I - (void) f:(int) y; @end + +the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) +matches the declaration of method f with hasParameter +matching y.- Matcher<FunctionDecl> hasParameter unsigned N, Matcher<ParmVarDecl> InnerMatcher + Matches the n'th parameter of a function declaration. +@@ -5713,6 +5728,47 @@ Matches the n'th parameter of a function or an ObjC method +declaration. Given class X { void f(int x) {} }; @@ -5355,6 +5363,13 @@ matches f(int x) {} with hasParameter(...) matching int x + +For ObjectiveC, given + @interface I - (void) f:(int) y; @end + +the matcher objcMethodDecl(hasParameter(0, hasName("y"))) +matches the declaration of method f with hasParameter +matching y.+ Matcher<ObjCMethodDecl> hasAnyParameter Matcher<ParmVarDecl> InnerMatcher + + + Matches any parameter of a function or ObjC method declaration. + +Does not match the 'this' parameter of a method. + +Given + class X { void f(int x, int y, int z) {} }; +cxxMethodDecl(hasAnyParameter(hasName("y"))) + matches f(int x, int y, int z) {} +with hasAnyParameter(...) + matching int y + +For ObjectiveC, given + @interface I - (void) f:(int) y; @end + +the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) +matches the declaration of method f with hasParameter +matching y. ++ Matcher<ObjCMethodDecl> hasParameter unsigned N, Matcher<ParmVarDecl> InnerMatcher + + Matches the n'th parameter of a function or an ObjC method +declaration. + +Given + class X { void f(int x) {} }; +cxxMethodDecl(hasParameter(0, hasType(varDecl()))) + matches f(int x) {} +with hasParameter(...) + matching int x + +For ObjectiveC, given + @interface I - (void) f:(int) y; @end + +the matcher objcMethodDecl(hasParameter(0, hasName("y"))) +matches the declaration of method f with hasParameter +matching y. +Matcher<OpaqueValueExpr> hasSourceExpression Matcher<Expr> InnerMatcher Matches if the cast's source expression or opaque value's source expression matches the given matcher. Index: cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h =================================================================== --- cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h +++ cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h @@ -3466,7 +3466,8 @@ return Node.requiresZeroInitialization(); } -/// \brief Matches the n'th parameter of a function declaration. +/// \brief Matches the n'th parameter of a function or an ObjC method +/// declaration. /// /// Given /// \code @@ -3476,12 +3477,22 @@ /// matches f(int x) {} /// with hasParameter(...) /// matching int x -AST_MATCHER_P2(FunctionDecl, hasParameter, - unsigned, N, internal::Matcher, - InnerMatcher) { - return (N < Node.getNumParams() && - InnerMatcher.matches( - *Node.getParamDecl(N), Finder, Builder)); +/// +/// For ObjectiveC, given +/// \code +/// @interface I - (void) f:(int) y; @end +/// \endcode +// +/// the matcher objcMethodDecl(hasParameter(0, hasName("y"))) +/// matches the declaration of method f with hasParameter +/// matching y. +AST_POLYMORPHIC_MATCHER_P2(hasParameter, + AST_POLYMORPHIC_SUPPORTED_TYPES(FunctionDecl, + ObjCMethodDecl), + unsigned, N, internal::Matcher , + InnerMatcher) { + return (N < Node.parameters().size() + && InnerMatcher.matches(*Node.parameters()[N], Finder, Builder)); } /// \brief Matches all arguments and their respective ParmVarDecl. @@ -3538,7 +3549,7 @@ return Matched; } -/// \brief Matches any parameter of a function declaration. +/// \brief Matches any parameter of a function or ObjC method declaration. /// /// Does not match the 'this' parameter of a method. /// @@ -3550,8 +3561,20 @@ /// matches f(int x, int y, int z) {} /// with hasAnyParameter(...) /// matching int y -AST_MATCHER_P(FunctionDecl, hasAnyParameter, - internal::Matcher , InnerMatcher) { +/// +/// For ObjectiveC, given +/// \code +/// @interface I - (void) f:(int) y; @end +/// \endcode +// +/// the matcher objcMethodDecl(hasAnyParameter(hasName("y"))) +/// matches the declaration of method f with hasParameter +/// matching y. +AST_POLYMORPHIC_MATCHER_P(hasAnyParameter, + AST_POLYMORPHIC_SUPPORTED_TYPES(FunctionDecl, + ObjCMethodDecl), + internal::Matcher , + InnerMatcher) { return matchesFirstInPointerRange(InnerMatcher, Node.param_begin(), Node.param_end(), Finder, Builder); } Index: cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/WorkList.h =================================================================== --- cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/WorkList.h +++ cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/WorkList.h @@ -87,7 +87,7 @@ static std::unique_ptr makeUnexploredFirstPriorityQueue(); }; -} // end GR namespace +} // end ento namespace } // end clang namespace Index: cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp =================================================================== --- cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp +++ cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp @@ -539,6 +539,8 @@ cxxMethodDecl(hasParameter(0, varDecl())))); EXPECT_TRUE(notMatches("class X { void x(int) {} };", cxxMethodDecl(hasParameter(0, hasName("x"))))); + EXPECT_TRUE(matchesObjC("@interface I -(void)f:(int) x; @end", + objcMethodDecl(hasParameter(0, hasName("x"))))); } TEST(HasParameter, DoesNotMatchIfIndexOutOfBounds) { @@ -568,6 +570,8 @@ EXPECT_TRUE(matches( "class Y {}; class X { void x(Y y, X x) {} };", cxxMethodDecl(hasAnyParameter(hasType(recordDecl(hasName("X"))))))); + EXPECT_TRUE(matchesObjC("@interface I -(void)f:(int) x; @end", + objcMethodDecl(hasAnyParameter(hasName("x"))))); } TEST(Returns, MatchesReturnTypes) { Index: cfe/trunk/unittests/ASTMatchers/Dynamic/ParserTest.cpp =================================================================== --- cfe/trunk/unittests/ASTMatchers/Dynamic/ParserTest.cpp +++ cfe/trunk/unittests/ASTMatchers/Dynamic/ParserTest.cpp @@ -186,8 +186,8 @@ Parser::NamedValueMap getTestNamedValues() { Parser::NamedValueMap Values; Values["nameX"] = llvm::StringRef("x"); - Values["hasParamA"] = - VariantMatcher::SingleMatcher(hasParameter(0, hasName("a"))); + Values["hasParamA"] = VariantMatcher::SingleMatcher( + functionDecl(hasParameter(0, hasName("a")))); return Values; } @@ -329,16 +329,17 @@ EXPECT_LT(0u, Comps.size()); // Can complete names and registry together. - Code = "cxxMethodDecl(hasP"; + Code = "functionDecl(hasP"; Comps = Parser::completeExpression(Code, Code.size(), nullptr, &NamedValues); ASSERT_EQ(3u, Comps.size()); - EXPECT_EQ("aramA", Comps[0].TypedText); - EXPECT_EQ("Matcher hasParamA", Comps[0].MatcherDecl); - EXPECT_EQ("arameter(", Comps[1].TypedText); + EXPECT_EQ("arameter(", Comps[0].TypedText); EXPECT_EQ( "Matcher hasParameter(unsigned, Matcher )", - Comps[1].MatcherDecl); + Comps[0].MatcherDecl); + + EXPECT_EQ("aramA", Comps[1].TypedText); + EXPECT_EQ("Matcher hasParamA", Comps[1].MatcherDecl); EXPECT_EQ("arent(", Comps[2].TypedText); EXPECT_EQ(