@@ -88,7 +88,23 @@ private module Cached {
8888 )
8989 }
9090
91+ /**
92+ * Holds if `mc` is a `this.method()` call to a predicate defined in the same class.
93+ * helps avoid spuriously resolving to predicates in super-classes.
94+ */
95+ private predicate resolveSelfClassCalls ( MemberCall mc , PredicateOrBuiltin p ) {
96+ exists ( Class c |
97+ mc .getBase ( ) instanceof ThisAccess and
98+ c = mc .getEnclosingPredicate ( ) .getParent ( ) and
99+ p = c .getClassPredicate ( mc .getMemberName ( ) ) and
100+ p .getArity ( ) = mc .getNumberOfArguments ( )
101+ )
102+ }
103+
91104 private predicate resolveMemberCall ( MemberCall mc , PredicateOrBuiltin p ) {
105+ resolveSelfClassCalls ( mc , p )
106+ or
107+ not resolveSelfClassCalls ( mc , _) and
92108 exists ( Type t |
93109 t = mc .getBase ( ) .getType ( ) and
94110 p = t .getClassPredicate ( mc .getMemberName ( ) , mc .getNumberOfArguments ( ) )
@@ -188,20 +204,20 @@ module PredConsistency {
188204 c > 1 and
189205 resolvePredicateExpr ( pe , p )
190206 }
191- // This can happen with parameterized modules
192- /*
193- * query predicate multipleResolveCall(Call call, int c, PredicateOrBuiltin p) {
194- * c =
195- * strictcount(PredicateOrBuiltin p0 |
196- * resolveCall(call, p0) and
197- * // aliases are expected to resolve to multiple.
198- * not exists(p0.(ClasslessPredicate).getAlias()) and
199- * // overridden predicates may have multiple targets
200- * not p0.(ClassPredicate).isOverride()
201- * ) and
202- * c > 1 and
203- * resolveCall(call, p)
204- * }
205- */
206207
208+ query predicate multipleResolveCall ( Call call , int c , PredicateOrBuiltin p ) {
209+ c =
210+ strictcount ( PredicateOrBuiltin p0 |
211+ resolveCall ( call , p0 ) and
212+ // aliases are expected to resolve to multiple.
213+ not exists ( p0 .( ClasslessPredicate ) .getAlias ( ) ) and
214+ // overridden predicates may have multiple targets
215+ not p0 .( ClassPredicate ) .isOverride ( ) and
216+ not p0 instanceof Relation // <- DB relations resolve to both a relation and a predicate.
217+ ) and
218+ c > 1 and
219+ resolveCall ( call , p ) and
220+ // parameterized modules are expected to resolve to multiple.
221+ not exists ( Predicate sig | not exists ( sig .getBody ( ) ) and resolveCall ( call , sig ) )
207222 }
223+ }
0 commit comments