[PATCH] D27447: [ASTMatcher] Add hasReplacementType matcher for SubstTemplateTypeParmType
This revision was automatically updated to reflect the committed changes. Closed by commit rL289042: [ASTMatcher] Add hasReplacementType matcher for SubstTemplateTypeParmType (authored by malcolm.parsons). Changed prior to commit: https://reviews.llvm.org/D27447?vs=80465=80741#toc Repository: rL LLVM https://reviews.llvm.org/D27447 Files: cfe/trunk/docs/LibASTMatchersReference.html cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp Index: cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp === --- cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp +++ cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp @@ -2204,5 +2204,22 @@ functionDecl(hasName("bar")); } +TEST(SubstTemplateTypeParmType, HasReplacementType) +{ + std::string Fragment = "template" + "double F(T t);" + "int i;" + "double j = F(i);"; + EXPECT_TRUE(matches(Fragment, substTemplateTypeParmType(hasReplacementType( +qualType(asString("int")); + EXPECT_TRUE(notMatches(Fragment, substTemplateTypeParmType(hasReplacementType( + qualType(asString("double")); + EXPECT_TRUE( + notMatches("template" + "double F();" + "double j = F<5>();", + substTemplateTypeParmType(hasReplacementType(qualType(); +} + } // namespace ast_matchers } // namespace clang Index: cfe/trunk/docs/LibASTMatchersReference.html === --- cfe/trunk/docs/LibASTMatchersReference.html +++ cfe/trunk/docs/LibASTMatchersReference.html @@ -5421,6 +5421,20 @@ +Matcherhttp://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html;>SubstTemplateTypeParmTypehasReplacementTypeMatcherhttp://clang.llvm.org/doxygen/classclang_1_1Type.html;>Type +Matches template type parameter substitutions that have a replacement +type that matches the provided matcher. + +Given + template typename T + double F(T t); + int i; + double j = F(i); + +substTemplateTypeParmType(hasReplacementType(type())) matches int + + + Matcherhttp://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html;>SwitchStmtforEachSwitchCaseMatcherhttp://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html;>SwitchCase InnerMatcher Matches each case or default statement belonging to the given switch statement. This matcher may produce multiple matches. Index: cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h === --- cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h +++ cfe/trunk/include/clang/ASTMatchers/ASTMatchers.h @@ -5019,6 +5019,22 @@ /// \c substTemplateTypeParmType() matches the type of 't' but not '1' AST_TYPE_MATCHER(SubstTemplateTypeParmType, substTemplateTypeParmType); +/// \brief Matches template type parameter substitutions that have a replacement +/// type that matches the provided matcher. +/// +/// Given +/// \code +/// template +/// double F(T t); +/// int i; +/// double j = F(i); +/// \endcode +/// +/// \c substTemplateTypeParmType(hasReplacementType(type())) matches int +AST_TYPE_TRAVERSE_MATCHER( +hasReplacementType, getReplacementType, +AST_POLYMORPHIC_SUPPORTED_TYPES(SubstTemplateTypeParmType)); + /// \brief Matches template type parameter types. /// /// Example matches T, but not int. Index: cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp === --- cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp +++ cfe/trunk/lib/ASTMatchers/Dynamic/Registry.cpp @@ -252,6 +252,7 @@ REGISTER_MATCHER(hasQualifier); REGISTER_MATCHER(hasRangeInit); REGISTER_MATCHER(hasReceiverType); + REGISTER_MATCHER(hasReplacementType); REGISTER_MATCHER(hasReturnValue); REGISTER_MATCHER(hasRHS); REGISTER_MATCHER(hasSelector); Index: cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp === --- cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp +++ cfe/trunk/unittests/ASTMatchers/ASTMatchersTraversalTest.cpp @@ -2204,5 +2204,22 @@ functionDecl(hasName("bar")); } +TEST(SubstTemplateTypeParmType, HasReplacementType) +{ + std::string Fragment = "template" + "double F(T t);" + "int i;" + "double j = F(i);"; + EXPECT_TRUE(matches(Fragment, substTemplateTypeParmType(hasReplacementType( +qualType(asString("int")); + EXPECT_TRUE(notMatches(Fragment, substTemplateTypeParmType(hasReplacementType( +
[PATCH] D27447: [ASTMatcher] Add hasReplacementType matcher for SubstTemplateTypeParmType
klimek accepted this revision. klimek added a comment. This revision is now accepted and ready to land. Looks good. Thanks! https://reviews.llvm.org/D27447 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D27447: [ASTMatcher] Add hasReplacementType matcher for SubstTemplateTypeParmType
malcolm.parsons updated this revision to Diff 80465. malcolm.parsons added a comment. Use AST_TYPE_TRAVERSE_MATCHER. https://reviews.llvm.org/D27447 Files: docs/LibASTMatchersReference.html include/clang/ASTMatchers/ASTMatchers.h lib/ASTMatchers/Dynamic/Registry.cpp unittests/ASTMatchers/ASTMatchersTraversalTest.cpp Index: unittests/ASTMatchers/ASTMatchersTraversalTest.cpp === --- unittests/ASTMatchers/ASTMatchersTraversalTest.cpp +++ unittests/ASTMatchers/ASTMatchersTraversalTest.cpp @@ -2204,5 +2204,22 @@ functionDecl(hasName("bar")); } +TEST(SubstTemplateTypeParmType, HasReplacementType) +{ + std::string Fragment = "template" + "double F(T t);" + "int i;" + "double j = F(i);"; + EXPECT_TRUE(matches(Fragment, substTemplateTypeParmType(hasReplacementType( +qualType(asString("int")); + EXPECT_TRUE(notMatches(Fragment, substTemplateTypeParmType(hasReplacementType( + qualType(asString("double")); + EXPECT_TRUE( + notMatches("template" + "double F();" + "double j = F<5>();", + substTemplateTypeParmType(hasReplacementType(qualType(); +} + } // namespace ast_matchers } // namespace clang Index: lib/ASTMatchers/Dynamic/Registry.cpp === --- lib/ASTMatchers/Dynamic/Registry.cpp +++ lib/ASTMatchers/Dynamic/Registry.cpp @@ -252,6 +252,7 @@ REGISTER_MATCHER(hasQualifier); REGISTER_MATCHER(hasRangeInit); REGISTER_MATCHER(hasReceiverType); + REGISTER_MATCHER(hasReplacementType); REGISTER_MATCHER(hasReturnValue); REGISTER_MATCHER(hasRHS); REGISTER_MATCHER(hasSelector); Index: include/clang/ASTMatchers/ASTMatchers.h === --- include/clang/ASTMatchers/ASTMatchers.h +++ include/clang/ASTMatchers/ASTMatchers.h @@ -5019,6 +5019,22 @@ /// \c substTemplateTypeParmType() matches the type of 't' but not '1' AST_TYPE_MATCHER(SubstTemplateTypeParmType, substTemplateTypeParmType); +/// \brief Matches template type parameter substitutions that have a replacement +/// type that matches the provided matcher. +/// +/// Given +/// \code +/// template +/// double F(T t); +/// int i; +/// double j = F(i); +/// \endcode +/// +/// \c substTemplateTypeParmType(hasReplacementType(type())) matches int +AST_TYPE_TRAVERSE_MATCHER( +hasReplacementType, getReplacementType, +AST_POLYMORPHIC_SUPPORTED_TYPES(SubstTemplateTypeParmType)); + /// \brief Matches template type parameter types. /// /// Example matches T, but not int. Index: docs/LibASTMatchersReference.html === --- docs/LibASTMatchersReference.html +++ docs/LibASTMatchersReference.html @@ -5421,6 +5421,20 @@ +Matcherhttp://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html;>SubstTemplateTypeParmTypehasReplacementTypeMatcherhttp://clang.llvm.org/doxygen/classclang_1_1Type.html;>Type +Matches template type parameter substitutions that have a replacement +type that matches the provided matcher. + +Given + template typename T + double F(T t); + int i; + double j = F(i); + +substTemplateTypeParmType(hasReplacementType(type())) matches int + + + Matcherhttp://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html;>SwitchStmtforEachSwitchCaseMatcherhttp://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html;>SwitchCase InnerMatcher Matches each case or default statement belonging to the given switch statement. This matcher may produce multiple matches. Index: unittests/ASTMatchers/ASTMatchersTraversalTest.cpp === --- unittests/ASTMatchers/ASTMatchersTraversalTest.cpp +++ unittests/ASTMatchers/ASTMatchersTraversalTest.cpp @@ -2204,5 +2204,22 @@ functionDecl(hasName("bar")); } +TEST(SubstTemplateTypeParmType, HasReplacementType) +{ + std::string Fragment = "template" + "double F(T t);" + "int i;" + "double j = F(i);"; + EXPECT_TRUE(matches(Fragment, substTemplateTypeParmType(hasReplacementType( +qualType(asString("int")); + EXPECT_TRUE(notMatches(Fragment, substTemplateTypeParmType(hasReplacementType( + qualType(asString("double")); + EXPECT_TRUE( + notMatches("template" + "double F();" + "double j = F<5>();", + substTemplateTypeParmType(hasReplacementType(qualType(); +} + } // namespace ast_matchers } // namespace clang Index: lib/ASTMatchers/Dynamic/Registry.cpp
[PATCH] D27447: [ASTMatcher] Add hasReplacementType matcher for SubstTemplateTypeParmType
klimek added inline comments. Comment at: include/clang/ASTMatchers/ASTMatchers.h:5034 +/// \c substTemplateTypeParmType(hasReplacementType(type())) matches int +AST_MATCHER_P(SubstTemplateTypeParmType, hasReplacementType, + ast_matchers::internal::Matcher, InnerMatcher) { Thanks for the patch! I think this should use: AST_TYPE_TRAVERSE_MATCHER instead. https://reviews.llvm.org/D27447 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D27447: [ASTMatcher] Add hasReplacementType matcher for SubstTemplateTypeParmType
malcolm.parsons created this revision. malcolm.parsons added reviewers: klimek, sbenza, bkramer. malcolm.parsons added a subscriber: cfe-commits. Herald added subscribers: rengolin, aemerson. Needed for https://reviews.llvm.org/D27166 https://reviews.llvm.org/D27447 Files: docs/LibASTMatchersReference.html include/clang/ASTMatchers/ASTMatchers.h lib/ASTMatchers/Dynamic/Registry.cpp unittests/ASTMatchers/ASTMatchersTraversalTest.cpp Index: unittests/ASTMatchers/ASTMatchersTraversalTest.cpp === --- unittests/ASTMatchers/ASTMatchersTraversalTest.cpp +++ unittests/ASTMatchers/ASTMatchersTraversalTest.cpp @@ -2204,5 +2204,22 @@ functionDecl(hasName("bar")); } +TEST(SubstTemplateTypeParmType, HasReplacementType) +{ + std::string Fragment = "template" + "double F(T t);" + "int i;" + "double j = F(i);"; + EXPECT_TRUE(matches(Fragment, substTemplateTypeParmType(hasReplacementType( +qualType(asString("int")); + EXPECT_TRUE(notMatches(Fragment, substTemplateTypeParmType(hasReplacementType( + qualType(asString("double")); + EXPECT_TRUE( + notMatches("template" + "double F();" + "double j = F<5>();", + substTemplateTypeParmType(hasReplacementType(qualType(); +} + } // namespace ast_matchers } // namespace clang Index: lib/ASTMatchers/Dynamic/Registry.cpp === --- lib/ASTMatchers/Dynamic/Registry.cpp +++ lib/ASTMatchers/Dynamic/Registry.cpp @@ -252,6 +252,7 @@ REGISTER_MATCHER(hasQualifier); REGISTER_MATCHER(hasRangeInit); REGISTER_MATCHER(hasReceiverType); + REGISTER_MATCHER(hasReplacementType); REGISTER_MATCHER(hasReturnValue); REGISTER_MATCHER(hasRHS); REGISTER_MATCHER(hasSelector); Index: include/clang/ASTMatchers/ASTMatchers.h === --- include/clang/ASTMatchers/ASTMatchers.h +++ include/clang/ASTMatchers/ASTMatchers.h @@ -5019,6 +5019,23 @@ /// \c substTemplateTypeParmType() matches the type of 't' but not '1' AST_TYPE_MATCHER(SubstTemplateTypeParmType, substTemplateTypeParmType); +/// \brief Matches template type parameter substitutions that have a replacement +/// type that matches the provided matcher. +/// +/// Given +/// \code +/// template +/// double F(T t); +/// int i; +/// double j = F(i); +/// \endcode +/// +/// \c substTemplateTypeParmType(hasReplacementType(type())) matches int +AST_MATCHER_P(SubstTemplateTypeParmType, hasReplacementType, + ast_matchers::internal::Matcher, InnerMatcher) { + return InnerMatcher.matches(Node.getReplacementType(), Finder, Builder); +} + /// \brief Matches template type parameter types. /// /// Example matches T, but not int. Index: docs/LibASTMatchersReference.html === --- docs/LibASTMatchersReference.html +++ docs/LibASTMatchersReference.html @@ -5421,6 +5421,20 @@ +Matcherhttp://clang.llvm.org/doxygen/classclang_1_1SubstTemplateTypeParmType.html;>SubstTemplateTypeParmTypehasReplacementTypeast_matchers::Matcherhttp://clang.llvm.org/doxygen/classclang_1_1QualType.html;>QualType InnerMatcher +Matches template type parameter substitutions that have a replacement +type that matches the provided matcher. + +Given + template typename T + double F(T t); + int i; + double j = F(i); + +substTemplateTypeParmType(hasReplacementType(type())) matches int + + + Matcherhttp://clang.llvm.org/doxygen/classclang_1_1SwitchStmt.html;>SwitchStmtforEachSwitchCaseMatcherhttp://clang.llvm.org/doxygen/classclang_1_1SwitchCase.html;>SwitchCase InnerMatcher Matches each case or default statement belonging to the given switch statement. This matcher may produce multiple matches. Index: unittests/ASTMatchers/ASTMatchersTraversalTest.cpp === --- unittests/ASTMatchers/ASTMatchersTraversalTest.cpp +++ unittests/ASTMatchers/ASTMatchersTraversalTest.cpp @@ -2204,5 +2204,22 @@ functionDecl(hasName("bar")); } +TEST(SubstTemplateTypeParmType, HasReplacementType) +{ + std::string Fragment = "template" + "double F(T t);" + "int i;" + "double j = F(i);"; + EXPECT_TRUE(matches(Fragment, substTemplateTypeParmType(hasReplacementType( +qualType(asString("int")); + EXPECT_TRUE(notMatches(Fragment, substTemplateTypeParmType(hasReplacementType( + qualType(asString("double")); + EXPECT_TRUE( + notMatches("template" + "double F();" +