Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit d5582f3

Browse files
authored
Merge pull request #46 from github/hvitved/unique-parent
Add `unique` wrapper to `AstNode::getParent()`
2 parents 41a76ee + 8132c4c commit d5582f3

3 files changed

Lines changed: 35 additions & 6 deletions

File tree

generator/src/ql.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,12 @@ pub enum Expression<'a> {
9797
Or(Vec<Expression<'a>>),
9898
Equals(Box<Expression<'a>>, Box<Expression<'a>>),
9999
Dot(Box<Expression<'a>>, &'a str, Vec<Expression<'a>>),
100+
Aggregate(
101+
&'a str,
102+
Vec<FormalParameter<'a>>,
103+
Box<Expression<'a>>,
104+
Box<Expression<'a>>,
105+
),
100106
}
101107

102108
impl<'a> fmt::Display for Expression<'a> {
@@ -138,6 +144,16 @@ impl<'a> fmt::Display for Expression<'a> {
138144
}
139145
write!(f, ")")
140146
}
147+
Expression::Aggregate(n, vars, range, term) => {
148+
write!(f, "{}(", n)?;
149+
for (index, var) in vars.iter().enumerate() {
150+
if index > 0 {
151+
write!(f, ", ")?;
152+
}
153+
write!(f, "{}", var)?;
154+
}
155+
write!(f, " | {} | {})", range, term)
156+
}
141157
}
142158
}
143159
}

generator/src/ql_gen.rs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,22 @@ fn create_ast_node_class<'a>() -> ql::Class<'a> {
5252
return_type: Some(ql::Type::Normal("AstNode")),
5353
formal_parameters: vec![],
5454
body: ql::Expression::Equals(
55-
Box::new(ql::Expression::Var("this")),
56-
Box::new(ql::Expression::Dot(
57-
Box::new(ql::Expression::Var("result")),
58-
"getAFieldOrChild",
59-
vec![],
55+
Box::new(ql::Expression::Var("result")),
56+
Box::new(ql::Expression::Aggregate(
57+
"unique",
58+
vec![ql::FormalParameter {
59+
name: "parent",
60+
param_type: ql::Type::Normal("AstNode"),
61+
}],
62+
Box::new(ql::Expression::Equals(
63+
Box::new(ql::Expression::Var("this")),
64+
Box::new(ql::Expression::Dot(
65+
Box::new(ql::Expression::Var("parent")),
66+
"getAFieldOrChild",
67+
vec![],
68+
)),
69+
)),
70+
Box::new(ql::Expression::Var("parent")),
6071
)),
6172
),
6273
};

ql/src/codeql_ruby/ast.qll

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@ class AstNode extends @ast_node {
1111

1212
Location getLocation() { none() }
1313

14-
AstNode getParent() { this = result.getAFieldOrChild() }
14+
AstNode getParent() {
15+
result = unique(AstNode parent | this = parent.getAFieldOrChild() | parent)
16+
}
1517

1618
AstNode getAFieldOrChild() { none() }
1719

0 commit comments

Comments
 (0)