mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-07 01:47:09 +00:00
[ASTMatcher] Add templateName matcher.
Reviewers: klimek Subscribers: klimek, cfe-commits Differential Revision: https://reviews.llvm.org/D22963 llvm-svn: 277155
This commit is contained in:
parent
4cb699260c
commit
b33b02e9f0
@ -1318,6 +1318,17 @@ templateArgument()
|
||||
</pre></td></tr>
|
||||
|
||||
|
||||
<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>></td><td class="name" onclick="toggle('templateName0')"><a name="templateName0Anchor">templateName</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>>...</td></tr>
|
||||
<tr><td colspan="4" class="doc" id="templateName0"><pre>Matches template name.
|
||||
|
||||
Given
|
||||
template <typename T> class X { };
|
||||
X<int> xi;
|
||||
templateName()
|
||||
matches 'X' in X<int>.
|
||||
</pre></td></tr>
|
||||
|
||||
|
||||
<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>></td><td class="name" onclick="toggle('typeLoc0')"><a name="typeLoc0Anchor">typeLoc</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TypeLoc.html">TypeLoc</a>>...</td></tr>
|
||||
<tr><td colspan="4" class="doc" id="typeLoc0"><pre>Matches TypeLocs in the clang AST.
|
||||
</pre></td></tr>
|
||||
@ -5353,6 +5364,19 @@ classTemplateSpecializationDecl(
|
||||
</pre></td></tr>
|
||||
|
||||
|
||||
<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('refersToTemplate0')"><a name="refersToTemplate0Anchor">refersToTemplate</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateName.html">TemplateName</a>> InnerMatcher</td></tr>
|
||||
<tr><td colspan="4" class="doc" id="refersToTemplate0"><pre>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>
|
||||
</pre></td></tr>
|
||||
|
||||
|
||||
<tr><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1TemplateArgument.html">TemplateArgument</a>></td><td class="name" onclick="toggle('refersToType0')"><a name="refersToType0Anchor">refersToType</a></td><td>Matcher<<a href="http://clang.llvm.org/doxygen/classclang_1_1QualType.html">QualType</a>> InnerMatcher</td></tr>
|
||||
<tr><td colspan="4" class="doc" id="refersToType0"><pre>Matches a TemplateArgument that refers to a certain type.
|
||||
|
||||
|
@ -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<TemplateArgument> {};
|
||||
|
||||
template <>
|
||||
struct DynTypedNode::BaseConverter<
|
||||
TemplateName, void> : public ValueConverter<TemplateName> {};
|
||||
|
||||
template <>
|
||||
struct DynTypedNode::BaseConverter<
|
||||
NestedNameSpecifierLoc,
|
||||
|
@ -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.
|
||||
///
|
||||
|
@ -23,6 +23,7 @@ namespace ast_type_traits {
|
||||
const ASTNodeKind::KindInfo ASTNodeKind::AllKindInfo[] = {
|
||||
{ NKI_None, "<None>" },
|
||||
{ NKI_None, "TemplateArgument" },
|
||||
{ NKI_None, "TemplateName" },
|
||||
{ NKI_None, "NestedNameSpecifierLoc" },
|
||||
{ NKI_None, "QualType" },
|
||||
{ NKI_None, "TypeLoc" },
|
||||
@ -109,6 +110,8 @@ void DynTypedNode::print(llvm::raw_ostream &OS,
|
||||
const PrintingPolicy &PP) const {
|
||||
if (const TemplateArgument *TA = get<TemplateArgument>())
|
||||
TA->print(PP, OS);
|
||||
else if (const TemplateName *TN = get<TemplateName>())
|
||||
TN->print(OS, PP);
|
||||
else if (const NestedNameSpecifier *NNS = get<NestedNameSpecifier>())
|
||||
NNS->print(OS, PP);
|
||||
else if (const NestedNameSpecifierLoc *NNSL = get<NestedNameSpecifierLoc>())
|
||||
|
@ -391,6 +391,7 @@ RegistryMaps::RegistryMaps() {
|
||||
REGISTER_MATCHER(switchCase);
|
||||
REGISTER_MATCHER(switchStmt);
|
||||
REGISTER_MATCHER(templateArgument);
|
||||
REGISTER_MATCHER(templateName);
|
||||
REGISTER_MATCHER(templateArgumentCountIs);
|
||||
REGISTER_MATCHER(templateSpecializationType);
|
||||
REGISTER_MATCHER(templateTypeParmType);
|
||||
|
@ -543,6 +543,14 @@ TEST(Matcher, MatchesTypeTemplateArgument) {
|
||||
asString("int"))))));
|
||||
}
|
||||
|
||||
TEST(Matcher, MatchesTemplateTemplateArgument) {
|
||||
EXPECT_TRUE(matches("template<template <typename> class S> class X {};"
|
||||
"template<typename T> class Y {};"
|
||||
"X<Y> xi;",
|
||||
classTemplateSpecializationDecl(hasAnyTemplateArgument(
|
||||
refersToTemplate(templateName())))));
|
||||
}
|
||||
|
||||
TEST(Matcher, MatchesDeclarationReferenceTemplateArgument) {
|
||||
EXPECT_TRUE(matches(
|
||||
"struct B { int next; };"
|
||||
|
Loading…
x
Reference in New Issue
Block a user