|
|
@@ -6,21 +6,6 @@
|
|
|
use super::sigma::combiners::*;
|
|
|
use syn::{parse_quote, Expr};
|
|
|
|
|
|
-/// Produce a [`StatementTree`] that represents the constant `true`
|
|
|
-fn leaf_true() -> StatementTree {
|
|
|
- StatementTree::Leaf(parse_quote! { true })
|
|
|
-}
|
|
|
-
|
|
|
-/// Test if the given [`StatementTree`] represents the constant `true`
|
|
|
-fn is_leaf_true(st: &StatementTree) -> bool {
|
|
|
- if let StatementTree::Leaf(Expr::Lit(exprlit)) = st {
|
|
|
- if let syn::Lit::Bool(syn::LitBool { value: true, .. }) = exprlit.lit {
|
|
|
- return true;
|
|
|
- }
|
|
|
- }
|
|
|
- false
|
|
|
-}
|
|
|
-
|
|
|
/// Simplify a [`StatementTree`] by pruning leaves that are the constant
|
|
|
/// `true`, and simplifying `And`, `Or`, and `Thresh` combiners that
|
|
|
/// have fewer than two children.
|
|
|
@@ -39,7 +24,7 @@ pub fn prune_statement_tree(st: &mut StatementTree) {
|
|
|
// Note that v.len _can change_ during this loop
|
|
|
while i < v.len() {
|
|
|
prune_statement_tree(&mut v[i]);
|
|
|
- if is_leaf_true(&v[i]) {
|
|
|
+ if v[i].is_leaf_true() {
|
|
|
// Remove this child, and _do not_ increment i
|
|
|
v.remove(i);
|
|
|
} else {
|
|
|
@@ -47,7 +32,7 @@ pub fn prune_statement_tree(st: &mut StatementTree) {
|
|
|
}
|
|
|
}
|
|
|
if v.is_empty() {
|
|
|
- *st = leaf_true();
|
|
|
+ *st = StatementTree::leaf_true();
|
|
|
} else if v.len() == 1 {
|
|
|
let child = v.remove(0);
|
|
|
*st = child;
|
|
|
@@ -63,8 +48,8 @@ pub fn prune_statement_tree(st: &mut StatementTree) {
|
|
|
// Note that v.len _can change_ during this loop
|
|
|
while i < v.len() {
|
|
|
prune_statement_tree(&mut v[i]);
|
|
|
- if is_leaf_true(&v[i]) {
|
|
|
- *st = leaf_true();
|
|
|
+ if v[i].is_leaf_true() {
|
|
|
+ *st = StatementTree::leaf_true();
|
|
|
return;
|
|
|
} else {
|
|
|
i += 1;
|
|
|
@@ -86,13 +71,13 @@ pub fn prune_statement_tree(st: &mut StatementTree) {
|
|
|
// Note that v.len _can change_ during this loop
|
|
|
while i < v.len() {
|
|
|
prune_statement_tree(&mut v[i]);
|
|
|
- if is_leaf_true(&v[i]) {
|
|
|
+ if v[i].is_leaf_true() {
|
|
|
// Remove this child, and _do not_ increment i
|
|
|
v.remove(i);
|
|
|
// But decrement thresh
|
|
|
*thresh -= 1;
|
|
|
if *thresh == 0 {
|
|
|
- *st = leaf_true();
|
|
|
+ *st = StatementTree::leaf_true();
|
|
|
return;
|
|
|
}
|
|
|
} else {
|
|
|
@@ -128,19 +113,6 @@ pub fn paren_if_needed(expr: Expr) -> Expr {
|
|
|
mod tests {
|
|
|
use super::*;
|
|
|
|
|
|
- #[test]
|
|
|
- fn leaf_true_test() {
|
|
|
- assert!(is_leaf_true(&leaf_true()));
|
|
|
- assert!(!is_leaf_true(&StatementTree::Leaf(parse_quote! { false })));
|
|
|
- assert!(!is_leaf_true(&StatementTree::Leaf(parse_quote! { 1 })));
|
|
|
- assert!(!is_leaf_true(
|
|
|
- &StatementTree::parse(&parse_quote! {
|
|
|
- OR(1=1, a=b)
|
|
|
- })
|
|
|
- .unwrap()
|
|
|
- ));
|
|
|
- }
|
|
|
-
|
|
|
fn prune_tester(e: Expr, pruned_e: Expr) {
|
|
|
let mut st = StatementTree::parse(&e).unwrap();
|
|
|
prune_statement_tree(&mut st);
|