Merge pull request #46 from github/hvitved/unique-parent

Add `unique` wrapper to `AstNode::getParent()`
This commit is contained in:
Tom Hvitved
2020-11-23 16:16:02 +01:00
committed by GitHub
3 changed files with 35 additions and 6 deletions

View File

@@ -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)
}
}
}
}

View File

@@ -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")),
)),
),
};

View File

@@ -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() }