From e400f390378f35661fc0bdb9bcd6dec2d02c8658 Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Fri, 21 Oct 2022 02:14:40 +0300 Subject: [PATCH 01/19] refactor(css/parser): inner parser --- .../swc_css_parser/src/parser/syntax/mod.rs | 98 +++++++------------ crates/swc_css_parser/src/parser/util.rs | 13 +++ 2 files changed, 47 insertions(+), 64 deletions(-) diff --git a/crates/swc_css_parser/src/parser/syntax/mod.rs b/crates/swc_css_parser/src/parser/syntax/mod.rs index e2681c00d0a3..1aa129b71fdb 100644 --- a/crates/swc_css_parser/src/parser/syntax/mod.rs +++ b/crates/swc_css_parser/src/parser/syntax/mod.rs @@ -5,7 +5,7 @@ use super::{input::ParserInput, PResult, Parser}; use crate::{ error::{Error, ErrorKind}, parser::{BlockContentsGrammar, Ctx}, - Parse, + Parse, Tokens, }; impl Parse for Parser @@ -124,16 +124,15 @@ where let span = self.input.cur_span(); // Create a new qualified rule with its prelude initially set to an empty list, // and its value initially set to nothing. - let mut prelude = QualifiedRulePrelude::ListOfComponentValues(ListOfComponentValues { + let mut prelude = Tokens { span: Default::default(), - children: vec![], - }); + tokens: vec![], + }; // Repeatedly consume the next input token: loop { // // This is a parse error. Return nothing. - // But we return for error recovery blocks if is!(self, EOF) { let span = self.input.cur_span(); @@ -151,79 +150,50 @@ where }; let block = self.with_ctx(ctx).parse_as::()?; - return Ok(QualifiedRule { - span: span!(self, span.lo), - prelude, - block, - }); - } - // Reconsume the current input token. Consume a component value. Append the returned - // value to the qualified rule’s prelude. - _ => { - let state = self.input.state(); - let selector_list: PResult = self.parse(); - - prelude = match selector_list { - Ok(mut selector_list) => { + let prelude = match self.parse_according_to_grammar::(&prelude) { + Ok(selector_list) => { if self.ctx.is_trying_legacy_nesting { - selector_list = self - .legacy_nested_selector_list_to_modern_selector_list( + QualifiedRulePrelude::SelectorList( + self.legacy_nested_selector_list_to_modern_selector_list( selector_list, - )?; + )?, + ) + } else { + QualifiedRulePrelude::SelectorList(selector_list) } - - QualifiedRulePrelude::SelectorList(selector_list) } Err(err) => { if self.ctx.is_trying_legacy_nesting { - self.input.reset(&state); - - let relative_selector_list: PResult = - self.parse(); - - match relative_selector_list { + match self + .parse_according_to_grammar::(&prelude) + { Ok(relative_selector_list) => { - let selector_list = self - .legacy_relative_selector_list_to_modern_selector_list( - relative_selector_list, - )?; - - QualifiedRulePrelude::SelectorList(selector_list) + self.legacy_relative_selector_list_to_modern_selector_list( + relative_selector_list, + )?; } _ => { - return Err(err); - } - } - } else { - self.errors.push(err); - self.input.reset(&state); - - let span = self.input.cur_span(); - let mut children = vec![]; - - while !is_one_of!(self, EOF, "{") { - if is!(self, ";") { - let span = self.input.cur_span(); - - return Err(Error::new( - span, - ErrorKind::UnexpectedChar(';'), - )); - } - - if let Some(token_and_span) = self.input.bump() { - children - .push(ComponentValue::PreservedToken(token_and_span)); + // Ignore } } - - QualifiedRulePrelude::ListOfComponentValues(ListOfComponentValues { - span: span!(self, span.lo), - children, - }) } + + return Err(err); } }; + + return Ok(QualifiedRule { + span: span!(self, span.lo), + prelude, + block, + }); + } + // Reconsume the current input token. Consume a component value. Append the returned + // value to the qualified rule’s prelude. + _ => { + let item = self.input.bump().unwrap(); + + prelude.tokens.push(item); } } } diff --git a/crates/swc_css_parser/src/parser/util.rs b/crates/swc_css_parser/src/parser/util.rs index 9425484a60bd..b557f4420099 100644 --- a/crates/swc_css_parser/src/parser/util.rs +++ b/crates/swc_css_parser/src/parser/util.rs @@ -4,6 +4,7 @@ use swc_common::DUMMY_SP; use swc_css_ast::*; use super::{input::ParserInput, Ctx, PResult, Parse, Parser}; +use crate::{Tokens, TokensInput}; impl Parser where @@ -13,7 +14,9 @@ where #[inline] pub(super) fn with_ctx(&mut self, ctx: Ctx) -> WithCtx { let orig_ctx = self.ctx; + self.ctx = ctx; + WithCtx { orig_ctx, inner: self, @@ -28,6 +31,16 @@ where self.parse() } + pub fn parse_according_to_grammar<'a, T>(&mut self, tokens: &'a Tokens) -> PResult + where + Parser>: Parse, + { + let lexer = TokensInput::new(tokens); + let mut parser = Parser::new(lexer, self.config); + + parser.parse() + } + pub(super) fn legacy_nested_selector_list_to_modern_selector_list( &mut self, mut selector_list: SelectorList, From c931fe614931ab398036aadff926373c0f7dda56 Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Fri, 21 Oct 2022 04:42:37 +0300 Subject: [PATCH 02/19] refactor(css/parser): new approach --- .../swc_css_parser/src/parser/syntax/mod.rs | 114 +- .../pseudo-class/unknown/span.rust-debug | 1009 ++-------------- .../pseudo-element/unknown/span.rust-debug | 1020 ++--------------- .../recovery/at-rule/extra-semi/output.json | 229 ++-- .../at-rule/extra-semi/output.swc-stderr | 6 - .../at-rule/extra-semi/span.rust-debug | 74 +- .../media/invalid-nesting/output.swc-stderr | 14 +- .../media/wrong-stylesheet/output.json | 205 ++-- .../media/wrong-stylesheet/output.swc-stderr | 6 - .../media/wrong-stylesheet/span.rust-debug | 74 +- .../comments/bad-comment-1/output.swc-stderr | 6 - .../tests/recovery/hacks/output.json | 727 ++++++------ .../tests/recovery/hacks/output.swc-stderr | 10 +- .../tests/recovery/hacks/span.rust-debug | 599 ++++++---- .../attribute/invalid-matcher-1/output.json | 75 +- .../invalid-matcher-1/span.rust-debug | 20 +- .../attribute/invalid-matcher-2/output.json | 129 +-- .../invalid-matcher-2/span.rust-debug | 20 +- .../attribute/invalid-matcher-3/output.json | 287 ++--- .../invalid-matcher-3/span.rust-debug | 20 +- .../attribute/invalid-matcher-4/output.json | 129 +-- .../invalid-matcher-4/span.rust-debug | 20 +- .../attribute/invalid-matcher/output.json | 129 +-- .../attribute/invalid-matcher/span.rust-debug | 20 +- .../attribute/invalid-modifier/output.json | 157 +-- .../invalid-modifier/span.rust-debug | 20 +- .../selector/attribute/unclosed/output.json | 92 +- .../attribute/unclosed/output.swc-stderr | 2 +- .../attribute/unclosed/span.rust-debug | 8 +- .../pseudo-class/invalid-function/output.json | 57 +- .../invalid-function/span.rust-debug | 22 +- .../basic/output.swc-stderr | 14 +- .../invalid-nested-2/output.json | 727 ++++++------ .../invalid-nested-2/output.swc-stderr | 10 +- .../invalid-nested-2/span.rust-debug | 287 +++-- .../invalid-nested/output.json | 736 ++++++------ .../invalid-nested/output.swc-stderr | 10 +- .../invalid-nested/span.rust-debug | 299 +++-- .../recovery/vercel/001/output.swc-stderr | 6 - 39 files changed, 3000 insertions(+), 4389 deletions(-) diff --git a/crates/swc_css_parser/src/parser/syntax/mod.rs b/crates/swc_css_parser/src/parser/syntax/mod.rs index 1aa129b71fdb..ff8f1f18cb76 100644 --- a/crates/swc_css_parser/src/parser/syntax/mod.rs +++ b/crates/swc_css_parser/src/parser/syntax/mod.rs @@ -1,4 +1,4 @@ -use swc_common::Span; +use swc_common::{Span, Spanned, SyntaxContext, DUMMY_SP}; use swc_css_ast::*; use super::{input::ParserInput, PResult, Parser}; @@ -121,6 +121,55 @@ where I: ParserInput, { fn parse(&mut self) -> PResult { + let create_prelude = |p: &mut Parser, + mut tokens: Tokens| + -> PResult { + let span = match (tokens.tokens.first(), tokens.tokens.last()) { + (Some(first), Some(last)) => { + Span::new(first.span_lo(), last.span_hi(), SyntaxContext::empty()) + } + _ => DUMMY_SP, + }; + tokens.span = span; + + match p.parse_according_to_grammar::(&tokens) { + Ok(selector_list) => { + if p.ctx.is_trying_legacy_nesting { + let selector_list = + p.legacy_nested_selector_list_to_modern_selector_list(selector_list)?; + + Ok(QualifiedRulePrelude::SelectorList(selector_list)) + } else { + Ok(QualifiedRulePrelude::SelectorList(selector_list)) + } + } + Err(err) => { + if p.ctx.is_trying_legacy_nesting { + match p.parse_according_to_grammar::(&tokens) { + Ok(relative_selector_list) => { + let selector_list = p + .legacy_relative_selector_list_to_modern_selector_list( + relative_selector_list, + )?; + + Ok(QualifiedRulePrelude::SelectorList(selector_list)) + } + _ => Err(err), + } + } else { + p.errors.push(err); + + let list_of_component_values = + p.parse_according_to_grammar::(&tokens)?; + + Ok(QualifiedRulePrelude::ListOfComponentValues( + list_of_component_values, + )) + } + } + } + }; + let span = self.input.cur_span(); // Create a new qualified rule with its prelude initially set to an empty list, // and its value initially set to nothing. @@ -150,41 +199,9 @@ where }; let block = self.with_ctx(ctx).parse_as::()?; - let prelude = match self.parse_according_to_grammar::(&prelude) { - Ok(selector_list) => { - if self.ctx.is_trying_legacy_nesting { - QualifiedRulePrelude::SelectorList( - self.legacy_nested_selector_list_to_modern_selector_list( - selector_list, - )?, - ) - } else { - QualifiedRulePrelude::SelectorList(selector_list) - } - } - Err(err) => { - if self.ctx.is_trying_legacy_nesting { - match self - .parse_according_to_grammar::(&prelude) - { - Ok(relative_selector_list) => { - self.legacy_relative_selector_list_to_modern_selector_list( - relative_selector_list, - )?; - } - _ => { - // Ignore - } - } - } - - return Err(err); - } - }; - return Ok(QualifiedRule { span: span!(self, span.lo), - prelude, + prelude: create_prelude(self, prelude)?, block, }); } @@ -903,3 +920,32 @@ where }) } } + +impl Parse for Parser +where + I: ParserInput, +{ + fn parse(&mut self) -> PResult { + let span = self.input.cur_span(); + let ctx = Ctx { + block_contents_grammar: BlockContentsGrammar::NoGrammar, + ..self.ctx + }; + let mut children = vec![]; + + loop { + if is!(self, EOF) { + break; + } + + let components_value = self.with_ctx(ctx).parse_as::()?; + + children.push(components_value); + } + + Ok(ListOfComponentValues { + span: span!(self, span.lo), + children, + }) + } +} diff --git a/crates/swc_css_parser/tests/fixture/selector/pseudo-class/unknown/span.rust-debug b/crates/swc_css_parser/tests/fixture/selector/pseudo-class/unknown/span.rust-debug index f54200d69a6b..713f2389d780 100644 --- a/crates/swc_css_parser/tests/fixture/selector/pseudo-class/unknown/span.rust-debug +++ b/crates/swc_css_parser/tests/fixture/selector/pseudo-class/unknown/span.rust-debug @@ -10,17 +10,7 @@ 7 | | :unknown((foo bar)) {} 8 | | :unknown(((foo bar))) {} 9 | | :unknown({foo: bar}) {} - 10 | | :unknown({{foo: bar}}) {} - 11 | | :unknown({foo: bar !important}) {} - 12 | | :unknown("string") {} - 13 | | :unknown("string", foo) {} - 14 | | :unknown('string') {} - 15 | | :unknown(url(foo.png)) {} - 16 | | :unknown({!}) {} - 17 | | :unknown(!) {} - 18 | | :unknown({;}) {} - 19 | | :unknown(;) {} - 20 | `-> + 10 | `-> :unknown({{foo: bar}}) {} `---- x Rule @@ -782,121 +772,133 @@ x Rule ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^^^^^^^^^^^^^^^^^^^^^^^ + : ^^^^^^^^^^^^^^^^^^^ `---- x QualifiedRule ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^^^^^^^^^^^^^^^^^^^^^^^ + : ^^^^^^^^^^^^^^^^^^^ `---- - x SelectorList + x ComponentValue ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^^^^^^^^^^^^^^^^^^^^ + : ^ `---- - x ComplexSelector + x Colon ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^^^^^^^^^^^^^^^^^^^^ + : ^ `---- - x CompoundSelector + x ComponentValue ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^^^^^^^^^^^^^^^^^^^^ + : ^^^^^^^^ `---- - x SubclassSelector + x Function ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^^^^^^^^^^^^^^^^^^^^ + : ^^^^^^^^ `---- - x PseudoClassSelector + x Ident ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^^^^^^^^^^^^^^^^^^^^ + : ^^^^^^^ `---- - x Ident + x SimpleBlock ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^^^^^^^ + : ^^^^^^^^^^ `---- - x PseudoClassSelectorChildren + x LBrace ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} : ^ `---- - x LBrace + x ComponentValue ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^ + : ^^^^^^^^ `---- - x PseudoClassSelectorChildren + x StyleBlock + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] + 9 | :unknown({foo: bar}) {} + : ^^^^^^^^ + `---- + + x Declaration + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] + 9 | :unknown({foo: bar}) {} + : ^^^^^^^^ + `---- + + x DeclarationName ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} : ^^^ `---- - x Ident { value: Atom('foo' type=inline), raw: Atom('foo' type=inline) } + x Ident ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} : ^^^ `---- - x PseudoClassSelectorChildren + x ComponentValue ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^ + : ^^^ `---- - x Colon + x Ident ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^ + : ^^^ `---- - x PseudoClassSelectorChildren + x Rule ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^ + : ^^^^ `---- - x WhiteSpace { value: Atom(' ' type=inline) } + x QualifiedRule ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^ + : ^^^^ `---- - x PseudoClassSelectorChildren + x ComponentValue ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^^^ + : ^ `---- - x Ident { value: Atom('bar' type=inline), raw: Atom('bar' type=inline) } + x RParen ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^^^ + : ^ `---- - x PseudoClassSelectorChildren + x ComponentValue ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^ + : ^ `---- - x RBrace + x WhiteSpace { value: Atom(' ' type=inline) } ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^ + : ^ `---- x SimpleBlock @@ -914,64 +916,70 @@ x Rule ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] 10 | :unknown({{foo: bar}}) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^^ + : ^^^^^^^^^^^^^^^^^^^^ `---- x QualifiedRule ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] 10 | :unknown({{foo: bar}}) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^^ + : ^^^^^^^^^^^^^^^^^^^^ `---- - x SelectorList + x ComponentValue ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] 10 | :unknown({{foo: bar}}) {} - : ^^^^^^^^^^^^^^^^^^^^^^ + : ^ `---- - x ComplexSelector + x Colon ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] 10 | :unknown({{foo: bar}}) {} - : ^^^^^^^^^^^^^^^^^^^^^^ + : ^ `---- - x CompoundSelector + x ComponentValue ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] 10 | :unknown({{foo: bar}}) {} - : ^^^^^^^^^^^^^^^^^^^^^^ + : ^^^^^^^^ `---- - x SubclassSelector + x Function ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] 10 | :unknown({{foo: bar}}) {} - : ^^^^^^^^^^^^^^^^^^^^^^ + : ^^^^^^^^ `---- - x PseudoClassSelector + x Ident ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] 10 | :unknown({{foo: bar}}) {} - : ^^^^^^^^^^^^^^^^^^^^^^ + : ^^^^^^^ `---- - x Ident + x SimpleBlock ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] 10 | :unknown({{foo: bar}}) {} - : ^^^^^^^ + : ^^^^^^^^^^^ `---- - x PseudoClassSelectorChildren + x LBrace ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] 10 | :unknown({{foo: bar}}) {} : ^ `---- - x LBrace + x ComponentValue ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] 10 | :unknown({{foo: bar}}) {} - : ^ + : ^^^^^^^^^ `---- - x PseudoClassSelectorChildren + x StyleBlock + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] + 10 | :unknown({{foo: bar}}) {} + : ^^^^^^^^^ + `---- + + x ComponentValue ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] 10 | :unknown({{foo: bar}}) {} : ^ @@ -983,7 +991,7 @@ : ^ `---- - x PseudoClassSelectorChildren + x ComponentValue ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] 10 | :unknown({{foo: bar}}) {} : ^^^ @@ -995,7 +1003,7 @@ : ^^^ `---- - x PseudoClassSelectorChildren + x ComponentValue ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] 10 | :unknown({{foo: bar}}) {} : ^ @@ -1007,7 +1015,7 @@ : ^ `---- - x PseudoClassSelectorChildren + x ComponentValue ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] 10 | :unknown({{foo: bar}}) {} : ^ @@ -1019,7 +1027,7 @@ : ^ `---- - x PseudoClassSelectorChildren + x ComponentValue ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] 10 | :unknown({{foo: bar}}) {} : ^^^ @@ -1030,868 +1038,3 @@ 10 | :unknown({{foo: bar}}) {} : ^^^ `---- - - x PseudoClassSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] - 10 | :unknown({{foo: bar}}) {} - : ^ - `---- - - x RBrace - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] - 10 | :unknown({{foo: bar}}) {} - : ^ - `---- - - x PseudoClassSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] - 10 | :unknown({{foo: bar}}) {} - : ^ - `---- - - x RBrace - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] - 10 | :unknown({{foo: bar}}) {} - : ^ - `---- - - x SimpleBlock - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] - 10 | :unknown({{foo: bar}}) {} - : ^^ - `---- - - x LBrace - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] - 10 | :unknown({{foo: bar}}) {} - : ^ - `---- - - x Rule - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] - 11 | :unknown({foo: bar !important}) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x QualifiedRule - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] - 11 | :unknown({foo: bar !important}) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x SelectorList - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] - 11 | :unknown({foo: bar !important}) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x ComplexSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] - 11 | :unknown({foo: bar !important}) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x CompoundSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] - 11 | :unknown({foo: bar !important}) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x SubclassSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] - 11 | :unknown({foo: bar !important}) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x PseudoClassSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] - 11 | :unknown({foo: bar !important}) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x Ident - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] - 11 | :unknown({foo: bar !important}) {} - : ^^^^^^^ - `---- - - x PseudoClassSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] - 11 | :unknown({foo: bar !important}) {} - : ^ - `---- - - x LBrace - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] - 11 | :unknown({foo: bar !important}) {} - : ^ - `---- - - x PseudoClassSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] - 11 | :unknown({foo: bar !important}) {} - : ^^^ - `---- - - x Ident { value: Atom('foo' type=inline), raw: Atom('foo' type=inline) } - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] - 11 | :unknown({foo: bar !important}) {} - : ^^^ - `---- - - x PseudoClassSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] - 11 | :unknown({foo: bar !important}) {} - : ^ - `---- - - x Colon - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] - 11 | :unknown({foo: bar !important}) {} - : ^ - `---- - - x PseudoClassSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] - 11 | :unknown({foo: bar !important}) {} - : ^ - `---- - - x WhiteSpace { value: Atom(' ' type=inline) } - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] - 11 | :unknown({foo: bar !important}) {} - : ^ - `---- - - x PseudoClassSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] - 11 | :unknown({foo: bar !important}) {} - : ^^^ - `---- - - x Ident { value: Atom('bar' type=inline), raw: Atom('bar' type=inline) } - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] - 11 | :unknown({foo: bar !important}) {} - : ^^^ - `---- - - x PseudoClassSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] - 11 | :unknown({foo: bar !important}) {} - : ^ - `---- - - x WhiteSpace { value: Atom(' ' type=inline) } - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] - 11 | :unknown({foo: bar !important}) {} - : ^ - `---- - - x PseudoClassSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] - 11 | :unknown({foo: bar !important}) {} - : ^ - `---- - - x Delim { value: '!' } - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] - 11 | :unknown({foo: bar !important}) {} - : ^ - `---- - - x PseudoClassSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] - 11 | :unknown({foo: bar !important}) {} - : ^^^^^^^^^ - `---- - - x Ident { value: Atom('important' type=static), raw: Atom('important' type=static) } - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] - 11 | :unknown({foo: bar !important}) {} - : ^^^^^^^^^ - `---- - - x PseudoClassSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] - 11 | :unknown({foo: bar !important}) {} - : ^ - `---- - - x RBrace - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] - 11 | :unknown({foo: bar !important}) {} - : ^ - `---- - - x SimpleBlock - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] - 11 | :unknown({foo: bar !important}) {} - : ^^ - `---- - - x LBrace - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] - 11 | :unknown({foo: bar !important}) {} - : ^ - `---- - - x Rule - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:12:1] - 12 | :unknown("string") {} - : ^^^^^^^^^^^^^^^^^^^^^ - `---- - - x QualifiedRule - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:12:1] - 12 | :unknown("string") {} - : ^^^^^^^^^^^^^^^^^^^^^ - `---- - - x SelectorList - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:12:1] - 12 | :unknown("string") {} - : ^^^^^^^^^^^^^^^^^^ - `---- - - x ComplexSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:12:1] - 12 | :unknown("string") {} - : ^^^^^^^^^^^^^^^^^^ - `---- - - x CompoundSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:12:1] - 12 | :unknown("string") {} - : ^^^^^^^^^^^^^^^^^^ - `---- - - x SubclassSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:12:1] - 12 | :unknown("string") {} - : ^^^^^^^^^^^^^^^^^^ - `---- - - x PseudoClassSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:12:1] - 12 | :unknown("string") {} - : ^^^^^^^^^^^^^^^^^^ - `---- - - x Ident - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:12:1] - 12 | :unknown("string") {} - : ^^^^^^^ - `---- - - x PseudoClassSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:12:1] - 12 | :unknown("string") {} - : ^^^^^^^^ - `---- - - x String { value: Atom('string' type=static), raw: Atom('"string"' type=dynamic) } - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:12:1] - 12 | :unknown("string") {} - : ^^^^^^^^ - `---- - - x SimpleBlock - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:12:1] - 12 | :unknown("string") {} - : ^^ - `---- - - x LBrace - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:12:1] - 12 | :unknown("string") {} - : ^ - `---- - - x Rule - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] - 13 | :unknown("string", foo) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x QualifiedRule - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] - 13 | :unknown("string", foo) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x SelectorList - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] - 13 | :unknown("string", foo) {} - : ^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x ComplexSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] - 13 | :unknown("string", foo) {} - : ^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x CompoundSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] - 13 | :unknown("string", foo) {} - : ^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x SubclassSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] - 13 | :unknown("string", foo) {} - : ^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x PseudoClassSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] - 13 | :unknown("string", foo) {} - : ^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x Ident - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] - 13 | :unknown("string", foo) {} - : ^^^^^^^ - `---- - - x PseudoClassSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] - 13 | :unknown("string", foo) {} - : ^^^^^^^^ - `---- - - x String { value: Atom('string' type=static), raw: Atom('"string"' type=dynamic) } - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] - 13 | :unknown("string", foo) {} - : ^^^^^^^^ - `---- - - x PseudoClassSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] - 13 | :unknown("string", foo) {} - : ^ - `---- - - x Comma - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] - 13 | :unknown("string", foo) {} - : ^ - `---- - - x PseudoClassSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] - 13 | :unknown("string", foo) {} - : ^ - `---- - - x WhiteSpace { value: Atom(' ' type=inline) } - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] - 13 | :unknown("string", foo) {} - : ^ - `---- - - x PseudoClassSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] - 13 | :unknown("string", foo) {} - : ^^^ - `---- - - x Ident { value: Atom('foo' type=inline), raw: Atom('foo' type=inline) } - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] - 13 | :unknown("string", foo) {} - : ^^^ - `---- - - x SimpleBlock - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] - 13 | :unknown("string", foo) {} - : ^^ - `---- - - x LBrace - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] - 13 | :unknown("string", foo) {} - : ^ - `---- - - x Rule - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:14:1] - 14 | :unknown('string') {} - : ^^^^^^^^^^^^^^^^^^^^^ - `---- - - x QualifiedRule - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:14:1] - 14 | :unknown('string') {} - : ^^^^^^^^^^^^^^^^^^^^^ - `---- - - x SelectorList - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:14:1] - 14 | :unknown('string') {} - : ^^^^^^^^^^^^^^^^^^ - `---- - - x ComplexSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:14:1] - 14 | :unknown('string') {} - : ^^^^^^^^^^^^^^^^^^ - `---- - - x CompoundSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:14:1] - 14 | :unknown('string') {} - : ^^^^^^^^^^^^^^^^^^ - `---- - - x SubclassSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:14:1] - 14 | :unknown('string') {} - : ^^^^^^^^^^^^^^^^^^ - `---- - - x PseudoClassSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:14:1] - 14 | :unknown('string') {} - : ^^^^^^^^^^^^^^^^^^ - `---- - - x Ident - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:14:1] - 14 | :unknown('string') {} - : ^^^^^^^ - `---- - - x PseudoClassSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:14:1] - 14 | :unknown('string') {} - : ^^^^^^^^ - `---- - - x String { value: Atom('string' type=static), raw: Atom(''string'' type=dynamic) } - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:14:1] - 14 | :unknown('string') {} - : ^^^^^^^^ - `---- - - x SimpleBlock - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:14:1] - 14 | :unknown('string') {} - : ^^ - `---- - - x LBrace - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:14:1] - 14 | :unknown('string') {} - : ^ - `---- - - x Rule - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:15:1] - 15 | :unknown(url(foo.png)) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x QualifiedRule - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:15:1] - 15 | :unknown(url(foo.png)) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x SelectorList - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:15:1] - 15 | :unknown(url(foo.png)) {} - : ^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x ComplexSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:15:1] - 15 | :unknown(url(foo.png)) {} - : ^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x CompoundSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:15:1] - 15 | :unknown(url(foo.png)) {} - : ^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x SubclassSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:15:1] - 15 | :unknown(url(foo.png)) {} - : ^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x PseudoClassSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:15:1] - 15 | :unknown(url(foo.png)) {} - : ^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x Ident - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:15:1] - 15 | :unknown(url(foo.png)) {} - : ^^^^^^^ - `---- - - x PseudoClassSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:15:1] - 15 | :unknown(url(foo.png)) {} - : ^^^^^^^^^^^^ - `---- - - x Url { name: Atom('url' type=static), raw_name: Atom('url' type=static), before: Atom('' type=static), after: Atom('' type=static), value: Atom('foo.png' type=inline), raw_value: Atom('foo.png' - | type=inline) } - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:15:1] - 15 | :unknown(url(foo.png)) {} - : ^^^^^^^^^^^^ - `---- - - x SimpleBlock - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:15:1] - 15 | :unknown(url(foo.png)) {} - : ^^ - `---- - - x LBrace - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:15:1] - 15 | :unknown(url(foo.png)) {} - : ^ - `---- - - x Rule - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:16:1] - 16 | :unknown({!}) {} - : ^^^^^^^^^^^^^^^^ - `---- - - x QualifiedRule - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:16:1] - 16 | :unknown({!}) {} - : ^^^^^^^^^^^^^^^^ - `---- - - x SelectorList - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:16:1] - 16 | :unknown({!}) {} - : ^^^^^^^^^^^^^ - `---- - - x ComplexSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:16:1] - 16 | :unknown({!}) {} - : ^^^^^^^^^^^^^ - `---- - - x CompoundSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:16:1] - 16 | :unknown({!}) {} - : ^^^^^^^^^^^^^ - `---- - - x SubclassSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:16:1] - 16 | :unknown({!}) {} - : ^^^^^^^^^^^^^ - `---- - - x PseudoClassSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:16:1] - 16 | :unknown({!}) {} - : ^^^^^^^^^^^^^ - `---- - - x Ident - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:16:1] - 16 | :unknown({!}) {} - : ^^^^^^^ - `---- - - x PseudoClassSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:16:1] - 16 | :unknown({!}) {} - : ^ - `---- - - x LBrace - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:16:1] - 16 | :unknown({!}) {} - : ^ - `---- - - x PseudoClassSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:16:1] - 16 | :unknown({!}) {} - : ^ - `---- - - x Delim { value: '!' } - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:16:1] - 16 | :unknown({!}) {} - : ^ - `---- - - x PseudoClassSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:16:1] - 16 | :unknown({!}) {} - : ^ - `---- - - x RBrace - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:16:1] - 16 | :unknown({!}) {} - : ^ - `---- - - x SimpleBlock - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:16:1] - 16 | :unknown({!}) {} - : ^^ - `---- - - x LBrace - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:16:1] - 16 | :unknown({!}) {} - : ^ - `---- - - x Rule - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:17:1] - 17 | :unknown(!) {} - : ^^^^^^^^^^^^^^ - `---- - - x QualifiedRule - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:17:1] - 17 | :unknown(!) {} - : ^^^^^^^^^^^^^^ - `---- - - x SelectorList - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:17:1] - 17 | :unknown(!) {} - : ^^^^^^^^^^^ - `---- - - x ComplexSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:17:1] - 17 | :unknown(!) {} - : ^^^^^^^^^^^ - `---- - - x CompoundSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:17:1] - 17 | :unknown(!) {} - : ^^^^^^^^^^^ - `---- - - x SubclassSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:17:1] - 17 | :unknown(!) {} - : ^^^^^^^^^^^ - `---- - - x PseudoClassSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:17:1] - 17 | :unknown(!) {} - : ^^^^^^^^^^^ - `---- - - x Ident - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:17:1] - 17 | :unknown(!) {} - : ^^^^^^^ - `---- - - x PseudoClassSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:17:1] - 17 | :unknown(!) {} - : ^ - `---- - - x Delim { value: '!' } - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:17:1] - 17 | :unknown(!) {} - : ^ - `---- - - x SimpleBlock - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:17:1] - 17 | :unknown(!) {} - : ^^ - `---- - - x LBrace - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:17:1] - 17 | :unknown(!) {} - : ^ - `---- - - x Rule - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:18:1] - 18 | :unknown({;}) {} - : ^^^^^^^^^^^^^^^^ - `---- - - x QualifiedRule - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:18:1] - 18 | :unknown({;}) {} - : ^^^^^^^^^^^^^^^^ - `---- - - x SelectorList - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:18:1] - 18 | :unknown({;}) {} - : ^^^^^^^^^^^^^ - `---- - - x ComplexSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:18:1] - 18 | :unknown({;}) {} - : ^^^^^^^^^^^^^ - `---- - - x CompoundSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:18:1] - 18 | :unknown({;}) {} - : ^^^^^^^^^^^^^ - `---- - - x SubclassSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:18:1] - 18 | :unknown({;}) {} - : ^^^^^^^^^^^^^ - `---- - - x PseudoClassSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:18:1] - 18 | :unknown({;}) {} - : ^^^^^^^^^^^^^ - `---- - - x Ident - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:18:1] - 18 | :unknown({;}) {} - : ^^^^^^^ - `---- - - x PseudoClassSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:18:1] - 18 | :unknown({;}) {} - : ^ - `---- - - x LBrace - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:18:1] - 18 | :unknown({;}) {} - : ^ - `---- - - x PseudoClassSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:18:1] - 18 | :unknown({;}) {} - : ^ - `---- - - x Semi - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:18:1] - 18 | :unknown({;}) {} - : ^ - `---- - - x PseudoClassSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:18:1] - 18 | :unknown({;}) {} - : ^ - `---- - - x RBrace - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:18:1] - 18 | :unknown({;}) {} - : ^ - `---- - - x SimpleBlock - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:18:1] - 18 | :unknown({;}) {} - : ^^ - `---- - - x LBrace - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:18:1] - 18 | :unknown({;}) {} - : ^ - `---- - - x Rule - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:19:1] - 19 | :unknown(;) {} - : ^^^^^^^^^^^^^^ - `---- - - x QualifiedRule - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:19:1] - 19 | :unknown(;) {} - : ^^^^^^^^^^^^^^ - `---- - - x SelectorList - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:19:1] - 19 | :unknown(;) {} - : ^^^^^^^^^^^ - `---- - - x ComplexSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:19:1] - 19 | :unknown(;) {} - : ^^^^^^^^^^^ - `---- - - x CompoundSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:19:1] - 19 | :unknown(;) {} - : ^^^^^^^^^^^ - `---- - - x SubclassSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:19:1] - 19 | :unknown(;) {} - : ^^^^^^^^^^^ - `---- - - x PseudoClassSelector - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:19:1] - 19 | :unknown(;) {} - : ^^^^^^^^^^^ - `---- - - x Ident - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:19:1] - 19 | :unknown(;) {} - : ^^^^^^^ - `---- - - x PseudoClassSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:19:1] - 19 | :unknown(;) {} - : ^ - `---- - - x Semi - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:19:1] - 19 | :unknown(;) {} - : ^ - `---- - - x SimpleBlock - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:19:1] - 19 | :unknown(;) {} - : ^^ - `---- - - x LBrace - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:19:1] - 19 | :unknown(;) {} - : ^ - `---- diff --git a/crates/swc_css_parser/tests/fixture/selector/pseudo-element/unknown/span.rust-debug b/crates/swc_css_parser/tests/fixture/selector/pseudo-element/unknown/span.rust-debug index 02cf0d9e119e..88a4c7346487 100644 --- a/crates/swc_css_parser/tests/fixture/selector/pseudo-element/unknown/span.rust-debug +++ b/crates/swc_css_parser/tests/fixture/selector/pseudo-element/unknown/span.rust-debug @@ -10,16 +10,7 @@ 7 | | ::unknown((foo bar)) {} 8 | | ::unknown(((foo bar))) {} 9 | | ::unknown({foo: bar}) {} - 10 | | ::unknown({{foo: bar}}) {} - 11 | | ::unknown({foo: bar !important}) {} - 12 | | ::unknown("string") {} - 13 | | ::unknown("string", foo) {} - 14 | | ::unknown('string') {} - 15 | | ::unknown(url(foo.png)) {} - 16 | | ::unknown({!}) {} - 17 | | ::unknown(!) {} - 18 | | ::unknown({;}) {} - 19 | `-> ::unknown(;) {} + 10 | `-> ::unknown({{foo: bar}}) {} `---- x Rule @@ -781,43 +772,49 @@ x Rule ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^ + : ^^^^^^^^^^^^^^^^^^^^ `---- x QualifiedRule ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^ + : ^^^^^^^^^^^^^^^^^^^^ `---- - x SelectorList + x ComponentValue ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} - : ^^^^^^^^^^^^^^^^^^^^^ + : ^ `---- - x ComplexSelector + x Colon ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} - : ^^^^^^^^^^^^^^^^^^^^^ + : ^ `---- - x CompoundSelector + x ComponentValue ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} - : ^^^^^^^^^^^^^^^^^^^^^ + : ^ `---- - x SubclassSelector + x Colon ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} - : ^^^^^^^^^^^^^^^^^^^^^ + : ^ `---- - x PseudoElementSelector + x ComponentValue ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} - : ^^^^^^^^^^^^^^^^^^^^^ + : ^^^^^^^^ + `---- + + x Function + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] + 9 | ::unknown({foo: bar}) {} + : ^^^^^^^^ `---- x Ident @@ -826,10 +823,10 @@ : ^^^^^^^ `---- - x PseudoElementSelectorChildren + x SimpleBlock ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} - : ^ + : ^^^^^^^^^^ `---- x LBrace @@ -838,64 +835,82 @@ : ^ `---- - x PseudoElementSelectorChildren + x ComponentValue + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] + 9 | ::unknown({foo: bar}) {} + : ^^^^^^^^ + `---- + + x StyleBlock + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] + 9 | ::unknown({foo: bar}) {} + : ^^^^^^^^ + `---- + + x Declaration + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] + 9 | ::unknown({foo: bar}) {} + : ^^^^^^^^ + `---- + + x DeclarationName ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} : ^^^ `---- - x Ident { value: Atom('foo' type=inline), raw: Atom('foo' type=inline) } + x Ident ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} : ^^^ `---- - x PseudoElementSelectorChildren + x ComponentValue ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} - : ^ + : ^^^ `---- - x Colon + x Ident ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} - : ^ + : ^^^ `---- - x PseudoElementSelectorChildren + x Rule ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} - : ^ + : ^^^^ `---- - x WhiteSpace { value: Atom(' ' type=inline) } + x QualifiedRule ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} - : ^ + : ^^^^ `---- - x PseudoElementSelectorChildren + x ComponentValue ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} - : ^^^ + : ^ `---- - x Ident { value: Atom('bar' type=inline), raw: Atom('bar' type=inline) } + x RParen ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} - : ^^^ + : ^ `---- - x PseudoElementSelectorChildren + x ComponentValue ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} - : ^ + : ^ `---- - x RBrace + x WhiteSpace { value: Atom(' ' type=inline) } ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} - : ^ + : ^ `---- x SimpleBlock @@ -913,43 +928,49 @@ x Rule ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] 10 | ::unknown({{foo: bar}}) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^^^ + : ^^^^^^^^^^^^^^^^^^^^^ `---- x QualifiedRule ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] 10 | ::unknown({{foo: bar}}) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^^^ + : ^^^^^^^^^^^^^^^^^^^^^ `---- - x SelectorList + x ComponentValue ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] 10 | ::unknown({{foo: bar}}) {} - : ^^^^^^^^^^^^^^^^^^^^^^^ + : ^ `---- - x ComplexSelector + x Colon ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] 10 | ::unknown({{foo: bar}}) {} - : ^^^^^^^^^^^^^^^^^^^^^^^ + : ^ `---- - x CompoundSelector + x ComponentValue ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] 10 | ::unknown({{foo: bar}}) {} - : ^^^^^^^^^^^^^^^^^^^^^^^ + : ^ `---- - x SubclassSelector + x Colon ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] 10 | ::unknown({{foo: bar}}) {} - : ^^^^^^^^^^^^^^^^^^^^^^^ + : ^ `---- - x PseudoElementSelector + x ComponentValue + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] + 10 | ::unknown({{foo: bar}}) {} + : ^^^^^^^^ + `---- + + x Function ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] 10 | ::unknown({{foo: bar}}) {} - : ^^^^^^^^^^^^^^^^^^^^^^^ + : ^^^^^^^^ `---- x Ident @@ -958,10 +979,10 @@ : ^^^^^^^ `---- - x PseudoElementSelectorChildren + x SimpleBlock ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] 10 | ::unknown({{foo: bar}}) {} - : ^ + : ^^^^^^^^^^^ `---- x LBrace @@ -970,7 +991,19 @@ : ^ `---- - x PseudoElementSelectorChildren + x ComponentValue + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] + 10 | ::unknown({{foo: bar}}) {} + : ^^^^^^^^^ + `---- + + x StyleBlock + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] + 10 | ::unknown({{foo: bar}}) {} + : ^^^^^^^^^ + `---- + + x ComponentValue ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] 10 | ::unknown({{foo: bar}}) {} : ^ @@ -982,7 +1015,7 @@ : ^ `---- - x PseudoElementSelectorChildren + x ComponentValue ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] 10 | ::unknown({{foo: bar}}) {} : ^^^ @@ -994,7 +1027,7 @@ : ^^^ `---- - x PseudoElementSelectorChildren + x ComponentValue ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] 10 | ::unknown({{foo: bar}}) {} : ^ @@ -1006,7 +1039,7 @@ : ^ `---- - x PseudoElementSelectorChildren + x ComponentValue ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] 10 | ::unknown({{foo: bar}}) {} : ^ @@ -1018,7 +1051,7 @@ : ^ `---- - x PseudoElementSelectorChildren + x ComponentValue ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] 10 | ::unknown({{foo: bar}}) {} : ^^^ @@ -1029,868 +1062,3 @@ 10 | ::unknown({{foo: bar}}) {} : ^^^ `---- - - x PseudoElementSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] - 10 | ::unknown({{foo: bar}}) {} - : ^ - `---- - - x RBrace - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] - 10 | ::unknown({{foo: bar}}) {} - : ^ - `---- - - x PseudoElementSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] - 10 | ::unknown({{foo: bar}}) {} - : ^ - `---- - - x RBrace - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] - 10 | ::unknown({{foo: bar}}) {} - : ^ - `---- - - x SimpleBlock - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] - 10 | ::unknown({{foo: bar}}) {} - : ^^ - `---- - - x LBrace - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] - 10 | ::unknown({{foo: bar}}) {} - : ^ - `---- - - x Rule - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] - 11 | ::unknown({foo: bar !important}) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x QualifiedRule - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] - 11 | ::unknown({foo: bar !important}) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x SelectorList - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] - 11 | ::unknown({foo: bar !important}) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x ComplexSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] - 11 | ::unknown({foo: bar !important}) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x CompoundSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] - 11 | ::unknown({foo: bar !important}) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x SubclassSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] - 11 | ::unknown({foo: bar !important}) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x PseudoElementSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] - 11 | ::unknown({foo: bar !important}) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x Ident - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] - 11 | ::unknown({foo: bar !important}) {} - : ^^^^^^^ - `---- - - x PseudoElementSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] - 11 | ::unknown({foo: bar !important}) {} - : ^ - `---- - - x LBrace - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] - 11 | ::unknown({foo: bar !important}) {} - : ^ - `---- - - x PseudoElementSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] - 11 | ::unknown({foo: bar !important}) {} - : ^^^ - `---- - - x Ident { value: Atom('foo' type=inline), raw: Atom('foo' type=inline) } - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] - 11 | ::unknown({foo: bar !important}) {} - : ^^^ - `---- - - x PseudoElementSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] - 11 | ::unknown({foo: bar !important}) {} - : ^ - `---- - - x Colon - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] - 11 | ::unknown({foo: bar !important}) {} - : ^ - `---- - - x PseudoElementSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] - 11 | ::unknown({foo: bar !important}) {} - : ^ - `---- - - x WhiteSpace { value: Atom(' ' type=inline) } - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] - 11 | ::unknown({foo: bar !important}) {} - : ^ - `---- - - x PseudoElementSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] - 11 | ::unknown({foo: bar !important}) {} - : ^^^ - `---- - - x Ident { value: Atom('bar' type=inline), raw: Atom('bar' type=inline) } - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] - 11 | ::unknown({foo: bar !important}) {} - : ^^^ - `---- - - x PseudoElementSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] - 11 | ::unknown({foo: bar !important}) {} - : ^ - `---- - - x WhiteSpace { value: Atom(' ' type=inline) } - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] - 11 | ::unknown({foo: bar !important}) {} - : ^ - `---- - - x PseudoElementSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] - 11 | ::unknown({foo: bar !important}) {} - : ^ - `---- - - x Delim { value: '!' } - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] - 11 | ::unknown({foo: bar !important}) {} - : ^ - `---- - - x PseudoElementSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] - 11 | ::unknown({foo: bar !important}) {} - : ^^^^^^^^^ - `---- - - x Ident { value: Atom('important' type=static), raw: Atom('important' type=static) } - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] - 11 | ::unknown({foo: bar !important}) {} - : ^^^^^^^^^ - `---- - - x PseudoElementSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] - 11 | ::unknown({foo: bar !important}) {} - : ^ - `---- - - x RBrace - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] - 11 | ::unknown({foo: bar !important}) {} - : ^ - `---- - - x SimpleBlock - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] - 11 | ::unknown({foo: bar !important}) {} - : ^^ - `---- - - x LBrace - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] - 11 | ::unknown({foo: bar !important}) {} - : ^ - `---- - - x Rule - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:12:1] - 12 | ::unknown("string") {} - : ^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x QualifiedRule - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:12:1] - 12 | ::unknown("string") {} - : ^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x SelectorList - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:12:1] - 12 | ::unknown("string") {} - : ^^^^^^^^^^^^^^^^^^^ - `---- - - x ComplexSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:12:1] - 12 | ::unknown("string") {} - : ^^^^^^^^^^^^^^^^^^^ - `---- - - x CompoundSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:12:1] - 12 | ::unknown("string") {} - : ^^^^^^^^^^^^^^^^^^^ - `---- - - x SubclassSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:12:1] - 12 | ::unknown("string") {} - : ^^^^^^^^^^^^^^^^^^^ - `---- - - x PseudoElementSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:12:1] - 12 | ::unknown("string") {} - : ^^^^^^^^^^^^^^^^^^^ - `---- - - x Ident - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:12:1] - 12 | ::unknown("string") {} - : ^^^^^^^ - `---- - - x PseudoElementSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:12:1] - 12 | ::unknown("string") {} - : ^^^^^^^^ - `---- - - x String { value: Atom('string' type=static), raw: Atom('"string"' type=dynamic) } - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:12:1] - 12 | ::unknown("string") {} - : ^^^^^^^^ - `---- - - x SimpleBlock - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:12:1] - 12 | ::unknown("string") {} - : ^^ - `---- - - x LBrace - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:12:1] - 12 | ::unknown("string") {} - : ^ - `---- - - x Rule - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] - 13 | ::unknown("string", foo) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x QualifiedRule - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] - 13 | ::unknown("string", foo) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x SelectorList - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] - 13 | ::unknown("string", foo) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x ComplexSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] - 13 | ::unknown("string", foo) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x CompoundSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] - 13 | ::unknown("string", foo) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x SubclassSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] - 13 | ::unknown("string", foo) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x PseudoElementSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] - 13 | ::unknown("string", foo) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x Ident - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] - 13 | ::unknown("string", foo) {} - : ^^^^^^^ - `---- - - x PseudoElementSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] - 13 | ::unknown("string", foo) {} - : ^^^^^^^^ - `---- - - x String { value: Atom('string' type=static), raw: Atom('"string"' type=dynamic) } - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] - 13 | ::unknown("string", foo) {} - : ^^^^^^^^ - `---- - - x PseudoElementSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] - 13 | ::unknown("string", foo) {} - : ^ - `---- - - x Comma - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] - 13 | ::unknown("string", foo) {} - : ^ - `---- - - x PseudoElementSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] - 13 | ::unknown("string", foo) {} - : ^ - `---- - - x WhiteSpace { value: Atom(' ' type=inline) } - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] - 13 | ::unknown("string", foo) {} - : ^ - `---- - - x PseudoElementSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] - 13 | ::unknown("string", foo) {} - : ^^^ - `---- - - x Ident { value: Atom('foo' type=inline), raw: Atom('foo' type=inline) } - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] - 13 | ::unknown("string", foo) {} - : ^^^ - `---- - - x SimpleBlock - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] - 13 | ::unknown("string", foo) {} - : ^^ - `---- - - x LBrace - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] - 13 | ::unknown("string", foo) {} - : ^ - `---- - - x Rule - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:14:1] - 14 | ::unknown('string') {} - : ^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x QualifiedRule - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:14:1] - 14 | ::unknown('string') {} - : ^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x SelectorList - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:14:1] - 14 | ::unknown('string') {} - : ^^^^^^^^^^^^^^^^^^^ - `---- - - x ComplexSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:14:1] - 14 | ::unknown('string') {} - : ^^^^^^^^^^^^^^^^^^^ - `---- - - x CompoundSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:14:1] - 14 | ::unknown('string') {} - : ^^^^^^^^^^^^^^^^^^^ - `---- - - x SubclassSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:14:1] - 14 | ::unknown('string') {} - : ^^^^^^^^^^^^^^^^^^^ - `---- - - x PseudoElementSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:14:1] - 14 | ::unknown('string') {} - : ^^^^^^^^^^^^^^^^^^^ - `---- - - x Ident - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:14:1] - 14 | ::unknown('string') {} - : ^^^^^^^ - `---- - - x PseudoElementSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:14:1] - 14 | ::unknown('string') {} - : ^^^^^^^^ - `---- - - x String { value: Atom('string' type=static), raw: Atom(''string'' type=dynamic) } - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:14:1] - 14 | ::unknown('string') {} - : ^^^^^^^^ - `---- - - x SimpleBlock - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:14:1] - 14 | ::unknown('string') {} - : ^^ - `---- - - x LBrace - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:14:1] - 14 | ::unknown('string') {} - : ^ - `---- - - x Rule - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:15:1] - 15 | ::unknown(url(foo.png)) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x QualifiedRule - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:15:1] - 15 | ::unknown(url(foo.png)) {} - : ^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x SelectorList - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:15:1] - 15 | ::unknown(url(foo.png)) {} - : ^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x ComplexSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:15:1] - 15 | ::unknown(url(foo.png)) {} - : ^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x CompoundSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:15:1] - 15 | ::unknown(url(foo.png)) {} - : ^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x SubclassSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:15:1] - 15 | ::unknown(url(foo.png)) {} - : ^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x PseudoElementSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:15:1] - 15 | ::unknown(url(foo.png)) {} - : ^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x Ident - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:15:1] - 15 | ::unknown(url(foo.png)) {} - : ^^^^^^^ - `---- - - x PseudoElementSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:15:1] - 15 | ::unknown(url(foo.png)) {} - : ^^^^^^^^^^^^ - `---- - - x Url { name: Atom('url' type=static), raw_name: Atom('url' type=static), before: Atom('' type=static), after: Atom('' type=static), value: Atom('foo.png' type=inline), raw_value: Atom('foo.png' - | type=inline) } - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:15:1] - 15 | ::unknown(url(foo.png)) {} - : ^^^^^^^^^^^^ - `---- - - x SimpleBlock - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:15:1] - 15 | ::unknown(url(foo.png)) {} - : ^^ - `---- - - x LBrace - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:15:1] - 15 | ::unknown(url(foo.png)) {} - : ^ - `---- - - x Rule - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:16:1] - 16 | ::unknown({!}) {} - : ^^^^^^^^^^^^^^^^^ - `---- - - x QualifiedRule - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:16:1] - 16 | ::unknown({!}) {} - : ^^^^^^^^^^^^^^^^^ - `---- - - x SelectorList - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:16:1] - 16 | ::unknown({!}) {} - : ^^^^^^^^^^^^^^ - `---- - - x ComplexSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:16:1] - 16 | ::unknown({!}) {} - : ^^^^^^^^^^^^^^ - `---- - - x CompoundSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:16:1] - 16 | ::unknown({!}) {} - : ^^^^^^^^^^^^^^ - `---- - - x SubclassSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:16:1] - 16 | ::unknown({!}) {} - : ^^^^^^^^^^^^^^ - `---- - - x PseudoElementSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:16:1] - 16 | ::unknown({!}) {} - : ^^^^^^^^^^^^^^ - `---- - - x Ident - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:16:1] - 16 | ::unknown({!}) {} - : ^^^^^^^ - `---- - - x PseudoElementSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:16:1] - 16 | ::unknown({!}) {} - : ^ - `---- - - x LBrace - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:16:1] - 16 | ::unknown({!}) {} - : ^ - `---- - - x PseudoElementSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:16:1] - 16 | ::unknown({!}) {} - : ^ - `---- - - x Delim { value: '!' } - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:16:1] - 16 | ::unknown({!}) {} - : ^ - `---- - - x PseudoElementSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:16:1] - 16 | ::unknown({!}) {} - : ^ - `---- - - x RBrace - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:16:1] - 16 | ::unknown({!}) {} - : ^ - `---- - - x SimpleBlock - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:16:1] - 16 | ::unknown({!}) {} - : ^^ - `---- - - x LBrace - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:16:1] - 16 | ::unknown({!}) {} - : ^ - `---- - - x Rule - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:17:1] - 17 | ::unknown(!) {} - : ^^^^^^^^^^^^^^^ - `---- - - x QualifiedRule - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:17:1] - 17 | ::unknown(!) {} - : ^^^^^^^^^^^^^^^ - `---- - - x SelectorList - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:17:1] - 17 | ::unknown(!) {} - : ^^^^^^^^^^^^ - `---- - - x ComplexSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:17:1] - 17 | ::unknown(!) {} - : ^^^^^^^^^^^^ - `---- - - x CompoundSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:17:1] - 17 | ::unknown(!) {} - : ^^^^^^^^^^^^ - `---- - - x SubclassSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:17:1] - 17 | ::unknown(!) {} - : ^^^^^^^^^^^^ - `---- - - x PseudoElementSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:17:1] - 17 | ::unknown(!) {} - : ^^^^^^^^^^^^ - `---- - - x Ident - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:17:1] - 17 | ::unknown(!) {} - : ^^^^^^^ - `---- - - x PseudoElementSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:17:1] - 17 | ::unknown(!) {} - : ^ - `---- - - x Delim { value: '!' } - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:17:1] - 17 | ::unknown(!) {} - : ^ - `---- - - x SimpleBlock - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:17:1] - 17 | ::unknown(!) {} - : ^^ - `---- - - x LBrace - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:17:1] - 17 | ::unknown(!) {} - : ^ - `---- - - x Rule - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:18:1] - 18 | ::unknown({;}) {} - : ^^^^^^^^^^^^^^^^^ - `---- - - x QualifiedRule - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:18:1] - 18 | ::unknown({;}) {} - : ^^^^^^^^^^^^^^^^^ - `---- - - x SelectorList - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:18:1] - 18 | ::unknown({;}) {} - : ^^^^^^^^^^^^^^ - `---- - - x ComplexSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:18:1] - 18 | ::unknown({;}) {} - : ^^^^^^^^^^^^^^ - `---- - - x CompoundSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:18:1] - 18 | ::unknown({;}) {} - : ^^^^^^^^^^^^^^ - `---- - - x SubclassSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:18:1] - 18 | ::unknown({;}) {} - : ^^^^^^^^^^^^^^ - `---- - - x PseudoElementSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:18:1] - 18 | ::unknown({;}) {} - : ^^^^^^^^^^^^^^ - `---- - - x Ident - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:18:1] - 18 | ::unknown({;}) {} - : ^^^^^^^ - `---- - - x PseudoElementSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:18:1] - 18 | ::unknown({;}) {} - : ^ - `---- - - x LBrace - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:18:1] - 18 | ::unknown({;}) {} - : ^ - `---- - - x PseudoElementSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:18:1] - 18 | ::unknown({;}) {} - : ^ - `---- - - x Semi - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:18:1] - 18 | ::unknown({;}) {} - : ^ - `---- - - x PseudoElementSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:18:1] - 18 | ::unknown({;}) {} - : ^ - `---- - - x RBrace - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:18:1] - 18 | ::unknown({;}) {} - : ^ - `---- - - x SimpleBlock - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:18:1] - 18 | ::unknown({;}) {} - : ^^ - `---- - - x LBrace - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:18:1] - 18 | ::unknown({;}) {} - : ^ - `---- - - x Rule - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:19:1] - 19 | ::unknown(;) {} - : ^^^^^^^^^^^^^^^ - `---- - - x QualifiedRule - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:19:1] - 19 | ::unknown(;) {} - : ^^^^^^^^^^^^^^^ - `---- - - x SelectorList - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:19:1] - 19 | ::unknown(;) {} - : ^^^^^^^^^^^^ - `---- - - x ComplexSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:19:1] - 19 | ::unknown(;) {} - : ^^^^^^^^^^^^ - `---- - - x CompoundSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:19:1] - 19 | ::unknown(;) {} - : ^^^^^^^^^^^^ - `---- - - x SubclassSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:19:1] - 19 | ::unknown(;) {} - : ^^^^^^^^^^^^ - `---- - - x PseudoElementSelector - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:19:1] - 19 | ::unknown(;) {} - : ^^^^^^^^^^^^ - `---- - - x Ident - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:19:1] - 19 | ::unknown(;) {} - : ^^^^^^^ - `---- - - x PseudoElementSelectorChildren - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:19:1] - 19 | ::unknown(;) {} - : ^ - `---- - - x Semi - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:19:1] - 19 | ::unknown(;) {} - : ^ - `---- - - x SimpleBlock - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:19:1] - 19 | ::unknown(;) {} - : ^^ - `---- - - x LBrace - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:19:1] - 19 | ::unknown(;) {} - : ^ - `---- diff --git a/crates/swc_css_parser/tests/recovery/at-rule/extra-semi/output.json b/crates/swc_css_parser/tests/recovery/at-rule/extra-semi/output.json index 2afe01f36f75..58a5110e17c3 100644 --- a/crates/swc_css_parser/tests/recovery/at-rule/extra-semi/output.json +++ b/crates/swc_css_parser/tests/recovery/at-rule/extra-semi/output.json @@ -2,7 +2,7 @@ "type": "Stylesheet", "span": { "start": 1, - "end": 45, + "end": 47, "ctxt": 0 }, "rules": [ @@ -47,76 +47,92 @@ "block": null }, { - "type": "ListOfComponentValues", + "type": "QualifiedRule", "span": { "start": 17, - "end": 44, + "end": 46, "ctxt": 0 }, - "children": [ - { - "type": "PreservedToken", - "span": { - "start": 17, - "end": 18, - "ctxt": 0 - }, - "token": "Semi" + "prelude": { + "type": "ListOfComponentValues", + "span": { + "start": 17, + "end": 27, + "ctxt": 0 }, - { - "type": "PreservedToken", - "span": { - "start": 18, - "end": 20, - "ctxt": 0 + "children": [ + { + "type": "PreservedToken", + "span": { + "start": 17, + "end": 18, + "ctxt": 0 + }, + "token": "Semi" }, - "token": { - "WhiteSpace": { - "value": "\n\n" + { + "type": "PreservedToken", + "span": { + "start": 18, + "end": 20, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": "\n\n" + } } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 20, - "end": 21, - "ctxt": 0 }, - "token": { - "Delim": { - "value": "." + { + "type": "PreservedToken", + "span": { + "start": 20, + "end": 21, + "ctxt": 0 + }, + "token": { + "Delim": { + "value": "." + } } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 21, - "end": 26, - "ctxt": 0 }, - "token": { - "Ident": { - "value": "color", - "raw": "color" + { + "type": "PreservedToken", + "span": { + "start": 21, + "end": 26, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "color", + "raw": "color" + } } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 26, - "end": 27, - "ctxt": 0 }, - "token": { - "WhiteSpace": { - "value": " " + { + "type": "PreservedToken", + "span": { + "start": 26, + "end": 27, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } } } + ] + }, + "block": { + "type": "SimpleBlock", + "span": { + "start": 27, + "end": 46, + "ctxt": 0 }, - { + "name": { "type": "PreservedToken", "span": { "start": 27, @@ -125,79 +141,40 @@ }, "token": "LBrace" }, - { - "type": "PreservedToken", - "span": { - "start": 28, - "end": 33, - "ctxt": 0 - }, - "token": { - "WhiteSpace": { - "value": "\n " - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 33, - "end": 38, - "ctxt": 0 - }, - "token": { - "Ident": { + "value": [ + { + "type": "Declaration", + "span": { + "start": 33, + "end": 43, + "ctxt": 0 + }, + "name": { + "type": "Ident", + "span": { + "start": 33, + "end": 38, + "ctxt": 0 + }, "value": "color", "raw": "color" - } + }, + "value": [ + { + "type": "Ident", + "span": { + "start": 40, + "end": 43, + "ctxt": 0 + }, + "value": "red", + "raw": "red" + } + ], + "important": null } - }, - { - "type": "PreservedToken", - "span": { - "start": 38, - "end": 39, - "ctxt": 0 - }, - "token": "Colon" - }, - { - "type": "PreservedToken", - "span": { - "start": 39, - "end": 40, - "ctxt": 0 - }, - "token": { - "WhiteSpace": { - "value": " " - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 40, - "end": 43, - "ctxt": 0 - }, - "token": { - "Ident": { - "value": "red", - "raw": "red" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 43, - "end": 44, - "ctxt": 0 - }, - "token": "Semi" - } - ] + ] + } } ] } diff --git a/crates/swc_css_parser/tests/recovery/at-rule/extra-semi/output.swc-stderr b/crates/swc_css_parser/tests/recovery/at-rule/extra-semi/output.swc-stderr index 5a5fc87dc88f..c2c03bb778bd 100644 --- a/crates/swc_css_parser/tests/recovery/at-rule/extra-semi/output.swc-stderr +++ b/crates/swc_css_parser/tests/recovery/at-rule/extra-semi/output.swc-stderr @@ -4,9 +4,3 @@ 1 | @import "x.css";; : ^ `---- - - x Unexpected character `';'` - ,-[$DIR/tests/recovery/at-rule/extra-semi/input.css:1:1] - 1 | @import "x.css";; - : ^ - `---- diff --git a/crates/swc_css_parser/tests/recovery/at-rule/extra-semi/span.rust-debug b/crates/swc_css_parser/tests/recovery/at-rule/extra-semi/span.rust-debug index 3c0d9708a994..f56584674cd1 100644 --- a/crates/swc_css_parser/tests/recovery/at-rule/extra-semi/span.rust-debug +++ b/crates/swc_css_parser/tests/recovery/at-rule/extra-semi/span.rust-debug @@ -4,8 +4,8 @@ 1 | ,-> @import "x.css";; 2 | | 3 | | .color { - 4 | `-> color: red; - 5 | } + 4 | | color: red; + 5 | `-> } `---- x Rule @@ -43,7 +43,17 @@ 1 | ,-> @import "x.css";; 2 | | 3 | | .color { - 4 | `-> color: red; + 4 | | color: red; + 5 | `-> } + `---- + + x QualifiedRule + ,-[$DIR/tests/recovery/at-rule/extra-semi/input.css:1:1] + 1 | ,-> @import "x.css";; + 2 | | + 3 | | .color { + 4 | | color: red; + 5 | `-> } `---- x ComponentValue @@ -110,10 +120,11 @@ : ^ `---- - x ComponentValue + x SimpleBlock ,-[$DIR/tests/recovery/at-rule/extra-semi/input.css:3:1] - 3 | .color { - : ^ + 3 | ,-> .color { + 4 | | color: red; + 5 | `-> } `---- x LBrace @@ -123,52 +134,33 @@ `---- x ComponentValue - ,-[$DIR/tests/recovery/at-rule/extra-semi/input.css:3:1] - 3 | ,-> .color { - 4 | `-> color: red; - `---- - - x WhiteSpace { value: Atom(' - | ' type=inline) } - ,-[$DIR/tests/recovery/at-rule/extra-semi/input.css:3:1] - 3 | ,-> .color { - 4 | `-> color: red; - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/at-rule/extra-semi/input.css:4:5] - 4 | color: red; - : ^^^^^ - `---- - - x Ident { value: Atom('color' type=static), raw: Atom('color' type=static) } ,-[$DIR/tests/recovery/at-rule/extra-semi/input.css:4:5] 4 | color: red; - : ^^^^^ + : ^^^^^^^^^^ `---- - x ComponentValue + x StyleBlock ,-[$DIR/tests/recovery/at-rule/extra-semi/input.css:4:5] 4 | color: red; - : ^ + : ^^^^^^^^^^ `---- - x Colon + x Declaration ,-[$DIR/tests/recovery/at-rule/extra-semi/input.css:4:5] 4 | color: red; - : ^ + : ^^^^^^^^^^ `---- - x ComponentValue + x DeclarationName ,-[$DIR/tests/recovery/at-rule/extra-semi/input.css:4:5] 4 | color: red; - : ^ + : ^^^^^ `---- - x WhiteSpace { value: Atom(' ' type=inline) } + x Ident ,-[$DIR/tests/recovery/at-rule/extra-semi/input.css:4:5] 4 | color: red; - : ^ + : ^^^^^ `---- x ComponentValue @@ -177,20 +169,8 @@ : ^^^ `---- - x Ident { value: Atom('red' type=inline), raw: Atom('red' type=inline) } + x Ident ,-[$DIR/tests/recovery/at-rule/extra-semi/input.css:4:5] 4 | color: red; : ^^^ `---- - - x ComponentValue - ,-[$DIR/tests/recovery/at-rule/extra-semi/input.css:4:5] - 4 | color: red; - : ^ - `---- - - x Semi - ,-[$DIR/tests/recovery/at-rule/extra-semi/input.css:4:5] - 4 | color: red; - : ^ - `---- diff --git a/crates/swc_css_parser/tests/recovery/at-rule/media/invalid-nesting/output.swc-stderr b/crates/swc_css_parser/tests/recovery/at-rule/media/invalid-nesting/output.swc-stderr index 01f72aada8df..b939d3ebbea3 100644 --- a/crates/swc_css_parser/tests/recovery/at-rule/media/invalid-nesting/output.swc-stderr +++ b/crates/swc_css_parser/tests/recovery/at-rule/media/invalid-nesting/output.swc-stderr @@ -1,12 +1,6 @@ - x Expected function or ident tokens - ,-[$DIR/tests/recovery/at-rule/media/invalid-nesting/input.css:2:5] - 2 | max-inline-size: 1024px; - : ^ - `---- - - x Unexpected character `';'` - ,-[$DIR/tests/recovery/at-rule/media/invalid-nesting/input.css:2:5] - 2 | max-inline-size: 1024px; - : ^ + x Unexpected end of file + ,-[$DIR/tests/recovery/at-rule/media/invalid-nesting/input.css:3:3] + 3 | + : ^ `---- diff --git a/crates/swc_css_parser/tests/recovery/at-rule/media/wrong-stylesheet/output.json b/crates/swc_css_parser/tests/recovery/at-rule/media/wrong-stylesheet/output.json index 10a3ff48db17..e2d132ba47f2 100644 --- a/crates/swc_css_parser/tests/recovery/at-rule/media/wrong-stylesheet/output.json +++ b/crates/swc_css_parser/tests/recovery/at-rule/media/wrong-stylesheet/output.json @@ -72,135 +72,118 @@ }, "value": [ { - "type": "ListOfComponentValues", + "type": "QualifiedRule", "span": { "start": 20, - "end": 32, + "end": 72, "ctxt": 0 }, - "children": [ - { - "type": "PreservedToken", - "span": { - "start": 20, - "end": 25, - "ctxt": 0 - }, - "token": { - "Ident": { - "value": "color", - "raw": "color" - } - } + "prelude": { + "type": "ListOfComponentValues", + "span": { + "start": 20, + "end": 42, + "ctxt": 0 }, - { - "type": "PreservedToken", - "span": { - "start": 25, - "end": 26, - "ctxt": 0 + "children": [ + { + "type": "PreservedToken", + "span": { + "start": 20, + "end": 25, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "color", + "raw": "color" + } + } }, - "token": "Colon" - }, - { - "type": "PreservedToken", - "span": { - "start": 26, - "end": 27, - "ctxt": 0 + { + "type": "PreservedToken", + "span": { + "start": 25, + "end": 26, + "ctxt": 0 + }, + "token": "Colon" }, - "token": { - "WhiteSpace": { - "value": " " + { + "type": "PreservedToken", + "span": { + "start": 26, + "end": 27, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 27, + "end": 31, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "teal", + "raw": "teal" + } } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 27, - "end": 31, - "ctxt": 0 }, - "token": { - "Ident": { - "value": "teal", - "raw": "teal" + { + "type": "PreservedToken", + "span": { + "start": 31, + "end": 32, + "ctxt": 0 + }, + "token": "Semi" + }, + { + "type": "PreservedToken", + "span": { + "start": 32, + "end": 37, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": "\n " + } } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 31, - "end": 32, - "ctxt": 0 }, - "token": "Semi" - } - ] - }, - { - "type": "QualifiedRule", - "span": { - "start": 37, - "end": 72, - "ctxt": 0 - }, - "prelude": { - "type": "SelectorList", - "span": { - "start": 37, - "end": 41, - "ctxt": 0 - }, - "children": [ { - "type": "ComplexSelector", + "type": "PreservedToken", "span": { "start": 37, "end": 41, "ctxt": 0 }, - "children": [ - { - "type": "CompoundSelector", - "span": { - "start": 37, - "end": 41, - "ctxt": 0 - }, - "nestingSelector": null, - "typeSelector": { - "type": "TagNameSelector", - "span": { - "start": 37, - "end": 41, - "ctxt": 0 - }, - "name": { - "type": "WqName", - "span": { - "start": 37, - "end": 41, - "ctxt": 0 - }, - "prefix": null, - "value": { - "type": "Ident", - "span": { - "start": 37, - "end": 41, - "ctxt": 0 - }, - "value": "main", - "raw": "main" - } - } - }, - "subclassSelectors": [] + "token": { + "Ident": { + "value": "main", + "raw": "main" } - ] + } + }, + { + "type": "PreservedToken", + "span": { + "start": 41, + "end": 42, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } + } } ] }, diff --git a/crates/swc_css_parser/tests/recovery/at-rule/media/wrong-stylesheet/output.swc-stderr b/crates/swc_css_parser/tests/recovery/at-rule/media/wrong-stylesheet/output.swc-stderr index 4fe1f6fafb0d..69aac67df065 100644 --- a/crates/swc_css_parser/tests/recovery/at-rule/media/wrong-stylesheet/output.swc-stderr +++ b/crates/swc_css_parser/tests/recovery/at-rule/media/wrong-stylesheet/output.swc-stderr @@ -4,9 +4,3 @@ 2 | color: teal; : ^ `---- - - x Unexpected character `';'` - ,-[$DIR/tests/recovery/at-rule/media/wrong-stylesheet/input.css:2:5] - 2 | color: teal; - : ^ - `---- diff --git a/crates/swc_css_parser/tests/recovery/at-rule/media/wrong-stylesheet/span.rust-debug b/crates/swc_css_parser/tests/recovery/at-rule/media/wrong-stylesheet/span.rust-debug index e697cf3f075e..61370c3e0518 100644 --- a/crates/swc_css_parser/tests/recovery/at-rule/media/wrong-stylesheet/span.rust-debug +++ b/crates/swc_css_parser/tests/recovery/at-rule/media/wrong-stylesheet/span.rust-debug @@ -83,14 +83,26 @@ x ComponentValue ,-[$DIR/tests/recovery/at-rule/media/wrong-stylesheet/input.css:2:5] - 2 | color: teal; - : ^^^^^^^^^^^^ + 2 | ,-> color: teal; + 3 | | main { + 4 | | color: orange; + 5 | `-> } `---- x Rule ,-[$DIR/tests/recovery/at-rule/media/wrong-stylesheet/input.css:2:5] - 2 | color: teal; - : ^^^^^^^^^^^^ + 2 | ,-> color: teal; + 3 | | main { + 4 | | color: orange; + 5 | `-> } + `---- + + x QualifiedRule + ,-[$DIR/tests/recovery/at-rule/media/wrong-stylesheet/input.css:2:5] + 2 | ,-> color: teal; + 3 | | main { + 4 | | color: orange; + 5 | `-> } `---- x ComponentValue @@ -154,66 +166,40 @@ `---- x ComponentValue - ,-[$DIR/tests/recovery/at-rule/media/wrong-stylesheet/input.css:3:5] - 3 | ,-> main { - 4 | | color: orange; - 5 | `-> } - `---- - - x Rule - ,-[$DIR/tests/recovery/at-rule/media/wrong-stylesheet/input.css:3:5] - 3 | ,-> main { - 4 | | color: orange; - 5 | `-> } - `---- - - x QualifiedRule - ,-[$DIR/tests/recovery/at-rule/media/wrong-stylesheet/input.css:3:5] - 3 | ,-> main { - 4 | | color: orange; - 5 | `-> } - `---- - - x SelectorList - ,-[$DIR/tests/recovery/at-rule/media/wrong-stylesheet/input.css:3:5] - 3 | main { - : ^^^^ - `---- - - x ComplexSelector - ,-[$DIR/tests/recovery/at-rule/media/wrong-stylesheet/input.css:3:5] - 3 | main { - : ^^^^ + ,-[$DIR/tests/recovery/at-rule/media/wrong-stylesheet/input.css:2:5] + 2 | ,-> color: teal; + 3 | `-> main { `---- - x CompoundSelector - ,-[$DIR/tests/recovery/at-rule/media/wrong-stylesheet/input.css:3:5] - 3 | main { - : ^^^^ + x WhiteSpace { value: Atom(' + | ' type=inline) } + ,-[$DIR/tests/recovery/at-rule/media/wrong-stylesheet/input.css:2:5] + 2 | ,-> color: teal; + 3 | `-> main { `---- - x TypeSelector + x ComponentValue ,-[$DIR/tests/recovery/at-rule/media/wrong-stylesheet/input.css:3:5] 3 | main { : ^^^^ `---- - x TagNameSelector + x Ident { value: Atom('main' type=static), raw: Atom('main' type=static) } ,-[$DIR/tests/recovery/at-rule/media/wrong-stylesheet/input.css:3:5] 3 | main { : ^^^^ `---- - x WqName + x ComponentValue ,-[$DIR/tests/recovery/at-rule/media/wrong-stylesheet/input.css:3:5] 3 | main { - : ^^^^ + : ^ `---- - x Ident + x WhiteSpace { value: Atom(' ' type=inline) } ,-[$DIR/tests/recovery/at-rule/media/wrong-stylesheet/input.css:3:5] 3 | main { - : ^^^^ + : ^ `---- x SimpleBlock diff --git a/crates/swc_css_parser/tests/recovery/comments/bad-comment-1/output.swc-stderr b/crates/swc_css_parser/tests/recovery/comments/bad-comment-1/output.swc-stderr index fdb451d16410..7cbea7c537f0 100644 --- a/crates/swc_css_parser/tests/recovery/comments/bad-comment-1/output.swc-stderr +++ b/crates/swc_css_parser/tests/recovery/comments/bad-comment-1/output.swc-stderr @@ -1,10 +1,4 @@ - x Invalid selector - ,-[$DIR/tests/recovery/comments/bad-comment-1/input.css:1:1] - 1 | // comment - : ^ - `---- - x Unexpected end of file ,-[$DIR/tests/recovery/comments/bad-comment-1/input.css:1:1] 1 | // comment diff --git a/crates/swc_css_parser/tests/recovery/hacks/output.json b/crates/swc_css_parser/tests/recovery/hacks/output.json index 522badc18eb2..59be26ec494b 100644 --- a/crates/swc_css_parser/tests/recovery/hacks/output.json +++ b/crates/swc_css_parser/tests/recovery/hacks/output.json @@ -8368,7 +8368,7 @@ "type": "QualifiedRule", "span": { "start": 2529, - "end": 2581, + "end": 2687, "ctxt": 0 }, "prelude": { @@ -8425,7 +8425,7 @@ "type": "SimpleBlock", "span": { "start": 2539, - "end": 2581, + "end": 2687, "ctxt": 0 }, "name": { @@ -8438,86 +8438,46 @@ "token": "LBrace" }, "value": [ - { - "type": "Declaration", - "span": { - "start": 2568, - "end": 2578, - "ctxt": 0 - }, - "name": { - "type": "Ident", - "span": { - "start": 2568, - "end": 2573, - "ctxt": 0 - }, - "value": "color", - "raw": "color" - }, - "value": [ - { - "type": "Ident", - "span": { - "start": 2575, - "end": 2578, - "ctxt": 0 - }, - "value": "red", - "raw": "red" - } - ], - "important": null - }, { "type": "ListOfComponentValues", "span": { - "start": 2546, - "end": 2563, + "start": 2635, + "end": 2669, "ctxt": 0 }, "children": [ { "type": "PreservedToken", "span": { - "start": 2546, - "end": 2547, + "start": 2635, + "end": 2636, "ctxt": 0 }, "token": { "Delim": { - "value": "&" + "value": "." } } }, { "type": "PreservedToken", "span": { - "start": 2547, - "end": 2555, + "start": 2636, + "end": 2644, "ctxt": 0 }, "token": { "Ident": { - "value": "property", - "raw": "property" + "value": "selector", + "raw": "selector" } } }, { "type": "PreservedToken", "span": { - "start": 2555, - "end": 2556, - "ctxt": 0 - }, - "token": "Colon" - }, - { - "type": "PreservedToken", - "span": { - "start": 2556, - "end": 2557, + "start": 2644, + "end": 2645, "ctxt": 0 }, "token": { @@ -8529,131 +8489,39 @@ { "type": "PreservedToken", "span": { - "start": 2557, - "end": 2562, + "start": 2645, + "end": 2646, "ctxt": 0 }, - "token": { - "Ident": { - "value": "value", - "raw": "value" - } - } + "token": "LBrace" }, { "type": "PreservedToken", "span": { - "start": 2562, - "end": 2563, - "ctxt": 0 - }, - "token": "Semi" - } - ] - } - ] - } - }, - { - "type": "QualifiedRule", - "span": { - "start": 2582, - "end": 2634, - "ctxt": 0 - }, - "prelude": { - "type": "SelectorList", - "span": { - "start": 2582, - "end": 2591, - "ctxt": 0 - }, - "children": [ - { - "type": "ComplexSelector", - "span": { - "start": 2582, - "end": 2591, - "ctxt": 0 - }, - "children": [ - { - "type": "CompoundSelector", - "span": { - "start": 2582, - "end": 2591, + "start": 2646, + "end": 2652, "ctxt": 0 }, - "nestingSelector": null, - "typeSelector": null, - "subclassSelectors": [ - { - "type": "ClassSelector", - "span": { - "start": 2582, - "end": 2591, - "ctxt": 0 - }, - "text": { - "type": "Ident", - "span": { - "start": 2583, - "end": 2591, - "ctxt": 0 - }, - "value": "selector", - "raw": "selector" - } + "token": { + "WhiteSpace": { + "value": " \n " } - ] - } - ] - } - ] - }, - "block": { - "type": "SimpleBlock", - "span": { - "start": 2592, - "end": 2634, - "ctxt": 0 - }, - "name": { - "type": "PreservedToken", - "span": { - "start": 2592, - "end": 2593, - "ctxt": 0 - }, - "token": "LBrace" - }, - "value": [ - { - "type": "ListOfComponentValues", - "span": { - "start": 2599, - "end": 2616, - "ctxt": 0 - }, - "children": [ + } + }, { "type": "PreservedToken", "span": { - "start": 2599, - "end": 2600, + "start": 2652, + "end": 2653, "ctxt": 0 }, - "token": { - "Delim": { - "value": "*" - } - } + "token": "RParen" }, { "type": "PreservedToken", "span": { - "start": 2600, - "end": 2608, + "start": 2653, + "end": 2661, "ctxt": 0 }, "token": { @@ -8666,8 +8534,8 @@ { "type": "PreservedToken", "span": { - "start": 2608, - "end": 2609, + "start": 2661, + "end": 2662, "ctxt": 0 }, "token": "Colon" @@ -8675,8 +8543,8 @@ { "type": "PreservedToken", "span": { - "start": 2609, - "end": 2610, + "start": 2662, + "end": 2663, "ctxt": 0 }, "token": { @@ -8688,8 +8556,8 @@ { "type": "PreservedToken", "span": { - "start": 2610, - "end": 2615, + "start": 2663, + "end": 2668, "ctxt": 0 }, "token": { @@ -8702,8 +8570,8 @@ { "type": "PreservedToken", "span": { - "start": 2615, - "end": 2616, + "start": 2668, + "end": 2669, "ctxt": 0 }, "token": "Semi" @@ -8713,15 +8581,15 @@ { "type": "Declaration", "span": { - "start": 2621, - "end": 2631, + "start": 2674, + "end": 2684, "ctxt": 0 }, "name": { "type": "Ident", "span": { - "start": 2621, - "end": 2626, + "start": 2674, + "end": 2679, "ctxt": 0 }, "value": "color", @@ -8731,8 +8599,8 @@ { "type": "Ident", "span": { - "start": 2628, - "end": 2631, + "start": 2681, + "end": 2684, "ctxt": 0 }, "value": "red", @@ -8740,192 +8608,375 @@ } ], "important": null - } - ] - } - }, - { - "type": "QualifiedRule", - "span": { - "start": 2635, - "end": 2687, - "ctxt": 0 - }, - "prelude": { - "type": "SelectorList", - "span": { - "start": 2635, - "end": 2644, - "ctxt": 0 - }, - "children": [ + }, { - "type": "ComplexSelector", + "type": "QualifiedRule", "span": { - "start": 2635, - "end": 2644, + "start": 2546, + "end": 2634, "ctxt": 0 }, - "children": [ - { - "type": "CompoundSelector", - "span": { - "start": 2635, - "end": 2644, - "ctxt": 0 - }, - "nestingSelector": null, - "typeSelector": null, - "subclassSelectors": [ - { - "type": "ClassSelector", - "span": { - "start": 2635, - "end": 2644, - "ctxt": 0 - }, - "text": { - "type": "Ident", - "span": { - "start": 2636, - "end": 2644, - "ctxt": 0 - }, - "value": "selector", - "raw": "selector" + "prelude": { + "type": "ListOfComponentValues", + "span": { + "start": 2546, + "end": 2592, + "ctxt": 0 + }, + "children": [ + { + "type": "PreservedToken", + "span": { + "start": 2546, + "end": 2547, + "ctxt": 0 + }, + "token": { + "Delim": { + "value": "&" } } - ] - } - ] - } - ] - }, - "block": { - "type": "SimpleBlock", - "span": { - "start": 2645, - "end": 2687, - "ctxt": 0 - }, - "name": { - "type": "PreservedToken", - "span": { - "start": 2645, - "end": 2646, - "ctxt": 0 - }, - "token": "LBrace" - }, - "value": [ - { - "type": "ListOfComponentValues", - "span": { - "start": 2652, - "end": 2669, - "ctxt": 0 - }, - "children": [ - { - "type": "PreservedToken", - "span": { - "start": 2652, - "end": 2653, - "ctxt": 0 }, - "token": "RParen" - }, - { - "type": "PreservedToken", - "span": { - "start": 2653, - "end": 2661, - "ctxt": 0 + { + "type": "PreservedToken", + "span": { + "start": 2547, + "end": 2555, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "property", + "raw": "property" + } + } }, - "token": { - "Ident": { - "value": "property", - "raw": "property" + { + "type": "PreservedToken", + "span": { + "start": 2555, + "end": 2556, + "ctxt": 0 + }, + "token": "Colon" + }, + { + "type": "PreservedToken", + "span": { + "start": 2556, + "end": 2557, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 2661, - "end": 2662, - "ctxt": 0 }, - "token": "Colon" - }, - { - "type": "PreservedToken", - "span": { - "start": 2662, - "end": 2663, - "ctxt": 0 + { + "type": "PreservedToken", + "span": { + "start": 2557, + "end": 2562, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "value", + "raw": "value" + } + } }, - "token": { - "WhiteSpace": { - "value": " " + { + "type": "PreservedToken", + "span": { + "start": 2562, + "end": 2563, + "ctxt": 0 + }, + "token": "Semi" + }, + { + "type": "PreservedToken", + "span": { + "start": 2563, + "end": 2568, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": "\n " + } } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 2663, - "end": 2668, - "ctxt": 0 }, - "token": { - "Ident": { - "value": "value", - "raw": "value" + { + "type": "PreservedToken", + "span": { + "start": 2568, + "end": 2573, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "color", + "raw": "color" + } } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 2668, - "end": 2669, - "ctxt": 0 }, - "token": "Semi" - } - ] - }, - { - "type": "Declaration", - "span": { - "start": 2674, - "end": 2684, - "ctxt": 0 + { + "type": "PreservedToken", + "span": { + "start": 2573, + "end": 2574, + "ctxt": 0 + }, + "token": "Colon" + }, + { + "type": "PreservedToken", + "span": { + "start": 2574, + "end": 2575, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 2575, + "end": 2578, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "red", + "raw": "red" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 2578, + "end": 2579, + "ctxt": 0 + }, + "token": "Semi" + }, + { + "type": "PreservedToken", + "span": { + "start": 2579, + "end": 2580, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": "\n" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 2580, + "end": 2581, + "ctxt": 0 + }, + "token": "RBrace" + }, + { + "type": "PreservedToken", + "span": { + "start": 2581, + "end": 2582, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": "\n" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 2582, + "end": 2583, + "ctxt": 0 + }, + "token": { + "Delim": { + "value": "." + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 2583, + "end": 2591, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "selector", + "raw": "selector" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 2591, + "end": 2592, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } + } + } + ] }, - "name": { - "type": "Ident", + "block": { + "type": "SimpleBlock", "span": { - "start": 2674, - "end": 2679, + "start": 2592, + "end": 2634, "ctxt": 0 }, - "value": "color", - "raw": "color" - }, - "value": [ - { - "type": "Ident", + "name": { + "type": "PreservedToken", "span": { - "start": 2681, - "end": 2684, + "start": 2592, + "end": 2593, "ctxt": 0 }, - "value": "red", - "raw": "red" - } - ], - "important": null + "token": "LBrace" + }, + "value": [ + { + "type": "ListOfComponentValues", + "span": { + "start": 2599, + "end": 2616, + "ctxt": 0 + }, + "children": [ + { + "type": "PreservedToken", + "span": { + "start": 2599, + "end": 2600, + "ctxt": 0 + }, + "token": { + "Delim": { + "value": "*" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 2600, + "end": 2608, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "property", + "raw": "property" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 2608, + "end": 2609, + "ctxt": 0 + }, + "token": "Colon" + }, + { + "type": "PreservedToken", + "span": { + "start": 2609, + "end": 2610, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 2610, + "end": 2615, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "value", + "raw": "value" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 2615, + "end": 2616, + "ctxt": 0 + }, + "token": "Semi" + } + ] + }, + { + "type": "Declaration", + "span": { + "start": 2621, + "end": 2631, + "ctxt": 0 + }, + "name": { + "type": "Ident", + "span": { + "start": 2621, + "end": 2626, + "ctxt": 0 + }, + "value": "color", + "raw": "color" + }, + "value": [ + { + "type": "Ident", + "span": { + "start": 2628, + "end": 2631, + "ctxt": 0 + }, + "value": "red", + "raw": "red" + } + ], + "important": null + } + ] + } } ] } diff --git a/crates/swc_css_parser/tests/recovery/hacks/output.swc-stderr b/crates/swc_css_parser/tests/recovery/hacks/output.swc-stderr index f4846839d18e..e69d82c9012b 100644 --- a/crates/swc_css_parser/tests/recovery/hacks/output.swc-stderr +++ b/crates/swc_css_parser/tests/recovery/hacks/output.swc-stderr @@ -66,8 +66,8 @@ `---- x Expected whitespace, semicolon, EOF, at-keyword or ident token - ,-[$DIR/tests/recovery/hacks/input.css:120:5] - 120 | )property: value; + ,-[$DIR/tests/recovery/hacks/input.css:119:1] + 119 | .selector { : ^ `---- @@ -214,9 +214,3 @@ 250 | a{*b:c} : ^ `---- - - x Unexpected character `';'` - ,-[$DIR/tests/recovery/hacks/input.css:112:5] - 112 | &property: value; - : ^ - `---- diff --git a/crates/swc_css_parser/tests/recovery/hacks/span.rust-debug b/crates/swc_css_parser/tests/recovery/hacks/span.rust-debug index a107eda85c7d..3855e58f3807 100644 --- a/crates/swc_css_parser/tests/recovery/hacks/span.rust-debug +++ b/crates/swc_css_parser/tests/recovery/hacks/span.rust-debug @@ -8130,7 +8130,15 @@ 111 | ,-> .selector { 112 | | &property: value; 113 | | color: red; - 114 | `-> } + 114 | | } + 115 | | .selector { + 116 | | *property: value; + 117 | | color: red; + 118 | | } + 119 | | .selector { + 120 | | )property: value; + 121 | | color: red; + 122 | `-> } `---- x QualifiedRule @@ -8138,7 +8146,15 @@ 111 | ,-> .selector { 112 | | &property: value; 113 | | color: red; - 114 | `-> } + 114 | | } + 115 | | .selector { + 116 | | *property: value; + 117 | | color: red; + 118 | | } + 119 | | .selector { + 120 | | )property: value; + 121 | | color: red; + 122 | `-> } `---- x SelectorList @@ -8182,7 +8198,15 @@ 111 | ,-> .selector { 112 | | &property: value; 113 | | color: red; - 114 | `-> } + 114 | | } + 115 | | .selector { + 116 | | *property: value; + 117 | | color: red; + 118 | | } + 119 | | .selector { + 120 | | )property: value; + 121 | | color: red; + 122 | `-> } `---- x LBrace @@ -8192,57 +8216,223 @@ `---- x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:113:5] - 113 | color: red; + ,-[$DIR/tests/recovery/hacks/input.css:119:1] + 119 | ,-> .selector { + 120 | `-> )property: value; + `---- + + x StyleBlock + ,-[$DIR/tests/recovery/hacks/input.css:119:1] + 119 | ,-> .selector { + 120 | `-> )property: value; + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:119:1] + 119 | .selector { + : ^ + `---- + + x Delim { value: '.' } + ,-[$DIR/tests/recovery/hacks/input.css:119:1] + 119 | .selector { + : ^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:119:1] + 119 | .selector { + : ^^^^^^^^ + `---- + + x Ident { value: Atom('selector' type=dynamic), raw: Atom('selector' type=dynamic) } + ,-[$DIR/tests/recovery/hacks/input.css:119:1] + 119 | .selector { + : ^^^^^^^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:119:1] + 119 | .selector { + : ^ + `---- + + x WhiteSpace { value: Atom(' ' type=inline) } + ,-[$DIR/tests/recovery/hacks/input.css:119:1] + 119 | .selector { + : ^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:119:1] + 119 | .selector { + : ^ + `---- + + x LBrace + ,-[$DIR/tests/recovery/hacks/input.css:119:1] + 119 | .selector { + : ^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:119:1] + 119 | ,-> .selector { + 120 | `-> )property: value; + `---- + + x WhiteSpace { value: Atom(' + | ' type=inline) } + ,-[$DIR/tests/recovery/hacks/input.css:119:1] + 119 | ,-> .selector { + 120 | `-> )property: value; + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:120:5] + 120 | )property: value; + : ^ + `---- + + x RParen + ,-[$DIR/tests/recovery/hacks/input.css:120:5] + 120 | )property: value; + : ^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:120:5] + 120 | )property: value; + : ^^^^^^^^ + `---- + + x Ident { value: Atom('property' type=static), raw: Atom('property' type=static) } + ,-[$DIR/tests/recovery/hacks/input.css:120:5] + 120 | )property: value; + : ^^^^^^^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:120:5] + 120 | )property: value; + : ^ + `---- + + x Colon + ,-[$DIR/tests/recovery/hacks/input.css:120:5] + 120 | )property: value; + : ^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:120:5] + 120 | )property: value; + : ^ + `---- + + x WhiteSpace { value: Atom(' ' type=inline) } + ,-[$DIR/tests/recovery/hacks/input.css:120:5] + 120 | )property: value; + : ^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:120:5] + 120 | )property: value; + : ^^^^^ + `---- + + x Ident { value: Atom('value' type=inline), raw: Atom('value' type=inline) } + ,-[$DIR/tests/recovery/hacks/input.css:120:5] + 120 | )property: value; + : ^^^^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:120:5] + 120 | )property: value; + : ^ + `---- + + x Semi + ,-[$DIR/tests/recovery/hacks/input.css:120:5] + 120 | )property: value; + : ^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:121:5] + 121 | color: red; : ^^^^^^^^^^ `---- x StyleBlock - ,-[$DIR/tests/recovery/hacks/input.css:113:5] - 113 | color: red; + ,-[$DIR/tests/recovery/hacks/input.css:121:5] + 121 | color: red; : ^^^^^^^^^^ `---- x Declaration - ,-[$DIR/tests/recovery/hacks/input.css:113:5] - 113 | color: red; + ,-[$DIR/tests/recovery/hacks/input.css:121:5] + 121 | color: red; : ^^^^^^^^^^ `---- x DeclarationName - ,-[$DIR/tests/recovery/hacks/input.css:113:5] - 113 | color: red; + ,-[$DIR/tests/recovery/hacks/input.css:121:5] + 121 | color: red; : ^^^^^ `---- x Ident - ,-[$DIR/tests/recovery/hacks/input.css:113:5] - 113 | color: red; + ,-[$DIR/tests/recovery/hacks/input.css:121:5] + 121 | color: red; : ^^^^^ `---- x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:113:5] - 113 | color: red; + ,-[$DIR/tests/recovery/hacks/input.css:121:5] + 121 | color: red; : ^^^ `---- x Ident - ,-[$DIR/tests/recovery/hacks/input.css:113:5] - 113 | color: red; + ,-[$DIR/tests/recovery/hacks/input.css:121:5] + 121 | color: red; : ^^^ `---- x ComponentValue ,-[$DIR/tests/recovery/hacks/input.css:112:5] - 112 | &property: value; - : ^^^^^^^^^^^^^^^^^ + 112 | ,-> &property: value; + 113 | | color: red; + 114 | | } + 115 | | .selector { + 116 | | *property: value; + 117 | | color: red; + 118 | `-> } `---- x StyleBlock ,-[$DIR/tests/recovery/hacks/input.css:112:5] - 112 | &property: value; - : ^^^^^^^^^^^^^^^^^ + 112 | ,-> &property: value; + 113 | | color: red; + 114 | | } + 115 | | .selector { + 116 | | *property: value; + 117 | | color: red; + 118 | `-> } + `---- + + x QualifiedRule + ,-[$DIR/tests/recovery/hacks/input.css:112:5] + 112 | ,-> &property: value; + 113 | | color: red; + 114 | | } + 115 | | .selector { + 116 | | *property: value; + 117 | | color: red; + 118 | `-> } `---- x ComponentValue @@ -8294,79 +8484,178 @@ `---- x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:112:5] - 112 | &property: value; - : ^^^^^ + ,-[$DIR/tests/recovery/hacks/input.css:112:5] + 112 | &property: value; + : ^^^^^ + `---- + + x Ident { value: Atom('value' type=inline), raw: Atom('value' type=inline) } + ,-[$DIR/tests/recovery/hacks/input.css:112:5] + 112 | &property: value; + : ^^^^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:112:5] + 112 | &property: value; + : ^ + `---- + + x Semi + ,-[$DIR/tests/recovery/hacks/input.css:112:5] + 112 | &property: value; + : ^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:112:5] + 112 | ,-> &property: value; + 113 | `-> color: red; + `---- + + x WhiteSpace { value: Atom(' + | ' type=inline) } + ,-[$DIR/tests/recovery/hacks/input.css:112:5] + 112 | ,-> &property: value; + 113 | `-> color: red; + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:113:5] + 113 | color: red; + : ^^^^^ + `---- + + x Ident { value: Atom('color' type=static), raw: Atom('color' type=static) } + ,-[$DIR/tests/recovery/hacks/input.css:113:5] + 113 | color: red; + : ^^^^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:113:5] + 113 | color: red; + : ^ + `---- + + x Colon + ,-[$DIR/tests/recovery/hacks/input.css:113:5] + 113 | color: red; + : ^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:113:5] + 113 | color: red; + : ^ + `---- + + x WhiteSpace { value: Atom(' ' type=inline) } + ,-[$DIR/tests/recovery/hacks/input.css:113:5] + 113 | color: red; + : ^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:113:5] + 113 | color: red; + : ^^^ + `---- + + x Ident { value: Atom('red' type=inline), raw: Atom('red' type=inline) } + ,-[$DIR/tests/recovery/hacks/input.css:113:5] + 113 | color: red; + : ^^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:113:5] + 113 | color: red; + : ^ + `---- + + x Semi + ,-[$DIR/tests/recovery/hacks/input.css:113:5] + 113 | color: red; + : ^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:113:5] + 113 | color: red; + : ^ + 114 | } `---- - x Ident { value: Atom('value' type=inline), raw: Atom('value' type=inline) } - ,-[$DIR/tests/recovery/hacks/input.css:112:5] - 112 | &property: value; - : ^^^^^ + x WhiteSpace { value: Atom(' + | ' type=inline) } + ,-[$DIR/tests/recovery/hacks/input.css:113:5] + 113 | color: red; + : ^ + 114 | } `---- x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:112:5] - 112 | &property: value; - : ^ + ,-[$DIR/tests/recovery/hacks/input.css:114:1] + 114 | } + : ^ `---- - x Semi - ,-[$DIR/tests/recovery/hacks/input.css:112:5] - 112 | &property: value; - : ^ + x RBrace + ,-[$DIR/tests/recovery/hacks/input.css:114:1] + 114 | } + : ^ `---- - x Rule - ,-[$DIR/tests/recovery/hacks/input.css:115:1] - 115 | ,-> .selector { - 116 | | *property: value; - 117 | | color: red; - 118 | `-> } + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:114:1] + 114 | } + : ^ + 115 | .selector { `---- - x QualifiedRule - ,-[$DIR/tests/recovery/hacks/input.css:115:1] - 115 | ,-> .selector { - 116 | | *property: value; - 117 | | color: red; - 118 | `-> } + x WhiteSpace { value: Atom(' + | ' type=inline) } + ,-[$DIR/tests/recovery/hacks/input.css:114:1] + 114 | } + : ^ + 115 | .selector { `---- - x SelectorList + x ComponentValue ,-[$DIR/tests/recovery/hacks/input.css:115:1] 115 | .selector { - : ^^^^^^^^^ + : ^ `---- - x ComplexSelector + x Delim { value: '.' } ,-[$DIR/tests/recovery/hacks/input.css:115:1] 115 | .selector { - : ^^^^^^^^^ + : ^ `---- - x CompoundSelector + x ComponentValue ,-[$DIR/tests/recovery/hacks/input.css:115:1] 115 | .selector { - : ^^^^^^^^^ + : ^^^^^^^^ `---- - x SubclassSelector + x Ident { value: Atom('selector' type=dynamic), raw: Atom('selector' type=dynamic) } ,-[$DIR/tests/recovery/hacks/input.css:115:1] 115 | .selector { - : ^^^^^^^^^ + : ^^^^^^^^ `---- - x ClassSelector + x ComponentValue ,-[$DIR/tests/recovery/hacks/input.css:115:1] 115 | .selector { - : ^^^^^^^^^ + : ^ `---- - x Ident + x WhiteSpace { value: Atom(' ' type=inline) } ,-[$DIR/tests/recovery/hacks/input.css:115:1] 115 | .selector { - : ^^^^^^^^ + : ^ `---- x SimpleBlock @@ -8509,198 +8798,6 @@ : ^^^ `---- - x Rule - ,-[$DIR/tests/recovery/hacks/input.css:119:1] - 119 | ,-> .selector { - 120 | | )property: value; - 121 | | color: red; - 122 | `-> } - `---- - - x QualifiedRule - ,-[$DIR/tests/recovery/hacks/input.css:119:1] - 119 | ,-> .selector { - 120 | | )property: value; - 121 | | color: red; - 122 | `-> } - `---- - - x SelectorList - ,-[$DIR/tests/recovery/hacks/input.css:119:1] - 119 | .selector { - : ^^^^^^^^^ - `---- - - x ComplexSelector - ,-[$DIR/tests/recovery/hacks/input.css:119:1] - 119 | .selector { - : ^^^^^^^^^ - `---- - - x CompoundSelector - ,-[$DIR/tests/recovery/hacks/input.css:119:1] - 119 | .selector { - : ^^^^^^^^^ - `---- - - x SubclassSelector - ,-[$DIR/tests/recovery/hacks/input.css:119:1] - 119 | .selector { - : ^^^^^^^^^ - `---- - - x ClassSelector - ,-[$DIR/tests/recovery/hacks/input.css:119:1] - 119 | .selector { - : ^^^^^^^^^ - `---- - - x Ident - ,-[$DIR/tests/recovery/hacks/input.css:119:1] - 119 | .selector { - : ^^^^^^^^ - `---- - - x SimpleBlock - ,-[$DIR/tests/recovery/hacks/input.css:119:1] - 119 | ,-> .selector { - 120 | | )property: value; - 121 | | color: red; - 122 | `-> } - `---- - - x LBrace - ,-[$DIR/tests/recovery/hacks/input.css:119:1] - 119 | .selector { - : ^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:120:5] - 120 | )property: value; - : ^^^^^^^^^^^^^^^^^ - `---- - - x StyleBlock - ,-[$DIR/tests/recovery/hacks/input.css:120:5] - 120 | )property: value; - : ^^^^^^^^^^^^^^^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:120:5] - 120 | )property: value; - : ^ - `---- - - x RParen - ,-[$DIR/tests/recovery/hacks/input.css:120:5] - 120 | )property: value; - : ^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:120:5] - 120 | )property: value; - : ^^^^^^^^ - `---- - - x Ident { value: Atom('property' type=static), raw: Atom('property' type=static) } - ,-[$DIR/tests/recovery/hacks/input.css:120:5] - 120 | )property: value; - : ^^^^^^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:120:5] - 120 | )property: value; - : ^ - `---- - - x Colon - ,-[$DIR/tests/recovery/hacks/input.css:120:5] - 120 | )property: value; - : ^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:120:5] - 120 | )property: value; - : ^ - `---- - - x WhiteSpace { value: Atom(' ' type=inline) } - ,-[$DIR/tests/recovery/hacks/input.css:120:5] - 120 | )property: value; - : ^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:120:5] - 120 | )property: value; - : ^^^^^ - `---- - - x Ident { value: Atom('value' type=inline), raw: Atom('value' type=inline) } - ,-[$DIR/tests/recovery/hacks/input.css:120:5] - 120 | )property: value; - : ^^^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:120:5] - 120 | )property: value; - : ^ - `---- - - x Semi - ,-[$DIR/tests/recovery/hacks/input.css:120:5] - 120 | )property: value; - : ^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:121:5] - 121 | color: red; - : ^^^^^^^^^^ - `---- - - x StyleBlock - ,-[$DIR/tests/recovery/hacks/input.css:121:5] - 121 | color: red; - : ^^^^^^^^^^ - `---- - - x Declaration - ,-[$DIR/tests/recovery/hacks/input.css:121:5] - 121 | color: red; - : ^^^^^^^^^^ - `---- - - x DeclarationName - ,-[$DIR/tests/recovery/hacks/input.css:121:5] - 121 | color: red; - : ^^^^^ - `---- - - x Ident - ,-[$DIR/tests/recovery/hacks/input.css:121:5] - 121 | color: red; - : ^^^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:121:5] - 121 | color: red; - : ^^^ - `---- - - x Ident - ,-[$DIR/tests/recovery/hacks/input.css:121:5] - 121 | color: red; - : ^^^ - `---- - x Rule ,-[$DIR/tests/recovery/hacks/input.css:123:1] 123 | ,-> .selector { diff --git a/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher-1/output.json b/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher-1/output.json index 32f41ea797af..5b11cbe1cbeb 100644 --- a/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher-1/output.json +++ b/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher-1/output.json @@ -22,49 +22,50 @@ }, "children": [ { - "type": "PreservedToken", + "type": "SimpleBlock", "span": { "start": 1, - "end": 2, + "end": 8, "ctxt": 0 }, - "token": "LBracket" - }, - { - "type": "PreservedToken", - "span": { - "start": 2, - "end": 6, - "ctxt": 0 + "name": { + "type": "PreservedToken", + "span": { + "start": 1, + "end": 2, + "ctxt": 0 + }, + "token": "LBracket" }, - "token": { - "Ident": { - "value": "href", - "raw": "href" + "value": [ + { + "type": "PreservedToken", + "span": { + "start": 2, + "end": 6, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "href", + "raw": "href" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 6, + "end": 7, + "ctxt": 0 + }, + "token": { + "Delim": { + "value": "=" + } + } } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 6, - "end": 7, - "ctxt": 0 - }, - "token": { - "Delim": { - "value": "=" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 7, - "end": 8, - "ctxt": 0 - }, - "token": "RBracket" + ] }, { "type": "PreservedToken", diff --git a/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher-1/span.rust-debug b/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher-1/span.rust-debug index d444a059c57c..9335b520cb23 100644 --- a/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher-1/span.rust-debug +++ b/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher-1/span.rust-debug @@ -20,7 +20,13 @@ x ComponentValue ,-[$DIR/tests/recovery/selector/attribute/invalid-matcher-1/input.css:1:1] 1 | [href=] {} - : ^ + : ^^^^^^^ + `---- + + x SimpleBlock + ,-[$DIR/tests/recovery/selector/attribute/invalid-matcher-1/input.css:1:1] + 1 | [href=] {} + : ^^^^^^^ `---- x LBracket @@ -53,18 +59,6 @@ : ^ `---- - x ComponentValue - ,-[$DIR/tests/recovery/selector/attribute/invalid-matcher-1/input.css:1:1] - 1 | [href=] {} - : ^ - `---- - - x RBracket - ,-[$DIR/tests/recovery/selector/attribute/invalid-matcher-1/input.css:1:1] - 1 | [href=] {} - : ^ - `---- - x ComponentValue ,-[$DIR/tests/recovery/selector/attribute/invalid-matcher-1/input.css:1:1] 1 | [href=] {} diff --git a/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher-2/output.json b/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher-2/output.json index 3d7da890df56..3f0743d0ede6 100644 --- a/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher-2/output.json +++ b/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher-2/output.json @@ -22,76 +22,77 @@ }, "children": [ { - "type": "PreservedToken", + "type": "SimpleBlock", "span": { "start": 1, - "end": 2, - "ctxt": 0 - }, - "token": "LBracket" - }, - { - "type": "PreservedToken", - "span": { - "start": 2, - "end": 6, - "ctxt": 0 - }, - "token": { - "Ident": { - "value": "href", - "raw": "href" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 6, - "end": 7, - "ctxt": 0 - }, - "token": { - "Delim": { - "value": "#" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 7, - "end": 8, + "end": 15, "ctxt": 0 }, - "token": { - "Delim": { - "value": "=" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 8, - "end": 14, - "ctxt": 0 + "name": { + "type": "PreservedToken", + "span": { + "start": 1, + "end": 2, + "ctxt": 0 + }, + "token": "LBracket" }, - "token": { - "String": { - "value": "test", - "raw": "\"test\"" + "value": [ + { + "type": "PreservedToken", + "span": { + "start": 2, + "end": 6, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "href", + "raw": "href" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 6, + "end": 7, + "ctxt": 0 + }, + "token": { + "Delim": { + "value": "#" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 7, + "end": 8, + "ctxt": 0 + }, + "token": { + "Delim": { + "value": "=" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 8, + "end": 14, + "ctxt": 0 + }, + "token": { + "String": { + "value": "test", + "raw": "\"test\"" + } + } } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 14, - "end": 15, - "ctxt": 0 - }, - "token": "RBracket" + ] }, { "type": "PreservedToken", diff --git a/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher-2/span.rust-debug b/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher-2/span.rust-debug index 228380d051bf..9200a830276b 100644 --- a/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher-2/span.rust-debug +++ b/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher-2/span.rust-debug @@ -20,7 +20,13 @@ x ComponentValue ,-[$DIR/tests/recovery/selector/attribute/invalid-matcher-2/input.css:1:1] 1 | [href#="test"] {} - : ^ + : ^^^^^^^^^^^^^^ + `---- + + x SimpleBlock + ,-[$DIR/tests/recovery/selector/attribute/invalid-matcher-2/input.css:1:1] + 1 | [href#="test"] {} + : ^^^^^^^^^^^^^^ `---- x LBracket @@ -77,18 +83,6 @@ : ^^^^^^ `---- - x ComponentValue - ,-[$DIR/tests/recovery/selector/attribute/invalid-matcher-2/input.css:1:1] - 1 | [href#="test"] {} - : ^ - `---- - - x RBracket - ,-[$DIR/tests/recovery/selector/attribute/invalid-matcher-2/input.css:1:1] - 1 | [href#="test"] {} - : ^ - `---- - x ComponentValue ,-[$DIR/tests/recovery/selector/attribute/invalid-matcher-2/input.css:1:1] 1 | [href#="test"] {} diff --git a/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher-3/output.json b/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher-3/output.json index 20f3ab55af1c..75d34c77228d 100644 --- a/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher-3/output.json +++ b/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher-3/output.json @@ -36,155 +36,156 @@ } }, { - "type": "PreservedToken", + "type": "SimpleBlock", "span": { "start": 2, - "end": 3, - "ctxt": 0 - }, - "token": "LBracket" - }, - { - "type": "PreservedToken", - "span": { - "start": 3, - "end": 8, - "ctxt": 0 - }, - "token": { - "Ident": { - "value": "title", - "raw": "title" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 8, - "end": 9, - "ctxt": 0 - }, - "token": { - "WhiteSpace": { - "value": " " - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 9, - "end": 10, - "ctxt": 0 - }, - "token": { - "Delim": { - "value": "*" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 10, - "end": 11, - "ctxt": 0 - }, - "token": { - "WhiteSpace": { - "value": " " - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 11, - "end": 12, - "ctxt": 0 - }, - "token": { - "Delim": { - "value": "=" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 12, - "end": 13, - "ctxt": 0 - }, - "token": { - "WhiteSpace": { - "value": " " - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 13, - "end": 20, - "ctxt": 0 - }, - "token": { - "String": { - "value": "title", - "raw": "\"title\"" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 20, - "end": 21, - "ctxt": 0 - }, - "token": { - "WhiteSpace": { - "value": " " - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 21, - "end": 22, + "end": 24, "ctxt": 0 }, - "token": { - "Ident": { - "value": "i", - "raw": "i" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 22, - "end": 23, - "ctxt": 0 + "name": { + "type": "PreservedToken", + "span": { + "start": 2, + "end": 3, + "ctxt": 0 + }, + "token": "LBracket" }, - "token": { - "WhiteSpace": { - "value": " " + "value": [ + { + "type": "PreservedToken", + "span": { + "start": 3, + "end": 8, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "title", + "raw": "title" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 8, + "end": 9, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 9, + "end": 10, + "ctxt": 0 + }, + "token": { + "Delim": { + "value": "*" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 10, + "end": 11, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 11, + "end": 12, + "ctxt": 0 + }, + "token": { + "Delim": { + "value": "=" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 12, + "end": 13, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 13, + "end": 20, + "ctxt": 0 + }, + "token": { + "String": { + "value": "title", + "raw": "\"title\"" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 20, + "end": 21, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 21, + "end": 22, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "i", + "raw": "i" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 22, + "end": 23, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } + } } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 23, - "end": 24, - "ctxt": 0 - }, - "token": "RBracket" + ] }, { "type": "PreservedToken", diff --git a/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher-3/span.rust-debug b/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher-3/span.rust-debug index b0d176b40e33..89dfacb3c358 100644 --- a/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher-3/span.rust-debug +++ b/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher-3/span.rust-debug @@ -35,7 +35,13 @@ x ComponentValue ,-[$DIR/tests/recovery/selector/attribute/invalid-matcher-3/input.css:1:1] 1 | a[title * = "title" i ] { - : ^ + : ^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x SimpleBlock + ,-[$DIR/tests/recovery/selector/attribute/invalid-matcher-3/input.css:1:1] + 1 | a[title * = "title" i ] { + : ^^^^^^^^^^^^^^^^^^^^^^ `---- x LBracket @@ -164,18 +170,6 @@ : ^ `---- - x ComponentValue - ,-[$DIR/tests/recovery/selector/attribute/invalid-matcher-3/input.css:1:1] - 1 | a[title * = "title" i ] { - : ^ - `---- - - x RBracket - ,-[$DIR/tests/recovery/selector/attribute/invalid-matcher-3/input.css:1:1] - 1 | a[title * = "title" i ] { - : ^ - `---- - x ComponentValue ,-[$DIR/tests/recovery/selector/attribute/invalid-matcher-3/input.css:1:1] 1 | a[title * = "title" i ] { diff --git a/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher-4/output.json b/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher-4/output.json index f888fd60e096..61b523f356f9 100644 --- a/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher-4/output.json +++ b/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher-4/output.json @@ -36,76 +36,77 @@ } }, { - "type": "PreservedToken", + "type": "SimpleBlock", "span": { "start": 2, - "end": 3, - "ctxt": 0 - }, - "token": "LBracket" - }, - { - "type": "PreservedToken", - "span": { - "start": 3, - "end": 8, - "ctxt": 0 - }, - "token": { - "Ident": { - "value": "title", - "raw": "title" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 8, - "end": 9, - "ctxt": 0 - }, - "token": { - "Delim": { - "value": "%" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 9, - "end": 10, + "end": 18, "ctxt": 0 }, - "token": { - "Delim": { - "value": "=" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 10, - "end": 17, - "ctxt": 0 + "name": { + "type": "PreservedToken", + "span": { + "start": 2, + "end": 3, + "ctxt": 0 + }, + "token": "LBracket" }, - "token": { - "String": { - "value": "title", - "raw": "\"title\"" + "value": [ + { + "type": "PreservedToken", + "span": { + "start": 3, + "end": 8, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "title", + "raw": "title" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 8, + "end": 9, + "ctxt": 0 + }, + "token": { + "Delim": { + "value": "%" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 9, + "end": 10, + "ctxt": 0 + }, + "token": { + "Delim": { + "value": "=" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 10, + "end": 17, + "ctxt": 0 + }, + "token": { + "String": { + "value": "title", + "raw": "\"title\"" + } + } } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 17, - "end": 18, - "ctxt": 0 - }, - "token": "RBracket" + ] }, { "type": "PreservedToken", diff --git a/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher-4/span.rust-debug b/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher-4/span.rust-debug index b692198d3d0e..b7c8047f2a5b 100644 --- a/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher-4/span.rust-debug +++ b/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher-4/span.rust-debug @@ -35,7 +35,13 @@ x ComponentValue ,-[$DIR/tests/recovery/selector/attribute/invalid-matcher-4/input.css:1:1] 1 | a[title%="title"] { - : ^ + : ^^^^^^^^^^^^^^^^ + `---- + + x SimpleBlock + ,-[$DIR/tests/recovery/selector/attribute/invalid-matcher-4/input.css:1:1] + 1 | a[title%="title"] { + : ^^^^^^^^^^^^^^^^ `---- x LBracket @@ -92,18 +98,6 @@ : ^^^^^^^ `---- - x ComponentValue - ,-[$DIR/tests/recovery/selector/attribute/invalid-matcher-4/input.css:1:1] - 1 | a[title%="title"] { - : ^ - `---- - - x RBracket - ,-[$DIR/tests/recovery/selector/attribute/invalid-matcher-4/input.css:1:1] - 1 | a[title%="title"] { - : ^ - `---- - x ComponentValue ,-[$DIR/tests/recovery/selector/attribute/invalid-matcher-4/input.css:1:1] 1 | a[title%="title"] { diff --git a/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher/output.json b/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher/output.json index 65b3aac467f5..7bc8c787b373 100644 --- a/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher/output.json +++ b/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher/output.json @@ -22,76 +22,77 @@ }, "children": [ { - "type": "PreservedToken", + "type": "SimpleBlock", "span": { "start": 1, - "end": 2, - "ctxt": 0 - }, - "token": "LBracket" - }, - { - "type": "PreservedToken", - "span": { - "start": 2, - "end": 6, - "ctxt": 0 - }, - "token": { - "Ident": { - "value": "href", - "raw": "href" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 6, - "end": 7, - "ctxt": 0 - }, - "token": { - "Delim": { - "value": "=" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 7, - "end": 8, + "end": 15, "ctxt": 0 }, - "token": { - "Delim": { - "value": "=" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 8, - "end": 14, - "ctxt": 0 + "name": { + "type": "PreservedToken", + "span": { + "start": 1, + "end": 2, + "ctxt": 0 + }, + "token": "LBracket" }, - "token": { - "String": { - "value": ".org", - "raw": "\".org\"" + "value": [ + { + "type": "PreservedToken", + "span": { + "start": 2, + "end": 6, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "href", + "raw": "href" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 6, + "end": 7, + "ctxt": 0 + }, + "token": { + "Delim": { + "value": "=" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 7, + "end": 8, + "ctxt": 0 + }, + "token": { + "Delim": { + "value": "=" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 8, + "end": 14, + "ctxt": 0 + }, + "token": { + "String": { + "value": ".org", + "raw": "\".org\"" + } + } } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 14, - "end": 15, - "ctxt": 0 - }, - "token": "RBracket" + ] }, { "type": "PreservedToken", diff --git a/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher/span.rust-debug b/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher/span.rust-debug index 31f5a40b8913..c2e4e423d334 100644 --- a/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher/span.rust-debug +++ b/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-matcher/span.rust-debug @@ -20,7 +20,13 @@ x ComponentValue ,-[$DIR/tests/recovery/selector/attribute/invalid-matcher/input.css:1:1] 1 | [href==".org"] {} - : ^ + : ^^^^^^^^^^^^^^ + `---- + + x SimpleBlock + ,-[$DIR/tests/recovery/selector/attribute/invalid-matcher/input.css:1:1] + 1 | [href==".org"] {} + : ^^^^^^^^^^^^^^ `---- x LBracket @@ -77,18 +83,6 @@ : ^^^^^^ `---- - x ComponentValue - ,-[$DIR/tests/recovery/selector/attribute/invalid-matcher/input.css:1:1] - 1 | [href==".org"] {} - : ^ - `---- - - x RBracket - ,-[$DIR/tests/recovery/selector/attribute/invalid-matcher/input.css:1:1] - 1 | [href==".org"] {} - : ^ - `---- - x ComponentValue ,-[$DIR/tests/recovery/selector/attribute/invalid-matcher/input.css:1:1] 1 | [href==".org"] {} diff --git a/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-modifier/output.json b/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-modifier/output.json index 441f7e3cd22f..91ef35b8b0aa 100644 --- a/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-modifier/output.json +++ b/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-modifier/output.json @@ -22,90 +22,91 @@ }, "children": [ { - "type": "PreservedToken", + "type": "SimpleBlock", "span": { "start": 1, - "end": 2, - "ctxt": 0 - }, - "token": "LBracket" - }, - { - "type": "PreservedToken", - "span": { - "start": 2, - "end": 6, - "ctxt": 0 - }, - "token": { - "Ident": { - "value": "href", - "raw": "href" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 6, - "end": 7, - "ctxt": 0 - }, - "token": { - "Delim": { - "value": "=" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 7, - "end": 13, - "ctxt": 0 - }, - "token": { - "String": { - "value": "test", - "raw": "\"test\"" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 13, - "end": 14, + "end": 18, "ctxt": 0 }, - "token": { - "WhiteSpace": { - "value": " " - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 14, - "end": 17, - "ctxt": 0 + "name": { + "type": "PreservedToken", + "span": { + "start": 1, + "end": 2, + "ctxt": 0 + }, + "token": "LBracket" }, - "token": { - "String": { - "value": "z", - "raw": "\"z\"" + "value": [ + { + "type": "PreservedToken", + "span": { + "start": 2, + "end": 6, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "href", + "raw": "href" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 6, + "end": 7, + "ctxt": 0 + }, + "token": { + "Delim": { + "value": "=" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 7, + "end": 13, + "ctxt": 0 + }, + "token": { + "String": { + "value": "test", + "raw": "\"test\"" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 13, + "end": 14, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 14, + "end": 17, + "ctxt": 0 + }, + "token": { + "String": { + "value": "z", + "raw": "\"z\"" + } + } } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 17, - "end": 18, - "ctxt": 0 - }, - "token": "RBracket" + ] }, { "type": "PreservedToken", diff --git a/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-modifier/span.rust-debug b/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-modifier/span.rust-debug index 35262ce34866..a5aab6124a23 100644 --- a/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-modifier/span.rust-debug +++ b/crates/swc_css_parser/tests/recovery/selector/attribute/invalid-modifier/span.rust-debug @@ -20,7 +20,13 @@ x ComponentValue ,-[$DIR/tests/recovery/selector/attribute/invalid-modifier/input.css:1:1] 1 | [href="test" "z"] {} - : ^ + : ^^^^^^^^^^^^^^^^^ + `---- + + x SimpleBlock + ,-[$DIR/tests/recovery/selector/attribute/invalid-modifier/input.css:1:1] + 1 | [href="test" "z"] {} + : ^^^^^^^^^^^^^^^^^ `---- x LBracket @@ -89,18 +95,6 @@ : ^^^ `---- - x ComponentValue - ,-[$DIR/tests/recovery/selector/attribute/invalid-modifier/input.css:1:1] - 1 | [href="test" "z"] {} - : ^ - `---- - - x RBracket - ,-[$DIR/tests/recovery/selector/attribute/invalid-modifier/input.css:1:1] - 1 | [href="test" "z"] {} - : ^ - `---- - x ComponentValue ,-[$DIR/tests/recovery/selector/attribute/invalid-modifier/input.css:1:1] 1 | [href="test" "z"] {} diff --git a/crates/swc_css_parser/tests/recovery/selector/attribute/unclosed/output.json b/crates/swc_css_parser/tests/recovery/selector/attribute/unclosed/output.json index d75dc6154a18..cb7ba4cfc19d 100644 --- a/crates/swc_css_parser/tests/recovery/selector/attribute/unclosed/output.json +++ b/crates/swc_css_parser/tests/recovery/selector/attribute/unclosed/output.json @@ -49,53 +49,63 @@ } }, { - "type": "PreservedToken", + "type": "SimpleBlock", "span": { "start": 7, - "end": 8, - "ctxt": 0 - }, - "token": "LBracket" - }, - { - "type": "PreservedToken", - "span": { - "start": 8, - "end": 12, - "ctxt": 0 - }, - "token": { - "Ident": { - "value": "attr", - "raw": "attr" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 12, - "end": 13, - "ctxt": 0 - }, - "token": { - "Delim": { - "value": "=" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 13, "end": 14, "ctxt": 0 }, - "token": { - "WhiteSpace": { - "value": " " + "name": { + "type": "PreservedToken", + "span": { + "start": 7, + "end": 8, + "ctxt": 0 + }, + "token": "LBracket" + }, + "value": [ + { + "type": "PreservedToken", + "span": { + "start": 8, + "end": 12, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "attr", + "raw": "attr" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 12, + "end": 13, + "ctxt": 0 + }, + "token": { + "Delim": { + "value": "=" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 13, + "end": 14, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } + } } - } + ] } ] }, diff --git a/crates/swc_css_parser/tests/recovery/selector/attribute/unclosed/output.swc-stderr b/crates/swc_css_parser/tests/recovery/selector/attribute/unclosed/output.swc-stderr index 3522f94b21c8..990eb77927cb 100644 --- a/crates/swc_css_parser/tests/recovery/selector/attribute/unclosed/output.swc-stderr +++ b/crates/swc_css_parser/tests/recovery/selector/attribute/unclosed/output.swc-stderr @@ -1,5 +1,5 @@ - x Invalid attribute matcher value + x Unexpected end of file ,-[$DIR/tests/recovery/selector/attribute/unclosed/input.css:1:1] 1 | .class[attr= { : ^ diff --git a/crates/swc_css_parser/tests/recovery/selector/attribute/unclosed/span.rust-debug b/crates/swc_css_parser/tests/recovery/selector/attribute/unclosed/span.rust-debug index 893920721cbe..4282ed2532ed 100644 --- a/crates/swc_css_parser/tests/recovery/selector/attribute/unclosed/span.rust-debug +++ b/crates/swc_css_parser/tests/recovery/selector/attribute/unclosed/span.rust-debug @@ -47,7 +47,13 @@ x ComponentValue ,-[$DIR/tests/recovery/selector/attribute/unclosed/input.css:1:1] 1 | .class[attr= { - : ^ + : ^^^^^^^ + `---- + + x SimpleBlock + ,-[$DIR/tests/recovery/selector/attribute/unclosed/input.css:1:1] + 1 | .class[attr= { + : ^^^^^^^ `---- x LBracket diff --git a/crates/swc_css_parser/tests/recovery/selector/pseudo-class/invalid-function/output.json b/crates/swc_css_parser/tests/recovery/selector/pseudo-class/invalid-function/output.json index 4bf07dbe8647..65fdde9b78d6 100644 --- a/crates/swc_css_parser/tests/recovery/selector/pseudo-class/invalid-function/output.json +++ b/crates/swc_css_parser/tests/recovery/selector/pseudo-class/invalid-function/output.json @@ -44,42 +44,39 @@ } }, { - "type": "PreservedToken", + "type": "Function", "span": { "start": 3, - "end": 13, + "end": 15, "ctxt": 0 }, - "token": { - "Function": { - "value": "nth-child", - "raw": "nth-child" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 13, - "end": 14, - "ctxt": 0 + "name": { + "type": "Ident", + "span": { + "start": 3, + "end": 12, + "ctxt": 0 + }, + "value": "nth-child", + "raw": "nth-child" }, - "token": { - "Number": { - "value": 2.0, - "raw": "2", - "type": "integer" + "value": [ + { + "type": "PreservedToken", + "span": { + "start": 13, + "end": 14, + "ctxt": 0 + }, + "token": { + "Number": { + "value": 2.0, + "raw": "2", + "type": "integer" + } + } } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 14, - "end": 15, - "ctxt": 0 - }, - "token": "RParen" + ] }, { "type": "PreservedToken", diff --git a/crates/swc_css_parser/tests/recovery/selector/pseudo-class/invalid-function/span.rust-debug b/crates/swc_css_parser/tests/recovery/selector/pseudo-class/invalid-function/span.rust-debug index 496fdec497ba..5facd0348c49 100644 --- a/crates/swc_css_parser/tests/recovery/selector/pseudo-class/invalid-function/span.rust-debug +++ b/crates/swc_css_parser/tests/recovery/selector/pseudo-class/invalid-function/span.rust-debug @@ -47,37 +47,31 @@ x ComponentValue ,-[$DIR/tests/recovery/selector/pseudo-class/invalid-function/input.css:1:1] 1 | : nth-child(2) { - : ^^^^^^^^^^ + : ^^^^^^^^^^^^ `---- - x Function { value: Atom('nth-child' type=static), raw: Atom('nth-child' type=static) } + x Function ,-[$DIR/tests/recovery/selector/pseudo-class/invalid-function/input.css:1:1] 1 | : nth-child(2) { - : ^^^^^^^^^^ + : ^^^^^^^^^^^^ `---- - x ComponentValue + x Ident ,-[$DIR/tests/recovery/selector/pseudo-class/invalid-function/input.css:1:1] 1 | : nth-child(2) { - : ^ - `---- - - x Number { value: 2.0, raw: Atom('2' type=inline), type_flag: Integer } - ,-[$DIR/tests/recovery/selector/pseudo-class/invalid-function/input.css:1:1] - 1 | : nth-child(2) { - : ^ + : ^^^^^^^^^ `---- x ComponentValue ,-[$DIR/tests/recovery/selector/pseudo-class/invalid-function/input.css:1:1] 1 | : nth-child(2) { - : ^ + : ^ `---- - x RParen + x Number { value: 2.0, raw: Atom('2' type=inline), type_flag: Integer } ,-[$DIR/tests/recovery/selector/pseudo-class/invalid-function/input.css:1:1] 1 | : nth-child(2) { - : ^ + : ^ `---- x ComponentValue diff --git a/crates/swc_css_parser/tests/recovery/style-blocks-contents/basic/output.swc-stderr b/crates/swc_css_parser/tests/recovery/style-blocks-contents/basic/output.swc-stderr index 122fa282dcd6..2dd3d1dca009 100644 --- a/crates/swc_css_parser/tests/recovery/style-blocks-contents/basic/output.swc-stderr +++ b/crates/swc_css_parser/tests/recovery/style-blocks-contents/basic/output.swc-stderr @@ -23,14 +23,8 @@ : ^ `---- - x Invalid selector - ,-[$DIR/tests/recovery/style-blocks-contents/basic/input.css:39:5] - 39 | & test; - : ^ - `---- - - x Unexpected character `';'` - ,-[$DIR/tests/recovery/style-blocks-contents/basic/input.css:39:5] - 39 | & test; - : ^ + x Unexpected end of file + ,-[$DIR/tests/recovery/style-blocks-contents/basic/input.css:40:3] + 40 | + : ^ `---- diff --git a/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested-2/output.json b/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested-2/output.json index cc0f9d0c270c..f6d72cccc2d3 100644 --- a/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested-2/output.json +++ b/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested-2/output.json @@ -10,7 +10,7 @@ "type": "QualifiedRule", "span": { "start": 1, - "end": 59, + "end": 172, "ctxt": 0 }, "prelude": { @@ -67,7 +67,7 @@ "type": "SimpleBlock", "span": { "start": 8, - "end": 59, + "end": 172, "ctxt": 0 }, "name": { @@ -112,298 +112,208 @@ "important": null }, { - "type": "Declaration", + "type": "QualifiedRule", "span": { - "start": 42, - "end": 57, + "start": 30, + "end": 171, "ctxt": 0 }, - "name": { - "type": "Ident", + "prelude": { + "type": "ListOfComponentValues", "span": { - "start": 42, - "end": 52, + "start": 30, + "end": 69, "ctxt": 0 }, - "value": "background", - "raw": "background" - }, - "value": [ - { - "type": "Ident", - "span": { - "start": 54, - "end": 57, - "ctxt": 0 + "children": [ + { + "type": "PreservedToken", + "span": { + "start": 30, + "end": 31, + "ctxt": 0 + }, + "token": { + "Delim": { + "value": "&" + } + } }, - "value": "red", - "raw": "red" - } - ], - "important": null - }, - { - "type": "ListOfComponentValues", - "span": { - "start": 30, - "end": 37, - "ctxt": 0 - }, - "children": [ - { - "type": "PreservedToken", - "span": { - "start": 30, - "end": 31, - "ctxt": 0 + { + "type": "PreservedToken", + "span": { + "start": 31, + "end": 32, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } + } }, - "token": { - "Delim": { - "value": "&" + { + "type": "PreservedToken", + "span": { + "start": 32, + "end": 36, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "test", + "raw": "test" + } } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 31, - "end": 32, - "ctxt": 0 }, - "token": { - "WhiteSpace": { - "value": " " + { + "type": "PreservedToken", + "span": { + "start": 36, + "end": 37, + "ctxt": 0 + }, + "token": "Semi" + }, + { + "type": "PreservedToken", + "span": { + "start": 37, + "end": 42, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": "\n " + } } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 32, - "end": 36, - "ctxt": 0 }, - "token": { - "Ident": { - "value": "test", - "raw": "test" + { + "type": "PreservedToken", + "span": { + "start": 42, + "end": 52, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "background", + "raw": "background" + } } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 36, - "end": 37, - "ctxt": 0 }, - "token": "Semi" - } - ] - } - ] - } - }, - { - "type": "QualifiedRule", - "span": { - "start": 61, - "end": 171, - "ctxt": 0 - }, - "prelude": { - "type": "SelectorList", - "span": { - "start": 61, - "end": 68, - "ctxt": 0 - }, - "children": [ - { - "type": "ComplexSelector", - "span": { - "start": 61, - "end": 68, - "ctxt": 0 - }, - "children": [ - { - "type": "CompoundSelector", - "span": { - "start": 61, - "end": 68, - "ctxt": 0 + { + "type": "PreservedToken", + "span": { + "start": 52, + "end": 53, + "ctxt": 0 + }, + "token": "Colon" }, - "nestingSelector": null, - "typeSelector": { - "type": "TagNameSelector", + { + "type": "PreservedToken", + "span": { + "start": 53, + "end": 54, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 54, + "end": 57, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "red", + "raw": "red" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 57, + "end": 58, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": "\n" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 58, + "end": 59, + "ctxt": 0 + }, + "token": "RBrace" + }, + { + "type": "PreservedToken", + "span": { + "start": 59, + "end": 61, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": "\n\n" + } + } + }, + { + "type": "PreservedToken", "span": { "start": 61, "end": 68, "ctxt": 0 }, - "name": { - "type": "WqName", - "span": { - "start": 61, - "end": 68, - "ctxt": 0 - }, - "prefix": null, - "value": { - "type": "Ident", - "span": { - "start": 61, - "end": 68, - "ctxt": 0 - }, + "token": { + "Ident": { "value": "article", "raw": "article" } } }, - "subclassSelectors": [] - } - ] - } - ] - }, - "block": { - "type": "SimpleBlock", - "span": { - "start": 69, - "end": 171, - "ctxt": 0 - }, - "name": { - "type": "PreservedToken", - "span": { - "start": 69, - "end": 70, - "ctxt": 0 - }, - "token": "LBrace" - }, - "value": [ - { - "type": "Declaration", - "span": { - "start": 75, - "end": 87, - "ctxt": 0 - }, - "name": { - "type": "Ident", - "span": { - "start": 75, - "end": 80, - "ctxt": 0 - }, - "value": "color", - "raw": "color" - }, - "value": [ - { - "type": "Ident", - "span": { - "start": 82, - "end": 87, - "ctxt": 0 - }, - "value": "green", - "raw": "green" - } - ], - "important": null - }, - { - "type": "Declaration", - "span": { - "start": 116, - "end": 126, - "ctxt": 0 - }, - "name": { - "type": "Ident", - "span": { - "start": 116, - "end": 121, - "ctxt": 0 - }, - "value": "color", - "raw": "color" - }, - "value": [ - { - "type": "Ident", - "span": { - "start": 123, - "end": 126, - "ctxt": 0 - }, - "value": "red", - "raw": "red" - } - ], - "important": null - }, - { - "type": "QualifiedRule", - "span": { - "start": 93, - "end": 111, - "ctxt": 0 - }, - "prelude": { - "type": "SelectorList", - "span": { - "start": 93, - "end": 94, - "ctxt": 0 - }, - "children": [ { - "type": "ComplexSelector", + "type": "PreservedToken", "span": { - "start": 93, - "end": 94, + "start": 68, + "end": 69, "ctxt": 0 }, - "children": [ - { - "type": "CompoundSelector", - "span": { - "start": 93, - "end": 94, - "ctxt": 0 - }, - "nestingSelector": { - "type": "NestingSelector", - "span": { - "start": 93, - "end": 94, - "ctxt": 0 - } - }, - "typeSelector": null, - "subclassSelectors": [] + "token": { + "WhiteSpace": { + "value": " " } - ] + } } ] }, "block": { "type": "SimpleBlock", "span": { - "start": 95, - "end": 111, + "start": 69, + "end": 171, "ctxt": 0 }, "name": { "type": "PreservedToken", "span": { - "start": 95, - "end": 96, + "start": 69, + "end": 70, "ctxt": 0 }, "token": "LBrace" @@ -412,15 +322,15 @@ { "type": "Declaration", "span": { - "start": 97, - "end": 108, + "start": 75, + "end": 87, "ctxt": 0 }, "name": { "type": "Ident", "span": { - "start": 97, - "end": 102, + "start": 75, + "end": 80, "ctxt": 0 }, "value": "color", @@ -430,130 +340,257 @@ { "type": "Ident", "span": { - "start": 104, - "end": 108, + "start": 82, + "end": 87, "ctxt": 0 }, - "value": "blue", - "raw": "blue" + "value": "green", + "raw": "green" } ], "important": null - } - ] - } - }, - { - "type": "QualifiedRule", - "span": { - "start": 132, - "end": 156, - "ctxt": 0 - }, - "prelude": { - "type": "SelectorList", - "span": { - "start": 132, - "end": 137, - "ctxt": 0 - }, - "children": [ + }, { - "type": "ComplexSelector", + "type": "Declaration", "span": { - "start": 132, - "end": 137, + "start": 116, + "end": 126, "ctxt": 0 }, - "children": [ + "name": { + "type": "Ident", + "span": { + "start": 116, + "end": 121, + "ctxt": 0 + }, + "value": "color", + "raw": "color" + }, + "value": [ { - "type": "CompoundSelector", + "type": "Ident", "span": { - "start": 132, - "end": 137, + "start": 123, + "end": 126, "ctxt": 0 }, - "nestingSelector": { - "type": "NestingSelector", + "value": "red", + "raw": "red" + } + ], + "important": null + }, + { + "type": "QualifiedRule", + "span": { + "start": 93, + "end": 111, + "ctxt": 0 + }, + "prelude": { + "type": "SelectorList", + "span": { + "start": 93, + "end": 94, + "ctxt": 0 + }, + "children": [ + { + "type": "ComplexSelector", "span": { - "start": 132, - "end": 133, + "start": 93, + "end": 94, "ctxt": 0 - } + }, + "children": [ + { + "type": "CompoundSelector", + "span": { + "start": 93, + "end": 94, + "ctxt": 0 + }, + "nestingSelector": { + "type": "NestingSelector", + "span": { + "start": 93, + "end": 94, + "ctxt": 0 + } + }, + "typeSelector": null, + "subclassSelectors": [] + } + ] + } + ] + }, + "block": { + "type": "SimpleBlock", + "span": { + "start": 95, + "end": 111, + "ctxt": 0 + }, + "name": { + "type": "PreservedToken", + "span": { + "start": 95, + "end": 96, + "ctxt": 0 }, - "typeSelector": null, - "subclassSelectors": [ - { - "type": "ClassSelector", + "token": "LBrace" + }, + "value": [ + { + "type": "Declaration", + "span": { + "start": 97, + "end": 108, + "ctxt": 0 + }, + "name": { + "type": "Ident", "span": { - "start": 133, - "end": 137, + "start": 97, + "end": 102, "ctxt": 0 }, - "text": { + "value": "color", + "raw": "color" + }, + "value": [ + { "type": "Ident", "span": { - "start": 134, - "end": 137, + "start": 104, + "end": 108, "ctxt": 0 }, - "value": "foo", - "raw": "foo" + "value": "blue", + "raw": "blue" } - } - ] - } - ] - } - ] - }, - "block": { - "type": "SimpleBlock", - "span": { - "start": 138, - "end": 156, - "ctxt": 0 - }, - "name": { - "type": "PreservedToken", - "span": { - "start": 138, - "end": 139, - "ctxt": 0 + ], + "important": null + } + ] + } }, - "token": "LBrace" - }, - "value": [ { - "type": "Declaration", + "type": "QualifiedRule", "span": { - "start": 140, - "end": 153, + "start": 132, + "end": 156, "ctxt": 0 }, - "name": { - "type": "Ident", + "prelude": { + "type": "SelectorList", "span": { - "start": 140, - "end": 145, + "start": 132, + "end": 137, "ctxt": 0 }, - "value": "color", - "raw": "color" + "children": [ + { + "type": "ComplexSelector", + "span": { + "start": 132, + "end": 137, + "ctxt": 0 + }, + "children": [ + { + "type": "CompoundSelector", + "span": { + "start": 132, + "end": 137, + "ctxt": 0 + }, + "nestingSelector": { + "type": "NestingSelector", + "span": { + "start": 132, + "end": 133, + "ctxt": 0 + } + }, + "typeSelector": null, + "subclassSelectors": [ + { + "type": "ClassSelector", + "span": { + "start": 133, + "end": 137, + "ctxt": 0 + }, + "text": { + "type": "Ident", + "span": { + "start": 134, + "end": 137, + "ctxt": 0 + }, + "value": "foo", + "raw": "foo" + } + } + ] + } + ] + } + ] }, - "value": [ - { - "type": "Ident", + "block": { + "type": "SimpleBlock", + "span": { + "start": 138, + "end": 156, + "ctxt": 0 + }, + "name": { + "type": "PreservedToken", "span": { - "start": 147, - "end": 153, + "start": 138, + "end": 139, "ctxt": 0 }, - "value": "yellow", - "raw": "yellow" - } - ], - "important": null + "token": "LBrace" + }, + "value": [ + { + "type": "Declaration", + "span": { + "start": 140, + "end": 153, + "ctxt": 0 + }, + "name": { + "type": "Ident", + "span": { + "start": 140, + "end": 145, + "ctxt": 0 + }, + "value": "color", + "raw": "color" + }, + "value": [ + { + "type": "Ident", + "span": { + "start": 147, + "end": 153, + "ctxt": 0 + }, + "value": "yellow", + "raw": "yellow" + } + ], + "important": null + } + ] + } } ] } diff --git a/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested-2/output.swc-stderr b/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested-2/output.swc-stderr index 1e3ca5e5604f..1c6a4ba069b3 100644 --- a/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested-2/output.swc-stderr +++ b/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested-2/output.swc-stderr @@ -5,8 +5,8 @@ : ^ `---- - x Unexpected character `';'` - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:3:5] - 3 | & test; - : ^ - `---- + x Unexpected end of file + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:12:3] + 12 | + : ^ + `---- diff --git a/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested-2/span.rust-debug b/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested-2/span.rust-debug index 645f63000b3a..3a586c1d5006 100644 --- a/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested-2/span.rust-debug +++ b/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested-2/span.rust-debug @@ -16,22 +16,36 @@ `---- x Rule - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:1:1] - 1 | ,-> .class { - 2 | | color: red; - 3 | | & test; - 4 | | background: red - 5 | `-> } - `---- + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:1:1] + 1 | ,-> .class { + 2 | | color: red; + 3 | | & test; + 4 | | background: red + 5 | | } + 6 | | + 7 | | article { + 8 | | color: green; + 9 | | & { color: blue; } + 10 | | color: red; + 11 | | &.foo { color: yellow; } /* valid! */ + 12 | `-> } + `---- x QualifiedRule - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:1:1] - 1 | ,-> .class { - 2 | | color: red; - 3 | | & test; - 4 | | background: red - 5 | `-> } - `---- + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:1:1] + 1 | ,-> .class { + 2 | | color: red; + 3 | | & test; + 4 | | background: red + 5 | | } + 6 | | + 7 | | article { + 8 | | color: green; + 9 | | & { color: blue; } + 10 | | color: red; + 11 | | &.foo { color: yellow; } /* valid! */ + 12 | `-> } + `---- x SelectorList ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:1:1] @@ -70,13 +84,20 @@ `---- x SimpleBlock - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:1:1] - 1 | ,-> .class { - 2 | | color: red; - 3 | | & test; - 4 | | background: red - 5 | `-> } - `---- + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:1:1] + 1 | ,-> .class { + 2 | | color: red; + 3 | | & test; + 4 | | background: red + 5 | | } + 6 | | + 7 | | article { + 8 | | color: green; + 9 | | & { color: blue; } + 10 | | color: red; + 11 | | &.foo { color: yellow; } /* valid! */ + 12 | `-> } + `---- x LBrace ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:1:1] @@ -127,58 +148,46 @@ `---- x ComponentValue - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] - 4 | background: red - : ^^^^^^^^^^^^^^^ - `---- + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:3:5] + 3 | ,-> & test; + 4 | | background: red + 5 | | } + 6 | | + 7 | | article { + 8 | | color: green; + 9 | | & { color: blue; } + 10 | | color: red; + 11 | | &.foo { color: yellow; } /* valid! */ + 12 | `-> } + `---- x StyleBlock - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] - 4 | background: red - : ^^^^^^^^^^^^^^^ - `---- - - x Declaration - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] - 4 | background: red - : ^^^^^^^^^^^^^^^ - `---- - - x DeclarationName - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] - 4 | background: red - : ^^^^^^^^^^ - `---- - - x Ident - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] - 4 | background: red - : ^^^^^^^^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] - 4 | background: red - : ^^^ - `---- - - x Ident - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] - 4 | background: red - : ^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:3:5] - 3 | & test; - : ^^^^^^^ - `---- + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:3:5] + 3 | ,-> & test; + 4 | | background: red + 5 | | } + 6 | | + 7 | | article { + 8 | | color: green; + 9 | | & { color: blue; } + 10 | | color: red; + 11 | | &.foo { color: yellow; } /* valid! */ + 12 | `-> } + `---- - x StyleBlock - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:3:5] - 3 | & test; - : ^^^^^^^ - `---- + x QualifiedRule + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:3:5] + 3 | ,-> & test; + 4 | | background: red + 5 | | } + 6 | | + 7 | | article { + 8 | | color: green; + 9 | | & { color: blue; } + 10 | | color: red; + 11 | | &.foo { color: yellow; } /* valid! */ + 12 | `-> } + `---- x ComponentValue ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:3:5] @@ -228,66 +237,132 @@ : ^ `---- - x Rule - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:7:1] - 7 | ,-> article { - 8 | | color: green; - 9 | | & { color: blue; } - 10 | | color: red; - 11 | | &.foo { color: yellow; } /* valid! */ - 12 | `-> } - `---- + x ComponentValue + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:3:5] + 3 | ,-> & test; + 4 | `-> background: red + `---- - x QualifiedRule - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:7:1] - 7 | ,-> article { - 8 | | color: green; - 9 | | & { color: blue; } - 10 | | color: red; - 11 | | &.foo { color: yellow; } /* valid! */ - 12 | `-> } - `---- + x WhiteSpace { value: Atom(' + | ' type=inline) } + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:3:5] + 3 | ,-> & test; + 4 | `-> background: red + `---- - x SelectorList - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:7:1] - 7 | article { - : ^^^^^^^ + x ComponentValue + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] + 4 | background: red + : ^^^^^^^^^^ `---- - x ComplexSelector - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:7:1] - 7 | article { - : ^^^^^^^ + x Ident { value: Atom('background' type=dynamic), raw: Atom('background' type=dynamic) } + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] + 4 | background: red + : ^^^^^^^^^^ `---- - x CompoundSelector - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:7:1] - 7 | article { - : ^^^^^^^ + x ComponentValue + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] + 4 | background: red + : ^ + `---- + + x Colon + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] + 4 | background: red + : ^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] + 4 | background: red + : ^ + `---- + + x WhiteSpace { value: Atom(' ' type=inline) } + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] + 4 | background: red + : ^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] + 4 | background: red + : ^^^ + `---- + + x Ident { value: Atom('red' type=inline), raw: Atom('red' type=inline) } + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] + 4 | background: red + : ^^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] + 4 | background: red + : ^ + 5 | } + `---- + + x WhiteSpace { value: Atom(' + | ' type=inline) } + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] + 4 | background: red + : ^ + 5 | } + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:5:1] + 5 | } + : ^ + `---- + + x RBrace + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:5:1] + 5 | } + : ^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:5:1] + 5 | ,-> } + 6 | `-> + 7 | article { `---- - x TypeSelector + x WhiteSpace { value: Atom(' + | + | ' type=inline) } + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:5:1] + 5 | ,-> } + 6 | `-> + 7 | article { + `---- + + x ComponentValue ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:7:1] 7 | article { : ^^^^^^^ `---- - x TagNameSelector + x Ident { value: Atom('article' type=static), raw: Atom('article' type=static) } ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:7:1] 7 | article { : ^^^^^^^ `---- - x WqName + x ComponentValue ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:7:1] 7 | article { - : ^^^^^^^ + : ^ `---- - x Ident + x WhiteSpace { value: Atom(' ' type=inline) } ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:7:1] 7 | article { - : ^^^^^^^ + : ^ `---- x SimpleBlock diff --git a/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested/output.json b/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested/output.json index 12214278521c..223e45efb12d 100644 --- a/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested/output.json +++ b/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested/output.json @@ -10,7 +10,7 @@ "type": "QualifiedRule", "span": { "start": 1, - "end": 60, + "end": 173, "ctxt": 0 }, "prelude": { @@ -67,7 +67,7 @@ "type": "SimpleBlock", "span": { "start": 8, - "end": 60, + "end": 173, "ctxt": 0 }, "name": { @@ -112,298 +112,217 @@ "important": null }, { - "type": "Declaration", + "type": "QualifiedRule", "span": { - "start": 42, - "end": 57, + "start": 30, + "end": 172, "ctxt": 0 }, - "name": { - "type": "Ident", + "prelude": { + "type": "ListOfComponentValues", "span": { - "start": 42, - "end": 52, + "start": 30, + "end": 70, "ctxt": 0 }, - "value": "background", - "raw": "background" - }, - "value": [ - { - "type": "Ident", - "span": { - "start": 54, - "end": 57, - "ctxt": 0 + "children": [ + { + "type": "PreservedToken", + "span": { + "start": 30, + "end": 31, + "ctxt": 0 + }, + "token": { + "Delim": { + "value": "&" + } + } }, - "value": "red", - "raw": "red" - } - ], - "important": null - }, - { - "type": "ListOfComponentValues", - "span": { - "start": 30, - "end": 37, - "ctxt": 0 - }, - "children": [ - { - "type": "PreservedToken", - "span": { - "start": 30, - "end": 31, - "ctxt": 0 + { + "type": "PreservedToken", + "span": { + "start": 31, + "end": 32, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } + } }, - "token": { - "Delim": { - "value": "&" + { + "type": "PreservedToken", + "span": { + "start": 32, + "end": 36, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "test", + "raw": "test" + } } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 31, - "end": 32, - "ctxt": 0 }, - "token": { - "WhiteSpace": { - "value": " " + { + "type": "PreservedToken", + "span": { + "start": 36, + "end": 37, + "ctxt": 0 + }, + "token": "Semi" + }, + { + "type": "PreservedToken", + "span": { + "start": 37, + "end": 42, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": "\n " + } } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 32, - "end": 36, - "ctxt": 0 }, - "token": { - "Ident": { - "value": "test", - "raw": "test" + { + "type": "PreservedToken", + "span": { + "start": 42, + "end": 52, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "background", + "raw": "background" + } } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 36, - "end": 37, - "ctxt": 0 }, - "token": "Semi" - } - ] - } - ] - } - }, - { - "type": "QualifiedRule", - "span": { - "start": 62, - "end": 172, - "ctxt": 0 - }, - "prelude": { - "type": "SelectorList", - "span": { - "start": 62, - "end": 69, - "ctxt": 0 - }, - "children": [ - { - "type": "ComplexSelector", - "span": { - "start": 62, - "end": 69, - "ctxt": 0 - }, - "children": [ - { - "type": "CompoundSelector", - "span": { - "start": 62, - "end": 69, - "ctxt": 0 + { + "type": "PreservedToken", + "span": { + "start": 52, + "end": 53, + "ctxt": 0 + }, + "token": "Colon" }, - "nestingSelector": null, - "typeSelector": { - "type": "TagNameSelector", + { + "type": "PreservedToken", + "span": { + "start": 53, + "end": 54, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 54, + "end": 57, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "red", + "raw": "red" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 57, + "end": 58, + "ctxt": 0 + }, + "token": "Semi" + }, + { + "type": "PreservedToken", + "span": { + "start": 58, + "end": 59, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": "\n" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 59, + "end": 60, + "ctxt": 0 + }, + "token": "RBrace" + }, + { + "type": "PreservedToken", + "span": { + "start": 60, + "end": 62, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": "\n\n" + } + } + }, + { + "type": "PreservedToken", "span": { "start": 62, "end": 69, "ctxt": 0 }, - "name": { - "type": "WqName", - "span": { - "start": 62, - "end": 69, - "ctxt": 0 - }, - "prefix": null, - "value": { - "type": "Ident", - "span": { - "start": 62, - "end": 69, - "ctxt": 0 - }, + "token": { + "Ident": { "value": "article", "raw": "article" } } }, - "subclassSelectors": [] - } - ] - } - ] - }, - "block": { - "type": "SimpleBlock", - "span": { - "start": 70, - "end": 172, - "ctxt": 0 - }, - "name": { - "type": "PreservedToken", - "span": { - "start": 70, - "end": 71, - "ctxt": 0 - }, - "token": "LBrace" - }, - "value": [ - { - "type": "Declaration", - "span": { - "start": 76, - "end": 88, - "ctxt": 0 - }, - "name": { - "type": "Ident", - "span": { - "start": 76, - "end": 81, - "ctxt": 0 - }, - "value": "color", - "raw": "color" - }, - "value": [ - { - "type": "Ident", - "span": { - "start": 83, - "end": 88, - "ctxt": 0 - }, - "value": "green", - "raw": "green" - } - ], - "important": null - }, - { - "type": "Declaration", - "span": { - "start": 117, - "end": 127, - "ctxt": 0 - }, - "name": { - "type": "Ident", - "span": { - "start": 117, - "end": 122, - "ctxt": 0 - }, - "value": "color", - "raw": "color" - }, - "value": [ - { - "type": "Ident", - "span": { - "start": 124, - "end": 127, - "ctxt": 0 - }, - "value": "red", - "raw": "red" - } - ], - "important": null - }, - { - "type": "QualifiedRule", - "span": { - "start": 94, - "end": 112, - "ctxt": 0 - }, - "prelude": { - "type": "SelectorList", - "span": { - "start": 94, - "end": 95, - "ctxt": 0 - }, - "children": [ { - "type": "ComplexSelector", + "type": "PreservedToken", "span": { - "start": 94, - "end": 95, + "start": 69, + "end": 70, "ctxt": 0 }, - "children": [ - { - "type": "CompoundSelector", - "span": { - "start": 94, - "end": 95, - "ctxt": 0 - }, - "nestingSelector": { - "type": "NestingSelector", - "span": { - "start": 94, - "end": 95, - "ctxt": 0 - } - }, - "typeSelector": null, - "subclassSelectors": [] + "token": { + "WhiteSpace": { + "value": " " } - ] + } } ] }, "block": { "type": "SimpleBlock", "span": { - "start": 96, - "end": 112, + "start": 70, + "end": 172, "ctxt": 0 }, "name": { "type": "PreservedToken", "span": { - "start": 96, - "end": 97, + "start": 70, + "end": 71, "ctxt": 0 }, "token": "LBrace" @@ -412,15 +331,15 @@ { "type": "Declaration", "span": { - "start": 98, - "end": 109, + "start": 76, + "end": 88, "ctxt": 0 }, "name": { "type": "Ident", "span": { - "start": 98, - "end": 103, + "start": 76, + "end": 81, "ctxt": 0 }, "value": "color", @@ -430,130 +349,257 @@ { "type": "Ident", "span": { - "start": 105, - "end": 109, + "start": 83, + "end": 88, "ctxt": 0 }, - "value": "blue", - "raw": "blue" + "value": "green", + "raw": "green" } ], "important": null - } - ] - } - }, - { - "type": "QualifiedRule", - "span": { - "start": 133, - "end": 157, - "ctxt": 0 - }, - "prelude": { - "type": "SelectorList", - "span": { - "start": 133, - "end": 138, - "ctxt": 0 - }, - "children": [ + }, { - "type": "ComplexSelector", + "type": "Declaration", "span": { - "start": 133, - "end": 138, + "start": 117, + "end": 127, "ctxt": 0 }, - "children": [ + "name": { + "type": "Ident", + "span": { + "start": 117, + "end": 122, + "ctxt": 0 + }, + "value": "color", + "raw": "color" + }, + "value": [ { - "type": "CompoundSelector", + "type": "Ident", "span": { - "start": 133, - "end": 138, + "start": 124, + "end": 127, "ctxt": 0 }, - "nestingSelector": { - "type": "NestingSelector", + "value": "red", + "raw": "red" + } + ], + "important": null + }, + { + "type": "QualifiedRule", + "span": { + "start": 94, + "end": 112, + "ctxt": 0 + }, + "prelude": { + "type": "SelectorList", + "span": { + "start": 94, + "end": 95, + "ctxt": 0 + }, + "children": [ + { + "type": "ComplexSelector", "span": { - "start": 133, - "end": 134, + "start": 94, + "end": 95, "ctxt": 0 - } + }, + "children": [ + { + "type": "CompoundSelector", + "span": { + "start": 94, + "end": 95, + "ctxt": 0 + }, + "nestingSelector": { + "type": "NestingSelector", + "span": { + "start": 94, + "end": 95, + "ctxt": 0 + } + }, + "typeSelector": null, + "subclassSelectors": [] + } + ] + } + ] + }, + "block": { + "type": "SimpleBlock", + "span": { + "start": 96, + "end": 112, + "ctxt": 0 + }, + "name": { + "type": "PreservedToken", + "span": { + "start": 96, + "end": 97, + "ctxt": 0 }, - "typeSelector": null, - "subclassSelectors": [ - { - "type": "ClassSelector", + "token": "LBrace" + }, + "value": [ + { + "type": "Declaration", + "span": { + "start": 98, + "end": 109, + "ctxt": 0 + }, + "name": { + "type": "Ident", "span": { - "start": 134, - "end": 138, + "start": 98, + "end": 103, "ctxt": 0 }, - "text": { + "value": "color", + "raw": "color" + }, + "value": [ + { "type": "Ident", "span": { - "start": 135, - "end": 138, + "start": 105, + "end": 109, "ctxt": 0 }, - "value": "foo", - "raw": "foo" + "value": "blue", + "raw": "blue" } - } - ] - } - ] - } - ] - }, - "block": { - "type": "SimpleBlock", - "span": { - "start": 139, - "end": 157, - "ctxt": 0 - }, - "name": { - "type": "PreservedToken", - "span": { - "start": 139, - "end": 140, - "ctxt": 0 + ], + "important": null + } + ] + } }, - "token": "LBrace" - }, - "value": [ { - "type": "Declaration", + "type": "QualifiedRule", "span": { - "start": 141, - "end": 154, + "start": 133, + "end": 157, "ctxt": 0 }, - "name": { - "type": "Ident", + "prelude": { + "type": "SelectorList", "span": { - "start": 141, - "end": 146, + "start": 133, + "end": 138, "ctxt": 0 }, - "value": "color", - "raw": "color" + "children": [ + { + "type": "ComplexSelector", + "span": { + "start": 133, + "end": 138, + "ctxt": 0 + }, + "children": [ + { + "type": "CompoundSelector", + "span": { + "start": 133, + "end": 138, + "ctxt": 0 + }, + "nestingSelector": { + "type": "NestingSelector", + "span": { + "start": 133, + "end": 134, + "ctxt": 0 + } + }, + "typeSelector": null, + "subclassSelectors": [ + { + "type": "ClassSelector", + "span": { + "start": 134, + "end": 138, + "ctxt": 0 + }, + "text": { + "type": "Ident", + "span": { + "start": 135, + "end": 138, + "ctxt": 0 + }, + "value": "foo", + "raw": "foo" + } + } + ] + } + ] + } + ] }, - "value": [ - { - "type": "Ident", + "block": { + "type": "SimpleBlock", + "span": { + "start": 139, + "end": 157, + "ctxt": 0 + }, + "name": { + "type": "PreservedToken", "span": { - "start": 148, - "end": 154, + "start": 139, + "end": 140, "ctxt": 0 }, - "value": "yellow", - "raw": "yellow" - } - ], - "important": null + "token": "LBrace" + }, + "value": [ + { + "type": "Declaration", + "span": { + "start": 141, + "end": 154, + "ctxt": 0 + }, + "name": { + "type": "Ident", + "span": { + "start": 141, + "end": 146, + "ctxt": 0 + }, + "value": "color", + "raw": "color" + }, + "value": [ + { + "type": "Ident", + "span": { + "start": 148, + "end": 154, + "ctxt": 0 + }, + "value": "yellow", + "raw": "yellow" + } + ], + "important": null + } + ] + } } ] } diff --git a/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested/output.swc-stderr b/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested/output.swc-stderr index 60288595cd46..74c9e3248797 100644 --- a/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested/output.swc-stderr +++ b/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested/output.swc-stderr @@ -5,8 +5,8 @@ : ^ `---- - x Unexpected character `';'` - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:3:5] - 3 | & test; - : ^ - `---- + x Unexpected end of file + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:12:3] + 12 | + : ^ + `---- diff --git a/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested/span.rust-debug b/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested/span.rust-debug index 3edbbd023ee8..901302b3ca1c 100644 --- a/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested/span.rust-debug +++ b/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested/span.rust-debug @@ -16,22 +16,36 @@ `---- x Rule - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:1:1] - 1 | ,-> .class { - 2 | | color: red; - 3 | | & test; - 4 | | background: red; - 5 | `-> } - `---- + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:1:1] + 1 | ,-> .class { + 2 | | color: red; + 3 | | & test; + 4 | | background: red; + 5 | | } + 6 | | + 7 | | article { + 8 | | color: green; + 9 | | & { color: blue; } + 10 | | color: red; + 11 | | &.foo { color: yellow; } /* valid! */ + 12 | `-> } + `---- x QualifiedRule - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:1:1] - 1 | ,-> .class { - 2 | | color: red; - 3 | | & test; - 4 | | background: red; - 5 | `-> } - `---- + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:1:1] + 1 | ,-> .class { + 2 | | color: red; + 3 | | & test; + 4 | | background: red; + 5 | | } + 6 | | + 7 | | article { + 8 | | color: green; + 9 | | & { color: blue; } + 10 | | color: red; + 11 | | &.foo { color: yellow; } /* valid! */ + 12 | `-> } + `---- x SelectorList ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:1:1] @@ -70,13 +84,20 @@ `---- x SimpleBlock - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:1:1] - 1 | ,-> .class { - 2 | | color: red; - 3 | | & test; - 4 | | background: red; - 5 | `-> } - `---- + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:1:1] + 1 | ,-> .class { + 2 | | color: red; + 3 | | & test; + 4 | | background: red; + 5 | | } + 6 | | + 7 | | article { + 8 | | color: green; + 9 | | & { color: blue; } + 10 | | color: red; + 11 | | &.foo { color: yellow; } /* valid! */ + 12 | `-> } + `---- x LBrace ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:1:1] @@ -127,58 +148,46 @@ `---- x ComponentValue - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] - 4 | background: red; - : ^^^^^^^^^^^^^^^ - `---- + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:3:5] + 3 | ,-> & test; + 4 | | background: red; + 5 | | } + 6 | | + 7 | | article { + 8 | | color: green; + 9 | | & { color: blue; } + 10 | | color: red; + 11 | | &.foo { color: yellow; } /* valid! */ + 12 | `-> } + `---- x StyleBlock - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] - 4 | background: red; - : ^^^^^^^^^^^^^^^ - `---- - - x Declaration - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] - 4 | background: red; - : ^^^^^^^^^^^^^^^ - `---- - - x DeclarationName - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] - 4 | background: red; - : ^^^^^^^^^^ - `---- - - x Ident - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] - 4 | background: red; - : ^^^^^^^^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] - 4 | background: red; - : ^^^ - `---- - - x Ident - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] - 4 | background: red; - : ^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:3:5] - 3 | & test; - : ^^^^^^^ - `---- + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:3:5] + 3 | ,-> & test; + 4 | | background: red; + 5 | | } + 6 | | + 7 | | article { + 8 | | color: green; + 9 | | & { color: blue; } + 10 | | color: red; + 11 | | &.foo { color: yellow; } /* valid! */ + 12 | `-> } + `---- - x StyleBlock - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:3:5] - 3 | & test; - : ^^^^^^^ - `---- + x QualifiedRule + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:3:5] + 3 | ,-> & test; + 4 | | background: red; + 5 | | } + 6 | | + 7 | | article { + 8 | | color: green; + 9 | | & { color: blue; } + 10 | | color: red; + 11 | | &.foo { color: yellow; } /* valid! */ + 12 | `-> } + `---- x ComponentValue ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:3:5] @@ -228,66 +237,144 @@ : ^ `---- - x Rule - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:7:1] - 7 | ,-> article { - 8 | | color: green; - 9 | | & { color: blue; } - 10 | | color: red; - 11 | | &.foo { color: yellow; } /* valid! */ - 12 | `-> } - `---- + x ComponentValue + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:3:5] + 3 | ,-> & test; + 4 | `-> background: red; + `---- - x QualifiedRule - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:7:1] - 7 | ,-> article { - 8 | | color: green; - 9 | | & { color: blue; } - 10 | | color: red; - 11 | | &.foo { color: yellow; } /* valid! */ - 12 | `-> } - `---- + x WhiteSpace { value: Atom(' + | ' type=inline) } + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:3:5] + 3 | ,-> & test; + 4 | `-> background: red; + `---- - x SelectorList - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:7:1] - 7 | article { - : ^^^^^^^ + x ComponentValue + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] + 4 | background: red; + : ^^^^^^^^^^ `---- - x ComplexSelector - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:7:1] - 7 | article { - : ^^^^^^^ + x Ident { value: Atom('background' type=dynamic), raw: Atom('background' type=dynamic) } + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] + 4 | background: red; + : ^^^^^^^^^^ `---- - x CompoundSelector - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:7:1] - 7 | article { - : ^^^^^^^ + x ComponentValue + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] + 4 | background: red; + : ^ `---- - x TypeSelector + x Colon + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] + 4 | background: red; + : ^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] + 4 | background: red; + : ^ + `---- + + x WhiteSpace { value: Atom(' ' type=inline) } + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] + 4 | background: red; + : ^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] + 4 | background: red; + : ^^^ + `---- + + x Ident { value: Atom('red' type=inline), raw: Atom('red' type=inline) } + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] + 4 | background: red; + : ^^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] + 4 | background: red; + : ^ + `---- + + x Semi + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] + 4 | background: red; + : ^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] + 4 | background: red; + : ^ + 5 | } + `---- + + x WhiteSpace { value: Atom(' + | ' type=inline) } + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] + 4 | background: red; + : ^ + 5 | } + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:5:1] + 5 | } + : ^ + `---- + + x RBrace + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:5:1] + 5 | } + : ^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:5:1] + 5 | ,-> } + 6 | `-> + 7 | article { + `---- + + x WhiteSpace { value: Atom(' + | + | ' type=inline) } + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:5:1] + 5 | ,-> } + 6 | `-> + 7 | article { + `---- + + x ComponentValue ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:7:1] 7 | article { : ^^^^^^^ `---- - x TagNameSelector + x Ident { value: Atom('article' type=static), raw: Atom('article' type=static) } ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:7:1] 7 | article { : ^^^^^^^ `---- - x WqName + x ComponentValue ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:7:1] 7 | article { - : ^^^^^^^ + : ^ `---- - x Ident + x WhiteSpace { value: Atom(' ' type=inline) } ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:7:1] 7 | article { - : ^^^^^^^ + : ^ `---- x SimpleBlock diff --git a/crates/swc_css_parser/tests/recovery/vercel/001/output.swc-stderr b/crates/swc_css_parser/tests/recovery/vercel/001/output.swc-stderr index 5f1a5d867eda..7769a28d46a6 100644 --- a/crates/swc_css_parser/tests/recovery/vercel/001/output.swc-stderr +++ b/crates/swc_css_parser/tests/recovery/vercel/001/output.swc-stderr @@ -1,10 +1,4 @@ - x Invalid selector - ,-[$DIR/tests/recovery/vercel/001/input.css:15:1] - 15 | } - : ^ - `---- - x Unexpected end of file ,-[$DIR/tests/recovery/vercel/001/input.css:15:3] 15 | From f8845b8dc1ac1a2ccc66056835245dec6e5c7960 Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Fri, 21 Oct 2022 16:46:34 +0300 Subject: [PATCH 03/19] refactor: using component values as per spec --- crates/swc_css_parser/src/parser/input.rs | 118 +++++++++++++++++- .../swc_css_parser/src/parser/syntax/mod.rs | 37 ++++-- crates/swc_css_parser/src/parser/util.rs | 11 +- 3 files changed, 148 insertions(+), 18 deletions(-) diff --git a/crates/swc_css_parser/src/parser/input.rs b/crates/swc_css_parser/src/parser/input.rs index 2aed4e43eda8..959d323a855d 100644 --- a/crates/swc_css_parser/src/parser/input.rs +++ b/crates/swc_css_parser/src/parser/input.rs @@ -1,7 +1,7 @@ use std::{fmt::Debug, mem::take}; use swc_common::{BytePos, Span, SyntaxContext}; -use swc_css_ast::{Token, TokenAndSpan}; +use swc_css_ast::{ComponentValue, ListOfComponentValues, Token, TokenAndSpan}; use super::PResult; use crate::error::{Error, ErrorKind}; @@ -264,3 +264,119 @@ impl<'a> Iterator for TokensInput<'a> { Some(token_and_span) } } + +#[derive(Debug)] +pub struct ListOfComponentValuesState { + idx: Vec, +} + +#[derive(Debug)] +pub struct ListOfComponentValuesInput<'a> { + list: &'a ListOfComponentValues, + idx: Vec, +} + +impl<'a> ListOfComponentValuesInput<'a> { + pub fn new(list: &'a ListOfComponentValues) -> Self { + ListOfComponentValuesInput { list, idx: vec![0] } + } + + fn get_component_value( + &self, + list: &'a Vec, + deep: usize, + ) -> Option<&TokenAndSpan> { + let index = match self.idx.get(deep) { + Some(index) => index, + _ => return None, + }; + + match list.get(*index) { + Some(ComponentValue::PreservedToken(token_and_span)) => Some(token_and_span), + Some(ComponentValue::Function(function)) => { + self.get_component_value(&function.value, deep + 1) + } + Some(ComponentValue::SimpleBlock(simple_block)) => { + self.get_component_value(&simple_block.value, deep + 1) + } + None => return None, + _ => { + unreachable!("Not allowed in the list of component values") + } + } + } + + fn cur(&mut self) -> PResult<&TokenAndSpan> { + let token_and_span = match self.get_component_value(&self.list.children, 0) { + Some(token_and_span) => token_and_span, + None => { + let bp = self.list.span.hi; + let span = Span::new(bp, bp, SyntaxContext::empty()); + + return Err(Error::new(span, ErrorKind::Eof)); + } + }; + + Ok(token_and_span) + } +} + +impl<'a> ParserInput for ListOfComponentValuesInput<'a> { + type State = ListOfComponentValuesState; + + fn start_pos(&mut self) -> BytePos { + self.list.span.lo + } + + fn state(&mut self) -> Self::State { + ListOfComponentValuesState { + idx: self.idx.clone(), + } + } + + fn reset(&mut self, state: &Self::State) { + self.idx = state.idx.clone(); + } + + fn take_errors(&mut self) -> Vec { + vec![] + } + + fn skip_ws(&mut self) -> Option { + let mut last_pos = None; + + while let Ok(TokenAndSpan { + token: tok!(" "), + span, + }) = self.cur() + { + last_pos = Some(span.hi); + + if let Some(idx) = self.idx.last_mut() { + *idx += 1; + } + } + + last_pos + } +} + +impl<'a> Iterator for ListOfComponentValuesInput<'a> { + type Item = TokenAndSpan; + + fn next(&mut self) -> Option { + let token_and_span = match self.cur() { + Ok(token_and_span) => token_and_span.clone(), + _ => return None, + }; + + let index = match self.idx.last_mut() { + Some(index) => index, + _ => return None, + }; + + *index += 1; + + Some(token_and_span) + } +} diff --git a/crates/swc_css_parser/src/parser/syntax/mod.rs b/crates/swc_css_parser/src/parser/syntax/mod.rs index ff8f1f18cb76..c7a2b739f849 100644 --- a/crates/swc_css_parser/src/parser/syntax/mod.rs +++ b/crates/swc_css_parser/src/parser/syntax/mod.rs @@ -5,7 +5,7 @@ use super::{input::ParserInput, PResult, Parser}; use crate::{ error::{Error, ErrorKind}, parser::{BlockContentsGrammar, Ctx}, - Parse, Tokens, + Parse, }; impl Parse for Parser @@ -122,17 +122,20 @@ where { fn parse(&mut self) -> PResult { let create_prelude = |p: &mut Parser, - mut tokens: Tokens| + mut list_of_component_values: ListOfComponentValues| -> PResult { - let span = match (tokens.tokens.first(), tokens.tokens.last()) { + let span = match ( + list_of_component_values.children.first(), + list_of_component_values.children.last(), + ) { (Some(first), Some(last)) => { Span::new(first.span_lo(), last.span_hi(), SyntaxContext::empty()) } _ => DUMMY_SP, }; - tokens.span = span; + list_of_component_values.span = span; - match p.parse_according_to_grammar::(&tokens) { + match p.parse_according_to_grammar::(&list_of_component_values) { Ok(selector_list) => { if p.ctx.is_trying_legacy_nesting { let selector_list = @@ -145,7 +148,9 @@ where } Err(err) => { if p.ctx.is_trying_legacy_nesting { - match p.parse_according_to_grammar::(&tokens) { + match p.parse_according_to_grammar::( + &list_of_component_values, + ) { Ok(relative_selector_list) => { let selector_list = p .legacy_relative_selector_list_to_modern_selector_list( @@ -159,8 +164,10 @@ where } else { p.errors.push(err); - let list_of_component_values = - p.parse_according_to_grammar::(&tokens)?; + let list_of_component_values = p + .parse_according_to_grammar::( + &list_of_component_values, + )?; Ok(QualifiedRulePrelude::ListOfComponentValues( list_of_component_values, @@ -173,9 +180,9 @@ where let span = self.input.cur_span(); // Create a new qualified rule with its prelude initially set to an empty list, // and its value initially set to nothing. - let mut prelude = Tokens { + let mut list_of_component_values = ListOfComponentValues { span: Default::default(), - tokens: vec![], + children: vec![], }; // Repeatedly consume the next input token: @@ -201,16 +208,20 @@ where return Ok(QualifiedRule { span: span!(self, span.lo), - prelude: create_prelude(self, prelude)?, + prelude: create_prelude(self, list_of_component_values)?, block, }); } // Reconsume the current input token. Consume a component value. Append the returned // value to the qualified rule’s prelude. _ => { - let item = self.input.bump().unwrap(); + let ctx = Ctx { + block_contents_grammar: BlockContentsGrammar::NoGrammar, + ..self.ctx + }; + let component_value = self.with_ctx(ctx).parse_as::()?; - prelude.tokens.push(item); + list_of_component_values.children.push(component_value); } } } diff --git a/crates/swc_css_parser/src/parser/util.rs b/crates/swc_css_parser/src/parser/util.rs index b557f4420099..4c3632e40b89 100644 --- a/crates/swc_css_parser/src/parser/util.rs +++ b/crates/swc_css_parser/src/parser/util.rs @@ -4,7 +4,7 @@ use swc_common::DUMMY_SP; use swc_css_ast::*; use super::{input::ParserInput, Ctx, PResult, Parse, Parser}; -use crate::{Tokens, TokensInput}; +use crate::parser::input::ListOfComponentValuesInput; impl Parser where @@ -31,11 +31,14 @@ where self.parse() } - pub fn parse_according_to_grammar<'a, T>(&mut self, tokens: &'a Tokens) -> PResult + pub fn parse_according_to_grammar<'a, T>( + &mut self, + list_of_component_values: &'a ListOfComponentValues, + ) -> PResult where - Parser>: Parse, + Parser>: Parse, { - let lexer = TokensInput::new(tokens); + let lexer = ListOfComponentValuesInput::new(list_of_component_values); let mut parser = Parser::new(lexer, self.config); parser.parse() From 69ce8aabb8669e37c73b05ae907f715b5215c9ed Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Fri, 21 Oct 2022 20:16:25 +0300 Subject: [PATCH 04/19] refactor: implement --- crates/swc_css_parser/src/parser/input.rs | 111 +++++++++++++++++++--- 1 file changed, 96 insertions(+), 15 deletions(-) diff --git a/crates/swc_css_parser/src/parser/input.rs b/crates/swc_css_parser/src/parser/input.rs index 959d323a855d..6e5786d8e9ff 100644 --- a/crates/swc_css_parser/src/parser/input.rs +++ b/crates/swc_css_parser/src/parser/input.rs @@ -1,6 +1,6 @@ use std::{fmt::Debug, mem::take}; -use swc_common::{BytePos, Span, SyntaxContext}; +use swc_common::{BytePos, Span, Spanned, SyntaxContext}; use swc_css_ast::{ComponentValue, ListOfComponentValues, Token, TokenAndSpan}; use super::PResult; @@ -282,22 +282,87 @@ impl<'a> ListOfComponentValuesInput<'a> { } fn get_component_value( - &self, - list: &'a Vec, + &mut self, + list: Vec, deep: usize, - ) -> Option<&TokenAndSpan> { + ) -> Option { let index = match self.idx.get(deep) { Some(index) => index, _ => return None, }; match list.get(*index) { - Some(ComponentValue::PreservedToken(token_and_span)) => Some(token_and_span), + Some(ComponentValue::PreservedToken(token_and_span)) => Some(token_and_span.clone()), Some(ComponentValue::Function(function)) => { - self.get_component_value(&function.value, deep + 1) + if self.idx.len() - 1 == deep { + return Some(TokenAndSpan { + span: Span::new( + function.span_lo(), + function.name.span_hi() + BytePos(1), + Default::default(), + ), + token: Token::Function { + value: function.name.value.clone(), + raw: function.name.value.clone(), + }, + }); + } + + let res = self.get_component_value(function.value.clone(), deep + 1); + + if res.is_none() { + return Some(TokenAndSpan { + span: Span::new( + function.span_hi() - BytePos(1), + function.span_hi(), + Default::default(), + ), + token: Token::RParen, + }); + } + + res } Some(ComponentValue::SimpleBlock(simple_block)) => { - self.get_component_value(&simple_block.value, deep + 1) + if self.idx.len() - 1 == deep { + return Some(simple_block.name.clone()); + } + + let res = self.get_component_value(simple_block.value.clone(), deep + 1); + + if res.is_none() { + return Some(match simple_block.name.token { + Token::LBracket => TokenAndSpan { + span: Span::new( + simple_block.span_hi() - BytePos(1), + simple_block.span_hi(), + Default::default(), + ), + token: Token::RBracket, + }, + Token::LParen => TokenAndSpan { + span: Span::new( + simple_block.span_hi() - BytePos(1), + simple_block.span_hi(), + Default::default(), + ), + token: Token::RParen, + }, + Token::LBrace => TokenAndSpan { + span: Span::new( + simple_block.span_hi() - BytePos(1), + simple_block.span_hi(), + Default::default(), + ), + token: Token::RBrace, + }, + _ => { + unreachable!(); + } + }); + } + + res } None => return None, _ => { @@ -306,8 +371,8 @@ impl<'a> ListOfComponentValuesInput<'a> { } } - fn cur(&mut self) -> PResult<&TokenAndSpan> { - let token_and_span = match self.get_component_value(&self.list.children, 0) { + fn cur(&mut self) -> PResult { + let token_and_span = match self.get_component_value(self.list.children.clone(), 0) { Some(token_and_span) => token_and_span, None => { let bp = self.list.span.hi; @@ -366,16 +431,32 @@ impl<'a> Iterator for ListOfComponentValuesInput<'a> { fn next(&mut self) -> Option { let token_and_span = match self.cur() { - Ok(token_and_span) => token_and_span.clone(), + Ok(token_and_span) => token_and_span, _ => return None, }; - let index = match self.idx.last_mut() { - Some(index) => index, - _ => return None, - }; + match &token_and_span.token { + Token::Function { .. } | Token::LParen | Token::LBrace | Token::LBracket => { + self.idx.push(0); + } + token @ _ => { + match token { + Token::RBrace | Token::RBracket | Token::RParen => { + self.idx.pop(); + } + _ => {} + } + + let index = match self.idx.last_mut() { + Some(index) => index, + _ => return None, + }; + + *index += 1; + } + } - *index += 1; + println!("TOKEN {:?}", token_and_span); Some(token_and_span) } From 9d07f1c3c285a34679f27d327e491be488657527 Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Fri, 21 Oct 2022 20:19:44 +0300 Subject: [PATCH 05/19] test: update --- crates/swc_css_parser/src/parser/input.rs | 2 - .../pseudo-class/unknown/span.rust-debug | 1009 ++++++++++++++-- .../pseudo-element/unknown/span.rust-debug | 1020 +++++++++++++++-- .../tests/recovery/hacks/output.json | 64 +- .../tests/recovery/hacks/span.rust-debug | 63 - .../selector/attribute/unclosed/output.json | 190 ++- .../attribute/unclosed/output.swc-stderr | 6 +- .../attribute/unclosed/span.rust-debug | 46 +- .../invalid-nested-2/output.json | 51 +- .../invalid-nested-2/span.rust-debug | 52 - .../invalid-nested/output.json | 51 +- .../invalid-nested/span.rust-debug | 52 - 12 files changed, 1977 insertions(+), 629 deletions(-) diff --git a/crates/swc_css_parser/src/parser/input.rs b/crates/swc_css_parser/src/parser/input.rs index 6e5786d8e9ff..20353eff3f12 100644 --- a/crates/swc_css_parser/src/parser/input.rs +++ b/crates/swc_css_parser/src/parser/input.rs @@ -456,8 +456,6 @@ impl<'a> Iterator for ListOfComponentValuesInput<'a> { } } - println!("TOKEN {:?}", token_and_span); - Some(token_and_span) } } diff --git a/crates/swc_css_parser/tests/fixture/selector/pseudo-class/unknown/span.rust-debug b/crates/swc_css_parser/tests/fixture/selector/pseudo-class/unknown/span.rust-debug index 713f2389d780..f54200d69a6b 100644 --- a/crates/swc_css_parser/tests/fixture/selector/pseudo-class/unknown/span.rust-debug +++ b/crates/swc_css_parser/tests/fixture/selector/pseudo-class/unknown/span.rust-debug @@ -10,7 +10,17 @@ 7 | | :unknown((foo bar)) {} 8 | | :unknown(((foo bar))) {} 9 | | :unknown({foo: bar}) {} - 10 | `-> :unknown({{foo: bar}}) {} + 10 | | :unknown({{foo: bar}}) {} + 11 | | :unknown({foo: bar !important}) {} + 12 | | :unknown("string") {} + 13 | | :unknown("string", foo) {} + 14 | | :unknown('string') {} + 15 | | :unknown(url(foo.png)) {} + 16 | | :unknown({!}) {} + 17 | | :unknown(!) {} + 18 | | :unknown({;}) {} + 19 | | :unknown(;) {} + 20 | `-> `---- x Rule @@ -772,133 +782,121 @@ x Rule ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^^^^^^^^^^^^^^^^^^^ + : ^^^^^^^^^^^^^^^^^^^^^^^ `---- x QualifiedRule ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^^^^^^^^^^^^^^^^^^^ + : ^^^^^^^^^^^^^^^^^^^^^^^ `---- - x ComponentValue + x SelectorList ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^ + : ^^^^^^^^^^^^^^^^^^^^ `---- - x Colon + x ComplexSelector ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^ + : ^^^^^^^^^^^^^^^^^^^^ `---- - x ComponentValue + x CompoundSelector ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^^^^^^^^ + : ^^^^^^^^^^^^^^^^^^^^ `---- - x Function + x SubclassSelector ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^^^^^^^^ + : ^^^^^^^^^^^^^^^^^^^^ `---- - x Ident + x PseudoClassSelector ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^^^^^^^ + : ^^^^^^^^^^^^^^^^^^^^ `---- - x SimpleBlock + x Ident ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^^^^^^^^^^ + : ^^^^^^^ `---- - x LBrace + x PseudoClassSelectorChildren ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} : ^ `---- - x ComponentValue - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] - 9 | :unknown({foo: bar}) {} - : ^^^^^^^^ - `---- - - x StyleBlock - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] - 9 | :unknown({foo: bar}) {} - : ^^^^^^^^ - `---- - - x Declaration + x LBrace ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^^^^^^^^ + : ^ `---- - x DeclarationName + x PseudoClassSelectorChildren ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} : ^^^ `---- - x Ident + x Ident { value: Atom('foo' type=inline), raw: Atom('foo' type=inline) } ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} : ^^^ `---- - x ComponentValue + x PseudoClassSelectorChildren ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^^^ + : ^ `---- - x Ident + x Colon ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^^^ + : ^ `---- - x Rule + x PseudoClassSelectorChildren ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^^^^ + : ^ `---- - x QualifiedRule + x WhiteSpace { value: Atom(' ' type=inline) } ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^^^^ + : ^ `---- - x ComponentValue + x PseudoClassSelectorChildren ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^ + : ^^^ `---- - x RParen + x Ident { value: Atom('bar' type=inline), raw: Atom('bar' type=inline) } ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^ + : ^^^ `---- - x ComponentValue + x PseudoClassSelectorChildren ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^ + : ^ `---- - x WhiteSpace { value: Atom(' ' type=inline) } + x RBrace ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:9:1] 9 | :unknown({foo: bar}) {} - : ^ + : ^ `---- x SimpleBlock @@ -916,70 +914,64 @@ x Rule ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] 10 | :unknown({{foo: bar}}) {} - : ^^^^^^^^^^^^^^^^^^^^ + : ^^^^^^^^^^^^^^^^^^^^^^^^^ `---- x QualifiedRule ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] 10 | :unknown({{foo: bar}}) {} - : ^^^^^^^^^^^^^^^^^^^^ + : ^^^^^^^^^^^^^^^^^^^^^^^^^ `---- - x ComponentValue + x SelectorList ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] 10 | :unknown({{foo: bar}}) {} - : ^ + : ^^^^^^^^^^^^^^^^^^^^^^ `---- - x Colon + x ComplexSelector ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] 10 | :unknown({{foo: bar}}) {} - : ^ + : ^^^^^^^^^^^^^^^^^^^^^^ `---- - x ComponentValue + x CompoundSelector ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] 10 | :unknown({{foo: bar}}) {} - : ^^^^^^^^ + : ^^^^^^^^^^^^^^^^^^^^^^ `---- - x Function + x SubclassSelector ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] 10 | :unknown({{foo: bar}}) {} - : ^^^^^^^^ + : ^^^^^^^^^^^^^^^^^^^^^^ `---- - x Ident + x PseudoClassSelector ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] 10 | :unknown({{foo: bar}}) {} - : ^^^^^^^ + : ^^^^^^^^^^^^^^^^^^^^^^ `---- - x SimpleBlock + x Ident ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] 10 | :unknown({{foo: bar}}) {} - : ^^^^^^^^^^^ + : ^^^^^^^ `---- - x LBrace + x PseudoClassSelectorChildren ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] 10 | :unknown({{foo: bar}}) {} : ^ `---- - x ComponentValue - ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] - 10 | :unknown({{foo: bar}}) {} - : ^^^^^^^^^ - `---- - - x StyleBlock + x LBrace ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] 10 | :unknown({{foo: bar}}) {} - : ^^^^^^^^^ + : ^ `---- - x ComponentValue + x PseudoClassSelectorChildren ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] 10 | :unknown({{foo: bar}}) {} : ^ @@ -991,7 +983,7 @@ : ^ `---- - x ComponentValue + x PseudoClassSelectorChildren ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] 10 | :unknown({{foo: bar}}) {} : ^^^ @@ -1003,7 +995,7 @@ : ^^^ `---- - x ComponentValue + x PseudoClassSelectorChildren ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] 10 | :unknown({{foo: bar}}) {} : ^ @@ -1015,7 +1007,7 @@ : ^ `---- - x ComponentValue + x PseudoClassSelectorChildren ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] 10 | :unknown({{foo: bar}}) {} : ^ @@ -1027,7 +1019,7 @@ : ^ `---- - x ComponentValue + x PseudoClassSelectorChildren ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] 10 | :unknown({{foo: bar}}) {} : ^^^ @@ -1038,3 +1030,868 @@ 10 | :unknown({{foo: bar}}) {} : ^^^ `---- + + x PseudoClassSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] + 10 | :unknown({{foo: bar}}) {} + : ^ + `---- + + x RBrace + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] + 10 | :unknown({{foo: bar}}) {} + : ^ + `---- + + x PseudoClassSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] + 10 | :unknown({{foo: bar}}) {} + : ^ + `---- + + x RBrace + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] + 10 | :unknown({{foo: bar}}) {} + : ^ + `---- + + x SimpleBlock + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] + 10 | :unknown({{foo: bar}}) {} + : ^^ + `---- + + x LBrace + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:10:1] + 10 | :unknown({{foo: bar}}) {} + : ^ + `---- + + x Rule + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] + 11 | :unknown({foo: bar !important}) {} + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x QualifiedRule + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] + 11 | :unknown({foo: bar !important}) {} + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x SelectorList + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] + 11 | :unknown({foo: bar !important}) {} + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x ComplexSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] + 11 | :unknown({foo: bar !important}) {} + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x CompoundSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] + 11 | :unknown({foo: bar !important}) {} + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x SubclassSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] + 11 | :unknown({foo: bar !important}) {} + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x PseudoClassSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] + 11 | :unknown({foo: bar !important}) {} + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x Ident + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] + 11 | :unknown({foo: bar !important}) {} + : ^^^^^^^ + `---- + + x PseudoClassSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] + 11 | :unknown({foo: bar !important}) {} + : ^ + `---- + + x LBrace + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] + 11 | :unknown({foo: bar !important}) {} + : ^ + `---- + + x PseudoClassSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] + 11 | :unknown({foo: bar !important}) {} + : ^^^ + `---- + + x Ident { value: Atom('foo' type=inline), raw: Atom('foo' type=inline) } + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] + 11 | :unknown({foo: bar !important}) {} + : ^^^ + `---- + + x PseudoClassSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] + 11 | :unknown({foo: bar !important}) {} + : ^ + `---- + + x Colon + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] + 11 | :unknown({foo: bar !important}) {} + : ^ + `---- + + x PseudoClassSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] + 11 | :unknown({foo: bar !important}) {} + : ^ + `---- + + x WhiteSpace { value: Atom(' ' type=inline) } + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] + 11 | :unknown({foo: bar !important}) {} + : ^ + `---- + + x PseudoClassSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] + 11 | :unknown({foo: bar !important}) {} + : ^^^ + `---- + + x Ident { value: Atom('bar' type=inline), raw: Atom('bar' type=inline) } + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] + 11 | :unknown({foo: bar !important}) {} + : ^^^ + `---- + + x PseudoClassSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] + 11 | :unknown({foo: bar !important}) {} + : ^ + `---- + + x WhiteSpace { value: Atom(' ' type=inline) } + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] + 11 | :unknown({foo: bar !important}) {} + : ^ + `---- + + x PseudoClassSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] + 11 | :unknown({foo: bar !important}) {} + : ^ + `---- + + x Delim { value: '!' } + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] + 11 | :unknown({foo: bar !important}) {} + : ^ + `---- + + x PseudoClassSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] + 11 | :unknown({foo: bar !important}) {} + : ^^^^^^^^^ + `---- + + x Ident { value: Atom('important' type=static), raw: Atom('important' type=static) } + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] + 11 | :unknown({foo: bar !important}) {} + : ^^^^^^^^^ + `---- + + x PseudoClassSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] + 11 | :unknown({foo: bar !important}) {} + : ^ + `---- + + x RBrace + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] + 11 | :unknown({foo: bar !important}) {} + : ^ + `---- + + x SimpleBlock + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] + 11 | :unknown({foo: bar !important}) {} + : ^^ + `---- + + x LBrace + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:11:1] + 11 | :unknown({foo: bar !important}) {} + : ^ + `---- + + x Rule + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:12:1] + 12 | :unknown("string") {} + : ^^^^^^^^^^^^^^^^^^^^^ + `---- + + x QualifiedRule + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:12:1] + 12 | :unknown("string") {} + : ^^^^^^^^^^^^^^^^^^^^^ + `---- + + x SelectorList + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:12:1] + 12 | :unknown("string") {} + : ^^^^^^^^^^^^^^^^^^ + `---- + + x ComplexSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:12:1] + 12 | :unknown("string") {} + : ^^^^^^^^^^^^^^^^^^ + `---- + + x CompoundSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:12:1] + 12 | :unknown("string") {} + : ^^^^^^^^^^^^^^^^^^ + `---- + + x SubclassSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:12:1] + 12 | :unknown("string") {} + : ^^^^^^^^^^^^^^^^^^ + `---- + + x PseudoClassSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:12:1] + 12 | :unknown("string") {} + : ^^^^^^^^^^^^^^^^^^ + `---- + + x Ident + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:12:1] + 12 | :unknown("string") {} + : ^^^^^^^ + `---- + + x PseudoClassSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:12:1] + 12 | :unknown("string") {} + : ^^^^^^^^ + `---- + + x String { value: Atom('string' type=static), raw: Atom('"string"' type=dynamic) } + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:12:1] + 12 | :unknown("string") {} + : ^^^^^^^^ + `---- + + x SimpleBlock + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:12:1] + 12 | :unknown("string") {} + : ^^ + `---- + + x LBrace + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:12:1] + 12 | :unknown("string") {} + : ^ + `---- + + x Rule + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] + 13 | :unknown("string", foo) {} + : ^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x QualifiedRule + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] + 13 | :unknown("string", foo) {} + : ^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x SelectorList + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] + 13 | :unknown("string", foo) {} + : ^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x ComplexSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] + 13 | :unknown("string", foo) {} + : ^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x CompoundSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] + 13 | :unknown("string", foo) {} + : ^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x SubclassSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] + 13 | :unknown("string", foo) {} + : ^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x PseudoClassSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] + 13 | :unknown("string", foo) {} + : ^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x Ident + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] + 13 | :unknown("string", foo) {} + : ^^^^^^^ + `---- + + x PseudoClassSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] + 13 | :unknown("string", foo) {} + : ^^^^^^^^ + `---- + + x String { value: Atom('string' type=static), raw: Atom('"string"' type=dynamic) } + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] + 13 | :unknown("string", foo) {} + : ^^^^^^^^ + `---- + + x PseudoClassSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] + 13 | :unknown("string", foo) {} + : ^ + `---- + + x Comma + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] + 13 | :unknown("string", foo) {} + : ^ + `---- + + x PseudoClassSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] + 13 | :unknown("string", foo) {} + : ^ + `---- + + x WhiteSpace { value: Atom(' ' type=inline) } + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] + 13 | :unknown("string", foo) {} + : ^ + `---- + + x PseudoClassSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] + 13 | :unknown("string", foo) {} + : ^^^ + `---- + + x Ident { value: Atom('foo' type=inline), raw: Atom('foo' type=inline) } + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] + 13 | :unknown("string", foo) {} + : ^^^ + `---- + + x SimpleBlock + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] + 13 | :unknown("string", foo) {} + : ^^ + `---- + + x LBrace + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:13:1] + 13 | :unknown("string", foo) {} + : ^ + `---- + + x Rule + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:14:1] + 14 | :unknown('string') {} + : ^^^^^^^^^^^^^^^^^^^^^ + `---- + + x QualifiedRule + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:14:1] + 14 | :unknown('string') {} + : ^^^^^^^^^^^^^^^^^^^^^ + `---- + + x SelectorList + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:14:1] + 14 | :unknown('string') {} + : ^^^^^^^^^^^^^^^^^^ + `---- + + x ComplexSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:14:1] + 14 | :unknown('string') {} + : ^^^^^^^^^^^^^^^^^^ + `---- + + x CompoundSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:14:1] + 14 | :unknown('string') {} + : ^^^^^^^^^^^^^^^^^^ + `---- + + x SubclassSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:14:1] + 14 | :unknown('string') {} + : ^^^^^^^^^^^^^^^^^^ + `---- + + x PseudoClassSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:14:1] + 14 | :unknown('string') {} + : ^^^^^^^^^^^^^^^^^^ + `---- + + x Ident + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:14:1] + 14 | :unknown('string') {} + : ^^^^^^^ + `---- + + x PseudoClassSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:14:1] + 14 | :unknown('string') {} + : ^^^^^^^^ + `---- + + x String { value: Atom('string' type=static), raw: Atom(''string'' type=dynamic) } + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:14:1] + 14 | :unknown('string') {} + : ^^^^^^^^ + `---- + + x SimpleBlock + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:14:1] + 14 | :unknown('string') {} + : ^^ + `---- + + x LBrace + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:14:1] + 14 | :unknown('string') {} + : ^ + `---- + + x Rule + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:15:1] + 15 | :unknown(url(foo.png)) {} + : ^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x QualifiedRule + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:15:1] + 15 | :unknown(url(foo.png)) {} + : ^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x SelectorList + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:15:1] + 15 | :unknown(url(foo.png)) {} + : ^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x ComplexSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:15:1] + 15 | :unknown(url(foo.png)) {} + : ^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x CompoundSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:15:1] + 15 | :unknown(url(foo.png)) {} + : ^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x SubclassSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:15:1] + 15 | :unknown(url(foo.png)) {} + : ^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x PseudoClassSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:15:1] + 15 | :unknown(url(foo.png)) {} + : ^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x Ident + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:15:1] + 15 | :unknown(url(foo.png)) {} + : ^^^^^^^ + `---- + + x PseudoClassSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:15:1] + 15 | :unknown(url(foo.png)) {} + : ^^^^^^^^^^^^ + `---- + + x Url { name: Atom('url' type=static), raw_name: Atom('url' type=static), before: Atom('' type=static), after: Atom('' type=static), value: Atom('foo.png' type=inline), raw_value: Atom('foo.png' + | type=inline) } + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:15:1] + 15 | :unknown(url(foo.png)) {} + : ^^^^^^^^^^^^ + `---- + + x SimpleBlock + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:15:1] + 15 | :unknown(url(foo.png)) {} + : ^^ + `---- + + x LBrace + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:15:1] + 15 | :unknown(url(foo.png)) {} + : ^ + `---- + + x Rule + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:16:1] + 16 | :unknown({!}) {} + : ^^^^^^^^^^^^^^^^ + `---- + + x QualifiedRule + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:16:1] + 16 | :unknown({!}) {} + : ^^^^^^^^^^^^^^^^ + `---- + + x SelectorList + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:16:1] + 16 | :unknown({!}) {} + : ^^^^^^^^^^^^^ + `---- + + x ComplexSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:16:1] + 16 | :unknown({!}) {} + : ^^^^^^^^^^^^^ + `---- + + x CompoundSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:16:1] + 16 | :unknown({!}) {} + : ^^^^^^^^^^^^^ + `---- + + x SubclassSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:16:1] + 16 | :unknown({!}) {} + : ^^^^^^^^^^^^^ + `---- + + x PseudoClassSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:16:1] + 16 | :unknown({!}) {} + : ^^^^^^^^^^^^^ + `---- + + x Ident + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:16:1] + 16 | :unknown({!}) {} + : ^^^^^^^ + `---- + + x PseudoClassSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:16:1] + 16 | :unknown({!}) {} + : ^ + `---- + + x LBrace + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:16:1] + 16 | :unknown({!}) {} + : ^ + `---- + + x PseudoClassSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:16:1] + 16 | :unknown({!}) {} + : ^ + `---- + + x Delim { value: '!' } + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:16:1] + 16 | :unknown({!}) {} + : ^ + `---- + + x PseudoClassSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:16:1] + 16 | :unknown({!}) {} + : ^ + `---- + + x RBrace + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:16:1] + 16 | :unknown({!}) {} + : ^ + `---- + + x SimpleBlock + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:16:1] + 16 | :unknown({!}) {} + : ^^ + `---- + + x LBrace + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:16:1] + 16 | :unknown({!}) {} + : ^ + `---- + + x Rule + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:17:1] + 17 | :unknown(!) {} + : ^^^^^^^^^^^^^^ + `---- + + x QualifiedRule + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:17:1] + 17 | :unknown(!) {} + : ^^^^^^^^^^^^^^ + `---- + + x SelectorList + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:17:1] + 17 | :unknown(!) {} + : ^^^^^^^^^^^ + `---- + + x ComplexSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:17:1] + 17 | :unknown(!) {} + : ^^^^^^^^^^^ + `---- + + x CompoundSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:17:1] + 17 | :unknown(!) {} + : ^^^^^^^^^^^ + `---- + + x SubclassSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:17:1] + 17 | :unknown(!) {} + : ^^^^^^^^^^^ + `---- + + x PseudoClassSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:17:1] + 17 | :unknown(!) {} + : ^^^^^^^^^^^ + `---- + + x Ident + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:17:1] + 17 | :unknown(!) {} + : ^^^^^^^ + `---- + + x PseudoClassSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:17:1] + 17 | :unknown(!) {} + : ^ + `---- + + x Delim { value: '!' } + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:17:1] + 17 | :unknown(!) {} + : ^ + `---- + + x SimpleBlock + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:17:1] + 17 | :unknown(!) {} + : ^^ + `---- + + x LBrace + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:17:1] + 17 | :unknown(!) {} + : ^ + `---- + + x Rule + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:18:1] + 18 | :unknown({;}) {} + : ^^^^^^^^^^^^^^^^ + `---- + + x QualifiedRule + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:18:1] + 18 | :unknown({;}) {} + : ^^^^^^^^^^^^^^^^ + `---- + + x SelectorList + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:18:1] + 18 | :unknown({;}) {} + : ^^^^^^^^^^^^^ + `---- + + x ComplexSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:18:1] + 18 | :unknown({;}) {} + : ^^^^^^^^^^^^^ + `---- + + x CompoundSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:18:1] + 18 | :unknown({;}) {} + : ^^^^^^^^^^^^^ + `---- + + x SubclassSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:18:1] + 18 | :unknown({;}) {} + : ^^^^^^^^^^^^^ + `---- + + x PseudoClassSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:18:1] + 18 | :unknown({;}) {} + : ^^^^^^^^^^^^^ + `---- + + x Ident + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:18:1] + 18 | :unknown({;}) {} + : ^^^^^^^ + `---- + + x PseudoClassSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:18:1] + 18 | :unknown({;}) {} + : ^ + `---- + + x LBrace + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:18:1] + 18 | :unknown({;}) {} + : ^ + `---- + + x PseudoClassSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:18:1] + 18 | :unknown({;}) {} + : ^ + `---- + + x Semi + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:18:1] + 18 | :unknown({;}) {} + : ^ + `---- + + x PseudoClassSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:18:1] + 18 | :unknown({;}) {} + : ^ + `---- + + x RBrace + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:18:1] + 18 | :unknown({;}) {} + : ^ + `---- + + x SimpleBlock + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:18:1] + 18 | :unknown({;}) {} + : ^^ + `---- + + x LBrace + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:18:1] + 18 | :unknown({;}) {} + : ^ + `---- + + x Rule + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:19:1] + 19 | :unknown(;) {} + : ^^^^^^^^^^^^^^ + `---- + + x QualifiedRule + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:19:1] + 19 | :unknown(;) {} + : ^^^^^^^^^^^^^^ + `---- + + x SelectorList + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:19:1] + 19 | :unknown(;) {} + : ^^^^^^^^^^^ + `---- + + x ComplexSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:19:1] + 19 | :unknown(;) {} + : ^^^^^^^^^^^ + `---- + + x CompoundSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:19:1] + 19 | :unknown(;) {} + : ^^^^^^^^^^^ + `---- + + x SubclassSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:19:1] + 19 | :unknown(;) {} + : ^^^^^^^^^^^ + `---- + + x PseudoClassSelector + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:19:1] + 19 | :unknown(;) {} + : ^^^^^^^^^^^ + `---- + + x Ident + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:19:1] + 19 | :unknown(;) {} + : ^^^^^^^ + `---- + + x PseudoClassSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:19:1] + 19 | :unknown(;) {} + : ^ + `---- + + x Semi + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:19:1] + 19 | :unknown(;) {} + : ^ + `---- + + x SimpleBlock + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:19:1] + 19 | :unknown(;) {} + : ^^ + `---- + + x LBrace + ,-[$DIR/tests/fixture/selector/pseudo-class/unknown/input.css:19:1] + 19 | :unknown(;) {} + : ^ + `---- diff --git a/crates/swc_css_parser/tests/fixture/selector/pseudo-element/unknown/span.rust-debug b/crates/swc_css_parser/tests/fixture/selector/pseudo-element/unknown/span.rust-debug index 88a4c7346487..02cf0d9e119e 100644 --- a/crates/swc_css_parser/tests/fixture/selector/pseudo-element/unknown/span.rust-debug +++ b/crates/swc_css_parser/tests/fixture/selector/pseudo-element/unknown/span.rust-debug @@ -10,7 +10,16 @@ 7 | | ::unknown((foo bar)) {} 8 | | ::unknown(((foo bar))) {} 9 | | ::unknown({foo: bar}) {} - 10 | `-> ::unknown({{foo: bar}}) {} + 10 | | ::unknown({{foo: bar}}) {} + 11 | | ::unknown({foo: bar !important}) {} + 12 | | ::unknown("string") {} + 13 | | ::unknown("string", foo) {} + 14 | | ::unknown('string') {} + 15 | | ::unknown(url(foo.png)) {} + 16 | | ::unknown({!}) {} + 17 | | ::unknown(!) {} + 18 | | ::unknown({;}) {} + 19 | `-> ::unknown(;) {} `---- x Rule @@ -772,49 +781,43 @@ x Rule ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} - : ^^^^^^^^^^^^^^^^^^^^ + : ^^^^^^^^^^^^^^^^^^^^^^^^ `---- x QualifiedRule ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} - : ^^^^^^^^^^^^^^^^^^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] - 9 | ::unknown({foo: bar}) {} - : ^ + : ^^^^^^^^^^^^^^^^^^^^^^^^ `---- - x Colon + x SelectorList ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} - : ^ + : ^^^^^^^^^^^^^^^^^^^^^ `---- - x ComponentValue + x ComplexSelector ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} - : ^ + : ^^^^^^^^^^^^^^^^^^^^^ `---- - x Colon + x CompoundSelector ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} - : ^ + : ^^^^^^^^^^^^^^^^^^^^^ `---- - x ComponentValue + x SubclassSelector ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} - : ^^^^^^^^ + : ^^^^^^^^^^^^^^^^^^^^^ `---- - x Function + x PseudoElementSelector ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} - : ^^^^^^^^ + : ^^^^^^^^^^^^^^^^^^^^^ `---- x Ident @@ -823,10 +826,10 @@ : ^^^^^^^ `---- - x SimpleBlock + x PseudoElementSelectorChildren ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} - : ^^^^^^^^^^ + : ^ `---- x LBrace @@ -835,82 +838,64 @@ : ^ `---- - x ComponentValue - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] - 9 | ::unknown({foo: bar}) {} - : ^^^^^^^^ - `---- - - x StyleBlock - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] - 9 | ::unknown({foo: bar}) {} - : ^^^^^^^^ - `---- - - x Declaration - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] - 9 | ::unknown({foo: bar}) {} - : ^^^^^^^^ - `---- - - x DeclarationName + x PseudoElementSelectorChildren ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} : ^^^ `---- - x Ident + x Ident { value: Atom('foo' type=inline), raw: Atom('foo' type=inline) } ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} : ^^^ `---- - x ComponentValue + x PseudoElementSelectorChildren ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} - : ^^^ + : ^ `---- - x Ident + x Colon ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} - : ^^^ + : ^ `---- - x Rule + x PseudoElementSelectorChildren ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} - : ^^^^ + : ^ `---- - x QualifiedRule + x WhiteSpace { value: Atom(' ' type=inline) } ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} - : ^^^^ + : ^ `---- - x ComponentValue + x PseudoElementSelectorChildren ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} - : ^ + : ^^^ `---- - x RParen + x Ident { value: Atom('bar' type=inline), raw: Atom('bar' type=inline) } ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} - : ^ + : ^^^ `---- - x ComponentValue + x PseudoElementSelectorChildren ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} - : ^ + : ^ `---- - x WhiteSpace { value: Atom(' ' type=inline) } + x RBrace ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:9:1] 9 | ::unknown({foo: bar}) {} - : ^ + : ^ `---- x SimpleBlock @@ -928,49 +913,43 @@ x Rule ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] 10 | ::unknown({{foo: bar}}) {} - : ^^^^^^^^^^^^^^^^^^^^^ + : ^^^^^^^^^^^^^^^^^^^^^^^^^^ `---- x QualifiedRule ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] 10 | ::unknown({{foo: bar}}) {} - : ^^^^^^^^^^^^^^^^^^^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] - 10 | ::unknown({{foo: bar}}) {} - : ^ + : ^^^^^^^^^^^^^^^^^^^^^^^^^^ `---- - x Colon + x SelectorList ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] 10 | ::unknown({{foo: bar}}) {} - : ^ + : ^^^^^^^^^^^^^^^^^^^^^^^ `---- - x ComponentValue + x ComplexSelector ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] 10 | ::unknown({{foo: bar}}) {} - : ^ + : ^^^^^^^^^^^^^^^^^^^^^^^ `---- - x Colon + x CompoundSelector ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] 10 | ::unknown({{foo: bar}}) {} - : ^ + : ^^^^^^^^^^^^^^^^^^^^^^^ `---- - x ComponentValue + x SubclassSelector ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] 10 | ::unknown({{foo: bar}}) {} - : ^^^^^^^^ + : ^^^^^^^^^^^^^^^^^^^^^^^ `---- - x Function + x PseudoElementSelector ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] 10 | ::unknown({{foo: bar}}) {} - : ^^^^^^^^ + : ^^^^^^^^^^^^^^^^^^^^^^^ `---- x Ident @@ -979,10 +958,10 @@ : ^^^^^^^ `---- - x SimpleBlock + x PseudoElementSelectorChildren ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] 10 | ::unknown({{foo: bar}}) {} - : ^^^^^^^^^^^ + : ^ `---- x LBrace @@ -991,19 +970,7 @@ : ^ `---- - x ComponentValue - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] - 10 | ::unknown({{foo: bar}}) {} - : ^^^^^^^^^ - `---- - - x StyleBlock - ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] - 10 | ::unknown({{foo: bar}}) {} - : ^^^^^^^^^ - `---- - - x ComponentValue + x PseudoElementSelectorChildren ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] 10 | ::unknown({{foo: bar}}) {} : ^ @@ -1015,7 +982,7 @@ : ^ `---- - x ComponentValue + x PseudoElementSelectorChildren ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] 10 | ::unknown({{foo: bar}}) {} : ^^^ @@ -1027,7 +994,7 @@ : ^^^ `---- - x ComponentValue + x PseudoElementSelectorChildren ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] 10 | ::unknown({{foo: bar}}) {} : ^ @@ -1039,7 +1006,7 @@ : ^ `---- - x ComponentValue + x PseudoElementSelectorChildren ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] 10 | ::unknown({{foo: bar}}) {} : ^ @@ -1051,7 +1018,7 @@ : ^ `---- - x ComponentValue + x PseudoElementSelectorChildren ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] 10 | ::unknown({{foo: bar}}) {} : ^^^ @@ -1062,3 +1029,868 @@ 10 | ::unknown({{foo: bar}}) {} : ^^^ `---- + + x PseudoElementSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] + 10 | ::unknown({{foo: bar}}) {} + : ^ + `---- + + x RBrace + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] + 10 | ::unknown({{foo: bar}}) {} + : ^ + `---- + + x PseudoElementSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] + 10 | ::unknown({{foo: bar}}) {} + : ^ + `---- + + x RBrace + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] + 10 | ::unknown({{foo: bar}}) {} + : ^ + `---- + + x SimpleBlock + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] + 10 | ::unknown({{foo: bar}}) {} + : ^^ + `---- + + x LBrace + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:10:1] + 10 | ::unknown({{foo: bar}}) {} + : ^ + `---- + + x Rule + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] + 11 | ::unknown({foo: bar !important}) {} + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x QualifiedRule + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] + 11 | ::unknown({foo: bar !important}) {} + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x SelectorList + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] + 11 | ::unknown({foo: bar !important}) {} + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x ComplexSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] + 11 | ::unknown({foo: bar !important}) {} + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x CompoundSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] + 11 | ::unknown({foo: bar !important}) {} + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x SubclassSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] + 11 | ::unknown({foo: bar !important}) {} + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x PseudoElementSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] + 11 | ::unknown({foo: bar !important}) {} + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x Ident + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] + 11 | ::unknown({foo: bar !important}) {} + : ^^^^^^^ + `---- + + x PseudoElementSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] + 11 | ::unknown({foo: bar !important}) {} + : ^ + `---- + + x LBrace + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] + 11 | ::unknown({foo: bar !important}) {} + : ^ + `---- + + x PseudoElementSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] + 11 | ::unknown({foo: bar !important}) {} + : ^^^ + `---- + + x Ident { value: Atom('foo' type=inline), raw: Atom('foo' type=inline) } + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] + 11 | ::unknown({foo: bar !important}) {} + : ^^^ + `---- + + x PseudoElementSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] + 11 | ::unknown({foo: bar !important}) {} + : ^ + `---- + + x Colon + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] + 11 | ::unknown({foo: bar !important}) {} + : ^ + `---- + + x PseudoElementSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] + 11 | ::unknown({foo: bar !important}) {} + : ^ + `---- + + x WhiteSpace { value: Atom(' ' type=inline) } + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] + 11 | ::unknown({foo: bar !important}) {} + : ^ + `---- + + x PseudoElementSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] + 11 | ::unknown({foo: bar !important}) {} + : ^^^ + `---- + + x Ident { value: Atom('bar' type=inline), raw: Atom('bar' type=inline) } + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] + 11 | ::unknown({foo: bar !important}) {} + : ^^^ + `---- + + x PseudoElementSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] + 11 | ::unknown({foo: bar !important}) {} + : ^ + `---- + + x WhiteSpace { value: Atom(' ' type=inline) } + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] + 11 | ::unknown({foo: bar !important}) {} + : ^ + `---- + + x PseudoElementSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] + 11 | ::unknown({foo: bar !important}) {} + : ^ + `---- + + x Delim { value: '!' } + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] + 11 | ::unknown({foo: bar !important}) {} + : ^ + `---- + + x PseudoElementSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] + 11 | ::unknown({foo: bar !important}) {} + : ^^^^^^^^^ + `---- + + x Ident { value: Atom('important' type=static), raw: Atom('important' type=static) } + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] + 11 | ::unknown({foo: bar !important}) {} + : ^^^^^^^^^ + `---- + + x PseudoElementSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] + 11 | ::unknown({foo: bar !important}) {} + : ^ + `---- + + x RBrace + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] + 11 | ::unknown({foo: bar !important}) {} + : ^ + `---- + + x SimpleBlock + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] + 11 | ::unknown({foo: bar !important}) {} + : ^^ + `---- + + x LBrace + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:11:1] + 11 | ::unknown({foo: bar !important}) {} + : ^ + `---- + + x Rule + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:12:1] + 12 | ::unknown("string") {} + : ^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x QualifiedRule + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:12:1] + 12 | ::unknown("string") {} + : ^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x SelectorList + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:12:1] + 12 | ::unknown("string") {} + : ^^^^^^^^^^^^^^^^^^^ + `---- + + x ComplexSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:12:1] + 12 | ::unknown("string") {} + : ^^^^^^^^^^^^^^^^^^^ + `---- + + x CompoundSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:12:1] + 12 | ::unknown("string") {} + : ^^^^^^^^^^^^^^^^^^^ + `---- + + x SubclassSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:12:1] + 12 | ::unknown("string") {} + : ^^^^^^^^^^^^^^^^^^^ + `---- + + x PseudoElementSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:12:1] + 12 | ::unknown("string") {} + : ^^^^^^^^^^^^^^^^^^^ + `---- + + x Ident + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:12:1] + 12 | ::unknown("string") {} + : ^^^^^^^ + `---- + + x PseudoElementSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:12:1] + 12 | ::unknown("string") {} + : ^^^^^^^^ + `---- + + x String { value: Atom('string' type=static), raw: Atom('"string"' type=dynamic) } + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:12:1] + 12 | ::unknown("string") {} + : ^^^^^^^^ + `---- + + x SimpleBlock + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:12:1] + 12 | ::unknown("string") {} + : ^^ + `---- + + x LBrace + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:12:1] + 12 | ::unknown("string") {} + : ^ + `---- + + x Rule + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] + 13 | ::unknown("string", foo) {} + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x QualifiedRule + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] + 13 | ::unknown("string", foo) {} + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x SelectorList + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] + 13 | ::unknown("string", foo) {} + : ^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x ComplexSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] + 13 | ::unknown("string", foo) {} + : ^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x CompoundSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] + 13 | ::unknown("string", foo) {} + : ^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x SubclassSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] + 13 | ::unknown("string", foo) {} + : ^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x PseudoElementSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] + 13 | ::unknown("string", foo) {} + : ^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x Ident + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] + 13 | ::unknown("string", foo) {} + : ^^^^^^^ + `---- + + x PseudoElementSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] + 13 | ::unknown("string", foo) {} + : ^^^^^^^^ + `---- + + x String { value: Atom('string' type=static), raw: Atom('"string"' type=dynamic) } + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] + 13 | ::unknown("string", foo) {} + : ^^^^^^^^ + `---- + + x PseudoElementSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] + 13 | ::unknown("string", foo) {} + : ^ + `---- + + x Comma + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] + 13 | ::unknown("string", foo) {} + : ^ + `---- + + x PseudoElementSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] + 13 | ::unknown("string", foo) {} + : ^ + `---- + + x WhiteSpace { value: Atom(' ' type=inline) } + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] + 13 | ::unknown("string", foo) {} + : ^ + `---- + + x PseudoElementSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] + 13 | ::unknown("string", foo) {} + : ^^^ + `---- + + x Ident { value: Atom('foo' type=inline), raw: Atom('foo' type=inline) } + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] + 13 | ::unknown("string", foo) {} + : ^^^ + `---- + + x SimpleBlock + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] + 13 | ::unknown("string", foo) {} + : ^^ + `---- + + x LBrace + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:13:1] + 13 | ::unknown("string", foo) {} + : ^ + `---- + + x Rule + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:14:1] + 14 | ::unknown('string') {} + : ^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x QualifiedRule + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:14:1] + 14 | ::unknown('string') {} + : ^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x SelectorList + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:14:1] + 14 | ::unknown('string') {} + : ^^^^^^^^^^^^^^^^^^^ + `---- + + x ComplexSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:14:1] + 14 | ::unknown('string') {} + : ^^^^^^^^^^^^^^^^^^^ + `---- + + x CompoundSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:14:1] + 14 | ::unknown('string') {} + : ^^^^^^^^^^^^^^^^^^^ + `---- + + x SubclassSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:14:1] + 14 | ::unknown('string') {} + : ^^^^^^^^^^^^^^^^^^^ + `---- + + x PseudoElementSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:14:1] + 14 | ::unknown('string') {} + : ^^^^^^^^^^^^^^^^^^^ + `---- + + x Ident + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:14:1] + 14 | ::unknown('string') {} + : ^^^^^^^ + `---- + + x PseudoElementSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:14:1] + 14 | ::unknown('string') {} + : ^^^^^^^^ + `---- + + x String { value: Atom('string' type=static), raw: Atom(''string'' type=dynamic) } + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:14:1] + 14 | ::unknown('string') {} + : ^^^^^^^^ + `---- + + x SimpleBlock + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:14:1] + 14 | ::unknown('string') {} + : ^^ + `---- + + x LBrace + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:14:1] + 14 | ::unknown('string') {} + : ^ + `---- + + x Rule + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:15:1] + 15 | ::unknown(url(foo.png)) {} + : ^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x QualifiedRule + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:15:1] + 15 | ::unknown(url(foo.png)) {} + : ^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x SelectorList + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:15:1] + 15 | ::unknown(url(foo.png)) {} + : ^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x ComplexSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:15:1] + 15 | ::unknown(url(foo.png)) {} + : ^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x CompoundSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:15:1] + 15 | ::unknown(url(foo.png)) {} + : ^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x SubclassSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:15:1] + 15 | ::unknown(url(foo.png)) {} + : ^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x PseudoElementSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:15:1] + 15 | ::unknown(url(foo.png)) {} + : ^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x Ident + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:15:1] + 15 | ::unknown(url(foo.png)) {} + : ^^^^^^^ + `---- + + x PseudoElementSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:15:1] + 15 | ::unknown(url(foo.png)) {} + : ^^^^^^^^^^^^ + `---- + + x Url { name: Atom('url' type=static), raw_name: Atom('url' type=static), before: Atom('' type=static), after: Atom('' type=static), value: Atom('foo.png' type=inline), raw_value: Atom('foo.png' + | type=inline) } + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:15:1] + 15 | ::unknown(url(foo.png)) {} + : ^^^^^^^^^^^^ + `---- + + x SimpleBlock + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:15:1] + 15 | ::unknown(url(foo.png)) {} + : ^^ + `---- + + x LBrace + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:15:1] + 15 | ::unknown(url(foo.png)) {} + : ^ + `---- + + x Rule + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:16:1] + 16 | ::unknown({!}) {} + : ^^^^^^^^^^^^^^^^^ + `---- + + x QualifiedRule + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:16:1] + 16 | ::unknown({!}) {} + : ^^^^^^^^^^^^^^^^^ + `---- + + x SelectorList + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:16:1] + 16 | ::unknown({!}) {} + : ^^^^^^^^^^^^^^ + `---- + + x ComplexSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:16:1] + 16 | ::unknown({!}) {} + : ^^^^^^^^^^^^^^ + `---- + + x CompoundSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:16:1] + 16 | ::unknown({!}) {} + : ^^^^^^^^^^^^^^ + `---- + + x SubclassSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:16:1] + 16 | ::unknown({!}) {} + : ^^^^^^^^^^^^^^ + `---- + + x PseudoElementSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:16:1] + 16 | ::unknown({!}) {} + : ^^^^^^^^^^^^^^ + `---- + + x Ident + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:16:1] + 16 | ::unknown({!}) {} + : ^^^^^^^ + `---- + + x PseudoElementSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:16:1] + 16 | ::unknown({!}) {} + : ^ + `---- + + x LBrace + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:16:1] + 16 | ::unknown({!}) {} + : ^ + `---- + + x PseudoElementSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:16:1] + 16 | ::unknown({!}) {} + : ^ + `---- + + x Delim { value: '!' } + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:16:1] + 16 | ::unknown({!}) {} + : ^ + `---- + + x PseudoElementSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:16:1] + 16 | ::unknown({!}) {} + : ^ + `---- + + x RBrace + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:16:1] + 16 | ::unknown({!}) {} + : ^ + `---- + + x SimpleBlock + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:16:1] + 16 | ::unknown({!}) {} + : ^^ + `---- + + x LBrace + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:16:1] + 16 | ::unknown({!}) {} + : ^ + `---- + + x Rule + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:17:1] + 17 | ::unknown(!) {} + : ^^^^^^^^^^^^^^^ + `---- + + x QualifiedRule + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:17:1] + 17 | ::unknown(!) {} + : ^^^^^^^^^^^^^^^ + `---- + + x SelectorList + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:17:1] + 17 | ::unknown(!) {} + : ^^^^^^^^^^^^ + `---- + + x ComplexSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:17:1] + 17 | ::unknown(!) {} + : ^^^^^^^^^^^^ + `---- + + x CompoundSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:17:1] + 17 | ::unknown(!) {} + : ^^^^^^^^^^^^ + `---- + + x SubclassSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:17:1] + 17 | ::unknown(!) {} + : ^^^^^^^^^^^^ + `---- + + x PseudoElementSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:17:1] + 17 | ::unknown(!) {} + : ^^^^^^^^^^^^ + `---- + + x Ident + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:17:1] + 17 | ::unknown(!) {} + : ^^^^^^^ + `---- + + x PseudoElementSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:17:1] + 17 | ::unknown(!) {} + : ^ + `---- + + x Delim { value: '!' } + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:17:1] + 17 | ::unknown(!) {} + : ^ + `---- + + x SimpleBlock + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:17:1] + 17 | ::unknown(!) {} + : ^^ + `---- + + x LBrace + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:17:1] + 17 | ::unknown(!) {} + : ^ + `---- + + x Rule + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:18:1] + 18 | ::unknown({;}) {} + : ^^^^^^^^^^^^^^^^^ + `---- + + x QualifiedRule + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:18:1] + 18 | ::unknown({;}) {} + : ^^^^^^^^^^^^^^^^^ + `---- + + x SelectorList + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:18:1] + 18 | ::unknown({;}) {} + : ^^^^^^^^^^^^^^ + `---- + + x ComplexSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:18:1] + 18 | ::unknown({;}) {} + : ^^^^^^^^^^^^^^ + `---- + + x CompoundSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:18:1] + 18 | ::unknown({;}) {} + : ^^^^^^^^^^^^^^ + `---- + + x SubclassSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:18:1] + 18 | ::unknown({;}) {} + : ^^^^^^^^^^^^^^ + `---- + + x PseudoElementSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:18:1] + 18 | ::unknown({;}) {} + : ^^^^^^^^^^^^^^ + `---- + + x Ident + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:18:1] + 18 | ::unknown({;}) {} + : ^^^^^^^ + `---- + + x PseudoElementSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:18:1] + 18 | ::unknown({;}) {} + : ^ + `---- + + x LBrace + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:18:1] + 18 | ::unknown({;}) {} + : ^ + `---- + + x PseudoElementSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:18:1] + 18 | ::unknown({;}) {} + : ^ + `---- + + x Semi + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:18:1] + 18 | ::unknown({;}) {} + : ^ + `---- + + x PseudoElementSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:18:1] + 18 | ::unknown({;}) {} + : ^ + `---- + + x RBrace + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:18:1] + 18 | ::unknown({;}) {} + : ^ + `---- + + x SimpleBlock + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:18:1] + 18 | ::unknown({;}) {} + : ^^ + `---- + + x LBrace + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:18:1] + 18 | ::unknown({;}) {} + : ^ + `---- + + x Rule + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:19:1] + 19 | ::unknown(;) {} + : ^^^^^^^^^^^^^^^ + `---- + + x QualifiedRule + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:19:1] + 19 | ::unknown(;) {} + : ^^^^^^^^^^^^^^^ + `---- + + x SelectorList + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:19:1] + 19 | ::unknown(;) {} + : ^^^^^^^^^^^^ + `---- + + x ComplexSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:19:1] + 19 | ::unknown(;) {} + : ^^^^^^^^^^^^ + `---- + + x CompoundSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:19:1] + 19 | ::unknown(;) {} + : ^^^^^^^^^^^^ + `---- + + x SubclassSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:19:1] + 19 | ::unknown(;) {} + : ^^^^^^^^^^^^ + `---- + + x PseudoElementSelector + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:19:1] + 19 | ::unknown(;) {} + : ^^^^^^^^^^^^ + `---- + + x Ident + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:19:1] + 19 | ::unknown(;) {} + : ^^^^^^^ + `---- + + x PseudoElementSelectorChildren + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:19:1] + 19 | ::unknown(;) {} + : ^ + `---- + + x Semi + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:19:1] + 19 | ::unknown(;) {} + : ^ + `---- + + x SimpleBlock + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:19:1] + 19 | ::unknown(;) {} + : ^^ + `---- + + x LBrace + ,-[$DIR/tests/fixture/selector/pseudo-element/unknown/input.css:19:1] + 19 | ::unknown(;) {} + : ^ + `---- diff --git a/crates/swc_css_parser/tests/recovery/hacks/output.json b/crates/swc_css_parser/tests/recovery/hacks/output.json index 59be26ec494b..842a60deb4bc 100644 --- a/crates/swc_css_parser/tests/recovery/hacks/output.json +++ b/crates/swc_css_parser/tests/recovery/hacks/output.json @@ -8620,7 +8620,7 @@ "type": "ListOfComponentValues", "span": { "start": 2546, - "end": 2592, + "end": 2580, "ctxt": 0 }, "children": [ @@ -8780,68 +8780,6 @@ "value": "\n" } } - }, - { - "type": "PreservedToken", - "span": { - "start": 2580, - "end": 2581, - "ctxt": 0 - }, - "token": "RBrace" - }, - { - "type": "PreservedToken", - "span": { - "start": 2581, - "end": 2582, - "ctxt": 0 - }, - "token": { - "WhiteSpace": { - "value": "\n" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 2582, - "end": 2583, - "ctxt": 0 - }, - "token": { - "Delim": { - "value": "." - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 2583, - "end": 2591, - "ctxt": 0 - }, - "token": { - "Ident": { - "value": "selector", - "raw": "selector" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 2591, - "end": 2592, - "ctxt": 0 - }, - "token": { - "WhiteSpace": { - "value": " " - } - } } ] }, diff --git a/crates/swc_css_parser/tests/recovery/hacks/span.rust-debug b/crates/swc_css_parser/tests/recovery/hacks/span.rust-debug index 3855e58f3807..1f33274e7ea8 100644 --- a/crates/swc_css_parser/tests/recovery/hacks/span.rust-debug +++ b/crates/swc_css_parser/tests/recovery/hacks/span.rust-debug @@ -8595,69 +8595,6 @@ 114 | } `---- - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:114:1] - 114 | } - : ^ - `---- - - x RBrace - ,-[$DIR/tests/recovery/hacks/input.css:114:1] - 114 | } - : ^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:114:1] - 114 | } - : ^ - 115 | .selector { - `---- - - x WhiteSpace { value: Atom(' - | ' type=inline) } - ,-[$DIR/tests/recovery/hacks/input.css:114:1] - 114 | } - : ^ - 115 | .selector { - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:115:1] - 115 | .selector { - : ^ - `---- - - x Delim { value: '.' } - ,-[$DIR/tests/recovery/hacks/input.css:115:1] - 115 | .selector { - : ^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:115:1] - 115 | .selector { - : ^^^^^^^^ - `---- - - x Ident { value: Atom('selector' type=dynamic), raw: Atom('selector' type=dynamic) } - ,-[$DIR/tests/recovery/hacks/input.css:115:1] - 115 | .selector { - : ^^^^^^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:115:1] - 115 | .selector { - : ^ - `---- - - x WhiteSpace { value: Atom(' ' type=inline) } - ,-[$DIR/tests/recovery/hacks/input.css:115:1] - 115 | .selector { - : ^ - `---- - x SimpleBlock ,-[$DIR/tests/recovery/hacks/input.css:115:1] 115 | ,-> .selector { diff --git a/crates/swc_css_parser/tests/recovery/selector/attribute/unclosed/output.json b/crates/swc_css_parser/tests/recovery/selector/attribute/unclosed/output.json index cb7ba4cfc19d..6ca83c16d8a9 100644 --- a/crates/swc_css_parser/tests/recovery/selector/attribute/unclosed/output.json +++ b/crates/swc_css_parser/tests/recovery/selector/attribute/unclosed/output.json @@ -2,121 +2,95 @@ "type": "Stylesheet", "span": { "start": 1, - "end": 19, + "end": 17, "ctxt": 0 }, "rules": [ { - "type": "QualifiedRule", + "type": "ListOfComponentValues", "span": { "start": 1, - "end": 18, + "end": 17, "ctxt": 0 }, - "prelude": { - "type": "ListOfComponentValues", - "span": { - "start": 1, - "end": 14, - "ctxt": 0 + "children": [ + { + "type": "PreservedToken", + "span": { + "start": 1, + "end": 2, + "ctxt": 0 + }, + "token": { + "Delim": { + "value": "." + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 2, + "end": 7, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "class", + "raw": "class" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 7, + "end": 8, + "ctxt": 0 + }, + "token": "LBracket" }, - "children": [ - { - "type": "PreservedToken", - "span": { - "start": 1, - "end": 2, - "ctxt": 0 - }, - "token": { - "Delim": { - "value": "." - } + { + "type": "PreservedToken", + "span": { + "start": 8, + "end": 12, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "attr", + "raw": "attr" } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 12, + "end": 13, + "ctxt": 0 }, - { - "type": "PreservedToken", - "span": { - "start": 2, - "end": 7, - "ctxt": 0 - }, - "token": { - "Ident": { - "value": "class", - "raw": "class" - } + "token": { + "Delim": { + "value": "=" } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 13, + "end": 14, + "ctxt": 0 }, - { - "type": "SimpleBlock", - "span": { - "start": 7, - "end": 14, - "ctxt": 0 - }, - "name": { - "type": "PreservedToken", - "span": { - "start": 7, - "end": 8, - "ctxt": 0 - }, - "token": "LBracket" - }, - "value": [ - { - "type": "PreservedToken", - "span": { - "start": 8, - "end": 12, - "ctxt": 0 - }, - "token": { - "Ident": { - "value": "attr", - "raw": "attr" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 12, - "end": 13, - "ctxt": 0 - }, - "token": { - "Delim": { - "value": "=" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 13, - "end": 14, - "ctxt": 0 - }, - "token": { - "WhiteSpace": { - "value": " " - } - } - } - ] + "token": { + "WhiteSpace": { + "value": " " + } } - ] - }, - "block": { - "type": "SimpleBlock", - "span": { - "start": 14, - "end": 18, - "ctxt": 0 }, - "name": { + { "type": "PreservedToken", "span": { "start": 14, @@ -125,8 +99,20 @@ }, "token": "LBrace" }, - "value": [] - } + { + "type": "PreservedToken", + "span": { + "start": 15, + "end": 17, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": "\n\n" + } + } + } + ] } ] } diff --git a/crates/swc_css_parser/tests/recovery/selector/attribute/unclosed/output.swc-stderr b/crates/swc_css_parser/tests/recovery/selector/attribute/unclosed/output.swc-stderr index 990eb77927cb..30907168ff5e 100644 --- a/crates/swc_css_parser/tests/recovery/selector/attribute/unclosed/output.swc-stderr +++ b/crates/swc_css_parser/tests/recovery/selector/attribute/unclosed/output.swc-stderr @@ -1,6 +1,6 @@ x Unexpected end of file - ,-[$DIR/tests/recovery/selector/attribute/unclosed/input.css:1:1] - 1 | .class[attr= { - : ^ + ,-[$DIR/tests/recovery/selector/attribute/unclosed/input.css:3:3] + 3 | + : ^ `---- diff --git a/crates/swc_css_parser/tests/recovery/selector/attribute/unclosed/span.rust-debug b/crates/swc_css_parser/tests/recovery/selector/attribute/unclosed/span.rust-debug index 4282ed2532ed..c844961a521b 100644 --- a/crates/swc_css_parser/tests/recovery/selector/attribute/unclosed/span.rust-debug +++ b/crates/swc_css_parser/tests/recovery/selector/attribute/unclosed/span.rust-debug @@ -2,22 +2,15 @@ x Stylesheet ,-[$DIR/tests/recovery/selector/attribute/unclosed/input.css:1:1] 1 | ,-> .class[attr= { - 2 | | - 3 | `-> } + 2 | `-> + 3 | } `---- x Rule ,-[$DIR/tests/recovery/selector/attribute/unclosed/input.css:1:1] 1 | ,-> .class[attr= { - 2 | | - 3 | `-> } - `---- - - x QualifiedRule - ,-[$DIR/tests/recovery/selector/attribute/unclosed/input.css:1:1] - 1 | ,-> .class[attr= { - 2 | | - 3 | `-> } + 2 | `-> + 3 | } `---- x ComponentValue @@ -47,13 +40,7 @@ x ComponentValue ,-[$DIR/tests/recovery/selector/attribute/unclosed/input.css:1:1] 1 | .class[attr= { - : ^^^^^^^ - `---- - - x SimpleBlock - ,-[$DIR/tests/recovery/selector/attribute/unclosed/input.css:1:1] - 1 | .class[attr= { - : ^^^^^^^ + : ^ `---- x LBracket @@ -98,11 +85,10 @@ : ^ `---- - x SimpleBlock + x ComponentValue ,-[$DIR/tests/recovery/selector/attribute/unclosed/input.css:1:1] - 1 | ,-> .class[attr= { - 2 | | - 3 | `-> } + 1 | .class[attr= { + : ^ `---- x LBrace @@ -110,3 +96,19 @@ 1 | .class[attr= { : ^ `---- + + x ComponentValue + ,-[$DIR/tests/recovery/selector/attribute/unclosed/input.css:1:1] + 1 | ,-> .class[attr= { + 2 | `-> + 3 | } + `---- + + x WhiteSpace { value: Atom(' + | + | ' type=inline) } + ,-[$DIR/tests/recovery/selector/attribute/unclosed/input.css:1:1] + 1 | ,-> .class[attr= { + 2 | `-> + 3 | } + `---- diff --git a/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested-2/output.json b/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested-2/output.json index f6d72cccc2d3..ef6cf5a25d60 100644 --- a/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested-2/output.json +++ b/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested-2/output.json @@ -122,7 +122,7 @@ "type": "ListOfComponentValues", "span": { "start": 30, - "end": 69, + "end": 58, "ctxt": 0 }, "children": [ @@ -250,55 +250,6 @@ "value": "\n" } } - }, - { - "type": "PreservedToken", - "span": { - "start": 58, - "end": 59, - "ctxt": 0 - }, - "token": "RBrace" - }, - { - "type": "PreservedToken", - "span": { - "start": 59, - "end": 61, - "ctxt": 0 - }, - "token": { - "WhiteSpace": { - "value": "\n\n" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 61, - "end": 68, - "ctxt": 0 - }, - "token": { - "Ident": { - "value": "article", - "raw": "article" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 68, - "end": 69, - "ctxt": 0 - }, - "token": { - "WhiteSpace": { - "value": " " - } - } } ] }, diff --git a/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested-2/span.rust-debug b/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested-2/span.rust-debug index 3a586c1d5006..0e9472693f75 100644 --- a/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested-2/span.rust-debug +++ b/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested-2/span.rust-debug @@ -313,58 +313,6 @@ 5 | } `---- - x ComponentValue - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:5:1] - 5 | } - : ^ - `---- - - x RBrace - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:5:1] - 5 | } - : ^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:5:1] - 5 | ,-> } - 6 | `-> - 7 | article { - `---- - - x WhiteSpace { value: Atom(' - | - | ' type=inline) } - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:5:1] - 5 | ,-> } - 6 | `-> - 7 | article { - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:7:1] - 7 | article { - : ^^^^^^^ - `---- - - x Ident { value: Atom('article' type=static), raw: Atom('article' type=static) } - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:7:1] - 7 | article { - : ^^^^^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:7:1] - 7 | article { - : ^ - `---- - - x WhiteSpace { value: Atom(' ' type=inline) } - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:7:1] - 7 | article { - : ^ - `---- - x SimpleBlock ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:7:1] 7 | ,-> article { diff --git a/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested/output.json b/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested/output.json index 223e45efb12d..c90eb9f57b98 100644 --- a/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested/output.json +++ b/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested/output.json @@ -122,7 +122,7 @@ "type": "ListOfComponentValues", "span": { "start": 30, - "end": 70, + "end": 59, "ctxt": 0 }, "children": [ @@ -259,55 +259,6 @@ "value": "\n" } } - }, - { - "type": "PreservedToken", - "span": { - "start": 59, - "end": 60, - "ctxt": 0 - }, - "token": "RBrace" - }, - { - "type": "PreservedToken", - "span": { - "start": 60, - "end": 62, - "ctxt": 0 - }, - "token": { - "WhiteSpace": { - "value": "\n\n" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 62, - "end": 69, - "ctxt": 0 - }, - "token": { - "Ident": { - "value": "article", - "raw": "article" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 69, - "end": 70, - "ctxt": 0 - }, - "token": { - "WhiteSpace": { - "value": " " - } - } } ] }, diff --git a/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested/span.rust-debug b/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested/span.rust-debug index 901302b3ca1c..ed606db059c6 100644 --- a/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested/span.rust-debug +++ b/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested/span.rust-debug @@ -325,58 +325,6 @@ 5 | } `---- - x ComponentValue - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:5:1] - 5 | } - : ^ - `---- - - x RBrace - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:5:1] - 5 | } - : ^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:5:1] - 5 | ,-> } - 6 | `-> - 7 | article { - `---- - - x WhiteSpace { value: Atom(' - | - | ' type=inline) } - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:5:1] - 5 | ,-> } - 6 | `-> - 7 | article { - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:7:1] - 7 | article { - : ^^^^^^^ - `---- - - x Ident { value: Atom('article' type=static), raw: Atom('article' type=static) } - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:7:1] - 7 | article { - : ^^^^^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:7:1] - 7 | article { - : ^ - `---- - - x WhiteSpace { value: Atom(' ' type=inline) } - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:7:1] - 7 | article { - : ^ - `---- - x SimpleBlock ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:7:1] 7 | ,-> article { From 1499073a581c7a67329aae801a328ef6bea2f5aa Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Fri, 21 Oct 2022 21:22:15 +0300 Subject: [PATCH 06/19] fix: clippy --- crates/swc_css_parser/src/parser/input.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/swc_css_parser/src/parser/input.rs b/crates/swc_css_parser/src/parser/input.rs index 20353eff3f12..5862f178e27e 100644 --- a/crates/swc_css_parser/src/parser/input.rs +++ b/crates/swc_css_parser/src/parser/input.rs @@ -439,7 +439,7 @@ impl<'a> Iterator for ListOfComponentValuesInput<'a> { Token::Function { .. } | Token::LParen | Token::LBrace | Token::LBracket => { self.idx.push(0); } - token @ _ => { + token => { match token { Token::RBrace | Token::RBracket | Token::RParen => { self.idx.pop(); From ef35cbfe0c29e0f237d9b1a8d0dd2f6ef48bc410 Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Fri, 21 Oct 2022 21:28:12 +0300 Subject: [PATCH 07/19] fix: logic --- crates/swc_css_parser/src/parser/selectors/mod.rs | 4 ++-- crates/swc_css_parser/src/parser/util.rs | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/crates/swc_css_parser/src/parser/selectors/mod.rs b/crates/swc_css_parser/src/parser/selectors/mod.rs index a1421bcc5756..f2eefb6d1114 100644 --- a/crates/swc_css_parser/src/parser/selectors/mod.rs +++ b/crates/swc_css_parser/src/parser/selectors/mod.rs @@ -957,6 +957,8 @@ where } "nth-child" | "nth-last-child" | "nth-of-type" | "nth-last-of-type" | "nth-col" | "nth-last-col" => { + self.input.skip_ws(); + let an_plus_b = self.parse()?; children.push(PseudoClassSelectorChildren::AnPlusB(an_plus_b)); @@ -1168,8 +1170,6 @@ where I: ParserInput, { fn parse(&mut self) -> PResult { - self.input.skip_ws(); - let span = self.input.cur_span(); match cur!(self) { diff --git a/crates/swc_css_parser/src/parser/util.rs b/crates/swc_css_parser/src/parser/util.rs index 4c3632e40b89..2c3b290916f5 100644 --- a/crates/swc_css_parser/src/parser/util.rs +++ b/crates/swc_css_parser/src/parser/util.rs @@ -40,8 +40,11 @@ where { let lexer = ListOfComponentValuesInput::new(list_of_component_values); let mut parser = Parser::new(lexer, self.config); + let res = parser.parse(); - parser.parse() + self.errors.extend(parser.take_errors()); + + res } pub(super) fn legacy_nested_selector_list_to_modern_selector_list( From 8482d44dfde4dd1153a3c98de60e54b5cf771833 Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Fri, 21 Oct 2022 21:47:58 +0300 Subject: [PATCH 08/19] test: fix invalid syntax --- .../tests/fixture/compress-at-rule/layer/input.css | 8 ++++++-- .../tests/fixture/compress-at-rule/layer/output.min.css | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/crates/swc_css_minifier/tests/fixture/compress-at-rule/layer/input.css b/crates/swc_css_minifier/tests/fixture/compress-at-rule/layer/input.css index a36428125cdd..a9d811809641 100644 --- a/crates/swc_css_minifier/tests/fixture/compress-at-rule/layer/input.css +++ b/crates/swc_css_minifier/tests/fixture/compress-at-rule/layer/input.css @@ -31,10 +31,14 @@ @layer { @layer foo { - color: red; + .class { + color: red; + } } @layer foo { - color: red; + .class { + color: red; + } } } diff --git a/crates/swc_css_minifier/tests/fixture/compress-at-rule/layer/output.min.css b/crates/swc_css_minifier/tests/fixture/compress-at-rule/layer/output.min.css index 1f8cdc674dc5..560e88df4597 100644 --- a/crates/swc_css_minifier/tests/fixture/compress-at-rule/layer/output.min.css +++ b/crates/swc_css_minifier/tests/fixture/compress-at-rule/layer/output.min.css @@ -1 +1 @@ -@layer default,theme,components;@layer foo.bar;@layer foo.bar,baz;@layer a{@layer b{div{color:yellow;margin:0}}}@layer framework{@layer base{p{margin-block:.75em}}@layer theme{p{color:#222}}}@layer framework.theme{blockquote{color:rebeccapurple}}@layer{@layer foo{color: red;color: red;color: red;color: red;}}@layer framework{h1,h2{color:maroon;background:white}@media(prefers-color-scheme:dark){h1,h2{color:red;background:black}}}@layer foo{.foo{color:red;background:#fff}.baz{color:#fff}} +@layer default,theme,components;@layer foo.bar;@layer foo.bar,baz;@layer a{@layer b{div{color:yellow;margin:0}}}@layer framework{@layer base{p{margin-block:.75em}}@layer theme{p{color:#222}}}@layer framework.theme{blockquote{color:rebeccapurple}}@layer{@layer foo{.class{color:red}color: red; {@layer foo{color: red; {h1, h2 { color: maroon;background:white}@media(prefers-color-scheme:dark){h1,h2{color:red;background:black}}.foo{color:red;background:#fff}.baz{color:#fff}}}}} From 63799d56434154d7b58831dc4d5cf6d2bf19d3c7 Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Fri, 21 Oct 2022 23:57:52 +0300 Subject: [PATCH 09/19] test: fix invalid syntax --- crates/swc_css_parser/src/parser/input.rs | 5 +- .../swc_css_parser/src/parser/syntax/mod.rs | 63 +- crates/swc_css_parser/src/parser/util.rs | 15 +- .../src/parser/values_and_units/mod.rs | 4 + .../fixture/at-rule/container/output.json | 16 +- .../fixture/at-rule/container/span.rust-debug | 16 +- .../fixture/value/custom-property/output.json | 4 +- .../value/custom-property/span.rust-debug | 21 +- .../recovery/function/unclosed-2/output.json | 17 +- .../function/unclosed-2/span.rust-debug | 13 - .../recovery/function/unclosed/output.json | 17 +- .../function/unclosed/span.rust-debug | 13 - .../tests/recovery/hacks/output.json | 681 ++++++----------- .../tests/recovery/hacks/output.swc-stderr | 24 +- .../tests/recovery/hacks/span.rust-debug | 532 ++++---------- .../unclosed-in-function/output.json | 24 +- .../unclosed-in-function/output.swc-stderr | 2 +- .../unclosed-in-function/span.rust-debug | 27 +- .../basic/output.swc-stderr | 4 +- .../invalid-nested-2/output.json | 684 ++++++++--------- .../invalid-nested-2/output.swc-stderr | 14 +- .../invalid-nested-2/span.rust-debug | 255 +++---- .../invalid-nested/output.json | 691 +++++++++--------- .../invalid-nested/output.swc-stderr | 14 +- .../invalid-nested/span.rust-debug | 267 +++---- .../recovery/value/url/basic/output.json | 356 --------- .../value/url/basic/output.swc-stderr | 12 - .../recovery/value/url/basic/span.rust-debug | 426 ----------- 28 files changed, 1394 insertions(+), 2823 deletions(-) diff --git a/crates/swc_css_parser/src/parser/input.rs b/crates/swc_css_parser/src/parser/input.rs index 5862f178e27e..3391f5aa9aa4 100644 --- a/crates/swc_css_parser/src/parser/input.rs +++ b/crates/swc_css_parser/src/parser/input.rs @@ -303,7 +303,10 @@ impl<'a> ListOfComponentValuesInput<'a> { ), token: Token::Function { value: function.name.value.clone(), - raw: function.name.value.clone(), + raw: match &function.name.raw { + Some(raw) => raw.clone(), + _ => function.name.value.clone(), + }, }, }); } diff --git a/crates/swc_css_parser/src/parser/syntax/mod.rs b/crates/swc_css_parser/src/parser/syntax/mod.rs index c7a2b739f849..1e957aa54411 100644 --- a/crates/swc_css_parser/src/parser/syntax/mod.rs +++ b/crates/swc_css_parser/src/parser/syntax/mod.rs @@ -1,4 +1,4 @@ -use swc_common::{Span, Spanned, SyntaxContext, DUMMY_SP}; +use swc_common::Span; use swc_css_ast::*; use super::{input::ParserInput, PResult, Parser}; @@ -122,18 +122,9 @@ where { fn parse(&mut self) -> PResult { let create_prelude = |p: &mut Parser, - mut list_of_component_values: ListOfComponentValues| + list: Vec| -> PResult { - let span = match ( - list_of_component_values.children.first(), - list_of_component_values.children.last(), - ) { - (Some(first), Some(last)) => { - Span::new(first.span_lo(), last.span_hi(), SyntaxContext::empty()) - } - _ => DUMMY_SP, - }; - list_of_component_values.span = span; + let list_of_component_values = p.create_locv(list); match p.parse_according_to_grammar::(&list_of_component_values) { Ok(selector_list) => { @@ -180,10 +171,7 @@ where let span = self.input.cur_span(); // Create a new qualified rule with its prelude initially set to an empty list, // and its value initially set to nothing. - let mut list_of_component_values = ListOfComponentValues { - span: Default::default(), - children: vec![], - }; + let mut prelude = vec![]; // Repeatedly consume the next input token: loop { @@ -200,28 +188,38 @@ where // Consume a simple block and assign it to the qualified rule’s block. Return the // qualified rule. tok!("{") => { - let ctx = Ctx { - block_contents_grammar: BlockContentsGrammar::StyleBlock, - ..self.ctx - }; - let block = self.with_ctx(ctx).parse_as::()?; + let mut block = self + .with_ctx(Ctx { + block_contents_grammar: BlockContentsGrammar::NoGrammar, + ..self.ctx + }) + .parse_as::()?; + + block.value = self + .parse_according_to_grammar::>( + &self.create_locv(block.value), + )? + .into_iter() + .map(ComponentValue::StyleBlock) + .collect(); return Ok(QualifiedRule { span: span!(self, span.lo), - prelude: create_prelude(self, list_of_component_values)?, + prelude: create_prelude(self, prelude)?, block, }); } // Reconsume the current input token. Consume a component value. Append the returned // value to the qualified rule’s prelude. _ => { - let ctx = Ctx { - block_contents_grammar: BlockContentsGrammar::NoGrammar, - ..self.ctx - }; - let component_value = self.with_ctx(ctx).parse_as::()?; + let component_value = self + .with_ctx(Ctx { + block_contents_grammar: BlockContentsGrammar::NoGrammar, + ..self.ctx + }) + .parse_as::()?; - list_of_component_values.children.push(component_value); + prelude.push(component_value); } } } @@ -260,7 +258,14 @@ where // Reconsume the current input token. Consume an at-rule, and append the result to // rules. tok!("@") => { - rules.push(StyleBlock::AtRule(self.parse()?)); + let ctx = Ctx { + block_contents_grammar: BlockContentsGrammar::StyleBlock, + ..self.ctx + }; + + rules.push(StyleBlock::AtRule(Box::new( + self.with_ctx(ctx).parse_as::()?, + ))); } // // Initialize a temporary list initially filled with the current input token. As diff --git a/crates/swc_css_parser/src/parser/util.rs b/crates/swc_css_parser/src/parser/util.rs index 2c3b290916f5..64964bf9e9dc 100644 --- a/crates/swc_css_parser/src/parser/util.rs +++ b/crates/swc_css_parser/src/parser/util.rs @@ -1,6 +1,6 @@ use std::ops::{Deref, DerefMut}; -use swc_common::DUMMY_SP; +use swc_common::{Span, Spanned, SyntaxContext, DUMMY_SP}; use swc_css_ast::*; use super::{input::ParserInput, Ctx, PResult, Parse, Parser}; @@ -31,7 +31,18 @@ where self.parse() } - pub fn parse_according_to_grammar<'a, T>( + pub(super) fn create_locv(&self, children: Vec) -> ListOfComponentValues { + let span = match (children.first(), children.last()) { + (Some(first), Some(last)) => { + Span::new(first.span_lo(), last.span_hi(), SyntaxContext::empty()) + } + _ => DUMMY_SP, + }; + + ListOfComponentValues { span, children } + } + + pub(super) fn parse_according_to_grammar<'a, T>( &mut self, list_of_component_values: &'a ListOfComponentValues, ) -> PResult diff --git a/crates/swc_css_parser/src/parser/values_and_units/mod.rs b/crates/swc_css_parser/src/parser/values_and_units/mod.rs index 2c9dad53613f..16c8e46b4d20 100644 --- a/crates/swc_css_parser/src/parser/values_and_units/mod.rs +++ b/crates/swc_css_parser/src/parser/values_and_units/mod.rs @@ -19,6 +19,10 @@ where // The production matches any sequence of one or more // tokens, so long as the sequence does not contain ... loop { + if is!(self, EOF) { + break; + } + match cur!(self) { // ... , , tok!("bad-string") | tok!("bad-url") => { diff --git a/crates/swc_css_parser/tests/fixture/at-rule/container/output.json b/crates/swc_css_parser/tests/fixture/at-rule/container/output.json index 7f318eef3ee2..be33499b5a91 100644 --- a/crates/swc_css_parser/tests/fixture/at-rule/container/output.json +++ b/crates/swc_css_parser/tests/fixture/at-rule/container/output.json @@ -2560,7 +2560,7 @@ }, "expressions": [ { - "type": "Length", + "type": "UnknownDimension", "span": { "start": 973, "end": 977, @@ -2883,7 +2883,7 @@ }, "expressions": [ { - "type": "Length", + "type": "UnknownDimension", "span": { "start": 1052, "end": 1056, @@ -3206,7 +3206,7 @@ }, "expressions": [ { - "type": "Length", + "type": "UnknownDimension", "span": { "start": 1131, "end": 1135, @@ -3529,7 +3529,7 @@ }, "expressions": [ { - "type": "Length", + "type": "UnknownDimension", "span": { "start": 1210, "end": 1214, @@ -3852,7 +3852,7 @@ }, "expressions": [ { - "type": "Length", + "type": "UnknownDimension", "span": { "start": 1289, "end": 1295, @@ -4175,7 +4175,7 @@ }, "expressions": [ { - "type": "Length", + "type": "UnknownDimension", "span": { "start": 1370, "end": 1376, @@ -4637,7 +4637,7 @@ }, "expressions": [ { - "type": "Length", + "type": "UnknownDimension", "span": { "start": 1505, "end": 1511, @@ -7109,7 +7109,7 @@ }, "expressions": [ { - "type": "Length", + "type": "UnknownDimension", "span": { "start": 2459, "end": 2463, diff --git a/crates/swc_css_parser/tests/fixture/at-rule/container/span.rust-debug b/crates/swc_css_parser/tests/fixture/at-rule/container/span.rust-debug index 4008c0290790..36c3e3e75dec 100644 --- a/crates/swc_css_parser/tests/fixture/at-rule/container/span.rust-debug +++ b/crates/swc_css_parser/tests/fixture/at-rule/container/span.rust-debug @@ -2487,7 +2487,7 @@ : ^^^^ `---- - x Length + x UnknownDimension ,-[$DIR/tests/fixture/at-rule/container/input.css:51:5] 51 | h2 { font-size: calc(1.2em + 1cqw); } : ^^^^ @@ -2796,7 +2796,7 @@ : ^^^^ `---- - x Length + x UnknownDimension ,-[$DIR/tests/fixture/at-rule/container/input.css:55:5] 55 | h2 { font-size: calc(1.2em + 1cqh); } : ^^^^ @@ -3105,7 +3105,7 @@ : ^^^^ `---- - x Length + x UnknownDimension ,-[$DIR/tests/fixture/at-rule/container/input.css:59:5] 59 | h2 { font-size: calc(1.2em + 1cqi); } : ^^^^ @@ -3414,7 +3414,7 @@ : ^^^^ `---- - x Length + x UnknownDimension ,-[$DIR/tests/fixture/at-rule/container/input.css:63:5] 63 | h2 { font-size: calc(1.2em + 1cqb); } : ^^^^ @@ -3723,7 +3723,7 @@ : ^^^^^^ `---- - x Length + x UnknownDimension ,-[$DIR/tests/fixture/at-rule/container/input.css:67:5] 67 | h2 { font-size: calc(1.2em + 1cqmin); } : ^^^^^^ @@ -4032,7 +4032,7 @@ : ^^^^^^ `---- - x Length + x UnknownDimension ,-[$DIR/tests/fixture/at-rule/container/input.css:71:5] 71 | h2 { font-size: calc(1.2em + 1cqmax); } : ^^^^^^ @@ -4459,7 +4459,7 @@ : ^^^^^^ `---- - x Length + x UnknownDimension ,-[$DIR/tests/fixture/at-rule/container/input.css:76:9] 76 | h2 { font-size: calc(1.2em + 1cqmax); } : ^^^^^^ @@ -6731,7 +6731,7 @@ : ^^^^ `---- - x Length + x UnknownDimension ,-[$DIR/tests/fixture/at-rule/container/input.css:133:1] 133 | @container(inline-size>=calc(200px)){h2{font-size:calc(1.2em + 1cqi)}} : ^^^^ diff --git a/crates/swc_css_parser/tests/fixture/value/custom-property/output.json b/crates/swc_css_parser/tests/fixture/value/custom-property/output.json index ed47d2b1b077..00bef82f08c6 100644 --- a/crates/swc_css_parser/tests/fixture/value/custom-property/output.json +++ b/crates/swc_css_parser/tests/fixture/value/custom-property/output.json @@ -3146,7 +3146,7 @@ "type": "Declaration", "span": { "start": 1242, - "end": 1250, + "end": 1249, "ctxt": 0 }, "name": { @@ -3244,7 +3244,7 @@ "type": "Declaration", "span": { "start": 1263, - "end": 1272, + "end": 1271, "ctxt": 0 }, "name": { diff --git a/crates/swc_css_parser/tests/fixture/value/custom-property/span.rust-debug b/crates/swc_css_parser/tests/fixture/value/custom-property/span.rust-debug index cc0fcaa86ba5..c8e50b273ba7 100644 --- a/crates/swc_css_parser/tests/fixture/value/custom-property/span.rust-debug +++ b/crates/swc_css_parser/tests/fixture/value/custom-property/span.rust-debug @@ -3779,19 +3779,19 @@ x ComponentValue ,-[$DIR/tests/fixture/value/custom-property/input.css:60:1] 60 | :root {--foo: } - : ^^^^^^^^ + : ^^^^^^^ `---- x StyleBlock ,-[$DIR/tests/fixture/value/custom-property/input.css:60:1] 60 | :root {--foo: } - : ^^^^^^^^ + : ^^^^^^^ `---- x Declaration ,-[$DIR/tests/fixture/value/custom-property/input.css:60:1] 60 | :root {--foo: } - : ^^^^^^^^ + : ^^^^^^^ `---- x DeclarationName @@ -3871,20 +3871,23 @@ x ComponentValue ,-[$DIR/tests/fixture/value/custom-property/input.css:62:5] - 62 | ,-> --foo: - 63 | `-> } + 62 | --foo: + : ^^^^^^^^ + 63 | } `---- x StyleBlock ,-[$DIR/tests/fixture/value/custom-property/input.css:62:5] - 62 | ,-> --foo: - 63 | `-> } + 62 | --foo: + : ^^^^^^^^ + 63 | } `---- x Declaration ,-[$DIR/tests/fixture/value/custom-property/input.css:62:5] - 62 | ,-> --foo: - 63 | `-> } + 62 | --foo: + : ^^^^^^^^ + 63 | } `---- x DeclarationName diff --git a/crates/swc_css_parser/tests/recovery/function/unclosed-2/output.json b/crates/swc_css_parser/tests/recovery/function/unclosed-2/output.json index d2a125ca7487..60061ee9a988 100644 --- a/crates/swc_css_parser/tests/recovery/function/unclosed-2/output.json +++ b/crates/swc_css_parser/tests/recovery/function/unclosed-2/output.json @@ -84,7 +84,7 @@ "type": "Declaration", "span": { "start": 11, - "end": 63, + "end": 62, "ctxt": 0 }, "name": { @@ -102,7 +102,7 @@ "type": "Function", "span": { "start": 34, - "end": 63, + "end": 62, "ctxt": 0 }, "name": { @@ -237,19 +237,6 @@ "ctxt": 0 }, "token": "RBrace" - }, - { - "type": "PreservedToken", - "span": { - "start": 62, - "end": 63, - "ctxt": 0 - }, - "token": { - "WhiteSpace": { - "value": "\n" - } - } } ] } diff --git a/crates/swc_css_parser/tests/recovery/function/unclosed-2/span.rust-debug b/crates/swc_css_parser/tests/recovery/function/unclosed-2/span.rust-debug index 4f19225f7e75..beb9bb5b605a 100644 --- a/crates/swc_css_parser/tests/recovery/function/unclosed-2/span.rust-debug +++ b/crates/swc_css_parser/tests/recovery/function/unclosed-2/span.rust-debug @@ -233,16 +233,3 @@ 3 | } : ^ `---- - - x ComponentValue - ,-[$DIR/tests/recovery/function/unclosed-2/input.css:3:1] - 3 | } - : ^ - `---- - - x WhiteSpace { value: Atom(' - | ' type=inline) } - ,-[$DIR/tests/recovery/function/unclosed-2/input.css:3:1] - 3 | } - : ^ - `---- diff --git a/crates/swc_css_parser/tests/recovery/function/unclosed/output.json b/crates/swc_css_parser/tests/recovery/function/unclosed/output.json index de11c9f5373c..04c1b87a1de0 100644 --- a/crates/swc_css_parser/tests/recovery/function/unclosed/output.json +++ b/crates/swc_css_parser/tests/recovery/function/unclosed/output.json @@ -84,7 +84,7 @@ "type": "Declaration", "span": { "start": 11, - "end": 31, + "end": 30, "ctxt": 0 }, "name": { @@ -102,7 +102,7 @@ "type": "Function", "span": { "start": 18, - "end": 31, + "end": 30, "ctxt": 0 }, "name": { @@ -163,19 +163,6 @@ "ctxt": 0 }, "token": "RBrace" - }, - { - "type": "PreservedToken", - "span": { - "start": 30, - "end": 31, - "ctxt": 0 - }, - "token": { - "WhiteSpace": { - "value": "\n" - } - } } ] } diff --git a/crates/swc_css_parser/tests/recovery/function/unclosed/span.rust-debug b/crates/swc_css_parser/tests/recovery/function/unclosed/span.rust-debug index b1f9ad5f5906..1607d088d380 100644 --- a/crates/swc_css_parser/tests/recovery/function/unclosed/span.rust-debug +++ b/crates/swc_css_parser/tests/recovery/function/unclosed/span.rust-debug @@ -167,16 +167,3 @@ 3 | } : ^ `---- - - x ComponentValue - ,-[$DIR/tests/recovery/function/unclosed/input.css:3:1] - 3 | } - : ^ - `---- - - x WhiteSpace { value: Atom(' - | ' type=inline) } - ,-[$DIR/tests/recovery/function/unclosed/input.css:3:1] - 3 | } - : ^ - `---- diff --git a/crates/swc_css_parser/tests/recovery/hacks/output.json b/crates/swc_css_parser/tests/recovery/hacks/output.json index 842a60deb4bc..32f2cf792a80 100644 --- a/crates/swc_css_parser/tests/recovery/hacks/output.json +++ b/crates/swc_css_parser/tests/recovery/hacks/output.json @@ -8368,7 +8368,7 @@ "type": "QualifiedRule", "span": { "start": 2529, - "end": 2687, + "end": 2581, "ctxt": 0 }, "prelude": { @@ -8425,7 +8425,7 @@ "type": "SimpleBlock", "span": { "start": 2539, - "end": 2687, + "end": 2581, "ctxt": 0 }, "name": { @@ -8438,46 +8438,86 @@ "token": "LBrace" }, "value": [ + { + "type": "Declaration", + "span": { + "start": 2568, + "end": 2578, + "ctxt": 0 + }, + "name": { + "type": "Ident", + "span": { + "start": 2568, + "end": 2573, + "ctxt": 0 + }, + "value": "color", + "raw": "color" + }, + "value": [ + { + "type": "Ident", + "span": { + "start": 2575, + "end": 2578, + "ctxt": 0 + }, + "value": "red", + "raw": "red" + } + ], + "important": null + }, { "type": "ListOfComponentValues", "span": { - "start": 2635, - "end": 2669, + "start": 2546, + "end": 2563, "ctxt": 0 }, "children": [ { "type": "PreservedToken", "span": { - "start": 2635, - "end": 2636, + "start": 2546, + "end": 2547, "ctxt": 0 }, "token": { "Delim": { - "value": "." + "value": "&" } } }, { "type": "PreservedToken", "span": { - "start": 2636, - "end": 2644, + "start": 2547, + "end": 2555, "ctxt": 0 }, "token": { "Ident": { - "value": "selector", - "raw": "selector" + "value": "property", + "raw": "property" } } }, { "type": "PreservedToken", "span": { - "start": 2644, - "end": 2645, + "start": 2555, + "end": 2556, + "ctxt": 0 + }, + "token": "Colon" + }, + { + "type": "PreservedToken", + "span": { + "start": 2556, + "end": 2557, "ctxt": 0 }, "token": { @@ -8489,39 +8529,131 @@ { "type": "PreservedToken", "span": { - "start": 2645, - "end": 2646, + "start": 2557, + "end": 2562, "ctxt": 0 }, - "token": "LBrace" + "token": { + "Ident": { + "value": "value", + "raw": "value" + } + } }, { "type": "PreservedToken", "span": { - "start": 2646, - "end": 2652, + "start": 2562, + "end": 2563, "ctxt": 0 }, - "token": { - "WhiteSpace": { - "value": " \n " + "token": "Semi" + } + ] + } + ] + } + }, + { + "type": "QualifiedRule", + "span": { + "start": 2582, + "end": 2634, + "ctxt": 0 + }, + "prelude": { + "type": "SelectorList", + "span": { + "start": 2582, + "end": 2591, + "ctxt": 0 + }, + "children": [ + { + "type": "ComplexSelector", + "span": { + "start": 2582, + "end": 2591, + "ctxt": 0 + }, + "children": [ + { + "type": "CompoundSelector", + "span": { + "start": 2582, + "end": 2591, + "ctxt": 0 + }, + "nestingSelector": null, + "typeSelector": null, + "subclassSelectors": [ + { + "type": "ClassSelector", + "span": { + "start": 2582, + "end": 2591, + "ctxt": 0 + }, + "text": { + "type": "Ident", + "span": { + "start": 2583, + "end": 2591, + "ctxt": 0 + }, + "value": "selector", + "raw": "selector" + } } - } - }, + ] + } + ] + } + ] + }, + "block": { + "type": "SimpleBlock", + "span": { + "start": 2592, + "end": 2634, + "ctxt": 0 + }, + "name": { + "type": "PreservedToken", + "span": { + "start": 2592, + "end": 2593, + "ctxt": 0 + }, + "token": "LBrace" + }, + "value": [ + { + "type": "ListOfComponentValues", + "span": { + "start": 2599, + "end": 2616, + "ctxt": 0 + }, + "children": [ { "type": "PreservedToken", "span": { - "start": 2652, - "end": 2653, + "start": 2599, + "end": 2600, "ctxt": 0 }, - "token": "RParen" + "token": { + "Delim": { + "value": "*" + } + } }, { "type": "PreservedToken", "span": { - "start": 2653, - "end": 2661, + "start": 2600, + "end": 2608, "ctxt": 0 }, "token": { @@ -8534,8 +8666,8 @@ { "type": "PreservedToken", "span": { - "start": 2661, - "end": 2662, + "start": 2608, + "end": 2609, "ctxt": 0 }, "token": "Colon" @@ -8543,8 +8675,8 @@ { "type": "PreservedToken", "span": { - "start": 2662, - "end": 2663, + "start": 2609, + "end": 2610, "ctxt": 0 }, "token": { @@ -8556,8 +8688,8 @@ { "type": "PreservedToken", "span": { - "start": 2663, - "end": 2668, + "start": 2610, + "end": 2615, "ctxt": 0 }, "token": { @@ -8570,8 +8702,8 @@ { "type": "PreservedToken", "span": { - "start": 2668, - "end": 2669, + "start": 2615, + "end": 2616, "ctxt": 0 }, "token": "Semi" @@ -8581,15 +8713,15 @@ { "type": "Declaration", "span": { - "start": 2674, - "end": 2684, + "start": 2621, + "end": 2631, "ctxt": 0 }, "name": { "type": "Ident", "span": { - "start": 2674, - "end": 2679, + "start": 2621, + "end": 2626, "ctxt": 0 }, "value": "color", @@ -8599,8 +8731,8 @@ { "type": "Ident", "span": { - "start": 2681, - "end": 2684, + "start": 2628, + "end": 2631, "ctxt": 0 }, "value": "red", @@ -8608,315 +8740,84 @@ } ], "important": null - }, + } + ] + } + }, + { + "type": "QualifiedRule", + "span": { + "start": 2635, + "end": 2687, + "ctxt": 0 + }, + "prelude": { + "type": "SelectorList", + "span": { + "start": 2635, + "end": 2644, + "ctxt": 0 + }, + "children": [ { - "type": "QualifiedRule", + "type": "ComplexSelector", "span": { - "start": 2546, - "end": 2634, + "start": 2635, + "end": 2644, "ctxt": 0 }, - "prelude": { - "type": "ListOfComponentValues", - "span": { - "start": 2546, - "end": 2580, - "ctxt": 0 - }, - "children": [ - { - "type": "PreservedToken", - "span": { - "start": 2546, - "end": 2547, - "ctxt": 0 - }, - "token": { - "Delim": { - "value": "&" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 2547, - "end": 2555, - "ctxt": 0 - }, - "token": { - "Ident": { - "value": "property", - "raw": "property" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 2555, - "end": 2556, - "ctxt": 0 - }, - "token": "Colon" - }, - { - "type": "PreservedToken", - "span": { - "start": 2556, - "end": 2557, - "ctxt": 0 - }, - "token": { - "WhiteSpace": { - "value": " " - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 2557, - "end": 2562, - "ctxt": 0 - }, - "token": { - "Ident": { - "value": "value", - "raw": "value" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 2562, - "end": 2563, - "ctxt": 0 - }, - "token": "Semi" - }, - { - "type": "PreservedToken", - "span": { - "start": 2563, - "end": 2568, - "ctxt": 0 - }, - "token": { - "WhiteSpace": { - "value": "\n " - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 2568, - "end": 2573, - "ctxt": 0 - }, - "token": { - "Ident": { - "value": "color", - "raw": "color" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 2573, - "end": 2574, - "ctxt": 0 - }, - "token": "Colon" - }, - { - "type": "PreservedToken", - "span": { - "start": 2574, - "end": 2575, - "ctxt": 0 - }, - "token": { - "WhiteSpace": { - "value": " " - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 2575, - "end": 2578, - "ctxt": 0 - }, - "token": { - "Ident": { - "value": "red", - "raw": "red" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 2578, - "end": 2579, - "ctxt": 0 - }, - "token": "Semi" - }, - { - "type": "PreservedToken", - "span": { - "start": 2579, - "end": 2580, - "ctxt": 0 - }, - "token": { - "WhiteSpace": { - "value": "\n" - } - } - } - ] - }, - "block": { - "type": "SimpleBlock", - "span": { - "start": 2592, - "end": 2634, - "ctxt": 0 - }, - "name": { - "type": "PreservedToken", + "children": [ + { + "type": "CompoundSelector", "span": { - "start": 2592, - "end": 2593, + "start": 2635, + "end": 2644, "ctxt": 0 }, - "token": "LBrace" - }, - "value": [ - { - "type": "ListOfComponentValues", - "span": { - "start": 2599, - "end": 2616, - "ctxt": 0 - }, - "children": [ - { - "type": "PreservedToken", - "span": { - "start": 2599, - "end": 2600, - "ctxt": 0 - }, - "token": { - "Delim": { - "value": "*" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 2600, - "end": 2608, - "ctxt": 0 - }, - "token": { - "Ident": { - "value": "property", - "raw": "property" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 2608, - "end": 2609, - "ctxt": 0 - }, - "token": "Colon" - }, - { - "type": "PreservedToken", - "span": { - "start": 2609, - "end": 2610, - "ctxt": 0 - }, - "token": { - "WhiteSpace": { - "value": " " - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 2610, - "end": 2615, - "ctxt": 0 - }, - "token": { - "Ident": { - "value": "value", - "raw": "value" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 2615, - "end": 2616, - "ctxt": 0 - }, - "token": "Semi" - } - ] - }, - { - "type": "Declaration", - "span": { - "start": 2621, - "end": 2631, - "ctxt": 0 - }, - "name": { - "type": "Ident", + "nestingSelector": null, + "typeSelector": null, + "subclassSelectors": [ + { + "type": "ClassSelector", "span": { - "start": 2621, - "end": 2626, + "start": 2635, + "end": 2644, "ctxt": 0 }, - "value": "color", - "raw": "color" - }, - "value": [ - { + "text": { "type": "Ident", "span": { - "start": 2628, - "end": 2631, + "start": 2636, + "end": 2644, "ctxt": 0 }, - "value": "red", - "raw": "red" + "value": "selector", + "raw": "selector" } - ], - "important": null - } - ] - } + } + ] + } + ] } ] + }, + "block": { + "type": "SimpleBlock", + "span": { + "start": 2645, + "end": 2687, + "ctxt": 0 + }, + "name": { + "type": "PreservedToken", + "span": { + "start": 2645, + "end": 2646, + "ctxt": 0 + }, + "token": "LBrace" + }, + "value": [] } }, { @@ -10491,117 +10392,7 @@ }, "token": "LBrace" }, - "value": [ - { - "type": "ListOfComponentValues", - "span": { - "start": 3129, - "end": 3146, - "ctxt": 0 - }, - "children": [ - { - "type": "PreservedToken", - "span": { - "start": 3129, - "end": 3130, - "ctxt": 0 - }, - "token": "RBracket" - }, - { - "type": "PreservedToken", - "span": { - "start": 3130, - "end": 3138, - "ctxt": 0 - }, - "token": { - "Ident": { - "value": "property", - "raw": "property" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 3138, - "end": 3139, - "ctxt": 0 - }, - "token": "Colon" - }, - { - "type": "PreservedToken", - "span": { - "start": 3139, - "end": 3140, - "ctxt": 0 - }, - "token": { - "WhiteSpace": { - "value": " " - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 3140, - "end": 3145, - "ctxt": 0 - }, - "token": { - "Ident": { - "value": "value", - "raw": "value" - } - } - }, - { - "type": "PreservedToken", - "span": { - "start": 3145, - "end": 3146, - "ctxt": 0 - }, - "token": "Semi" - } - ] - }, - { - "type": "Declaration", - "span": { - "start": 3151, - "end": 3161, - "ctxt": 0 - }, - "name": { - "type": "Ident", - "span": { - "start": 3151, - "end": 3156, - "ctxt": 0 - }, - "value": "color", - "raw": "color" - }, - "value": [ - { - "type": "Ident", - "span": { - "start": 3158, - "end": 3161, - "ctxt": 0 - }, - "value": "red", - "raw": "red" - } - ], - "important": null - } - ] + "value": [] } }, { diff --git a/crates/swc_css_parser/tests/recovery/hacks/output.swc-stderr b/crates/swc_css_parser/tests/recovery/hacks/output.swc-stderr index e69d82c9012b..f5f7d1c6dc28 100644 --- a/crates/swc_css_parser/tests/recovery/hacks/output.swc-stderr +++ b/crates/swc_css_parser/tests/recovery/hacks/output.swc-stderr @@ -11,12 +11,6 @@ : ^ `---- - x Expected function or ident tokens - ,-[$DIR/tests/recovery/hacks/input.css:112:5] - 112 | &property: value; - : ^ - `---- - x Expected important ,-[$DIR/tests/recovery/hacks/input.css:180:1] 180 | .selector { property: value !ie; } @@ -65,12 +59,6 @@ : ^ `---- - x Expected whitespace, semicolon, EOF, at-keyword or ident token - ,-[$DIR/tests/recovery/hacks/input.css:119:1] - 119 | .selector { - : ^ - `---- - x Expected whitespace, semicolon, EOF, at-keyword or ident token ,-[$DIR/tests/recovery/hacks/input.css:124:5] 124 | =property: value; @@ -113,12 +101,6 @@ : ^ `---- - x Expected whitespace, semicolon, EOF, at-keyword or ident token - ,-[$DIR/tests/recovery/hacks/input.css:156:5] - 156 | ]property: value; - : ^ - `---- - x Expected whitespace, semicolon, EOF, at-keyword or ident token ,-[$DIR/tests/recovery/hacks/input.css:160:5] 160 | #property: value; @@ -214,3 +196,9 @@ 250 | a{*b:c} : ^ `---- + + x Unexpected end of file + ,-[$DIR/tests/recovery/hacks/input.css:114:1] + 114 | } + : ^ + `---- diff --git a/crates/swc_css_parser/tests/recovery/hacks/span.rust-debug b/crates/swc_css_parser/tests/recovery/hacks/span.rust-debug index 1f33274e7ea8..7c834aa650ed 100644 --- a/crates/swc_css_parser/tests/recovery/hacks/span.rust-debug +++ b/crates/swc_css_parser/tests/recovery/hacks/span.rust-debug @@ -8130,15 +8130,7 @@ 111 | ,-> .selector { 112 | | &property: value; 113 | | color: red; - 114 | | } - 115 | | .selector { - 116 | | *property: value; - 117 | | color: red; - 118 | | } - 119 | | .selector { - 120 | | )property: value; - 121 | | color: red; - 122 | `-> } + 114 | `-> } `---- x QualifiedRule @@ -8146,15 +8138,7 @@ 111 | ,-> .selector { 112 | | &property: value; 113 | | color: red; - 114 | | } - 115 | | .selector { - 116 | | *property: value; - 117 | | color: red; - 118 | | } - 119 | | .selector { - 120 | | )property: value; - 121 | | color: red; - 122 | `-> } + 114 | `-> } `---- x SelectorList @@ -8198,15 +8182,7 @@ 111 | ,-> .selector { 112 | | &property: value; 113 | | color: red; - 114 | | } - 115 | | .selector { - 116 | | *property: value; - 117 | | color: red; - 118 | | } - 119 | | .selector { - 120 | | )property: value; - 121 | | color: red; - 122 | `-> } + 114 | `-> } `---- x LBrace @@ -8216,223 +8192,57 @@ `---- x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:119:1] - 119 | ,-> .selector { - 120 | `-> )property: value; - `---- - - x StyleBlock - ,-[$DIR/tests/recovery/hacks/input.css:119:1] - 119 | ,-> .selector { - 120 | `-> )property: value; - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:119:1] - 119 | .selector { - : ^ - `---- - - x Delim { value: '.' } - ,-[$DIR/tests/recovery/hacks/input.css:119:1] - 119 | .selector { - : ^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:119:1] - 119 | .selector { - : ^^^^^^^^ - `---- - - x Ident { value: Atom('selector' type=dynamic), raw: Atom('selector' type=dynamic) } - ,-[$DIR/tests/recovery/hacks/input.css:119:1] - 119 | .selector { - : ^^^^^^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:119:1] - 119 | .selector { - : ^ - `---- - - x WhiteSpace { value: Atom(' ' type=inline) } - ,-[$DIR/tests/recovery/hacks/input.css:119:1] - 119 | .selector { - : ^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:119:1] - 119 | .selector { - : ^ - `---- - - x LBrace - ,-[$DIR/tests/recovery/hacks/input.css:119:1] - 119 | .selector { - : ^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:119:1] - 119 | ,-> .selector { - 120 | `-> )property: value; - `---- - - x WhiteSpace { value: Atom(' - | ' type=inline) } - ,-[$DIR/tests/recovery/hacks/input.css:119:1] - 119 | ,-> .selector { - 120 | `-> )property: value; - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:120:5] - 120 | )property: value; - : ^ - `---- - - x RParen - ,-[$DIR/tests/recovery/hacks/input.css:120:5] - 120 | )property: value; - : ^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:120:5] - 120 | )property: value; - : ^^^^^^^^ - `---- - - x Ident { value: Atom('property' type=static), raw: Atom('property' type=static) } - ,-[$DIR/tests/recovery/hacks/input.css:120:5] - 120 | )property: value; - : ^^^^^^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:120:5] - 120 | )property: value; - : ^ - `---- - - x Colon - ,-[$DIR/tests/recovery/hacks/input.css:120:5] - 120 | )property: value; - : ^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:120:5] - 120 | )property: value; - : ^ - `---- - - x WhiteSpace { value: Atom(' ' type=inline) } - ,-[$DIR/tests/recovery/hacks/input.css:120:5] - 120 | )property: value; - : ^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:120:5] - 120 | )property: value; - : ^^^^^ - `---- - - x Ident { value: Atom('value' type=inline), raw: Atom('value' type=inline) } - ,-[$DIR/tests/recovery/hacks/input.css:120:5] - 120 | )property: value; - : ^^^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:120:5] - 120 | )property: value; - : ^ - `---- - - x Semi - ,-[$DIR/tests/recovery/hacks/input.css:120:5] - 120 | )property: value; - : ^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:121:5] - 121 | color: red; + ,-[$DIR/tests/recovery/hacks/input.css:113:5] + 113 | color: red; : ^^^^^^^^^^ `---- x StyleBlock - ,-[$DIR/tests/recovery/hacks/input.css:121:5] - 121 | color: red; + ,-[$DIR/tests/recovery/hacks/input.css:113:5] + 113 | color: red; : ^^^^^^^^^^ `---- x Declaration - ,-[$DIR/tests/recovery/hacks/input.css:121:5] - 121 | color: red; + ,-[$DIR/tests/recovery/hacks/input.css:113:5] + 113 | color: red; : ^^^^^^^^^^ `---- x DeclarationName - ,-[$DIR/tests/recovery/hacks/input.css:121:5] - 121 | color: red; + ,-[$DIR/tests/recovery/hacks/input.css:113:5] + 113 | color: red; : ^^^^^ `---- x Ident - ,-[$DIR/tests/recovery/hacks/input.css:121:5] - 121 | color: red; + ,-[$DIR/tests/recovery/hacks/input.css:113:5] + 113 | color: red; : ^^^^^ `---- x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:121:5] - 121 | color: red; + ,-[$DIR/tests/recovery/hacks/input.css:113:5] + 113 | color: red; : ^^^ `---- x Ident - ,-[$DIR/tests/recovery/hacks/input.css:121:5] - 121 | color: red; + ,-[$DIR/tests/recovery/hacks/input.css:113:5] + 113 | color: red; : ^^^ `---- x ComponentValue ,-[$DIR/tests/recovery/hacks/input.css:112:5] - 112 | ,-> &property: value; - 113 | | color: red; - 114 | | } - 115 | | .selector { - 116 | | *property: value; - 117 | | color: red; - 118 | `-> } + 112 | &property: value; + : ^^^^^^^^^^^^^^^^^ `---- x StyleBlock ,-[$DIR/tests/recovery/hacks/input.css:112:5] - 112 | ,-> &property: value; - 113 | | color: red; - 114 | | } - 115 | | .selector { - 116 | | *property: value; - 117 | | color: red; - 118 | `-> } - `---- - - x QualifiedRule - ,-[$DIR/tests/recovery/hacks/input.css:112:5] - 112 | ,-> &property: value; - 113 | | color: red; - 114 | | } - 115 | | .selector { - 116 | | *property: value; - 117 | | color: red; - 118 | `-> } + 112 | &property: value; + : ^^^^^^^^^^^^^^^^^ `---- x ComponentValue @@ -8507,92 +8317,56 @@ : ^ `---- - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:112:5] - 112 | ,-> &property: value; - 113 | `-> color: red; - `---- - - x WhiteSpace { value: Atom(' - | ' type=inline) } - ,-[$DIR/tests/recovery/hacks/input.css:112:5] - 112 | ,-> &property: value; - 113 | `-> color: red; - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:113:5] - 113 | color: red; - : ^^^^^ - `---- - - x Ident { value: Atom('color' type=static), raw: Atom('color' type=static) } - ,-[$DIR/tests/recovery/hacks/input.css:113:5] - 113 | color: red; - : ^^^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:113:5] - 113 | color: red; - : ^ - `---- - - x Colon - ,-[$DIR/tests/recovery/hacks/input.css:113:5] - 113 | color: red; - : ^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:113:5] - 113 | color: red; - : ^ + x Rule + ,-[$DIR/tests/recovery/hacks/input.css:115:1] + 115 | ,-> .selector { + 116 | | *property: value; + 117 | | color: red; + 118 | `-> } `---- - x WhiteSpace { value: Atom(' ' type=inline) } - ,-[$DIR/tests/recovery/hacks/input.css:113:5] - 113 | color: red; - : ^ + x QualifiedRule + ,-[$DIR/tests/recovery/hacks/input.css:115:1] + 115 | ,-> .selector { + 116 | | *property: value; + 117 | | color: red; + 118 | `-> } `---- - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:113:5] - 113 | color: red; - : ^^^ + x SelectorList + ,-[$DIR/tests/recovery/hacks/input.css:115:1] + 115 | .selector { + : ^^^^^^^^^ `---- - x Ident { value: Atom('red' type=inline), raw: Atom('red' type=inline) } - ,-[$DIR/tests/recovery/hacks/input.css:113:5] - 113 | color: red; - : ^^^ + x ComplexSelector + ,-[$DIR/tests/recovery/hacks/input.css:115:1] + 115 | .selector { + : ^^^^^^^^^ `---- - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:113:5] - 113 | color: red; - : ^ + x CompoundSelector + ,-[$DIR/tests/recovery/hacks/input.css:115:1] + 115 | .selector { + : ^^^^^^^^^ `---- - x Semi - ,-[$DIR/tests/recovery/hacks/input.css:113:5] - 113 | color: red; - : ^ + x SubclassSelector + ,-[$DIR/tests/recovery/hacks/input.css:115:1] + 115 | .selector { + : ^^^^^^^^^ `---- - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:113:5] - 113 | color: red; - : ^ - 114 | } + x ClassSelector + ,-[$DIR/tests/recovery/hacks/input.css:115:1] + 115 | .selector { + : ^^^^^^^^^ `---- - x WhiteSpace { value: Atom(' - | ' type=inline) } - ,-[$DIR/tests/recovery/hacks/input.css:113:5] - 113 | color: red; - : ^ - 114 | } + x Ident + ,-[$DIR/tests/recovery/hacks/input.css:115:1] + 115 | .selector { + : ^^^^^^^^ `---- x SimpleBlock @@ -8735,6 +8509,72 @@ : ^^^ `---- + x Rule + ,-[$DIR/tests/recovery/hacks/input.css:119:1] + 119 | ,-> .selector { + 120 | | )property: value; + 121 | | color: red; + 122 | `-> } + `---- + + x QualifiedRule + ,-[$DIR/tests/recovery/hacks/input.css:119:1] + 119 | ,-> .selector { + 120 | | )property: value; + 121 | | color: red; + 122 | `-> } + `---- + + x SelectorList + ,-[$DIR/tests/recovery/hacks/input.css:119:1] + 119 | .selector { + : ^^^^^^^^^ + `---- + + x ComplexSelector + ,-[$DIR/tests/recovery/hacks/input.css:119:1] + 119 | .selector { + : ^^^^^^^^^ + `---- + + x CompoundSelector + ,-[$DIR/tests/recovery/hacks/input.css:119:1] + 119 | .selector { + : ^^^^^^^^^ + `---- + + x SubclassSelector + ,-[$DIR/tests/recovery/hacks/input.css:119:1] + 119 | .selector { + : ^^^^^^^^^ + `---- + + x ClassSelector + ,-[$DIR/tests/recovery/hacks/input.css:119:1] + 119 | .selector { + : ^^^^^^^^^ + `---- + + x Ident + ,-[$DIR/tests/recovery/hacks/input.css:119:1] + 119 | .selector { + : ^^^^^^^^ + `---- + + x SimpleBlock + ,-[$DIR/tests/recovery/hacks/input.css:119:1] + 119 | ,-> .selector { + 120 | | )property: value; + 121 | | color: red; + 122 | `-> } + `---- + + x LBrace + ,-[$DIR/tests/recovery/hacks/input.css:119:1] + 119 | .selector { + : ^ + `---- + x Rule ,-[$DIR/tests/recovery/hacks/input.css:123:1] 123 | ,-> .selector { @@ -10319,132 +10159,6 @@ : ^ `---- - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:156:5] - 156 | ]property: value; - : ^^^^^^^^^^^^^^^^^ - `---- - - x StyleBlock - ,-[$DIR/tests/recovery/hacks/input.css:156:5] - 156 | ]property: value; - : ^^^^^^^^^^^^^^^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:156:5] - 156 | ]property: value; - : ^ - `---- - - x RBracket - ,-[$DIR/tests/recovery/hacks/input.css:156:5] - 156 | ]property: value; - : ^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:156:5] - 156 | ]property: value; - : ^^^^^^^^ - `---- - - x Ident { value: Atom('property' type=static), raw: Atom('property' type=static) } - ,-[$DIR/tests/recovery/hacks/input.css:156:5] - 156 | ]property: value; - : ^^^^^^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:156:5] - 156 | ]property: value; - : ^ - `---- - - x Colon - ,-[$DIR/tests/recovery/hacks/input.css:156:5] - 156 | ]property: value; - : ^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:156:5] - 156 | ]property: value; - : ^ - `---- - - x WhiteSpace { value: Atom(' ' type=inline) } - ,-[$DIR/tests/recovery/hacks/input.css:156:5] - 156 | ]property: value; - : ^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:156:5] - 156 | ]property: value; - : ^^^^^ - `---- - - x Ident { value: Atom('value' type=inline), raw: Atom('value' type=inline) } - ,-[$DIR/tests/recovery/hacks/input.css:156:5] - 156 | ]property: value; - : ^^^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:156:5] - 156 | ]property: value; - : ^ - `---- - - x Semi - ,-[$DIR/tests/recovery/hacks/input.css:156:5] - 156 | ]property: value; - : ^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:157:5] - 157 | color: red; - : ^^^^^^^^^^ - `---- - - x StyleBlock - ,-[$DIR/tests/recovery/hacks/input.css:157:5] - 157 | color: red; - : ^^^^^^^^^^ - `---- - - x Declaration - ,-[$DIR/tests/recovery/hacks/input.css:157:5] - 157 | color: red; - : ^^^^^^^^^^ - `---- - - x DeclarationName - ,-[$DIR/tests/recovery/hacks/input.css:157:5] - 157 | color: red; - : ^^^^^ - `---- - - x Ident - ,-[$DIR/tests/recovery/hacks/input.css:157:5] - 157 | color: red; - : ^^^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/hacks/input.css:157:5] - 157 | color: red; - : ^^^ - `---- - - x Ident - ,-[$DIR/tests/recovery/hacks/input.css:157:5] - 157 | color: red; - : ^^^ - `---- - x Rule ,-[$DIR/tests/recovery/hacks/input.css:159:1] 159 | ,-> .selector { diff --git a/crates/swc_css_parser/tests/recovery/simple-block/unclosed-in-function/output.json b/crates/swc_css_parser/tests/recovery/simple-block/unclosed-in-function/output.json index 204335c23e06..c556d2d4e5eb 100644 --- a/crates/swc_css_parser/tests/recovery/simple-block/unclosed-in-function/output.json +++ b/crates/swc_css_parser/tests/recovery/simple-block/unclosed-in-function/output.json @@ -171,24 +171,6 @@ }, "token": "RParen" }, - { - "type": "Delimiter", - "span": { - "start": 55, - "end": 56, - "ctxt": 0 - }, - "value": ";" - }, - { - "type": "PreservedToken", - "span": { - "start": 57, - "end": 58, - "ctxt": 0 - }, - "token": "RBrace" - }, { "type": "PreservedToken", "span": { @@ -196,11 +178,7 @@ "end": 59, "ctxt": 0 }, - "token": { - "WhiteSpace": { - "value": "\n" - } - } + "token": "RParen" } ] } diff --git a/crates/swc_css_parser/tests/recovery/simple-block/unclosed-in-function/output.swc-stderr b/crates/swc_css_parser/tests/recovery/simple-block/unclosed-in-function/output.swc-stderr index 7a0734052c92..313869cedd7b 100644 --- a/crates/swc_css_parser/tests/recovery/simple-block/unclosed-in-function/output.swc-stderr +++ b/crates/swc_css_parser/tests/recovery/simple-block/unclosed-in-function/output.swc-stderr @@ -8,7 +8,7 @@ x Expected Declaration value ,-[$DIR/tests/recovery/simple-block/unclosed-in-function/input.css:3:1] 3 | } - : ^ + : ^ `---- x Unexpected end of file diff --git a/crates/swc_css_parser/tests/recovery/simple-block/unclosed-in-function/span.rust-debug b/crates/swc_css_parser/tests/recovery/simple-block/unclosed-in-function/span.rust-debug index 5a4280a9ec9d..c68ba50faab4 100644 --- a/crates/swc_css_parser/tests/recovery/simple-block/unclosed-in-function/span.rust-debug +++ b/crates/swc_css_parser/tests/recovery/simple-block/unclosed-in-function/span.rust-debug @@ -183,38 +183,13 @@ : ^ `---- - x ComponentValue - ,-[$DIR/tests/recovery/simple-block/unclosed-in-function/input.css:2:5] - 2 | grid-template-columns: repeat(4, [col-start); - : ^ - `---- - - x Delimiter - ,-[$DIR/tests/recovery/simple-block/unclosed-in-function/input.css:2:5] - 2 | grid-template-columns: repeat(4, [col-start); - : ^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/simple-block/unclosed-in-function/input.css:3:1] - 3 | } - : ^ - `---- - - x RBrace - ,-[$DIR/tests/recovery/simple-block/unclosed-in-function/input.css:3:1] - 3 | } - : ^ - `---- - x ComponentValue ,-[$DIR/tests/recovery/simple-block/unclosed-in-function/input.css:3:1] 3 | } : ^ `---- - x WhiteSpace { value: Atom(' - | ' type=inline) } + x RParen ,-[$DIR/tests/recovery/simple-block/unclosed-in-function/input.css:3:1] 3 | } : ^ diff --git a/crates/swc_css_parser/tests/recovery/style-blocks-contents/basic/output.swc-stderr b/crates/swc_css_parser/tests/recovery/style-blocks-contents/basic/output.swc-stderr index 2dd3d1dca009..6ba9ffebf6c8 100644 --- a/crates/swc_css_parser/tests/recovery/style-blocks-contents/basic/output.swc-stderr +++ b/crates/swc_css_parser/tests/recovery/style-blocks-contents/basic/output.swc-stderr @@ -24,7 +24,7 @@ `---- x Unexpected end of file - ,-[$DIR/tests/recovery/style-blocks-contents/basic/input.css:40:3] - 40 | + ,-[$DIR/tests/recovery/style-blocks-contents/basic/input.css:40:1] + 40 | } : ^ `---- diff --git a/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested-2/output.json b/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested-2/output.json index ef6cf5a25d60..cc0f9d0c270c 100644 --- a/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested-2/output.json +++ b/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested-2/output.json @@ -10,7 +10,7 @@ "type": "QualifiedRule", "span": { "start": 1, - "end": 172, + "end": 59, "ctxt": 0 }, "prelude": { @@ -67,7 +67,7 @@ "type": "SimpleBlock", "span": { "start": 8, - "end": 172, + "end": 59, "ctxt": 0 }, "name": { @@ -112,159 +112,298 @@ "important": null }, { - "type": "QualifiedRule", + "type": "Declaration", "span": { - "start": 30, - "end": 171, + "start": 42, + "end": 57, "ctxt": 0 }, - "prelude": { - "type": "ListOfComponentValues", + "name": { + "type": "Ident", "span": { - "start": 30, - "end": 58, + "start": 42, + "end": 52, "ctxt": 0 }, - "children": [ - { - "type": "PreservedToken", - "span": { - "start": 30, - "end": 31, - "ctxt": 0 - }, - "token": { - "Delim": { - "value": "&" - } - } + "value": "background", + "raw": "background" + }, + "value": [ + { + "type": "Ident", + "span": { + "start": 54, + "end": 57, + "ctxt": 0 }, - { - "type": "PreservedToken", - "span": { - "start": 31, - "end": 32, - "ctxt": 0 - }, - "token": { - "WhiteSpace": { - "value": " " - } - } + "value": "red", + "raw": "red" + } + ], + "important": null + }, + { + "type": "ListOfComponentValues", + "span": { + "start": 30, + "end": 37, + "ctxt": 0 + }, + "children": [ + { + "type": "PreservedToken", + "span": { + "start": 30, + "end": 31, + "ctxt": 0 }, - { - "type": "PreservedToken", - "span": { - "start": 32, - "end": 36, - "ctxt": 0 - }, - "token": { - "Ident": { - "value": "test", - "raw": "test" - } + "token": { + "Delim": { + "value": "&" } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 31, + "end": 32, + "ctxt": 0 }, - { - "type": "PreservedToken", - "span": { - "start": 36, - "end": 37, - "ctxt": 0 - }, - "token": "Semi" - }, - { - "type": "PreservedToken", - "span": { - "start": 37, - "end": 42, - "ctxt": 0 - }, - "token": { - "WhiteSpace": { - "value": "\n " - } + "token": { + "WhiteSpace": { + "value": " " } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 32, + "end": 36, + "ctxt": 0 }, - { - "type": "PreservedToken", - "span": { - "start": 42, - "end": 52, - "ctxt": 0 - }, - "token": { - "Ident": { - "value": "background", - "raw": "background" - } + "token": { + "Ident": { + "value": "test", + "raw": "test" } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 36, + "end": 37, + "ctxt": 0 }, - { - "type": "PreservedToken", - "span": { - "start": 52, - "end": 53, - "ctxt": 0 - }, - "token": "Colon" + "token": "Semi" + } + ] + } + ] + } + }, + { + "type": "QualifiedRule", + "span": { + "start": 61, + "end": 171, + "ctxt": 0 + }, + "prelude": { + "type": "SelectorList", + "span": { + "start": 61, + "end": 68, + "ctxt": 0 + }, + "children": [ + { + "type": "ComplexSelector", + "span": { + "start": 61, + "end": 68, + "ctxt": 0 + }, + "children": [ + { + "type": "CompoundSelector", + "span": { + "start": 61, + "end": 68, + "ctxt": 0 }, - { - "type": "PreservedToken", + "nestingSelector": null, + "typeSelector": { + "type": "TagNameSelector", "span": { - "start": 53, - "end": 54, + "start": 61, + "end": 68, "ctxt": 0 }, - "token": { - "WhiteSpace": { - "value": " " + "name": { + "type": "WqName", + "span": { + "start": 61, + "end": 68, + "ctxt": 0 + }, + "prefix": null, + "value": { + "type": "Ident", + "span": { + "start": 61, + "end": 68, + "ctxt": 0 + }, + "value": "article", + "raw": "article" } } }, - { - "type": "PreservedToken", - "span": { - "start": 54, - "end": 57, - "ctxt": 0 - }, - "token": { - "Ident": { - "value": "red", - "raw": "red" - } - } + "subclassSelectors": [] + } + ] + } + ] + }, + "block": { + "type": "SimpleBlock", + "span": { + "start": 69, + "end": 171, + "ctxt": 0 + }, + "name": { + "type": "PreservedToken", + "span": { + "start": 69, + "end": 70, + "ctxt": 0 + }, + "token": "LBrace" + }, + "value": [ + { + "type": "Declaration", + "span": { + "start": 75, + "end": 87, + "ctxt": 0 + }, + "name": { + "type": "Ident", + "span": { + "start": 75, + "end": 80, + "ctxt": 0 + }, + "value": "color", + "raw": "color" + }, + "value": [ + { + "type": "Ident", + "span": { + "start": 82, + "end": 87, + "ctxt": 0 }, + "value": "green", + "raw": "green" + } + ], + "important": null + }, + { + "type": "Declaration", + "span": { + "start": 116, + "end": 126, + "ctxt": 0 + }, + "name": { + "type": "Ident", + "span": { + "start": 116, + "end": 121, + "ctxt": 0 + }, + "value": "color", + "raw": "color" + }, + "value": [ + { + "type": "Ident", + "span": { + "start": 123, + "end": 126, + "ctxt": 0 + }, + "value": "red", + "raw": "red" + } + ], + "important": null + }, + { + "type": "QualifiedRule", + "span": { + "start": 93, + "end": 111, + "ctxt": 0 + }, + "prelude": { + "type": "SelectorList", + "span": { + "start": 93, + "end": 94, + "ctxt": 0 + }, + "children": [ { - "type": "PreservedToken", + "type": "ComplexSelector", "span": { - "start": 57, - "end": 58, + "start": 93, + "end": 94, "ctxt": 0 }, - "token": { - "WhiteSpace": { - "value": "\n" + "children": [ + { + "type": "CompoundSelector", + "span": { + "start": 93, + "end": 94, + "ctxt": 0 + }, + "nestingSelector": { + "type": "NestingSelector", + "span": { + "start": 93, + "end": 94, + "ctxt": 0 + } + }, + "typeSelector": null, + "subclassSelectors": [] } - } + ] } ] }, "block": { "type": "SimpleBlock", "span": { - "start": 69, - "end": 171, + "start": 95, + "end": 111, "ctxt": 0 }, "name": { "type": "PreservedToken", "span": { - "start": 69, - "end": 70, + "start": 95, + "end": 96, "ctxt": 0 }, "token": "LBrace" @@ -273,15 +412,15 @@ { "type": "Declaration", "span": { - "start": 75, - "end": 87, + "start": 97, + "end": 108, "ctxt": 0 }, "name": { "type": "Ident", "span": { - "start": 75, - "end": 80, + "start": 97, + "end": 102, "ctxt": 0 }, "value": "color", @@ -291,257 +430,130 @@ { "type": "Ident", "span": { - "start": 82, - "end": 87, + "start": 104, + "end": 108, "ctxt": 0 }, - "value": "green", - "raw": "green" + "value": "blue", + "raw": "blue" } ], "important": null - }, + } + ] + } + }, + { + "type": "QualifiedRule", + "span": { + "start": 132, + "end": 156, + "ctxt": 0 + }, + "prelude": { + "type": "SelectorList", + "span": { + "start": 132, + "end": 137, + "ctxt": 0 + }, + "children": [ { - "type": "Declaration", + "type": "ComplexSelector", "span": { - "start": 116, - "end": 126, + "start": 132, + "end": 137, "ctxt": 0 }, - "name": { - "type": "Ident", - "span": { - "start": 116, - "end": 121, - "ctxt": 0 - }, - "value": "color", - "raw": "color" - }, - "value": [ + "children": [ { - "type": "Ident", + "type": "CompoundSelector", "span": { - "start": 123, - "end": 126, + "start": 132, + "end": 137, "ctxt": 0 }, - "value": "red", - "raw": "red" - } - ], - "important": null - }, - { - "type": "QualifiedRule", - "span": { - "start": 93, - "end": 111, - "ctxt": 0 - }, - "prelude": { - "type": "SelectorList", - "span": { - "start": 93, - "end": 94, - "ctxt": 0 - }, - "children": [ - { - "type": "ComplexSelector", + "nestingSelector": { + "type": "NestingSelector", "span": { - "start": 93, - "end": 94, + "start": 132, + "end": 133, "ctxt": 0 - }, - "children": [ - { - "type": "CompoundSelector", - "span": { - "start": 93, - "end": 94, - "ctxt": 0 - }, - "nestingSelector": { - "type": "NestingSelector", - "span": { - "start": 93, - "end": 94, - "ctxt": 0 - } - }, - "typeSelector": null, - "subclassSelectors": [] - } - ] - } - ] - }, - "block": { - "type": "SimpleBlock", - "span": { - "start": 95, - "end": 111, - "ctxt": 0 - }, - "name": { - "type": "PreservedToken", - "span": { - "start": 95, - "end": 96, - "ctxt": 0 + } }, - "token": "LBrace" - }, - "value": [ - { - "type": "Declaration", - "span": { - "start": 97, - "end": 108, - "ctxt": 0 - }, - "name": { - "type": "Ident", + "typeSelector": null, + "subclassSelectors": [ + { + "type": "ClassSelector", "span": { - "start": 97, - "end": 102, + "start": 133, + "end": 137, "ctxt": 0 }, - "value": "color", - "raw": "color" - }, - "value": [ - { + "text": { "type": "Ident", "span": { - "start": 104, - "end": 108, + "start": 134, + "end": 137, "ctxt": 0 }, - "value": "blue", - "raw": "blue" + "value": "foo", + "raw": "foo" } - ], - "important": null - } - ] - } + } + ] + } + ] + } + ] + }, + "block": { + "type": "SimpleBlock", + "span": { + "start": 138, + "end": 156, + "ctxt": 0 + }, + "name": { + "type": "PreservedToken", + "span": { + "start": 138, + "end": 139, + "ctxt": 0 }, + "token": "LBrace" + }, + "value": [ { - "type": "QualifiedRule", + "type": "Declaration", "span": { - "start": 132, - "end": 156, + "start": 140, + "end": 153, "ctxt": 0 }, - "prelude": { - "type": "SelectorList", + "name": { + "type": "Ident", "span": { - "start": 132, - "end": 137, + "start": 140, + "end": 145, "ctxt": 0 }, - "children": [ - { - "type": "ComplexSelector", - "span": { - "start": 132, - "end": 137, - "ctxt": 0 - }, - "children": [ - { - "type": "CompoundSelector", - "span": { - "start": 132, - "end": 137, - "ctxt": 0 - }, - "nestingSelector": { - "type": "NestingSelector", - "span": { - "start": 132, - "end": 133, - "ctxt": 0 - } - }, - "typeSelector": null, - "subclassSelectors": [ - { - "type": "ClassSelector", - "span": { - "start": 133, - "end": 137, - "ctxt": 0 - }, - "text": { - "type": "Ident", - "span": { - "start": 134, - "end": 137, - "ctxt": 0 - }, - "value": "foo", - "raw": "foo" - } - } - ] - } - ] - } - ] + "value": "color", + "raw": "color" }, - "block": { - "type": "SimpleBlock", - "span": { - "start": 138, - "end": 156, - "ctxt": 0 - }, - "name": { - "type": "PreservedToken", + "value": [ + { + "type": "Ident", "span": { - "start": 138, - "end": 139, + "start": 147, + "end": 153, "ctxt": 0 }, - "token": "LBrace" - }, - "value": [ - { - "type": "Declaration", - "span": { - "start": 140, - "end": 153, - "ctxt": 0 - }, - "name": { - "type": "Ident", - "span": { - "start": 140, - "end": 145, - "ctxt": 0 - }, - "value": "color", - "raw": "color" - }, - "value": [ - { - "type": "Ident", - "span": { - "start": 147, - "end": 153, - "ctxt": 0 - }, - "value": "yellow", - "raw": "yellow" - } - ], - "important": null - } - ] - } + "value": "yellow", + "raw": "yellow" + } + ], + "important": null } ] } diff --git a/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested-2/output.swc-stderr b/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested-2/output.swc-stderr index 1c6a4ba069b3..4c1d145d5338 100644 --- a/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested-2/output.swc-stderr +++ b/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested-2/output.swc-stderr @@ -1,12 +1,6 @@ - x Invalid selector - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:3:5] - 3 | & test; - : ^ - `---- - x Unexpected end of file - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:12:3] - 12 | - : ^ - `---- + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:5:1] + 5 | } + : ^ + `---- diff --git a/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested-2/span.rust-debug b/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested-2/span.rust-debug index 0e9472693f75..645f63000b3a 100644 --- a/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested-2/span.rust-debug +++ b/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested-2/span.rust-debug @@ -16,36 +16,22 @@ `---- x Rule - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:1:1] - 1 | ,-> .class { - 2 | | color: red; - 3 | | & test; - 4 | | background: red - 5 | | } - 6 | | - 7 | | article { - 8 | | color: green; - 9 | | & { color: blue; } - 10 | | color: red; - 11 | | &.foo { color: yellow; } /* valid! */ - 12 | `-> } - `---- + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:1:1] + 1 | ,-> .class { + 2 | | color: red; + 3 | | & test; + 4 | | background: red + 5 | `-> } + `---- x QualifiedRule - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:1:1] - 1 | ,-> .class { - 2 | | color: red; - 3 | | & test; - 4 | | background: red - 5 | | } - 6 | | - 7 | | article { - 8 | | color: green; - 9 | | & { color: blue; } - 10 | | color: red; - 11 | | &.foo { color: yellow; } /* valid! */ - 12 | `-> } - `---- + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:1:1] + 1 | ,-> .class { + 2 | | color: red; + 3 | | & test; + 4 | | background: red + 5 | `-> } + `---- x SelectorList ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:1:1] @@ -84,20 +70,13 @@ `---- x SimpleBlock - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:1:1] - 1 | ,-> .class { - 2 | | color: red; - 3 | | & test; - 4 | | background: red - 5 | | } - 6 | | - 7 | | article { - 8 | | color: green; - 9 | | & { color: blue; } - 10 | | color: red; - 11 | | &.foo { color: yellow; } /* valid! */ - 12 | `-> } - `---- + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:1:1] + 1 | ,-> .class { + 2 | | color: red; + 3 | | & test; + 4 | | background: red + 5 | `-> } + `---- x LBrace ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:1:1] @@ -148,46 +127,58 @@ `---- x ComponentValue - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:3:5] - 3 | ,-> & test; - 4 | | background: red - 5 | | } - 6 | | - 7 | | article { - 8 | | color: green; - 9 | | & { color: blue; } - 10 | | color: red; - 11 | | &.foo { color: yellow; } /* valid! */ - 12 | `-> } - `---- + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] + 4 | background: red + : ^^^^^^^^^^^^^^^ + `---- x StyleBlock - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:3:5] - 3 | ,-> & test; - 4 | | background: red - 5 | | } - 6 | | - 7 | | article { - 8 | | color: green; - 9 | | & { color: blue; } - 10 | | color: red; - 11 | | &.foo { color: yellow; } /* valid! */ - 12 | `-> } - `---- + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] + 4 | background: red + : ^^^^^^^^^^^^^^^ + `---- - x QualifiedRule - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:3:5] - 3 | ,-> & test; - 4 | | background: red - 5 | | } - 6 | | - 7 | | article { - 8 | | color: green; - 9 | | & { color: blue; } - 10 | | color: red; - 11 | | &.foo { color: yellow; } /* valid! */ - 12 | `-> } - `---- + x Declaration + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] + 4 | background: red + : ^^^^^^^^^^^^^^^ + `---- + + x DeclarationName + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] + 4 | background: red + : ^^^^^^^^^^ + `---- + + x Ident + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] + 4 | background: red + : ^^^^^^^^^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] + 4 | background: red + : ^^^ + `---- + + x Ident + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] + 4 | background: red + : ^^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:3:5] + 3 | & test; + : ^^^^^^^ + `---- + + x StyleBlock + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:3:5] + 3 | & test; + : ^^^^^^^ + `---- x ComponentValue ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:3:5] @@ -237,80 +228,66 @@ : ^ `---- - x ComponentValue - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:3:5] - 3 | ,-> & test; - 4 | `-> background: red - `---- - - x WhiteSpace { value: Atom(' - | ' type=inline) } - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:3:5] - 3 | ,-> & test; - 4 | `-> background: red - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] - 4 | background: red - : ^^^^^^^^^^ - `---- - - x Ident { value: Atom('background' type=dynamic), raw: Atom('background' type=dynamic) } - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] - 4 | background: red - : ^^^^^^^^^^ - `---- + x Rule + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:7:1] + 7 | ,-> article { + 8 | | color: green; + 9 | | & { color: blue; } + 10 | | color: red; + 11 | | &.foo { color: yellow; } /* valid! */ + 12 | `-> } + `---- - x ComponentValue - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] - 4 | background: red - : ^ - `---- + x QualifiedRule + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:7:1] + 7 | ,-> article { + 8 | | color: green; + 9 | | & { color: blue; } + 10 | | color: red; + 11 | | &.foo { color: yellow; } /* valid! */ + 12 | `-> } + `---- - x Colon - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] - 4 | background: red - : ^ + x SelectorList + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:7:1] + 7 | article { + : ^^^^^^^ `---- - x ComponentValue - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] - 4 | background: red - : ^ + x ComplexSelector + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:7:1] + 7 | article { + : ^^^^^^^ `---- - x WhiteSpace { value: Atom(' ' type=inline) } - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] - 4 | background: red - : ^ + x CompoundSelector + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:7:1] + 7 | article { + : ^^^^^^^ `---- - x ComponentValue - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] - 4 | background: red - : ^^^ + x TypeSelector + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:7:1] + 7 | article { + : ^^^^^^^ `---- - x Ident { value: Atom('red' type=inline), raw: Atom('red' type=inline) } - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] - 4 | background: red - : ^^^ + x TagNameSelector + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:7:1] + 7 | article { + : ^^^^^^^ `---- - x ComponentValue - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] - 4 | background: red - : ^ - 5 | } + x WqName + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:7:1] + 7 | article { + : ^^^^^^^ `---- - x WhiteSpace { value: Atom(' - | ' type=inline) } - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:4:5] - 4 | background: red - : ^ - 5 | } + x Ident + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested-2/input.css:7:1] + 7 | article { + : ^^^^^^^ `---- x SimpleBlock diff --git a/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested/output.json b/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested/output.json index c90eb9f57b98..12214278521c 100644 --- a/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested/output.json +++ b/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested/output.json @@ -10,7 +10,7 @@ "type": "QualifiedRule", "span": { "start": 1, - "end": 173, + "end": 60, "ctxt": 0 }, "prelude": { @@ -67,7 +67,7 @@ "type": "SimpleBlock", "span": { "start": 8, - "end": 173, + "end": 60, "ctxt": 0 }, "name": { @@ -112,168 +112,298 @@ "important": null }, { - "type": "QualifiedRule", + "type": "Declaration", "span": { - "start": 30, - "end": 172, + "start": 42, + "end": 57, "ctxt": 0 }, - "prelude": { - "type": "ListOfComponentValues", + "name": { + "type": "Ident", "span": { - "start": 30, - "end": 59, + "start": 42, + "end": 52, "ctxt": 0 }, - "children": [ - { - "type": "PreservedToken", - "span": { - "start": 30, - "end": 31, - "ctxt": 0 - }, - "token": { - "Delim": { - "value": "&" - } - } + "value": "background", + "raw": "background" + }, + "value": [ + { + "type": "Ident", + "span": { + "start": 54, + "end": 57, + "ctxt": 0 }, - { - "type": "PreservedToken", - "span": { - "start": 31, - "end": 32, - "ctxt": 0 - }, - "token": { - "WhiteSpace": { - "value": " " - } - } + "value": "red", + "raw": "red" + } + ], + "important": null + }, + { + "type": "ListOfComponentValues", + "span": { + "start": 30, + "end": 37, + "ctxt": 0 + }, + "children": [ + { + "type": "PreservedToken", + "span": { + "start": 30, + "end": 31, + "ctxt": 0 }, - { - "type": "PreservedToken", - "span": { - "start": 32, - "end": 36, - "ctxt": 0 - }, - "token": { - "Ident": { - "value": "test", - "raw": "test" - } + "token": { + "Delim": { + "value": "&" } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 31, + "end": 32, + "ctxt": 0 }, - { - "type": "PreservedToken", - "span": { - "start": 36, - "end": 37, - "ctxt": 0 - }, - "token": "Semi" - }, - { - "type": "PreservedToken", - "span": { - "start": 37, - "end": 42, - "ctxt": 0 - }, - "token": { - "WhiteSpace": { - "value": "\n " - } + "token": { + "WhiteSpace": { + "value": " " } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 32, + "end": 36, + "ctxt": 0 }, - { - "type": "PreservedToken", - "span": { - "start": 42, - "end": 52, - "ctxt": 0 - }, - "token": { - "Ident": { - "value": "background", - "raw": "background" - } + "token": { + "Ident": { + "value": "test", + "raw": "test" } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 36, + "end": 37, + "ctxt": 0 }, - { - "type": "PreservedToken", - "span": { - "start": 52, - "end": 53, - "ctxt": 0 - }, - "token": "Colon" + "token": "Semi" + } + ] + } + ] + } + }, + { + "type": "QualifiedRule", + "span": { + "start": 62, + "end": 172, + "ctxt": 0 + }, + "prelude": { + "type": "SelectorList", + "span": { + "start": 62, + "end": 69, + "ctxt": 0 + }, + "children": [ + { + "type": "ComplexSelector", + "span": { + "start": 62, + "end": 69, + "ctxt": 0 + }, + "children": [ + { + "type": "CompoundSelector", + "span": { + "start": 62, + "end": 69, + "ctxt": 0 }, - { - "type": "PreservedToken", + "nestingSelector": null, + "typeSelector": { + "type": "TagNameSelector", "span": { - "start": 53, - "end": 54, + "start": 62, + "end": 69, "ctxt": 0 }, - "token": { - "WhiteSpace": { - "value": " " + "name": { + "type": "WqName", + "span": { + "start": 62, + "end": 69, + "ctxt": 0 + }, + "prefix": null, + "value": { + "type": "Ident", + "span": { + "start": 62, + "end": 69, + "ctxt": 0 + }, + "value": "article", + "raw": "article" } } }, - { - "type": "PreservedToken", - "span": { - "start": 54, - "end": 57, - "ctxt": 0 - }, - "token": { - "Ident": { - "value": "red", - "raw": "red" - } - } + "subclassSelectors": [] + } + ] + } + ] + }, + "block": { + "type": "SimpleBlock", + "span": { + "start": 70, + "end": 172, + "ctxt": 0 + }, + "name": { + "type": "PreservedToken", + "span": { + "start": 70, + "end": 71, + "ctxt": 0 + }, + "token": "LBrace" + }, + "value": [ + { + "type": "Declaration", + "span": { + "start": 76, + "end": 88, + "ctxt": 0 + }, + "name": { + "type": "Ident", + "span": { + "start": 76, + "end": 81, + "ctxt": 0 + }, + "value": "color", + "raw": "color" + }, + "value": [ + { + "type": "Ident", + "span": { + "start": 83, + "end": 88, + "ctxt": 0 }, - { - "type": "PreservedToken", - "span": { - "start": 57, - "end": 58, - "ctxt": 0 - }, - "token": "Semi" + "value": "green", + "raw": "green" + } + ], + "important": null + }, + { + "type": "Declaration", + "span": { + "start": 117, + "end": 127, + "ctxt": 0 + }, + "name": { + "type": "Ident", + "span": { + "start": 117, + "end": 122, + "ctxt": 0 + }, + "value": "color", + "raw": "color" + }, + "value": [ + { + "type": "Ident", + "span": { + "start": 124, + "end": 127, + "ctxt": 0 }, + "value": "red", + "raw": "red" + } + ], + "important": null + }, + { + "type": "QualifiedRule", + "span": { + "start": 94, + "end": 112, + "ctxt": 0 + }, + "prelude": { + "type": "SelectorList", + "span": { + "start": 94, + "end": 95, + "ctxt": 0 + }, + "children": [ { - "type": "PreservedToken", + "type": "ComplexSelector", "span": { - "start": 58, - "end": 59, + "start": 94, + "end": 95, "ctxt": 0 }, - "token": { - "WhiteSpace": { - "value": "\n" + "children": [ + { + "type": "CompoundSelector", + "span": { + "start": 94, + "end": 95, + "ctxt": 0 + }, + "nestingSelector": { + "type": "NestingSelector", + "span": { + "start": 94, + "end": 95, + "ctxt": 0 + } + }, + "typeSelector": null, + "subclassSelectors": [] } - } + ] } ] }, "block": { "type": "SimpleBlock", "span": { - "start": 70, - "end": 172, + "start": 96, + "end": 112, "ctxt": 0 }, "name": { "type": "PreservedToken", "span": { - "start": 70, - "end": 71, + "start": 96, + "end": 97, "ctxt": 0 }, "token": "LBrace" @@ -282,15 +412,15 @@ { "type": "Declaration", "span": { - "start": 76, - "end": 88, + "start": 98, + "end": 109, "ctxt": 0 }, "name": { "type": "Ident", "span": { - "start": 76, - "end": 81, + "start": 98, + "end": 103, "ctxt": 0 }, "value": "color", @@ -300,257 +430,130 @@ { "type": "Ident", "span": { - "start": 83, - "end": 88, + "start": 105, + "end": 109, "ctxt": 0 }, - "value": "green", - "raw": "green" + "value": "blue", + "raw": "blue" } ], "important": null - }, + } + ] + } + }, + { + "type": "QualifiedRule", + "span": { + "start": 133, + "end": 157, + "ctxt": 0 + }, + "prelude": { + "type": "SelectorList", + "span": { + "start": 133, + "end": 138, + "ctxt": 0 + }, + "children": [ { - "type": "Declaration", + "type": "ComplexSelector", "span": { - "start": 117, - "end": 127, + "start": 133, + "end": 138, "ctxt": 0 }, - "name": { - "type": "Ident", - "span": { - "start": 117, - "end": 122, - "ctxt": 0 - }, - "value": "color", - "raw": "color" - }, - "value": [ + "children": [ { - "type": "Ident", + "type": "CompoundSelector", "span": { - "start": 124, - "end": 127, + "start": 133, + "end": 138, "ctxt": 0 }, - "value": "red", - "raw": "red" - } - ], - "important": null - }, - { - "type": "QualifiedRule", - "span": { - "start": 94, - "end": 112, - "ctxt": 0 - }, - "prelude": { - "type": "SelectorList", - "span": { - "start": 94, - "end": 95, - "ctxt": 0 - }, - "children": [ - { - "type": "ComplexSelector", + "nestingSelector": { + "type": "NestingSelector", "span": { - "start": 94, - "end": 95, + "start": 133, + "end": 134, "ctxt": 0 - }, - "children": [ - { - "type": "CompoundSelector", - "span": { - "start": 94, - "end": 95, - "ctxt": 0 - }, - "nestingSelector": { - "type": "NestingSelector", - "span": { - "start": 94, - "end": 95, - "ctxt": 0 - } - }, - "typeSelector": null, - "subclassSelectors": [] - } - ] - } - ] - }, - "block": { - "type": "SimpleBlock", - "span": { - "start": 96, - "end": 112, - "ctxt": 0 - }, - "name": { - "type": "PreservedToken", - "span": { - "start": 96, - "end": 97, - "ctxt": 0 + } }, - "token": "LBrace" - }, - "value": [ - { - "type": "Declaration", - "span": { - "start": 98, - "end": 109, - "ctxt": 0 - }, - "name": { - "type": "Ident", + "typeSelector": null, + "subclassSelectors": [ + { + "type": "ClassSelector", "span": { - "start": 98, - "end": 103, + "start": 134, + "end": 138, "ctxt": 0 }, - "value": "color", - "raw": "color" - }, - "value": [ - { + "text": { "type": "Ident", "span": { - "start": 105, - "end": 109, + "start": 135, + "end": 138, "ctxt": 0 }, - "value": "blue", - "raw": "blue" + "value": "foo", + "raw": "foo" } - ], - "important": null - } - ] - } + } + ] + } + ] + } + ] + }, + "block": { + "type": "SimpleBlock", + "span": { + "start": 139, + "end": 157, + "ctxt": 0 + }, + "name": { + "type": "PreservedToken", + "span": { + "start": 139, + "end": 140, + "ctxt": 0 }, + "token": "LBrace" + }, + "value": [ { - "type": "QualifiedRule", + "type": "Declaration", "span": { - "start": 133, - "end": 157, + "start": 141, + "end": 154, "ctxt": 0 }, - "prelude": { - "type": "SelectorList", + "name": { + "type": "Ident", "span": { - "start": 133, - "end": 138, + "start": 141, + "end": 146, "ctxt": 0 }, - "children": [ - { - "type": "ComplexSelector", - "span": { - "start": 133, - "end": 138, - "ctxt": 0 - }, - "children": [ - { - "type": "CompoundSelector", - "span": { - "start": 133, - "end": 138, - "ctxt": 0 - }, - "nestingSelector": { - "type": "NestingSelector", - "span": { - "start": 133, - "end": 134, - "ctxt": 0 - } - }, - "typeSelector": null, - "subclassSelectors": [ - { - "type": "ClassSelector", - "span": { - "start": 134, - "end": 138, - "ctxt": 0 - }, - "text": { - "type": "Ident", - "span": { - "start": 135, - "end": 138, - "ctxt": 0 - }, - "value": "foo", - "raw": "foo" - } - } - ] - } - ] - } - ] + "value": "color", + "raw": "color" }, - "block": { - "type": "SimpleBlock", - "span": { - "start": 139, - "end": 157, - "ctxt": 0 - }, - "name": { - "type": "PreservedToken", + "value": [ + { + "type": "Ident", "span": { - "start": 139, - "end": 140, + "start": 148, + "end": 154, "ctxt": 0 }, - "token": "LBrace" - }, - "value": [ - { - "type": "Declaration", - "span": { - "start": 141, - "end": 154, - "ctxt": 0 - }, - "name": { - "type": "Ident", - "span": { - "start": 141, - "end": 146, - "ctxt": 0 - }, - "value": "color", - "raw": "color" - }, - "value": [ - { - "type": "Ident", - "span": { - "start": 148, - "end": 154, - "ctxt": 0 - }, - "value": "yellow", - "raw": "yellow" - } - ], - "important": null - } - ] - } + "value": "yellow", + "raw": "yellow" + } + ], + "important": null } ] } diff --git a/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested/output.swc-stderr b/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested/output.swc-stderr index 74c9e3248797..1c99aacdda4a 100644 --- a/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested/output.swc-stderr +++ b/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested/output.swc-stderr @@ -1,12 +1,6 @@ - x Invalid selector - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:3:5] - 3 | & test; - : ^ - `---- - x Unexpected end of file - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:12:3] - 12 | - : ^ - `---- + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:5:1] + 5 | } + : ^ + `---- diff --git a/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested/span.rust-debug b/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested/span.rust-debug index ed606db059c6..3edbbd023ee8 100644 --- a/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested/span.rust-debug +++ b/crates/swc_css_parser/tests/recovery/style-blocks-contents/invalid-nested/span.rust-debug @@ -16,36 +16,22 @@ `---- x Rule - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:1:1] - 1 | ,-> .class { - 2 | | color: red; - 3 | | & test; - 4 | | background: red; - 5 | | } - 6 | | - 7 | | article { - 8 | | color: green; - 9 | | & { color: blue; } - 10 | | color: red; - 11 | | &.foo { color: yellow; } /* valid! */ - 12 | `-> } - `---- + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:1:1] + 1 | ,-> .class { + 2 | | color: red; + 3 | | & test; + 4 | | background: red; + 5 | `-> } + `---- x QualifiedRule - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:1:1] - 1 | ,-> .class { - 2 | | color: red; - 3 | | & test; - 4 | | background: red; - 5 | | } - 6 | | - 7 | | article { - 8 | | color: green; - 9 | | & { color: blue; } - 10 | | color: red; - 11 | | &.foo { color: yellow; } /* valid! */ - 12 | `-> } - `---- + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:1:1] + 1 | ,-> .class { + 2 | | color: red; + 3 | | & test; + 4 | | background: red; + 5 | `-> } + `---- x SelectorList ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:1:1] @@ -84,20 +70,13 @@ `---- x SimpleBlock - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:1:1] - 1 | ,-> .class { - 2 | | color: red; - 3 | | & test; - 4 | | background: red; - 5 | | } - 6 | | - 7 | | article { - 8 | | color: green; - 9 | | & { color: blue; } - 10 | | color: red; - 11 | | &.foo { color: yellow; } /* valid! */ - 12 | `-> } - `---- + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:1:1] + 1 | ,-> .class { + 2 | | color: red; + 3 | | & test; + 4 | | background: red; + 5 | `-> } + `---- x LBrace ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:1:1] @@ -148,46 +127,58 @@ `---- x ComponentValue - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:3:5] - 3 | ,-> & test; - 4 | | background: red; - 5 | | } - 6 | | - 7 | | article { - 8 | | color: green; - 9 | | & { color: blue; } - 10 | | color: red; - 11 | | &.foo { color: yellow; } /* valid! */ - 12 | `-> } - `---- + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] + 4 | background: red; + : ^^^^^^^^^^^^^^^ + `---- x StyleBlock - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:3:5] - 3 | ,-> & test; - 4 | | background: red; - 5 | | } - 6 | | - 7 | | article { - 8 | | color: green; - 9 | | & { color: blue; } - 10 | | color: red; - 11 | | &.foo { color: yellow; } /* valid! */ - 12 | `-> } - `---- + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] + 4 | background: red; + : ^^^^^^^^^^^^^^^ + `---- - x QualifiedRule - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:3:5] - 3 | ,-> & test; - 4 | | background: red; - 5 | | } - 6 | | - 7 | | article { - 8 | | color: green; - 9 | | & { color: blue; } - 10 | | color: red; - 11 | | &.foo { color: yellow; } /* valid! */ - 12 | `-> } - `---- + x Declaration + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] + 4 | background: red; + : ^^^^^^^^^^^^^^^ + `---- + + x DeclarationName + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] + 4 | background: red; + : ^^^^^^^^^^ + `---- + + x Ident + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] + 4 | background: red; + : ^^^^^^^^^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] + 4 | background: red; + : ^^^ + `---- + + x Ident + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] + 4 | background: red; + : ^^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:3:5] + 3 | & test; + : ^^^^^^^ + `---- + + x StyleBlock + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:3:5] + 3 | & test; + : ^^^^^^^ + `---- x ComponentValue ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:3:5] @@ -237,92 +228,66 @@ : ^ `---- - x ComponentValue - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:3:5] - 3 | ,-> & test; - 4 | `-> background: red; - `---- - - x WhiteSpace { value: Atom(' - | ' type=inline) } - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:3:5] - 3 | ,-> & test; - 4 | `-> background: red; - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] - 4 | background: red; - : ^^^^^^^^^^ - `---- - - x Ident { value: Atom('background' type=dynamic), raw: Atom('background' type=dynamic) } - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] - 4 | background: red; - : ^^^^^^^^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] - 4 | background: red; - : ^ - `---- - - x Colon - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] - 4 | background: red; - : ^ - `---- + x Rule + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:7:1] + 7 | ,-> article { + 8 | | color: green; + 9 | | & { color: blue; } + 10 | | color: red; + 11 | | &.foo { color: yellow; } /* valid! */ + 12 | `-> } + `---- - x ComponentValue - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] - 4 | background: red; - : ^ - `---- + x QualifiedRule + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:7:1] + 7 | ,-> article { + 8 | | color: green; + 9 | | & { color: blue; } + 10 | | color: red; + 11 | | &.foo { color: yellow; } /* valid! */ + 12 | `-> } + `---- - x WhiteSpace { value: Atom(' ' type=inline) } - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] - 4 | background: red; - : ^ + x SelectorList + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:7:1] + 7 | article { + : ^^^^^^^ `---- - x ComponentValue - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] - 4 | background: red; - : ^^^ + x ComplexSelector + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:7:1] + 7 | article { + : ^^^^^^^ `---- - x Ident { value: Atom('red' type=inline), raw: Atom('red' type=inline) } - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] - 4 | background: red; - : ^^^ + x CompoundSelector + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:7:1] + 7 | article { + : ^^^^^^^ `---- - x ComponentValue - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] - 4 | background: red; - : ^ + x TypeSelector + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:7:1] + 7 | article { + : ^^^^^^^ `---- - x Semi - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] - 4 | background: red; - : ^ + x TagNameSelector + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:7:1] + 7 | article { + : ^^^^^^^ `---- - x ComponentValue - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] - 4 | background: red; - : ^ - 5 | } + x WqName + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:7:1] + 7 | article { + : ^^^^^^^ `---- - x WhiteSpace { value: Atom(' - | ' type=inline) } - ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:4:5] - 4 | background: red; - : ^ - 5 | } + x Ident + ,-[$DIR/tests/recovery/style-blocks-contents/invalid-nested/input.css:7:1] + 7 | article { + : ^^^^^^^ `---- x SimpleBlock diff --git a/crates/swc_css_parser/tests/recovery/value/url/basic/output.json b/crates/swc_css_parser/tests/recovery/value/url/basic/output.json index 9da30170b2f2..c434ebb36b70 100644 --- a/crates/swc_css_parser/tests/recovery/value/url/basic/output.json +++ b/crates/swc_css_parser/tests/recovery/value/url/basic/output.json @@ -158,325 +158,6 @@ } ], "important": null - }, - { - "type": "ListOfComponentValues", - "span": { - "start": 86, - "end": 88, - "ctxt": 0 - }, - "children": [ - { - "type": "PreservedToken", - "span": { - "start": 86, - "end": 87, - "ctxt": 0 - }, - "token": "RParen" - }, - { - "type": "PreservedToken", - "span": { - "start": 87, - "end": 88, - "ctxt": 0 - }, - "token": "Semi" - } - ] - }, - { - "type": "Declaration", - "span": { - "start": 93, - "end": 126, - "ctxt": 0 - }, - "name": { - "type": "Ident", - "span": { - "start": 93, - "end": 103, - "ctxt": 0 - }, - "value": "background", - "raw": "background" - }, - "value": [ - { - "type": "Url", - "span": { - "start": 105, - "end": 126, - "ctxt": 0 - }, - "name": { - "type": "Ident", - "span": { - "start": 105, - "end": 108, - "ctxt": 0 - }, - "value": "url", - "raw": "url" - }, - "value": { - "type": "UrlValueRaw", - "span": { - "start": 109, - "end": 125, - "ctxt": 0 - }, - "value": "image.png�", - "before": "", - "raw": "image.png\\999999", - "after": "" - }, - "modifiers": null - } - ], - "important": null - }, - { - "type": "Declaration", - "span": { - "start": 132, - "end": 160, - "ctxt": 0 - }, - "name": { - "type": "Ident", - "span": { - "start": 132, - "end": 142, - "ctxt": 0 - }, - "value": "background", - "raw": "background" - }, - "value": [ - { - "type": "Url", - "span": { - "start": 144, - "end": 160, - "ctxt": 0 - }, - "name": { - "type": "Ident", - "span": { - "start": 144, - "end": 147, - "ctxt": 0 - }, - "value": "url", - "raw": "url" - }, - "value": { - "type": "UrlValueRaw", - "span": { - "start": 148, - "end": 159, - "ctxt": 0 - }, - "value": "image.png�", - "before": "", - "raw": "image.png\\0", - "after": "" - }, - "modifiers": null - } - ], - "important": null - }, - { - "type": "Declaration", - "span": { - "start": 166, - "end": 197, - "ctxt": 0 - }, - "name": { - "type": "Ident", - "span": { - "start": 166, - "end": 176, - "ctxt": 0 - }, - "value": "background", - "raw": "background" - }, - "value": [ - { - "type": "Url", - "span": { - "start": 178, - "end": 197, - "ctxt": 0 - }, - "name": { - "type": "Ident", - "span": { - "start": 178, - "end": 181, - "ctxt": 0 - }, - "value": "url", - "raw": "url" - }, - "value": { - "type": "UrlValueRaw", - "span": { - "start": 182, - "end": 196, - "ctxt": 0 - }, - "value": "image.png�", - "before": "", - "raw": "image.png\\D800", - "after": "" - }, - "modifiers": null - } - ], - "important": null - }, - { - "type": "Declaration", - "span": { - "start": 203, - "end": 234, - "ctxt": 0 - }, - "name": { - "type": "Ident", - "span": { - "start": 203, - "end": 213, - "ctxt": 0 - }, - "value": "background", - "raw": "background" - }, - "value": [ - { - "type": "Url", - "span": { - "start": 215, - "end": 234, - "ctxt": 0 - }, - "name": { - "type": "Ident", - "span": { - "start": 215, - "end": 218, - "ctxt": 0 - }, - "value": "url", - "raw": "url" - }, - "value": { - "type": "UrlValueRaw", - "span": { - "start": 219, - "end": 233, - "ctxt": 0 - }, - "value": "image.png�", - "before": "", - "raw": "image.png\\DFFF", - "after": "" - }, - "modifiers": null - } - ], - "important": null - }, - { - "type": "Declaration", - "span": { - "start": 240, - "end": 273, - "ctxt": 0 - }, - "name": { - "type": "Ident", - "span": { - "start": 240, - "end": 250, - "ctxt": 0 - }, - "value": "background", - "raw": "background" - }, - "value": [ - { - "type": "Url", - "span": { - "start": 252, - "end": 273, - "ctxt": 0 - }, - "name": { - "type": "Ident", - "span": { - "start": 252, - "end": 255, - "ctxt": 0 - }, - "value": "url", - "raw": "url" - }, - "value": { - "type": "UrlValueRaw", - "span": { - "start": 256, - "end": 272, - "ctxt": 0 - }, - "value": "image.png�", - "before": "", - "raw": "image.png\\11FFFF", - "after": "" - }, - "modifiers": null - } - ], - "important": null - }, - { - "type": "Declaration", - "span": { - "start": 279, - "end": 289, - "ctxt": 0 - }, - "name": { - "type": "Ident", - "span": { - "start": 279, - "end": 284, - "ctxt": 0 - }, - "value": "color", - "raw": "color" - }, - "value": [ - { - "type": "Ident", - "span": { - "start": 286, - "end": 289, - "ctxt": 0 - }, - "value": "red", - "raw": "red" - } - ], - "important": null } ] } @@ -591,43 +272,6 @@ } ], "important": null - }, - { - "type": "ListOfComponentValues", - "span": { - "start": 347, - "end": 350, - "ctxt": 0 - }, - "children": [ - { - "type": "PreservedToken", - "span": { - "start": 347, - "end": 348, - "ctxt": 0 - }, - "token": "RParen" - }, - { - "type": "PreservedToken", - "span": { - "start": 348, - "end": 349, - "ctxt": 0 - }, - "token": "RParen" - }, - { - "type": "PreservedToken", - "span": { - "start": 349, - "end": 350, - "ctxt": 0 - }, - "token": "Semi" - } - ] } ] } diff --git a/crates/swc_css_parser/tests/recovery/value/url/basic/output.swc-stderr b/crates/swc_css_parser/tests/recovery/value/url/basic/output.swc-stderr index 1b00cabb5afa..d43377fdc3d5 100644 --- a/crates/swc_css_parser/tests/recovery/value/url/basic/output.swc-stderr +++ b/crates/swc_css_parser/tests/recovery/value/url/basic/output.swc-stderr @@ -17,18 +17,6 @@ : ^ `---- - x Expected whitespace, semicolon, EOF, at-keyword or ident token - ,-[$DIR/tests/recovery/value/url/basic/input.css:3:5] - 3 | background: url(var(--foo)); - : ^ - `---- - - x Expected whitespace, semicolon, EOF, at-keyword or ident token - ,-[$DIR/tests/recovery/value/url/basic/input.css:13:5] - 13 | background: url(image.png param(var(--url))); - : ^ - `---- - x Unexpected character in url ,-[$DIR/tests/recovery/value/url/basic/input.css:3:5] 3 | background: url(var(--foo)); diff --git a/crates/swc_css_parser/tests/recovery/value/url/basic/span.rust-debug b/crates/swc_css_parser/tests/recovery/value/url/basic/span.rust-debug index 7a7591a1747f..504aaf726c21 100644 --- a/crates/swc_css_parser/tests/recovery/value/url/basic/span.rust-debug +++ b/crates/swc_css_parser/tests/recovery/value/url/basic/span.rust-debug @@ -195,384 +195,6 @@ : ^^^^^^^^^^^^^^ `---- - x ComponentValue - ,-[$DIR/tests/recovery/value/url/basic/input.css:3:5] - 3 | background: url(var(--foo)); - : ^^ - `---- - - x StyleBlock - ,-[$DIR/tests/recovery/value/url/basic/input.css:3:5] - 3 | background: url(var(--foo)); - : ^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/value/url/basic/input.css:3:5] - 3 | background: url(var(--foo)); - : ^ - `---- - - x RParen - ,-[$DIR/tests/recovery/value/url/basic/input.css:3:5] - 3 | background: url(var(--foo)); - : ^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/value/url/basic/input.css:3:5] - 3 | background: url(var(--foo)); - : ^ - `---- - - x Semi - ,-[$DIR/tests/recovery/value/url/basic/input.css:3:5] - 3 | background: url(var(--foo)); - : ^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/value/url/basic/input.css:4:5] - 4 | background: url(image.png\999999); - : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x StyleBlock - ,-[$DIR/tests/recovery/value/url/basic/input.css:4:5] - 4 | background: url(image.png\999999); - : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x Declaration - ,-[$DIR/tests/recovery/value/url/basic/input.css:4:5] - 4 | background: url(image.png\999999); - : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x DeclarationName - ,-[$DIR/tests/recovery/value/url/basic/input.css:4:5] - 4 | background: url(image.png\999999); - : ^^^^^^^^^^ - `---- - - x Ident - ,-[$DIR/tests/recovery/value/url/basic/input.css:4:5] - 4 | background: url(image.png\999999); - : ^^^^^^^^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/value/url/basic/input.css:4:5] - 4 | background: url(image.png\999999); - : ^^^^^^^^^^^^^^^^^^^^^ - `---- - - x Url - ,-[$DIR/tests/recovery/value/url/basic/input.css:4:5] - 4 | background: url(image.png\999999); - : ^^^^^^^^^^^^^^^^^^^^^ - `---- - - x Ident - ,-[$DIR/tests/recovery/value/url/basic/input.css:4:5] - 4 | background: url(image.png\999999); - : ^^^ - `---- - - x UrlValue - ,-[$DIR/tests/recovery/value/url/basic/input.css:4:5] - 4 | background: url(image.png\999999); - : ^^^^^^^^^^^^^^^^ - `---- - - x UrlValueRaw - ,-[$DIR/tests/recovery/value/url/basic/input.css:4:5] - 4 | background: url(image.png\999999); - : ^^^^^^^^^^^^^^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/value/url/basic/input.css:5:5] - 5 | background: url(image.png\0); - : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x StyleBlock - ,-[$DIR/tests/recovery/value/url/basic/input.css:5:5] - 5 | background: url(image.png\0); - : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x Declaration - ,-[$DIR/tests/recovery/value/url/basic/input.css:5:5] - 5 | background: url(image.png\0); - : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x DeclarationName - ,-[$DIR/tests/recovery/value/url/basic/input.css:5:5] - 5 | background: url(image.png\0); - : ^^^^^^^^^^ - `---- - - x Ident - ,-[$DIR/tests/recovery/value/url/basic/input.css:5:5] - 5 | background: url(image.png\0); - : ^^^^^^^^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/value/url/basic/input.css:5:5] - 5 | background: url(image.png\0); - : ^^^^^^^^^^^^^^^^ - `---- - - x Url - ,-[$DIR/tests/recovery/value/url/basic/input.css:5:5] - 5 | background: url(image.png\0); - : ^^^^^^^^^^^^^^^^ - `---- - - x Ident - ,-[$DIR/tests/recovery/value/url/basic/input.css:5:5] - 5 | background: url(image.png\0); - : ^^^ - `---- - - x UrlValue - ,-[$DIR/tests/recovery/value/url/basic/input.css:5:5] - 5 | background: url(image.png\0); - : ^^^^^^^^^^^ - `---- - - x UrlValueRaw - ,-[$DIR/tests/recovery/value/url/basic/input.css:5:5] - 5 | background: url(image.png\0); - : ^^^^^^^^^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/value/url/basic/input.css:6:5] - 6 | background: url(image.png\D800); - : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x StyleBlock - ,-[$DIR/tests/recovery/value/url/basic/input.css:6:5] - 6 | background: url(image.png\D800); - : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x Declaration - ,-[$DIR/tests/recovery/value/url/basic/input.css:6:5] - 6 | background: url(image.png\D800); - : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x DeclarationName - ,-[$DIR/tests/recovery/value/url/basic/input.css:6:5] - 6 | background: url(image.png\D800); - : ^^^^^^^^^^ - `---- - - x Ident - ,-[$DIR/tests/recovery/value/url/basic/input.css:6:5] - 6 | background: url(image.png\D800); - : ^^^^^^^^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/value/url/basic/input.css:6:5] - 6 | background: url(image.png\D800); - : ^^^^^^^^^^^^^^^^^^^ - `---- - - x Url - ,-[$DIR/tests/recovery/value/url/basic/input.css:6:5] - 6 | background: url(image.png\D800); - : ^^^^^^^^^^^^^^^^^^^ - `---- - - x Ident - ,-[$DIR/tests/recovery/value/url/basic/input.css:6:5] - 6 | background: url(image.png\D800); - : ^^^ - `---- - - x UrlValue - ,-[$DIR/tests/recovery/value/url/basic/input.css:6:5] - 6 | background: url(image.png\D800); - : ^^^^^^^^^^^^^^ - `---- - - x UrlValueRaw - ,-[$DIR/tests/recovery/value/url/basic/input.css:6:5] - 6 | background: url(image.png\D800); - : ^^^^^^^^^^^^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/value/url/basic/input.css:7:5] - 7 | background: url(image.png\DFFF); - : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x StyleBlock - ,-[$DIR/tests/recovery/value/url/basic/input.css:7:5] - 7 | background: url(image.png\DFFF); - : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x Declaration - ,-[$DIR/tests/recovery/value/url/basic/input.css:7:5] - 7 | background: url(image.png\DFFF); - : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x DeclarationName - ,-[$DIR/tests/recovery/value/url/basic/input.css:7:5] - 7 | background: url(image.png\DFFF); - : ^^^^^^^^^^ - `---- - - x Ident - ,-[$DIR/tests/recovery/value/url/basic/input.css:7:5] - 7 | background: url(image.png\DFFF); - : ^^^^^^^^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/value/url/basic/input.css:7:5] - 7 | background: url(image.png\DFFF); - : ^^^^^^^^^^^^^^^^^^^ - `---- - - x Url - ,-[$DIR/tests/recovery/value/url/basic/input.css:7:5] - 7 | background: url(image.png\DFFF); - : ^^^^^^^^^^^^^^^^^^^ - `---- - - x Ident - ,-[$DIR/tests/recovery/value/url/basic/input.css:7:5] - 7 | background: url(image.png\DFFF); - : ^^^ - `---- - - x UrlValue - ,-[$DIR/tests/recovery/value/url/basic/input.css:7:5] - 7 | background: url(image.png\DFFF); - : ^^^^^^^^^^^^^^ - `---- - - x UrlValueRaw - ,-[$DIR/tests/recovery/value/url/basic/input.css:7:5] - 7 | background: url(image.png\DFFF); - : ^^^^^^^^^^^^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/value/url/basic/input.css:8:5] - 8 | background: url(image.png\11FFFF); - : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x StyleBlock - ,-[$DIR/tests/recovery/value/url/basic/input.css:8:5] - 8 | background: url(image.png\11FFFF); - : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x Declaration - ,-[$DIR/tests/recovery/value/url/basic/input.css:8:5] - 8 | background: url(image.png\11FFFF); - : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - `---- - - x DeclarationName - ,-[$DIR/tests/recovery/value/url/basic/input.css:8:5] - 8 | background: url(image.png\11FFFF); - : ^^^^^^^^^^ - `---- - - x Ident - ,-[$DIR/tests/recovery/value/url/basic/input.css:8:5] - 8 | background: url(image.png\11FFFF); - : ^^^^^^^^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/value/url/basic/input.css:8:5] - 8 | background: url(image.png\11FFFF); - : ^^^^^^^^^^^^^^^^^^^^^ - `---- - - x Url - ,-[$DIR/tests/recovery/value/url/basic/input.css:8:5] - 8 | background: url(image.png\11FFFF); - : ^^^^^^^^^^^^^^^^^^^^^ - `---- - - x Ident - ,-[$DIR/tests/recovery/value/url/basic/input.css:8:5] - 8 | background: url(image.png\11FFFF); - : ^^^ - `---- - - x UrlValue - ,-[$DIR/tests/recovery/value/url/basic/input.css:8:5] - 8 | background: url(image.png\11FFFF); - : ^^^^^^^^^^^^^^^^ - `---- - - x UrlValueRaw - ,-[$DIR/tests/recovery/value/url/basic/input.css:8:5] - 8 | background: url(image.png\11FFFF); - : ^^^^^^^^^^^^^^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/value/url/basic/input.css:9:5] - 9 | color: red; - : ^^^^^^^^^^ - `---- - - x StyleBlock - ,-[$DIR/tests/recovery/value/url/basic/input.css:9:5] - 9 | color: red; - : ^^^^^^^^^^ - `---- - - x Declaration - ,-[$DIR/tests/recovery/value/url/basic/input.css:9:5] - 9 | color: red; - : ^^^^^^^^^^ - `---- - - x DeclarationName - ,-[$DIR/tests/recovery/value/url/basic/input.css:9:5] - 9 | color: red; - : ^^^^^ - `---- - - x Ident - ,-[$DIR/tests/recovery/value/url/basic/input.css:9:5] - 9 | color: red; - : ^^^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/value/url/basic/input.css:9:5] - 9 | color: red; - : ^^^ - `---- - - x Ident - ,-[$DIR/tests/recovery/value/url/basic/input.css:9:5] - 9 | color: red; - : ^^^ - `---- - x Rule ,-[$DIR/tests/recovery/value/url/basic/input.css:12:1] 12 | ,-> .foo { @@ -678,54 +300,6 @@ : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `---- - x ComponentValue - ,-[$DIR/tests/recovery/value/url/basic/input.css:13:5] - 13 | background: url(image.png param(var(--url))); - : ^^^ - `---- - - x StyleBlock - ,-[$DIR/tests/recovery/value/url/basic/input.css:13:5] - 13 | background: url(image.png param(var(--url))); - : ^^^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/value/url/basic/input.css:13:5] - 13 | background: url(image.png param(var(--url))); - : ^ - `---- - - x RParen - ,-[$DIR/tests/recovery/value/url/basic/input.css:13:5] - 13 | background: url(image.png param(var(--url))); - : ^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/value/url/basic/input.css:13:5] - 13 | background: url(image.png param(var(--url))); - : ^ - `---- - - x RParen - ,-[$DIR/tests/recovery/value/url/basic/input.css:13:5] - 13 | background: url(image.png param(var(--url))); - : ^ - `---- - - x ComponentValue - ,-[$DIR/tests/recovery/value/url/basic/input.css:13:5] - 13 | background: url(image.png param(var(--url))); - : ^ - `---- - - x Semi - ,-[$DIR/tests/recovery/value/url/basic/input.css:13:5] - 13 | background: url(image.png param(var(--url))); - : ^ - `---- - x Rule ,-[$DIR/tests/recovery/value/url/basic/input.css:16:1] 16 | ,-> .style { From 1dc8f379b12f7bd3242518285347a1d713c07407 Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Sat, 22 Oct 2022 02:06:39 +0300 Subject: [PATCH 10/19] fix: logic --- crates/swc_css_parser/src/parser/input.rs | 39 +- .../src/parser/values_and_units/mod.rs | 4 + .../recovery/function/unclosed-2/output.json | 17 +- .../function/unclosed-2/span.rust-debug | 13 + .../recovery/function/unclosed/output.json | 17 +- .../function/unclosed/span.rust-debug | 13 + .../tests/recovery/hacks/output.json | 224 ++++++++- .../tests/recovery/hacks/output.swc-stderr | 12 + .../tests/recovery/hacks/span.rust-debug | 252 +++++++++++ .../unclosed-in-function/output.json | 24 +- .../unclosed-in-function/output.swc-stderr | 6 + .../unclosed-in-function/span.rust-debug | 27 +- .../recovery/value/url/basic/output.json | 356 +++++++++++++++ .../value/url/basic/output.swc-stderr | 12 + .../recovery/value/url/basic/span.rust-debug | 426 ++++++++++++++++++ 15 files changed, 1431 insertions(+), 11 deletions(-) diff --git a/crates/swc_css_parser/src/parser/input.rs b/crates/swc_css_parser/src/parser/input.rs index 3391f5aa9aa4..bbef4c5e899c 100644 --- a/crates/swc_css_parser/src/parser/input.rs +++ b/crates/swc_css_parser/src/parser/input.rs @@ -268,17 +268,23 @@ impl<'a> Iterator for TokensInput<'a> { #[derive(Debug)] pub struct ListOfComponentValuesState { idx: Vec, + balance_stack: Vec, } #[derive(Debug)] pub struct ListOfComponentValuesInput<'a> { list: &'a ListOfComponentValues, idx: Vec, + balance_stack: Vec, } impl<'a> ListOfComponentValuesInput<'a> { pub fn new(list: &'a ListOfComponentValues) -> Self { - ListOfComponentValuesInput { list, idx: vec![0] } + ListOfComponentValuesInput { + list, + idx: vec![0], + balance_stack: vec![], + } } fn get_component_value( @@ -399,11 +405,13 @@ impl<'a> ParserInput for ListOfComponentValuesInput<'a> { fn state(&mut self) -> Self::State { ListOfComponentValuesState { idx: self.idx.clone(), + balance_stack: self.balance_stack.clone(), } } fn reset(&mut self, state: &Self::State) { self.idx = state.idx.clone(); + self.balance_stack = state.balance_stack.clone(); } fn take_errors(&mut self) -> Vec { @@ -439,13 +447,38 @@ impl<'a> Iterator for ListOfComponentValuesInput<'a> { }; match &token_and_span.token { - Token::Function { .. } | Token::LParen | Token::LBrace | Token::LBracket => { + Token::Function { .. } | Token::LParen | Token::LBracket | Token::LBrace => { self.idx.push(0); + + let balance = match &token_and_span.token { + Token::Function { .. } | Token::LParen => ')', + Token::LBracket => ']', + Token::LBrace => '}', + _ => { + unreachable!(); + } + }; + + self.balance_stack.push(balance); } token => { match token { Token::RBrace | Token::RBracket | Token::RParen => { - self.idx.pop(); + let value = match token { + Token::RBracket => ']', + Token::RParen => ')', + Token::RBrace => '}', + _ => { + unreachable!(); + } + }; + + if let Some(last) = self.balance_stack.last() { + if value == *last { + self.balance_stack.pop(); + self.idx.pop(); + } + } } _ => {} } diff --git a/crates/swc_css_parser/src/parser/values_and_units/mod.rs b/crates/swc_css_parser/src/parser/values_and_units/mod.rs index 16c8e46b4d20..823adcd697b5 100644 --- a/crates/swc_css_parser/src/parser/values_and_units/mod.rs +++ b/crates/swc_css_parser/src/parser/values_and_units/mod.rs @@ -99,6 +99,10 @@ where // The production matches any sequence of one or more tokens, // so long as the sequence ... loop { + if is!(self, EOF) { + break; + } + match cur!(self) { // ... , , tok!("bad-string") | tok!("bad-url") => { diff --git a/crates/swc_css_parser/tests/recovery/function/unclosed-2/output.json b/crates/swc_css_parser/tests/recovery/function/unclosed-2/output.json index 60061ee9a988..d2a125ca7487 100644 --- a/crates/swc_css_parser/tests/recovery/function/unclosed-2/output.json +++ b/crates/swc_css_parser/tests/recovery/function/unclosed-2/output.json @@ -84,7 +84,7 @@ "type": "Declaration", "span": { "start": 11, - "end": 62, + "end": 63, "ctxt": 0 }, "name": { @@ -102,7 +102,7 @@ "type": "Function", "span": { "start": 34, - "end": 62, + "end": 63, "ctxt": 0 }, "name": { @@ -237,6 +237,19 @@ "ctxt": 0 }, "token": "RBrace" + }, + { + "type": "PreservedToken", + "span": { + "start": 62, + "end": 63, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": "\n" + } + } } ] } diff --git a/crates/swc_css_parser/tests/recovery/function/unclosed-2/span.rust-debug b/crates/swc_css_parser/tests/recovery/function/unclosed-2/span.rust-debug index beb9bb5b605a..4f19225f7e75 100644 --- a/crates/swc_css_parser/tests/recovery/function/unclosed-2/span.rust-debug +++ b/crates/swc_css_parser/tests/recovery/function/unclosed-2/span.rust-debug @@ -233,3 +233,16 @@ 3 | } : ^ `---- + + x ComponentValue + ,-[$DIR/tests/recovery/function/unclosed-2/input.css:3:1] + 3 | } + : ^ + `---- + + x WhiteSpace { value: Atom(' + | ' type=inline) } + ,-[$DIR/tests/recovery/function/unclosed-2/input.css:3:1] + 3 | } + : ^ + `---- diff --git a/crates/swc_css_parser/tests/recovery/function/unclosed/output.json b/crates/swc_css_parser/tests/recovery/function/unclosed/output.json index 04c1b87a1de0..de11c9f5373c 100644 --- a/crates/swc_css_parser/tests/recovery/function/unclosed/output.json +++ b/crates/swc_css_parser/tests/recovery/function/unclosed/output.json @@ -84,7 +84,7 @@ "type": "Declaration", "span": { "start": 11, - "end": 30, + "end": 31, "ctxt": 0 }, "name": { @@ -102,7 +102,7 @@ "type": "Function", "span": { "start": 18, - "end": 30, + "end": 31, "ctxt": 0 }, "name": { @@ -163,6 +163,19 @@ "ctxt": 0 }, "token": "RBrace" + }, + { + "type": "PreservedToken", + "span": { + "start": 30, + "end": 31, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": "\n" + } + } } ] } diff --git a/crates/swc_css_parser/tests/recovery/function/unclosed/span.rust-debug b/crates/swc_css_parser/tests/recovery/function/unclosed/span.rust-debug index 1607d088d380..b1f9ad5f5906 100644 --- a/crates/swc_css_parser/tests/recovery/function/unclosed/span.rust-debug +++ b/crates/swc_css_parser/tests/recovery/function/unclosed/span.rust-debug @@ -167,3 +167,16 @@ 3 | } : ^ `---- + + x ComponentValue + ,-[$DIR/tests/recovery/function/unclosed/input.css:3:1] + 3 | } + : ^ + `---- + + x WhiteSpace { value: Atom(' + | ' type=inline) } + ,-[$DIR/tests/recovery/function/unclosed/input.css:3:1] + 3 | } + : ^ + `---- diff --git a/crates/swc_css_parser/tests/recovery/hacks/output.json b/crates/swc_css_parser/tests/recovery/hacks/output.json index 32f2cf792a80..522badc18eb2 100644 --- a/crates/swc_css_parser/tests/recovery/hacks/output.json +++ b/crates/swc_css_parser/tests/recovery/hacks/output.json @@ -8817,7 +8817,117 @@ }, "token": "LBrace" }, - "value": [] + "value": [ + { + "type": "ListOfComponentValues", + "span": { + "start": 2652, + "end": 2669, + "ctxt": 0 + }, + "children": [ + { + "type": "PreservedToken", + "span": { + "start": 2652, + "end": 2653, + "ctxt": 0 + }, + "token": "RParen" + }, + { + "type": "PreservedToken", + "span": { + "start": 2653, + "end": 2661, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "property", + "raw": "property" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 2661, + "end": 2662, + "ctxt": 0 + }, + "token": "Colon" + }, + { + "type": "PreservedToken", + "span": { + "start": 2662, + "end": 2663, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 2663, + "end": 2668, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "value", + "raw": "value" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 2668, + "end": 2669, + "ctxt": 0 + }, + "token": "Semi" + } + ] + }, + { + "type": "Declaration", + "span": { + "start": 2674, + "end": 2684, + "ctxt": 0 + }, + "name": { + "type": "Ident", + "span": { + "start": 2674, + "end": 2679, + "ctxt": 0 + }, + "value": "color", + "raw": "color" + }, + "value": [ + { + "type": "Ident", + "span": { + "start": 2681, + "end": 2684, + "ctxt": 0 + }, + "value": "red", + "raw": "red" + } + ], + "important": null + } + ] } }, { @@ -10392,7 +10502,117 @@ }, "token": "LBrace" }, - "value": [] + "value": [ + { + "type": "ListOfComponentValues", + "span": { + "start": 3129, + "end": 3146, + "ctxt": 0 + }, + "children": [ + { + "type": "PreservedToken", + "span": { + "start": 3129, + "end": 3130, + "ctxt": 0 + }, + "token": "RBracket" + }, + { + "type": "PreservedToken", + "span": { + "start": 3130, + "end": 3138, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "property", + "raw": "property" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 3138, + "end": 3139, + "ctxt": 0 + }, + "token": "Colon" + }, + { + "type": "PreservedToken", + "span": { + "start": 3139, + "end": 3140, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 3140, + "end": 3145, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "value", + "raw": "value" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 3145, + "end": 3146, + "ctxt": 0 + }, + "token": "Semi" + } + ] + }, + { + "type": "Declaration", + "span": { + "start": 3151, + "end": 3161, + "ctxt": 0 + }, + "name": { + "type": "Ident", + "span": { + "start": 3151, + "end": 3156, + "ctxt": 0 + }, + "value": "color", + "raw": "color" + }, + "value": [ + { + "type": "Ident", + "span": { + "start": 3158, + "end": 3161, + "ctxt": 0 + }, + "value": "red", + "raw": "red" + } + ], + "important": null + } + ] } }, { diff --git a/crates/swc_css_parser/tests/recovery/hacks/output.swc-stderr b/crates/swc_css_parser/tests/recovery/hacks/output.swc-stderr index f5f7d1c6dc28..d9849cca967d 100644 --- a/crates/swc_css_parser/tests/recovery/hacks/output.swc-stderr +++ b/crates/swc_css_parser/tests/recovery/hacks/output.swc-stderr @@ -59,6 +59,12 @@ : ^ `---- + x Expected whitespace, semicolon, EOF, at-keyword or ident token + ,-[$DIR/tests/recovery/hacks/input.css:120:5] + 120 | )property: value; + : ^ + `---- + x Expected whitespace, semicolon, EOF, at-keyword or ident token ,-[$DIR/tests/recovery/hacks/input.css:124:5] 124 | =property: value; @@ -101,6 +107,12 @@ : ^ `---- + x Expected whitespace, semicolon, EOF, at-keyword or ident token + ,-[$DIR/tests/recovery/hacks/input.css:156:5] + 156 | ]property: value; + : ^ + `---- + x Expected whitespace, semicolon, EOF, at-keyword or ident token ,-[$DIR/tests/recovery/hacks/input.css:160:5] 160 | #property: value; diff --git a/crates/swc_css_parser/tests/recovery/hacks/span.rust-debug b/crates/swc_css_parser/tests/recovery/hacks/span.rust-debug index 7c834aa650ed..a107eda85c7d 100644 --- a/crates/swc_css_parser/tests/recovery/hacks/span.rust-debug +++ b/crates/swc_css_parser/tests/recovery/hacks/span.rust-debug @@ -8575,6 +8575,132 @@ : ^ `---- + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:120:5] + 120 | )property: value; + : ^^^^^^^^^^^^^^^^^ + `---- + + x StyleBlock + ,-[$DIR/tests/recovery/hacks/input.css:120:5] + 120 | )property: value; + : ^^^^^^^^^^^^^^^^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:120:5] + 120 | )property: value; + : ^ + `---- + + x RParen + ,-[$DIR/tests/recovery/hacks/input.css:120:5] + 120 | )property: value; + : ^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:120:5] + 120 | )property: value; + : ^^^^^^^^ + `---- + + x Ident { value: Atom('property' type=static), raw: Atom('property' type=static) } + ,-[$DIR/tests/recovery/hacks/input.css:120:5] + 120 | )property: value; + : ^^^^^^^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:120:5] + 120 | )property: value; + : ^ + `---- + + x Colon + ,-[$DIR/tests/recovery/hacks/input.css:120:5] + 120 | )property: value; + : ^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:120:5] + 120 | )property: value; + : ^ + `---- + + x WhiteSpace { value: Atom(' ' type=inline) } + ,-[$DIR/tests/recovery/hacks/input.css:120:5] + 120 | )property: value; + : ^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:120:5] + 120 | )property: value; + : ^^^^^ + `---- + + x Ident { value: Atom('value' type=inline), raw: Atom('value' type=inline) } + ,-[$DIR/tests/recovery/hacks/input.css:120:5] + 120 | )property: value; + : ^^^^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:120:5] + 120 | )property: value; + : ^ + `---- + + x Semi + ,-[$DIR/tests/recovery/hacks/input.css:120:5] + 120 | )property: value; + : ^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:121:5] + 121 | color: red; + : ^^^^^^^^^^ + `---- + + x StyleBlock + ,-[$DIR/tests/recovery/hacks/input.css:121:5] + 121 | color: red; + : ^^^^^^^^^^ + `---- + + x Declaration + ,-[$DIR/tests/recovery/hacks/input.css:121:5] + 121 | color: red; + : ^^^^^^^^^^ + `---- + + x DeclarationName + ,-[$DIR/tests/recovery/hacks/input.css:121:5] + 121 | color: red; + : ^^^^^ + `---- + + x Ident + ,-[$DIR/tests/recovery/hacks/input.css:121:5] + 121 | color: red; + : ^^^^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:121:5] + 121 | color: red; + : ^^^ + `---- + + x Ident + ,-[$DIR/tests/recovery/hacks/input.css:121:5] + 121 | color: red; + : ^^^ + `---- + x Rule ,-[$DIR/tests/recovery/hacks/input.css:123:1] 123 | ,-> .selector { @@ -10159,6 +10285,132 @@ : ^ `---- + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:156:5] + 156 | ]property: value; + : ^^^^^^^^^^^^^^^^^ + `---- + + x StyleBlock + ,-[$DIR/tests/recovery/hacks/input.css:156:5] + 156 | ]property: value; + : ^^^^^^^^^^^^^^^^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:156:5] + 156 | ]property: value; + : ^ + `---- + + x RBracket + ,-[$DIR/tests/recovery/hacks/input.css:156:5] + 156 | ]property: value; + : ^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:156:5] + 156 | ]property: value; + : ^^^^^^^^ + `---- + + x Ident { value: Atom('property' type=static), raw: Atom('property' type=static) } + ,-[$DIR/tests/recovery/hacks/input.css:156:5] + 156 | ]property: value; + : ^^^^^^^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:156:5] + 156 | ]property: value; + : ^ + `---- + + x Colon + ,-[$DIR/tests/recovery/hacks/input.css:156:5] + 156 | ]property: value; + : ^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:156:5] + 156 | ]property: value; + : ^ + `---- + + x WhiteSpace { value: Atom(' ' type=inline) } + ,-[$DIR/tests/recovery/hacks/input.css:156:5] + 156 | ]property: value; + : ^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:156:5] + 156 | ]property: value; + : ^^^^^ + `---- + + x Ident { value: Atom('value' type=inline), raw: Atom('value' type=inline) } + ,-[$DIR/tests/recovery/hacks/input.css:156:5] + 156 | ]property: value; + : ^^^^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:156:5] + 156 | ]property: value; + : ^ + `---- + + x Semi + ,-[$DIR/tests/recovery/hacks/input.css:156:5] + 156 | ]property: value; + : ^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:157:5] + 157 | color: red; + : ^^^^^^^^^^ + `---- + + x StyleBlock + ,-[$DIR/tests/recovery/hacks/input.css:157:5] + 157 | color: red; + : ^^^^^^^^^^ + `---- + + x Declaration + ,-[$DIR/tests/recovery/hacks/input.css:157:5] + 157 | color: red; + : ^^^^^^^^^^ + `---- + + x DeclarationName + ,-[$DIR/tests/recovery/hacks/input.css:157:5] + 157 | color: red; + : ^^^^^ + `---- + + x Ident + ,-[$DIR/tests/recovery/hacks/input.css:157:5] + 157 | color: red; + : ^^^^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/hacks/input.css:157:5] + 157 | color: red; + : ^^^ + `---- + + x Ident + ,-[$DIR/tests/recovery/hacks/input.css:157:5] + 157 | color: red; + : ^^^ + `---- + x Rule ,-[$DIR/tests/recovery/hacks/input.css:159:1] 159 | ,-> .selector { diff --git a/crates/swc_css_parser/tests/recovery/simple-block/unclosed-in-function/output.json b/crates/swc_css_parser/tests/recovery/simple-block/unclosed-in-function/output.json index c556d2d4e5eb..204335c23e06 100644 --- a/crates/swc_css_parser/tests/recovery/simple-block/unclosed-in-function/output.json +++ b/crates/swc_css_parser/tests/recovery/simple-block/unclosed-in-function/output.json @@ -171,6 +171,24 @@ }, "token": "RParen" }, + { + "type": "Delimiter", + "span": { + "start": 55, + "end": 56, + "ctxt": 0 + }, + "value": ";" + }, + { + "type": "PreservedToken", + "span": { + "start": 57, + "end": 58, + "ctxt": 0 + }, + "token": "RBrace" + }, { "type": "PreservedToken", "span": { @@ -178,7 +196,11 @@ "end": 59, "ctxt": 0 }, - "token": "RParen" + "token": { + "WhiteSpace": { + "value": "\n" + } + } } ] } diff --git a/crates/swc_css_parser/tests/recovery/simple-block/unclosed-in-function/output.swc-stderr b/crates/swc_css_parser/tests/recovery/simple-block/unclosed-in-function/output.swc-stderr index 313869cedd7b..7f7e00c0315f 100644 --- a/crates/swc_css_parser/tests/recovery/simple-block/unclosed-in-function/output.swc-stderr +++ b/crates/swc_css_parser/tests/recovery/simple-block/unclosed-in-function/output.swc-stderr @@ -5,6 +5,12 @@ : ^ `---- + x Expected Declaration value + ,-[$DIR/tests/recovery/simple-block/unclosed-in-function/input.css:3:1] + 3 | } + : ^ + `---- + x Expected Declaration value ,-[$DIR/tests/recovery/simple-block/unclosed-in-function/input.css:3:1] 3 | } diff --git a/crates/swc_css_parser/tests/recovery/simple-block/unclosed-in-function/span.rust-debug b/crates/swc_css_parser/tests/recovery/simple-block/unclosed-in-function/span.rust-debug index c68ba50faab4..5a4280a9ec9d 100644 --- a/crates/swc_css_parser/tests/recovery/simple-block/unclosed-in-function/span.rust-debug +++ b/crates/swc_css_parser/tests/recovery/simple-block/unclosed-in-function/span.rust-debug @@ -183,13 +183,38 @@ : ^ `---- + x ComponentValue + ,-[$DIR/tests/recovery/simple-block/unclosed-in-function/input.css:2:5] + 2 | grid-template-columns: repeat(4, [col-start); + : ^ + `---- + + x Delimiter + ,-[$DIR/tests/recovery/simple-block/unclosed-in-function/input.css:2:5] + 2 | grid-template-columns: repeat(4, [col-start); + : ^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/simple-block/unclosed-in-function/input.css:3:1] + 3 | } + : ^ + `---- + + x RBrace + ,-[$DIR/tests/recovery/simple-block/unclosed-in-function/input.css:3:1] + 3 | } + : ^ + `---- + x ComponentValue ,-[$DIR/tests/recovery/simple-block/unclosed-in-function/input.css:3:1] 3 | } : ^ `---- - x RParen + x WhiteSpace { value: Atom(' + | ' type=inline) } ,-[$DIR/tests/recovery/simple-block/unclosed-in-function/input.css:3:1] 3 | } : ^ diff --git a/crates/swc_css_parser/tests/recovery/value/url/basic/output.json b/crates/swc_css_parser/tests/recovery/value/url/basic/output.json index c434ebb36b70..9da30170b2f2 100644 --- a/crates/swc_css_parser/tests/recovery/value/url/basic/output.json +++ b/crates/swc_css_parser/tests/recovery/value/url/basic/output.json @@ -158,6 +158,325 @@ } ], "important": null + }, + { + "type": "ListOfComponentValues", + "span": { + "start": 86, + "end": 88, + "ctxt": 0 + }, + "children": [ + { + "type": "PreservedToken", + "span": { + "start": 86, + "end": 87, + "ctxt": 0 + }, + "token": "RParen" + }, + { + "type": "PreservedToken", + "span": { + "start": 87, + "end": 88, + "ctxt": 0 + }, + "token": "Semi" + } + ] + }, + { + "type": "Declaration", + "span": { + "start": 93, + "end": 126, + "ctxt": 0 + }, + "name": { + "type": "Ident", + "span": { + "start": 93, + "end": 103, + "ctxt": 0 + }, + "value": "background", + "raw": "background" + }, + "value": [ + { + "type": "Url", + "span": { + "start": 105, + "end": 126, + "ctxt": 0 + }, + "name": { + "type": "Ident", + "span": { + "start": 105, + "end": 108, + "ctxt": 0 + }, + "value": "url", + "raw": "url" + }, + "value": { + "type": "UrlValueRaw", + "span": { + "start": 109, + "end": 125, + "ctxt": 0 + }, + "value": "image.png�", + "before": "", + "raw": "image.png\\999999", + "after": "" + }, + "modifiers": null + } + ], + "important": null + }, + { + "type": "Declaration", + "span": { + "start": 132, + "end": 160, + "ctxt": 0 + }, + "name": { + "type": "Ident", + "span": { + "start": 132, + "end": 142, + "ctxt": 0 + }, + "value": "background", + "raw": "background" + }, + "value": [ + { + "type": "Url", + "span": { + "start": 144, + "end": 160, + "ctxt": 0 + }, + "name": { + "type": "Ident", + "span": { + "start": 144, + "end": 147, + "ctxt": 0 + }, + "value": "url", + "raw": "url" + }, + "value": { + "type": "UrlValueRaw", + "span": { + "start": 148, + "end": 159, + "ctxt": 0 + }, + "value": "image.png�", + "before": "", + "raw": "image.png\\0", + "after": "" + }, + "modifiers": null + } + ], + "important": null + }, + { + "type": "Declaration", + "span": { + "start": 166, + "end": 197, + "ctxt": 0 + }, + "name": { + "type": "Ident", + "span": { + "start": 166, + "end": 176, + "ctxt": 0 + }, + "value": "background", + "raw": "background" + }, + "value": [ + { + "type": "Url", + "span": { + "start": 178, + "end": 197, + "ctxt": 0 + }, + "name": { + "type": "Ident", + "span": { + "start": 178, + "end": 181, + "ctxt": 0 + }, + "value": "url", + "raw": "url" + }, + "value": { + "type": "UrlValueRaw", + "span": { + "start": 182, + "end": 196, + "ctxt": 0 + }, + "value": "image.png�", + "before": "", + "raw": "image.png\\D800", + "after": "" + }, + "modifiers": null + } + ], + "important": null + }, + { + "type": "Declaration", + "span": { + "start": 203, + "end": 234, + "ctxt": 0 + }, + "name": { + "type": "Ident", + "span": { + "start": 203, + "end": 213, + "ctxt": 0 + }, + "value": "background", + "raw": "background" + }, + "value": [ + { + "type": "Url", + "span": { + "start": 215, + "end": 234, + "ctxt": 0 + }, + "name": { + "type": "Ident", + "span": { + "start": 215, + "end": 218, + "ctxt": 0 + }, + "value": "url", + "raw": "url" + }, + "value": { + "type": "UrlValueRaw", + "span": { + "start": 219, + "end": 233, + "ctxt": 0 + }, + "value": "image.png�", + "before": "", + "raw": "image.png\\DFFF", + "after": "" + }, + "modifiers": null + } + ], + "important": null + }, + { + "type": "Declaration", + "span": { + "start": 240, + "end": 273, + "ctxt": 0 + }, + "name": { + "type": "Ident", + "span": { + "start": 240, + "end": 250, + "ctxt": 0 + }, + "value": "background", + "raw": "background" + }, + "value": [ + { + "type": "Url", + "span": { + "start": 252, + "end": 273, + "ctxt": 0 + }, + "name": { + "type": "Ident", + "span": { + "start": 252, + "end": 255, + "ctxt": 0 + }, + "value": "url", + "raw": "url" + }, + "value": { + "type": "UrlValueRaw", + "span": { + "start": 256, + "end": 272, + "ctxt": 0 + }, + "value": "image.png�", + "before": "", + "raw": "image.png\\11FFFF", + "after": "" + }, + "modifiers": null + } + ], + "important": null + }, + { + "type": "Declaration", + "span": { + "start": 279, + "end": 289, + "ctxt": 0 + }, + "name": { + "type": "Ident", + "span": { + "start": 279, + "end": 284, + "ctxt": 0 + }, + "value": "color", + "raw": "color" + }, + "value": [ + { + "type": "Ident", + "span": { + "start": 286, + "end": 289, + "ctxt": 0 + }, + "value": "red", + "raw": "red" + } + ], + "important": null } ] } @@ -272,6 +591,43 @@ } ], "important": null + }, + { + "type": "ListOfComponentValues", + "span": { + "start": 347, + "end": 350, + "ctxt": 0 + }, + "children": [ + { + "type": "PreservedToken", + "span": { + "start": 347, + "end": 348, + "ctxt": 0 + }, + "token": "RParen" + }, + { + "type": "PreservedToken", + "span": { + "start": 348, + "end": 349, + "ctxt": 0 + }, + "token": "RParen" + }, + { + "type": "PreservedToken", + "span": { + "start": 349, + "end": 350, + "ctxt": 0 + }, + "token": "Semi" + } + ] } ] } diff --git a/crates/swc_css_parser/tests/recovery/value/url/basic/output.swc-stderr b/crates/swc_css_parser/tests/recovery/value/url/basic/output.swc-stderr index d43377fdc3d5..1b00cabb5afa 100644 --- a/crates/swc_css_parser/tests/recovery/value/url/basic/output.swc-stderr +++ b/crates/swc_css_parser/tests/recovery/value/url/basic/output.swc-stderr @@ -17,6 +17,18 @@ : ^ `---- + x Expected whitespace, semicolon, EOF, at-keyword or ident token + ,-[$DIR/tests/recovery/value/url/basic/input.css:3:5] + 3 | background: url(var(--foo)); + : ^ + `---- + + x Expected whitespace, semicolon, EOF, at-keyword or ident token + ,-[$DIR/tests/recovery/value/url/basic/input.css:13:5] + 13 | background: url(image.png param(var(--url))); + : ^ + `---- + x Unexpected character in url ,-[$DIR/tests/recovery/value/url/basic/input.css:3:5] 3 | background: url(var(--foo)); diff --git a/crates/swc_css_parser/tests/recovery/value/url/basic/span.rust-debug b/crates/swc_css_parser/tests/recovery/value/url/basic/span.rust-debug index 504aaf726c21..7a7591a1747f 100644 --- a/crates/swc_css_parser/tests/recovery/value/url/basic/span.rust-debug +++ b/crates/swc_css_parser/tests/recovery/value/url/basic/span.rust-debug @@ -195,6 +195,384 @@ : ^^^^^^^^^^^^^^ `---- + x ComponentValue + ,-[$DIR/tests/recovery/value/url/basic/input.css:3:5] + 3 | background: url(var(--foo)); + : ^^ + `---- + + x StyleBlock + ,-[$DIR/tests/recovery/value/url/basic/input.css:3:5] + 3 | background: url(var(--foo)); + : ^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/value/url/basic/input.css:3:5] + 3 | background: url(var(--foo)); + : ^ + `---- + + x RParen + ,-[$DIR/tests/recovery/value/url/basic/input.css:3:5] + 3 | background: url(var(--foo)); + : ^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/value/url/basic/input.css:3:5] + 3 | background: url(var(--foo)); + : ^ + `---- + + x Semi + ,-[$DIR/tests/recovery/value/url/basic/input.css:3:5] + 3 | background: url(var(--foo)); + : ^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/value/url/basic/input.css:4:5] + 4 | background: url(image.png\999999); + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x StyleBlock + ,-[$DIR/tests/recovery/value/url/basic/input.css:4:5] + 4 | background: url(image.png\999999); + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x Declaration + ,-[$DIR/tests/recovery/value/url/basic/input.css:4:5] + 4 | background: url(image.png\999999); + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x DeclarationName + ,-[$DIR/tests/recovery/value/url/basic/input.css:4:5] + 4 | background: url(image.png\999999); + : ^^^^^^^^^^ + `---- + + x Ident + ,-[$DIR/tests/recovery/value/url/basic/input.css:4:5] + 4 | background: url(image.png\999999); + : ^^^^^^^^^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/value/url/basic/input.css:4:5] + 4 | background: url(image.png\999999); + : ^^^^^^^^^^^^^^^^^^^^^ + `---- + + x Url + ,-[$DIR/tests/recovery/value/url/basic/input.css:4:5] + 4 | background: url(image.png\999999); + : ^^^^^^^^^^^^^^^^^^^^^ + `---- + + x Ident + ,-[$DIR/tests/recovery/value/url/basic/input.css:4:5] + 4 | background: url(image.png\999999); + : ^^^ + `---- + + x UrlValue + ,-[$DIR/tests/recovery/value/url/basic/input.css:4:5] + 4 | background: url(image.png\999999); + : ^^^^^^^^^^^^^^^^ + `---- + + x UrlValueRaw + ,-[$DIR/tests/recovery/value/url/basic/input.css:4:5] + 4 | background: url(image.png\999999); + : ^^^^^^^^^^^^^^^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/value/url/basic/input.css:5:5] + 5 | background: url(image.png\0); + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x StyleBlock + ,-[$DIR/tests/recovery/value/url/basic/input.css:5:5] + 5 | background: url(image.png\0); + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x Declaration + ,-[$DIR/tests/recovery/value/url/basic/input.css:5:5] + 5 | background: url(image.png\0); + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x DeclarationName + ,-[$DIR/tests/recovery/value/url/basic/input.css:5:5] + 5 | background: url(image.png\0); + : ^^^^^^^^^^ + `---- + + x Ident + ,-[$DIR/tests/recovery/value/url/basic/input.css:5:5] + 5 | background: url(image.png\0); + : ^^^^^^^^^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/value/url/basic/input.css:5:5] + 5 | background: url(image.png\0); + : ^^^^^^^^^^^^^^^^ + `---- + + x Url + ,-[$DIR/tests/recovery/value/url/basic/input.css:5:5] + 5 | background: url(image.png\0); + : ^^^^^^^^^^^^^^^^ + `---- + + x Ident + ,-[$DIR/tests/recovery/value/url/basic/input.css:5:5] + 5 | background: url(image.png\0); + : ^^^ + `---- + + x UrlValue + ,-[$DIR/tests/recovery/value/url/basic/input.css:5:5] + 5 | background: url(image.png\0); + : ^^^^^^^^^^^ + `---- + + x UrlValueRaw + ,-[$DIR/tests/recovery/value/url/basic/input.css:5:5] + 5 | background: url(image.png\0); + : ^^^^^^^^^^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/value/url/basic/input.css:6:5] + 6 | background: url(image.png\D800); + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x StyleBlock + ,-[$DIR/tests/recovery/value/url/basic/input.css:6:5] + 6 | background: url(image.png\D800); + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x Declaration + ,-[$DIR/tests/recovery/value/url/basic/input.css:6:5] + 6 | background: url(image.png\D800); + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x DeclarationName + ,-[$DIR/tests/recovery/value/url/basic/input.css:6:5] + 6 | background: url(image.png\D800); + : ^^^^^^^^^^ + `---- + + x Ident + ,-[$DIR/tests/recovery/value/url/basic/input.css:6:5] + 6 | background: url(image.png\D800); + : ^^^^^^^^^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/value/url/basic/input.css:6:5] + 6 | background: url(image.png\D800); + : ^^^^^^^^^^^^^^^^^^^ + `---- + + x Url + ,-[$DIR/tests/recovery/value/url/basic/input.css:6:5] + 6 | background: url(image.png\D800); + : ^^^^^^^^^^^^^^^^^^^ + `---- + + x Ident + ,-[$DIR/tests/recovery/value/url/basic/input.css:6:5] + 6 | background: url(image.png\D800); + : ^^^ + `---- + + x UrlValue + ,-[$DIR/tests/recovery/value/url/basic/input.css:6:5] + 6 | background: url(image.png\D800); + : ^^^^^^^^^^^^^^ + `---- + + x UrlValueRaw + ,-[$DIR/tests/recovery/value/url/basic/input.css:6:5] + 6 | background: url(image.png\D800); + : ^^^^^^^^^^^^^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/value/url/basic/input.css:7:5] + 7 | background: url(image.png\DFFF); + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x StyleBlock + ,-[$DIR/tests/recovery/value/url/basic/input.css:7:5] + 7 | background: url(image.png\DFFF); + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x Declaration + ,-[$DIR/tests/recovery/value/url/basic/input.css:7:5] + 7 | background: url(image.png\DFFF); + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x DeclarationName + ,-[$DIR/tests/recovery/value/url/basic/input.css:7:5] + 7 | background: url(image.png\DFFF); + : ^^^^^^^^^^ + `---- + + x Ident + ,-[$DIR/tests/recovery/value/url/basic/input.css:7:5] + 7 | background: url(image.png\DFFF); + : ^^^^^^^^^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/value/url/basic/input.css:7:5] + 7 | background: url(image.png\DFFF); + : ^^^^^^^^^^^^^^^^^^^ + `---- + + x Url + ,-[$DIR/tests/recovery/value/url/basic/input.css:7:5] + 7 | background: url(image.png\DFFF); + : ^^^^^^^^^^^^^^^^^^^ + `---- + + x Ident + ,-[$DIR/tests/recovery/value/url/basic/input.css:7:5] + 7 | background: url(image.png\DFFF); + : ^^^ + `---- + + x UrlValue + ,-[$DIR/tests/recovery/value/url/basic/input.css:7:5] + 7 | background: url(image.png\DFFF); + : ^^^^^^^^^^^^^^ + `---- + + x UrlValueRaw + ,-[$DIR/tests/recovery/value/url/basic/input.css:7:5] + 7 | background: url(image.png\DFFF); + : ^^^^^^^^^^^^^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/value/url/basic/input.css:8:5] + 8 | background: url(image.png\11FFFF); + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x StyleBlock + ,-[$DIR/tests/recovery/value/url/basic/input.css:8:5] + 8 | background: url(image.png\11FFFF); + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x Declaration + ,-[$DIR/tests/recovery/value/url/basic/input.css:8:5] + 8 | background: url(image.png\11FFFF); + : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + `---- + + x DeclarationName + ,-[$DIR/tests/recovery/value/url/basic/input.css:8:5] + 8 | background: url(image.png\11FFFF); + : ^^^^^^^^^^ + `---- + + x Ident + ,-[$DIR/tests/recovery/value/url/basic/input.css:8:5] + 8 | background: url(image.png\11FFFF); + : ^^^^^^^^^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/value/url/basic/input.css:8:5] + 8 | background: url(image.png\11FFFF); + : ^^^^^^^^^^^^^^^^^^^^^ + `---- + + x Url + ,-[$DIR/tests/recovery/value/url/basic/input.css:8:5] + 8 | background: url(image.png\11FFFF); + : ^^^^^^^^^^^^^^^^^^^^^ + `---- + + x Ident + ,-[$DIR/tests/recovery/value/url/basic/input.css:8:5] + 8 | background: url(image.png\11FFFF); + : ^^^ + `---- + + x UrlValue + ,-[$DIR/tests/recovery/value/url/basic/input.css:8:5] + 8 | background: url(image.png\11FFFF); + : ^^^^^^^^^^^^^^^^ + `---- + + x UrlValueRaw + ,-[$DIR/tests/recovery/value/url/basic/input.css:8:5] + 8 | background: url(image.png\11FFFF); + : ^^^^^^^^^^^^^^^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/value/url/basic/input.css:9:5] + 9 | color: red; + : ^^^^^^^^^^ + `---- + + x StyleBlock + ,-[$DIR/tests/recovery/value/url/basic/input.css:9:5] + 9 | color: red; + : ^^^^^^^^^^ + `---- + + x Declaration + ,-[$DIR/tests/recovery/value/url/basic/input.css:9:5] + 9 | color: red; + : ^^^^^^^^^^ + `---- + + x DeclarationName + ,-[$DIR/tests/recovery/value/url/basic/input.css:9:5] + 9 | color: red; + : ^^^^^ + `---- + + x Ident + ,-[$DIR/tests/recovery/value/url/basic/input.css:9:5] + 9 | color: red; + : ^^^^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/value/url/basic/input.css:9:5] + 9 | color: red; + : ^^^ + `---- + + x Ident + ,-[$DIR/tests/recovery/value/url/basic/input.css:9:5] + 9 | color: red; + : ^^^ + `---- + x Rule ,-[$DIR/tests/recovery/value/url/basic/input.css:12:1] 12 | ,-> .foo { @@ -300,6 +678,54 @@ : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `---- + x ComponentValue + ,-[$DIR/tests/recovery/value/url/basic/input.css:13:5] + 13 | background: url(image.png param(var(--url))); + : ^^^ + `---- + + x StyleBlock + ,-[$DIR/tests/recovery/value/url/basic/input.css:13:5] + 13 | background: url(image.png param(var(--url))); + : ^^^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/value/url/basic/input.css:13:5] + 13 | background: url(image.png param(var(--url))); + : ^ + `---- + + x RParen + ,-[$DIR/tests/recovery/value/url/basic/input.css:13:5] + 13 | background: url(image.png param(var(--url))); + : ^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/value/url/basic/input.css:13:5] + 13 | background: url(image.png param(var(--url))); + : ^ + `---- + + x RParen + ,-[$DIR/tests/recovery/value/url/basic/input.css:13:5] + 13 | background: url(image.png param(var(--url))); + : ^ + `---- + + x ComponentValue + ,-[$DIR/tests/recovery/value/url/basic/input.css:13:5] + 13 | background: url(image.png param(var(--url))); + : ^ + `---- + + x Semi + ,-[$DIR/tests/recovery/value/url/basic/input.css:13:5] + 13 | background: url(image.png param(var(--url))); + : ^ + `---- + x Rule ,-[$DIR/tests/recovery/value/url/basic/input.css:16:1] 16 | ,-> .style { From f547f78ee8470d0896b6be756e68ee617d0ef853 Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Sat, 22 Oct 2022 02:28:36 +0300 Subject: [PATCH 11/19] fix: logic --- .../swc_css_parser/src/parser/at_rules/mod.rs | 37 ++++++++++--------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/crates/swc_css_parser/src/parser/at_rules/mod.rs b/crates/swc_css_parser/src/parser/at_rules/mod.rs index 4a4ff825a371..0418646cd822 100644 --- a/crates/swc_css_parser/src/parser/at_rules/mod.rs +++ b/crates/swc_css_parser/src/parser/at_rules/mod.rs @@ -171,7 +171,7 @@ where parser.input.skip_ws(); let prelude = if is!(parser, Ident) { - let mut name_list = vec![]; + let mut name_list: Vec = vec![]; while is!(parser, Ident) { name_list.push(parser.parse()?); @@ -185,23 +185,26 @@ where } } - match name_list.len() == 1 { - // Block - true => Some(AtRulePrelude::LayerPrelude(LayerPrelude::Name( - name_list.remove(0), - ))), - // Statement - false => { - let first = name_list[0].span; - let last = name_list[name_list.len() - 1].span; - - Some(AtRulePrelude::LayerPrelude(LayerPrelude::NameList( - LayerNameList { - name_list, - span: Span::new(first.lo, last.hi, Default::default()), - }, - ))) + if is!(parser, ";") { + let first = name_list[0].span; + let last = name_list[name_list.len() - 1].span; + + Some(AtRulePrelude::LayerPrelude(LayerPrelude::NameList( + LayerNameList { + name_list, + span: Span::new(first.lo, last.hi, Default::default()), + }, + ))) + } else { + if name_list.len() > 1 { + let span = parser.input.cur_span(); + + return Err(Error::new(span, ErrorKind::Expected("';' token"))); } + + Some(AtRulePrelude::LayerPrelude(LayerPrelude::Name( + name_list.remove(0), + ))) } } else { None From 033a36a5170fdab633600196d7f366a626cef811 Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Sat, 22 Oct 2022 02:30:06 +0300 Subject: [PATCH 12/19] test: fix --- .../tests/fixture/compress-at-rule/layer/input.css | 12 ++++++++++-- .../fixture/compress-at-rule/layer/output.min.css | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/crates/swc_css_minifier/tests/fixture/compress-at-rule/layer/input.css b/crates/swc_css_minifier/tests/fixture/compress-at-rule/layer/input.css index a9d811809641..106ec1d881c3 100644 --- a/crates/swc_css_minifier/tests/fixture/compress-at-rule/layer/input.css +++ b/crates/swc_css_minifier/tests/fixture/compress-at-rule/layer/input.css @@ -43,10 +43,18 @@ } @layer { - @layer foo { color: red; } + @layer foo { + .class { + color: red; + } + } } @layer { - @layer foo { color: red; } + @layer foo { + .class { + color: red; + } + } } @layer framework { diff --git a/crates/swc_css_minifier/tests/fixture/compress-at-rule/layer/output.min.css b/crates/swc_css_minifier/tests/fixture/compress-at-rule/layer/output.min.css index 560e88df4597..a7c924a8a9ec 100644 --- a/crates/swc_css_minifier/tests/fixture/compress-at-rule/layer/output.min.css +++ b/crates/swc_css_minifier/tests/fixture/compress-at-rule/layer/output.min.css @@ -1 +1 @@ -@layer default,theme,components;@layer foo.bar;@layer foo.bar,baz;@layer a{@layer b{div{color:yellow;margin:0}}}@layer framework{@layer base{p{margin-block:.75em}}@layer theme{p{color:#222}}}@layer framework.theme{blockquote{color:rebeccapurple}}@layer{@layer foo{.class{color:red}color: red; {@layer foo{color: red; {h1, h2 { color: maroon;background:white}@media(prefers-color-scheme:dark){h1,h2{color:red;background:black}}.foo{color:red;background:#fff}.baz{color:#fff}}}}} +@layer default,theme,components;@layer foo.bar;@layer foo.bar,baz;@layer a{@layer b{div{color:yellow;margin:0}}}@layer framework{@layer base{p{margin-block:.75em}}@layer theme{p{color:#222}}}@layer framework.theme{blockquote{color:rebeccapurple}}@layer{@layer foo{.class{color:red}}}@layer framework{h1,h2{color:maroon;background:white}@media(prefers-color-scheme:dark){h1,h2{color:red;background:black}}}@layer foo{.foo{color:red;background:#fff}.baz{color:#fff}} From 493861f3e0922d09e872c89d14baaa58c4b345ae Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Sat, 22 Oct 2022 03:20:26 +0300 Subject: [PATCH 13/19] fix: logic --- crates/swc_css_parser/src/parser/util.rs | 2 +- .../tests/fixture/at-rule/container/output.json | 16 ++++++++-------- .../fixture/at-rule/container/span.rust-debug | 16 ++++++++-------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/crates/swc_css_parser/src/parser/util.rs b/crates/swc_css_parser/src/parser/util.rs index 64964bf9e9dc..26677edcad78 100644 --- a/crates/swc_css_parser/src/parser/util.rs +++ b/crates/swc_css_parser/src/parser/util.rs @@ -51,7 +51,7 @@ where { let lexer = ListOfComponentValuesInput::new(list_of_component_values); let mut parser = Parser::new(lexer, self.config); - let res = parser.parse(); + let res = parser.with_ctx(self.ctx).parse_as(); self.errors.extend(parser.take_errors()); diff --git a/crates/swc_css_parser/tests/fixture/at-rule/container/output.json b/crates/swc_css_parser/tests/fixture/at-rule/container/output.json index be33499b5a91..7f318eef3ee2 100644 --- a/crates/swc_css_parser/tests/fixture/at-rule/container/output.json +++ b/crates/swc_css_parser/tests/fixture/at-rule/container/output.json @@ -2560,7 +2560,7 @@ }, "expressions": [ { - "type": "UnknownDimension", + "type": "Length", "span": { "start": 973, "end": 977, @@ -2883,7 +2883,7 @@ }, "expressions": [ { - "type": "UnknownDimension", + "type": "Length", "span": { "start": 1052, "end": 1056, @@ -3206,7 +3206,7 @@ }, "expressions": [ { - "type": "UnknownDimension", + "type": "Length", "span": { "start": 1131, "end": 1135, @@ -3529,7 +3529,7 @@ }, "expressions": [ { - "type": "UnknownDimension", + "type": "Length", "span": { "start": 1210, "end": 1214, @@ -3852,7 +3852,7 @@ }, "expressions": [ { - "type": "UnknownDimension", + "type": "Length", "span": { "start": 1289, "end": 1295, @@ -4175,7 +4175,7 @@ }, "expressions": [ { - "type": "UnknownDimension", + "type": "Length", "span": { "start": 1370, "end": 1376, @@ -4637,7 +4637,7 @@ }, "expressions": [ { - "type": "UnknownDimension", + "type": "Length", "span": { "start": 1505, "end": 1511, @@ -7109,7 +7109,7 @@ }, "expressions": [ { - "type": "UnknownDimension", + "type": "Length", "span": { "start": 2459, "end": 2463, diff --git a/crates/swc_css_parser/tests/fixture/at-rule/container/span.rust-debug b/crates/swc_css_parser/tests/fixture/at-rule/container/span.rust-debug index 36c3e3e75dec..4008c0290790 100644 --- a/crates/swc_css_parser/tests/fixture/at-rule/container/span.rust-debug +++ b/crates/swc_css_parser/tests/fixture/at-rule/container/span.rust-debug @@ -2487,7 +2487,7 @@ : ^^^^ `---- - x UnknownDimension + x Length ,-[$DIR/tests/fixture/at-rule/container/input.css:51:5] 51 | h2 { font-size: calc(1.2em + 1cqw); } : ^^^^ @@ -2796,7 +2796,7 @@ : ^^^^ `---- - x UnknownDimension + x Length ,-[$DIR/tests/fixture/at-rule/container/input.css:55:5] 55 | h2 { font-size: calc(1.2em + 1cqh); } : ^^^^ @@ -3105,7 +3105,7 @@ : ^^^^ `---- - x UnknownDimension + x Length ,-[$DIR/tests/fixture/at-rule/container/input.css:59:5] 59 | h2 { font-size: calc(1.2em + 1cqi); } : ^^^^ @@ -3414,7 +3414,7 @@ : ^^^^ `---- - x UnknownDimension + x Length ,-[$DIR/tests/fixture/at-rule/container/input.css:63:5] 63 | h2 { font-size: calc(1.2em + 1cqb); } : ^^^^ @@ -3723,7 +3723,7 @@ : ^^^^^^ `---- - x UnknownDimension + x Length ,-[$DIR/tests/fixture/at-rule/container/input.css:67:5] 67 | h2 { font-size: calc(1.2em + 1cqmin); } : ^^^^^^ @@ -4032,7 +4032,7 @@ : ^^^^^^ `---- - x UnknownDimension + x Length ,-[$DIR/tests/fixture/at-rule/container/input.css:71:5] 71 | h2 { font-size: calc(1.2em + 1cqmax); } : ^^^^^^ @@ -4459,7 +4459,7 @@ : ^^^^^^ `---- - x UnknownDimension + x Length ,-[$DIR/tests/fixture/at-rule/container/input.css:76:9] 76 | h2 { font-size: calc(1.2em + 1cqmax); } : ^^^^^^ @@ -6731,7 +6731,7 @@ : ^^^^ `---- - x UnknownDimension + x Length ,-[$DIR/tests/fixture/at-rule/container/input.css:133:1] 133 | @container(inline-size>=calc(200px)){h2{font-size:calc(1.2em + 1cqi)}} : ^^^^ From 53c679603fed89b273366ff843ad099e9e04c269 Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Sat, 22 Oct 2022 03:35:02 +0300 Subject: [PATCH 14/19] test: fix TODO --- .../tests/fixture/qualified_rule/recovery-1/input.css | 7 +++++++ .../tests/fixture/qualified_rule/recovery-1/output.css | 10 ++++++++++ .../fixture/qualified_rule/recovery-1/output.min.css | 5 +++++ 3 files changed, 22 insertions(+) create mode 100644 crates/swc_css_codegen/tests/fixture/qualified_rule/recovery-1/input.css create mode 100644 crates/swc_css_codegen/tests/fixture/qualified_rule/recovery-1/output.css create mode 100644 crates/swc_css_codegen/tests/fixture/qualified_rule/recovery-1/output.min.css diff --git a/crates/swc_css_codegen/tests/fixture/qualified_rule/recovery-1/input.css b/crates/swc_css_codegen/tests/fixture/qualified_rule/recovery-1/input.css new file mode 100644 index 000000000000..45663b488a74 --- /dev/null +++ b/crates/swc_css_codegen/tests/fixture/qualified_rule/recovery-1/input.css @@ -0,0 +1,7 @@ +a {}; + +b {}; + +c { } + +c {color: red; } diff --git a/crates/swc_css_codegen/tests/fixture/qualified_rule/recovery-1/output.css b/crates/swc_css_codegen/tests/fixture/qualified_rule/recovery-1/output.css new file mode 100644 index 000000000000..31594f07a56c --- /dev/null +++ b/crates/swc_css_codegen/tests/fixture/qualified_rule/recovery-1/output.css @@ -0,0 +1,10 @@ +a {} +; + +b {} +; + +c {} +c { + color: red; +} diff --git a/crates/swc_css_codegen/tests/fixture/qualified_rule/recovery-1/output.min.css b/crates/swc_css_codegen/tests/fixture/qualified_rule/recovery-1/output.min.css new file mode 100644 index 000000000000..dd5a25ce57b4 --- /dev/null +++ b/crates/swc_css_codegen/tests/fixture/qualified_rule/recovery-1/output.min.css @@ -0,0 +1,5 @@ +a{}; + +b {}; + +c {}c{color:red} From 235b62ac6cf5cd4370655629122b370b9b104004 Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Sat, 22 Oct 2022 03:44:36 +0300 Subject: [PATCH 15/19] fix: logic and todo (already) --- .../tests/fixture/qualified_rule/recovery/input.css | 2 -- .../tests/fixture/qualified_rule/recovery/output.css | 5 +++-- .../tests/fixture/qualified_rule/recovery/output.min.css | 6 ++++-- crates/swc_css_parser/src/parser/syntax/mod.rs | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/crates/swc_css_codegen/tests/fixture/qualified_rule/recovery/input.css b/crates/swc_css_codegen/tests/fixture/qualified_rule/recovery/input.css index a5f49a31ce01..282a4d1cfa2b 100644 --- a/crates/swc_css_codegen/tests/fixture/qualified_rule/recovery/input.css +++ b/crates/swc_css_codegen/tests/fixture/qualified_rule/recovery/input.css @@ -17,8 +17,6 @@ $bad foo { color: red } $bad: rule; -/* TODO: FIX ME */ -/* a {}; b {}; */ a { div.major { color: blue } color: red } a { div:hover { color: blue } color: red } diff --git a/crates/swc_css_codegen/tests/fixture/qualified_rule/recovery/output.css b/crates/swc_css_codegen/tests/fixture/qualified_rule/recovery/output.css index 5dc1bedfd5d7..61b4504646e3 100644 --- a/crates/swc_css_codegen/tests/fixture/qualified_rule/recovery/output.css +++ b/crates/swc_css_codegen/tests/fixture/qualified_rule/recovery/output.css @@ -18,9 +18,10 @@ $bad foo { color: red; } $bad: rule; + + a { - div.major { color: blue } -color: red } + div.major { color: blue } color: red } a { div: hover {color:blue} color:red; } diff --git a/crates/swc_css_codegen/tests/fixture/qualified_rule/recovery/output.min.css b/crates/swc_css_codegen/tests/fixture/qualified_rule/recovery/output.min.css index d44a2ea3edb0..97b9cc7cae2c 100644 --- a/crates/swc_css_codegen/tests/fixture/qualified_rule/recovery/output.min.css +++ b/crates/swc_css_codegen/tests/fixture/qualified_rule/recovery/output.min.css @@ -1,2 +1,4 @@ -{}{color:red}#broken# {color:red}$bad{color:red}$bad {color:red}$bad foo{color:red}$bad foo {color:red}$bad: rule;a{div.major { color: blue }color: red } -a {div:hover{color:blue}color:red}a{div:hover{color:blue};color:red} +{}{color:red}#broken# {color:red}$bad{color:red}$bad {color:red}$bad foo{color:red}$bad foo {color:red}$bad: rule; + + +a {div.major { color: blue } color: red }a{div:hover{color:blue}color:red}a{div:hover{color:blue};color:red} diff --git a/crates/swc_css_parser/src/parser/syntax/mod.rs b/crates/swc_css_parser/src/parser/syntax/mod.rs index 1e957aa54411..6b2fa6a21290 100644 --- a/crates/swc_css_parser/src/parser/syntax/mod.rs +++ b/crates/swc_css_parser/src/parser/syntax/mod.rs @@ -304,7 +304,7 @@ where let span = self.input.cur_span(); let mut children = vec![]; - while !is_one_of!(self, EOF, "}") { + while !is_one_of!(self, EOF) { if let Some(token_and_span) = self.input.bump() { children.push(ComponentValue::PreservedToken(token_and_span)); } From 7519ae230bcc860c41e6240b4f32137aeb406a48 Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Sat, 22 Oct 2022 04:39:31 +0300 Subject: [PATCH 16/19] refactor: avoid extra clone --- crates/swc_css_parser/src/parser/input.rs | 137 ++++++++++++++-------- 1 file changed, 86 insertions(+), 51 deletions(-) diff --git a/crates/swc_css_parser/src/parser/input.rs b/crates/swc_css_parser/src/parser/input.rs index bbef4c5e899c..9ad5907a0b38 100644 --- a/crates/swc_css_parser/src/parser/input.rs +++ b/crates/swc_css_parser/src/parser/input.rs @@ -1,5 +1,6 @@ use std::{fmt::Debug, mem::take}; +use swc_atoms::JsWord; use swc_common::{BytePos, Span, Spanned, SyntaxContext}; use swc_css_ast::{ComponentValue, ListOfComponentValues, Token, TokenAndSpan}; @@ -278,6 +279,18 @@ pub struct ListOfComponentValuesInput<'a> { balance_stack: Vec, } +#[derive(Debug)] +pub enum TokenOrBlock { + Token(TokenAndSpan), + Function(Span, JsWord, JsWord), + LBracket(Span), + LParen(Span), + LBrace(Span), + RParen(Span), + RBracket(Span), + RBrace(Span), +} + impl<'a> ListOfComponentValuesInput<'a> { pub fn new(list: &'a ListOfComponentValues) -> Self { ListOfComponentValuesInput { @@ -289,86 +302,78 @@ impl<'a> ListOfComponentValuesInput<'a> { fn get_component_value( &mut self, - list: Vec, + list: &'a Vec, deep: usize, - ) -> Option { + ) -> Option { let index = match self.idx.get(deep) { Some(index) => index, _ => return None, }; match list.get(*index) { - Some(ComponentValue::PreservedToken(token_and_span)) => Some(token_and_span.clone()), + Some(ComponentValue::PreservedToken(token_and_span)) => { + Some(TokenOrBlock::Token(token_and_span.clone())) + } Some(ComponentValue::Function(function)) => { if self.idx.len() - 1 == deep { - return Some(TokenAndSpan { - span: Span::new( + return Some(TokenOrBlock::Function( + Span::new( function.span_lo(), function.name.span_hi() + BytePos(1), Default::default(), ), - token: Token::Function { - value: function.name.value.clone(), - raw: match &function.name.raw { - Some(raw) => raw.clone(), - _ => function.name.value.clone(), - }, + function.name.value.clone(), + match &function.name.raw { + Some(raw) => raw.clone(), + _ => function.name.value.clone(), }, - }); + )); } - let res = self.get_component_value(function.value.clone(), deep + 1); + let res = self.get_component_value(&function.value, deep + 1); if res.is_none() { - return Some(TokenAndSpan { - span: Span::new( - function.span_hi() - BytePos(1), - function.span_hi(), - Default::default(), - ), - token: Token::RParen, - }); + return Some(TokenOrBlock::RParen(Span::new( + function.span_hi() - BytePos(1), + function.span_hi(), + Default::default(), + ))); } res } Some(ComponentValue::SimpleBlock(simple_block)) => { if self.idx.len() - 1 == deep { - return Some(simple_block.name.clone()); + let close = match simple_block.name.token { + Token::LBracket => TokenOrBlock::LBracket(simple_block.name.span), + Token::LParen => TokenOrBlock::LParen(simple_block.name.span), + Token::LBrace => TokenOrBlock::LBrace(simple_block.name.span), + _ => { + unreachable!(); + } + }; + + return Some(close); } - let res = self.get_component_value(simple_block.value.clone(), deep + 1); + let res = self.get_component_value(&simple_block.value, deep + 1); if res.is_none() { - return Some(match simple_block.name.token { - Token::LBracket => TokenAndSpan { - span: Span::new( - simple_block.span_hi() - BytePos(1), - simple_block.span_hi(), - Default::default(), - ), - token: Token::RBracket, - }, - Token::LParen => TokenAndSpan { - span: Span::new( - simple_block.span_hi() - BytePos(1), - simple_block.span_hi(), - Default::default(), - ), - token: Token::RParen, - }, - Token::LBrace => TokenAndSpan { - span: Span::new( - simple_block.span_hi() - BytePos(1), - simple_block.span_hi(), - Default::default(), - ), - token: Token::RBrace, - }, + let span = Span::new( + simple_block.span_hi() - BytePos(1), + simple_block.span_hi(), + Default::default(), + ); + let close = match simple_block.name.token { + Token::LBracket => TokenOrBlock::RBracket(span), + Token::LParen => TokenOrBlock::RParen(span), + Token::LBrace => TokenOrBlock::RBrace(span), _ => { unreachable!(); } - }); + }; + + return Some(close); } res @@ -381,8 +386,38 @@ impl<'a> ListOfComponentValuesInput<'a> { } fn cur(&mut self) -> PResult { - let token_and_span = match self.get_component_value(self.list.children.clone(), 0) { - Some(token_and_span) => token_and_span, + let token_and_span = match self.get_component_value(&self.list.children, 0) { + Some(token_or_block) => match token_or_block { + TokenOrBlock::Token(token_and_span) => token_and_span, + TokenOrBlock::Function(span, value, raw) => TokenAndSpan { + span, + token: Token::Function { value, raw }, + }, + TokenOrBlock::LBracket(span) => TokenAndSpan { + span, + token: Token::LBracket, + }, + TokenOrBlock::LBrace(span) => TokenAndSpan { + span, + token: Token::LBrace, + }, + TokenOrBlock::LParen(span) => TokenAndSpan { + span, + token: Token::LParen, + }, + TokenOrBlock::RBracket(span) => TokenAndSpan { + span, + token: Token::RBracket, + }, + TokenOrBlock::RBrace(span) => TokenAndSpan { + span, + token: Token::RBrace, + }, + TokenOrBlock::RParen(span) => TokenAndSpan { + span, + token: Token::RParen, + }, + }, None => { let bp = self.list.span.hi; let span = Span::new(bp, bp, SyntaxContext::empty()); From d6d30252b766abf8eb7532abc9314f4adf8d9436 Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Sat, 22 Oct 2022 05:08:27 +0300 Subject: [PATCH 17/19] fix: small perf --- crates/swc_css_parser/src/parser/input.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/crates/swc_css_parser/src/parser/input.rs b/crates/swc_css_parser/src/parser/input.rs index 9ad5907a0b38..011952d9f86a 100644 --- a/crates/swc_css_parser/src/parser/input.rs +++ b/crates/swc_css_parser/src/parser/input.rs @@ -293,16 +293,20 @@ pub enum TokenOrBlock { impl<'a> ListOfComponentValuesInput<'a> { pub fn new(list: &'a ListOfComponentValues) -> Self { + let mut idx = Vec::with_capacity(16); + + idx.push(0); + ListOfComponentValuesInput { list, - idx: vec![0], - balance_stack: vec![], + idx, + balance_stack: Vec::with_capacity(16), } } fn get_component_value( &mut self, - list: &'a Vec, + list: &'a [ComponentValue], deep: usize, ) -> Option { let index = match self.idx.get(deep) { From 012f98f8737851ae51bf32c327131854cb8f0095 Mon Sep 17 00:00:00 2001 From: "alexander.akait" Date: Sat, 22 Oct 2022 05:18:09 +0300 Subject: [PATCH 18/19] fix: small perf --- crates/swc_css_parser/src/parser/input.rs | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/crates/swc_css_parser/src/parser/input.rs b/crates/swc_css_parser/src/parser/input.rs index 011952d9f86a..42846cad8e56 100644 --- a/crates/swc_css_parser/src/parser/input.rs +++ b/crates/swc_css_parser/src/parser/input.rs @@ -269,14 +269,14 @@ impl<'a> Iterator for TokensInput<'a> { #[derive(Debug)] pub struct ListOfComponentValuesState { idx: Vec, - balance_stack: Vec, + balance_stack: Vec, } #[derive(Debug)] pub struct ListOfComponentValuesInput<'a> { list: &'a ListOfComponentValues, idx: Vec, - balance_stack: Vec, + balance_stack: Vec, } #[derive(Debug)] @@ -490,9 +490,9 @@ impl<'a> Iterator for ListOfComponentValuesInput<'a> { self.idx.push(0); let balance = match &token_and_span.token { - Token::Function { .. } | Token::LParen => ')', - Token::LBracket => ']', - Token::LBrace => '}', + Token::Function { .. } | Token::LParen => Token::RParen, + Token::LBracket => Token::RBracket, + Token::LBrace => Token::RBrace, _ => { unreachable!(); } @@ -503,17 +503,8 @@ impl<'a> Iterator for ListOfComponentValuesInput<'a> { token => { match token { Token::RBrace | Token::RBracket | Token::RParen => { - let value = match token { - Token::RBracket => ']', - Token::RParen => ')', - Token::RBrace => '}', - _ => { - unreachable!(); - } - }; - if let Some(last) = self.balance_stack.last() { - if value == *last { + if token == last { self.balance_stack.pop(); self.idx.pop(); } From b7929b504aad37ea8608d51f2da22789d817bfb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Donny/=EA=B0=95=EB=8F=99=EC=9C=A4?= Date: Sat, 22 Oct 2022 12:33:14 +0900 Subject: [PATCH 19/19] BalanceToken --- crates/swc_css_parser/src/parser/input.rs | 34 +++++++++++++++++------ 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/crates/swc_css_parser/src/parser/input.rs b/crates/swc_css_parser/src/parser/input.rs index 42846cad8e56..68173aa6c9ae 100644 --- a/crates/swc_css_parser/src/parser/input.rs +++ b/crates/swc_css_parser/src/parser/input.rs @@ -269,14 +269,27 @@ impl<'a> Iterator for TokensInput<'a> { #[derive(Debug)] pub struct ListOfComponentValuesState { idx: Vec, - balance_stack: Vec, + balance_stack: Vec, } #[derive(Debug)] pub struct ListOfComponentValuesInput<'a> { list: &'a ListOfComponentValues, idx: Vec, - balance_stack: Vec, + balance_stack: Vec, +} + +#[derive(Debug, Clone)] +#[allow(clippy::enum_variant_names)] +enum BalanceToken { + /// `]` + RBracket, + + /// `)` + RParen, + + /// `}` + RBrace, } #[derive(Debug)] @@ -490,9 +503,9 @@ impl<'a> Iterator for ListOfComponentValuesInput<'a> { self.idx.push(0); let balance = match &token_and_span.token { - Token::Function { .. } | Token::LParen => Token::RParen, - Token::LBracket => Token::RBracket, - Token::LBrace => Token::RBrace, + Token::Function { .. } | Token::LParen => BalanceToken::RParen, + Token::LBracket => BalanceToken::RBracket, + Token::LBrace => BalanceToken::RBrace, _ => { unreachable!(); } @@ -504,9 +517,14 @@ impl<'a> Iterator for ListOfComponentValuesInput<'a> { match token { Token::RBrace | Token::RBracket | Token::RParen => { if let Some(last) = self.balance_stack.last() { - if token == last { - self.balance_stack.pop(); - self.idx.pop(); + match (token, last) { + (Token::RBrace, BalanceToken::RBrace) + | (Token::RParen, BalanceToken::RParen) + | (Token::RBracket, BalanceToken::RBracket) => { + self.balance_stack.pop(); + self.idx.pop(); + } + _ => {} } } }