@@ -54,21 +54,44 @@ private string genericCollectionTypeName() {
5454 ]
5555}
5656
57- /** A collection type. */
58- class CollectionType extends RefType {
59- CollectionType ( ) {
57+ /** A collection type */
58+ abstract private class CollectionTypeImpl extends RefType {
59+ /**
60+ * Gets the element type of this collection, for example `int` in `List<int>`.
61+ */
62+ abstract Type getElementType ( ) ;
63+ }
64+
65+ private class GenericCollectionType extends CollectionTypeImpl {
66+ private ConstructedType base ;
67+
68+ GenericCollectionType ( ) {
69+ base = this .getABaseType * ( ) and
70+ base .getUnboundGeneric ( )
71+ .hasFullyQualifiedName ( genericCollectionNamespaceName ( ) , genericCollectionTypeName ( ) )
72+ }
73+
74+ override Type getElementType ( ) {
75+ result = base .getTypeArgument ( 0 ) and base .getNumberOfTypeArguments ( ) = 1
76+ }
77+ }
78+
79+ private class NonGenericCollectionType extends CollectionTypeImpl {
80+ NonGenericCollectionType ( ) {
6081 exists ( RefType base | base = this .getABaseType * ( ) |
6182 base .hasFullyQualifiedName ( collectionNamespaceName ( ) , collectionTypeName ( ) )
62- or
63- base .( ConstructedType )
64- .getUnboundGeneric ( )
65- .hasFullyQualifiedName ( genericCollectionNamespaceName ( ) , genericCollectionTypeName ( ) )
6683 )
67- or
68- this instanceof ArrayType
6984 }
85+
86+ override Type getElementType ( ) { none ( ) }
7087}
7188
89+ private class ArrayCollectionType extends CollectionTypeImpl instanceof ArrayType {
90+ override Type getElementType ( ) { result = ArrayType .super .getElementType ( ) }
91+ }
92+
93+ final class CollectionType = CollectionTypeImpl ;
94+
7295/**
7396 * A collection type that can be used as a `params` parameter type.
7497 */
0 commit comments