Skip to content

Commit 6fa6093

Browse files
authored
Merge pull request #21067 from paldepind/rust/type-inference-use-type-item
Rust: Refactor type inference to use new `TypeItem` class
2 parents b5d3d95 + e0e493a commit 6fa6093

File tree

5 files changed

+91
-146
lines changed

5 files changed

+91
-146
lines changed

rust/ql/lib/codeql/rust/frameworks/rustcrypto/RustCrypto.qll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ class StreamCipherInit extends Cryptography::CryptographicOperation::Range {
3030
// extract the algorithm name from the type of `ce` or its receiver.
3131
exists(Type t, TypePath tp |
3232
t = inferType([call, call.(MethodCall).getReceiver()], tp) and
33-
rawAlgorithmName = t.(StructType).getStruct().(Addressable).getCanonicalPath().splitAt("::")
33+
rawAlgorithmName =
34+
t.(StructType).getTypeItem().(Addressable).getCanonicalPath().splitAt("::")
3435
) and
3536
algorithmName = simplifyAlgorithmName(rawAlgorithmName) and
3637
// only match a known cryptographic algorithm

rust/ql/lib/codeql/rust/internal/Type.qll

Lines changed: 38 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,8 @@ private predicate dynTraitTypeParameter(Trait trait, AstNode n) {
3232

3333
cached
3434
newtype TType =
35-
TStruct(Struct s) { Stages::TypeInferenceStage::ref() } or
36-
TEnum(Enum e) or
35+
TDataType(TypeItem ti) { Stages::TypeInferenceStage::ref() } or
3736
TTrait(Trait t) or
38-
TUnion(Union u) or
3937
TImplTraitType(ImplTraitTypeRepr impl) or
4038
TDynTraitType(Trait t) { t = any(DynTraitTypeRepr dt).getTrait() } or
4139
TNeverType() or
@@ -92,7 +90,7 @@ abstract class Type extends TType {
9290
class TupleType extends StructType {
9391
private int arity;
9492

95-
TupleType() { arity = this.getStruct().(Builtins::TupleType).getArity() }
93+
TupleType() { arity = this.getTypeItem().(Builtins::TupleType).getArity() }
9694

9795
/** Gets the arity of this tuple type. */
9896
int getArity() { result = arity }
@@ -112,48 +110,55 @@ class UnitType extends TupleType {
112110
override string toString() { result = "()" }
113111
}
114112

115-
/** A struct type. */
116-
class StructType extends Type, TStruct {
117-
private Struct struct;
113+
class DataType extends Type, TDataType {
114+
private TypeItem typeItem;
118115

119-
StructType() { this = TStruct(struct) }
116+
DataType() { this = TDataType(typeItem) }
120117

121-
/** Gets the struct that this struct type represents. */
122-
Struct getStruct() { result = struct }
118+
/** Gets the type item that this data type represents. */
119+
TypeItem getTypeItem() { result = typeItem }
123120

124121
override TypeParameter getPositionalTypeParameter(int i) {
125-
result = TTypeParamTypeParameter(struct.getGenericParamList().getTypeParam(i))
122+
result = TTypeParamTypeParameter(typeItem.getGenericParamList().getTypeParam(i))
126123
}
127124

128125
override TypeMention getTypeParameterDefault(int i) {
129-
result = struct.getGenericParamList().getTypeParam(i).getDefaultType()
126+
result = typeItem.getGenericParamList().getTypeParam(i).getDefaultType()
130127
}
131128

132-
override string toString() { result = struct.getName().getText() }
129+
override string toString() { result = typeItem.getName().getText() }
133130

134-
override Location getLocation() { result = struct.getLocation() }
131+
override Location getLocation() { result = typeItem.getLocation() }
132+
}
133+
134+
/** A struct type. */
135+
class StructType extends DataType {
136+
private Struct struct;
137+
138+
StructType() { struct = super.getTypeItem() }
139+
140+
/** Gets the struct that this struct type represents. */
141+
override Struct getTypeItem() { result = struct }
135142
}
136143

137144
/** An enum type. */
138-
class EnumType extends Type, TEnum {
145+
class EnumType extends DataType {
139146
private Enum enum;
140147

141-
EnumType() { this = TEnum(enum) }
148+
EnumType() { enum = super.getTypeItem() }
142149

143150
/** Gets the enum that this enum type represents. */
144-
Enum getEnum() { result = enum }
145-
146-
override TypeParameter getPositionalTypeParameter(int i) {
147-
result = TTypeParamTypeParameter(enum.getGenericParamList().getTypeParam(i))
148-
}
151+
override Enum getTypeItem() { result = enum }
152+
}
149153

150-
override TypeMention getTypeParameterDefault(int i) {
151-
result = enum.getGenericParamList().getTypeParam(i).getDefaultType()
152-
}
154+
/** A union type. */
155+
class UnionType extends DataType {
156+
private Union union;
153157

154-
override string toString() { result = enum.getName().getText() }
158+
UnionType() { union = super.getTypeItem() }
155159

156-
override Location getLocation() { result = enum.getLocation() }
160+
/** Gets the union that this union type represents. */
161+
override Union getTypeItem() { result = union }
157162
}
158163

159164
/** A trait type. */
@@ -186,35 +191,13 @@ class TraitType extends Type, TTrait {
186191
override Location getLocation() { result = trait.getLocation() }
187192
}
188193

189-
/** A union type. */
190-
class UnionType extends Type, TUnion {
191-
private Union union;
192-
193-
UnionType() { this = TUnion(union) }
194-
195-
/** Gets the union that this union type represents. */
196-
Union getUnion() { result = union }
197-
198-
override TypeParameter getPositionalTypeParameter(int i) {
199-
result = TTypeParamTypeParameter(union.getGenericParamList().getTypeParam(i))
200-
}
201-
202-
override TypeMention getTypeParameterDefault(int i) {
203-
result = union.getGenericParamList().getTypeParam(i).getDefaultType()
204-
}
205-
206-
override string toString() { result = union.getName().getText() }
207-
208-
override Location getLocation() { result = union.getLocation() }
209-
}
210-
211194
/**
212195
* An array type.
213196
*
214197
* Array types like `[i64; 5]` are modeled as normal generic types.
215198
*/
216199
class ArrayType extends StructType {
217-
ArrayType() { this.getStruct() instanceof Builtins::ArrayType }
200+
ArrayType() { this.getTypeItem() instanceof Builtins::ArrayType }
218201

219202
override string toString() { result = "[;]" }
220203
}
@@ -227,13 +210,13 @@ TypeParamTypeParameter getArrayTypeParameter() {
227210
abstract class RefType extends StructType { }
228211

229212
class RefMutType extends RefType {
230-
RefMutType() { this.getStruct() instanceof Builtins::RefMutType }
213+
RefMutType() { this.getTypeItem() instanceof Builtins::RefMutType }
231214

232215
override string toString() { result = "&mut" }
233216
}
234217

235218
class RefSharedType extends RefType {
236-
RefSharedType() { this.getStruct() instanceof Builtins::RefSharedType }
219+
RefSharedType() { this.getTypeItem() instanceof Builtins::RefSharedType }
237220

238221
override string toString() { result = "&" }
239222
}
@@ -330,7 +313,7 @@ class ImplTraitReturnType extends ImplTraitType {
330313
* with a single type argument.
331314
*/
332315
class SliceType extends StructType {
333-
SliceType() { this.getStruct() instanceof Builtins::SliceType }
316+
SliceType() { this.getTypeItem() instanceof Builtins::SliceType }
334317

335318
override string toString() { result = "[]" }
336319
}
@@ -356,13 +339,13 @@ TypeParamTypeParameter getPtrTypeParameter() {
356339
}
357340

358341
class PtrMutType extends PtrType {
359-
PtrMutType() { this.getStruct() instanceof Builtins::PtrMutType }
342+
PtrMutType() { this.getTypeItem() instanceof Builtins::PtrMutType }
360343

361344
override string toString() { result = "*mut" }
362345
}
363346

364347
class PtrConstType extends PtrType {
365-
PtrConstType() { this.getStruct() instanceof Builtins::PtrConstType }
348+
PtrConstType() { this.getTypeItem() instanceof Builtins::PtrConstType }
366349

367350
override string toString() { result = "*const" }
368351
}
@@ -624,7 +607,7 @@ pragma[nomagic]
624607
predicate validSelfType(Type t) {
625608
t instanceof RefType
626609
or
627-
exists(Struct s | t = TStruct(s) |
610+
exists(Struct s | t = TDataType(s) |
628611
s instanceof BoxStruct or
629612
s instanceof RcStruct or
630613
s instanceof ArcStruct or

0 commit comments

Comments
 (0)