From: Haojian Wu Date: Fri, 29 Jul 2016 15:45:11 +0000 (+0000) Subject: [ASTMatcher] Add templateName matcher. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2e5a2bfe39601158549bc6f2ad421d85a7a464ad;p=clang [ASTMatcher] Add templateName matcher. Reviewers: klimek Subscribers: klimek, cfe-commits Differential Revision: https://reviews.llvm.org/D22963 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@277155 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/docs/LibASTMatchersReference.html b/docs/LibASTMatchersReference.html index 222b39fcf5..cb6a05e3e9 100644 --- a/docs/LibASTMatchersReference.html +++ b/docs/LibASTMatchersReference.html @@ -1318,6 +1318,17 @@ templateArgument() +Matcher<TemplateName>templateNameMatcher<TemplateName>... +
Matches template name.
+
+Given
+  template <typename T> class X { };
+  X<int> xi;
+templateName()
+  matches 'X' in X<int>.
+
+ + Matcher<TypeLoc>typeLocMatcher<TypeLoc>...
Matches TypeLocs in the clang AST.
 
@@ -5353,6 +5364,19 @@ classTemplateSpecializationDecl( +Matcher<TemplateArgument>refersToTemplateMatcher<TemplateName> InnerMatcher +
Matches a TemplateArgument that refers to a certain template.
+
+Given
+  template<template <typename> class S> class X {};
+  template<typename T> class Y {};"
+  X<Y> xi;
+classTemplateSpecializationDecl(hasAnyTemplateArgument(
+    refersToTemplate(templateName())))
+  matches the specialization X<Y>
+
+ + Matcher<TemplateArgument>refersToTypeMatcher<QualType> InnerMatcher
Matches a TemplateArgument that refers to a certain type.
 
diff --git a/include/clang/AST/ASTTypeTraits.h b/include/clang/AST/ASTTypeTraits.h
index ad301b1482..51d60a90a1 100644
--- a/include/clang/AST/ASTTypeTraits.h
+++ b/include/clang/AST/ASTTypeTraits.h
@@ -121,6 +121,7 @@ private:
   enum NodeKindId {
     NKI_None,
     NKI_TemplateArgument,
+    NKI_TemplateName,
     NKI_NestedNameSpecifierLoc,
     NKI_QualType,
     NKI_TypeLoc,
@@ -175,6 +176,7 @@ private:
   };
 KIND_TO_KIND_ID(CXXCtorInitializer)
 KIND_TO_KIND_ID(TemplateArgument)
+KIND_TO_KIND_ID(TemplateName)
 KIND_TO_KIND_ID(NestedNameSpecifier)
 KIND_TO_KIND_ID(NestedNameSpecifierLoc)
 KIND_TO_KIND_ID(QualType)
@@ -470,6 +472,10 @@ template <>
 struct DynTypedNode::BaseConverter<
     TemplateArgument, void> : public ValueConverter {};
 
+template <>
+struct DynTypedNode::BaseConverter<
+    TemplateName, void> : public ValueConverter {};
+
 template <>
 struct DynTypedNode::BaseConverter<
     NestedNameSpecifierLoc,
diff --git a/include/clang/ASTMatchers/ASTMatchers.h b/include/clang/ASTMatchers/ASTMatchers.h
index 6f59b82520..4e7e721c91 100644
--- a/include/clang/ASTMatchers/ASTMatchers.h
+++ b/include/clang/ASTMatchers/ASTMatchers.h
@@ -446,6 +446,17 @@ const internal::VariadicAllOfMatcher cxxCtorInitializer;
 ///   matches 'int' in C.
 const internal::VariadicAllOfMatcher templateArgument;
 
+/// \brief Matches template name.
+///
+/// Given
+/// \code
+///   template  class X { };
+///   X xi;
+/// \endcode
+/// templateName()
+///   matches 'X' in X.
+const internal::VariadicAllOfMatcher templateName;
+
 /// \brief Matches non-type template parameter declarations.
 ///
 /// Given
@@ -774,6 +785,24 @@ AST_MATCHER_P(TemplateArgument, refersToType,
   return InnerMatcher.matches(Node.getAsType(), Finder, Builder);
 }
 
+/// \brief Matches a TemplateArgument that refers to a certain template.
+///
+/// Given
+/// \code
+///   template