[Clang][ASTMatcher] Add dependentTemplateSpecializationType matcher (#121435)

Fixes https://github.com/llvm/llvm-project/issues/121307
This commit is contained in:
kefan cao 2025-01-04 05:32:02 +08:00 committed by GitHub
parent 18b47373cb
commit d85b22ed5d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 43 additions and 4 deletions

View File

@ -2546,6 +2546,17 @@ Example matches T::type
};
</pre></td></tr>
<tr><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('dependentTemplateSpecializationType0')"><a name="dependentTemplateSpecializationType0Anchor">dependentTemplateSpecializationType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DependentTemplateSpecializationType.html">DependentTemplateSpecializationType</a>&gt;...</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&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1Type.html">Type</a>&gt;</td><td class="name" onclick="toggle('deducedTemplateSpecializationType0')"><a name="deducedTemplateSpecializationType0Anchor">deducedTemplateSpecializationType</a></td><td>Matcher&lt;<a href="https://clang.llvm.org/doxygen/classclang_1_1DeducedTemplateSpecializationType.html">DeducedTemplateSpecializationType</a>&gt;...</td></tr>
<tr><td colspan="4" class="doc" id="deducedTemplateSpecializationType0"><pre>Matches C++17 deduced template specialization types, e.g. deduced class
template types.

View File

@ -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
------------

View File

@ -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.
///

View File

@ -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));

View File

@ -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);

View File

@ -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>"

View File

@ -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"))))));