diff options
author | Haojian Wu <hokein@google.com> | 2016-07-29 15:45:11 +0000 |
---|---|---|
committer | Haojian Wu <hokein@google.com> | 2016-07-29 15:45:11 +0000 |
commit | 2e5a2bfe39601158549bc6f2ad421d85a7a464ad (patch) | |
tree | 70b0c228158461ed13cbebdbec35bcb872c1a703 /include/clang/ASTMatchers | |
parent | e1aebbab1ef3ca0040fa262fe7bcf4830200d2c9 (diff) |
[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
Diffstat (limited to 'include/clang/ASTMatchers')
-rw-r--r-- | include/clang/ASTMatchers/ASTMatchers.h | 29 |
1 files changed, 29 insertions, 0 deletions
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> cxxCtorInitializer; /// matches 'int' in C<int>. const internal::VariadicAllOfMatcher<TemplateArgument> templateArgument; +/// \brief Matches template name. +/// +/// Given +/// \code +/// template <typename T> class X { }; +/// X<int> xi; +/// \endcode +/// templateName() +/// matches 'X' in X<int>. +const internal::VariadicAllOfMatcher<TemplateName> 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<template <typename> class S> class X {}; +/// template<typename T> class Y {};" +/// X<Y> xi; +/// \endcode +/// classTemplateSpecializationDecl(hasAnyTemplateArgument( +/// refersToTemplate(templateName()))) +/// matches the specialization \c X<Y> +AST_MATCHER_P(TemplateArgument, refersToTemplate, + internal::Matcher<TemplateName>, InnerMatcher) { + if (Node.getKind() != TemplateArgument::Template) + return false; + return InnerMatcher.matches(Node.getAsTemplate(), Finder, Builder); +} + /// \brief Matches a canonical TemplateArgument that refers to a certain /// declaration. /// |