Skip to content

Commit 06cfa9a

Browse files
committed
Rust: Address format fixes suggested in review
1 parent a545361 commit 06cfa9a

File tree

2 files changed

+46
-16
lines changed

2 files changed

+46
-16
lines changed

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -990,12 +990,20 @@ private module Cached {
990990
)
991991
}
992992

993-
private module IsInstantiationOfInput implements IsInstantiationOfSig<ReceiverExpr> {
993+
private module IsInstantiationOfInput implements IsInstantiationOfInputSig<ReceiverExpr> {
994+
pragma[nomagic]
994995
predicate potentialInstantiationOf(ReceiverExpr receiver, TypeAbstraction impl, TypeMention sub) {
995996
methodCandidate(receiver.resolveTypeAt(TypePath::nil()), receiver.getField(),
996997
receiver.getNumberOfArgs(), impl) and
997998
sub = impl.(ImplTypeAbstraction).getSelfTy()
998999
}
1000+
1001+
predicate relevantTypeMention(TypeMention sub) {
1002+
exists(TypeAbstraction impl |
1003+
methodCandidate(_, _, _, impl) and
1004+
sub = impl.(ImplTypeAbstraction).getSelfTy()
1005+
)
1006+
}
9991007
}
10001008

10011009
bindingset[item, name]

shared/typeinference/codeql/typeinference/internal/TypeInference.qll

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ module Make1<LocationSig Location, InputSig1<Location> Input1> {
238238
}
239239

240240
/** A class that represents a type tree. */
241-
signature class TypeTreeSig {
241+
private signature class TypeTreeSig {
242242
Type resolveTypeAt(TypePath path);
243243

244244
/** Gets a textual representation of this type abstraction. */
@@ -357,21 +357,38 @@ module Make1<LocationSig Location, InputSig1<Location> Input1> {
357357
result = tm.resolveTypeAt(TypePath::nil())
358358
}
359359

360-
signature module IsInstantiationOfSig<TypeTreeSig App> {
360+
signature module IsInstantiationOfInputSig<TypeTreeSig App> {
361361
/**
362362
* Holds if `abs` is a type abstraction under which `tm` occurs and if
363363
* `app` is potentially the result of applying the abstraction to type
364364
* some type argument.
365365
*/
366366
predicate potentialInstantiationOf(App app, TypeAbstraction abs, TypeMention tm);
367+
368+
/**
369+
* Holds if `constraint` might occur as the third argument of
370+
* `potentialInstantiationOf`. Defaults to simply projecting the third
371+
* argument of `potentialInstantiationOf`.
372+
*/
373+
default predicate relevantTypeMention(TypeMention tm) { potentialInstantiationOf(_, _, tm) }
367374
}
368375

369-
module IsInstantiationOf<TypeTreeSig App, IsInstantiationOfSig<App> Input> {
376+
/**
377+
* Provides functionality for determining if a type is a possible
378+
* instantiation of a type mention containing type parameters.
379+
*/
380+
module IsInstantiationOf<TypeTreeSig App, IsInstantiationOfInputSig<App> Input> {
370381
private import Input
371382

372383
/** Gets the `i`th path in `tm` per some arbitrary order. */
384+
pragma[nomagic]
373385
private TypePath getNthPath(TypeMention tm, int i) {
374-
result = rank[i + 1](TypePath path | exists(tm.resolveTypeAt(path)) | path)
386+
result =
387+
rank[i + 1](TypePath path |
388+
exists(tm.resolveTypeAt(path)) and relevantTypeMention(tm)
389+
|
390+
path
391+
)
375392
}
376393

377394
/**
@@ -389,6 +406,7 @@ module Make1<LocationSig Location, InputSig1<Location> Input1> {
389406
)
390407
}
391408

409+
pragma[nomagic]
392410
private predicate satisfiesConcreteTypesFromIndex(
393411
App app, TypeAbstraction abs, TypeMention tm, int i
394412
) {
@@ -398,7 +416,7 @@ module Make1<LocationSig Location, InputSig1<Location> Input1> {
398416
if i = 0 then any() else satisfiesConcreteTypesFromIndex(app, abs, tm, i - 1)
399417
}
400418

401-
pragma[inline]
419+
pragma[nomagic]
402420
private predicate satisfiesConcreteTypes(App app, TypeAbstraction abs, TypeMention tm) {
403421
satisfiesConcreteTypesFromIndex(app, abs, tm, max(int i | exists(getNthPath(tm, i))))
404422
}
@@ -417,18 +435,19 @@ module Make1<LocationSig Location, InputSig1<Location> Input1> {
417435
* arbitrary order, if any.
418436
*/
419437
private TypePath getNthTypeParameterPath(TypeMention tm, TypeParameter tp, int i) {
420-
result = rank[i + 1](TypePath path | tp = tm.resolveTypeAt(path) | path)
438+
result =
439+
rank[i + 1](TypePath path | tp = tm.resolveTypeAt(path) and relevantTypeMention(tm) | path)
421440
}
422441

442+
pragma[nomagic]
423443
private predicate typeParametersEqualFromIndex(
424-
App app, TypeAbstraction abs, TypeMention tm, TypeParameter tp, int i
444+
App app, TypeAbstraction abs, TypeMention tm, TypeParameter tp, Type t, int i
425445
) {
426446
potentialInstantiationOf(app, abs, tm) and
427-
exists(TypePath path, TypePath nextPath |
447+
exists(TypePath path |
428448
path = getNthTypeParameterPath(tm, tp, i) and
429-
nextPath = getNthTypeParameterPath(tm, tp, i - 1) and
430-
app.resolveTypeAt(path) = app.resolveTypeAt(nextPath) and
431-
if i = 1 then any() else typeParametersEqualFromIndex(app, abs, tm, tp, i - 1)
449+
t = app.resolveTypeAt(path) and
450+
if i = 0 then any() else typeParametersEqualFromIndex(app, abs, tm, tp, t, i - 1)
432451
)
433452
}
434453

@@ -443,7 +462,7 @@ module Make1<LocationSig Location, InputSig1<Location> Input1> {
443462
exists(int n | n = max(int i | exists(getNthTypeParameterPath(tm, tp, i))) |
444463
// If the largest index is 0, then there are no equalities to check as
445464
// the type parameter only occurs once.
446-
if n = 0 then any() else typeParametersEqualFromIndex(app, abs, tm, tp, n)
465+
if n = 0 then any() else typeParametersEqualFromIndex(app, abs, tm, tp, _, n)
447466
)
448467
)
449468
}
@@ -488,7 +507,6 @@ module Make1<LocationSig Location, InputSig1<Location> Input1> {
488507
* - `Pair<int, string>` is _not_ an instantiation of `Pair<string, string>`
489508
*/
490509
predicate isInstantiationOf(App app, TypeAbstraction abs, TypeMention tm) {
491-
potentialInstantiationOf(app, abs, tm) and
492510
satisfiesConcreteTypes(app, abs, tm) and
493511
typeParametersHaveEqualInstantiation(app, abs, tm)
494512
}
@@ -513,7 +531,7 @@ module Make1<LocationSig Location, InputSig1<Location> Input1> {
513531
)
514532
}
515533

516-
module IsInstantiationOfInput implements IsInstantiationOfSig<TypeMention> {
534+
module IsInstantiationOfInput implements IsInstantiationOfInputSig<TypeMention> {
517535
pragma[nomagic]
518536
private predicate typeCondition(Type type, TypeAbstraction abs, TypeMention lhs) {
519537
conditionSatisfiesConstraint(abs, lhs, _) and type = resolveTypeMentionRoot(lhs)
@@ -954,7 +972,7 @@ module Make1<LocationSig Location, InputSig1<Location> Input1> {
954972
Location getLocation() { result = a.getLocation() }
955973
}
956974

957-
private module IsInstantiationOfInput implements IsInstantiationOfSig<RelevantAccess> {
975+
private module IsInstantiationOfInput implements IsInstantiationOfInputSig<RelevantAccess> {
958976
predicate potentialInstantiationOf(
959977
RelevantAccess at, TypeAbstraction abs, TypeMention cond
960978
) {
@@ -965,6 +983,10 @@ module Make1<LocationSig Location, InputSig1<Location> Input1> {
965983
countConstraintImplementations(type, constraint) > 1
966984
)
967985
}
986+
987+
predicate relevantTypeMention(TypeMention constraint) {
988+
rootTypesSatisfaction(_, _, _, constraint, _)
989+
}
968990
}
969991

970992
/**

0 commit comments

Comments
 (0)