style: Properly track whether <angle> or <time> values came from calc() expressions.

This commit is contained in:
Emilio Cobos Álvarez 2017-03-27 01:45:22 +02:00
parent c654c05884
commit fc72f096a0
No known key found for this signature in database
GPG key ID: 056B727BB9C1027C
10 changed files with 281 additions and 90 deletions

View file

@ -507,8 +507,8 @@ pub struct CalcProductNode {
#[allow(missing_docs)]
pub enum CalcValueNode {
Length(NoCalcLength),
Angle(Angle),
Time(Time),
Angle(CSSFloat),
Time(CSSFloat),
Percentage(CSSFloat),
Number(CSSFloat),
Sum(Box<CalcSumNode>),
@ -615,10 +615,14 @@ impl CalcLengthOrPercentage {
NoCalcLength::parse_dimension(value.value, unit).map(CalcValueNode::Length)
}
(Token::Dimension(ref value, ref unit), CalcUnit::Angle) => {
Angle::parse_dimension(value.value, unit).map(CalcValueNode::Angle)
Angle::parse_dimension(value.value, unit).map(|angle| {
CalcValueNode::Angle(angle.radians())
})
}
(Token::Dimension(ref value, ref unit), CalcUnit::Time) => {
Time::parse_dimension(value.value, unit).map(CalcValueNode::Time)
Time::parse_dimension(value.value, unit).map(|time| {
CalcValueNode::Time(time.seconds())
})
}
(Token::Percentage(ref value), CalcUnit::LengthOrPercentage) =>
Ok(CalcValueNode::Percentage(value.unit_value)),
@ -802,14 +806,14 @@ impl CalcLengthOrPercentage {
for value in simplified {
match value {
SimplifiedValueNode::Time(Time(val)) =>
SimplifiedValueNode::Time(val) =>
time = Some(time.unwrap_or(0.) + val),
_ => return Err(()),
}
}
match time {
Some(time) => Ok(Time(time)),
Some(time) => Ok(Time::from_calc(time)),
_ => Err(())
}
}
@ -831,16 +835,23 @@ impl CalcLengthOrPercentage {
for value in simplified {
match value {
SimplifiedValueNode::Angle(Angle(val)) =>
angle = Some(angle.unwrap_or(0.) + val),
SimplifiedValueNode::Number(val) => number = Some(number.unwrap_or(0.) + val),
SimplifiedValueNode::Angle(val) => {
angle = Some(angle.unwrap_or(0.) + val)
}
// TODO(emilio): This `Number` logic looks fishy.
//
// In particular, this allows calc(2 - 2) to parse as an
// `Angle`, which doesn't seem desired to me.
SimplifiedValueNode::Number(val) => {
number = Some(number.unwrap_or(0.) + val)
}
_ => unreachable!()
}
}
match (angle, number) {
(Some(angle), None) => Ok(Angle(angle)),
(None, Some(value)) if value == 0. => Ok(Angle(0.)),
(Some(angle), None) => Ok(Angle::from_calc(angle)),
(None, Some(value)) if value == 0. => Ok(Angle::from_calc(0.)),
_ => Err(())
}
}