Clean up AST simplification code

This commit is contained in:
David Zbarsky 2015-08-13 01:49:20 -04:00
parent 64dc95436d
commit cfa1e467f1

View file

@ -374,7 +374,6 @@ pub mod specified {
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
enum CalcAstNode { enum CalcAstNode {
Add(CalcSumNode), Add(CalcSumNode),
Multiply(CalcProductNode),
Value(CalcValueNode), Value(CalcValueNode),
} }
@ -412,7 +411,6 @@ pub mod specified {
} }
let sum = CalcSumNode { products: products }; let sum = CalcSumNode { products: products };
println!("Parsed sum {:?} ", sum);
Ok(sum) Ok(sum)
} }
@ -445,7 +443,6 @@ pub mod specified {
} }
let sum = CalcProductNode { values: values }; let sum = CalcProductNode { values: values };
println!("Parsed product {:?} ", sum);
Ok(sum) Ok(sum)
} }
@ -491,7 +488,6 @@ pub mod specified {
})), })),
Some(CalcAstNode::Value(ref value)) => Some(CalcAstNode::Value(ref value)) =>
Ok(CalcAstNode::Value(Calc::multiply_value(value, multiplier))), Ok(CalcAstNode::Value(Calc::multiply_value(value, multiplier))),
_ => unreachable!()
} }
} }
@ -520,14 +516,12 @@ pub mod specified {
let node = try!(Calc::simplify_product(node)); let node = try!(Calc::simplify_product(node));
match node { match node {
CalcAstNode::Value(value) => { CalcAstNode::Value(value) => {
let product = CalcProductNode { values: vec!(value) };
if length == 1 { if length == 1 {
return Ok(CalcAstNode::Multiply(product)); return Ok(CalcAstNode::Value(value));
} }
simplified.push(product); simplified.push(CalcProductNode { values: vec!(value) });
} }
CalcAstNode::Add(sum) => simplified.push_all(&sum.products), CalcAstNode::Add(sum) => simplified.push_all(&sum.products),
_ => return Err(())
} }
} }
@ -546,6 +540,8 @@ pub mod specified {
let ast = try!(Calc::parse_sum(input)); let ast = try!(Calc::parse_sum(input));
let ast = try!(Calc::simplify_sum(ast)); let ast = try!(Calc::simplify_sum(ast));
println!("Simlified ast {:?} ", ast);
let mut absolute = None; let mut absolute = None;
let mut vw = None; let mut vw = None;
let mut vh = None; let mut vh = None;
@ -556,42 +552,49 @@ pub mod specified {
let mut rem = None; let mut rem = None;
let mut percentage = None; let mut percentage = None;
if let CalcAstNode::Add(ast) = ast { let values = match ast {
for value in ast.products { CalcAstNode::Add(sum) => {
assert!(value.values.len() == 1); let mut values = Vec::new();
match value.values[0] { for product in sum.products {
CalcValueNode::Percentage(p) => assert!(product.values.len() == 1);
percentage = Some(percentage.unwrap_or(0.) + p), values.push(product.values[0].clone());
CalcValueNode::Length(Length::Absolute(Au(au))) => }
absolute = Some(absolute.unwrap_or(0) + au), values
CalcValueNode::Length(Length::ViewportPercentage(v)) => },
match v { CalcAstNode::Value(value) => vec!(value)
ViewportPercentageLength::Vw(val) => };
vw = Some(vw.unwrap_or(0.) + val),
ViewportPercentageLength::Vh(val) => for value in values {
vh = Some(vh.unwrap_or(0.) + val), match value {
ViewportPercentageLength::Vmin(val) => CalcValueNode::Percentage(p) =>
vmin = Some(vmin.unwrap_or(0.) + val), percentage = Some(percentage.unwrap_or(0.) + p),
ViewportPercentageLength::Vmax(val) => CalcValueNode::Length(Length::Absolute(Au(au))) =>
vmax = Some(vmax.unwrap_or(0.) + val), absolute = Some(absolute.unwrap_or(0) + au),
}, CalcValueNode::Length(Length::ViewportPercentage(v)) =>
CalcValueNode::Length(Length::FontRelative(f)) => match v {
match f { ViewportPercentageLength::Vw(val) =>
FontRelativeLength::Em(val) => vw = Some(vw.unwrap_or(0.) + val),
em = Some(em.unwrap_or(0.) + val), ViewportPercentageLength::Vh(val) =>
FontRelativeLength::Ex(val) => vh = Some(vh.unwrap_or(0.) + val),
ex = Some(ex.unwrap_or(0.) + val), ViewportPercentageLength::Vmin(val) =>
FontRelativeLength::Rem(val) => vmin = Some(vmin.unwrap_or(0.) + val),
rem = Some(rem.unwrap_or(0.) + val), ViewportPercentageLength::Vmax(val) =>
}, vmax = Some(vmax.unwrap_or(0.) + val),
_ => return Err(()) },
} CalcValueNode::Length(Length::FontRelative(f)) =>
match f {
FontRelativeLength::Em(val) =>
em = Some(em.unwrap_or(0.) + val),
FontRelativeLength::Ex(val) =>
ex = Some(ex.unwrap_or(0.) + val),
FontRelativeLength::Rem(val) =>
rem = Some(rem.unwrap_or(0.) + val),
},
_ => return Err(())
} }
} else {
unreachable!()
} }
Ok(Calc { Ok(Calc {
absolute: absolute.map(Au), absolute: absolute.map(Au),
vw: vw.map(ViewportPercentageLength::Vw), vw: vw.map(ViewportPercentageLength::Vw),
vh: vh.map(ViewportPercentageLength::Vh), vh: vh.map(ViewportPercentageLength::Vh),