mirror of
https://github.com/github/codeql.git
synced 2026-02-20 00:43:44 +01:00
Merge pull request #46 from github/hvitved/unique-parent
Add `unique` wrapper to `AstNode::getParent()`
This commit is contained in:
@@ -97,6 +97,12 @@ pub enum Expression<'a> {
|
||||
Or(Vec<Expression<'a>>),
|
||||
Equals(Box<Expression<'a>>, Box<Expression<'a>>),
|
||||
Dot(Box<Expression<'a>>, &'a str, Vec<Expression<'a>>),
|
||||
Aggregate(
|
||||
&'a str,
|
||||
Vec<FormalParameter<'a>>,
|
||||
Box<Expression<'a>>,
|
||||
Box<Expression<'a>>,
|
||||
),
|
||||
}
|
||||
|
||||
impl<'a> fmt::Display for Expression<'a> {
|
||||
@@ -138,6 +144,16 @@ impl<'a> fmt::Display for Expression<'a> {
|
||||
}
|
||||
write!(f, ")")
|
||||
}
|
||||
Expression::Aggregate(n, vars, range, term) => {
|
||||
write!(f, "{}(", n)?;
|
||||
for (index, var) in vars.iter().enumerate() {
|
||||
if index > 0 {
|
||||
write!(f, ", ")?;
|
||||
}
|
||||
write!(f, "{}", var)?;
|
||||
}
|
||||
write!(f, " | {} | {})", range, term)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,11 +52,22 @@ fn create_ast_node_class<'a>() -> ql::Class<'a> {
|
||||
return_type: Some(ql::Type::Normal("AstNode")),
|
||||
formal_parameters: vec![],
|
||||
body: ql::Expression::Equals(
|
||||
Box::new(ql::Expression::Var("this")),
|
||||
Box::new(ql::Expression::Dot(
|
||||
Box::new(ql::Expression::Var("result")),
|
||||
"getAFieldOrChild",
|
||||
vec![],
|
||||
Box::new(ql::Expression::Var("result")),
|
||||
Box::new(ql::Expression::Aggregate(
|
||||
"unique",
|
||||
vec![ql::FormalParameter {
|
||||
name: "parent",
|
||||
param_type: ql::Type::Normal("AstNode"),
|
||||
}],
|
||||
Box::new(ql::Expression::Equals(
|
||||
Box::new(ql::Expression::Var("this")),
|
||||
Box::new(ql::Expression::Dot(
|
||||
Box::new(ql::Expression::Var("parent")),
|
||||
"getAFieldOrChild",
|
||||
vec![],
|
||||
)),
|
||||
)),
|
||||
Box::new(ql::Expression::Var("parent")),
|
||||
)),
|
||||
),
|
||||
};
|
||||
|
||||
@@ -11,7 +11,9 @@ class AstNode extends @ast_node {
|
||||
|
||||
Location getLocation() { none() }
|
||||
|
||||
AstNode getParent() { this = result.getAFieldOrChild() }
|
||||
AstNode getParent() {
|
||||
result = unique(AstNode parent | this = parent.getAFieldOrChild() | parent)
|
||||
}
|
||||
|
||||
AstNode getAFieldOrChild() { none() }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user