Skip to content

Commit fce7247

Browse files
committed
Rust: Refactor type inference to use new TypeItem class
1 parent da99bbf commit fce7247

File tree

5 files changed

+87
-148
lines changed

5 files changed

+87
-148
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: 34 additions & 57 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,49 @@ 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() }
135132
}
136133

137-
/** An enum type. */
138-
class EnumType extends Type, TEnum {
139-
private Enum enum;
140-
141-
EnumType() { this = TEnum(enum) }
134+
/** A struct type. */
135+
class StructType extends DataType {
136+
StructType() { super.getTypeItem() instanceof Struct }
142137

143-
/** Gets the enum that this enum type represents. */
144-
Enum getEnum() { result = enum }
138+
/** Gets the struct that this struct type represents. */
139+
override Struct getTypeItem() { result = super.getTypeItem() }
140+
}
145141

146-
override TypeParameter getPositionalTypeParameter(int i) {
147-
result = TTypeParamTypeParameter(enum.getGenericParamList().getTypeParam(i))
148-
}
142+
/** An enum type. */
143+
class EnumType extends DataType {
144+
EnumType() { super.getTypeItem() instanceof Enum }
149145

150-
override TypeMention getTypeParameterDefault(int i) {
151-
result = enum.getGenericParamList().getTypeParam(i).getDefaultType()
152-
}
146+
/** Gets the enum that this enum type represents. */
147+
override Enum getTypeItem() { result = super.getTypeItem() }
148+
}
153149

154-
override string toString() { result = enum.getName().getText() }
150+
/** A union type. */
151+
class UnionType extends DataType {
152+
UnionType() { super.getTypeItem() instanceof Union }
155153

156-
override Location getLocation() { result = enum.getLocation() }
154+
/** Gets the union that this union type represents. */
155+
override Union getTypeItem() { result = super.getTypeItem() }
157156
}
158157

159158
/** A trait type. */
@@ -186,35 +185,13 @@ class TraitType extends Type, TTrait {
186185
override Location getLocation() { result = trait.getLocation() }
187186
}
188187

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-
211188
/**
212189
* An array type.
213190
*
214191
* Array types like `[i64; 5]` are modeled as normal generic types.
215192
*/
216193
class ArrayType extends StructType {
217-
ArrayType() { this.getStruct() instanceof Builtins::ArrayType }
194+
ArrayType() { this.getTypeItem() instanceof Builtins::ArrayType }
218195

219196
override string toString() { result = "[;]" }
220197
}
@@ -231,7 +208,7 @@ TypeParamTypeParameter getArrayTypeParameter() {
231208
* with a single type argument.
232209
*/
233210
class RefType extends StructType {
234-
RefType() { this.getStruct() instanceof Builtins::RefType }
211+
RefType() { this.getTypeItem() instanceof Builtins::RefType }
235212

236213
override string toString() { result = "&" }
237214
}
@@ -321,7 +298,7 @@ class ImplTraitReturnType extends ImplTraitType {
321298
* with a single type argument.
322299
*/
323300
class SliceType extends StructType {
324-
SliceType() { this.getStruct() instanceof Builtins::SliceType }
301+
SliceType() { this.getTypeItem() instanceof Builtins::SliceType }
325302

326303
override string toString() { result = "[]" }
327304
}
@@ -347,13 +324,13 @@ TypeParamTypeParameter getPtrTypeParameter() {
347324
}
348325

349326
class PtrMutType extends PtrType {
350-
PtrMutType() { this.getStruct() instanceof Builtins::PtrMutType }
327+
PtrMutType() { this.getTypeItem() instanceof Builtins::PtrMutType }
351328

352329
override string toString() { result = "*mut" }
353330
}
354331

355332
class PtrConstType extends PtrType {
356-
PtrConstType() { this.getStruct() instanceof Builtins::PtrConstType }
333+
PtrConstType() { this.getTypeItem() instanceof Builtins::PtrConstType }
357334

358335
override string toString() { result = "*const" }
359336
}
@@ -615,7 +592,7 @@ pragma[nomagic]
615592
predicate validSelfType(Type t) {
616593
t instanceof RefType
617594
or
618-
exists(Struct s | t = TStruct(s) |
595+
exists(Struct s | t = TDataType(s) |
619596
s instanceof BoxStruct or
620597
s instanceof RcStruct or
621598
s instanceof ArcStruct or

0 commit comments

Comments
 (0)