mirror of
https://github.com/servo/servo.git
synced 2025-08-06 06:00:15 +01:00
style: Properly track whether <angle> or <time> values came from calc() expressions.
This commit is contained in:
parent
c654c05884
commit
fc72f096a0
10 changed files with 281 additions and 90 deletions
|
@ -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(())
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue