Skip to content

Commit 48f9e5a

Browse files
authored
Merge pull request #19237 from github/aibaars/crate-graph-type-variables
Rust: extract generic parameters, arguments and resolve bound type variables
2 parents 7e108a8 + 7bfd5f1 commit 48f9e5a

File tree

15 files changed

+759
-463
lines changed

15 files changed

+759
-463
lines changed

Diff for: rust/extractor/src/crate_graph.rs

+607-363
Large diffs are not rendered by default.

Diff for: rust/ql/lib/codeql/rust/elements/internal/LifetimeImpl.qll

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ module Impl {
2020
*/
2121
class Lifetime extends Generated::Lifetime {
2222
override string toStringImpl() {
23-
result = "'" + this.getText()
23+
result = this.getText()
2424
or
2525
not this.hasText() and result = "'_"
2626
}

Diff for: rust/ql/test/extractor-tests/crate_graph/module.rs

+13
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,16 @@ pub static X_B: X = X::B;
4343

4444
pub use std::fs::create_dir as mkdir;
4545
pub use std::{fs::*, path::PathBuf};
46+
47+
pub struct LocalKey<T: 'static> {
48+
inner: fn(Option<&mut Option<T>>) -> *const T,
49+
}
50+
51+
pub struct Thing<T> {
52+
x: T,
53+
}
54+
impl From<usize> for Thing<X> {
55+
fn from(_x: usize) -> Self {
56+
Thing { x: X::A }
57+
}
58+
}

Diff for: rust/ql/test/extractor-tests/crate_graph/modules.expected

+15-3
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,18 @@
1010

1111
#-----| fn fmt
1212

13+
#-----| fn from
14+
1315
#-----| fn length
1416

17+
#-----| impl ...::AsString for ...::X { ... }
18+
#-----| -> fn as_string
19+
1520
#-----| impl ...::Display for ...::X { ... }
1621
#-----| -> fn fmt
1722

18-
#-----| impl AsString for ...::X { ... }
19-
#-----| -> fn as_string
23+
#-----| impl ...::From::<...> for ...::Thing::<...> { ... }
24+
#-----| -> fn from
2025

2126
lib.rs:
2227
# 0| mod crate
@@ -27,8 +32,11 @@ lib.rs:
2732
#-----| -> Static
2833
#-----| -> enum X
2934
#-----| -> fn length
35+
#-----| -> impl ...::AsString for ...::X { ... }
3036
#-----| -> impl ...::Display for ...::X { ... }
31-
#-----| -> impl AsString for ...::X { ... }
37+
#-----| -> impl ...::From::<...> for ...::Thing::<...> { ... }
38+
#-----| -> struct LocalKey<T>
39+
#-----| -> struct Thing<T>
3240
#-----| -> struct X_List
3341
#-----| -> trait AsString
3442
#-----| -> use ...::DirBuilder
@@ -62,6 +70,10 @@ lib.rs:
6270
#-----| -> use ...::symlink_metadata
6371
#-----| -> use ...::write
6472

73+
#-----| struct LocalKey<T>
74+
75+
#-----| struct Thing<T>
76+
6577
#-----| struct X_List
6678

6779
#-----| trait AsString

Diff for: rust/ql/test/extractor-tests/crate_graph/modules.ql

+28-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,33 @@ class RelevantNode extends Item {
1313
this.getParentNode*() =
1414
any(Crate m | m.getName() = "test" and m.getVersion() = "0.0.1").getModule()
1515
}
16+
17+
string label() { result = this.toString() }
18+
}
19+
20+
class HasGenericParams extends RelevantNode {
21+
private GenericParamList params;
22+
23+
HasGenericParams() {
24+
params = this.(Function).getGenericParamList() or
25+
params = this.(Enum).getGenericParamList() or
26+
params = this.(Struct).getGenericParamList() or
27+
params = this.(Union).getGenericParamList() or
28+
params = this.(Impl).getGenericParamList() or
29+
params = this.(Enum).getGenericParamList() or
30+
params = this.(Trait).getGenericParamList() or
31+
params = this.(TraitAlias).getGenericParamList()
32+
}
33+
34+
override string label() {
35+
result =
36+
super.toString() + "<" +
37+
strictconcat(string part, int index |
38+
part = params.getGenericParam(index).toString()
39+
|
40+
part, ", " order by index
41+
) + ">"
42+
}
1643
}
1744

