Skip to content

Commit c86c9ec

Browse files
committed
QL: Move query logic into library
1 parent 50a5300 commit c86c9ec

File tree

2 files changed

+47
-45
lines changed

2 files changed

+47
-45
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import ql
2+
3+
/** Holds if `pred` overrides super predicate `sup` by forwarding via `mc`. */
4+
private predicate forwardingOverride(ClassPredicate pred, MemberCall mc, ClassPredicate sup) {
5+
pred.overrides(sup) and
6+
mc.getBase() instanceof Super and
7+
mc.getTarget() = sup and
8+
not exists(pred.getQLDoc()) and
9+
forall(int i, VarDecl p | p = pred.getParameter(i) | mc.getArgument(i) = p.getAnAccess()) and
10+
(
11+
pred.getBody() =
12+
any(ComparisonFormula comp |
13+
comp.getOperator() = "=" and
14+
comp.getAnOperand() instanceof ResultAccess and
15+
comp.getAnOperand() = mc and
16+
pred.getReturnType() = sup.getReturnType()
17+
)
18+
or
19+
pred.getBody() = mc
20+
)
21+
}
22+
23+
private predicate forwardingOverrideProj(ClassPredicate pred, ClassPredicate sup) {
24+
forwardingOverride(pred, _, sup)
25+
}
26+
27+
private ClassPredicate getUltimateDef(ClassPredicate p) {
28+
forwardingOverrideProj*(p, result) and
29+
not forwardingOverrideProj(result, _)
30+
}
31+
32+
predicate redundantOverride(ClassPredicate pred, ClassPredicate sup) {
33+
exists(MemberCall mc |
34+
forwardingOverride(pred, mc, sup) and
35+
// overridden to provide more precise QL doc
36+
not exists(pred.getQLDoc()) and
37+
// overridden to disambiguate
38+
not exists(ClassPredicate other |
39+
getUltimateDef(sup) != getUltimateDef(other) and
40+
pred.getDeclaringType().getASuperType+() = other.getDeclaringType() and
41+
not sup.overrides*(other) and
42+
other.getName() = pred.getName() and
43+
other.getArity() = pred.getArity()
44+
)
45+
)
46+
}

ql/ql/src/queries/style/RedundantOverride.ql

Lines changed: 1 addition & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -9,51 +9,7 @@
99
*/
1010

1111
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
5713

5814
from ClassPredicate pred, ClassPredicate sup
5915
where redundantOverride(pred, sup)

0 commit comments

Comments
 (0)