[Clang][ASTMatcher] Add dependentTemplateSpecializationType matcher (#121435)
Fixes https://github.com/llvm/llvm-project/issues/121307
This commit is contained in:
parent
18b47373cb
commit
d85b22ed5d
@ -2546,6 +2546,17 @@ Example matches T::type
|
||||
};
|
||||
</pre></td></tr>
|
||||
|
||||
<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('dependentTemplateSpecializationType0')"><a name="dependentTemplateSpecializationType0Anchor">dependentTemplateSpecializationType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentTemplateSpecializationType.html">DependentTemplateSpecializationType</a>>...</td></tr>
|
||||
<tr><td colspan="4" class="doc" id="dependentTemplateSpecializationType0"><pre>Matches a dependent template specialization type.
|
||||
|
||||
Example matches A<T>::template B<T>
|
||||
|
||||
template<typename T> struct A;
|
||||
template<typename T> struct declToImport {
|
||||
typename A<T>::template B<T> a;
|
||||
};
|
||||
</pre></td></tr>
|
||||
|
||||
<tr><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>></td><td class="name" onclick="toggle('deducedTemplateSpecializationType0')"><a name="deducedTemplateSpecializationType0Anchor">deducedTemplateSpecializationType</a></td><td>Matcher<<a href="https://clang.llvm.org/doxygen/classclang_1_1DeducedTemplateSpecializationType.html">DeducedTemplateSpecializationType</a>>...</td></tr>
|
||||
<tr><td colspan="4" class="doc" id="deducedTemplateSpecializationType0"><pre>Matches C++17 deduced template specialization types, e.g. deduced class
|
||||
template types.
|
||||
|
||||
@ -1114,6 +1114,8 @@ AST Matchers
|
||||
|
||||
- Add ``dependentNameType`` matcher to match a dependent name type.
|
||||
|
||||
- Add ``dependentTemplateSpecializationType`` matcher to match a dependent template specialization type.
|
||||
|
||||
clang-format
|
||||
------------
|
||||
|
||||
|
||||
@ -7721,6 +7721,18 @@ AST_MATCHER_P(DecayedType, hasDecayedType, internal::Matcher<QualType>,
|
||||
/// \endcode
|
||||
extern const AstTypeMatcher<DependentNameType> dependentNameType;
|
||||
|
||||
/// Matches a dependent template specialization type
|
||||
///
|
||||
/// Example matches A<T>::template B<T>
|
||||
/// \code
|
||||
/// template<typename T> struct A;
|
||||
/// template<typename T> struct declToImport {
|
||||
/// typename A<T>::template B<T> a;
|
||||
/// };
|
||||
/// \endcode
|
||||
extern const AstTypeMatcher<DependentTemplateSpecializationType>
|
||||
dependentTemplateSpecializationType;
|
||||
|
||||
/// Matches declarations whose declaration context, interpreted as a
|
||||
/// Decl, matches \c InnerMatcher.
|
||||
///
|
||||
|
||||
@ -1109,6 +1109,8 @@ const AstTypeMatcher<TemplateTypeParmType> templateTypeParmType;
|
||||
const AstTypeMatcher<InjectedClassNameType> injectedClassNameType;
|
||||
const AstTypeMatcher<DecayedType> decayedType;
|
||||
const AstTypeMatcher<DependentNameType> dependentNameType;
|
||||
const AstTypeMatcher<DependentTemplateSpecializationType>
|
||||
dependentTemplateSpecializationType;
|
||||
AST_TYPELOC_TRAVERSE_MATCHER_DEF(hasElementType,
|
||||
AST_POLYMORPHIC_SUPPORTED_TYPES(ArrayType,
|
||||
ComplexType));
|
||||
|
||||
@ -224,6 +224,7 @@ RegistryMaps::RegistryMaps() {
|
||||
REGISTER_MATCHER(declRefExpr);
|
||||
REGISTER_MATCHER(dependentNameType);
|
||||
REGISTER_MATCHER(dependentScopeDeclRefExpr);
|
||||
REGISTER_MATCHER(dependentTemplateSpecializationType);
|
||||
REGISTER_MATCHER(declStmt);
|
||||
REGISTER_MATCHER(declaratorDecl);
|
||||
REGISTER_MATCHER(decltypeType);
|
||||
|
||||
@ -763,10 +763,6 @@ TEST_P(ImportType, ImportPackExpansion) {
|
||||
implicitCastExpr(has(declRefExpr()))))))));
|
||||
}
|
||||
|
||||
const internal::VariadicDynCastAllOfMatcher<Type,
|
||||
DependentTemplateSpecializationType>
|
||||
dependentTemplateSpecializationType;
|
||||
|
||||
TEST_P(ImportType, ImportDependentTemplateSpecialization) {
|
||||
MatchVerifier<Decl> Verifier;
|
||||
testImport("template<typename T>"
|
||||
|
||||
@ -1926,6 +1926,21 @@ TEST_P(ASTMatchersTest, DependentNameType) {
|
||||
dependentNameType()));
|
||||
}
|
||||
|
||||
TEST_P(ASTMatchersTest, DependentTemplateSpecializationType) {
|
||||
if (!GetParam().isCXX()) {
|
||||
return;
|
||||
}
|
||||
|
||||
EXPECT_TRUE(matches(
|
||||
R"(
|
||||
template<typename T> struct A;
|
||||
template<typename T> struct declToImport {
|
||||
typename A<T>::template B<T> a;
|
||||
};
|
||||
)",
|
||||
dependentTemplateSpecializationType()));
|
||||
}
|
||||
|
||||
TEST_P(ASTMatchersTest, RecordType) {
|
||||
EXPECT_TRUE(matches("struct S {}; struct S s;",
|
||||
recordType(hasDeclaration(recordDecl(hasName("S"))))));
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user