Skip to content

Commit 29d88d0

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

1 file changed

Lines changed: 29 additions & 9 deletions

File tree

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

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,21 +54,41 @@ 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+
abstract Type getElementType();
60+
}
61+
62+
private class GenericCollectionType extends CollectionTypeImpl {
63+
private ConstructedType base;
64+
65+
GenericCollectionType() {
66+
base = this.getABaseType*() and
67+
base.getUnboundGeneric()
68+
.hasFullyQualifiedName(genericCollectionNamespaceName(), genericCollectionTypeName())
69+
}
70+
71+
override Type getElementType() {
72+
result = base.getTypeArgument(0) and base.getNumberOfTypeArguments() = 1
73+
}
74+
}
75+
76+
private class NonGenericCollectionType extends CollectionTypeImpl {
77+
NonGenericCollectionType() {
6078
exists(RefType base | base = this.getABaseType*() |
6179
base.hasFullyQualifiedName(collectionNamespaceName(), collectionTypeName())
62-
or
63-
base.(ConstructedType)
64-
.getUnboundGeneric()
65-
.hasFullyQualifiedName(genericCollectionNamespaceName(), genericCollectionTypeName())
6680
)
67-
or
68-
this instanceof ArrayType
6981
}
82+
83+
override Type getElementType() { none() }
7084
}
7185

86+
private class ArrayCollectionType extends CollectionTypeImpl instanceof ArrayType {
87+
override Type getElementType() { result = ArrayType.super.getElementType() }
88+
}
89+
90+
final class CollectionType = CollectionTypeImpl;
91+
7292
/**
7393
* A collection type that can be used as a `params` parameter type.
7494
*/

0 commit comments

Comments
 (0)