Skip to content

Commit d65e0a9

Browse files
authored
QL: Get rid of getParent overrides
1 parent 752194b commit d65e0a9

4 files changed

Lines changed: 41 additions & 94 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

extractor/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ edition = "2018"
1010
flate2 = "1.0"
1111
node-types = { path = "../node-types" }
1212
tree-sitter = "0.19"
13-
tree-sitter-ql = { git = "https://github.com/tausbn/tree-sitter-ql.git", rev = "a10eec1b5b3b6e9a24f3be45a30a7a4b7c0afe2e" }
13+
tree-sitter-ql = { git = "https://github.com/tausbn/tree-sitter-ql.git", rev = "f95bfc0bc4f2cda7f6f0bf608360fdee7574b003" }
1414
clap = "2.33"
1515
tracing = "0.1"
1616
tracing-subscriber = { version = "0.2", features = ["env-filter"] }

generator/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ edition = "2018"
1010
node-types = { path = "../node-types" }
1111
tracing = "0.1"
1212
tracing-subscriber = { version = "0.2", features = ["env-filter"] }
13-
tree-sitter-ql = { git = "https://github.com/tausbn/tree-sitter-ql.git", rev = "a10eec1b5b3b6e9a24f3be45a30a7a4b7c0afe2e" }
13+
tree-sitter-ql = { git = "https://github.com/tausbn/tree-sitter-ql.git", rev = "f95bfc0bc4f2cda7f6f0bf608360fdee7574b003" }

ql/src/codeql_ql/ast/Ast.qll

Lines changed: 38 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,7 @@ class AstNode extends TAstNode {
2424
)
2525
}
2626

27-
AstNode getParent() {
28-
toGenerated(result) = toGenerated(this).getParent() and
29-
not result = this
30-
or
31-
result.getAChild(_) = this
32-
}
27+
AstNode getParent() { result.getAChild(_) = this }
3328

3429
/**
3530
* Gets a child of this node, which can also be retrieved using a predicate
@@ -88,7 +83,6 @@ class Select extends TSelect, AstNode {
8883
}
8984

9085
override string getAPrimaryQlClass() { result = "Select" }
91-
// TODO: Getters for VarDecls, Where-clause, selects.
9286
}
9387

9488
/**
@@ -112,13 +106,20 @@ class Predicate extends TPredicate, AstNode {
112106

113107
int getArity() { result = count(getParameter(_)) }
114108

109+
/**
110+
* Gets the return type (if any) of the predicate.
111+
*/
112+
TypeExpr getReturnType() { none() }
113+
115114
// TODO: ReturnType.
116115
override AstNode getAChild(string pred) {
117116
result = super.getAChild(pred)
118117
or
119118
pred = "getBody" and result = this.getBody()
120119
or
121120
exists(int i | pred = indexedMember("getParameter", i) and result = this.getParameter(i))
121+
or
122+
pred = "getReturnType" and result = this.getReturnType()
122123
}
123124

