Here is a patch to SVN with the requested changes (documentation, renamed and added to registry):
Index: docs/LibASTMatchersReference.html =================================================================== --- docs/LibASTMatchersReference.html (revision 262512) +++ docs/LibASTMatchersReference.html (working copy) @@ -2412,7 +2412,7 @@ </pre></td></tr> -<tr><td>Matcher<<a href=" http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasName0')"><a name="hasName0Anchor">hasName</a></td><td>std::string Name</td></tr> +<tr><td>Matcher<<a href=" http://clang.llvm.org/doxygen/classclang_1_1NamedDecl.html">NamedDecl</a>></td><td class="name" onclick="toggle('hasName0')"><a name="hasName0Anchor">hasName</a></td><td>std::string Name</td></tr> <tr><td colspan="4" class="doc" id="hasName0"><pre>Matches NamedDecl nodes that have the specified name. Supports specifying enclosing namespaces or classes by prefixing the name @@ -3107,7 +3107,7 @@ This matcher is only provided as a performance optimization of hasName. hasAnyName(a, b, c) - is equivalent but faster than + is equivalent to, but faster than anyOf(hasName(a), hasName(b), hasName(c)) </pre></td></tr> @@ -4180,6 +4180,16 @@ </pre></td></tr> +<tr><td>Matcher<<a href=" http://clang.llvm.org/doxygen/classclang_1_1FieldDecl.html">FieldDecl</a>></td><td class="name" onclick="toggle('hasDefaultMemberInitializer0')"><a name="hasDefaultMemberInitializer0Anchor">hasDefaultMemberInitializer</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="hasDefaultMemberInitializer0"><pre>Matches a C++ default member initializer matching the given matcher + +Given: + class A { int x = 1; }; + +hasDefaultMemberInitializer(integerLiteral()) matches int x = 1 +</pre></td></tr> + + <tr><td>Matcher<<a href=" http://clang.llvm.org/doxygen/classclang_1_1ForStmt.html">ForStmt</a>></td><td class="name" onclick="toggle('hasBody1')"><a name="hasBody1Anchor">hasBody</a></td><td>Matcher<<a href=" http://clang.llvm.org/doxygen/classclang_1_1Stmt.html">Stmt</a>> InnerMatcher</td></tr> <tr><td colspan="4" class="doc" id="hasBody1"><pre>Matches a 'for', 'while', 'do while' statement or a function definition that has a given body. Index: include/clang/ASTMatchers/ASTMatchers.h =================================================================== --- include/clang/ASTMatchers/ASTMatchers.h (revision 262512) +++ include/clang/ASTMatchers/ASTMatchers.h (working copy) @@ -2848,6 +2848,20 @@ return Node.isMemberInitializer(); } +/// \brief Matches a C++ default member initializer matching the given matcher +/// +/// Given: +/// \code +/// class A { int x = 1; }; +/// \endcode +/// +/// \c hasDefaultMemberInitializer(integerLiteral()) matches int x = 1 +AST_MATCHER_P(FieldDecl, hasDefaultMemberInitializer, + internal::Matcher<Expr>, InnerMatcher) { + return Node.hasInClassInitializer() + && InnerMatcher.matches(*Node.getInClassInitializer(), Finder, Builder); +} + /// \brief Matches any argument of a call expression or a constructor call /// expression. /// Index: lib/ASTMatchers/Dynamic/Registry.cpp =================================================================== --- lib/ASTMatchers/Dynamic/Registry.cpp (revision 262512) +++ lib/ASTMatchers/Dynamic/Registry.cpp (working copy) @@ -210,6 +210,7 @@ REGISTER_MATCHER(hasDeclaration); REGISTER_MATCHER(hasDeclContext); REGISTER_MATCHER(hasDeducedType); + REGISTER_MATCHER(hasDefaultMemberInitializer); REGISTER_MATCHER(hasDescendant); REGISTER_MATCHER(hasDestinationType); REGISTER_MATCHER(hasEitherOperand); Index: unittests/ASTMatchers/ASTMatchersTest.cpp =================================================================== --- unittests/ASTMatchers/ASTMatchersTest.cpp (revision 262512) +++ unittests/ASTMatchers/ASTMatchersTest.cpp (working copy) @@ -2402,6 +2402,13 @@ hasName("E"))))); } +TEST(Matcher, inDefaultMemberInitializer) { + EXPECT_TRUE(matches("class A{ int x = 1; };", + fieldDecl(hasDefaultMemberInitializer(integerLiteral())))); + EXPECT_TRUE(notMatches("class A{ int x; void b() { x = 1; } };", + fieldDecl(hasDefaultMemberInitializer(integerLiteral())))); +} + TEST(Matcher, NewExpression) { StatementMatcher New = cxxNewExpr(); On Wed, Mar 2, 2016 at 12:23 PM Richard Smith <rich...@metafoo.co.uk> wrote: > On Wed, Mar 2, 2016 at 12:06 PM, Aaron Ballman via cfe-commits > <cfe-commits@lists.llvm.org> wrote: > > On Wed, Mar 2, 2016 at 2:01 PM, Julian Bangert via cfe-commits > > <cfe-commits@lists.llvm.org> wrote: > >> This adds a matcher for C++ in Class initializers. > >> > >> --- > >> include/clang/ASTMatchers/ASTMatchers.h | 14 ++++++++++++++ > >> unittests/ASTMatchers/ASTMatchersTest.cpp | 7 +++++++ > >> 2 files changed, 21 insertions(+) > >> > >> diff --git a/include/clang/ASTMatchers/ASTMatchers.h > >> b/include/clang/ASTMatchers/ASTMatchers.h > > > > Please also generate the AST matcher documentation by running > > dump-ast-matchers.py and register the function in Registry.cpp. Also, > > if you can provide an svn patch instead of a git patch, it would be > > appreciated (especially if you need someone to commit on your behalf). > > Please also name this "hasDefaultMemberInitializer" to match the C++ > standard's (fairly new) name for this feature. We'll rename Clang's > internals to match at some point soon. > > >> index 21a4969..6b0a5d6 100644 > >> --- a/include/clang/ASTMatchers/ASTMatchers.h > >> +++ b/include/clang/ASTMatchers/ASTMatchers.h > >> @@ -2848,6 +2848,20 @@ AST_MATCHER(CXXCtorInitializer, > isMemberInitializer) > >> { > >> return Node.isMemberInitializer(); > >> } > >> > >> +/// \brief Matches a C++ inClassInitializer matching the given matcher > >> +/// > >> +/// Given: > >> +/// \code > >> +/// class A { int x = 1; }; > >> +/// \endcode > >> +/// > >> +/// \c hasInClassInitializer(integerLiteral()) matches int x = 1 > >> +AST_MATCHER_P(FieldDecl, hasInClassInitializer, > >> + internal::Matcher<Expr>, InnerMatcher) { > >> + return Node.hasInClassInitializer() > >> + && InnerMatcher.matches(*Node.getInClassInitializer(), Finder, > >> Builder); > >> +} > >> + > >> /// \brief Matches any argument of a call expression or a constructor > call > >> /// expression. > >> /// > >> diff --git a/unittests/ASTMatchers/ASTMatchersTest.cpp > >> b/unittests/ASTMatchers/ASTMatchersTest.cpp > >> index 133dc70..15776d7 100644 > >> --- a/unittests/ASTMatchers/ASTMatchersTest.cpp > >> +++ b/unittests/ASTMatchers/ASTMatchersTest.cpp > >> @@ -2402,6 +2402,13 @@ TEST(HasAnyConstructorInitializer, > IsBaseInitializer) > >> { > >> hasName("E"))))); > >> } > >> > >> +TEST(Matcher, inClassInitializer) { > >> + EXPECT_TRUE(matches("class A{ int x = 1; };", > >> + > fieldDecl(hasInClassInitializer(integerLiteral())))); > >> + EXPECT_FALSE(matches("class A{ int x; void b() { x = 1; } };", > > > > This should use EXPECT_TRUE and notMatches. > > > > ~Aaron > > > >> + > >> fieldDecl(hasInClassInitializer(integerLiteral())))); > >> +} > >> + > >> TEST(Matcher, NewExpression) { > >> StatementMatcher New = cxxNewExpr(); > >> > >> > >> _______________________________________________ > >> cfe-commits mailing list > >> cfe-commits@lists.llvm.org > >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits > >> > > _______________________________________________ > > cfe-commits mailing list > > cfe-commits@lists.llvm.org > > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits