Skip to content

Commit 27e5251

Browse files
committed
Rust: Add resolveRootType predicate instead of using resolveType recursively
1 parent 804ffdb commit 27e5251

File tree

1 file changed

+21
-19
lines changed

1 file changed

+21
-19
lines changed

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

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ class NonAliasPathTypeMention extends PathTypeMention {
161161
// If a type argument is not given in the path, then we use the default for
162162
// the type parameter if one exists for the type.
163163
not exists(this.getPositionalTypeArgument0(i)) and
164-
result = this.resolveType().getTypeParameterDefault(i) and
164+
result = this.resolveRootType().getTypeParameterDefault(i) and
165165
// Defaults only apply to type mentions in type annotations
166166
this = any(PathTypeRepr ptp).getPath().getQualifier*()
167167
}
@@ -171,7 +171,7 @@ class NonAliasPathTypeMention extends PathTypeMention {
171171
private TypeMention getTypeMentionForTypeParameter(TypeParameter tp) {
172172
exists(int i |
173173
result = this.getPositionalTypeArgument(pragma[only_bind_into](i)) and
174-
tp = this.resolveType().getTypeParameter(pragma[only_bind_into](i))
174+
tp = this.resolveRootType().getTypeParameter(pragma[only_bind_into](i))
175175
)
176176
or
177177
exists(TypeAlias alias |
@@ -205,25 +205,27 @@ class NonAliasPathTypeMention extends PathTypeMention {
205205
)
206206
}
207207

208+
Type resolveRootType() {
209+
result = TStruct(resolved)
210+
or
211+
result = TEnum(resolved)
212+
or
213+
exists(TraitItemNode trait | trait = resolved |
214+
// If this is a `Self` path, then it resolves to the implicit `Self`
215+
// type parameter, otherwise it is a trait bound.
216+
if this = trait.getASelfPath()
217+
then result = TSelfTypeParameter(trait)
218+
else result = TTrait(trait)
219+
)
220+
or
221+
result = TTypeParamTypeParameter(resolved)
222+
or
223+
result = TAssociatedTypeTypeParameter(resolved)
224+
}
225+
208226
override Type resolveTypeAt(TypePath typePath) {
209227
typePath.isEmpty() and
210-
(
211-
result = TStruct(resolved)
212-
or
213-
result = TEnum(resolved)
214-
or
215-
exists(TraitItemNode trait | trait = resolved |
216-
// If this is a `Self` path, then it resolves to the implicit `Self`
217-
// type parameter, otherwise it is a trait bound.
218-
if this = trait.getASelfPath()
219-
then result = TSelfTypeParameter(trait)
220-
else result = TTrait(trait)
221-
)
222-
or
223-
result = TTypeParamTypeParameter(resolved)
224-
or
225-
result = TAssociatedTypeTypeParameter(resolved)
226-
)
228+
result = this.resolveRootType()
227229
or
228230
exists(TypeParameter tp, TypePath suffix |
229231
result = this.getTypeMentionForTypeParameter(tp).resolveTypeAt(suffix) and

0 commit comments

Comments
 (0)