Skip to content

Commit

Permalink
refactor(css/compat): Support stable rust (#8386)
Browse files Browse the repository at this point in the history
**Related issue:**
 - #8316
  • Loading branch information
magic-akari committed Dec 7, 2023
1 parent 6ef6cf6 commit bc1e328
Show file tree
Hide file tree
Showing 7 changed files with 92 additions and 91 deletions.
7 changes: 4 additions & 3 deletions crates/swc_css_compat/src/compiler/color_hex_alpha.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,10 @@ fn shorten_hex_color(value: &str) -> Option<&str> {

impl Compiler {
pub(crate) fn process_color_hex_alpha(&mut self, n: &mut ComponentValue) {
if let ComponentValue::Color(box Color::AbsoluteColorBase(AbsoluteColorBase::HexColor(
hex_color,
))) = n
if let Some(hex_color) = n
.as_mut_color()
.and_then(|color| color.as_mut_absolute_color_base())
.and_then(|color| color.as_mut_hex_color())
{
if hex_color.value.len() != 4 && hex_color.value.len() != 8 {
return;
Expand Down
69 changes: 32 additions & 37 deletions crates/swc_css_compat/src/compiler/color_hwb.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ use crate::compiler::Compiler;
impl Compiler {
fn get_hue(&self, hue: Option<&ComponentValue>) -> Option<f64> {
match hue {
Some(ComponentValue::Hue(box hue)) => {
let mut value = match hue {
Some(ComponentValue::Hue(hue)) => {
let mut value = match &**hue {
Hue::Number(Number { value, .. }) => *value,
Hue::Angle(Angle {
value: Number { value, .. },
Expand All @@ -27,9 +27,7 @@ impl Compiler {

Some(value)
}
Some(ComponentValue::Ident(box Ident { value, .. }))
if value.eq_ignore_ascii_case("none") =>
{
Some(ComponentValue::Ident(ident)) if ident.value.eq_ignore_ascii_case("none") => {
Some(0.0)
}
_ => None,
Expand All @@ -38,10 +36,8 @@ impl Compiler {

fn get_percentage(&self, percentage: Option<&ComponentValue>) -> Option<f64> {
match percentage {
Some(ComponentValue::Percentage(box Percentage {
value: Number { value, .. },
..
})) => {
Some(ComponentValue::Percentage(percentage)) => {
let Number { value, .. } = &percentage.value;
if *value > 100.0 {
return Some(1.0);
} else if *value < 0.0 {
Expand All @@ -50,44 +46,43 @@ impl Compiler {

Some(*value / 100.0)
}
Some(ComponentValue::Ident(box Ident { value, .. }))
if value.eq_ignore_ascii_case("none") =>
{
Some(ComponentValue::Ident(ident)) if ident.value.eq_ignore_ascii_case("none") => {
Some(0.0)
}
_ => None,
}
}

fn get_alpha_value(&self, alpha_value: Option<&ComponentValue>) -> Option<f64> {
match alpha_value {
Some(ComponentValue::AlphaValue(box AlphaValue::Number(Number { value, .. }))) => {
if *value > 1.0 {
return Some(1.0);
} else if *value < 0.0 {
return Some(0.0);
}
let Some(alpha_value) = alpha_value else {
return Some(1.0);
};

Some(*value)
}
Some(ComponentValue::AlphaValue(box AlphaValue::Percentage(Percentage {
value: Number { value, .. },
..
}))) => {
if *value > 100.0 {
return Some(1.0);
} else if *value < 0.0 {
return Some(0.0);
match &alpha_value {
ComponentValue::AlphaValue(alpha_value) => match &**alpha_value {
AlphaValue::Number(Number { value, .. }) => {
if *value > 1.0 {
return Some(1.0);
} else if *value < 0.0 {
return Some(0.0);
}

Some(*value)
}
AlphaValue::Percentage(Percentage {
value: Number { value, .. },
..
}) => {
if *value > 100.0 {
return Some(1.0);
} else if *value < 0.0 {
return Some(0.0);
}

Some(*value / 100.0)
}
Some(ComponentValue::Ident(box Ident { value, .. }))
if value.eq_ignore_ascii_case("none") =>
{
Some(0.0)
}
None => Some(1.0),
Some(*value / 100.0)
}
},
ComponentValue::Ident(ident) if ident.value.eq_ignore_ascii_case("none") => Some(0.0),
_ => None,
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,9 @@ impl Compiler {
}

if function.value.iter().any(|n| {
matches!(
n,
ComponentValue::Delimiter(box Delimiter {
value: DelimiterValue::Comma,
..
})
)
n.as_delimiter()
.filter(|delimiter| delimiter.value.is_comma())
.is_some()
}) {
return;
}
Expand All @@ -43,13 +39,11 @@ impl Compiler {
span: DUMMY_SP,
})),
]
} else if matches!(
node,
ComponentValue::Delimiter(box Delimiter {
value: DelimiterValue::Solidus,
..
})
) {
} else if node
.as_delimiter()
.filter(|delimiter| delimiter.value.is_solidus())
.is_some()
{
vec![ComponentValue::Delimiter(Box::new(Delimiter {
value: DelimiterValue::Comma,
span: DUMMY_SP,
Expand Down
12 changes: 7 additions & 5 deletions crates/swc_css_compat/src/compiler/custom_media.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ use swc_common::{util::take::Take, DUMMY_SP};
use swc_css_ast::{
AtRule, AtRuleName, AtRulePrelude, CustomMediaQuery, CustomMediaQueryMediaType, Ident,
MediaCondition, MediaConditionAllType, MediaConditionType, MediaConditionWithoutOr,
MediaConditionWithoutOrType, MediaFeature, MediaFeatureBoolean, MediaFeatureName,
MediaInParens, MediaOr, MediaQuery, MediaType, Rule,
MediaConditionWithoutOrType, MediaFeatureBoolean, MediaFeatureName, MediaInParens, MediaOr,
MediaQuery, MediaType, Rule,
};

#[derive(Debug, Default)]
Expand All @@ -18,7 +18,9 @@ impl CustomMediaHandler {
pub(crate) fn store_custom_media(&mut self, n: &mut AtRule) {
if let AtRuleName::Ident(name) = &n.name {
if name.value == "custom-media" {
if let Some(box AtRulePrelude::CustomMediaPrelude(prelude)) = &mut n.prelude {
if let Some(AtRulePrelude::CustomMediaPrelude(prelude)) =
&mut n.prelude.as_deref_mut()
{
self.medias.push(prelude.take());
}
}
Expand Down Expand Up @@ -223,10 +225,10 @@ impl CustomMediaHandler {
}

pub(crate) fn process_media_in_parens(&mut self, n: &MediaInParens) -> Option<MediaInParens> {
if let MediaInParens::Feature(box MediaFeature::Boolean(MediaFeatureBoolean {
if let Some(MediaFeatureBoolean {
name: MediaFeatureName::ExtensionName(name),
..
})) = n
}) = n.as_feature().and_then(|feature| feature.as_boolean())
{
if let Some(custom_media) = self.medias.iter().find(|m| m.name.value == name.value) {
let mut new_media_condition = MediaCondition {
Expand Down
44 changes: 27 additions & 17 deletions crates/swc_css_compat/src/compiler/legacy_rgb_and_hsl.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use std::f64::consts::PI;

use swc_css_ast::{
matches_eq, AbsoluteColorBase, AlphaValue, Angle, ComponentValue, Hue, Number, Percentage,
matches_eq, AbsoluteColorBase, AlphaValue, Angle, ComponentValue, Number, Percentage,
};
use swc_css_utils::{clamp_unit_f64, round_alpha};

Expand All @@ -18,31 +18,36 @@ impl Compiler {
.value
.drain(..)
.map(|n| match n {
ComponentValue::Percentage(box Percentage {
span,
value: Number { value, .. },
..
}) => ComponentValue::Number(Box::new(Number {
span,
value: clamp_unit_f64(value / 100.0) as f64,
raw: None,
})),
ComponentValue::Percentage(percentage) => {
let Percentage {
span,
value: Number { value, .. },
..
} = &*percentage;

ComponentValue::Number(Box::new(Number {
span: *span,
value: clamp_unit_f64(value / 100.0) as f64,
raw: None,
}))
}
_ => n,
})
.collect();
} else if is_hsl {
function.value = function
.value
.drain(..)
.map(|n| match n {
ComponentValue::Hue(box Hue::Angle(Angle {
.map(|n| {
if let Some(Angle {
span,
value: Number { value, .. },
unit,
..
})) => {
}) = n.as_hue().and_then(|hue| hue.as_angle())
{
let value = match &*unit.value.to_ascii_lowercase() {
"deg" => value,
"deg" => *value,
"grad" => value * 180.0 / 200.0,
"rad" => value * 180.0 / PI,
"turn" => value * 360.0,
Expand All @@ -52,18 +57,23 @@ impl Compiler {
};

ComponentValue::Number(Box::new(Number {
span,
span: *span,
value: value.round(),
raw: None,
}))
} else {
n
}
_ => n,
})
.collect();
}

if is_rgb || is_hsl {
if let Some(ComponentValue::AlphaValue(box alpha_value)) = function.value.last_mut()
if let Some(alpha_value) = function
.value
.last_mut()
.and_then(|component_value| component_value.as_mut_alpha_value())
.map(|alpha_value| alpha_value.as_mut())
{
if let AlphaValue::Percentage(Percentage {
span,
Expand Down
28 changes: 14 additions & 14 deletions crates/swc_css_compat/src/compiler/media_query_ranges.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@ impl Compiler {
match n {
MediaFeature::Range(MediaFeatureRange {
span,
left: box left,
left,
comparison,
right: box right,
right,
..
}) => {
if let MediaFeatureValue::Ident(name) = &left {
if let MediaFeatureValue::Ident(name) = &**left {
let name = match comparison {
MediaFeatureRangeComparison::Lt | MediaFeatureRangeComparison::Le => {
self.get_right_media_feature_name(name)
Expand All @@ -30,7 +30,7 @@ impl Compiler {
_ => self.get_left_media_feature_name(name),
}?;

let original_value = right.clone();
let original_value = (**right).clone();
let value = match comparison {
MediaFeatureRangeComparison::Lt => self.get_lt_value(original_value),
MediaFeatureRangeComparison::Gt => self.get_gt_value(original_value),
Expand All @@ -45,7 +45,7 @@ impl Compiler {
}),
None,
));
} else if let MediaFeatureValue::Ident(name) = &right {
} else if let MediaFeatureValue::Ident(name) = &**right {
let name = match comparison {
MediaFeatureRangeComparison::Lt | MediaFeatureRangeComparison::Le => {
self.get_left_media_feature_name(name)
Expand All @@ -56,7 +56,7 @@ impl Compiler {
_ => self.get_right_media_feature_name(name),
}?;

let original_value = left.clone();
let original_value = (**left).clone();
let value = match comparison {
MediaFeatureRangeComparison::Lt => self.get_gt_value(original_value),
MediaFeatureRangeComparison::Gt => self.get_lt_value(original_value),
Expand All @@ -75,10 +75,10 @@ impl Compiler {
}
MediaFeature::RangeInterval(MediaFeatureRangeInterval {
span,
left: box left,
left,
left_comparison,
name: MediaFeatureName::Ident(name),
right: box right,
right,
right_comparison,
..
}) => {
Expand All @@ -90,9 +90,9 @@ impl Compiler {
}?;

let left_value = match left_comparison {
MediaFeatureRangeComparison::Lt => self.get_gt_value(left.clone()),
MediaFeatureRangeComparison::Gt => self.get_lt_value(left.clone()),
_ => Some(left.clone()),
MediaFeatureRangeComparison::Lt => self.get_gt_value((**left).clone()),
MediaFeatureRangeComparison::Gt => self.get_lt_value((**left).clone()),
_ => Some((**left).clone()),
}?;

let left = MediaFeature::Plain(MediaFeaturePlain {
Expand All @@ -109,9 +109,9 @@ impl Compiler {
}?;

let right_value = match right_comparison {
MediaFeatureRangeComparison::Lt => self.get_lt_value(right.clone()),
MediaFeatureRangeComparison::Gt => self.get_gt_value(right.clone()),
_ => Some(right.clone()),
MediaFeatureRangeComparison::Lt => self.get_lt_value((**right).clone()),
MediaFeatureRangeComparison::Gt => self.get_gt_value((**right).clone()),
_ => Some((**right).clone()),
}?;

let right = MediaFeature::Plain(MediaFeaturePlain {
Expand Down
1 change: 0 additions & 1 deletion crates/swc_css_compat/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
#![feature(box_patterns)]
#![allow(clippy::boxed_local)]
#![allow(clippy::vec_box)]

Expand Down

0 comments on commit bc1e328

Please sign in to comment.