1845
predicate edges(RelevantNode container, RelevantNode element) {
@@ -25,7 +52,7 @@ query predicate nodes(RelevantNode node, string attr, string val) {
2552
nodes(node) and
2653
(
2754
attr = "semmle.label" and
28-
val = node.toString()
55+
val = node.label()
2956
or
3057
attr = "semmle.order" and
3158
val =
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
| gen_break_expr.rs:7:13:7:17 | break | getNumberOfAttrs: | 0 | hasExpr: | no | hasLifetime: | no |
2-
| gen_break_expr.rs:12:13:12:27 | break ''label 42 | getNumberOfAttrs: | 0 | hasExpr: | yes | hasLifetime: | yes |
3-
| gen_break_expr.rs:17:13:17:27 | break ''label 42 | getNumberOfAttrs: | 0 | hasExpr: | yes | hasLifetime: | yes |
2+
| gen_break_expr.rs:12:13:12:27 | break 'label 42 | getNumberOfAttrs: | 0 | hasExpr: | yes | hasLifetime: | yes |
3+
| gen_break_expr.rs:17:13:17:27 | break 'label 42 | getNumberOfAttrs: | 0 | hasExpr: | yes | hasLifetime: | yes |
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
| gen_break_expr.rs:12:13:12:27 | break ''label 42 | gen_break_expr.rs:12:26:12:27 | 42 |
2-
| gen_break_expr.rs:17:13:17:27 | break ''label 42 | gen_break_expr.rs:17:26:17:27 | 42 |
1+
| gen_break_expr.rs:12:13:12:27 | break 'label 42 | gen_break_expr.rs:12:26:12:27 | 42 |
2+
| gen_break_expr.rs:17:13:17:27 | break 'label 42 | gen_break_expr.rs:17:26:17:27 | 42 |
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
| gen_break_expr.rs:12:13:12:27 | break ''label 42 | gen_break_expr.rs:12:19:12:24 | ''label |
2-
| gen_break_expr.rs:17:13:17:27 | break ''label 42 | gen_break_expr.rs:17:19:17:24 | ''label |
1+
| gen_break_expr.rs:12:13:12:27 | break 'label 42 | gen_break_expr.rs:12:19:12:24 | 'label |
2+
| gen_break_expr.rs:17:13:17:27 | break 'label 42 | gen_break_expr.rs:17:19:17:24 | 'label |
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
| gen_continue_expr.rs:12:13:12:27 | continue 'label | gen_continue_expr.rs:12:22:12:27 | ''label |
1+
| gen_continue_expr.rs:12:13:12:27 | continue 'label | gen_continue_expr.rs:12:22:12:27 | 'label |
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
| gen_label.rs:5:5:5:11 | 'label | gen_label.rs:5:5:5:10 | ''label |
1+
| gen_label.rs:5:5:5:11 | 'label | gen_label.rs:5:5:5:10 | 'label |
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
| gen_self_param.rs:10:15:10:22 | SelfParam | gen_self_param.rs:10:16:10:17 | ''a |
1+
| gen_self_param.rs:10:15:10:22 | SelfParam | gen_self_param.rs:10:16:10:17 | 'a |

Diff for: rust/ql/test/extractor-tests/utf8/ast.expected

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
| utf8_identifiers.rs:1:1:12:2 | SourceFile |
66
| utf8_identifiers.rs:1:4:1:6 | foo |
77
| utf8_identifiers.rs:1:7:4:1 | <...> |
8-
| utf8_identifiers.rs:2:5:2:6 | ''\u03b2 |
8+
| utf8_identifiers.rs:2:5:2:6 | '\u03b2 |
99
| utf8_identifiers.rs:2:5:2:6 | LifetimeParam |
1010
| utf8_identifiers.rs:3:5:3:5 | \u03b3 |
1111
| utf8_identifiers.rs:3:5:3:5 | \u03b3 |

0 commit comments

Comments
 (0)