Skip to content

Commit

Permalink
Merge non-adjacent @layer rules
Browse files Browse the repository at this point in the history
Closes #414
  • Loading branch information
devongovett committed Feb 3, 2023
1 parent a19228d commit 6419d54
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 6 deletions.
26 changes: 26 additions & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22609,6 +22609,32 @@ mod tests {
"@import 'test.css' layer(foo, bar) {};",
ParserError::UnexpectedToken(Token::Comma),
);
minify_test(
r#"
@layer one {
body {
background: red;
}
}

body {
background: red;
}

@layer two {
body {
background: green;
}
}

@layer one {
body {
background: yellow;
}
}
"#,
"@layer one{body{background:#ff0}}body{background:red}@layer two{body{background:green}}",
);
}

#[test]
Expand Down
2 changes: 1 addition & 1 deletion src/rules/layer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ use smallvec::SmallVec;
/// a `@layer` or `@import` rule.
///
/// Nested layers are represented using a list of identifiers. In CSS syntax, these are dot-separated.
#[derive(Debug, Clone, PartialEq)]
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "into_owned", derive(lightningcss_derive::IntoOwned))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize), serde(transparent))]
#[cfg_attr(feature = "jsonschema", derive(schemars::JsonSchema))]
Expand Down
17 changes: 12 additions & 5 deletions src/rules/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -430,6 +430,7 @@ impl<'i, T> CssRuleList<'i, T> {
parent_is_unused: bool,
) -> Result<(), MinifyError> {
let mut keyframe_rules = HashMap::new();
let mut layer_rules = HashMap::new();
let mut rules = Vec::new();
for mut rule in self.0.drain(..) {
match &mut rule {
Expand Down Expand Up @@ -520,12 +521,18 @@ impl<'i, T> CssRuleList<'i, T> {
}
}
CssRule::LayerBlock(layer) => {
if let Some(CssRule::LayerBlock(last_rule)) = rules.last_mut() {
if last_rule.name == layer.name {
last_rule.rules.0.extend(layer.rules.0.drain(..));
last_rule.minify(context, parent_is_unused)?;
continue;
// Merging non-adjacent layer rules is safe because they are applied
// in the order they are first defined.
if let Some(name) = &layer.name {
if let Some(idx) = layer_rules.get(name) {
if let Some(CssRule::LayerBlock(last_rule)) = rules.get_mut(*idx) {
last_rule.rules.0.extend(layer.rules.0.drain(..));
last_rule.minify(context, parent_is_unused)?;
continue;
}
}

layer_rules.insert(name.clone(), rules.len());
}
if layer.minify(context, parent_is_unused)? {
continue;
Expand Down

0 comments on commit 6419d54

Please sign in to comment.