|
9 | 9 | */
|
10 | 10 |
|
11 | 11 | import ql
|
12 |
| - |
13 |
| -/** Holds if `pred` overrides super predicate `sup` by forwarding via `mc`. */ |
14 |
| -private predicate forwardingOverride(ClassPredicate pred, MemberCall mc, ClassPredicate sup) { |
15 |
| - pred.overrides(sup) and |
16 |
| - mc.getBase() instanceof Super and |
17 |
| - mc.getTarget() = sup and |
18 |
| - not exists(pred.getQLDoc()) and |
19 |
| - forall(int i, VarDecl p | p = pred.getParameter(i) | mc.getArgument(i) = p.getAnAccess()) and |
20 |
| - ( |
21 |
| - pred.getBody() = |
22 |
| - any(ComparisonFormula comp | |
23 |
| - comp.getOperator() = "=" and |
24 |
| - comp.getAnOperand() instanceof ResultAccess and |
25 |
| - comp.getAnOperand() = mc and |
26 |
| - pred.getReturnType() = sup.getReturnType() |
27 |
| - ) |
28 |
| - or |
29 |
| - pred.getBody() = mc |
30 |
| - ) |
31 |
| -} |
32 |
| - |
33 |
| -private predicate forwardingOverrideProj(ClassPredicate pred, ClassPredicate sup) { |
34 |
| - forwardingOverride(pred, _, sup) |
35 |
| -} |
36 |
| - |
37 |
| -private ClassPredicate getUltimateDef(ClassPredicate p) { |
38 |
| - forwardingOverrideProj*(p, result) and |
39 |
| - not forwardingOverrideProj(result, _) |
40 |
| -} |
41 |
| - |
42 |
| -private predicate redundantOverride(ClassPredicate pred, ClassPredicate sup) { |
43 |
| - exists(MemberCall mc | |
44 |
| - forwardingOverride(pred, mc, sup) and |
45 |
| - // overridden to provide more precise QL doc |
46 |
| - not exists(pred.getQLDoc()) and |
47 |
| - // overridden to disambiguate |
48 |
| - not exists(ClassPredicate other | |
49 |
| - getUltimateDef(sup) != getUltimateDef(other) and |
50 |
| - pred.getDeclaringType().getASuperType+() = other.getDeclaringType() and |
51 |
| - not sup.overrides*(other) and |
52 |
| - other.getName() = pred.getName() and |
53 |
| - other.getArity() = pred.getArity() |
54 |
| - ) |
55 |
| - ) |
56 |
| -} |
| 12 | +import codeql_ql.style.RedundantOverrideQuery |
57 | 13 |
|
58 | 14 | from ClassPredicate pred, ClassPredicate sup
|
59 | 15 | where redundantOverride(pred, sup)
|
|
0 commit comments