diff --git a/src/atrule/mod.rs b/src/atrule/mod.rs index fcbbeea..88cb3df 100644 --- a/src/atrule/mod.rs +++ b/src/atrule/mod.rs @@ -153,15 +153,13 @@ impl AtRule { } } AtRuleKind::AtRoot => { - let mut selector = &Selector::replace( + let mut selector = &Selector::from_tokens( + &mut read_until_open_curly_brace(toks)?.into_iter().peekmore(), + scope, super_selector, - Selector::from_tokens( - &mut read_until_open_curly_brace(toks)?.into_iter().peekmore(), - scope, - super_selector, - true, - )?, - ); + true, + )? + .resolve_parent_selectors(super_selector, false); let mut is_some = true; if selector.is_empty() { is_some = false; diff --git a/src/atrule/parse.rs b/src/atrule/parse.rs index b1bbf13..af54c93 100644 --- a/src/atrule/parse.rs +++ b/src/atrule/parse.rs @@ -81,11 +81,8 @@ pub(crate) fn eat_stmts_at_root>( ), Expr::MixinDecl(..) | Expr::FunctionDecl(..) => todo!(), Expr::Selector(mut selector) => { - if nesting > 1 || is_some { - selector = selector.resolve_parent_selectors(super_selector, true); - } else { - selector = Selector::replace(super_selector, selector); - } + selector = + selector.resolve_parent_selectors(super_selector, nesting > 1 || is_some); nesting += 1; let rules = eat_stmts_at_root(toks, scope, &selector, nesting, true, content)?; nesting -= 1; diff --git a/src/selector/mod.rs b/src/selector/mod.rs index 171dfdc..53facb4 100644 --- a/src/selector/mod.rs +++ b/src/selector/mod.rs @@ -112,11 +112,6 @@ impl Selector { )) } - #[allow(clippy::needless_pass_by_value)] - pub fn replace(super_selector: &Selector, this: Selector) -> Selector { - todo!() - } - /// Small wrapper around `SelectorList`'s method that turns an empty parent selector /// into `None`. This is a hack and in the future should be replaced. // todo: take Option for parent diff --git a/tests/at-root.rs b/tests/at-root.rs index 7e122ac..e16d4e5 100644 --- a/tests/at-root.rs +++ b/tests/at-root.rs @@ -1,65 +1,65 @@ -// #![cfg(test)] +#![cfg(test)] -// #[macro_use] -// mod macros; +#[macro_use] +mod macros; -// test!( -// simple_nested, -// ".foo {\n @at-root {\n .bar {a: b}\n }\n}\n", -// ".bar {\n a: b;\n}\n" -// ); -// test!( -// with_selector, -// ".foo {\n @at-root .bar {a: b}\n}\n", -// ".bar {\n a: b;\n}\n" -// ); -// test!( -// with_selector_in_mixin, -// "@mixin bar {\n @at-root .bar {a: b}\n}\n\n.foo {\n @include bar;\n}\n", -// ".bar {\n a: b;\n}\n" -// ); -// test!( -// with_super_selector, -// ".foo {\n @at-root & {\n a: b;\n }\n}\n", -// ".foo {\n a: b;\n}\n" -// ); -// test!( -// nested_with_super_selector, -// ".foo {\n @at-root & {\n .bar {\n @at-root & {\n a: b;\n }\n }\n }\n}\n", -// ".foo .bar {\n a: b;\n}\n" -// ); -// test!( -// deeply_nested_with_rulesets_and_styles, -// ".foo {\n @at-root .bar {\n a: b;\n c {\n d: e;\n foo {\n bar: baz;\n }\n h: j;\n }\n f: g;\n }\n}\n", -// ".bar {\n a: b;\n f: g;\n}\n.bar c {\n d: e;\n h: j;\n}\n.bar c foo {\n bar: baz;\n}\n" -// ); -// test!( -// super_selector_inside_with_nothing, -// "foo {\n @at-root {\n & {\n color: bar;\n }\n }\n}\n", -// "foo {\n color: bar;\n}\n" -// ); -// test!( -// interpolated_super_selector_with_nothing, -// "test {\n @at-root {\n #{&}post {\n foo {\n bar: baz;\n }\n }\n }\n}\n", -// "testpost foo {\n bar: baz;\n}\n" -// ); -// test!( -// with_ampersand_single, -// "test {\n @at-root {\n #{&}post {\n foo {\n bar: baz;\n }\n }\n }\n}\n", -// "testpost foo {\n bar: baz;\n}\n" -// ); -// test!( -// root_interpolated_ampersand, -// "@at-root {\n #{&}post {\n foo {\n bar: baz;\n }\n }\n}\n", -// "post foo {\n bar: baz;\n}\n" -// ); -// test!( -// nested_prefix_interpolated_ampersand, -// "test {\n @at-root {\n pre#{&} {\n foo {\n bar: baz;\n }\n }\n }\n}\n", -// "pretest foo {\n bar: baz;\n}\n" -// ); -// test!( -// nested_alone_interpolated_ampersand, -// "test {\n @at-root {\n #{&} {\n foo {\n bar: baz;\n }\n }\n }\n}\n", -// "test foo {\n bar: baz;\n}\n" -// ); +test!( + simple_nested, + ".foo {\n @at-root {\n .bar {a: b}\n }\n}\n", + ".bar {\n a: b;\n}\n" +); +test!( + with_selector, + ".foo {\n @at-root .bar {a: b}\n}\n", + ".bar {\n a: b;\n}\n" +); +test!( + with_selector_in_mixin, + "@mixin bar {\n @at-root .bar {a: b}\n}\n\n.foo {\n @include bar;\n}\n", + ".bar {\n a: b;\n}\n" +); +test!( + with_super_selector, + ".foo {\n @at-root & {\n a: b;\n }\n}\n", + ".foo {\n a: b;\n}\n" +); +test!( + nested_with_super_selector, + ".foo {\n @at-root & {\n .bar {\n @at-root & {\n a: b;\n }\n }\n }\n}\n", + ".foo .bar {\n a: b;\n}\n" +); +test!( + deeply_nested_with_rulesets_and_styles, + ".foo {\n @at-root .bar {\n a: b;\n c {\n d: e;\n foo {\n bar: baz;\n }\n h: j;\n }\n f: g;\n }\n}\n", + ".bar {\n a: b;\n f: g;\n}\n.bar c {\n d: e;\n h: j;\n}\n.bar c foo {\n bar: baz;\n}\n" +); +test!( + super_selector_inside_with_nothing, + "foo {\n @at-root {\n & {\n color: bar;\n }\n }\n}\n", + "foo {\n color: bar;\n}\n" +); +test!( + interpolated_super_selector_with_nothing, + "test {\n @at-root {\n #{&}post {\n foo {\n bar: baz;\n }\n }\n }\n}\n", + "testpost foo {\n bar: baz;\n}\n" +); +test!( + with_ampersand_single, + "test {\n @at-root {\n #{&}post {\n foo {\n bar: baz;\n }\n }\n }\n}\n", + "testpost foo {\n bar: baz;\n}\n" +); +test!( + root_interpolated_ampersand, + "@at-root {\n #{&}post {\n foo {\n bar: baz;\n }\n }\n}\n", + "post foo {\n bar: baz;\n}\n" +); +test!( + nested_prefix_interpolated_ampersand, + "test {\n @at-root {\n pre#{&} {\n foo {\n bar: baz;\n }\n }\n }\n}\n", + "pretest foo {\n bar: baz;\n}\n" +); +test!( + nested_alone_interpolated_ampersand, + "test {\n @at-root {\n #{&} {\n foo {\n bar: baz;\n }\n }\n }\n}\n", + "test foo {\n bar: baz;\n}\n" +);