Skip to content

Commit a286631

Browse files
authored
Merge pull request #20512 from geoffw0/stmtlist
Rust: Improve StmtList
2 parents 9688d84 + 1236e2b commit a286631

File tree

19 files changed

+152
-29
lines changed

19 files changed

+152
-29
lines changed

rust/ql/.generated.list

Lines changed: 3 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/ql/.gitattributes

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

rust/ql/lib/codeql/rust/controlflow/internal/ControlFlowGraphImpl.qll

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -266,23 +266,16 @@ module ExprTrees {
266266
}
267267
}
268268

269-
private AstNode getBlockChildNode(BlockExpr b, int i) {
270-
result = b.getStmtList().getStatement(i)
271-
or
272-
i = b.getStmtList().getNumberOfStatements() and
273-
result = b.getStmtList().getTailExpr()
274-
}
275-
276269
class AsyncBlockExprTree extends StandardTree, PreOrderTree, PostOrderTree, AsyncBlockExpr {
277-
override AstNode getChildNode(int i) { result = getBlockChildNode(this, i) }
270+
override AstNode getChildNode(int i) { result = this.getStmtList().getStmtOrExpr(i) }
278271

279272
override predicate propagatesAbnormal(AstNode child) { none() }
280273
}
281274

282275
class BlockExprTree extends StandardPostOrderTree, BlockExpr {
283276
BlockExprTree() { not this.isAsync() }
284277

285-
override AstNode getChildNode(int i) { result = getBlockChildNode(this, i) }
278+
override AstNode getChildNode(int i) { result = this.getStmtList().getStmtOrExpr(i) }
286279

287280
override predicate propagatesAbnormal(AstNode child) { child = this.getChildNode(_) }
288281
}

rust/ql/lib/codeql/rust/elements/StmtList.qll

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

rust/ql/lib/codeql/rust/elements/internal/StmtListImpl.qll

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
// generated by codegen, remove this comment if you wish to edit this file
21
/**
32
* This module provides a hand-modifiable wrapper around the generated class `StmtList`.
43
*
@@ -12,17 +11,48 @@ private import codeql.rust.elements.internal.generated.StmtList
1211
* be referenced directly.
1312
*/
1413
module Impl {
14+
// the following QLdoc is generated: if you need to edit it, do it in the schema file
1515
/**
16-
* A list of statements in a block.
16+
* A list of statements in a block, with an optional tail expression at the
17+
* end that determines the block's value.
1718
*
1819
* For example:
1920
* ```rust
2021
* {
2122
* let x = 1;
2223
* let y = 2;
24+
* x + y
2325
* }
2426
* // ^^^^^^^^^
2527
* ```
2628
*/
27-
class StmtList extends Generated::StmtList { }
29+
class StmtList extends Generated::StmtList {
30+
/**
31+
* Gets the `index`th statement or expression of this statement list (0-based).
32+
*
33+
* This includes both the statements and any tail expression in the statement list. To access
34+
* just the statements, use `getStatement`. To access just the tail expression, if any,
35+
* use `getTailExpr`.
36+
*/
37+
AstNode getStmtOrExpr(int index) {
38+
result = this.getStatement(index)
39+
or
40+
index = this.getNumberOfStatements() and
41+
result = this.getTailExpr()
42+
}
43+
44+
/**
45+
* Gets any of the statements or expressions of this statement list.
46+
*
47+
* This includes both the statements and any tail expression in the statement list. To access
48+
* just the statements, use `getAStatement`. To access just the tail expression, if any,
49+
* use `getTailExpr`.
50+
*/
51+
final AstNode getAStmtOrExpr() { result = this.getStmtOrExpr(_) }
52+
53+
/**
54+
* Gets the number of statements or expressions of this statement list.
55+
*/
56+
final int getNumberOfStmtOrExpr() { result = count(int i | exists(this.getStmtOrExpr(i))) }
57+
}
2858
}

rust/ql/lib/codeql/rust/elements/internal/generated/Raw.qll

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

rust/ql/lib/codeql/rust/elements/internal/generated/StmtList.qll

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

rust/ql/test/extractor-tests/generated/.generated_tests.list

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
instances
2-
| gen_stmt_list.rs:3:27:12:1 | StmtList |
3-
| gen_stmt_list.rs:7:5:10:5 | StmtList |
2+
| gen_stmt_list.rs:3:27:14:1 | StmtList |
3+
| gen_stmt_list.rs:8:5:12:5 | StmtList |
44
getAttr
55
getStatement
6-
| gen_stmt_list.rs:7:5:10:5 | StmtList | 0 | gen_stmt_list.rs:8:9:8:18 | let ... = 1 |
7-
| gen_stmt_list.rs:7:5:10:5 | StmtList | 1 | gen_stmt_list.rs:9:9:9:18 | let ... = 2 |
6+
| gen_stmt_list.rs:8:5:12:5 | StmtList | 0 | gen_stmt_list.rs:9:9:9:18 | let ... = 1 |
7+
| gen_stmt_list.rs:8:5:12:5 | StmtList | 1 | gen_stmt_list.rs:10:9:10:18 | let ... = 2 |
88
getTailExpr
9-
| gen_stmt_list.rs:3:27:12:1 | StmtList | gen_stmt_list.rs:7:5:10:5 | { ... } |
9+
| gen_stmt_list.rs:3:27:14:1 | StmtList | gen_stmt_list.rs:8:5:12:5 | { ... } |
10+
| gen_stmt_list.rs:8:5:12:5 | StmtList | gen_stmt_list.rs:11:9:11:13 | ... + ... |

rust/ql/test/extractor-tests/generated/StmtList/gen_stmt_list.rs

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

0 commit comments

Comments
 (0)