|
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