Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor(css/parser): Support stable rust #8378

Merged
merged 1 commit into from
Dec 4, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 0 additions & 1 deletion crates/swc_css_parser/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
#![feature(box_patterns)]
#![cfg_attr(docsrs, feature(doc_cfg))]
#![deny(unused_must_use)]
#![deny(clippy::all)]
Expand Down
6 changes: 5 additions & 1 deletion crates/swc_css_parser/src/parser/selectors/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1294,7 +1294,11 @@ where
}
tok!("dimension") => {
let dimension = match bump!(self) {
Token::Dimension(box DimensionToken { value, raw_value, unit, .. }) => (value, raw_value, unit),
Token::Dimension(dimension) => {
let DimensionToken { value, raw_value, unit, .. } = *dimension;

(value, raw_value, unit)
}
_ => {
unreachable!();
}
Expand Down
57 changes: 28 additions & 29 deletions crates/swc_css_parser/src/parser/syntax/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -657,11 +657,10 @@ where

match &component_value {
// Optimization for step 6
ComponentValue::PreservedToken(box TokenAndSpan {
span,
token: Token::Delim { value: '!', .. },
..
}) if is!(self, " ") || is_case_insensitive_ident!(self, "important") => {
ComponentValue::PreservedToken(token_and_span)
if matches!(token_and_span.token, Token::Delim { value: '!', .. })
&& (is!(self, " ") || is_case_insensitive_ident!(self, "important")) =>
{
if let Some(span) = &exclamation_point_span {
is_valid_to_canonicalize = false;

Expand All @@ -674,32 +673,32 @@ where
last_whitespaces = (last_whitespaces.2, 0, 0);
}

exclamation_point_span = Some(*span);
exclamation_point_span = Some(token_and_span.span);
}
ComponentValue::PreservedToken(box TokenAndSpan {
token: Token::WhiteSpace { .. },
..
}) => match (&exclamation_point_span, &important_ident) {
(Some(_), Some(_)) => {
last_whitespaces.2 += 1;
}
(Some(_), None) => {
last_whitespaces.1 += 1;
}
(None, None) => {
last_whitespaces.0 += 1;
}
_ => {
unreachable!();
ComponentValue::PreservedToken(token_and_span)
if matches!(token_and_span.token, Token::WhiteSpace { .. }) =>
{
match (&exclamation_point_span, &important_ident) {
(Some(_), Some(_)) => {
last_whitespaces.2 += 1;
}
(Some(_), None) => {
last_whitespaces.1 += 1;
}
(None, None) => {
last_whitespaces.0 += 1;
}
_ => {
unreachable!();
}
}
},
ComponentValue::PreservedToken(
token_and_span @ box TokenAndSpan {
token: Token::Ident { value, .. },
..
},
) if exclamation_point_span.is_some()
&& matches_eq_ignore_ascii_case!(value, "important") =>
}
ComponentValue::PreservedToken(token_and_span)
if exclamation_point_span.is_some()
&& matches!(
&token_and_span.token,
Token::Ident { value, .. } if matches_eq_ignore_ascii_case!(value, "important")
) =>
{
important_ident = Some(token_and_span.clone());
}
Expand Down
82 changes: 15 additions & 67 deletions crates/swc_css_parser/src/parser/util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -373,74 +373,22 @@ where
&mut self,
component_value: &ComponentValue,
) -> PResult<()> {
match component_value {
ComponentValue::PreservedToken(box TokenAndSpan {
span,
token: Token::BadString { .. },
}) => {
return Err(Error::new(
*span,
ErrorKind::Unexpected("bad string in declaration value"),
));
}
ComponentValue::PreservedToken(box TokenAndSpan {
span,
token: Token::BadUrl { .. },
}) => {
return Err(Error::new(
*span,
ErrorKind::Unexpected("bad url in declaration value"),
));
}
ComponentValue::PreservedToken(box TokenAndSpan {
span,
token: Token::RParen,
}) => {
return Err(Error::new(
*span,
ErrorKind::Unexpected("')' in declaration value"),
));
}
ComponentValue::PreservedToken(box TokenAndSpan {
span,
token: Token::RBracket,
}) => {
return Err(Error::new(
*span,
ErrorKind::Unexpected("']' in declaration value"),
));
}
ComponentValue::PreservedToken(box TokenAndSpan {
span,
token: Token::RBrace,
}) => {
return Err(Error::new(
*span,
ErrorKind::Unexpected("'}' in declaration value"),
));
}
ComponentValue::PreservedToken(box TokenAndSpan {
span,
token: Token::Semi,
}) => {
return Err(Error::new(
*span,
ErrorKind::Unexpected("';' in declaration value"),
));
}
ComponentValue::PreservedToken(box TokenAndSpan {
span,
token: Token::Delim { value: '!' },
}) => {
return Err(Error::new(
*span,
ErrorKind::Unexpected("'!' in declaration value"),
));
}
_ => {}
}
let ComponentValue::PreservedToken(preserved_token) = component_value else {
return Ok(());
};

let kind = match preserved_token.token {
Token::BadString { .. } => ErrorKind::Unexpected("bad string in declaration value"),
Token::BadUrl { .. } => ErrorKind::Unexpected("bad url in declaration value"),
Token::RParen => ErrorKind::Unexpected("')' in declaration value"),
Token::RBracket => ErrorKind::Unexpected("']' in declaration value"),
Token::RBrace => ErrorKind::Unexpected("'}' in declaration value"),
Token::Semi => ErrorKind::Unexpected("';' in declaration value"),
Token::Delim { value: '!' } => ErrorKind::Unexpected("'!' in declaration value"),
_ => return Ok(()),
};

Ok(())
Err(Error::new(preserved_token.span, kind))
}
}

Expand Down
132 changes: 71 additions & 61 deletions crates/swc_css_parser/src/parser/values_and_units/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1963,8 +1963,8 @@ where
}

match cur!(self) {
Token::Dimension(box DimensionToken { unit, .. }) => {
match unit {
Token::Dimension(dimension_token) => {
match &dimension_token.unit {
// <length>
unit if is_length_unit(unit)
|| (self.ctx.in_container_at_rule && is_container_lengths_unit(unit)) =>
Expand Down Expand Up @@ -2003,13 +2003,15 @@ where
}

match bump!(self) {
Token::Dimension(box DimensionToken {
value,
unit,
raw_value,
raw_unit,
..
}) => {
Token::Dimension(dimension_token) => {
let DimensionToken {
value,
unit,
raw_value,
raw_unit,
..
} = *dimension_token;

// TODO validate

let unit_len = raw_unit.len() as u32;
Expand Down Expand Up @@ -2047,13 +2049,15 @@ where
}

match bump!(self) {
Token::Dimension(box DimensionToken {
value,
unit,
raw_value,
raw_unit,
..
}) => {
Token::Dimension(dimension_token) => {
let DimensionToken {
value,
unit,
raw_value,
raw_unit,
..
} = *dimension_token;

if !is_angle_unit(&unit) {
return Err(Error::new(
span,
Expand Down Expand Up @@ -2096,13 +2100,15 @@ where
}

match bump!(self) {
Token::Dimension(box DimensionToken {
value,
unit,
raw_value,
raw_unit,
..
}) => {
Token::Dimension(dimension_token) => {
let DimensionToken {
value,
unit,
raw_value,
raw_unit,
..
} = *dimension_token;

if !is_time_unit(&unit) {
return Err(Error::new(span, ErrorKind::Expected("'s' or 'ms' units")));
}
Expand Down Expand Up @@ -2142,13 +2148,15 @@ where
}

match bump!(self) {
Token::Dimension(box DimensionToken {
value,
unit,
raw_value,
raw_unit,
..
}) => {
Token::Dimension(dimension_token) => {
let DimensionToken {
value,
unit,
raw_value,
raw_unit,
..
} = *dimension_token;

if !is_frequency_unit(&unit) {
return Err(Error::new(span, ErrorKind::Expected("'Hz' or 'kHz' units")));
}
Expand Down Expand Up @@ -2188,13 +2196,15 @@ where
}

match bump!(self) {
Token::Dimension(box DimensionToken {
value,
unit,
raw_value,
raw_unit,
..
}) => {
Token::Dimension(dimension_token) => {
let DimensionToken {
value,
unit,
raw_value,
raw_unit,
..
} = *dimension_token;

if !is_resolution_unit(&unit) {
return Err(Error::new(
span,
Expand Down Expand Up @@ -2237,13 +2247,15 @@ where
}

match bump!(self) {
Token::Dimension(box DimensionToken {
value,
unit,
raw_value,
raw_unit,
..
}) => {
Token::Dimension(dimension_token) => {
let DimensionToken {
value,
unit,
raw_value,
raw_unit,
..
} = *dimension_token;

if !is_flex_unit(&unit) {
return Err(Error::new(span, ErrorKind::Expected("'fr' unit")));
}
Expand Down Expand Up @@ -2283,13 +2295,15 @@ where
}

match bump!(self) {
Token::Dimension(box DimensionToken {
value,
unit,
raw_value,
raw_unit,
..
}) => {
Token::Dimension(dimension_token) => {
let DimensionToken {
value,
unit,
raw_value,
raw_unit,
..
} = *dimension_token;

let unit_len = raw_unit.len() as u32;

Ok(UnknownDimension {
Expand Down Expand Up @@ -2794,11 +2808,9 @@ where
}
tok!("dimension") => {
let raw = match bump!(self) {
Token::Dimension(box DimensionToken {
raw_value,
raw_unit,
..
}) => (raw_value, raw_unit),
Token::Dimension(dimension_token) => {
(dimension_token.raw_value, dimension_token.raw_unit)
}
_ => {
unreachable!();
}
Expand All @@ -2824,11 +2836,9 @@ where
// u <dimension-token> '?'*
tok!("dimension") => {
let raw = match bump!(self) {
Token::Dimension(box DimensionToken {
raw_value,
raw_unit,
..
}) => (raw_value, raw_unit),
Token::Dimension(dimension_token) => {
(dimension_token.raw_value, dimension_token.raw_unit)
}
_ => {
unreachable!();
}
Expand Down