Skip to content

Commit f826262

Browse files
committed
C#: Re-factor CollectionType into an abstract class and introduce getElementType predicate.
1 parent 1055084 commit f826262

1 file changed

Lines changed: 32 additions & 9 deletions

File tree

csharp/ql/lib/semmle/code/csharp/commons/Collections.qll

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)