124125
override string getAPrimaryQlClass() { result = "Predicate" }
@@ -155,12 +156,6 @@ class PredicateExpr extends TPredicateExpr, AstNode {
155156

156157
Predicate getResolvedPredicate() { resolvePredicateExpr(this, result) }
157158

158-
override AstNode getParent() {
159-
result = super.getParent()
160-
or
161-
this in [result.(ClasslessPredicate).getAlias(), result.(HigherOrderFormula).getInput(_)]
162-
}
163-
164159
override AstNode getAChild(string pred) {
165160
result = super.getAChild(pred)
166161
or
@@ -179,11 +174,13 @@ class ClasslessPredicate extends TClasslessPredicate, Predicate, ModuleDeclarati
179174

180175
ClasslessPredicate() { this = TClasslessPredicate(member, pred) }
181176

182-
final PredicateExpr getAlias() {
177+
final AstNode getAlias() {
183178
exists(Generated::PredicateAliasBody alias |
184179
alias.getParent() = pred and
185180
toGenerated(result).getParent() = alias
186181
)
182+
or
183+
toGenerated(result) = pred.getChild(_).(Generated::HigherOrderTerm)
187184
}
188185

189186
final override predicate isPrivate() {
@@ -201,6 +198,8 @@ class ClasslessPredicate extends TClasslessPredicate, Predicate, ModuleDeclarati
201198
rank[i](Generated::VarDecl decl, int index | decl = pred.getChild(index) | decl order by index)
202199
}
203200

201+
override TypeExpr getReturnType() { toGenerated(result) = pred.getReturnType() }
202+
204203
override AstNode getAChild(string pred_name) {
205204
result = Predicate.super.getAChild(pred_name)
206205
or
@@ -209,6 +208,8 @@ class ClasslessPredicate extends TClasslessPredicate, Predicate, ModuleDeclarati
209208
pred_name = "getBody" and result = this.getBody()
210209
or
211210
exists(int i | pred_name = indexedMember("getParameter", i) and result = this.getParameter(i))
211+
or
212+
pred_name = "getReturnType" and result = this.getReturnType()
212213
}
213214
}
214215

@@ -226,8 +227,6 @@ class ClassPredicate extends TClassPredicate, Predicate {
226227

227228
override string getAPrimaryQlClass() { result = "ClassPredicate" }
228229

229-
override Class getParent() { result.getAClassPredicate() = this }
230-
231230
predicate isPrivate() {
232231
exists(Generated::ClassMember member |
233232
pred = member.getChild(_) and
@@ -244,12 +243,16 @@ class ClassPredicate extends TClassPredicate, Predicate {
244243

245244
predicate overrides(ClassPredicate other) { predOverrides(this, other) }
246245

246+
override TypeExpr getReturnType() { toGenerated(result) = pred.getReturnType() }
247+
247248
override AstNode getAChild(string pred_name) {
248249
result = super.getAChild(pred_name)
249250
or
250251
pred_name = "getBody" and result = this.getBody()
251252
or
252253
exists(int i | pred_name = indexedMember("getParameter", i) and result = this.getParameter(i))
254+
or
255+
pred_name = "getReturnType" and result = this.getReturnType()
253256
}
254257
}
255258

@@ -265,9 +268,7 @@ class CharPred extends TCharPred, Predicate {
265268

266269
override Formula getBody() { toGenerated(result) = pred.getBody() }
267270

268-
override string getName() { result = getParent().getName() }
269-
270-
override Class getParent() { result.getCharPred() = this }
271+
override string getName() { result = getParent().(Class).getName() }
271272

272273
override AstNode getAChild(string pred_name) {
273274
result = super.getAChild(pred_name)
@@ -301,16 +302,6 @@ class VarDecl extends TVarDecl, VarDef {
301302

302303
override string getAPrimaryQlClass() { result = "VarDecl" }
303304

304-
override AstNode getParent() {
305-
result = super.getParent()
306-
or
307-
result.(Class).getAField() = this
308-
or
309-
result.(Aggregate).getAnArgument() = this
310-
or
311-
result.(Quantifier).getAnArgument() = this
312-
}
313-
314305
TypeExpr getType() { toGenerated(result) = var.getChild(0) }
315306

316307
predicate isPrivate() {
@@ -372,19 +363,11 @@ class TypeExpr extends TType, AstNode {
372363
*/
373364
ModuleExpr getModule() { toGenerated(result) = type.getChild() }
374365

375-
override AstNode getParent() {
376-
result = super.getParent()
377-
or
378-
result.(InlineCast).getType() = this
379-
or
380-
result.(Class).getAliasType() = this
381-
or
382-
result.(Class).getUnionMember() = this
383-
or
384-
result.(MemberCall).getSuperType() = this
385-
}
386-
387366
Type getResolvedType() { resolveTypeExpr(this, result) }
367+
368+
override ModuleExpr getAChild(string pred) {
369+
result = super.getAChild(pred) or
370+
pred = "getModule" and result = this.getModule() }
388371
}
389372

390373
/**
@@ -431,12 +414,6 @@ class Module extends TModule, ModuleDeclaration {
431414
* Something that can be member of a module.
432415
*/
433416
class ModuleMember extends TModuleMember, AstNode {
434-
override AstNode getParent() {
435-
result = super.getParent()
436-
or
437-
this in [result.(Module).getAMember(), result.(TopLevel).getAMember()]
438-
}
439-
440417
/** Holds if this member is declared as `private`. */
441418
predicate isPrivate() { none() } // TODO: Implement.
442419
}
@@ -585,14 +562,16 @@ class NewTypeBranch extends TNewTypeBranch, TypeDeclaration {
585562
/** Gets a field in this branch. */
586563
VarDecl getField(int i) {
587564
toGenerated(result) =
588-
rank[i](Generated::VarDecl var | var = branch.getChild(i) | var order by i)
565+
rank[i + 1](Generated::VarDecl var, int index |
566+
var = branch.getChild(index)
567+
|
568+
var order by index
569+
)
589570
}
590571

591572
/** Gets the body of this branch. */
592573
Formula getBody() { toGenerated(result) = branch.getChild(_).(Generated::Body).getChild() }
593574

594-
override NewType getParent() { result.getABranch() = this }
595-
596575
override AstNode getAChild(string pred) {
597576
result = super.getAChild(pred)
598577
or
@@ -715,6 +694,7 @@ class InlineCast extends TInlineCast, Expr {
715694
Expr getBase() { toGenerated(result) = expr.getChild(0) }
716695

717696
override AstNode getAChild(string pred) {
697+
result = super.getAChild(pred) or
718698
pred = "getType" and result = this.getType()
719699
or
720700
pred = "getBase" and result = this.getBase()
@@ -777,17 +757,7 @@ class Import extends TImport, ModuleMember, ModuleRef {
777757
}
778758

779759
/** A formula, such as `x = 6 and y < 5`. */
780-
class Formula extends TFormula, AstNode {
781-
override AstNode getParent() {
782-
result = super.getParent()
783-
or
784-
result.(Predicate).getBody() = this
785-
or
786-
result.(Aggregate).getRange() = this
787-
or
788-
result.(NewTypeBranch).getBody() = this
789-
}
790-
}
760+
class Formula extends TFormula, AstNode { }
791761

792762
/** An `and` formula, with 2 or more operands. */
793763
class Conjunction extends TConjunction, AstNode, Formula {
@@ -914,6 +884,8 @@ class ComparisonFormula extends TComparisonFormula, Formula {
914884
pred = "getLeftOperand" and result = this.getLeftOperand()
915885
or
916886
pred = "getRightOperand" and result = this.getRightOperand()
887+
or
888+
pred = "getOperator" and result = this.getOperator()
917889
}
918890
}
919891

@@ -1215,6 +1187,8 @@ class Aggregate extends TAggregate, Expr {
12151187
or
12161188
pred = indexedMember("getOrderBy", i) and result = this.getOrderBy(i)
12171189
)
1190+
or
1191+
pred = "getRange" and result = this.getRange()
12181192
}
12191193
}
12201194

@@ -1262,16 +1236,6 @@ class AsExpr extends TAsExpr, VarDef, Expr {
12621236
*/
12631237
Expr getInnerExpr() { toGenerated(result) = asExpr.getChild(0) }
12641238

1265-
override AstNode getParent() {
1266-
result = super.getParent()
1267-
or
1268-
result.(Aggregate).getExpr(_) = this
1269-
or
1270-
result.(ExprAggregate).getExpr(_) = this
1271-
or
1272-
result.(Select).getExpr(_) = this
1273-
}
1274-
12751239
override AstNode getAChild(string pred) {
12761240
result = super.getAChild(pred)
12771241
or
@@ -1356,19 +1320,7 @@ class Negation extends TNegation, Formula {
13561320
}
13571321

13581322
/** An expression, such as `x+4`. */
1359-
class Expr extends TExpr, AstNode {
1360-
override AstNode getParent() {
1361-
result = super.getParent()
1362-
or
1363-
result.(Call).getArgument(_) = this
1364-
or
1365-
result.(Aggregate).getOrderBy(_) = this
1366-
or
1367-
result.(ExprAggregate).getOrderBy(_) = this
1368-
or
1369-
result.(Select).getOrderBy(_) = this
1370-
}
1371-
}
1323+
class Expr extends TExpr, AstNode { }
13721324

13731325
class ExprAnnotation extends TExprAnnotation, Expr {
13741326
Generated::ExprAnnotation expr_anno;
@@ -1624,16 +1576,11 @@ class ModuleExpr extends TModuleExpr, ModuleRef {
16241576

16251577
override string getAPrimaryQlClass() { result = "ModuleExpr" }
16261578

1627-
override AstNode getParent() {
1628-
result = super.getParent() or
1629-
result.(PredicateCall).getQualifier() = this or
1630-
result.(PredicateExpr).getQualifier() = this or
1631-
result.(Module).getAlias() = this
1632-
}
1633-
16341579
override AstNode getAChild(string pred) {
16351580
result = super.getAChild(pred)
16361581
or
16371582
pred = "getQualifier" and result = this.getQualifier()
16381583
}
16391584
}
1585+
1586+
private AstNode noParent() { not exists(result.getParent()) and not result instanceof TopLevel }

0 commit comments

Comments
 (0)