diff --git a/crates/biome_css_factory/src/generated/node_factory.rs b/crates/biome_css_factory/src/generated/node_factory.rs index 73b21d8a7b8e..c1dbadb2ce26 100644 --- a/crates/biome_css_factory/src/generated/node_factory.rs +++ b/crates/biome_css_factory/src/generated/node_factory.rs @@ -3559,6 +3559,16 @@ where slots, )) } +pub fn css_bogus_if_test_boolean_expr(slots: I) -> CssBogusIfTestBooleanExpr +where + I: IntoIterator>, + I::IntoIter: ExactSizeIterator, +{ + CssBogusIfTestBooleanExpr::unwrap_cast(SyntaxNode::new_detached( + CssSyntaxKind::CSS_BOGUS_IF_TEST_BOOLEAN_EXPR, + slots, + )) +} pub fn css_bogus_keyframes_item(slots: I) -> CssBogusKeyframesItem where I: IntoIterator>, diff --git a/crates/biome_css_factory/src/generated/syntax_factory.rs b/crates/biome_css_factory/src/generated/syntax_factory.rs index 8672f2f993a5..b18e75a8354b 100644 --- a/crates/biome_css_factory/src/generated/syntax_factory.rs +++ b/crates/biome_css_factory/src/generated/syntax_factory.rs @@ -24,6 +24,7 @@ impl SyntaxFactory for CssSyntaxFactory { | CSS_BOGUS_FONT_FEATURE_VALUES_ITEM | CSS_BOGUS_IF_BRANCH | CSS_BOGUS_IF_TEST + | CSS_BOGUS_IF_TEST_BOOLEAN_EXPR | CSS_BOGUS_KEYFRAMES_ITEM | CSS_BOGUS_KEYFRAMES_NAME | CSS_BOGUS_LAYER diff --git a/crates/biome_css_formatter/src/css/any/if_test_boolean_expr.rs b/crates/biome_css_formatter/src/css/any/if_test_boolean_expr.rs index f7f4c55e42b6..18c68bd2bb5f 100644 --- a/crates/biome_css_formatter/src/css/any/if_test_boolean_expr.rs +++ b/crates/biome_css_formatter/src/css/any/if_test_boolean_expr.rs @@ -14,6 +14,7 @@ impl FormatRule for FormatAnyCssIfTestBooleanExpr { AnyCssIfTestBooleanExpr::AnyCssIfTestBooleanOrCombinableExpr(node) => { node.format().fmt(f) } + AnyCssIfTestBooleanExpr::CssBogusIfTestBooleanExpr(node) => node.format().fmt(f), AnyCssIfTestBooleanExpr::CssIfTestBooleanNotExpr(node) => node.format().fmt(f), } } diff --git a/crates/biome_css_formatter/src/css/bogus/bogus_if_test_boolean_expr.rs b/crates/biome_css_formatter/src/css/bogus/bogus_if_test_boolean_expr.rs new file mode 100644 index 000000000000..9405158d9f57 --- /dev/null +++ b/crates/biome_css_formatter/src/css/bogus/bogus_if_test_boolean_expr.rs @@ -0,0 +1,5 @@ +use crate::FormatBogusNodeRule; +use biome_css_syntax::CssBogusIfTestBooleanExpr; +#[derive(Debug, Clone, Default)] +pub(crate) struct FormatCssBogusIfTestBooleanExpr; +impl FormatBogusNodeRule for FormatCssBogusIfTestBooleanExpr {} diff --git a/crates/biome_css_formatter/src/css/bogus/mod.rs b/crates/biome_css_formatter/src/css/bogus/mod.rs index ae15e3979007..5ac978f44acf 100644 --- a/crates/biome_css_formatter/src/css/bogus/mod.rs +++ b/crates/biome_css_formatter/src/css/bogus/mod.rs @@ -11,6 +11,7 @@ pub(crate) mod bogus_font_family_name; pub(crate) mod bogus_font_feature_values_item; pub(crate) mod bogus_if_branch; pub(crate) mod bogus_if_test; +pub(crate) mod bogus_if_test_boolean_expr; pub(crate) mod bogus_keyframes_item; pub(crate) mod bogus_keyframes_name; pub(crate) mod bogus_layer; diff --git a/crates/biome_css_formatter/src/generated.rs b/crates/biome_css_formatter/src/generated.rs index 03da6f7f5dc3..a2f9e223ef12 100644 --- a/crates/biome_css_formatter/src/generated.rs +++ b/crates/biome_css_formatter/src/generated.rs @@ -7874,6 +7874,46 @@ impl IntoFormat for biome_css_syntax::CssBogusIfTest { ) } } +impl FormatRule + for crate::css::bogus::bogus_if_test_boolean_expr::FormatCssBogusIfTestBooleanExpr +{ + type Context = CssFormatContext; + #[inline(always)] + fn fmt( + &self, + node: &biome_css_syntax::CssBogusIfTestBooleanExpr, + f: &mut CssFormatter, + ) -> FormatResult<()> { + FormatBogusNodeRule::::fmt(self, node, f) + } +} +impl AsFormat for biome_css_syntax::CssBogusIfTestBooleanExpr { + type Format<'a> = FormatRefWithRule< + 'a, + biome_css_syntax::CssBogusIfTestBooleanExpr, + crate::css::bogus::bogus_if_test_boolean_expr::FormatCssBogusIfTestBooleanExpr, + >; + fn format(&self) -> Self::Format<'_> { + FormatRefWithRule::new( + self, + crate::css::bogus::bogus_if_test_boolean_expr::FormatCssBogusIfTestBooleanExpr::default( + ), + ) + } +} +impl IntoFormat for biome_css_syntax::CssBogusIfTestBooleanExpr { + type Format = FormatOwnedWithRule< + biome_css_syntax::CssBogusIfTestBooleanExpr, + crate::css::bogus::bogus_if_test_boolean_expr::FormatCssBogusIfTestBooleanExpr, + >; + fn into_format(self) -> Self::Format { + FormatOwnedWithRule::new( + self, + crate::css::bogus::bogus_if_test_boolean_expr::FormatCssBogusIfTestBooleanExpr::default( + ), + ) + } +} impl FormatRule for crate::css::bogus::bogus_keyframes_item::FormatCssBogusKeyframesItem { diff --git a/crates/biome_css_parser/src/state.rs b/crates/biome_css_parser/src/state.rs index d47e9120f814..bee2adba91cd 100644 --- a/crates/biome_css_parser/src/state.rs +++ b/crates/biome_css_parser/src/state.rs @@ -20,6 +20,15 @@ pub(crate) struct CssParserState { /// handling top-level `@rules` or style declarations directly under the stylesheet. /// This distinction is critical for correctly interpreting and parsing different sections of a CSS document. pub(crate) is_nesting_block: bool, + + /// Indicates whether the parser encountered an `if()` function during speculative parsing. + /// + /// This flag is used to handle a conflict between speculative parsing and `if()` function parsing. + /// The `if()` function uses semicolons as branch separators which conflicts with speculative parsing + /// that uses semicolons to detect declaration endings. When this flag is set during a failed + /// speculative parse, the parser knows to retry without speculative mode, allowing proper error + /// recovery inside the `if()` function. + pub(crate) encountered_if_function: bool, } impl CssParserState { @@ -27,6 +36,7 @@ impl CssParserState { Self { speculative_parsing: false, is_nesting_block: false, + encountered_if_function: false, } } } diff --git a/crates/biome_css_parser/src/syntax/block/declaration_or_rule_list_block.rs b/crates/biome_css_parser/src/syntax/block/declaration_or_rule_list_block.rs index 0c2697ae3e06..14704d6ba516 100644 --- a/crates/biome_css_parser/src/syntax/block/declaration_or_rule_list_block.rs +++ b/crates/biome_css_parser/src/syntax/block/declaration_or_rule_list_block.rs @@ -72,9 +72,23 @@ impl ParseNodeList for DeclarationOrRuleList { // font-weight: 500; // } // } + + // Reset the if-function flag before parsing. This flag is used to detect + // if we encountered an if() function during speculative parsing. + p.state_mut().encountered_if_function = false; + // Attempt to parse the current block as a declaration. let declaration = try_parse(p, |p| { let declaration = parse_any_declaration_with_semicolon(p); + + // If we encountered an if() function, always fail speculative parsing. + // The if() function uses semicolons as branch separators, which can cause + // p.last() to be `;` even when the declaration is incomplete. By failing + // here, we force a non-speculative retry where recovery is enabled. + if p.state().encountered_if_function { + return Err(()); + } + // Check if the *last* token parsed is a semicolon // (;) or if the parser is at a closing brace (}). // ; - Indicates the end of a declaration. @@ -99,6 +113,13 @@ impl ParseNodeList for DeclarationOrRuleList { return declaration; } + // If the speculative parse failed and we encountered an if() function, + // we know this is a declaration (not a rule) because if() can only appear + // in declaration values. Parse again with recovery enabled. + if std::mem::take(&mut p.state_mut().encountered_if_function) { + return parse_any_declaration_with_semicolon(p); + } + // If parsing as a declaration failed, // attempt to parse the current block as a nested qualified rule. let rule = try_parse(p, |p| { diff --git a/crates/biome_css_parser/src/syntax/property/mod.rs b/crates/biome_css_parser/src/syntax/property/mod.rs index 0105e90f8599..d967e83155ae 100644 --- a/crates/biome_css_parser/src/syntax/property/mod.rs +++ b/crates/biome_css_parser/src/syntax/property/mod.rs @@ -239,7 +239,7 @@ impl ParseNodeList for GenericComponentValueList { } #[inline] -fn is_at_generic_component_value(p: &mut CssParser) -> bool { +pub(crate) fn is_at_generic_component_value(p: &mut CssParser) -> bool { is_at_any_value(p) || is_at_generic_delimiter(p) } diff --git a/crates/biome_css_parser/src/syntax/value/if.rs b/crates/biome_css_parser/src/syntax/value/if.rs index 4f79179939d1..e7819e667ba4 100644 --- a/crates/biome_css_parser/src/syntax/value/if.rs +++ b/crates/biome_css_parser/src/syntax/value/if.rs @@ -2,12 +2,15 @@ use biome_css_syntax::CssSyntaxKind; use biome_css_syntax::CssSyntaxKind::*; use biome_css_syntax::T; use biome_parser::Parser; +use biome_parser::TokenSet; use biome_parser::parse_lists::ParseNodeList; use biome_parser::parse_lists::ParseSeparatedList; use biome_parser::parse_recovery::ParseRecovery; +use biome_parser::parse_recovery::ParseRecoveryTokenSet; use biome_parser::parse_recovery::RecoveryResult; use biome_parser::parsed_syntax::ParsedSyntax::{Absent, Present}; use biome_parser::prelude::{CompletedMarker, ParsedSyntax}; +use biome_parser::token_set; use crate::parser::CssParser; use crate::syntax::at_rule::container::error::expected_any_container_style_query; @@ -25,6 +28,10 @@ use crate::syntax::parse_declaration; use crate::syntax::property::GenericComponentValueList; use crate::syntax::value::parse_error::expected_if_branch; use crate::syntax::value::parse_error::expected_if_test_boolean_expr_group; +use crate::syntax::value::parse_error::expected_if_test_boolean_not_expr; + +const IF_BRANCH_RECOVERY_TOKEN_SET: TokenSet = + token_set![T![;], T![')'], T!['}'], EOF]; pub(crate) fn is_at_if_function(p: &mut CssParser) -> bool { p.at(T![if]) @@ -94,6 +101,12 @@ pub(crate) fn parse_if_function(p: &mut CssParser) -> ParsedSyntax { return Absent; } + // Signal that we encountered an if() function. This flag is used by + // declaration_or_rule_list_block to handle speculative parsing conflicts. + if p.state().speculative_parsing { + p.state_mut().encountered_if_function = true; + } + let m = p.start(); p.bump(T![if]); @@ -217,6 +230,11 @@ fn parse_if_media_test(p: &mut CssParser) -> ParsedSyntax { Present(m.complete(p, CSS_IF_MEDIA_TEST)) } +#[inline] +fn is_at_if_test(p: &mut CssParser) -> bool { + is_at_if_supports_test(p) || is_at_if_style_test(p) || is_at_if_media_test(p) +} + #[inline] fn parse_if_test(p: &mut CssParser) -> ParsedSyntax { if is_at_if_supports_test(p) { @@ -234,13 +252,26 @@ fn parse_if_test(p: &mut CssParser) -> ParsedSyntax { Absent } +#[inline] +fn is_at_if_test_boolean_expr_group(p: &mut CssParser) -> bool { + p.at(T!['(']) || is_at_if_test(p) +} + #[inline] fn parse_any_if_test_boolean_expr_group(p: &mut CssParser) -> ParsedSyntax { // ( ) if p.at(T!['(']) { let m = p.start(); p.bump(T!['(']); - parse_any_if_test_boolean_expr(p).ok(); + + parse_any_if_test_boolean_expr(p) + .or_recover_with_token_set( + p, + &ParseRecoveryTokenSet::new(CSS_BOGUS_IF_TEST_BOOLEAN_EXPR, token_set![T![')']]), + expected_if_test_boolean_not_expr, + ) + .ok(); + p.expect(T![')']); return Present(m.complete(p, CSS_IF_TEST_BOOLEAN_EXPR_IN_PARENS)); } @@ -269,7 +300,14 @@ fn parse_if_test_boolean_not_expr(p: &mut CssParser) -> ParsedSyntax { let m = p.start(); p.bump(T![not]); - parse_any_if_test_boolean_expr_group(p).ok(); + + parse_any_if_test_boolean_expr_group(p) + .or_recover_with_token_set( + p, + &ParseRecoveryTokenSet::new(CSS_BOGUS_IF_TEST_BOOLEAN_EXPR, token_set![T![')'], T![:]]), + expected_if_test_boolean_expr_group, + ) + .ok(); Present(m.complete(p, CSS_IF_TEST_BOOLEAN_NOT_EXPR)) } @@ -309,7 +347,7 @@ fn parse_if_test_boolean_and_expr(p: &mut CssParser, lhs: CompletedMarker) -> Co // parse_any_if_test_boolean_expr_group failed to parse, // but the parser is already at a recovered position. let m = p.start(); - let rhs = m.complete(p, CSS_BOGUS); + let rhs = m.complete(p, CSS_BOGUS_IF_TEST_BOOLEAN_EXPR); parse_if_test_boolean_and_expr(p, rhs); } @@ -351,7 +389,7 @@ fn parse_if_test_boolean_or_expr(p: &mut CssParser, lhs: CompletedMarker) -> Com // parse_any_if_test_boolean_expr_group failed to parse, // but the parser is already at a recovered position. let m = p.start(); - let rhs = m.complete(p, CSS_BOGUS); + let rhs = m.complete(p, CSS_BOGUS_IF_TEST_BOOLEAN_EXPR); parse_if_test_boolean_or_expr(p, rhs); } @@ -371,6 +409,11 @@ fn parse_any_if_test_boolean_expr(p: &mut CssParser) -> ParsedSyntax { }) } +#[inline] +fn is_at_any_if_condition(p: &mut CssParser) -> bool { + p.at(T![else]) || is_at_if_test_boolean_expr_group(p) || is_at_if_test_boolean_not_expr(p) +} + #[inline] fn parse_any_if_condition(p: &mut CssParser) -> ParsedSyntax { if p.at(T![else]) { @@ -384,10 +427,18 @@ fn parse_any_if_condition(p: &mut CssParser) -> ParsedSyntax { #[inline] fn parse_if_branch(p: &mut CssParser) -> ParsedSyntax { + if !is_at_any_if_condition(p) { + return Absent; + } + let m = p.start(); parse_any_if_condition(p) - .or_recover(p, &AnyIfTestParseRecovery, expected_if_branch) + .or_recover_with_token_set( + p, + &ParseRecoveryTokenSet::new(CSS_BOGUS_IF_BRANCH, token_set![T![')'], T![:]]), + expected_if_branch, + ) .ok(); p.expect(T![:]); @@ -402,28 +453,17 @@ struct AnyIfTestBooleanExprChainParseRecovery; impl ParseRecovery for AnyIfTestBooleanExprChainParseRecovery { type Kind = CssSyntaxKind; type Parser<'source> = CssParser<'source>; - const RECOVERED_KIND: Self::Kind = CSS_BOGUS; + const RECOVERED_KIND: Self::Kind = CSS_BOGUS_IF_TEST_BOOLEAN_EXPR; fn is_at_recovered(&self, p: &mut Self::Parser<'_>) -> bool { - is_at_if_test_boolean_not_expr(p) + p.at(T![')']) + || is_at_if_test_boolean_not_expr(p) || is_at_if_test_boolean_and_expr(p) || is_at_if_test_boolean_or_expr(p) || p.has_preceding_line_break() } } -struct AnyIfTestParseRecovery; - -impl ParseRecovery for AnyIfTestParseRecovery { - type Kind = CssSyntaxKind; - type Parser<'source> = CssParser<'source>; - const RECOVERED_KIND: Self::Kind = CSS_BOGUS_IF_TEST; - - fn is_at_recovered(&self, p: &mut Self::Parser<'_>) -> bool { - p.at(T![')']) || p.has_preceding_line_break() - } -} - struct IfBranchListParseRecovery; impl ParseRecovery for IfBranchListParseRecovery { @@ -433,7 +473,7 @@ impl ParseRecovery for IfBranchListParseRecovery { const RECOVERED_KIND: Self::Kind = CSS_BOGUS_IF_BRANCH; fn is_at_recovered(&self, p: &mut Self::Parser<'_>) -> bool { - p.at(T![;]) || p.at(T![')']) || p.has_preceding_line_break() + p.at_ts(IF_BRANCH_RECOVERY_TOKEN_SET) } } diff --git a/crates/biome_css_parser/src/syntax/value/parse_error.rs b/crates/biome_css_parser/src/syntax/value/parse_error.rs index 83e5c96b5a48..93fc104c2b31 100644 --- a/crates/biome_css_parser/src/syntax/value/parse_error.rs +++ b/crates/biome_css_parser/src/syntax/value/parse_error.rs @@ -30,3 +30,10 @@ pub(crate) fn expected_if_test_boolean_expr_group( ) -> ParseDiagnostic { expected_any(&["parenthesized boolean expression", "if test"], range, p) } + +pub(crate) fn expected_if_test_boolean_not_expr( + p: &CssParser, + range: TextRange, +) -> ParseDiagnostic { + expected_any(&["not boolean expression", "if test"], range, p) +} diff --git a/crates/biome_css_parser/tests/css_test_suite/error/function/if.css b/crates/biome_css_parser/tests/css_test_suite/error/function/if.css index 129627beea5c..4b86fc194abf 100644 --- a/crates/biome_css_parser/tests/css_test_suite/error/function/if.css +++ b/crates/biome_css_parser/tests/css_test_suite/error/function/if.css @@ -81,3 +81,57 @@ .empty-if { color: if(); } + +.if-branch-list-recovery { + a: if(style(--foo: bar): black; !bogus; else: white); + a: if(style(--foo: bar): black; ???; else: white); +} + +.todo { + background: if(style(--foo: bar) and (!bogus): red;); + background: if(not foo: red;); +} + +.invalid-branch-content { + a: if(style(--foo: bar): black; !bogus; else: white); +} + +.invalid-branch-content-no-trailing-semi { + a: if(style(--foo: bar): black; !bogus; else: white) +} + +.multiple-invalid-branches { + a: if(style(--a: 1): red; !!!; style(--b: 2): blue; @@@; else: green); +} + +.invalid-then-valid { + a: if(###: red; style(--foo: bar): blue; else: green); +} + +.recovery-at-semicolon { + a: if(style(--foo: bar): black; bogus-no-colon; else: white); +} + +.multiple-if-declarations { + a: if(style(--foo: bar): black; else: white); + b: if(style(--invalid): red; !!!; else: blue); + c: if(style(--baz: qux): green; else: yellow); +} + +/* Test if() inside nested rules */ +.outer { + .inner { + color: if(style(--foo: bar): red; !bogus; else: blue); + } + a: if(style(--test: val): green; else: yellow); +} + +/* Deeply nested with multiple if() declarations */ +.level1 { + .level2 { + .level3 { + a: if(style(--deep: true): red; !!!; else: blue); + b: if(style(--valid: false): green; else: yellow); + } + } +} diff --git a/crates/biome_css_parser/tests/css_test_suite/error/function/if.css.snap b/crates/biome_css_parser/tests/css_test_suite/error/function/if.css.snap index 1bdc81f7ea65..6c6f71f9d42b 100644 --- a/crates/biome_css_parser/tests/css_test_suite/error/function/if.css.snap +++ b/crates/biome_css_parser/tests/css_test_suite/error/function/if.css.snap @@ -89,6 +89,60 @@ expression: snapshot color: if(); } +.if-branch-list-recovery { + a: if(style(--foo: bar): black; !bogus; else: white); + a: if(style(--foo: bar): black; ???; else: white); +} + +.todo { + background: if(style(--foo: bar) and (!bogus): red;); + background: if(not foo: red;); +} + +.invalid-branch-content { + a: if(style(--foo: bar): black; !bogus; else: white); +} + +.invalid-branch-content-no-trailing-semi { + a: if(style(--foo: bar): black; !bogus; else: white) +} + +.multiple-invalid-branches { + a: if(style(--a: 1): red; !!!; style(--b: 2): blue; @@@; else: green); +} + +.invalid-then-valid { + a: if(###: red; style(--foo: bar): blue; else: green); +} + +.recovery-at-semicolon { + a: if(style(--foo: bar): black; bogus-no-colon; else: white); +} + +.multiple-if-declarations { + a: if(style(--foo: bar): black; else: white); + b: if(style(--invalid): red; !!!; else: blue); + c: if(style(--baz: qux): green; else: yellow); +} + +/* Test if() inside nested rules */ +.outer { + .inner { + color: if(style(--foo: bar): red; !bogus; else: blue); + } + a: if(style(--test: val): green; else: yellow); +} + +/* Deeply nested with multiple if() declarations */ +.level1 { + .level2 { + .level3 { + a: if(style(--deep: true): red; !!!; else: blue); + b: if(style(--valid: false): green; else: yellow); + } + } +} + ``` @@ -198,13 +252,10 @@ CssRoot { if_token: IF_KW@84..86 "if" [] [], l_paren_token: L_PAREN@86..87 "(" [] [], css_if_branch_list: CssIfBranchList [ - CssIfBranch { - condition: missing (required), - colon_token: COLON@87..89 ":" [] [Whitespace(" ")], - value: CssGenericComponentValueList [ - CssIdentifier { - value_token: IDENT@89..94 "black" [] [], - }, + CssBogusIfBranch { + items: [ + COLON@87..89 ":" [] [Whitespace(" ")], + IDENT@89..94 "black" [] [], ], }, ], @@ -255,14 +306,25 @@ CssRoot { style_token: STYLE_KW@129..134 "style" [] [], l_paren_token: L_PAREN@134..135 "(" [] [], test: CssDeclaration { - property: CssGenericProperty { - name: CssDashedIdentifier { - value_token: IDENT@135..140 "--foo" [] [], - }, - colon_token: COLON@140..142 ":" [] [Whitespace(" ")], - value: CssGenericComponentValueList [ - CssIdentifier { - value_token: IDENT@142..145 "bar" [] [], + property: CssBogusProperty { + items: [ + CssDashedIdentifier { + value_token: IDENT@135..140 "--foo" [] [], + }, + COLON@140..142 ":" [] [Whitespace(" ")], + CssBogus { + items: [ + CssIdentifier { + value_token: IDENT@142..145 "bar" [] [], + }, + CssBogusPropertyValue { + items: [ + COLON@145..147 ":" [] [Whitespace(" ")], + IDENT@147..152 "black" [] [], + R_PAREN@152..153 ")" [] [], + ], + }, + ], }, ], }, @@ -270,21 +332,18 @@ CssRoot { }, r_paren_token: missing (required), }, - colon_token: COLON@145..147 ":" [] [Whitespace(" ")], - value: CssGenericComponentValueList [ - CssIdentifier { - value_token: IDENT@147..152 "black" [] [], - }, - ], + colon_token: missing (required), + value: CssGenericComponentValueList [], }, + SEMICOLON@153..154 ";" [] [], ], - r_paren_token: R_PAREN@152..153 ")" [] [], + r_paren_token: missing (required), }, ], }, important: missing (optional), }, - semicolon_token: SEMICOLON@153..154 ";" [] [], + semicolon_token: missing (optional), }, ], r_curly_token: R_CURLY@154..156 "}" [Newline("\n")] [], @@ -310,55 +369,45 @@ CssRoot { items: CssDeclarationOrRuleList [ CssDeclarationWithSemicolon { declaration: CssDeclaration { - property: CssBogusProperty { - items: [ - CssIdentifier { - value_token: IDENT@180..187 "color" [Newline("\n"), Whitespace("\t")] [], - }, - COLON@187..189 ":" [] [Whitespace(" ")], - CssBogus { - items: [ - CssBogusSupportsCondition { - items: [ - IF_KW@189..191 "if" [] [], - L_PAREN@191..192 "(" [] [], - CssBogus { - items: [ - CssBogus { - items: [ - CssBogus { - items: [ - STYLE_KW@192..197 "style" [] [], - L_PAREN@197..198 "(" [] [], - CssBogus { - items: [ - NOT_KW@198..202 "not" [] [Whitespace(" ")], - CssBogus { - items: [ - IDENT@202..204 "a" [] [Whitespace(" ")], - IDENT@204..210 "valid" [] [Whitespace(" ")], - IDENT@210..215 "query" [] [], - ], - }, - ], - }, - R_PAREN@215..216 ")" [] [], - ], - }, - COLON@216..218 ":" [] [Whitespace(" ")], - CssGenericComponentValueList [ - CssIdentifier { - value_token: IDENT@218..223 "black" [] [], - }, + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@180..187 "color" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@187..189 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIfFunction { + if_token: IF_KW@189..191 "if" [] [], + l_paren_token: L_PAREN@191..192 "(" [] [], + css_if_branch_list: CssIfBranchList [ + CssIfBranch { + condition: CssBogusIfTest { + items: [ + STYLE_KW@192..197 "style" [] [], + L_PAREN@197..198 "(" [] [], + CssBogus { + items: [ + NOT_KW@198..202 "not" [] [Whitespace(" ")], + CssBogus { + items: [ + IDENT@202..204 "a" [] [Whitespace(" ")], + IDENT@204..210 "valid" [] [Whitespace(" ")], + IDENT@210..215 "query" [] [], ], - ], - }, - ], + }, + ], + }, + R_PAREN@215..216 ")" [] [], + ], + }, + colon_token: COLON@216..218 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@218..223 "black" [] [], }, - R_PAREN@223..224 ")" [] [], ], }, ], + r_paren_token: R_PAREN@223..224 ")" [] [], }, ], }, @@ -398,68 +447,37 @@ CssRoot { COLON@249..251 ":" [] [Whitespace(" ")], CssBogus { items: [ - CssBogusSupportsCondition { - items: [ - IF_KW@251..253 "if" [] [], - L_PAREN@253..254 "(" [] [], - CssBogus { - items: [ - CssBogus { - items: [ - CssIfTestBooleanNotExpr { - not_token: NOT_KW@254..258 "not" [] [Whitespace(" ")], - expression: missing (required), - }, - CssBogus { - items: [ - CssBogusSupportsCondition { - items: [ - CssIdentifier { - value_token: IDENT@258..261 "not" [] [], - }, - L_PAREN@261..262 "(" [] [], - CssBogus { - items: [ - CssBogus { - items: [ - CssBogus { - items: [ - CssBogus { - items: [ - CssDashedIdentifier { - value_token: IDENT@262..269 "--style" [] [], - }, - CssBogus { - items: [ - COLON@269..271 ":" [] [Whitespace(" ")], - IDENT@271..276 "black" [] [], - ], - }, - ], - }, - ], - }, - ], - }, - ], - }, - R_PAREN@276..277 ")" [] [], - ], - }, - CssBogusPropertyValue { - items: [ - COLON@277..279 ":" [] [Whitespace(" ")], - IDENT@279..284 "black" [] [], - ], - }, - ], - }, - ], + CssIfFunction { + if_token: IF_KW@251..253 "if" [] [], + l_paren_token: L_PAREN@253..254 "(" [] [], + css_if_branch_list: CssIfBranchList [ + CssIfBranch { + condition: CssBogusIfTestBooleanExpr { + items: [ + NOT_KW@254..258 "not" [] [Whitespace(" ")], + CssBogusIfTestBooleanExpr { + items: [ + NOT_KW@258..261 "not" [] [], + L_PAREN@261..262 "(" [] [], + IDENT@262..269 "--style" [] [], + ], + }, + ], + }, + colon_token: COLON@269..271 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@271..276 "black" [] [], }, - SEMICOLON@284..285 ";" [] [], ], }, - R_PAREN@285..286 ")" [] [], + ], + r_paren_token: R_PAREN@276..277 ")" [] [], + }, + CssBogusPropertyValue { + items: [ + COLON@277..279 ":" [] [Whitespace(" ")], + IDENT@279..284 "black" [] [], ], }, ], @@ -468,6 +486,14 @@ CssRoot { }, important: missing (optional), }, + semicolon_token: SEMICOLON@284..285 ";" [] [], + }, + CssBogus { + items: [ + R_PAREN@285..286 ")" [] [], + ], + }, + CssEmptyDeclaration { semicolon_token: SEMICOLON@286..287 ";" [] [], }, ], @@ -502,69 +528,65 @@ CssRoot { COLON@315..317 ":" [] [Whitespace(" ")], CssBogus { items: [ - CssBogusSupportsCondition { - items: [ - IF_KW@317..319 "if" [] [], - L_PAREN@319..320 "(" [] [], - CssBogus { + CssIfFunction { + if_token: IF_KW@317..319 "if" [] [], + l_paren_token: L_PAREN@319..320 "(" [] [], + css_if_branch_list: CssIfBranchList [ + CssBogusIfBranch { items: [ - CssBogus { - items: [ - CssIfTestBooleanNotExpr { - not_token: NOT_KW@320..324 "not" [] [Whitespace(" ")], - expression: CssIfTestBooleanExprInParens { - l_paren_token: L_PAREN@324..325 "(" [] [], - expression: CssIfTestBooleanAndExpr { - left: CssIfStyleTest { - style_token: STYLE_KW@325..330 "style" [] [], - l_paren_token: L_PAREN@330..331 "(" [] [], - test: CssDeclaration { - property: CssGenericProperty { - name: CssDashedIdentifier { - value_token: IDENT@331..338 "--style" [] [], - }, - colon_token: COLON@338..340 ":" [] [Whitespace(" ")], - value: CssGenericComponentValueList [ - CssIdentifier { - value_token: IDENT@340..345 "black" [] [], - }, - ], - }, - important: missing (optional), + CssIfTestBooleanNotExpr { + not_token: NOT_KW@320..324 "not" [] [Whitespace(" ")], + expression: CssIfTestBooleanExprInParens { + l_paren_token: L_PAREN@324..325 "(" [] [], + expression: CssIfTestBooleanAndExpr { + left: CssIfStyleTest { + style_token: STYLE_KW@325..330 "style" [] [], + l_paren_token: L_PAREN@330..331 "(" [] [], + test: CssDeclaration { + property: CssGenericProperty { + name: CssDashedIdentifier { + value_token: IDENT@331..338 "--style" [] [], }, - r_paren_token: R_PAREN@345..347 ")" [] [Whitespace(" ")], + colon_token: COLON@338..340 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@340..345 "black" [] [], + }, + ], }, - and_token: AND_KW@347..351 "and" [] [Whitespace(" ")], - right: missing (required), + important: missing (optional), }, - r_paren_token: missing (required), + r_paren_token: R_PAREN@345..347 ")" [] [Whitespace(" ")], }, + and_token: AND_KW@347..351 "and" [] [Whitespace(" ")], + right: missing (required), }, - CssBogus { + r_paren_token: missing (required), + }, + }, + CssBogus { + items: [ + CssBogusSupportsCondition { items: [ - CssBogusSupportsCondition { + CssIdentifier { + value_token: IDENT@351..354 "not" [] [], + }, + L_PAREN@354..355 "(" [] [], + CssBogus { items: [ - CssIdentifier { - value_token: IDENT@351..354 "not" [] [], - }, - L_PAREN@354..355 "(" [] [], CssBogus { items: [ CssBogus { items: [ CssBogus { items: [ + CssDashedIdentifier { + value_token: IDENT@355..362 "--style" [] [], + }, CssBogus { items: [ - CssDashedIdentifier { - value_token: IDENT@355..362 "--style" [] [], - }, - CssBogus { - items: [ - COLON@362..364 ":" [] [Whitespace(" ")], - IDENT@364..369 "black" [] [], - ], - }, + COLON@362..364 ":" [] [Whitespace(" ")], + IDENT@364..369 "black" [] [], ], }, ], @@ -573,17 +595,17 @@ CssRoot { }, ], }, - R_PAREN@369..370 ")" [] [], ], }, + R_PAREN@369..370 ")" [] [], ], }, ], }, ], }, - R_PAREN@370..371 ")" [] [], ], + r_paren_token: R_PAREN@370..371 ")" [] [], }, CssBogusPropertyValue { items: [ @@ -714,17 +736,13 @@ CssRoot { if_token: IF_KW@483..485 "if" [] [], l_paren_token: L_PAREN@485..486 "(" [] [], css_if_branch_list: CssIfBranchList [ - CssIfBranch { - condition: CssBogusIfTest { - items: [ - SUPPORTS_KW@486..495 "supports" [] [Whitespace(" ")], - IDENT@495..500 "--foo" [] [], - COLON@500..502 ":" [] [Whitespace(" ")], - IDENT@502..505 "bar" [] [], - ], - }, - colon_token: missing (required), - value: CssGenericComponentValueList [], + CssBogusIfBranch { + items: [ + SUPPORTS_KW@486..495 "supports" [] [Whitespace(" ")], + IDENT@495..500 "--foo" [] [], + COLON@500..502 ":" [] [Whitespace(" ")], + IDENT@502..505 "bar" [] [], + ], }, ], r_paren_token: R_PAREN@505..506 ")" [] [], @@ -848,37 +866,40 @@ CssRoot { l_paren_token: L_PAREN@618..619 "(" [] [], css_if_branch_list: CssIfBranchList [ CssIfBranch { - condition: CssIfTestBooleanAndExpr { - left: CssIfStyleTest { - style_token: STYLE_KW@619..624 "style" [] [], - l_paren_token: L_PAREN@624..625 "(" [] [], - test: CssDeclaration { - property: CssGenericProperty { - name: CssDashedIdentifier { - value_token: IDENT@625..630 "--foo" [] [], - }, - colon_token: COLON@630..632 ":" [] [Whitespace(" ")], - value: CssGenericComponentValueList [ - CssIdentifier { - value_token: IDENT@632..635 "bar" [] [], + condition: CssBogusIfTestBooleanExpr { + items: [ + CssIfStyleTest { + style_token: STYLE_KW@619..624 "style" [] [], + l_paren_token: L_PAREN@624..625 "(" [] [], + test: CssDeclaration { + property: CssGenericProperty { + name: CssDashedIdentifier { + value_token: IDENT@625..630 "--foo" [] [], }, - ], + colon_token: COLON@630..632 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@632..635 "bar" [] [], + }, + ], + }, + important: missing (optional), }, - important: missing (optional), + r_paren_token: R_PAREN@635..637 ")" [] [Whitespace(" ")], }, - r_paren_token: R_PAREN@635..637 ")" [] [Whitespace(" ")], - }, - and_token: AND_KW@637..640 "and" [] [], - right: missing (required), + AND_KW@637..640 "and" [] [], + CssBogusIfTestBooleanExpr { + items: [ + COLON@640..642 ":" [] [Whitespace(" ")], + IDENT@642..647 "black" [] [], + SEMICOLON@647..648 ";" [] [], + ], + }, + ], }, - colon_token: COLON@640..642 ":" [] [Whitespace(" ")], - value: CssGenericComponentValueList [ - CssIdentifier { - value_token: IDENT@642..647 "black" [] [], - }, - ], + colon_token: missing (required), + value: CssGenericComponentValueList [], }, - SEMICOLON@647..648 ";" [] [], ], r_paren_token: R_PAREN@648..649 ")" [] [], }, @@ -923,37 +944,40 @@ CssRoot { l_paren_token: L_PAREN@686..687 "(" [] [], css_if_branch_list: CssIfBranchList [ CssIfBranch { - condition: CssIfTestBooleanOrExpr { - left: CssIfStyleTest { - style_token: STYLE_KW@687..692 "style" [] [], - l_paren_token: L_PAREN@692..693 "(" [] [], - test: CssDeclaration { - property: CssGenericProperty { - name: CssDashedIdentifier { - value_token: IDENT@693..698 "--foo" [] [], - }, - colon_token: COLON@698..700 ":" [] [Whitespace(" ")], - value: CssGenericComponentValueList [ - CssIdentifier { - value_token: IDENT@700..703 "bar" [] [], + condition: CssBogusIfTestBooleanExpr { + items: [ + CssIfStyleTest { + style_token: STYLE_KW@687..692 "style" [] [], + l_paren_token: L_PAREN@692..693 "(" [] [], + test: CssDeclaration { + property: CssGenericProperty { + name: CssDashedIdentifier { + value_token: IDENT@693..698 "--foo" [] [], }, - ], + colon_token: COLON@698..700 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@700..703 "bar" [] [], + }, + ], + }, + important: missing (optional), }, - important: missing (optional), + r_paren_token: R_PAREN@703..705 ")" [] [Whitespace(" ")], }, - r_paren_token: R_PAREN@703..705 ")" [] [Whitespace(" ")], - }, - or_token: OR_KW@705..707 "or" [] [], - right: missing (required), + OR_KW@705..707 "or" [] [], + CssBogusIfTestBooleanExpr { + items: [ + COLON@707..709 ":" [] [Whitespace(" ")], + IDENT@709..714 "black" [] [], + SEMICOLON@714..715 ";" [] [], + ], + }, + ], }, - colon_token: COLON@707..709 ":" [] [Whitespace(" ")], - value: CssGenericComponentValueList [ - CssIdentifier { - value_token: IDENT@709..714 "black" [] [], - }, - ], + colon_token: missing (required), + value: CssGenericComponentValueList [], }, - SEMICOLON@714..715 ";" [] [], ], r_paren_token: R_PAREN@715..716 ")" [] [], }, @@ -1025,23 +1049,11 @@ CssRoot { ], }, SEMICOLON@772..774 ";" [] [Whitespace(" ")], - CssIfBranch { - condition: missing (required), - colon_token: missing (required), - value: CssGenericComponentValueList [ - CssIdentifier { - value_token: IDENT@774..779 "elsif" [] [], - }, - ], - }, - missing separator, - CssIfBranch { - condition: missing (required), - colon_token: COLON@779..781 ":" [] [Whitespace(" ")], - value: CssGenericComponentValueList [ - CssIdentifier { - value_token: IDENT@781..786 "white" [] [], - }, + CssBogusIfBranch { + items: [ + IDENT@774..779 "elsif" [] [], + COLON@779..781 ":" [] [Whitespace(" ")], + IDENT@781..786 "white" [] [], ], }, SEMICOLON@786..787 ";" [] [], @@ -1116,11 +1128,7 @@ CssRoot { ], }, SEMICOLON@851..852 ";" [] [], - CssIfBranch { - condition: missing (required), - colon_token: missing (required), - value: CssGenericComponentValueList [], - }, + missing element, SEMICOLON@852..853 ";" [] [], ], r_paren_token: R_PAREN@853..854 ")" [] [], @@ -1155,52 +1163,38 @@ CssRoot { items: CssDeclarationOrRuleList [ CssDeclarationWithSemicolon { declaration: CssDeclaration { - property: CssBogusProperty { - items: [ - CssIdentifier { - value_token: IDENT@879..886 "color" [Newline("\n"), Whitespace("\t")] [], - }, - COLON@886..888 ":" [] [Whitespace(" ")], - CssBogus { - items: [ - CssBogusSupportsCondition { - items: [ - IF_KW@888..890 "if" [] [], - L_PAREN@890..891 "(" [] [], - CssBogus { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@879..886 "color" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@886..888 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIfFunction { + if_token: IF_KW@888..890 "if" [] [], + l_paren_token: L_PAREN@890..891 "(" [] [], + css_if_branch_list: CssIfBranchList [ + CssIfBranch { + condition: CssIfTestBooleanExprInParens { + l_paren_token: L_PAREN@891..892 "(" [] [], + expression: CssBogusIfTestBooleanExpr { items: [ - CssBogus { - items: [ - CssIfTestBooleanExprInParens { - l_paren_token: L_PAREN@891..892 "(" [] [], - expression: missing (required), - r_paren_token: missing (required), - }, - CssBogus { - items: [ - CssDashedIdentifier { - value_token: IDENT@892..897 "--foo" [] [], - }, - CssBogusPropertyValue { - items: [ - COLON@897..899 ":" [] [Whitespace(" ")], - IDENT@899..902 "bar" [] [], - R_PAREN@902..903 ")" [] [], - COLON@903..905 ":" [] [Whitespace(" ")], - IDENT@905..910 "black" [] [], - ], - }, - ], - }, - ], - }, - SEMICOLON@910..911 ";" [] [], + IDENT@892..897 "--foo" [] [], + COLON@897..899 ":" [] [Whitespace(" ")], + IDENT@899..902 "bar" [] [], ], }, - R_PAREN@911..912 ")" [] [], + r_paren_token: R_PAREN@902..903 ")" [] [], + }, + colon_token: COLON@903..905 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@905..910 "black" [] [], + }, ], }, + SEMICOLON@910..911 ";" [] [], ], + r_paren_token: R_PAREN@911..912 ")" [] [], }, ], }, @@ -1244,18 +1238,14 @@ CssRoot { if_token: IF_KW@941..943 "if" [] [], l_paren_token: L_PAREN@943..944 "(" [] [], css_if_branch_list: CssIfBranchList [ - CssIfBranch { - condition: CssBogusIfTest { - items: [ - IDENT@944..950 "custom" [] [], - L_PAREN@950..951 "(" [] [], - IDENT@951..956 "--foo" [] [], - COLON@956..958 ":" [] [Whitespace(" ")], - IDENT@958..961 "bar" [] [], - ], - }, - colon_token: missing (required), - value: CssGenericComponentValueList [], + CssBogusIfBranch { + items: [ + IDENT@944..950 "custom" [] [], + L_PAREN@950..951 "(" [] [], + IDENT@951..956 "--foo" [] [], + COLON@956..958 ":" [] [Whitespace(" ")], + IDENT@958..961 "bar" [] [], + ], }, ], r_paren_token: R_PAREN@961..962 ")" [] [], @@ -1319,25 +1309,27 @@ CssRoot { CssIfBranch { condition: CssIfTestBooleanExprInParens { l_paren_token: L_PAREN@1013..1014 "(" [] [], - expression: missing (required), - r_paren_token: missing (required), - }, - colon_token: COLON@1014..1016 ":" [] [Whitespace(" ")], - value: CssGenericComponentValueList [ - CssIdentifier { - value_token: IDENT@1016..1021 "black" [] [], + expression: CssBogusIfTestBooleanExpr { + items: [ + COLON@1014..1016 ":" [] [Whitespace(" ")], + IDENT@1016..1021 "black" [] [], + SEMICOLON@1021..1022 ";" [] [], + ], }, - ], + r_paren_token: R_PAREN@1022..1023 ")" [] [], + }, + colon_token: missing (required), + value: CssGenericComponentValueList [], }, - SEMICOLON@1021..1022 ";" [] [], + SEMICOLON@1023..1024 ";" [] [], ], - r_paren_token: R_PAREN@1022..1023 ")" [] [], + r_paren_token: missing (required), }, ], }, important: missing (optional), }, - semicolon_token: SEMICOLON@1023..1024 ";" [] [], + semicolon_token: missing (optional), }, ], r_curly_token: R_CURLY@1024..1026 "}" [Newline("\n")] [], @@ -1363,119 +1355,111 @@ CssRoot { items: CssDeclarationOrRuleList [ CssDeclarationWithSemicolon { declaration: CssDeclaration { - property: CssBogusProperty { - items: [ - CssIdentifier { - value_token: IDENT@1046..1053 "color" [Newline("\n"), Whitespace("\t")] [], - }, - COLON@1053..1055 ":" [] [Whitespace(" ")], - CssBogus { - items: [ - CssBogusSupportsCondition { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1046..1053 "color" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@1053..1055 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIfFunction { + if_token: IF_KW@1055..1057 "if" [] [], + l_paren_token: L_PAREN@1057..1058 "(" [] [], + css_if_branch_list: CssIfBranchList [ + CssBogusIfBranch { items: [ - IF_KW@1055..1057 "if" [] [], - L_PAREN@1057..1058 "(" [] [], + CssIfTestBooleanAndExpr { + left: CssIfStyleTest { + style_token: STYLE_KW@1058..1063 "style" [] [], + l_paren_token: L_PAREN@1063..1064 "(" [] [], + test: CssDeclaration { + property: CssGenericProperty { + name: CssDashedIdentifier { + value_token: IDENT@1064..1067 "--a" [] [], + }, + colon_token: COLON@1067..1069 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@1069..1070 "1" [] [], + }, + ], + }, + important: missing (optional), + }, + r_paren_token: R_PAREN@1070..1072 ")" [] [Whitespace(" ")], + }, + and_token: AND_KW@1072..1076 "and" [] [Whitespace(" ")], + right: CssIfStyleTest { + style_token: STYLE_KW@1076..1081 "style" [] [], + l_paren_token: L_PAREN@1081..1082 "(" [] [], + test: CssDeclaration { + property: CssGenericProperty { + name: CssDashedIdentifier { + value_token: IDENT@1082..1085 "--b" [] [], + }, + colon_token: COLON@1085..1087 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@1087..1088 "2" [] [], + }, + ], + }, + important: missing (optional), + }, + r_paren_token: R_PAREN@1088..1090 ")" [] [Whitespace(" ")], + }, + }, CssBogus { items: [ - CssBogus { + CssIdentifier { + value_token: IDENT@1090..1093 "or" [] [Whitespace(" ")], + }, + CssBogusSupportsCondition { items: [ - CssIfTestBooleanAndExpr { - left: CssIfStyleTest { - style_token: STYLE_KW@1058..1063 "style" [] [], - l_paren_token: L_PAREN@1063..1064 "(" [] [], - test: CssDeclaration { - property: CssGenericProperty { - name: CssDashedIdentifier { - value_token: IDENT@1064..1067 "--a" [] [], - }, - colon_token: COLON@1067..1069 ":" [] [Whitespace(" ")], - value: CssGenericComponentValueList [ - CssNumber { - value_token: CSS_NUMBER_LITERAL@1069..1070 "1" [] [], - }, - ], - }, - important: missing (optional), - }, - r_paren_token: R_PAREN@1070..1072 ")" [] [Whitespace(" ")], - }, - and_token: AND_KW@1072..1076 "and" [] [Whitespace(" ")], - right: CssIfStyleTest { - style_token: STYLE_KW@1076..1081 "style" [] [], - l_paren_token: L_PAREN@1081..1082 "(" [] [], - test: CssDeclaration { - property: CssGenericProperty { - name: CssDashedIdentifier { - value_token: IDENT@1082..1085 "--b" [] [], - }, - colon_token: COLON@1085..1087 ":" [] [Whitespace(" ")], - value: CssGenericComponentValueList [ - CssNumber { - value_token: CSS_NUMBER_LITERAL@1087..1088 "2" [] [], - }, - ], - }, - important: missing (optional), - }, - r_paren_token: R_PAREN@1088..1090 ")" [] [Whitespace(" ")], - }, + CssIdentifier { + value_token: IDENT@1093..1098 "style" [] [], }, + L_PAREN@1098..1099 "(" [] [], CssBogus { items: [ - CssIdentifier { - value_token: IDENT@1090..1093 "or" [] [Whitespace(" ")], - }, - CssBogusSupportsCondition { + CssBogus { items: [ - CssIdentifier { - value_token: IDENT@1093..1098 "style" [] [], - }, - L_PAREN@1098..1099 "(" [] [], CssBogus { items: [ CssBogus { items: [ + CssDashedIdentifier { + value_token: IDENT@1099..1102 "--c" [] [], + }, CssBogus { items: [ - CssBogus { - items: [ - CssDashedIdentifier { - value_token: IDENT@1099..1102 "--c" [] [], - }, - CssBogus { - items: [ - COLON@1102..1104 ":" [] [Whitespace(" ")], - CSS_NUMBER_LITERAL@1104..1105 "3" [] [], - ], - }, - ], - }, + COLON@1102..1104 ":" [] [Whitespace(" ")], + CSS_NUMBER_LITERAL@1104..1105 "3" [] [], ], }, ], }, ], }, - R_PAREN@1105..1106 ")" [] [], - ], - }, - CssBogusPropertyValue { - items: [ - COLON@1106..1108 ":" [] [Whitespace(" ")], - IDENT@1108..1113 "black" [] [], ], }, ], }, + R_PAREN@1105..1106 ")" [] [], + ], + }, + CssBogusPropertyValue { + items: [ + COLON@1106..1108 ":" [] [Whitespace(" ")], + IDENT@1108..1113 "black" [] [], ], }, - SEMICOLON@1113..1114 ";" [] [], ], }, - R_PAREN@1114..1115 ")" [] [], ], }, + SEMICOLON@1113..1114 ";" [] [], ], + r_paren_token: R_PAREN@1114..1115 ")" [] [], }, ], }, @@ -1597,19 +1581,15 @@ CssRoot { if_token: IF_KW@1204..1206 "if" [] [], l_paren_token: L_PAREN@1206..1207 "(" [] [], css_if_branch_list: CssIfBranchList [ - CssIfBranch { - condition: CssBogusIfTest { - items: [ - AND_KW@1207..1211 "and" [] [Whitespace(" ")], - STYLE_KW@1211..1216 "style" [] [], - L_PAREN@1216..1217 "(" [] [], - IDENT@1217..1222 "--foo" [] [], - COLON@1222..1224 ":" [] [Whitespace(" ")], - IDENT@1224..1227 "bar" [] [], - ], - }, - colon_token: missing (required), - value: CssGenericComponentValueList [], + CssBogusIfBranch { + items: [ + AND_KW@1207..1211 "and" [] [Whitespace(" ")], + STYLE_KW@1211..1216 "style" [] [], + L_PAREN@1216..1217 "(" [] [], + IDENT@1217..1222 "--foo" [] [], + COLON@1222..1224 ":" [] [Whitespace(" ")], + IDENT@1224..1227 "bar" [] [], + ], }, ], r_paren_token: R_PAREN@1227..1228 ")" [] [], @@ -1672,19 +1652,15 @@ CssRoot { if_token: IF_KW@1264..1266 "if" [] [], l_paren_token: L_PAREN@1266..1267 "(" [] [], css_if_branch_list: CssIfBranchList [ - CssIfBranch { - condition: CssBogusIfTest { - items: [ - OR_KW@1267..1270 "or" [] [Whitespace(" ")], - STYLE_KW@1270..1275 "style" [] [], - L_PAREN@1275..1276 "(" [] [], - IDENT@1276..1281 "--foo" [] [], - COLON@1281..1283 ":" [] [Whitespace(" ")], - IDENT@1283..1286 "bar" [] [], - ], - }, - colon_token: missing (required), - value: CssGenericComponentValueList [], + CssBogusIfBranch { + items: [ + OR_KW@1267..1270 "or" [] [Whitespace(" ")], + STYLE_KW@1270..1275 "style" [] [], + L_PAREN@1275..1276 "(" [] [], + IDENT@1276..1281 "--foo" [] [], + COLON@1281..1283 ":" [] [Whitespace(" ")], + IDENT@1283..1286 "bar" [] [], + ], }, ], r_paren_token: R_PAREN@1286..1287 ")" [] [], @@ -1701,18 +1677,1028 @@ CssRoot { }, important: missing (optional), }, - semicolon_token: SEMICOLON@1294..1295 ";" [] [], - }, - CssBogus { - items: [ - R_PAREN@1295..1296 ")" [] [], - ], - }, - CssEmptyDeclaration { - semicolon_token: SEMICOLON@1296..1297 ";" [] [], + semicolon_token: SEMICOLON@1294..1295 ";" [] [], + }, + CssBogus { + items: [ + R_PAREN@1295..1296 ")" [] [], + ], + }, + CssEmptyDeclaration { + semicolon_token: SEMICOLON@1296..1297 ";" [] [], + }, + ], + r_curly_token: R_CURLY@1297..1299 "}" [Newline("\n")] [], + }, + }, + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@1299..1302 "." [Newline("\n"), Newline("\n")] [], + name: CssCustomIdentifier { + value_token: IDENT@1302..1311 "empty-if" [] [Whitespace(" ")], + }, + }, + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@1311..1312 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1312..1319 "color" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@1319..1321 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIfFunction { + if_token: IF_KW@1321..1323 "if" [] [], + l_paren_token: L_PAREN@1323..1324 "(" [] [], + css_if_branch_list: CssIfBranchList [], + r_paren_token: R_PAREN@1324..1325 ")" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1325..1326 ";" [] [], + }, + ], + r_curly_token: R_CURLY@1326..1328 "}" [Newline("\n")] [], + }, + }, + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@1328..1331 "." [Newline("\n"), Newline("\n")] [], + name: CssCustomIdentifier { + value_token: IDENT@1331..1355 "if-branch-list-recovery" [] [Whitespace(" ")], + }, + }, + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@1355..1356 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1356..1359 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@1359..1361 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIfFunction { + if_token: IF_KW@1361..1363 "if" [] [], + l_paren_token: L_PAREN@1363..1364 "(" [] [], + css_if_branch_list: CssIfBranchList [ + CssIfBranch { + condition: CssIfStyleTest { + style_token: STYLE_KW@1364..1369 "style" [] [], + l_paren_token: L_PAREN@1369..1370 "(" [] [], + test: CssDeclaration { + property: CssGenericProperty { + name: CssDashedIdentifier { + value_token: IDENT@1370..1375 "--foo" [] [], + }, + colon_token: COLON@1375..1377 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@1377..1380 "bar" [] [], + }, + ], + }, + important: missing (optional), + }, + r_paren_token: R_PAREN@1380..1381 ")" [] [], + }, + colon_token: COLON@1381..1383 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@1383..1388 "black" [] [], + }, + ], + }, + SEMICOLON@1388..1390 ";" [] [Whitespace(" ")], + CssBogusIfBranch { + items: [ + BANG@1390..1391 "!" [] [], + IDENT@1391..1396 "bogus" [] [], + ], + }, + SEMICOLON@1396..1398 ";" [] [Whitespace(" ")], + CssIfBranch { + condition: CssElseKeyword { + else_token: ELSE_KW@1398..1402 "else" [] [], + }, + colon_token: COLON@1402..1404 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@1404..1409 "white" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@1409..1410 ")" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1410..1411 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1411..1414 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@1414..1416 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIfFunction { + if_token: IF_KW@1416..1418 "if" [] [], + l_paren_token: L_PAREN@1418..1419 "(" [] [], + css_if_branch_list: CssIfBranchList [ + CssIfBranch { + condition: CssIfStyleTest { + style_token: STYLE_KW@1419..1424 "style" [] [], + l_paren_token: L_PAREN@1424..1425 "(" [] [], + test: CssDeclaration { + property: CssGenericProperty { + name: CssDashedIdentifier { + value_token: IDENT@1425..1430 "--foo" [] [], + }, + colon_token: COLON@1430..1432 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@1432..1435 "bar" [] [], + }, + ], + }, + important: missing (optional), + }, + r_paren_token: R_PAREN@1435..1436 ")" [] [], + }, + colon_token: COLON@1436..1438 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@1438..1443 "black" [] [], + }, + ], + }, + SEMICOLON@1443..1445 ";" [] [Whitespace(" ")], + CssBogusIfBranch { + items: [ + ERROR_TOKEN@1445..1446 "?" [] [], + ERROR_TOKEN@1446..1447 "?" [] [], + ERROR_TOKEN@1447..1448 "?" [] [], + ], + }, + SEMICOLON@1448..1450 ";" [] [Whitespace(" ")], + CssIfBranch { + condition: CssElseKeyword { + else_token: ELSE_KW@1450..1454 "else" [] [], + }, + colon_token: COLON@1454..1456 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@1456..1461 "white" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@1461..1462 ")" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1462..1463 ";" [] [], + }, + ], + r_curly_token: R_CURLY@1463..1465 "}" [Newline("\n")] [], + }, + }, + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@1465..1468 "." [Newline("\n"), Newline("\n")] [], + name: CssCustomIdentifier { + value_token: IDENT@1468..1473 "todo" [] [Whitespace(" ")], + }, + }, + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@1473..1474 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1474..1486 "background" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@1486..1488 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIfFunction { + if_token: IF_KW@1488..1490 "if" [] [], + l_paren_token: L_PAREN@1490..1491 "(" [] [], + css_if_branch_list: CssIfBranchList [ + CssIfBranch { + condition: CssIfTestBooleanAndExpr { + left: CssIfStyleTest { + style_token: STYLE_KW@1491..1496 "style" [] [], + l_paren_token: L_PAREN@1496..1497 "(" [] [], + test: CssDeclaration { + property: CssGenericProperty { + name: CssDashedIdentifier { + value_token: IDENT@1497..1502 "--foo" [] [], + }, + colon_token: COLON@1502..1504 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@1504..1507 "bar" [] [], + }, + ], + }, + important: missing (optional), + }, + r_paren_token: R_PAREN@1507..1509 ")" [] [Whitespace(" ")], + }, + and_token: AND_KW@1509..1513 "and" [] [Whitespace(" ")], + right: CssIfTestBooleanExprInParens { + l_paren_token: L_PAREN@1513..1514 "(" [] [], + expression: CssBogusIfTestBooleanExpr { + items: [ + BANG@1514..1515 "!" [] [], + IDENT@1515..1520 "bogus" [] [], + ], + }, + r_paren_token: R_PAREN@1520..1521 ")" [] [], + }, + }, + colon_token: COLON@1521..1523 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@1523..1526 "red" [] [], + }, + ], + }, + SEMICOLON@1526..1527 ";" [] [], + ], + r_paren_token: R_PAREN@1527..1528 ")" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1528..1529 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1529..1541 "background" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@1541..1543 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIfFunction { + if_token: IF_KW@1543..1545 "if" [] [], + l_paren_token: L_PAREN@1545..1546 "(" [] [], + css_if_branch_list: CssIfBranchList [ + CssIfBranch { + condition: CssBogusIfTestBooleanExpr { + items: [ + NOT_KW@1546..1550 "not" [] [Whitespace(" ")], + CssBogusIfTestBooleanExpr { + items: [ + IDENT@1550..1553 "foo" [] [], + ], + }, + ], + }, + colon_token: COLON@1553..1555 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@1555..1558 "red" [] [], + }, + ], + }, + SEMICOLON@1558..1559 ";" [] [], + ], + r_paren_token: R_PAREN@1559..1560 ")" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1560..1561 ";" [] [], + }, + ], + r_curly_token: R_CURLY@1561..1563 "}" [Newline("\n")] [], + }, + }, + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@1563..1566 "." [Newline("\n"), Newline("\n")] [], + name: CssCustomIdentifier { + value_token: IDENT@1566..1589 "invalid-branch-content" [] [Whitespace(" ")], + }, + }, + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@1589..1590 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1590..1593 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@1593..1595 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIfFunction { + if_token: IF_KW@1595..1597 "if" [] [], + l_paren_token: L_PAREN@1597..1598 "(" [] [], + css_if_branch_list: CssIfBranchList [ + CssIfBranch { + condition: CssIfStyleTest { + style_token: STYLE_KW@1598..1603 "style" [] [], + l_paren_token: L_PAREN@1603..1604 "(" [] [], + test: CssDeclaration { + property: CssGenericProperty { + name: CssDashedIdentifier { + value_token: IDENT@1604..1609 "--foo" [] [], + }, + colon_token: COLON@1609..1611 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@1611..1614 "bar" [] [], + }, + ], + }, + important: missing (optional), + }, + r_paren_token: R_PAREN@1614..1615 ")" [] [], + }, + colon_token: COLON@1615..1617 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@1617..1622 "black" [] [], + }, + ], + }, + SEMICOLON@1622..1624 ";" [] [Whitespace(" ")], + CssBogusIfBranch { + items: [ + BANG@1624..1625 "!" [] [], + IDENT@1625..1630 "bogus" [] [], + ], + }, + SEMICOLON@1630..1632 ";" [] [Whitespace(" ")], + CssIfBranch { + condition: CssElseKeyword { + else_token: ELSE_KW@1632..1636 "else" [] [], + }, + colon_token: COLON@1636..1638 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@1638..1643 "white" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@1643..1644 ")" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1644..1645 ";" [] [], + }, + ], + r_curly_token: R_CURLY@1645..1647 "}" [Newline("\n")] [], + }, + }, + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@1647..1650 "." [Newline("\n"), Newline("\n")] [], + name: CssCustomIdentifier { + value_token: IDENT@1650..1690 "invalid-branch-content-no-trailing-semi" [] [Whitespace(" ")], + }, + }, + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@1690..1691 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1691..1694 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@1694..1696 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIfFunction { + if_token: IF_KW@1696..1698 "if" [] [], + l_paren_token: L_PAREN@1698..1699 "(" [] [], + css_if_branch_list: CssIfBranchList [ + CssIfBranch { + condition: CssIfStyleTest { + style_token: STYLE_KW@1699..1704 "style" [] [], + l_paren_token: L_PAREN@1704..1705 "(" [] [], + test: CssDeclaration { + property: CssGenericProperty { + name: CssDashedIdentifier { + value_token: IDENT@1705..1710 "--foo" [] [], + }, + colon_token: COLON@1710..1712 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@1712..1715 "bar" [] [], + }, + ], + }, + important: missing (optional), + }, + r_paren_token: R_PAREN@1715..1716 ")" [] [], + }, + colon_token: COLON@1716..1718 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@1718..1723 "black" [] [], + }, + ], + }, + SEMICOLON@1723..1725 ";" [] [Whitespace(" ")], + CssBogusIfBranch { + items: [ + BANG@1725..1726 "!" [] [], + IDENT@1726..1731 "bogus" [] [], + ], + }, + SEMICOLON@1731..1733 ";" [] [Whitespace(" ")], + CssIfBranch { + condition: CssElseKeyword { + else_token: ELSE_KW@1733..1737 "else" [] [], + }, + colon_token: COLON@1737..1739 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@1739..1744 "white" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@1744..1745 ")" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: missing (optional), + }, + ], + r_curly_token: R_CURLY@1745..1747 "}" [Newline("\n")] [], + }, + }, + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@1747..1750 "." [Newline("\n"), Newline("\n")] [], + name: CssCustomIdentifier { + value_token: IDENT@1750..1776 "multiple-invalid-branches" [] [Whitespace(" ")], + }, + }, + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@1776..1777 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1777..1780 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@1780..1782 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIfFunction { + if_token: IF_KW@1782..1784 "if" [] [], + l_paren_token: L_PAREN@1784..1785 "(" [] [], + css_if_branch_list: CssIfBranchList [ + CssIfBranch { + condition: CssIfStyleTest { + style_token: STYLE_KW@1785..1790 "style" [] [], + l_paren_token: L_PAREN@1790..1791 "(" [] [], + test: CssDeclaration { + property: CssGenericProperty { + name: CssDashedIdentifier { + value_token: IDENT@1791..1794 "--a" [] [], + }, + colon_token: COLON@1794..1796 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@1796..1797 "1" [] [], + }, + ], + }, + important: missing (optional), + }, + r_paren_token: R_PAREN@1797..1798 ")" [] [], + }, + colon_token: COLON@1798..1800 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@1800..1803 "red" [] [], + }, + ], + }, + SEMICOLON@1803..1805 ";" [] [Whitespace(" ")], + CssBogusIfBranch { + items: [ + BANG@1805..1806 "!" [] [], + BANG@1806..1807 "!" [] [], + BANG@1807..1808 "!" [] [], + ], + }, + SEMICOLON@1808..1810 ";" [] [Whitespace(" ")], + CssIfBranch { + condition: CssIfStyleTest { + style_token: STYLE_KW@1810..1815 "style" [] [], + l_paren_token: L_PAREN@1815..1816 "(" [] [], + test: CssDeclaration { + property: CssGenericProperty { + name: CssDashedIdentifier { + value_token: IDENT@1816..1819 "--b" [] [], + }, + colon_token: COLON@1819..1821 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@1821..1822 "2" [] [], + }, + ], + }, + important: missing (optional), + }, + r_paren_token: R_PAREN@1822..1823 ")" [] [], + }, + colon_token: COLON@1823..1825 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@1825..1829 "blue" [] [], + }, + ], + }, + SEMICOLON@1829..1831 ";" [] [Whitespace(" ")], + CssBogusIfBranch { + items: [ + AT@1831..1832 "@" [] [], + AT@1832..1833 "@" [] [], + AT@1833..1834 "@" [] [], + ], + }, + SEMICOLON@1834..1836 ";" [] [Whitespace(" ")], + CssIfBranch { + condition: CssElseKeyword { + else_token: ELSE_KW@1836..1840 "else" [] [], + }, + colon_token: COLON@1840..1842 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@1842..1847 "green" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@1847..1848 ")" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1848..1849 ";" [] [], + }, + ], + r_curly_token: R_CURLY@1849..1851 "}" [Newline("\n")] [], + }, + }, + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@1851..1854 "." [Newline("\n"), Newline("\n")] [], + name: CssCustomIdentifier { + value_token: IDENT@1854..1873 "invalid-then-valid" [] [Whitespace(" ")], + }, + }, + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@1873..1874 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1874..1877 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@1877..1879 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIfFunction { + if_token: IF_KW@1879..1881 "if" [] [], + l_paren_token: L_PAREN@1881..1882 "(" [] [], + css_if_branch_list: CssIfBranchList [ + CssBogusIfBranch { + items: [ + HASH@1882..1883 "#" [] [], + HASH@1883..1884 "#" [] [], + HASH@1884..1885 "#" [] [], + COLON@1885..1887 ":" [] [Whitespace(" ")], + IDENT@1887..1890 "red" [] [], + ], + }, + SEMICOLON@1890..1892 ";" [] [Whitespace(" ")], + CssIfBranch { + condition: CssIfStyleTest { + style_token: STYLE_KW@1892..1897 "style" [] [], + l_paren_token: L_PAREN@1897..1898 "(" [] [], + test: CssDeclaration { + property: CssGenericProperty { + name: CssDashedIdentifier { + value_token: IDENT@1898..1903 "--foo" [] [], + }, + colon_token: COLON@1903..1905 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@1905..1908 "bar" [] [], + }, + ], + }, + important: missing (optional), + }, + r_paren_token: R_PAREN@1908..1909 ")" [] [], + }, + colon_token: COLON@1909..1911 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@1911..1915 "blue" [] [], + }, + ], + }, + SEMICOLON@1915..1917 ";" [] [Whitespace(" ")], + CssIfBranch { + condition: CssElseKeyword { + else_token: ELSE_KW@1917..1921 "else" [] [], + }, + colon_token: COLON@1921..1923 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@1923..1928 "green" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@1928..1929 ")" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1929..1930 ";" [] [], + }, + ], + r_curly_token: R_CURLY@1930..1932 "}" [Newline("\n")] [], + }, + }, + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@1932..1935 "." [Newline("\n"), Newline("\n")] [], + name: CssCustomIdentifier { + value_token: IDENT@1935..1957 "recovery-at-semicolon" [] [Whitespace(" ")], + }, + }, + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@1957..1958 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1958..1961 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@1961..1963 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIfFunction { + if_token: IF_KW@1963..1965 "if" [] [], + l_paren_token: L_PAREN@1965..1966 "(" [] [], + css_if_branch_list: CssIfBranchList [ + CssIfBranch { + condition: CssIfStyleTest { + style_token: STYLE_KW@1966..1971 "style" [] [], + l_paren_token: L_PAREN@1971..1972 "(" [] [], + test: CssDeclaration { + property: CssGenericProperty { + name: CssDashedIdentifier { + value_token: IDENT@1972..1977 "--foo" [] [], + }, + colon_token: COLON@1977..1979 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@1979..1982 "bar" [] [], + }, + ], + }, + important: missing (optional), + }, + r_paren_token: R_PAREN@1982..1983 ")" [] [], + }, + colon_token: COLON@1983..1985 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@1985..1990 "black" [] [], + }, + ], + }, + SEMICOLON@1990..1992 ";" [] [Whitespace(" ")], + CssBogusIfBranch { + items: [ + IDENT@1992..2006 "bogus-no-colon" [] [], + ], + }, + SEMICOLON@2006..2008 ";" [] [Whitespace(" ")], + CssIfBranch { + condition: CssElseKeyword { + else_token: ELSE_KW@2008..2012 "else" [] [], + }, + colon_token: COLON@2012..2014 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@2014..2019 "white" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@2019..2020 ")" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@2020..2021 ";" [] [], + }, + ], + r_curly_token: R_CURLY@2021..2023 "}" [Newline("\n")] [], + }, + }, + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@2023..2026 "." [Newline("\n"), Newline("\n")] [], + name: CssCustomIdentifier { + value_token: IDENT@2026..2051 "multiple-if-declarations" [] [Whitespace(" ")], + }, + }, + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@2051..2052 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@2052..2055 "a" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@2055..2057 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIfFunction { + if_token: IF_KW@2057..2059 "if" [] [], + l_paren_token: L_PAREN@2059..2060 "(" [] [], + css_if_branch_list: CssIfBranchList [ + CssIfBranch { + condition: CssIfStyleTest { + style_token: STYLE_KW@2060..2065 "style" [] [], + l_paren_token: L_PAREN@2065..2066 "(" [] [], + test: CssDeclaration { + property: CssGenericProperty { + name: CssDashedIdentifier { + value_token: IDENT@2066..2071 "--foo" [] [], + }, + colon_token: COLON@2071..2073 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@2073..2076 "bar" [] [], + }, + ], + }, + important: missing (optional), + }, + r_paren_token: R_PAREN@2076..2077 ")" [] [], + }, + colon_token: COLON@2077..2079 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@2079..2084 "black" [] [], + }, + ], + }, + SEMICOLON@2084..2086 ";" [] [Whitespace(" ")], + CssIfBranch { + condition: CssElseKeyword { + else_token: ELSE_KW@2086..2090 "else" [] [], + }, + colon_token: COLON@2090..2092 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@2092..2097 "white" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@2097..2098 ")" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@2098..2099 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@2099..2102 "b" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@2102..2104 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIfFunction { + if_token: IF_KW@2104..2106 "if" [] [], + l_paren_token: L_PAREN@2106..2107 "(" [] [], + css_if_branch_list: CssIfBranchList [ + CssIfBranch { + condition: CssBogusIfTest { + items: [ + STYLE_KW@2107..2112 "style" [] [], + L_PAREN@2112..2113 "(" [] [], + CssBogus { + items: [ + IDENT@2113..2122 "--invalid" [] [], + ], + }, + R_PAREN@2122..2123 ")" [] [], + ], + }, + colon_token: COLON@2123..2125 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@2125..2128 "red" [] [], + }, + ], + }, + SEMICOLON@2128..2130 ";" [] [Whitespace(" ")], + CssBogusIfBranch { + items: [ + BANG@2130..2131 "!" [] [], + BANG@2131..2132 "!" [] [], + BANG@2132..2133 "!" [] [], + ], + }, + SEMICOLON@2133..2135 ";" [] [Whitespace(" ")], + CssIfBranch { + condition: CssElseKeyword { + else_token: ELSE_KW@2135..2139 "else" [] [], + }, + colon_token: COLON@2139..2141 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@2141..2145 "blue" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@2145..2146 ")" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@2146..2147 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@2147..2150 "c" [Newline("\n"), Whitespace("\t")] [], + }, + colon_token: COLON@2150..2152 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIfFunction { + if_token: IF_KW@2152..2154 "if" [] [], + l_paren_token: L_PAREN@2154..2155 "(" [] [], + css_if_branch_list: CssIfBranchList [ + CssIfBranch { + condition: CssIfStyleTest { + style_token: STYLE_KW@2155..2160 "style" [] [], + l_paren_token: L_PAREN@2160..2161 "(" [] [], + test: CssDeclaration { + property: CssGenericProperty { + name: CssDashedIdentifier { + value_token: IDENT@2161..2166 "--baz" [] [], + }, + colon_token: COLON@2166..2168 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@2168..2171 "qux" [] [], + }, + ], + }, + important: missing (optional), + }, + r_paren_token: R_PAREN@2171..2172 ")" [] [], + }, + colon_token: COLON@2172..2174 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@2174..2179 "green" [] [], + }, + ], + }, + SEMICOLON@2179..2181 ";" [] [Whitespace(" ")], + CssIfBranch { + condition: CssElseKeyword { + else_token: ELSE_KW@2181..2185 "else" [] [], + }, + colon_token: COLON@2185..2187 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@2187..2193 "yellow" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@2193..2194 ")" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@2194..2195 ";" [] [], }, ], - r_curly_token: R_CURLY@1297..1299 "}" [Newline("\n")] [], + r_curly_token: R_CURLY@2195..2197 "}" [Newline("\n")] [], }, }, CssQualifiedRule { @@ -1722,58 +2708,384 @@ CssRoot { simple_selector: missing (optional), sub_selectors: CssSubSelectorList [ CssClassSelector { - dot_token: DOT@1299..1302 "." [Newline("\n"), Newline("\n")] [], + dot_token: DOT@2197..2236 "." [Newline("\n"), Newline("\n"), Comments("/* Test if() inside n ..."), Newline("\n")] [], name: CssCustomIdentifier { - value_token: IDENT@1302..1311 "empty-if" [] [Whitespace(" ")], + value_token: IDENT@2236..2242 "outer" [] [Whitespace(" ")], }, }, ], }, ], block: CssDeclarationOrRuleBlock { - l_curly_token: L_CURLY@1311..1312 "{" [] [], + l_curly_token: L_CURLY@2242..2243 "{" [] [], items: CssDeclarationOrRuleList [ + CssNestedQualifiedRule { + prelude: CssRelativeSelectorList [ + CssRelativeSelector { + combinator: missing (optional), + selector: CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@2243..2246 "." [Newline("\n"), Whitespace("\t")] [], + name: CssCustomIdentifier { + value_token: IDENT@2246..2252 "inner" [] [Whitespace(" ")], + }, + }, + ], + }, + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@2252..2253 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@2253..2261 "color" [Newline("\n"), Whitespace("\t\t")] [], + }, + colon_token: COLON@2261..2263 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIfFunction { + if_token: IF_KW@2263..2265 "if" [] [], + l_paren_token: L_PAREN@2265..2266 "(" [] [], + css_if_branch_list: CssIfBranchList [ + CssIfBranch { + condition: CssIfStyleTest { + style_token: STYLE_KW@2266..2271 "style" [] [], + l_paren_token: L_PAREN@2271..2272 "(" [] [], + test: CssDeclaration { + property: CssGenericProperty { + name: CssDashedIdentifier { + value_token: IDENT@2272..2277 "--foo" [] [], + }, + colon_token: COLON@2277..2279 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@2279..2282 "bar" [] [], + }, + ], + }, + important: missing (optional), + }, + r_paren_token: R_PAREN@2282..2283 ")" [] [], + }, + colon_token: COLON@2283..2285 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@2285..2288 "red" [] [], + }, + ], + }, + SEMICOLON@2288..2290 ";" [] [Whitespace(" ")], + CssBogusIfBranch { + items: [ + BANG@2290..2291 "!" [] [], + IDENT@2291..2296 "bogus" [] [], + ], + }, + SEMICOLON@2296..2298 ";" [] [Whitespace(" ")], + CssIfBranch { + condition: CssElseKeyword { + else_token: ELSE_KW@2298..2302 "else" [] [], + }, + colon_token: COLON@2302..2304 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@2304..2308 "blue" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@2308..2309 ")" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@2309..2310 ";" [] [], + }, + ], + r_curly_token: R_CURLY@2310..2313 "}" [Newline("\n"), Whitespace("\t")] [], + }, + }, CssDeclarationWithSemicolon { declaration: CssDeclaration { property: CssGenericProperty { name: CssIdentifier { - value_token: IDENT@1312..1319 "color" [Newline("\n"), Whitespace("\t")] [], + value_token: IDENT@2313..2316 "a" [Newline("\n"), Whitespace("\t")] [], }, - colon_token: COLON@1319..1321 ":" [] [Whitespace(" ")], + colon_token: COLON@2316..2318 ":" [] [Whitespace(" ")], value: CssGenericComponentValueList [ CssIfFunction { - if_token: IF_KW@1321..1323 "if" [] [], - l_paren_token: L_PAREN@1323..1324 "(" [] [], + if_token: IF_KW@2318..2320 "if" [] [], + l_paren_token: L_PAREN@2320..2321 "(" [] [], css_if_branch_list: CssIfBranchList [ CssIfBranch { - condition: missing (required), - colon_token: missing (required), - value: CssGenericComponentValueList [], + condition: CssIfStyleTest { + style_token: STYLE_KW@2321..2326 "style" [] [], + l_paren_token: L_PAREN@2326..2327 "(" [] [], + test: CssDeclaration { + property: CssGenericProperty { + name: CssDashedIdentifier { + value_token: IDENT@2327..2333 "--test" [] [], + }, + colon_token: COLON@2333..2335 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@2335..2338 "val" [] [], + }, + ], + }, + important: missing (optional), + }, + r_paren_token: R_PAREN@2338..2339 ")" [] [], + }, + colon_token: COLON@2339..2341 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@2341..2346 "green" [] [], + }, + ], + }, + SEMICOLON@2346..2348 ";" [] [Whitespace(" ")], + CssIfBranch { + condition: CssElseKeyword { + else_token: ELSE_KW@2348..2352 "else" [] [], + }, + colon_token: COLON@2352..2354 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@2354..2360 "yellow" [] [], + }, + ], }, ], - r_paren_token: R_PAREN@1324..1325 ")" [] [], + r_paren_token: R_PAREN@2360..2361 ")" [] [], }, ], }, important: missing (optional), }, - semicolon_token: SEMICOLON@1325..1326 ";" [] [], + semicolon_token: SEMICOLON@2361..2362 ";" [] [], }, ], - r_curly_token: R_CURLY@1326..1328 "}" [Newline("\n")] [], + r_curly_token: R_CURLY@2362..2364 "}" [Newline("\n")] [], + }, + }, + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@2364..2419 "." [Newline("\n"), Newline("\n"), Comments("/* Deeply nested with ..."), Newline("\n")] [], + name: CssCustomIdentifier { + value_token: IDENT@2419..2426 "level1" [] [Whitespace(" ")], + }, + }, + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@2426..2427 "{" [] [], + items: CssDeclarationOrRuleList [ + CssNestedQualifiedRule { + prelude: CssRelativeSelectorList [ + CssRelativeSelector { + combinator: missing (optional), + selector: CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@2427..2430 "." [Newline("\n"), Whitespace("\t")] [], + name: CssCustomIdentifier { + value_token: IDENT@2430..2437 "level2" [] [Whitespace(" ")], + }, + }, + ], + }, + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@2437..2438 "{" [] [], + items: CssDeclarationOrRuleList [ + CssNestedQualifiedRule { + prelude: CssRelativeSelectorList [ + CssRelativeSelector { + combinator: missing (optional), + selector: CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@2438..2442 "." [Newline("\n"), Whitespace("\t\t")] [], + name: CssCustomIdentifier { + value_token: IDENT@2442..2449 "level3" [] [Whitespace(" ")], + }, + }, + ], + }, + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@2449..2450 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@2450..2455 "a" [Newline("\n"), Whitespace("\t\t\t")] [], + }, + colon_token: COLON@2455..2457 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIfFunction { + if_token: IF_KW@2457..2459 "if" [] [], + l_paren_token: L_PAREN@2459..2460 "(" [] [], + css_if_branch_list: CssIfBranchList [ + CssIfBranch { + condition: CssIfStyleTest { + style_token: STYLE_KW@2460..2465 "style" [] [], + l_paren_token: L_PAREN@2465..2466 "(" [] [], + test: CssDeclaration { + property: CssGenericProperty { + name: CssDashedIdentifier { + value_token: IDENT@2466..2472 "--deep" [] [], + }, + colon_token: COLON@2472..2474 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@2474..2478 "true" [] [], + }, + ], + }, + important: missing (optional), + }, + r_paren_token: R_PAREN@2478..2479 ")" [] [], + }, + colon_token: COLON@2479..2481 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@2481..2484 "red" [] [], + }, + ], + }, + SEMICOLON@2484..2486 ";" [] [Whitespace(" ")], + CssBogusIfBranch { + items: [ + BANG@2486..2487 "!" [] [], + BANG@2487..2488 "!" [] [], + BANG@2488..2489 "!" [] [], + ], + }, + SEMICOLON@2489..2491 ";" [] [Whitespace(" ")], + CssIfBranch { + condition: CssElseKeyword { + else_token: ELSE_KW@2491..2495 "else" [] [], + }, + colon_token: COLON@2495..2497 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@2497..2501 "blue" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@2501..2502 ")" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@2502..2503 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@2503..2508 "b" [Newline("\n"), Whitespace("\t\t\t")] [], + }, + colon_token: COLON@2508..2510 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIfFunction { + if_token: IF_KW@2510..2512 "if" [] [], + l_paren_token: L_PAREN@2512..2513 "(" [] [], + css_if_branch_list: CssIfBranchList [ + CssIfBranch { + condition: CssIfStyleTest { + style_token: STYLE_KW@2513..2518 "style" [] [], + l_paren_token: L_PAREN@2518..2519 "(" [] [], + test: CssDeclaration { + property: CssGenericProperty { + name: CssDashedIdentifier { + value_token: IDENT@2519..2526 "--valid" [] [], + }, + colon_token: COLON@2526..2528 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@2528..2533 "false" [] [], + }, + ], + }, + important: missing (optional), + }, + r_paren_token: R_PAREN@2533..2534 ")" [] [], + }, + colon_token: COLON@2534..2536 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@2536..2541 "green" [] [], + }, + ], + }, + SEMICOLON@2541..2543 ";" [] [Whitespace(" ")], + CssIfBranch { + condition: CssElseKeyword { + else_token: ELSE_KW@2543..2547 "else" [] [], + }, + colon_token: COLON@2547..2549 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@2549..2555 "yellow" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@2555..2556 ")" [] [], + }, + ], + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@2556..2557 ";" [] [], + }, + ], + r_curly_token: R_CURLY@2557..2561 "}" [Newline("\n"), Whitespace("\t\t")] [], + }, + }, + ], + r_curly_token: R_CURLY@2561..2564 "}" [Newline("\n"), Whitespace("\t")] [], + }, + }, + ], + r_curly_token: R_CURLY@2564..2566 "}" [Newline("\n")] [], }, }, ], - eof_token: EOF@1328..1329 "" [Newline("\n")] [], + eof_token: EOF@2566..2567 "" [Newline("\n")] [], } ``` ## CST ``` -0: CSS_ROOT@0..1329 +0: CSS_ROOT@0..2567 0: (empty) - 1: CSS_RULE_LIST@0..1328 + 1: CSS_RULE_LIST@0..2566 0: CSS_QUALIFIED_RULE@0..55 0: CSS_SELECTOR_LIST@0..15 0: CSS_COMPOUND_SELECTOR@0..15 @@ -1844,12 +3156,9 @@ CssRoot { 0: IF_KW@84..86 "if" [] [] 1: L_PAREN@86..87 "(" [] [] 2: CSS_IF_BRANCH_LIST@87..94 - 0: CSS_IF_BRANCH@87..94 - 0: (empty) - 1: COLON@87..89 ":" [] [Whitespace(" ")] - 2: CSS_GENERIC_COMPONENT_VALUE_LIST@89..94 - 0: CSS_IDENTIFIER@89..94 - 0: IDENT@89..94 "black" [] [] + 0: CSS_BOGUS_IF_BRANCH@87..94 + 0: COLON@87..89 ":" [] [Whitespace(" ")] + 1: IDENT@89..94 "black" [] [] 3: R_PAREN@94..95 ")" [] [] 1: (empty) 1: SEMICOLON@95..96 ";" [] [] @@ -1868,37 +3177,40 @@ CssRoot { 0: L_CURLY@116..117 "{" [] [] 1: CSS_DECLARATION_OR_RULE_LIST@117..154 0: CSS_DECLARATION_WITH_SEMICOLON@117..154 - 0: CSS_DECLARATION@117..153 - 0: CSS_GENERIC_PROPERTY@117..153 + 0: CSS_DECLARATION@117..154 + 0: CSS_GENERIC_PROPERTY@117..154 0: CSS_IDENTIFIER@117..124 0: IDENT@117..124 "color" [Newline("\n"), Whitespace("\t")] [] 1: COLON@124..126 ":" [] [Whitespace(" ")] - 2: CSS_GENERIC_COMPONENT_VALUE_LIST@126..153 - 0: CSS_IF_FUNCTION@126..153 + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@126..154 + 0: CSS_IF_FUNCTION@126..154 0: IF_KW@126..128 "if" [] [] 1: L_PAREN@128..129 "(" [] [] - 2: CSS_IF_BRANCH_LIST@129..152 - 0: CSS_IF_BRANCH@129..152 - 0: CSS_IF_STYLE_TEST@129..145 + 2: CSS_IF_BRANCH_LIST@129..154 + 0: CSS_IF_BRANCH@129..153 + 0: CSS_IF_STYLE_TEST@129..153 0: STYLE_KW@129..134 "style" [] [] 1: L_PAREN@134..135 "(" [] [] - 2: CSS_DECLARATION@135..145 - 0: CSS_GENERIC_PROPERTY@135..145 + 2: CSS_DECLARATION@135..153 + 0: CSS_BOGUS_PROPERTY@135..153 0: CSS_DASHED_IDENTIFIER@135..140 0: IDENT@135..140 "--foo" [] [] 1: COLON@140..142 ":" [] [Whitespace(" ")] - 2: CSS_GENERIC_COMPONENT_VALUE_LIST@142..145 + 2: CSS_BOGUS@142..153 0: CSS_IDENTIFIER@142..145 0: IDENT@142..145 "bar" [] [] + 1: CSS_BOGUS_PROPERTY_VALUE@145..153 + 0: COLON@145..147 ":" [] [Whitespace(" ")] + 1: IDENT@147..152 "black" [] [] + 2: R_PAREN@152..153 ")" [] [] 1: (empty) 3: (empty) - 1: COLON@145..147 ":" [] [Whitespace(" ")] - 2: CSS_GENERIC_COMPONENT_VALUE_LIST@147..152 - 0: CSS_IDENTIFIER@147..152 - 0: IDENT@147..152 "black" [] [] - 3: R_PAREN@152..153 ")" [] [] + 1: (empty) + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@153..153 + 1: SEMICOLON@153..154 ";" [] [] + 3: (empty) 1: (empty) - 1: SEMICOLON@153..154 ";" [] [] + 1: (empty) 2: R_CURLY@154..156 "}" [Newline("\n")] [] 3: CSS_QUALIFIED_RULE@156..227 0: CSS_SELECTOR_LIST@156..179 @@ -1915,17 +3227,17 @@ CssRoot { 1: CSS_DECLARATION_OR_RULE_LIST@180..225 0: CSS_DECLARATION_WITH_SEMICOLON@180..225 0: CSS_DECLARATION@180..224 - 0: CSS_BOGUS_PROPERTY@180..224 + 0: CSS_GENERIC_PROPERTY@180..224 0: CSS_IDENTIFIER@180..187 0: IDENT@180..187 "color" [Newline("\n"), Whitespace("\t")] [] 1: COLON@187..189 ":" [] [Whitespace(" ")] - 2: CSS_BOGUS@189..224 - 0: CSS_BOGUS_SUPPORTS_CONDITION@189..224 + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@189..224 + 0: CSS_IF_FUNCTION@189..224 0: IF_KW@189..191 "if" [] [] 1: L_PAREN@191..192 "(" [] [] - 2: CSS_BOGUS@192..223 - 0: CSS_BOGUS@192..223 - 0: CSS_BOGUS@192..216 + 2: CSS_IF_BRANCH_LIST@192..223 + 0: CSS_IF_BRANCH@192..223 + 0: CSS_BOGUS_IF_TEST@192..216 0: STYLE_KW@192..197 "style" [] [] 1: L_PAREN@197..198 "(" [] [] 2: CSS_BOGUS@198..215 @@ -1956,43 +3268,38 @@ CssRoot { 1: CSS_DECLARATION_OR_RULE_BLOCK@241..289 0: L_CURLY@241..242 "{" [] [] 1: CSS_DECLARATION_OR_RULE_LIST@242..287 - 0: CSS_DECLARATION_WITH_SEMICOLON@242..287 - 0: CSS_DECLARATION@242..286 - 0: CSS_BOGUS_PROPERTY@242..286 + 0: CSS_DECLARATION_WITH_SEMICOLON@242..285 + 0: CSS_DECLARATION@242..284 + 0: CSS_BOGUS_PROPERTY@242..284 0: CSS_IDENTIFIER@242..249 0: IDENT@242..249 "color" [Newline("\n"), Whitespace("\t")] [] 1: COLON@249..251 ":" [] [Whitespace(" ")] - 2: CSS_BOGUS@251..286 - 0: CSS_BOGUS_SUPPORTS_CONDITION@251..286 + 2: CSS_BOGUS@251..284 + 0: CSS_IF_FUNCTION@251..277 0: IF_KW@251..253 "if" [] [] 1: L_PAREN@253..254 "(" [] [] - 2: CSS_BOGUS@254..285 - 0: CSS_BOGUS@254..284 - 0: CSS_IF_TEST_BOOLEAN_NOT_EXPR@254..258 + 2: CSS_IF_BRANCH_LIST@254..276 + 0: CSS_IF_BRANCH@254..276 + 0: CSS_BOGUS_IF_TEST_BOOLEAN_EXPR@254..269 0: NOT_KW@254..258 "not" [] [Whitespace(" ")] - 1: (empty) - 1: CSS_BOGUS@258..284 - 0: CSS_BOGUS_SUPPORTS_CONDITION@258..277 - 0: CSS_IDENTIFIER@258..261 - 0: IDENT@258..261 "not" [] [] + 1: CSS_BOGUS_IF_TEST_BOOLEAN_EXPR@258..269 + 0: NOT_KW@258..261 "not" [] [] 1: L_PAREN@261..262 "(" [] [] - 2: CSS_BOGUS@262..276 - 0: CSS_BOGUS@262..276 - 0: CSS_BOGUS@262..276 - 0: CSS_BOGUS@262..276 - 0: CSS_DASHED_IDENTIFIER@262..269 - 0: IDENT@262..269 "--style" [] [] - 1: CSS_BOGUS@269..276 - 0: COLON@269..271 ":" [] [Whitespace(" ")] - 1: IDENT@271..276 "black" [] [] - 3: R_PAREN@276..277 ")" [] [] - 1: CSS_BOGUS_PROPERTY_VALUE@277..284 - 0: COLON@277..279 ":" [] [Whitespace(" ")] - 1: IDENT@279..284 "black" [] [] - 1: SEMICOLON@284..285 ";" [] [] - 3: R_PAREN@285..286 ")" [] [] + 2: IDENT@262..269 "--style" [] [] + 1: COLON@269..271 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@271..276 + 0: CSS_IDENTIFIER@271..276 + 0: IDENT@271..276 "black" [] [] + 3: R_PAREN@276..277 ")" [] [] + 1: CSS_BOGUS_PROPERTY_VALUE@277..284 + 0: COLON@277..279 ":" [] [Whitespace(" ")] + 1: IDENT@279..284 "black" [] [] 1: (empty) - 1: SEMICOLON@286..287 ";" [] [] + 1: SEMICOLON@284..285 ";" [] [] + 1: CSS_BOGUS@285..286 + 0: R_PAREN@285..286 ")" [] [] + 2: CSS_EMPTY_DECLARATION@286..287 + 0: SEMICOLON@286..287 ";" [] [] 2: R_CURLY@287..289 "}" [Newline("\n")] [] 5: CSS_QUALIFIED_RULE@289..383 0: CSS_SELECTOR_LIST@289..307 @@ -2014,11 +3321,11 @@ CssRoot { 0: IDENT@308..315 "color" [Newline("\n"), Whitespace("\t")] [] 1: COLON@315..317 ":" [] [Whitespace(" ")] 2: CSS_BOGUS@317..378 - 0: CSS_BOGUS_SUPPORTS_CONDITION@317..371 + 0: CSS_IF_FUNCTION@317..371 0: IF_KW@317..319 "if" [] [] 1: L_PAREN@319..320 "(" [] [] - 2: CSS_BOGUS@320..370 - 0: CSS_BOGUS@320..370 + 2: CSS_IF_BRANCH_LIST@320..370 + 0: CSS_BOGUS_IF_BRANCH@320..370 0: CSS_IF_TEST_BOOLEAN_NOT_EXPR@320..351 0: NOT_KW@320..324 "not" [] [Whitespace(" ")] 1: CSS_IF_TEST_BOOLEAN_EXPR_IN_PARENS@324..351 @@ -2137,14 +3444,11 @@ CssRoot { 0: IF_KW@483..485 "if" [] [] 1: L_PAREN@485..486 "(" [] [] 2: CSS_IF_BRANCH_LIST@486..505 - 0: CSS_IF_BRANCH@486..505 - 0: CSS_BOGUS_IF_TEST@486..505 - 0: SUPPORTS_KW@486..495 "supports" [] [Whitespace(" ")] - 1: IDENT@495..500 "--foo" [] [] - 2: COLON@500..502 ":" [] [Whitespace(" ")] - 3: IDENT@502..505 "bar" [] [] - 1: (empty) - 2: CSS_GENERIC_COMPONENT_VALUE_LIST@505..505 + 0: CSS_BOGUS_IF_BRANCH@486..505 + 0: SUPPORTS_KW@486..495 "supports" [] [Whitespace(" ")] + 1: IDENT@495..500 "--foo" [] [] + 2: COLON@500..502 ":" [] [Whitespace(" ")] + 3: IDENT@502..505 "bar" [] [] 3: R_PAREN@505..506 ")" [] [] 1: CSS_BOGUS_PROPERTY_VALUE@506..513 0: COLON@506..508 ":" [] [Whitespace(" ")] @@ -2222,8 +3526,8 @@ CssRoot { 0: IF_KW@616..618 "if" [] [] 1: L_PAREN@618..619 "(" [] [] 2: CSS_IF_BRANCH_LIST@619..648 - 0: CSS_IF_BRANCH@619..647 - 0: CSS_IF_TEST_BOOLEAN_AND_EXPR@619..640 + 0: CSS_IF_BRANCH@619..648 + 0: CSS_BOGUS_IF_TEST_BOOLEAN_EXPR@619..648 0: CSS_IF_STYLE_TEST@619..637 0: STYLE_KW@619..624 "style" [] [] 1: L_PAREN@624..625 "(" [] [] @@ -2238,12 +3542,12 @@ CssRoot { 1: (empty) 3: R_PAREN@635..637 ")" [] [Whitespace(" ")] 1: AND_KW@637..640 "and" [] [] - 2: (empty) - 1: COLON@640..642 ":" [] [Whitespace(" ")] - 2: CSS_GENERIC_COMPONENT_VALUE_LIST@642..647 - 0: CSS_IDENTIFIER@642..647 - 0: IDENT@642..647 "black" [] [] - 1: SEMICOLON@647..648 ";" [] [] + 2: CSS_BOGUS_IF_TEST_BOOLEAN_EXPR@640..648 + 0: COLON@640..642 ":" [] [Whitespace(" ")] + 1: IDENT@642..647 "black" [] [] + 2: SEMICOLON@647..648 ";" [] [] + 1: (empty) + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@648..648 3: R_PAREN@648..649 ")" [] [] 1: (empty) 1: SEMICOLON@649..650 ";" [] [] @@ -2272,8 +3576,8 @@ CssRoot { 0: IF_KW@684..686 "if" [] [] 1: L_PAREN@686..687 "(" [] [] 2: CSS_IF_BRANCH_LIST@687..715 - 0: CSS_IF_BRANCH@687..714 - 0: CSS_IF_TEST_BOOLEAN_OR_EXPR@687..707 + 0: CSS_IF_BRANCH@687..715 + 0: CSS_BOGUS_IF_TEST_BOOLEAN_EXPR@687..715 0: CSS_IF_STYLE_TEST@687..705 0: STYLE_KW@687..692 "style" [] [] 1: L_PAREN@692..693 "(" [] [] @@ -2288,12 +3592,12 @@ CssRoot { 1: (empty) 3: R_PAREN@703..705 ")" [] [Whitespace(" ")] 1: OR_KW@705..707 "or" [] [] - 2: (empty) - 1: COLON@707..709 ":" [] [Whitespace(" ")] - 2: CSS_GENERIC_COMPONENT_VALUE_LIST@709..714 - 0: CSS_IDENTIFIER@709..714 - 0: IDENT@709..714 "black" [] [] - 1: SEMICOLON@714..715 ";" [] [] + 2: CSS_BOGUS_IF_TEST_BOOLEAN_EXPR@707..715 + 0: COLON@707..709 ":" [] [Whitespace(" ")] + 1: IDENT@709..714 "black" [] [] + 2: SEMICOLON@714..715 ";" [] [] + 1: (empty) + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@715..715 3: R_PAREN@715..716 ")" [] [] 1: (empty) 1: SEMICOLON@716..717 ";" [] [] @@ -2341,20 +3645,11 @@ CssRoot { 0: CSS_IDENTIFIER@767..772 0: IDENT@767..772 "black" [] [] 1: SEMICOLON@772..774 ";" [] [Whitespace(" ")] - 2: CSS_IF_BRANCH@774..779 - 0: (empty) - 1: (empty) - 2: CSS_GENERIC_COMPONENT_VALUE_LIST@774..779 - 0: CSS_IDENTIFIER@774..779 - 0: IDENT@774..779 "elsif" [] [] - 3: (empty) - 4: CSS_IF_BRANCH@779..786 - 0: (empty) + 2: CSS_BOGUS_IF_BRANCH@774..786 + 0: IDENT@774..779 "elsif" [] [] 1: COLON@779..781 ":" [] [Whitespace(" ")] - 2: CSS_GENERIC_COMPONENT_VALUE_LIST@781..786 - 0: CSS_IDENTIFIER@781..786 - 0: IDENT@781..786 "white" [] [] - 5: SEMICOLON@786..787 ";" [] [] + 2: IDENT@781..786 "white" [] [] + 3: SEMICOLON@786..787 ";" [] [] 3: R_PAREN@787..788 ")" [] [] 1: (empty) 1: SEMICOLON@788..789 ";" [] [] @@ -2402,10 +3697,7 @@ CssRoot { 0: CSS_IDENTIFIER@846..851 0: IDENT@846..851 "black" [] [] 1: SEMICOLON@851..852 ";" [] [] - 2: CSS_IF_BRANCH@852..852 - 0: (empty) - 1: (empty) - 2: CSS_GENERIC_COMPONENT_VALUE_LIST@852..852 + 2: (empty) 3: SEMICOLON@852..853 ";" [] [] 3: R_PAREN@853..854 ")" [] [] 1: (empty) @@ -2426,29 +3718,27 @@ CssRoot { 1: CSS_DECLARATION_OR_RULE_LIST@879..913 0: CSS_DECLARATION_WITH_SEMICOLON@879..913 0: CSS_DECLARATION@879..912 - 0: CSS_BOGUS_PROPERTY@879..912 + 0: CSS_GENERIC_PROPERTY@879..912 0: CSS_IDENTIFIER@879..886 0: IDENT@879..886 "color" [Newline("\n"), Whitespace("\t")] [] 1: COLON@886..888 ":" [] [Whitespace(" ")] - 2: CSS_BOGUS@888..912 - 0: CSS_BOGUS_SUPPORTS_CONDITION@888..912 + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@888..912 + 0: CSS_IF_FUNCTION@888..912 0: IF_KW@888..890 "if" [] [] 1: L_PAREN@890..891 "(" [] [] - 2: CSS_BOGUS@891..911 - 0: CSS_BOGUS@891..910 - 0: CSS_IF_TEST_BOOLEAN_EXPR_IN_PARENS@891..892 + 2: CSS_IF_BRANCH_LIST@891..911 + 0: CSS_IF_BRANCH@891..910 + 0: CSS_IF_TEST_BOOLEAN_EXPR_IN_PARENS@891..903 0: L_PAREN@891..892 "(" [] [] - 1: (empty) - 2: (empty) - 1: CSS_BOGUS@892..910 - 0: CSS_DASHED_IDENTIFIER@892..897 + 1: CSS_BOGUS_IF_TEST_BOOLEAN_EXPR@892..902 0: IDENT@892..897 "--foo" [] [] - 1: CSS_BOGUS_PROPERTY_VALUE@897..910 - 0: COLON@897..899 ":" [] [Whitespace(" ")] - 1: IDENT@899..902 "bar" [] [] - 2: R_PAREN@902..903 ")" [] [] - 3: COLON@903..905 ":" [] [Whitespace(" ")] - 4: IDENT@905..910 "black" [] [] + 1: COLON@897..899 ":" [] [Whitespace(" ")] + 2: IDENT@899..902 "bar" [] [] + 2: R_PAREN@902..903 ")" [] [] + 1: COLON@903..905 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@905..910 + 0: CSS_IDENTIFIER@905..910 + 0: IDENT@905..910 "black" [] [] 1: SEMICOLON@910..911 ";" [] [] 3: R_PAREN@911..912 ")" [] [] 1: (empty) @@ -2478,15 +3768,12 @@ CssRoot { 0: IF_KW@941..943 "if" [] [] 1: L_PAREN@943..944 "(" [] [] 2: CSS_IF_BRANCH_LIST@944..961 - 0: CSS_IF_BRANCH@944..961 - 0: CSS_BOGUS_IF_TEST@944..961 - 0: IDENT@944..950 "custom" [] [] - 1: L_PAREN@950..951 "(" [] [] - 2: IDENT@951..956 "--foo" [] [] - 3: COLON@956..958 ":" [] [Whitespace(" ")] - 4: IDENT@958..961 "bar" [] [] - 1: (empty) - 2: CSS_GENERIC_COMPONENT_VALUE_LIST@961..961 + 0: CSS_BOGUS_IF_BRANCH@944..961 + 0: IDENT@944..950 "custom" [] [] + 1: L_PAREN@950..951 "(" [] [] + 2: IDENT@951..956 "--foo" [] [] + 3: COLON@956..958 ":" [] [Whitespace(" ")] + 4: IDENT@958..961 "bar" [] [] 3: R_PAREN@961..962 ")" [] [] 1: CSS_BOGUS_PROPERTY_VALUE@962..969 0: COLON@962..964 ":" [] [Whitespace(" ")] @@ -2512,29 +3799,30 @@ CssRoot { 0: L_CURLY@1000..1001 "{" [] [] 1: CSS_DECLARATION_OR_RULE_LIST@1001..1024 0: CSS_DECLARATION_WITH_SEMICOLON@1001..1024 - 0: CSS_DECLARATION@1001..1023 - 0: CSS_GENERIC_PROPERTY@1001..1023 + 0: CSS_DECLARATION@1001..1024 + 0: CSS_GENERIC_PROPERTY@1001..1024 0: CSS_IDENTIFIER@1001..1008 0: IDENT@1001..1008 "color" [Newline("\n"), Whitespace("\t")] [] 1: COLON@1008..1010 ":" [] [Whitespace(" ")] - 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1010..1023 - 0: CSS_IF_FUNCTION@1010..1023 + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1010..1024 + 0: CSS_IF_FUNCTION@1010..1024 0: IF_KW@1010..1012 "if" [] [] 1: L_PAREN@1012..1013 "(" [] [] - 2: CSS_IF_BRANCH_LIST@1013..1022 - 0: CSS_IF_BRANCH@1013..1021 - 0: CSS_IF_TEST_BOOLEAN_EXPR_IN_PARENS@1013..1014 + 2: CSS_IF_BRANCH_LIST@1013..1024 + 0: CSS_IF_BRANCH@1013..1023 + 0: CSS_IF_TEST_BOOLEAN_EXPR_IN_PARENS@1013..1023 0: L_PAREN@1013..1014 "(" [] [] - 1: (empty) - 2: (empty) - 1: COLON@1014..1016 ":" [] [Whitespace(" ")] - 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1016..1021 - 0: CSS_IDENTIFIER@1016..1021 - 0: IDENT@1016..1021 "black" [] [] - 1: SEMICOLON@1021..1022 ";" [] [] - 3: R_PAREN@1022..1023 ")" [] [] + 1: CSS_BOGUS_IF_TEST_BOOLEAN_EXPR@1014..1022 + 0: COLON@1014..1016 ":" [] [Whitespace(" ")] + 1: IDENT@1016..1021 "black" [] [] + 2: SEMICOLON@1021..1022 ";" [] [] + 2: R_PAREN@1022..1023 ")" [] [] + 1: (empty) + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1023..1023 + 1: SEMICOLON@1023..1024 ";" [] [] + 3: (empty) 1: (empty) - 1: SEMICOLON@1023..1024 ";" [] [] + 1: (empty) 2: R_CURLY@1024..1026 "}" [Newline("\n")] [] 16: CSS_QUALIFIED_RULE@1026..1118 0: CSS_SELECTOR_LIST@1026..1045 @@ -2551,16 +3839,16 @@ CssRoot { 1: CSS_DECLARATION_OR_RULE_LIST@1046..1116 0: CSS_DECLARATION_WITH_SEMICOLON@1046..1116 0: CSS_DECLARATION@1046..1115 - 0: CSS_BOGUS_PROPERTY@1046..1115 + 0: CSS_GENERIC_PROPERTY@1046..1115 0: CSS_IDENTIFIER@1046..1053 0: IDENT@1046..1053 "color" [Newline("\n"), Whitespace("\t")] [] 1: COLON@1053..1055 ":" [] [Whitespace(" ")] - 2: CSS_BOGUS@1055..1115 - 0: CSS_BOGUS_SUPPORTS_CONDITION@1055..1115 + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1055..1115 + 0: CSS_IF_FUNCTION@1055..1115 0: IF_KW@1055..1057 "if" [] [] 1: L_PAREN@1057..1058 "(" [] [] - 2: CSS_BOGUS@1058..1114 - 0: CSS_BOGUS@1058..1113 + 2: CSS_IF_BRANCH_LIST@1058..1114 + 0: CSS_BOGUS_IF_BRANCH@1058..1113 0: CSS_IF_TEST_BOOLEAN_AND_EXPR@1058..1090 0: CSS_IF_STYLE_TEST@1058..1072 0: STYLE_KW@1058..1063 "style" [] [] @@ -2690,16 +3978,13 @@ CssRoot { 0: IF_KW@1204..1206 "if" [] [] 1: L_PAREN@1206..1207 "(" [] [] 2: CSS_IF_BRANCH_LIST@1207..1227 - 0: CSS_IF_BRANCH@1207..1227 - 0: CSS_BOGUS_IF_TEST@1207..1227 - 0: AND_KW@1207..1211 "and" [] [Whitespace(" ")] - 1: STYLE_KW@1211..1216 "style" [] [] - 2: L_PAREN@1216..1217 "(" [] [] - 3: IDENT@1217..1222 "--foo" [] [] - 4: COLON@1222..1224 ":" [] [Whitespace(" ")] - 5: IDENT@1224..1227 "bar" [] [] - 1: (empty) - 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1227..1227 + 0: CSS_BOGUS_IF_BRANCH@1207..1227 + 0: AND_KW@1207..1211 "and" [] [Whitespace(" ")] + 1: STYLE_KW@1211..1216 "style" [] [] + 2: L_PAREN@1216..1217 "(" [] [] + 3: IDENT@1217..1222 "--foo" [] [] + 4: COLON@1222..1224 ":" [] [Whitespace(" ")] + 5: IDENT@1224..1227 "bar" [] [] 3: R_PAREN@1227..1228 ")" [] [] 1: CSS_BOGUS_PROPERTY_VALUE@1228..1235 0: COLON@1228..1230 ":" [] [Whitespace(" ")] @@ -2735,16 +4020,13 @@ CssRoot { 0: IF_KW@1264..1266 "if" [] [] 1: L_PAREN@1266..1267 "(" [] [] 2: CSS_IF_BRANCH_LIST@1267..1286 - 0: CSS_IF_BRANCH@1267..1286 - 0: CSS_BOGUS_IF_TEST@1267..1286 - 0: OR_KW@1267..1270 "or" [] [Whitespace(" ")] - 1: STYLE_KW@1270..1275 "style" [] [] - 2: L_PAREN@1275..1276 "(" [] [] - 3: IDENT@1276..1281 "--foo" [] [] - 4: COLON@1281..1283 ":" [] [Whitespace(" ")] - 5: IDENT@1283..1286 "bar" [] [] - 1: (empty) - 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1286..1286 + 0: CSS_BOGUS_IF_BRANCH@1267..1286 + 0: OR_KW@1267..1270 "or" [] [Whitespace(" ")] + 1: STYLE_KW@1270..1275 "style" [] [] + 2: L_PAREN@1275..1276 "(" [] [] + 3: IDENT@1276..1281 "--foo" [] [] + 4: COLON@1281..1283 ":" [] [Whitespace(" ")] + 5: IDENT@1283..1286 "bar" [] [] 3: R_PAREN@1286..1287 ")" [] [] 1: CSS_BOGUS_PROPERTY_VALUE@1287..1294 0: COLON@1287..1289 ":" [] [Whitespace(" ")] @@ -2780,15 +4062,887 @@ CssRoot { 0: IF_KW@1321..1323 "if" [] [] 1: L_PAREN@1323..1324 "(" [] [] 2: CSS_IF_BRANCH_LIST@1324..1324 - 0: CSS_IF_BRANCH@1324..1324 - 0: (empty) - 1: (empty) - 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1324..1324 3: R_PAREN@1324..1325 ")" [] [] 1: (empty) 1: SEMICOLON@1325..1326 ";" [] [] 2: R_CURLY@1326..1328 "}" [Newline("\n")] [] - 2: EOF@1328..1329 "" [Newline("\n")] [] + 21: CSS_QUALIFIED_RULE@1328..1465 + 0: CSS_SELECTOR_LIST@1328..1355 + 0: CSS_COMPOUND_SELECTOR@1328..1355 + 0: CSS_NESTED_SELECTOR_LIST@1328..1328 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@1328..1355 + 0: CSS_CLASS_SELECTOR@1328..1355 + 0: DOT@1328..1331 "." [Newline("\n"), Newline("\n")] [] + 1: CSS_CUSTOM_IDENTIFIER@1331..1355 + 0: IDENT@1331..1355 "if-branch-list-recovery" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@1355..1465 + 0: L_CURLY@1355..1356 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@1356..1463 + 0: CSS_DECLARATION_WITH_SEMICOLON@1356..1411 + 0: CSS_DECLARATION@1356..1410 + 0: CSS_GENERIC_PROPERTY@1356..1410 + 0: CSS_IDENTIFIER@1356..1359 + 0: IDENT@1356..1359 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@1359..1361 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1361..1410 + 0: CSS_IF_FUNCTION@1361..1410 + 0: IF_KW@1361..1363 "if" [] [] + 1: L_PAREN@1363..1364 "(" [] [] + 2: CSS_IF_BRANCH_LIST@1364..1409 + 0: CSS_IF_BRANCH@1364..1388 + 0: CSS_IF_STYLE_TEST@1364..1381 + 0: STYLE_KW@1364..1369 "style" [] [] + 1: L_PAREN@1369..1370 "(" [] [] + 2: CSS_DECLARATION@1370..1380 + 0: CSS_GENERIC_PROPERTY@1370..1380 + 0: CSS_DASHED_IDENTIFIER@1370..1375 + 0: IDENT@1370..1375 "--foo" [] [] + 1: COLON@1375..1377 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1377..1380 + 0: CSS_IDENTIFIER@1377..1380 + 0: IDENT@1377..1380 "bar" [] [] + 1: (empty) + 3: R_PAREN@1380..1381 ")" [] [] + 1: COLON@1381..1383 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1383..1388 + 0: CSS_IDENTIFIER@1383..1388 + 0: IDENT@1383..1388 "black" [] [] + 1: SEMICOLON@1388..1390 ";" [] [Whitespace(" ")] + 2: CSS_BOGUS_IF_BRANCH@1390..1396 + 0: BANG@1390..1391 "!" [] [] + 1: IDENT@1391..1396 "bogus" [] [] + 3: SEMICOLON@1396..1398 ";" [] [Whitespace(" ")] + 4: CSS_IF_BRANCH@1398..1409 + 0: CSS_ELSE_KEYWORD@1398..1402 + 0: ELSE_KW@1398..1402 "else" [] [] + 1: COLON@1402..1404 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1404..1409 + 0: CSS_IDENTIFIER@1404..1409 + 0: IDENT@1404..1409 "white" [] [] + 3: R_PAREN@1409..1410 ")" [] [] + 1: (empty) + 1: SEMICOLON@1410..1411 ";" [] [] + 1: CSS_DECLARATION_WITH_SEMICOLON@1411..1463 + 0: CSS_DECLARATION@1411..1462 + 0: CSS_GENERIC_PROPERTY@1411..1462 + 0: CSS_IDENTIFIER@1411..1414 + 0: IDENT@1411..1414 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@1414..1416 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1416..1462 + 0: CSS_IF_FUNCTION@1416..1462 + 0: IF_KW@1416..1418 "if" [] [] + 1: L_PAREN@1418..1419 "(" [] [] + 2: CSS_IF_BRANCH_LIST@1419..1461 + 0: CSS_IF_BRANCH@1419..1443 + 0: CSS_IF_STYLE_TEST@1419..1436 + 0: STYLE_KW@1419..1424 "style" [] [] + 1: L_PAREN@1424..1425 "(" [] [] + 2: CSS_DECLARATION@1425..1435 + 0: CSS_GENERIC_PROPERTY@1425..1435 + 0: CSS_DASHED_IDENTIFIER@1425..1430 + 0: IDENT@1425..1430 "--foo" [] [] + 1: COLON@1430..1432 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1432..1435 + 0: CSS_IDENTIFIER@1432..1435 + 0: IDENT@1432..1435 "bar" [] [] + 1: (empty) + 3: R_PAREN@1435..1436 ")" [] [] + 1: COLON@1436..1438 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1438..1443 + 0: CSS_IDENTIFIER@1438..1443 + 0: IDENT@1438..1443 "black" [] [] + 1: SEMICOLON@1443..1445 ";" [] [Whitespace(" ")] + 2: CSS_BOGUS_IF_BRANCH@1445..1448 + 0: ERROR_TOKEN@1445..1446 "?" [] [] + 1: ERROR_TOKEN@1446..1447 "?" [] [] + 2: ERROR_TOKEN@1447..1448 "?" [] [] + 3: SEMICOLON@1448..1450 ";" [] [Whitespace(" ")] + 4: CSS_IF_BRANCH@1450..1461 + 0: CSS_ELSE_KEYWORD@1450..1454 + 0: ELSE_KW@1450..1454 "else" [] [] + 1: COLON@1454..1456 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1456..1461 + 0: CSS_IDENTIFIER@1456..1461 + 0: IDENT@1456..1461 "white" [] [] + 3: R_PAREN@1461..1462 ")" [] [] + 1: (empty) + 1: SEMICOLON@1462..1463 ";" [] [] + 2: R_CURLY@1463..1465 "}" [Newline("\n")] [] + 22: CSS_QUALIFIED_RULE@1465..1563 + 0: CSS_SELECTOR_LIST@1465..1473 + 0: CSS_COMPOUND_SELECTOR@1465..1473 + 0: CSS_NESTED_SELECTOR_LIST@1465..1465 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@1465..1473 + 0: CSS_CLASS_SELECTOR@1465..1473 + 0: DOT@1465..1468 "." [Newline("\n"), Newline("\n")] [] + 1: CSS_CUSTOM_IDENTIFIER@1468..1473 + 0: IDENT@1468..1473 "todo" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@1473..1563 + 0: L_CURLY@1473..1474 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@1474..1561 + 0: CSS_DECLARATION_WITH_SEMICOLON@1474..1529 + 0: CSS_DECLARATION@1474..1528 + 0: CSS_GENERIC_PROPERTY@1474..1528 + 0: CSS_IDENTIFIER@1474..1486 + 0: IDENT@1474..1486 "background" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@1486..1488 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1488..1528 + 0: CSS_IF_FUNCTION@1488..1528 + 0: IF_KW@1488..1490 "if" [] [] + 1: L_PAREN@1490..1491 "(" [] [] + 2: CSS_IF_BRANCH_LIST@1491..1527 + 0: CSS_IF_BRANCH@1491..1526 + 0: CSS_IF_TEST_BOOLEAN_AND_EXPR@1491..1521 + 0: CSS_IF_STYLE_TEST@1491..1509 + 0: STYLE_KW@1491..1496 "style" [] [] + 1: L_PAREN@1496..1497 "(" [] [] + 2: CSS_DECLARATION@1497..1507 + 0: CSS_GENERIC_PROPERTY@1497..1507 + 0: CSS_DASHED_IDENTIFIER@1497..1502 + 0: IDENT@1497..1502 "--foo" [] [] + 1: COLON@1502..1504 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1504..1507 + 0: CSS_IDENTIFIER@1504..1507 + 0: IDENT@1504..1507 "bar" [] [] + 1: (empty) + 3: R_PAREN@1507..1509 ")" [] [Whitespace(" ")] + 1: AND_KW@1509..1513 "and" [] [Whitespace(" ")] + 2: CSS_IF_TEST_BOOLEAN_EXPR_IN_PARENS@1513..1521 + 0: L_PAREN@1513..1514 "(" [] [] + 1: CSS_BOGUS_IF_TEST_BOOLEAN_EXPR@1514..1520 + 0: BANG@1514..1515 "!" [] [] + 1: IDENT@1515..1520 "bogus" [] [] + 2: R_PAREN@1520..1521 ")" [] [] + 1: COLON@1521..1523 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1523..1526 + 0: CSS_IDENTIFIER@1523..1526 + 0: IDENT@1523..1526 "red" [] [] + 1: SEMICOLON@1526..1527 ";" [] [] + 3: R_PAREN@1527..1528 ")" [] [] + 1: (empty) + 1: SEMICOLON@1528..1529 ";" [] [] + 1: CSS_DECLARATION_WITH_SEMICOLON@1529..1561 + 0: CSS_DECLARATION@1529..1560 + 0: CSS_GENERIC_PROPERTY@1529..1560 + 0: CSS_IDENTIFIER@1529..1541 + 0: IDENT@1529..1541 "background" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@1541..1543 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1543..1560 + 0: CSS_IF_FUNCTION@1543..1560 + 0: IF_KW@1543..1545 "if" [] [] + 1: L_PAREN@1545..1546 "(" [] [] + 2: CSS_IF_BRANCH_LIST@1546..1559 + 0: CSS_IF_BRANCH@1546..1558 + 0: CSS_BOGUS_IF_TEST_BOOLEAN_EXPR@1546..1553 + 0: NOT_KW@1546..1550 "not" [] [Whitespace(" ")] + 1: CSS_BOGUS_IF_TEST_BOOLEAN_EXPR@1550..1553 + 0: IDENT@1550..1553 "foo" [] [] + 1: COLON@1553..1555 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1555..1558 + 0: CSS_IDENTIFIER@1555..1558 + 0: IDENT@1555..1558 "red" [] [] + 1: SEMICOLON@1558..1559 ";" [] [] + 3: R_PAREN@1559..1560 ")" [] [] + 1: (empty) + 1: SEMICOLON@1560..1561 ";" [] [] + 2: R_CURLY@1561..1563 "}" [Newline("\n")] [] + 23: CSS_QUALIFIED_RULE@1563..1647 + 0: CSS_SELECTOR_LIST@1563..1589 + 0: CSS_COMPOUND_SELECTOR@1563..1589 + 0: CSS_NESTED_SELECTOR_LIST@1563..1563 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@1563..1589 + 0: CSS_CLASS_SELECTOR@1563..1589 + 0: DOT@1563..1566 "." [Newline("\n"), Newline("\n")] [] + 1: CSS_CUSTOM_IDENTIFIER@1566..1589 + 0: IDENT@1566..1589 "invalid-branch-content" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@1589..1647 + 0: L_CURLY@1589..1590 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@1590..1645 + 0: CSS_DECLARATION_WITH_SEMICOLON@1590..1645 + 0: CSS_DECLARATION@1590..1644 + 0: CSS_GENERIC_PROPERTY@1590..1644 + 0: CSS_IDENTIFIER@1590..1593 + 0: IDENT@1590..1593 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@1593..1595 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1595..1644 + 0: CSS_IF_FUNCTION@1595..1644 + 0: IF_KW@1595..1597 "if" [] [] + 1: L_PAREN@1597..1598 "(" [] [] + 2: CSS_IF_BRANCH_LIST@1598..1643 + 0: CSS_IF_BRANCH@1598..1622 + 0: CSS_IF_STYLE_TEST@1598..1615 + 0: STYLE_KW@1598..1603 "style" [] [] + 1: L_PAREN@1603..1604 "(" [] [] + 2: CSS_DECLARATION@1604..1614 + 0: CSS_GENERIC_PROPERTY@1604..1614 + 0: CSS_DASHED_IDENTIFIER@1604..1609 + 0: IDENT@1604..1609 "--foo" [] [] + 1: COLON@1609..1611 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1611..1614 + 0: CSS_IDENTIFIER@1611..1614 + 0: IDENT@1611..1614 "bar" [] [] + 1: (empty) + 3: R_PAREN@1614..1615 ")" [] [] + 1: COLON@1615..1617 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1617..1622 + 0: CSS_IDENTIFIER@1617..1622 + 0: IDENT@1617..1622 "black" [] [] + 1: SEMICOLON@1622..1624 ";" [] [Whitespace(" ")] + 2: CSS_BOGUS_IF_BRANCH@1624..1630 + 0: BANG@1624..1625 "!" [] [] + 1: IDENT@1625..1630 "bogus" [] [] + 3: SEMICOLON@1630..1632 ";" [] [Whitespace(" ")] + 4: CSS_IF_BRANCH@1632..1643 + 0: CSS_ELSE_KEYWORD@1632..1636 + 0: ELSE_KW@1632..1636 "else" [] [] + 1: COLON@1636..1638 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1638..1643 + 0: CSS_IDENTIFIER@1638..1643 + 0: IDENT@1638..1643 "white" [] [] + 3: R_PAREN@1643..1644 ")" [] [] + 1: (empty) + 1: SEMICOLON@1644..1645 ";" [] [] + 2: R_CURLY@1645..1647 "}" [Newline("\n")] [] + 24: CSS_QUALIFIED_RULE@1647..1747 + 0: CSS_SELECTOR_LIST@1647..1690 + 0: CSS_COMPOUND_SELECTOR@1647..1690 + 0: CSS_NESTED_SELECTOR_LIST@1647..1647 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@1647..1690 + 0: CSS_CLASS_SELECTOR@1647..1690 + 0: DOT@1647..1650 "." [Newline("\n"), Newline("\n")] [] + 1: CSS_CUSTOM_IDENTIFIER@1650..1690 + 0: IDENT@1650..1690 "invalid-branch-content-no-trailing-semi" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@1690..1747 + 0: L_CURLY@1690..1691 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@1691..1745 + 0: CSS_DECLARATION_WITH_SEMICOLON@1691..1745 + 0: CSS_DECLARATION@1691..1745 + 0: CSS_GENERIC_PROPERTY@1691..1745 + 0: CSS_IDENTIFIER@1691..1694 + 0: IDENT@1691..1694 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@1694..1696 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1696..1745 + 0: CSS_IF_FUNCTION@1696..1745 + 0: IF_KW@1696..1698 "if" [] [] + 1: L_PAREN@1698..1699 "(" [] [] + 2: CSS_IF_BRANCH_LIST@1699..1744 + 0: CSS_IF_BRANCH@1699..1723 + 0: CSS_IF_STYLE_TEST@1699..1716 + 0: STYLE_KW@1699..1704 "style" [] [] + 1: L_PAREN@1704..1705 "(" [] [] + 2: CSS_DECLARATION@1705..1715 + 0: CSS_GENERIC_PROPERTY@1705..1715 + 0: CSS_DASHED_IDENTIFIER@1705..1710 + 0: IDENT@1705..1710 "--foo" [] [] + 1: COLON@1710..1712 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1712..1715 + 0: CSS_IDENTIFIER@1712..1715 + 0: IDENT@1712..1715 "bar" [] [] + 1: (empty) + 3: R_PAREN@1715..1716 ")" [] [] + 1: COLON@1716..1718 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1718..1723 + 0: CSS_IDENTIFIER@1718..1723 + 0: IDENT@1718..1723 "black" [] [] + 1: SEMICOLON@1723..1725 ";" [] [Whitespace(" ")] + 2: CSS_BOGUS_IF_BRANCH@1725..1731 + 0: BANG@1725..1726 "!" [] [] + 1: IDENT@1726..1731 "bogus" [] [] + 3: SEMICOLON@1731..1733 ";" [] [Whitespace(" ")] + 4: CSS_IF_BRANCH@1733..1744 + 0: CSS_ELSE_KEYWORD@1733..1737 + 0: ELSE_KW@1733..1737 "else" [] [] + 1: COLON@1737..1739 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1739..1744 + 0: CSS_IDENTIFIER@1739..1744 + 0: IDENT@1739..1744 "white" [] [] + 3: R_PAREN@1744..1745 ")" [] [] + 1: (empty) + 1: (empty) + 2: R_CURLY@1745..1747 "}" [Newline("\n")] [] + 25: CSS_QUALIFIED_RULE@1747..1851 + 0: CSS_SELECTOR_LIST@1747..1776 + 0: CSS_COMPOUND_SELECTOR@1747..1776 + 0: CSS_NESTED_SELECTOR_LIST@1747..1747 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@1747..1776 + 0: CSS_CLASS_SELECTOR@1747..1776 + 0: DOT@1747..1750 "." [Newline("\n"), Newline("\n")] [] + 1: CSS_CUSTOM_IDENTIFIER@1750..1776 + 0: IDENT@1750..1776 "multiple-invalid-branches" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@1776..1851 + 0: L_CURLY@1776..1777 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@1777..1849 + 0: CSS_DECLARATION_WITH_SEMICOLON@1777..1849 + 0: CSS_DECLARATION@1777..1848 + 0: CSS_GENERIC_PROPERTY@1777..1848 + 0: CSS_IDENTIFIER@1777..1780 + 0: IDENT@1777..1780 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@1780..1782 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1782..1848 + 0: CSS_IF_FUNCTION@1782..1848 + 0: IF_KW@1782..1784 "if" [] [] + 1: L_PAREN@1784..1785 "(" [] [] + 2: CSS_IF_BRANCH_LIST@1785..1847 + 0: CSS_IF_BRANCH@1785..1803 + 0: CSS_IF_STYLE_TEST@1785..1798 + 0: STYLE_KW@1785..1790 "style" [] [] + 1: L_PAREN@1790..1791 "(" [] [] + 2: CSS_DECLARATION@1791..1797 + 0: CSS_GENERIC_PROPERTY@1791..1797 + 0: CSS_DASHED_IDENTIFIER@1791..1794 + 0: IDENT@1791..1794 "--a" [] [] + 1: COLON@1794..1796 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1796..1797 + 0: CSS_NUMBER@1796..1797 + 0: CSS_NUMBER_LITERAL@1796..1797 "1" [] [] + 1: (empty) + 3: R_PAREN@1797..1798 ")" [] [] + 1: COLON@1798..1800 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1800..1803 + 0: CSS_IDENTIFIER@1800..1803 + 0: IDENT@1800..1803 "red" [] [] + 1: SEMICOLON@1803..1805 ";" [] [Whitespace(" ")] + 2: CSS_BOGUS_IF_BRANCH@1805..1808 + 0: BANG@1805..1806 "!" [] [] + 1: BANG@1806..1807 "!" [] [] + 2: BANG@1807..1808 "!" [] [] + 3: SEMICOLON@1808..1810 ";" [] [Whitespace(" ")] + 4: CSS_IF_BRANCH@1810..1829 + 0: CSS_IF_STYLE_TEST@1810..1823 + 0: STYLE_KW@1810..1815 "style" [] [] + 1: L_PAREN@1815..1816 "(" [] [] + 2: CSS_DECLARATION@1816..1822 + 0: CSS_GENERIC_PROPERTY@1816..1822 + 0: CSS_DASHED_IDENTIFIER@1816..1819 + 0: IDENT@1816..1819 "--b" [] [] + 1: COLON@1819..1821 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1821..1822 + 0: CSS_NUMBER@1821..1822 + 0: CSS_NUMBER_LITERAL@1821..1822 "2" [] [] + 1: (empty) + 3: R_PAREN@1822..1823 ")" [] [] + 1: COLON@1823..1825 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1825..1829 + 0: CSS_IDENTIFIER@1825..1829 + 0: IDENT@1825..1829 "blue" [] [] + 5: SEMICOLON@1829..1831 ";" [] [Whitespace(" ")] + 6: CSS_BOGUS_IF_BRANCH@1831..1834 + 0: AT@1831..1832 "@" [] [] + 1: AT@1832..1833 "@" [] [] + 2: AT@1833..1834 "@" [] [] + 7: SEMICOLON@1834..1836 ";" [] [Whitespace(" ")] + 8: CSS_IF_BRANCH@1836..1847 + 0: CSS_ELSE_KEYWORD@1836..1840 + 0: ELSE_KW@1836..1840 "else" [] [] + 1: COLON@1840..1842 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1842..1847 + 0: CSS_IDENTIFIER@1842..1847 + 0: IDENT@1842..1847 "green" [] [] + 3: R_PAREN@1847..1848 ")" [] [] + 1: (empty) + 1: SEMICOLON@1848..1849 ";" [] [] + 2: R_CURLY@1849..1851 "}" [Newline("\n")] [] + 26: CSS_QUALIFIED_RULE@1851..1932 + 0: CSS_SELECTOR_LIST@1851..1873 + 0: CSS_COMPOUND_SELECTOR@1851..1873 + 0: CSS_NESTED_SELECTOR_LIST@1851..1851 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@1851..1873 + 0: CSS_CLASS_SELECTOR@1851..1873 + 0: DOT@1851..1854 "." [Newline("\n"), Newline("\n")] [] + 1: CSS_CUSTOM_IDENTIFIER@1854..1873 + 0: IDENT@1854..1873 "invalid-then-valid" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@1873..1932 + 0: L_CURLY@1873..1874 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@1874..1930 + 0: CSS_DECLARATION_WITH_SEMICOLON@1874..1930 + 0: CSS_DECLARATION@1874..1929 + 0: CSS_GENERIC_PROPERTY@1874..1929 + 0: CSS_IDENTIFIER@1874..1877 + 0: IDENT@1874..1877 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@1877..1879 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1879..1929 + 0: CSS_IF_FUNCTION@1879..1929 + 0: IF_KW@1879..1881 "if" [] [] + 1: L_PAREN@1881..1882 "(" [] [] + 2: CSS_IF_BRANCH_LIST@1882..1928 + 0: CSS_BOGUS_IF_BRANCH@1882..1890 + 0: HASH@1882..1883 "#" [] [] + 1: HASH@1883..1884 "#" [] [] + 2: HASH@1884..1885 "#" [] [] + 3: COLON@1885..1887 ":" [] [Whitespace(" ")] + 4: IDENT@1887..1890 "red" [] [] + 1: SEMICOLON@1890..1892 ";" [] [Whitespace(" ")] + 2: CSS_IF_BRANCH@1892..1915 + 0: CSS_IF_STYLE_TEST@1892..1909 + 0: STYLE_KW@1892..1897 "style" [] [] + 1: L_PAREN@1897..1898 "(" [] [] + 2: CSS_DECLARATION@1898..1908 + 0: CSS_GENERIC_PROPERTY@1898..1908 + 0: CSS_DASHED_IDENTIFIER@1898..1903 + 0: IDENT@1898..1903 "--foo" [] [] + 1: COLON@1903..1905 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1905..1908 + 0: CSS_IDENTIFIER@1905..1908 + 0: IDENT@1905..1908 "bar" [] [] + 1: (empty) + 3: R_PAREN@1908..1909 ")" [] [] + 1: COLON@1909..1911 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1911..1915 + 0: CSS_IDENTIFIER@1911..1915 + 0: IDENT@1911..1915 "blue" [] [] + 3: SEMICOLON@1915..1917 ";" [] [Whitespace(" ")] + 4: CSS_IF_BRANCH@1917..1928 + 0: CSS_ELSE_KEYWORD@1917..1921 + 0: ELSE_KW@1917..1921 "else" [] [] + 1: COLON@1921..1923 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1923..1928 + 0: CSS_IDENTIFIER@1923..1928 + 0: IDENT@1923..1928 "green" [] [] + 3: R_PAREN@1928..1929 ")" [] [] + 1: (empty) + 1: SEMICOLON@1929..1930 ";" [] [] + 2: R_CURLY@1930..1932 "}" [Newline("\n")] [] + 27: CSS_QUALIFIED_RULE@1932..2023 + 0: CSS_SELECTOR_LIST@1932..1957 + 0: CSS_COMPOUND_SELECTOR@1932..1957 + 0: CSS_NESTED_SELECTOR_LIST@1932..1932 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@1932..1957 + 0: CSS_CLASS_SELECTOR@1932..1957 + 0: DOT@1932..1935 "." [Newline("\n"), Newline("\n")] [] + 1: CSS_CUSTOM_IDENTIFIER@1935..1957 + 0: IDENT@1935..1957 "recovery-at-semicolon" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@1957..2023 + 0: L_CURLY@1957..1958 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@1958..2021 + 0: CSS_DECLARATION_WITH_SEMICOLON@1958..2021 + 0: CSS_DECLARATION@1958..2020 + 0: CSS_GENERIC_PROPERTY@1958..2020 + 0: CSS_IDENTIFIER@1958..1961 + 0: IDENT@1958..1961 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@1961..1963 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1963..2020 + 0: CSS_IF_FUNCTION@1963..2020 + 0: IF_KW@1963..1965 "if" [] [] + 1: L_PAREN@1965..1966 "(" [] [] + 2: CSS_IF_BRANCH_LIST@1966..2019 + 0: CSS_IF_BRANCH@1966..1990 + 0: CSS_IF_STYLE_TEST@1966..1983 + 0: STYLE_KW@1966..1971 "style" [] [] + 1: L_PAREN@1971..1972 "(" [] [] + 2: CSS_DECLARATION@1972..1982 + 0: CSS_GENERIC_PROPERTY@1972..1982 + 0: CSS_DASHED_IDENTIFIER@1972..1977 + 0: IDENT@1972..1977 "--foo" [] [] + 1: COLON@1977..1979 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1979..1982 + 0: CSS_IDENTIFIER@1979..1982 + 0: IDENT@1979..1982 "bar" [] [] + 1: (empty) + 3: R_PAREN@1982..1983 ")" [] [] + 1: COLON@1983..1985 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@1985..1990 + 0: CSS_IDENTIFIER@1985..1990 + 0: IDENT@1985..1990 "black" [] [] + 1: SEMICOLON@1990..1992 ";" [] [Whitespace(" ")] + 2: CSS_BOGUS_IF_BRANCH@1992..2006 + 0: IDENT@1992..2006 "bogus-no-colon" [] [] + 3: SEMICOLON@2006..2008 ";" [] [Whitespace(" ")] + 4: CSS_IF_BRANCH@2008..2019 + 0: CSS_ELSE_KEYWORD@2008..2012 + 0: ELSE_KW@2008..2012 "else" [] [] + 1: COLON@2012..2014 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@2014..2019 + 0: CSS_IDENTIFIER@2014..2019 + 0: IDENT@2014..2019 "white" [] [] + 3: R_PAREN@2019..2020 ")" [] [] + 1: (empty) + 1: SEMICOLON@2020..2021 ";" [] [] + 2: R_CURLY@2021..2023 "}" [Newline("\n")] [] + 28: CSS_QUALIFIED_RULE@2023..2197 + 0: CSS_SELECTOR_LIST@2023..2051 + 0: CSS_COMPOUND_SELECTOR@2023..2051 + 0: CSS_NESTED_SELECTOR_LIST@2023..2023 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@2023..2051 + 0: CSS_CLASS_SELECTOR@2023..2051 + 0: DOT@2023..2026 "." [Newline("\n"), Newline("\n")] [] + 1: CSS_CUSTOM_IDENTIFIER@2026..2051 + 0: IDENT@2026..2051 "multiple-if-declarations" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@2051..2197 + 0: L_CURLY@2051..2052 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@2052..2195 + 0: CSS_DECLARATION_WITH_SEMICOLON@2052..2099 + 0: CSS_DECLARATION@2052..2098 + 0: CSS_GENERIC_PROPERTY@2052..2098 + 0: CSS_IDENTIFIER@2052..2055 + 0: IDENT@2052..2055 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@2055..2057 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@2057..2098 + 0: CSS_IF_FUNCTION@2057..2098 + 0: IF_KW@2057..2059 "if" [] [] + 1: L_PAREN@2059..2060 "(" [] [] + 2: CSS_IF_BRANCH_LIST@2060..2097 + 0: CSS_IF_BRANCH@2060..2084 + 0: CSS_IF_STYLE_TEST@2060..2077 + 0: STYLE_KW@2060..2065 "style" [] [] + 1: L_PAREN@2065..2066 "(" [] [] + 2: CSS_DECLARATION@2066..2076 + 0: CSS_GENERIC_PROPERTY@2066..2076 + 0: CSS_DASHED_IDENTIFIER@2066..2071 + 0: IDENT@2066..2071 "--foo" [] [] + 1: COLON@2071..2073 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@2073..2076 + 0: CSS_IDENTIFIER@2073..2076 + 0: IDENT@2073..2076 "bar" [] [] + 1: (empty) + 3: R_PAREN@2076..2077 ")" [] [] + 1: COLON@2077..2079 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@2079..2084 + 0: CSS_IDENTIFIER@2079..2084 + 0: IDENT@2079..2084 "black" [] [] + 1: SEMICOLON@2084..2086 ";" [] [Whitespace(" ")] + 2: CSS_IF_BRANCH@2086..2097 + 0: CSS_ELSE_KEYWORD@2086..2090 + 0: ELSE_KW@2086..2090 "else" [] [] + 1: COLON@2090..2092 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@2092..2097 + 0: CSS_IDENTIFIER@2092..2097 + 0: IDENT@2092..2097 "white" [] [] + 3: R_PAREN@2097..2098 ")" [] [] + 1: (empty) + 1: SEMICOLON@2098..2099 ";" [] [] + 1: CSS_DECLARATION_WITH_SEMICOLON@2099..2147 + 0: CSS_DECLARATION@2099..2146 + 0: CSS_GENERIC_PROPERTY@2099..2146 + 0: CSS_IDENTIFIER@2099..2102 + 0: IDENT@2099..2102 "b" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@2102..2104 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@2104..2146 + 0: CSS_IF_FUNCTION@2104..2146 + 0: IF_KW@2104..2106 "if" [] [] + 1: L_PAREN@2106..2107 "(" [] [] + 2: CSS_IF_BRANCH_LIST@2107..2145 + 0: CSS_IF_BRANCH@2107..2128 + 0: CSS_BOGUS_IF_TEST@2107..2123 + 0: STYLE_KW@2107..2112 "style" [] [] + 1: L_PAREN@2112..2113 "(" [] [] + 2: CSS_BOGUS@2113..2122 + 0: IDENT@2113..2122 "--invalid" [] [] + 3: R_PAREN@2122..2123 ")" [] [] + 1: COLON@2123..2125 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@2125..2128 + 0: CSS_IDENTIFIER@2125..2128 + 0: IDENT@2125..2128 "red" [] [] + 1: SEMICOLON@2128..2130 ";" [] [Whitespace(" ")] + 2: CSS_BOGUS_IF_BRANCH@2130..2133 + 0: BANG@2130..2131 "!" [] [] + 1: BANG@2131..2132 "!" [] [] + 2: BANG@2132..2133 "!" [] [] + 3: SEMICOLON@2133..2135 ";" [] [Whitespace(" ")] + 4: CSS_IF_BRANCH@2135..2145 + 0: CSS_ELSE_KEYWORD@2135..2139 + 0: ELSE_KW@2135..2139 "else" [] [] + 1: COLON@2139..2141 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@2141..2145 + 0: CSS_IDENTIFIER@2141..2145 + 0: IDENT@2141..2145 "blue" [] [] + 3: R_PAREN@2145..2146 ")" [] [] + 1: (empty) + 1: SEMICOLON@2146..2147 ";" [] [] + 2: CSS_DECLARATION_WITH_SEMICOLON@2147..2195 + 0: CSS_DECLARATION@2147..2194 + 0: CSS_GENERIC_PROPERTY@2147..2194 + 0: CSS_IDENTIFIER@2147..2150 + 0: IDENT@2147..2150 "c" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@2150..2152 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@2152..2194 + 0: CSS_IF_FUNCTION@2152..2194 + 0: IF_KW@2152..2154 "if" [] [] + 1: L_PAREN@2154..2155 "(" [] [] + 2: CSS_IF_BRANCH_LIST@2155..2193 + 0: CSS_IF_BRANCH@2155..2179 + 0: CSS_IF_STYLE_TEST@2155..2172 + 0: STYLE_KW@2155..2160 "style" [] [] + 1: L_PAREN@2160..2161 "(" [] [] + 2: CSS_DECLARATION@2161..2171 + 0: CSS_GENERIC_PROPERTY@2161..2171 + 0: CSS_DASHED_IDENTIFIER@2161..2166 + 0: IDENT@2161..2166 "--baz" [] [] + 1: COLON@2166..2168 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@2168..2171 + 0: CSS_IDENTIFIER@2168..2171 + 0: IDENT@2168..2171 "qux" [] [] + 1: (empty) + 3: R_PAREN@2171..2172 ")" [] [] + 1: COLON@2172..2174 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@2174..2179 + 0: CSS_IDENTIFIER@2174..2179 + 0: IDENT@2174..2179 "green" [] [] + 1: SEMICOLON@2179..2181 ";" [] [Whitespace(" ")] + 2: CSS_IF_BRANCH@2181..2193 + 0: CSS_ELSE_KEYWORD@2181..2185 + 0: ELSE_KW@2181..2185 "else" [] [] + 1: COLON@2185..2187 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@2187..2193 + 0: CSS_IDENTIFIER@2187..2193 + 0: IDENT@2187..2193 "yellow" [] [] + 3: R_PAREN@2193..2194 ")" [] [] + 1: (empty) + 1: SEMICOLON@2194..2195 ";" [] [] + 2: R_CURLY@2195..2197 "}" [Newline("\n")] [] + 29: CSS_QUALIFIED_RULE@2197..2364 + 0: CSS_SELECTOR_LIST@2197..2242 + 0: CSS_COMPOUND_SELECTOR@2197..2242 + 0: CSS_NESTED_SELECTOR_LIST@2197..2197 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@2197..2242 + 0: CSS_CLASS_SELECTOR@2197..2242 + 0: DOT@2197..2236 "." [Newline("\n"), Newline("\n"), Comments("/* Test if() inside n ..."), Newline("\n")] [] + 1: CSS_CUSTOM_IDENTIFIER@2236..2242 + 0: IDENT@2236..2242 "outer" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@2242..2364 + 0: L_CURLY@2242..2243 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@2243..2362 + 0: CSS_NESTED_QUALIFIED_RULE@2243..2313 + 0: CSS_RELATIVE_SELECTOR_LIST@2243..2252 + 0: CSS_RELATIVE_SELECTOR@2243..2252 + 0: (empty) + 1: CSS_COMPOUND_SELECTOR@2243..2252 + 0: CSS_NESTED_SELECTOR_LIST@2243..2243 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@2243..2252 + 0: CSS_CLASS_SELECTOR@2243..2252 + 0: DOT@2243..2246 "." [Newline("\n"), Whitespace("\t")] [] + 1: CSS_CUSTOM_IDENTIFIER@2246..2252 + 0: IDENT@2246..2252 "inner" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@2252..2313 + 0: L_CURLY@2252..2253 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@2253..2310 + 0: CSS_DECLARATION_WITH_SEMICOLON@2253..2310 + 0: CSS_DECLARATION@2253..2309 + 0: CSS_GENERIC_PROPERTY@2253..2309 + 0: CSS_IDENTIFIER@2253..2261 + 0: IDENT@2253..2261 "color" [Newline("\n"), Whitespace("\t\t")] [] + 1: COLON@2261..2263 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@2263..2309 + 0: CSS_IF_FUNCTION@2263..2309 + 0: IF_KW@2263..2265 "if" [] [] + 1: L_PAREN@2265..2266 "(" [] [] + 2: CSS_IF_BRANCH_LIST@2266..2308 + 0: CSS_IF_BRANCH@2266..2288 + 0: CSS_IF_STYLE_TEST@2266..2283 + 0: STYLE_KW@2266..2271 "style" [] [] + 1: L_PAREN@2271..2272 "(" [] [] + 2: CSS_DECLARATION@2272..2282 + 0: CSS_GENERIC_PROPERTY@2272..2282 + 0: CSS_DASHED_IDENTIFIER@2272..2277 + 0: IDENT@2272..2277 "--foo" [] [] + 1: COLON@2277..2279 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@2279..2282 + 0: CSS_IDENTIFIER@2279..2282 + 0: IDENT@2279..2282 "bar" [] [] + 1: (empty) + 3: R_PAREN@2282..2283 ")" [] [] + 1: COLON@2283..2285 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@2285..2288 + 0: CSS_IDENTIFIER@2285..2288 + 0: IDENT@2285..2288 "red" [] [] + 1: SEMICOLON@2288..2290 ";" [] [Whitespace(" ")] + 2: CSS_BOGUS_IF_BRANCH@2290..2296 + 0: BANG@2290..2291 "!" [] [] + 1: IDENT@2291..2296 "bogus" [] [] + 3: SEMICOLON@2296..2298 ";" [] [Whitespace(" ")] + 4: CSS_IF_BRANCH@2298..2308 + 0: CSS_ELSE_KEYWORD@2298..2302 + 0: ELSE_KW@2298..2302 "else" [] [] + 1: COLON@2302..2304 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@2304..2308 + 0: CSS_IDENTIFIER@2304..2308 + 0: IDENT@2304..2308 "blue" [] [] + 3: R_PAREN@2308..2309 ")" [] [] + 1: (empty) + 1: SEMICOLON@2309..2310 ";" [] [] + 2: R_CURLY@2310..2313 "}" [Newline("\n"), Whitespace("\t")] [] + 1: CSS_DECLARATION_WITH_SEMICOLON@2313..2362 + 0: CSS_DECLARATION@2313..2361 + 0: CSS_GENERIC_PROPERTY@2313..2361 + 0: CSS_IDENTIFIER@2313..2316 + 0: IDENT@2313..2316 "a" [Newline("\n"), Whitespace("\t")] [] + 1: COLON@2316..2318 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@2318..2361 + 0: CSS_IF_FUNCTION@2318..2361 + 0: IF_KW@2318..2320 "if" [] [] + 1: L_PAREN@2320..2321 "(" [] [] + 2: CSS_IF_BRANCH_LIST@2321..2360 + 0: CSS_IF_BRANCH@2321..2346 + 0: CSS_IF_STYLE_TEST@2321..2339 + 0: STYLE_KW@2321..2326 "style" [] [] + 1: L_PAREN@2326..2327 "(" [] [] + 2: CSS_DECLARATION@2327..2338 + 0: CSS_GENERIC_PROPERTY@2327..2338 + 0: CSS_DASHED_IDENTIFIER@2327..2333 + 0: IDENT@2327..2333 "--test" [] [] + 1: COLON@2333..2335 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@2335..2338 + 0: CSS_IDENTIFIER@2335..2338 + 0: IDENT@2335..2338 "val" [] [] + 1: (empty) + 3: R_PAREN@2338..2339 ")" [] [] + 1: COLON@2339..2341 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@2341..2346 + 0: CSS_IDENTIFIER@2341..2346 + 0: IDENT@2341..2346 "green" [] [] + 1: SEMICOLON@2346..2348 ";" [] [Whitespace(" ")] + 2: CSS_IF_BRANCH@2348..2360 + 0: CSS_ELSE_KEYWORD@2348..2352 + 0: ELSE_KW@2348..2352 "else" [] [] + 1: COLON@2352..2354 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@2354..2360 + 0: CSS_IDENTIFIER@2354..2360 + 0: IDENT@2354..2360 "yellow" [] [] + 3: R_PAREN@2360..2361 ")" [] [] + 1: (empty) + 1: SEMICOLON@2361..2362 ";" [] [] + 2: R_CURLY@2362..2364 "}" [Newline("\n")] [] + 30: CSS_QUALIFIED_RULE@2364..2566 + 0: CSS_SELECTOR_LIST@2364..2426 + 0: CSS_COMPOUND_SELECTOR@2364..2426 + 0: CSS_NESTED_SELECTOR_LIST@2364..2364 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@2364..2426 + 0: CSS_CLASS_SELECTOR@2364..2426 + 0: DOT@2364..2419 "." [Newline("\n"), Newline("\n"), Comments("/* Deeply nested with ..."), Newline("\n")] [] + 1: CSS_CUSTOM_IDENTIFIER@2419..2426 + 0: IDENT@2419..2426 "level1" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@2426..2566 + 0: L_CURLY@2426..2427 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@2427..2564 + 0: CSS_NESTED_QUALIFIED_RULE@2427..2564 + 0: CSS_RELATIVE_SELECTOR_LIST@2427..2437 + 0: CSS_RELATIVE_SELECTOR@2427..2437 + 0: (empty) + 1: CSS_COMPOUND_SELECTOR@2427..2437 + 0: CSS_NESTED_SELECTOR_LIST@2427..2427 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@2427..2437 + 0: CSS_CLASS_SELECTOR@2427..2437 + 0: DOT@2427..2430 "." [Newline("\n"), Whitespace("\t")] [] + 1: CSS_CUSTOM_IDENTIFIER@2430..2437 + 0: IDENT@2430..2437 "level2" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@2437..2564 + 0: L_CURLY@2437..2438 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@2438..2561 + 0: CSS_NESTED_QUALIFIED_RULE@2438..2561 + 0: CSS_RELATIVE_SELECTOR_LIST@2438..2449 + 0: CSS_RELATIVE_SELECTOR@2438..2449 + 0: (empty) + 1: CSS_COMPOUND_SELECTOR@2438..2449 + 0: CSS_NESTED_SELECTOR_LIST@2438..2438 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@2438..2449 + 0: CSS_CLASS_SELECTOR@2438..2449 + 0: DOT@2438..2442 "." [Newline("\n"), Whitespace("\t\t")] [] + 1: CSS_CUSTOM_IDENTIFIER@2442..2449 + 0: IDENT@2442..2449 "level3" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@2449..2561 + 0: L_CURLY@2449..2450 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@2450..2557 + 0: CSS_DECLARATION_WITH_SEMICOLON@2450..2503 + 0: CSS_DECLARATION@2450..2502 + 0: CSS_GENERIC_PROPERTY@2450..2502 + 0: CSS_IDENTIFIER@2450..2455 + 0: IDENT@2450..2455 "a" [Newline("\n"), Whitespace("\t\t\t")] [] + 1: COLON@2455..2457 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@2457..2502 + 0: CSS_IF_FUNCTION@2457..2502 + 0: IF_KW@2457..2459 "if" [] [] + 1: L_PAREN@2459..2460 "(" [] [] + 2: CSS_IF_BRANCH_LIST@2460..2501 + 0: CSS_IF_BRANCH@2460..2484 + 0: CSS_IF_STYLE_TEST@2460..2479 + 0: STYLE_KW@2460..2465 "style" [] [] + 1: L_PAREN@2465..2466 "(" [] [] + 2: CSS_DECLARATION@2466..2478 + 0: CSS_GENERIC_PROPERTY@2466..2478 + 0: CSS_DASHED_IDENTIFIER@2466..2472 + 0: IDENT@2466..2472 "--deep" [] [] + 1: COLON@2472..2474 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@2474..2478 + 0: CSS_IDENTIFIER@2474..2478 + 0: IDENT@2474..2478 "true" [] [] + 1: (empty) + 3: R_PAREN@2478..2479 ")" [] [] + 1: COLON@2479..2481 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@2481..2484 + 0: CSS_IDENTIFIER@2481..2484 + 0: IDENT@2481..2484 "red" [] [] + 1: SEMICOLON@2484..2486 ";" [] [Whitespace(" ")] + 2: CSS_BOGUS_IF_BRANCH@2486..2489 + 0: BANG@2486..2487 "!" [] [] + 1: BANG@2487..2488 "!" [] [] + 2: BANG@2488..2489 "!" [] [] + 3: SEMICOLON@2489..2491 ";" [] [Whitespace(" ")] + 4: CSS_IF_BRANCH@2491..2501 + 0: CSS_ELSE_KEYWORD@2491..2495 + 0: ELSE_KW@2491..2495 "else" [] [] + 1: COLON@2495..2497 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@2497..2501 + 0: CSS_IDENTIFIER@2497..2501 + 0: IDENT@2497..2501 "blue" [] [] + 3: R_PAREN@2501..2502 ")" [] [] + 1: (empty) + 1: SEMICOLON@2502..2503 ";" [] [] + 1: CSS_DECLARATION_WITH_SEMICOLON@2503..2557 + 0: CSS_DECLARATION@2503..2556 + 0: CSS_GENERIC_PROPERTY@2503..2556 + 0: CSS_IDENTIFIER@2503..2508 + 0: IDENT@2503..2508 "b" [Newline("\n"), Whitespace("\t\t\t")] [] + 1: COLON@2508..2510 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@2510..2556 + 0: CSS_IF_FUNCTION@2510..2556 + 0: IF_KW@2510..2512 "if" [] [] + 1: L_PAREN@2512..2513 "(" [] [] + 2: CSS_IF_BRANCH_LIST@2513..2555 + 0: CSS_IF_BRANCH@2513..2541 + 0: CSS_IF_STYLE_TEST@2513..2534 + 0: STYLE_KW@2513..2518 "style" [] [] + 1: L_PAREN@2518..2519 "(" [] [] + 2: CSS_DECLARATION@2519..2533 + 0: CSS_GENERIC_PROPERTY@2519..2533 + 0: CSS_DASHED_IDENTIFIER@2519..2526 + 0: IDENT@2519..2526 "--valid" [] [] + 1: COLON@2526..2528 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@2528..2533 + 0: CSS_IDENTIFIER@2528..2533 + 0: IDENT@2528..2533 "false" [] [] + 1: (empty) + 3: R_PAREN@2533..2534 ")" [] [] + 1: COLON@2534..2536 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@2536..2541 + 0: CSS_IDENTIFIER@2536..2541 + 0: IDENT@2536..2541 "green" [] [] + 1: SEMICOLON@2541..2543 ";" [] [Whitespace(" ")] + 2: CSS_IF_BRANCH@2543..2555 + 0: CSS_ELSE_KEYWORD@2543..2547 + 0: ELSE_KW@2543..2547 "else" [] [] + 1: COLON@2547..2549 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@2549..2555 + 0: CSS_IDENTIFIER@2549..2555 + 0: IDENT@2549..2555 "yellow" [] [] + 3: R_PAREN@2555..2556 ")" [] [] + 1: (empty) + 1: SEMICOLON@2556..2557 ";" [] [] + 2: R_CURLY@2557..2561 "}" [Newline("\n"), Whitespace("\t\t")] [] + 2: R_CURLY@2561..2564 "}" [Newline("\n"), Whitespace("\t")] [] + 2: R_CURLY@2564..2566 "}" [Newline("\n")] [] + 2: EOF@2566..2567 "" [Newline("\n")] [] ``` @@ -2809,11 +4963,11 @@ if.css:2:30 parse ━━━━━━━━━━━━━━━━━━━━ if.css:6:12 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - × Expected an if branch, or an if test boolean expression but instead found ':'. + × Expected an if branch, or an if test boolean expression but instead found ': black'. 5 │ .empty-condition { > 6 │ color: if(: black); - │ ^ + │ ^^^^^^^ 7 │ } 8 │ @@ -2821,29 +4975,61 @@ if.css:6:12 parse ━━━━━━━━━━━━━━━━━━━━ 5 │ .empty-condition { > 6 │ color: if(: black); - │ ^ + │ ^^^^^^^ 7 │ } 8 │ if.css:10:28 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - × Unexpected value or character. + × Unexpected value or character. + + 9 │ .unclosed-style { + > 10 │ color: if(style(--foo: bar: black); + │ ^^^^^^^^ + 11 │ } + 12 │ + + i Expected one of: + + - identifier + - string + - number + - dimension + - ratio + - custom property + - function + +if.css:10:36 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `)` but instead found `;` + + 9 │ .unclosed-style { + > 10 │ color: if(style(--foo: bar: black); + │ ^ + 11 │ } + 12 │ + + i Remove ; + +if.css:11:1 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × Expected an if branch, or an if test boolean expression but instead found '}'. 9 │ .unclosed-style { - > 10 │ color: if(style(--foo: bar: black); - │ ^ - 11 │ } + 10 │ color: if(style(--foo: bar: black); + > 11 │ } + │ ^ 12 │ + 13 │ .invalid-style-query { - i Expected one of: + i Expected an if branch, or an if test boolean expression here. - - identifier - - string - - number - - dimension - - ratio - - custom property - - function + 9 │ .unclosed-style { + 10 │ color: if(style(--foo: bar: black); + > 11 │ } + │ ^ + 12 │ + 13 │ .invalid-style-query { if.css:14:22 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ @@ -2862,23 +5048,29 @@ if.css:14:22 parse ━━━━━━━━━━━━━━━━━━━━ if.css:18:16 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - × expected `:` but instead found `not` + × Expected a parenthesized boolean expression, or an if test but instead found 'not(--style'. 17 │ .double-not { > 18 │ color: if(not not(--style: black): black;); - │ ^^^ + │ ^^^^^^^^^^^ 19 │ } 20 │ - i Remove not + i Expected a parenthesized boolean expression, or an if test here. + + 17 │ .double-not { + > 18 │ color: if(not not(--style: black): black;); + │ ^^^^^^^^^^^ + 19 │ } + 20 │ -if.css:18:27 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +if.css:18:35 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ × Unexpected value or character. 17 │ .double-not { > 18 │ color: if(not not(--style: black): black;); - │ ^^^^^^^ + │ ^^^^^^^ 19 │ } 20 │ @@ -2892,25 +5084,23 @@ if.css:18:27 parse ━━━━━━━━━━━━━━━━━━━━ - custom property - function -if.css:18:35 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +if.css:18:43 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - × Unexpected value or character. + × Expected a declaration, or an at rule but instead found ')'. 17 │ .double-not { > 18 │ color: if(not not(--style: black): black;); - │ ^^^^^^^ + │ ^ 19 │ } 20 │ - i Expected one of: + i Expected a declaration, or an at rule here. - - identifier - - string - - number - - dimension - - ratio - - custom property - - function + 17 │ .double-not { + > 18 │ color: if(not not(--style: black): black;); + │ ^ + 19 │ } + 20 │ if.css:22:43 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ @@ -3018,18 +5208,6 @@ if.css:30:12 parse ━━━━━━━━━━━━━━━━━━━━ 31 │ } 32 │ -if.css:30:31 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - × expected `:` but instead found `)` - - 29 │ .missing-supports-paren { - > 30 │ color: if(supports --foo: bar): black;); - │ ^ - 31 │ } - 32 │ - - i Remove ) - if.css:30:32 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ × Unexpected value or character. @@ -3082,11 +5260,11 @@ if.css:34:30 parse ━━━━━━━━━━━━━━━━━━━━ if.css:38:33 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - × Expected a parenthesized boolean expression, or an if test but instead found ':'. + × Expected a parenthesized boolean expression, or an if test but instead found ': black;'. 37 │ .missing-and-operand { > 38 │ color: if(style(--foo: bar) and: black;); - │ ^ + │ ^^^^^^^^ 39 │ } 40 │ @@ -3094,17 +5272,29 @@ if.css:38:33 parse ━━━━━━━━━━━━━━━━━━━━ 37 │ .missing-and-operand { > 38 │ color: if(style(--foo: bar) and: black;); - │ ^ + │ ^^^^^^^^ + 39 │ } + 40 │ + +if.css:38:41 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `:` but instead found `)` + + 37 │ .missing-and-operand { + > 38 │ color: if(style(--foo: bar) and: black;); + │ ^ 39 │ } 40 │ + i Remove ) + if.css:42:32 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - × Expected a parenthesized boolean expression, or an if test but instead found ':'. + × Expected a parenthesized boolean expression, or an if test but instead found ': black;'. 41 │ .missing-or-operand { > 42 │ color: if(style(--foo: bar) or: black;); - │ ^ + │ ^^^^^^^^ 43 │ } 44 │ @@ -3112,98 +5302,58 @@ if.css:42:32 parse ━━━━━━━━━━━━━━━━━━━━ 41 │ .missing-or-operand { > 42 │ color: if(style(--foo: bar) or: black;); - │ ^ + │ ^^^^^^^^ 43 │ } 44 │ -if.css:46:38 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +if.css:42:40 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - × Expected an if branch, or an if test boolean expression but instead found 'elsif'. + × expected `:` but instead found `)` - 45 │ .invalid-else { - > 46 │ color: if(style(--foo: bar): black; elsif: white;); - │ ^^^^^ - 47 │ } - 48 │ + 41 │ .missing-or-operand { + > 42 │ color: if(style(--foo: bar) or: black;); + │ ^ + 43 │ } + 44 │ - i Expected an if branch, or an if test boolean expression here. + i Remove ) + +if.css:46:38 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × Expected an if branch, or an if test boolean expression but instead found 'elsif: white'. 45 │ .invalid-else { > 46 │ color: if(style(--foo: bar): black; elsif: white;); - │ ^^^^^ + │ ^^^^^^^^^^^^ 47 │ } 48 │ -if.css:46:43 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - × Unexpected value or character. + i Expected an if branch, or an if test boolean expression here. 45 │ .invalid-else { > 46 │ color: if(style(--foo: bar): black; elsif: white;); - │ ^ + │ ^^^^^^^^^^^^ 47 │ } 48 │ - i Expected one of: - - - identifier - - string - - number - - dimension - - ratio - - custom property - - function - -if.css:50:37 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - × Expected an if branch, or an if test boolean expression but instead found ';'. - - 49 │ .multiple-semicolons { - > 50 │ color: if(style(--foo: bar): black;;); - │ ^ - 51 │ } - 52 │ - - i Expected an if branch, or an if test boolean expression here. - - 49 │ .multiple-semicolons { - > 50 │ color: if(style(--foo: bar): black;;); - │ ^ - 51 │ } - 52 │ - if.css:54:13 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - × expected `)` but instead found `--foo` + × Expected a not boolean expression, or an if test but instead found '--foo: bar'. 53 │ .missing-test-name { > 54 │ color: if((--foo: bar): black;); - │ ^^^^^ + │ ^^^^^^^^^^ 55 │ } 56 │ - i Remove --foo - -if.css:54:18 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - × Unexpected value or character. + i Expected a not boolean expression, or an if test here. 53 │ .missing-test-name { > 54 │ color: if((--foo: bar): black;); - │ ^^^^^^^^^^^^^ + │ ^^^^^^^^^^ 55 │ } 56 │ - i Expected one of: - - - identifier - - string - - number - - dimension - - ratio - - custom property - - function - if.css:58:12 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ × Expected an if branch, or an if test boolean expression but instead found 'custom(--foo: bar'. @@ -3222,18 +5372,6 @@ if.css:58:12 parse ━━━━━━━━━━━━━━━━━━━━ 59 │ } 60 │ -if.css:58:29 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - × expected `:` but instead found `)` - - 57 │ .unknown-test { - > 58 │ color: if(custom(--foo: bar): black;); - │ ^ - 59 │ } - 60 │ - - i Remove ) - if.css:58:30 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ × Unexpected value or character. @@ -3274,15 +5412,53 @@ if.css:58:38 parse ━━━━━━━━━━━━━━━━━━━━ if.css:62:13 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - × expected `)` but instead found `:` + × Expected a not boolean expression, or an if test but instead found ': black;'. + + 61 │ .incomplete-parens-expr { + > 62 │ color: if((: black;); + │ ^^^^^^^^ + 63 │ } + 64 │ + + i Expected a not boolean expression, or an if test here. + + 61 │ .incomplete-parens-expr { + > 62 │ color: if((: black;); + │ ^^^^^^^^ + 63 │ } + 64 │ + +if.css:62:22 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `:` but instead found `;` 61 │ .incomplete-parens-expr { > 62 │ color: if((: black;); - │ ^ + │ ^ 63 │ } 64 │ - i Remove : + i Remove ; + +if.css:63:1 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × Expected an if branch, or an if test boolean expression but instead found '}'. + + 61 │ .incomplete-parens-expr { + 62 │ color: if((: black;); + > 63 │ } + │ ^ + 64 │ + 65 │ .mixed-operators { + + i Expected an if branch, or an if test boolean expression here. + + 61 │ .incomplete-parens-expr { + 62 │ color: if((: black;); + > 63 │ } + │ ^ + 64 │ + 65 │ .mixed-operators { if.css:66:44 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ @@ -3366,18 +5542,6 @@ if.css:74:12 parse ━━━━━━━━━━━━━━━━━━━━ 75 │ } 76 │ -if.css:74:32 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - × expected `:` but instead found `)` - - 73 │ .and-no-left { - > 74 │ color: if(and style(--foo: bar): black;); - │ ^ - 75 │ } - 76 │ - - i Remove ) - if.css:74:33 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ × Unexpected value or character. @@ -3434,18 +5598,6 @@ if.css:78:12 parse ━━━━━━━━━━━━━━━━━━━━ 79 │ } 80 │ -if.css:78:31 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - × expected `:` but instead found `)` - - 77 │ .or-no-left { - > 78 │ color: if(or style(--foo: bar): black;); - │ ^ - 79 │ } - 80 │ - - i Remove ) - if.css:78:32 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ × Unexpected value or character. @@ -3502,4 +5654,280 @@ if.css:82:12 parse ━━━━━━━━━━━━━━━━━━━━ 83 │ } 84 │ +if.css:86:34 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × Expected an if branch, or an if test boolean expression but instead found '!bogus'. + + 85 │ .if-branch-list-recovery { + > 86 │ a: if(style(--foo: bar): black; !bogus; else: white); + │ ^^^^^^ + 87 │ a: if(style(--foo: bar): black; ???; else: white); + 88 │ } + + i Expected an if branch, or an if test boolean expression here. + + 85 │ .if-branch-list-recovery { + > 86 │ a: if(style(--foo: bar): black; !bogus; else: white); + │ ^^^^^^ + 87 │ a: if(style(--foo: bar): black; ???; else: white); + 88 │ } + +if.css:87:34 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × unexpected character `?` + + 85 │ .if-branch-list-recovery { + 86 │ a: if(style(--foo: bar): black; !bogus; else: white); + > 87 │ a: if(style(--foo: bar): black; ???; else: white); + │ ^ + 88 │ } + 89 │ + +if.css:87:35 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × unexpected character `?` + + 85 │ .if-branch-list-recovery { + 86 │ a: if(style(--foo: bar): black; !bogus; else: white); + > 87 │ a: if(style(--foo: bar): black; ???; else: white); + │ ^ + 88 │ } + 89 │ + +if.css:87:36 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × unexpected character `?` + + 85 │ .if-branch-list-recovery { + 86 │ a: if(style(--foo: bar): black; !bogus; else: white); + > 87 │ a: if(style(--foo: bar): black; ???; else: white); + │ ^ + 88 │ } + 89 │ + +if.css:91:40 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × Expected a not boolean expression, or an if test but instead found '!bogus'. + + 90 │ .todo { + > 91 │ background: if(style(--foo: bar) and (!bogus): red;); + │ ^^^^^^ + 92 │ background: if(not foo: red;); + 93 │ } + + i Expected a not boolean expression, or an if test here. + + 90 │ .todo { + > 91 │ background: if(style(--foo: bar) and (!bogus): red;); + │ ^^^^^^ + 92 │ background: if(not foo: red;); + 93 │ } + +if.css:92:21 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × Expected a parenthesized boolean expression, or an if test but instead found 'foo'. + + 90 │ .todo { + 91 │ background: if(style(--foo: bar) and (!bogus): red;); + > 92 │ background: if(not foo: red;); + │ ^^^ + 93 │ } + 94 │ + + i Expected a parenthesized boolean expression, or an if test here. + + 90 │ .todo { + 91 │ background: if(style(--foo: bar) and (!bogus): red;); + > 92 │ background: if(not foo: red;); + │ ^^^ + 93 │ } + 94 │ + +if.css:96:34 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × Expected an if branch, or an if test boolean expression but instead found '!bogus'. + + 95 │ .invalid-branch-content { + > 96 │ a: if(style(--foo: bar): black; !bogus; else: white); + │ ^^^^^^ + 97 │ } + 98 │ + + i Expected an if branch, or an if test boolean expression here. + + 95 │ .invalid-branch-content { + > 96 │ a: if(style(--foo: bar): black; !bogus; else: white); + │ ^^^^^^ + 97 │ } + 98 │ + +if.css:100:34 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × Expected an if branch, or an if test boolean expression but instead found '!bogus'. + + 99 │ .invalid-branch-content-no-trailing-semi { + > 100 │ a: if(style(--foo: bar): black; !bogus; else: white) + │ ^^^^^^ + 101 │ } + 102 │ + + i Expected an if branch, or an if test boolean expression here. + + 99 │ .invalid-branch-content-no-trailing-semi { + > 100 │ a: if(style(--foo: bar): black; !bogus; else: white) + │ ^^^^^^ + 101 │ } + 102 │ + +if.css:104:28 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × Expected an if branch, or an if test boolean expression but instead found '!!!'. + + 103 │ .multiple-invalid-branches { + > 104 │ a: if(style(--a: 1): red; !!!; style(--b: 2): blue; @@@; else: green); + │ ^^^ + 105 │ } + 106 │ + + i Expected an if branch, or an if test boolean expression here. + + 103 │ .multiple-invalid-branches { + > 104 │ a: if(style(--a: 1): red; !!!; style(--b: 2): blue; @@@; else: green); + │ ^^^ + 105 │ } + 106 │ + +if.css:104:54 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × Expected an if branch, or an if test boolean expression but instead found '@@@'. + + 103 │ .multiple-invalid-branches { + > 104 │ a: if(style(--a: 1): red; !!!; style(--b: 2): blue; @@@; else: green); + │ ^^^ + 105 │ } + 106 │ + + i Expected an if branch, or an if test boolean expression here. + + 103 │ .multiple-invalid-branches { + > 104 │ a: if(style(--a: 1): red; !!!; style(--b: 2): blue; @@@; else: green); + │ ^^^ + 105 │ } + 106 │ + +if.css:108:8 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × Expected an if branch, or an if test boolean expression but instead found '###: red'. + + 107 │ .invalid-then-valid { + > 108 │ a: if(###: red; style(--foo: bar): blue; else: green); + │ ^^^^^^^^ + 109 │ } + 110 │ + + i Expected an if branch, or an if test boolean expression here. + + 107 │ .invalid-then-valid { + > 108 │ a: if(###: red; style(--foo: bar): blue; else: green); + │ ^^^^^^^^ + 109 │ } + 110 │ + +if.css:112:34 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × Expected an if branch, or an if test boolean expression but instead found 'bogus-no-colon'. + + 111 │ .recovery-at-semicolon { + > 112 │ a: if(style(--foo: bar): black; bogus-no-colon; else: white); + │ ^^^^^^^^^^^^^^ + 113 │ } + 114 │ + + i Expected an if branch, or an if test boolean expression here. + + 111 │ .recovery-at-semicolon { + > 112 │ a: if(style(--foo: bar): black; bogus-no-colon; else: white); + │ ^^^^^^^^^^^^^^ + 113 │ } + 114 │ + +if.css:117:14 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × Unexpected value or character. + + 115 │ .multiple-if-declarations { + 116 │ a: if(style(--foo: bar): black; else: white); + > 117 │ b: if(style(--invalid): red; !!!; else: blue); + │ ^^^^^^^^^ + 118 │ c: if(style(--baz: qux): green; else: yellow); + 119 │ } + + i Expected one of: + + - not + - + - and + - or + - + +if.css:117:31 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × Expected an if branch, or an if test boolean expression but instead found '!!!'. + + 115 │ .multiple-if-declarations { + 116 │ a: if(style(--foo: bar): black; else: white); + > 117 │ b: if(style(--invalid): red; !!!; else: blue); + │ ^^^ + 118 │ c: if(style(--baz: qux): green; else: yellow); + 119 │ } + + i Expected an if branch, or an if test boolean expression here. + + 115 │ .multiple-if-declarations { + 116 │ a: if(style(--foo: bar): black; else: white); + > 117 │ b: if(style(--invalid): red; !!!; else: blue); + │ ^^^ + 118 │ c: if(style(--baz: qux): green; else: yellow); + 119 │ } + +if.css:124:37 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × Expected an if branch, or an if test boolean expression but instead found '!bogus'. + + 122 │ .outer { + 123 │ .inner { + > 124 │ color: if(style(--foo: bar): red; !bogus; else: blue); + │ ^^^^^^ + 125 │ } + 126 │ a: if(style(--test: val): green; else: yellow); + + i Expected an if branch, or an if test boolean expression here. + + 122 │ .outer { + 123 │ .inner { + > 124 │ color: if(style(--foo: bar): red; !bogus; else: blue); + │ ^^^^^^ + 125 │ } + 126 │ a: if(style(--test: val): green; else: yellow); + +if.css:133:36 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × Expected an if branch, or an if test boolean expression but instead found '!!!'. + + 131 │ .level2 { + 132 │ .level3 { + > 133 │ a: if(style(--deep: true): red; !!!; else: blue); + │ ^^^ + 134 │ b: if(style(--valid: false): green; else: yellow); + 135 │ } + + i Expected an if branch, or an if test boolean expression here. + + 131 │ .level2 { + 132 │ .level3 { + > 133 │ a: if(style(--deep: true): red; !!!; else: blue); + │ ^^^ + 134 │ b: if(style(--valid: false): green; else: yellow); + 135 │ } + ``` diff --git a/crates/biome_css_syntax/src/generated/kind.rs b/crates/biome_css_syntax/src/generated/kind.rs index f42b10c8e51d..fd5f8a21b065 100644 --- a/crates/biome_css_syntax/src/generated/kind.rs +++ b/crates/biome_css_syntax/src/generated/kind.rs @@ -543,6 +543,7 @@ pub enum CssSyntaxKind { CSS_BOGUS_SUPPORTS_CONDITION, CSS_BOGUS_IF_BRANCH, CSS_BOGUS_IF_TEST, + CSS_BOGUS_IF_TEST_BOOLEAN_EXPR, CSS_METAVARIABLE, #[doc(hidden)] __LAST, diff --git a/crates/biome_css_syntax/src/generated/macros.rs b/crates/biome_css_syntax/src/generated/macros.rs index 130381b01b19..b0c7d675453e 100644 --- a/crates/biome_css_syntax/src/generated/macros.rs +++ b/crates/biome_css_syntax/src/generated/macros.rs @@ -919,6 +919,11 @@ macro_rules! map_syntax_node { let $pattern = unsafe { $crate::CssBogusIfTest::new_unchecked(node) }; $body } + $crate::CssSyntaxKind::CSS_BOGUS_IF_TEST_BOOLEAN_EXPR => { + let $pattern = + unsafe { $crate::CssBogusIfTestBooleanExpr::new_unchecked(node) }; + $body + } $crate::CssSyntaxKind::CSS_BOGUS_KEYFRAMES_ITEM => { let $pattern = unsafe { $crate::CssBogusKeyframesItem::new_unchecked(node) }; $body diff --git a/crates/biome_css_syntax/src/generated/nodes.rs b/crates/biome_css_syntax/src/generated/nodes.rs index 01b56eb73556..1194f21a9fab 100644 --- a/crates/biome_css_syntax/src/generated/nodes.rs +++ b/crates/biome_css_syntax/src/generated/nodes.rs @@ -9620,6 +9620,7 @@ impl AnyCssIfTestBooleanAndCombinableExpr { pub enum AnyCssIfTestBooleanExpr { AnyCssIfTestBooleanAndCombinableExpr(AnyCssIfTestBooleanAndCombinableExpr), AnyCssIfTestBooleanOrCombinableExpr(AnyCssIfTestBooleanOrCombinableExpr), + CssBogusIfTestBooleanExpr(CssBogusIfTestBooleanExpr), CssIfTestBooleanNotExpr(CssIfTestBooleanNotExpr), } impl AnyCssIfTestBooleanExpr { @@ -9639,6 +9640,12 @@ impl AnyCssIfTestBooleanExpr { _ => None, } } + pub fn as_css_bogus_if_test_boolean_expr(&self) -> Option<&CssBogusIfTestBooleanExpr> { + match &self { + Self::CssBogusIfTestBooleanExpr(item) => Some(item), + _ => None, + } + } pub fn as_css_if_test_boolean_not_expr(&self) -> Option<&CssIfTestBooleanNotExpr> { match &self { Self::CssIfTestBooleanNotExpr(item) => Some(item), @@ -24506,6 +24513,11 @@ impl From for SyntaxElement { node.into() } } +impl From for AnyCssIfTestBooleanExpr { + fn from(node: CssBogusIfTestBooleanExpr) -> Self { + Self::CssBogusIfTestBooleanExpr(node) + } +} impl From for AnyCssIfTestBooleanExpr { fn from(node: CssIfTestBooleanNotExpr) -> Self { Self::CssIfTestBooleanNotExpr(node) @@ -24515,10 +24527,11 @@ impl AstNode for AnyCssIfTestBooleanExpr { type Language = Language; const KIND_SET: SyntaxKindSet = AnyCssIfTestBooleanAndCombinableExpr::KIND_SET .union(AnyCssIfTestBooleanOrCombinableExpr::KIND_SET) + .union(CssBogusIfTestBooleanExpr::KIND_SET) .union(CssIfTestBooleanNotExpr::KIND_SET); fn can_cast(kind: SyntaxKind) -> bool { match kind { - CSS_IF_TEST_BOOLEAN_NOT_EXPR => true, + CSS_BOGUS_IF_TEST_BOOLEAN_EXPR | CSS_IF_TEST_BOOLEAN_NOT_EXPR => true, k if AnyCssIfTestBooleanAndCombinableExpr::can_cast(k) => true, k if AnyCssIfTestBooleanOrCombinableExpr::can_cast(k) => true, _ => false, @@ -24526,6 +24539,9 @@ impl AstNode for AnyCssIfTestBooleanExpr { } fn cast(syntax: SyntaxNode) -> Option { let res = match syntax.kind() { + CSS_BOGUS_IF_TEST_BOOLEAN_EXPR => { + Self::CssBogusIfTestBooleanExpr(CssBogusIfTestBooleanExpr { syntax }) + } CSS_IF_TEST_BOOLEAN_NOT_EXPR => { Self::CssIfTestBooleanNotExpr(CssIfTestBooleanNotExpr { syntax }) } @@ -24552,6 +24568,7 @@ impl AstNode for AnyCssIfTestBooleanExpr { } fn syntax(&self) -> &SyntaxNode { match self { + Self::CssBogusIfTestBooleanExpr(it) => it.syntax(), Self::CssIfTestBooleanNotExpr(it) => it.syntax(), Self::AnyCssIfTestBooleanAndCombinableExpr(it) => it.syntax(), Self::AnyCssIfTestBooleanOrCombinableExpr(it) => it.syntax(), @@ -24559,6 +24576,7 @@ impl AstNode for AnyCssIfTestBooleanExpr { } fn into_syntax(self) -> SyntaxNode { match self { + Self::CssBogusIfTestBooleanExpr(it) => it.into_syntax(), Self::CssIfTestBooleanNotExpr(it) => it.into_syntax(), Self::AnyCssIfTestBooleanAndCombinableExpr(it) => it.into_syntax(), Self::AnyCssIfTestBooleanOrCombinableExpr(it) => it.into_syntax(), @@ -24570,6 +24588,7 @@ impl std::fmt::Debug for AnyCssIfTestBooleanExpr { match self { Self::AnyCssIfTestBooleanAndCombinableExpr(it) => std::fmt::Debug::fmt(it, f), Self::AnyCssIfTestBooleanOrCombinableExpr(it) => std::fmt::Debug::fmt(it, f), + Self::CssBogusIfTestBooleanExpr(it) => std::fmt::Debug::fmt(it, f), Self::CssIfTestBooleanNotExpr(it) => std::fmt::Debug::fmt(it, f), } } @@ -24579,6 +24598,7 @@ impl From for SyntaxNode { match n { AnyCssIfTestBooleanExpr::AnyCssIfTestBooleanAndCombinableExpr(it) => it.into_syntax(), AnyCssIfTestBooleanExpr::AnyCssIfTestBooleanOrCombinableExpr(it) => it.into_syntax(), + AnyCssIfTestBooleanExpr::CssBogusIfTestBooleanExpr(it) => it.into_syntax(), AnyCssIfTestBooleanExpr::CssIfTestBooleanNotExpr(it) => it.into_syntax(), } } @@ -30936,6 +30956,62 @@ impl From for SyntaxElement { } } #[derive(Clone, PartialEq, Eq, Hash, Serialize)] +pub struct CssBogusIfTestBooleanExpr { + syntax: SyntaxNode, +} +impl CssBogusIfTestBooleanExpr { + #[doc = r" Create an AstNode from a SyntaxNode without checking its kind"] + #[doc = r""] + #[doc = r" # Safety"] + #[doc = r" This function must be guarded with a call to [AstNode::can_cast]"] + #[doc = r" or a match on [SyntaxNode::kind]"] + #[inline] + pub const unsafe fn new_unchecked(syntax: SyntaxNode) -> Self { + Self { syntax } + } + pub fn items(&self) -> SyntaxElementChildren { + support::elements(&self.syntax) + } +} +impl AstNode for CssBogusIfTestBooleanExpr { + type Language = Language; + const KIND_SET: SyntaxKindSet = + SyntaxKindSet::from_raw(RawSyntaxKind(CSS_BOGUS_IF_TEST_BOOLEAN_EXPR as u16)); + fn can_cast(kind: SyntaxKind) -> bool { + kind == CSS_BOGUS_IF_TEST_BOOLEAN_EXPR + } + fn cast(syntax: SyntaxNode) -> Option { + if Self::can_cast(syntax.kind()) { + Some(Self { syntax }) + } else { + None + } + } + fn syntax(&self) -> &SyntaxNode { + &self.syntax + } + fn into_syntax(self) -> SyntaxNode { + self.syntax + } +} +impl std::fmt::Debug for CssBogusIfTestBooleanExpr { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("CssBogusIfTestBooleanExpr") + .field("items", &DebugSyntaxElementChildren(self.items())) + .finish() + } +} +impl From for SyntaxNode { + fn from(n: CssBogusIfTestBooleanExpr) -> Self { + n.syntax + } +} +impl From for SyntaxElement { + fn from(n: CssBogusIfTestBooleanExpr) -> Self { + n.syntax.into() + } +} +#[derive(Clone, PartialEq, Eq, Hash, Serialize)] pub struct CssBogusKeyframesItem { syntax: SyntaxNode, } @@ -31999,7 +32075,7 @@ impl From for SyntaxElement { n.syntax.into() } } -biome_rowan::declare_node_union! { pub AnyCssBogusNode = CssBogus | CssBogusAtRule | CssBogusBlock | CssBogusCustomIdentifier | CssBogusDeclarationItem | CssBogusDocumentMatcher | CssBogusFontFamilyName | CssBogusFontFeatureValuesItem | CssBogusIfBranch | CssBogusIfTest | CssBogusKeyframesItem | CssBogusKeyframesName | CssBogusLayer | CssBogusMediaQuery | CssBogusPageSelectorPseudo | CssBogusParameter | CssBogusProperty | CssBogusPropertyValue | CssBogusPseudoClass | CssBogusPseudoElement | CssBogusRule | CssBogusScopeRange | CssBogusSelector | CssBogusSubSelector | CssBogusSupportsCondition | CssBogusUnicodeRangeValue | CssBogusUrlModifier | CssUnknownAtRuleComponentList | CssValueAtRuleGenericValue } +biome_rowan::declare_node_union! { pub AnyCssBogusNode = CssBogus | CssBogusAtRule | CssBogusBlock | CssBogusCustomIdentifier | CssBogusDeclarationItem | CssBogusDocumentMatcher | CssBogusFontFamilyName | CssBogusFontFeatureValuesItem | CssBogusIfBranch | CssBogusIfTest | CssBogusIfTestBooleanExpr | CssBogusKeyframesItem | CssBogusKeyframesName | CssBogusLayer | CssBogusMediaQuery | CssBogusPageSelectorPseudo | CssBogusParameter | CssBogusProperty | CssBogusPropertyValue | CssBogusPseudoClass | CssBogusPseudoElement | CssBogusRule | CssBogusScopeRange | CssBogusSelector | CssBogusSubSelector | CssBogusSupportsCondition | CssBogusUnicodeRangeValue | CssBogusUrlModifier | CssUnknownAtRuleComponentList | CssValueAtRuleGenericValue } #[derive(Clone, Eq, PartialEq, Hash)] pub struct CssBracketedValueList { syntax_list: SyntaxList, diff --git a/crates/biome_css_syntax/src/lib.rs b/crates/biome_css_syntax/src/lib.rs index 1658957b52fd..c041fb3227f9 100644 --- a/crates/biome_css_syntax/src/lib.rs +++ b/crates/biome_css_syntax/src/lib.rs @@ -130,6 +130,9 @@ impl biome_rowan::SyntaxKind for CssSyntaxKind { kind if AnyCssFontFeatureValuesBlock::can_cast(*kind) => CSS_BOGUS_BLOCK, kind if AnyCssUnicodeValue::can_cast(*kind) => CSS_BOGUS_UNICODE_RANGE_VALUE, kind if AnyCssSupportsCondition::can_cast(*kind) => CSS_BOGUS_SUPPORTS_CONDITION, + kind if AnyCssIfBranch::can_cast(*kind) => CSS_BOGUS_IF_BRANCH, + kind if AnyCssIfTest::can_cast(*kind) => CSS_BOGUS_IF_TEST, + kind if AnyCssIfTestBooleanExpr::can_cast(*kind) => CSS_BOGUS_IF_TEST_BOOLEAN_EXPR, _ => CSS_BOGUS, } diff --git a/xtask/codegen/css.ungram b/xtask/codegen/css.ungram index 9180d8a9ad4a..efdb06292ca0 100644 --- a/xtask/codegen/css.ungram +++ b/xtask/codegen/css.ungram @@ -63,6 +63,7 @@ CssBogusUnicodeRangeValue = SyntaxElement* CssBogusSupportsCondition = SyntaxElement* CssBogusIfBranch = SyntaxElement* CssBogusIfTest = SyntaxElement* +CssBogusIfTestBooleanExpr = SyntaxElement* CssRoot = bom: 'UNICODE_BOM'? @@ -1855,12 +1856,16 @@ CssParameter = AnyCssExpression // supports( [ : ] | ) | // media( | ) | // style( ) +// +// if(style(--color: green)): red); CssIfFunction = 'if' '(' CssIfBranchList ')' +// if(style(--theme: dark): red; else: blue) +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ CssIfBranchList = AnyCssIfBranch (';' AnyCssIfBranch)* ';'? // https://drafts.csswg.org/css-values-5/#typedef-boolean-expr @@ -1872,8 +1877,12 @@ AnyCssIfTestBooleanExpr = CssIfTestBooleanNotExpr | AnyCssIfTestBooleanAndCombinableExpr | AnyCssIfTestBooleanOrCombinableExpr + | CssBogusIfTestBooleanExpr // not +// +// if(not style(--color: green): red) +// ^^^^^^^^^^^^^^^^^^^^^^^^ CssIfTestBooleanNotExpr = 'not' expression: AnyCssIfTestBooleanExprGroup @@ -1882,6 +1891,8 @@ AnyCssIfTestBooleanAndCombinableExpr = AnyCssIfTestBooleanExprGroup | CssIfTestBooleanAndExpr +// if(style(--color: green) and style(--color: blue)): red) +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ CssIfTestBooleanAndExpr = left: AnyCssIfTestBooleanExprGroup 'and' @@ -1891,6 +1902,8 @@ AnyCssIfTestBooleanOrCombinableExpr = AnyCssIfTestBooleanExprGroup | CssIfTestBooleanOrExpr +// if(style(--color: green) or style(--color: blue)): red) +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ CssIfTestBooleanOrExpr = left: AnyCssIfTestBooleanExprGroup 'or' @@ -1902,15 +1915,22 @@ AnyCssIfTestBooleanExprGroup = | CssIfTestBooleanExprInParens // ( ) +// +// if(style(--foo: bar) and (style(--fiz: buzz) or style(--baz: qux)): red) +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ CssIfTestBooleanExprInParens = '(' expression: AnyCssIfTestBooleanExpr ')' +// if(media(width < 700px): 0 auto; else: 20px auto;); +// ^^^^ CssElseKeyword = 'else' AnyCssIfCondition = AnyCssIfTestBooleanExpr | CssElseKeyword +// if(style(--color: green): red; else: blue) +// ^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^ CssIfBranch = condition: AnyCssIfCondition ':' @@ -1920,6 +1940,8 @@ AnyCssIfBranch = CssIfBranch | CssBogusIfBranch +// supports(color: lch(75% 0 0)): lch(75% 0 0) +// ^^^^^^^^^^^^^^^^^^^ CssIfSupportsIdentifierTest = ident: CssIdentifier ':' @@ -1929,6 +1951,8 @@ AnyCssIfSupportsTestCondition = CssIfSupportsIdentifierTest | AnyCssImportSupportsCondition +// if(supports(selector(:buffering)): 1em;) +// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ CssIfSupportsTest = 'supports' '(' @@ -1939,6 +1963,8 @@ AnyCssIfMediaTestQuery = AnyCssMediaCondition | AnyCssQueryFeature +// if(media(width > 700px): calc(3rem + 2vw)) +// ^^^^^^^^^^^^^^^^^^^^ CssIfMediaTest = 'media' '(' diff --git a/xtask/codegen/src/css_kinds_src.rs b/xtask/codegen/src/css_kinds_src.rs index 0cbb9b2013fd..c776dc2366b1 100644 --- a/xtask/codegen/src/css_kinds_src.rs +++ b/xtask/codegen/src/css_kinds_src.rs @@ -576,6 +576,7 @@ pub const CSS_KINDS_SRC: KindsSrc = KindsSrc { "CSS_BOGUS_SUPPORTS_CONDITION", "CSS_BOGUS_IF_BRANCH", "CSS_BOGUS_IF_TEST", + "CSS_BOGUS_IF_TEST_BOOLEAN_EXPR", // Grit metavariable "CSS_METAVARIABLE", ],