From d0257dda36d7b99c7b2e7e6e774dbc5f251834d8 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 23 Nov 2020 12:21:47 +0100 Subject: [PATCH 1/2] Add `unique` wrapper to `AstNode::getParent()` --- generator/src/ql.rs | 20 ++++++++++++++++++++ generator/src/ql_gen.rs | 21 ++++++++++++++++----- ql/src/codeql_ruby/ast.qll | 4 +++- 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/generator/src/ql.rs b/generator/src/ql.rs index daa261f099d..f25412c5b98 100644 --- a/generator/src/ql.rs +++ b/generator/src/ql.rs @@ -97,6 +97,12 @@ pub enum Expression<'a> { Or(Vec>), Equals(Box>, Box>), Dot(Box>, &'a str, Vec>), + Aggregate( + &'a str, + Vec>, + Box>, + Box>, + ), } impl<'a> fmt::Display for Expression<'a> { @@ -138,6 +144,20 @@ 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, " | ")?; + write!(f, "{}", range)?; + write!(f, " | ")?; + write!(f, "{}", term)?; + write!(f, ")") + } } } } diff --git a/generator/src/ql_gen.rs b/generator/src/ql_gen.rs index b8ec8ec5cb9..443a009abf9 100644 --- a/generator/src/ql_gen.rs +++ b/generator/src/ql_gen.rs @@ -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")), )), ), }; diff --git a/ql/src/codeql_ruby/ast.qll b/ql/src/codeql_ruby/ast.qll index 6275a8811a8..96ca104eccc 100644 --- a/ql/src/codeql_ruby/ast.qll +++ b/ql/src/codeql_ruby/ast.qll @@ -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() } From 8132c4cafbaf3f0e8882cf511b4b23afaf60d401 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 23 Nov 2020 16:12:31 +0100 Subject: [PATCH 2/2] Update generator/src/ql.rs Co-authored-by: Arthur Baars --- generator/src/ql.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/generator/src/ql.rs b/generator/src/ql.rs index f25412c5b98..29381cd581c 100644 --- a/generator/src/ql.rs +++ b/generator/src/ql.rs @@ -152,11 +152,7 @@ impl<'a> fmt::Display for Expression<'a> { } write!(f, "{}", var)?; } - write!(f, " | ")?; - write!(f, "{}", range)?; - write!(f, " | ")?; - write!(f, "{}", term)?; - write!(f, ")") + write!(f, " | {} | {})", range, term) } } }