@@ -977,7 +977,12 @@ class ClassTemplateInstantiation extends Class {
977
977
* specialization - see `FullClassTemplateSpecialization` and
978
978
* `PartialClassTemplateSpecialization`).
979
979
*/
980
- abstract class ClassTemplateSpecialization extends Class {
980
+ class ClassTemplateSpecialization extends Class {
981
+ ClassTemplateSpecialization ( ) {
982
+ isFullClassTemplateSpecialization ( this ) or
983
+ isPartialClassTemplateSpecialization ( this )
984
+ }
985
+
981
986
/**
982
987
* Gets the primary template for the specialization, for example on
983
988
* `S<T,int>`, the result is `S<T,U>`.
@@ -997,6 +1002,16 @@ abstract class ClassTemplateSpecialization extends Class {
997
1002
override string getAPrimaryQlClass ( ) { result = "ClassTemplateSpecialization" }
998
1003
}
999
1004
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
+
1000
1015
/**
1001
1016
* A full specialization of a class template. For example `MyTemplateClass<int>`
1002
1017
* in the following code is a `FullClassTemplateSpecialization`:
@@ -1013,19 +1028,31 @@ abstract class ClassTemplateSpecialization extends Class {
1013
1028
* ```
1014
1029
*/
1015
1030
class 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 ) }
1025
1032
1026
1033
override string getAPrimaryQlClass ( ) { result = "FullClassTemplateSpecialization" }
1027
1034
}
1028
1035
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
+
1029
1056
/**
1030
1057
* A partial specialization of a class template. For example `MyTemplateClass<int, T>`
1031
1058
* in the following code is a `PartialClassTemplateSpecialization`:
@@ -1042,25 +1069,7 @@ class FullClassTemplateSpecialization extends ClassTemplateSpecialization {
1042
1069
* ```
1043
1070
*/
1044
1071
class 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 ) }
1064
1073
1065
1074
override string getAPrimaryQlClass ( ) { result = "PartialClassTemplateSpecialization" }
1066
1075
}
0 commit comments