@@ -977,7 +977,12 @@ class ClassTemplateInstantiation extends Class {
977977 * specialization - see `FullClassTemplateSpecialization` and
978978 * `PartialClassTemplateSpecialization`).
979979 */
980- abstract class ClassTemplateSpecialization extends Class {
980+ class ClassTemplateSpecialization extends Class {
981+ ClassTemplateSpecialization ( ) {
982+ isFullClassTemplateSpecialization ( this ) or
983+ isPartialClassTemplateSpecialization ( this )
984+ }
985+
981986 /**
982987 * Gets the primary template for the specialization, for example on
983988 * `S<T,int>`, the result is `S<T,U>`.
@@ -997,6 +1002,16 @@ abstract class ClassTemplateSpecialization extends Class {
9971002 override string getAPrimaryQlClass ( ) { result = "ClassTemplateSpecialization" }
9981003}
9991004
1005+ private predicate isFullClassTemplateSpecialization ( Class c ) {
1006+ // This class has template arguments, but none of them involves a template parameter.
1007+ exists ( c .getATemplateArgument ( ) ) and
1008+ not exists ( Type ta | ta = c .getATemplateArgument ( ) and ta .involvesTemplateParameter ( ) ) and
1009+ // This class does not have any instantiations.
1010+ not exists ( c .( TemplateClass ) .getAnInstantiation ( ) ) and
1011+ // This class is not an instantiation of a class template.
1012+ not c instanceof ClassTemplateInstantiation
1013+ }
1014+
10001015/**
10011016 * A full specialization of a class template. For example `MyTemplateClass<int>`
10021017 * in the following code is a `FullClassTemplateSpecialization`:
@@ -1013,19 +1028,31 @@ abstract class ClassTemplateSpecialization extends Class {
10131028 * ```
10141029 */
10151030class FullClassTemplateSpecialization extends ClassTemplateSpecialization {
1016- FullClassTemplateSpecialization ( ) {
1017- // This class has template arguments, but none of them involves a template parameter.
1018- exists ( getATemplateArgument ( ) ) and
1019- not exists ( Type ta | ta = getATemplateArgument ( ) and ta .involvesTemplateParameter ( ) ) and
1020- // This class does not have any instantiations.
1021- not exists ( this .( TemplateClass ) .getAnInstantiation ( ) ) and
1022- // This class is not an instantiation of a class template.
1023- not this instanceof ClassTemplateInstantiation
1024- }
1031+ FullClassTemplateSpecialization ( ) { isFullClassTemplateSpecialization ( this ) }
10251032
10261033 override string getAPrimaryQlClass ( ) { result = "FullClassTemplateSpecialization" }
10271034}
10281035
1036+ private predicate isPartialClassTemplateSpecialization ( Class c ) {
1037+ /*
1038+ * (a) At least one of this class's template arguments involves a
1039+ * template parameter in some respect, for example T, T*, etc.
1040+ *
1041+ * (b) It is not the case that the n template arguments of this class
1042+ * are a set of n distinct template parameters.
1043+ *
1044+ * template <typename T,U> class X {}; // class template
1045+ * template <typename T> class X<T,T> {}; // partial class template specialization
1046+ * template <typename T> class X<T,int> {}; // partial class template specialization
1047+ * template <typename T> class Y {}; // class template
1048+ * template <typename T> class Y<T*> {}; // partial class template specialization
1049+ */
1050+
1051+ exists ( Type ta | ta = c .getATemplateArgument ( ) and ta .involvesTemplateParameter ( ) ) and
1052+ count ( TemplateParameter tp | tp = c .getATemplateArgument ( ) ) !=
1053+ count ( int i | exists ( c .getTemplateArgument ( i ) ) )
1054+ }
1055+
10291056/**
10301057 * A partial specialization of a class template. For example `MyTemplateClass<int, T>`
10311058 * in the following code is a `PartialClassTemplateSpecialization`:
@@ -1042,25 +1069,7 @@ class FullClassTemplateSpecialization extends ClassTemplateSpecialization {
10421069 * ```
10431070 */
10441071class PartialClassTemplateSpecialization extends ClassTemplateSpecialization {
1045- PartialClassTemplateSpecialization ( ) {
1046- /*
1047- * (a) At least one of this class's template arguments involves a
1048- * template parameter in some respect, for example T, T*, etc.
1049- *
1050- * (b) It is not the case that the n template arguments of this class
1051- * are a set of n distinct template parameters.
1052- *
1053- * template <typename T,U> class X {}; // class template
1054- * template <typename T> class X<T,T> {}; // partial class template specialization
1055- * template <typename T> class X<T,int> {}; // partial class template specialization
1056- * template <typename T> class Y {}; // class template
1057- * template <typename T> class Y<T*> {}; // partial class template specialization
1058- */
1059-
1060- exists ( Type ta | ta = getATemplateArgument ( ) and ta .involvesTemplateParameter ( ) ) and
1061- count ( TemplateParameter tp | tp = getATemplateArgument ( ) ) !=
1062- count ( int i | exists ( getTemplateArgument ( i ) ) )
1063- }
1072+ PartialClassTemplateSpecialization ( ) { isPartialClassTemplateSpecialization ( this ) }
10641073
10651074 override string getAPrimaryQlClass ( ) { result = "PartialClassTemplateSpecialization" }
10661075}
0 commit comments