diff --git a/crates/biome_css_formatter/src/scss/any/expression_item.rs b/crates/biome_css_formatter/src/scss/any/expression_item.rs index 985d22827071..0dfce5eb8de6 100644 --- a/crates/biome_css_formatter/src/scss/any/expression_item.rs +++ b/crates/biome_css_formatter/src/scss/any/expression_item.rs @@ -9,6 +9,7 @@ impl FormatRule for FormatAnyScssExpressionItem { fn fmt(&self, node: &AnyScssExpressionItem, f: &mut CssFormatter) -> FormatResult<()> { match node { AnyScssExpressionItem::AnyCssValue(node) => node.format().fmt(f), + AnyScssExpressionItem::CssDeclarationImportant(node) => node.format().fmt(f), AnyScssExpressionItem::CssGenericDelimiter(node) => node.format().fmt(f), AnyScssExpressionItem::ScssArbitraryArgument(node) => node.format().fmt(f), AnyScssExpressionItem::ScssBinaryExpression(node) => node.format().fmt(f), diff --git a/crates/biome_css_formatter/tests/specs/css/scss/expression/edge-cases.scss.snap b/crates/biome_css_formatter/tests/specs/css/scss/expression/edge-cases.scss.snap index 4415b24d61dd..f5250e49b297 100644 --- a/crates/biome_css_formatter/tests/specs/css/scss/expression/edge-cases.scss.snap +++ b/crates/biome_css_formatter/tests/specs/css/scss/expression/edge-cases.scss.snap @@ -54,7 +54,7 @@ Trailing newline: true ```scss $long-list: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11; -$empty-elements: 1,, 3; +$empty-elements: 1, , 3; $nested-map: ( a: ( b: 1, diff --git a/crates/biome_css_formatter/tests/specs/css/scss/expression/formatting.scss.snap b/crates/biome_css_formatter/tests/specs/css/scss/expression/formatting.scss.snap index 20bc9a77596a..5615fcc73732 100644 --- a/crates/biome_css_formatter/tests/specs/css/scss/expression/formatting.scss.snap +++ b/crates/biome_css_formatter/tests/specs/css/scss/expression/formatting.scss.snap @@ -1,6 +1,5 @@ --- source: crates/biome_formatter_test/src/snapshot_builder.rs -assertion_line: 212 info: css/scss/expression/formatting.scss --- diff --git a/crates/biome_css_parser/src/lib.rs b/crates/biome_css_parser/src/lib.rs index a7b409455212..a5490f0beda2 100644 --- a/crates/biome_css_parser/src/lib.rs +++ b/crates/biome_css_parser/src/lib.rs @@ -8,7 +8,7 @@ use biome_css_factory::CssSyntaxFactory; use biome_css_syntax::{AnyCssRoot, CssFileSource, CssLanguage, CssSyntaxNode}; pub use biome_parser::prelude::*; use biome_parser::{AnyParse, EmbeddedNodeParse, NodeParse}; -use biome_rowan::{AstNode, NodeCache, SyntaxNodeWithOffset}; +use biome_rowan::{AstNode, NodeCache, SyntaxNodeWithOffset, TextSize}; pub use parser::{CssModulesKind, CssParserOptions}; mod lexer; @@ -22,7 +22,7 @@ pub(crate) type CssLosslessTreeSink<'source> = LosslessTreeSink<'source, CssLanguage, CssSyntaxFactory>; pub(crate) type CssOffsetLosslessTreeSink<'source> = - biome_parser::tree_sink::OffsetLosslessTreeSink<'source, CssLanguage, CssSyntaxFactory>; + OffsetLosslessTreeSink<'source, CssLanguage, CssSyntaxFactory>; pub fn parse_css(source: &str, source_type: CssFileSource, options: CssParserOptions) -> CssParse { let mut cache = NodeCache::default(); @@ -166,7 +166,7 @@ impl CssOffsetParse { } /// Get the base offset applied to this parse result - pub fn base_offset(&self) -> biome_rowan::TextSize { + pub fn base_offset(&self) -> TextSize { self.root.base_offset() } diff --git a/crates/biome_css_parser/src/syntax/at_rule/tailwind.rs b/crates/biome_css_parser/src/syntax/at_rule/tailwind.rs index 99f4492b0c5f..095c9e8ba025 100644 --- a/crates/biome_css_parser/src/syntax/at_rule/tailwind.rs +++ b/crates/biome_css_parser/src/syntax/at_rule/tailwind.rs @@ -10,7 +10,7 @@ use crate::syntax::{is_at_identifier, parse_identifier, parse_regular_identifier use biome_css_syntax::CssSyntaxKind::{self, *}; use biome_css_syntax::T; use biome_parser::parse_lists::{ParseNodeList, ParseSeparatedList}; -use biome_parser::parse_recovery::ParseRecoveryTokenSet; +use biome_parser::parse_recovery::{ParseRecoveryTokenSet, RecoveryResult}; use biome_parser::parsed_syntax::ParsedSyntax; use biome_parser::parsed_syntax::ParsedSyntax::{Absent, Present}; use biome_parser::prelude::*; @@ -207,7 +207,7 @@ impl ParseNodeList for ApplyClassList { &mut self, p: &mut Self::Parser<'_>, parsed_element: ParsedSyntax, - ) -> biome_parser::parse_recovery::RecoveryResult { + ) -> RecoveryResult { parsed_element.or_recover_with_token_set( p, &ParseRecoveryTokenSet::new(CSS_BOGUS_CUSTOM_IDENTIFIER, TW_APPLY_CLASS_LIST_END) diff --git a/crates/biome_css_parser/src/syntax/parse_error.rs b/crates/biome_css_parser/src/syntax/parse_error.rs index 5190466373e4..30c19d29326d 100644 --- a/crates/biome_css_parser/src/syntax/parse_error.rs +++ b/crates/biome_css_parser/src/syntax/parse_error.rs @@ -229,20 +229,6 @@ pub(crate) fn expected_component_value(p: &CssParser, range: TextRange) -> Parse .into_diagnostic(p) } -pub(crate) fn expected_scss_expression(p: &CssParser, range: TextRange) -> ParseDiagnostic { - expected_node("SCSS expression", range, p) -} - -pub(crate) fn scss_ellipsis_not_allowed(p: &CssParser, range: TextRange) -> ParseDiagnostic { - p.err_builder( - "SCSS arbitrary arguments (`...`) are only allowed in function call arguments.", - range, - ) - .with_hint(markup! { - "Use `...` only for function arguments, for example `fn($args...)`." - }) -} - pub(crate) fn expected_declaration(p: &CssParser, range: TextRange) -> ParseDiagnostic { expected_node("", range, p) } diff --git a/crates/biome_css_parser/src/syntax/scss/declaration/mod.rs b/crates/biome_css_parser/src/syntax/scss/declaration/mod.rs index cefc97da22c2..7b802f08952c 100644 --- a/crates/biome_css_parser/src/syntax/scss/declaration/mod.rs +++ b/crates/biome_css_parser/src/syntax/scss/declaration/mod.rs @@ -1,5 +1,6 @@ mod nesting; mod variable; +mod variable_modifier; pub(crate) use nesting::{is_at_scss_nesting_declaration, parse_scss_nesting_declaration}; pub(crate) use variable::{is_at_scss_declaration, parse_scss_declaration}; diff --git a/crates/biome_css_parser/src/syntax/scss/declaration/nesting.rs b/crates/biome_css_parser/src/syntax/scss/declaration/nesting.rs index 7e7c9b1d47aa..bcd4f61fe08c 100644 --- a/crates/biome_css_parser/src/syntax/scss/declaration/nesting.rs +++ b/crates/biome_css_parser/src/syntax/scss/declaration/nesting.rs @@ -1,7 +1,9 @@ use crate::parser::CssParser; use crate::syntax::block::parse_declaration_or_rule_list_block; use crate::syntax::parse_error::expected_component_value; -use crate::syntax::scss::parse_scss_expression_allow_empty_value_until; +use crate::syntax::scss::{ + SCSS_NESTING_VALUE_END_SET, parse_scss_expression_allow_empty_value_until, +}; use crate::syntax::{ CssSyntaxFeatures, is_at_dashed_identifier, is_at_identifier, parse_regular_identifier, }; @@ -9,13 +11,10 @@ use biome_css_syntax::CssSyntaxKind::{ CSS_DECLARATION, CSS_DECLARATION_IMPORTANT, CSS_DECLARATION_WITH_SEMICOLON, CSS_GENERIC_PROPERTY, EOF, SCSS_NESTING_DECLARATION, }; -use biome_css_syntax::{CssSyntaxKind, T}; +use biome_css_syntax::T; use biome_parser::prelude::ParsedSyntax; use biome_parser::prelude::ParsedSyntax::{Absent, Present}; -use biome_parser::{CompletedMarker, Parser, SyntaxFeature, TokenSet, token_set}; - -const SCSS_NESTING_VALUE_END_SET: TokenSet = - token_set![T!['{'], T![;], T!['}'], T![!], EOF]; +use biome_parser::{CompletedMarker, Parser, SyntaxFeature}; /// Detects nested property syntax (`prop: { ... }`) while excluding custom properties /// and CSS Modules declarations that must remain regular properties. diff --git a/crates/biome_css_parser/src/syntax/scss/declaration/variable.rs b/crates/biome_css_parser/src/syntax/scss/declaration/variable.rs index e918a55d684f..822b3a0f9daf 100644 --- a/crates/biome_css_parser/src/syntax/scss/declaration/variable.rs +++ b/crates/biome_css_parser/src/syntax/scss/declaration/variable.rs @@ -1,19 +1,15 @@ -use super::super::{is_at_scss_identifier, parse_scss_identifier}; -use crate::parser::CssParser; -use crate::syntax::parse_error::expected_scss_expression; -use crate::syntax::scss::parse_scss_expression_until; -use crate::syntax::{is_nth_at_identifier, parse_regular_identifier}; -use biome_css_syntax::CssSyntaxKind::{ - EOF, ERROR_TOKEN, SCSS_DECLARATION, SCSS_NAMESPACED_IDENTIFIER, SCSS_VARIABLE_MODIFIER, - SCSS_VARIABLE_MODIFIER_LIST, +use super::super::{ + is_at_scss_identifier, is_at_scss_namespaced_identifier, parse_scss_identifier, + parse_scss_namespaced_identifier, }; -use biome_css_syntax::{CssSyntaxKind, T, TextRange}; -use biome_parser::diagnostic::{ParseDiagnostic, expected_token_any}; -use biome_parser::parse_lists::ParseNodeList; -use biome_parser::parse_recovery::{RecoveryError, RecoveryResult}; +use super::variable_modifier::parse_scss_variable_modifiers; +use crate::parser::CssParser; +use crate::syntax::scss::{expected_scss_expression, parse_scss_expression_until}; +use biome_css_syntax::CssSyntaxKind::{EOF, SCSS_DECLARATION}; +use biome_css_syntax::T; use biome_parser::prelude::ParsedSyntax; use biome_parser::prelude::ParsedSyntax::{Absent, Present}; -use biome_parser::{Parser, TokenSet, token_set}; +use biome_parser::{Parser, token_set}; /// Detects a SCSS variable declaration (including module-qualified variables). /// @@ -52,7 +48,7 @@ pub(crate) fn parse_scss_declaration(p: &mut CssParser) -> ParsedSyntax { let m = p.start(); parse_scss_declaration_name(p).ok(); - p.expect(T![:]); + p.bump(T![:]); parse_scss_expression_until(p, token_set![T![!], T![;], T!['}']]) .or_add_diagnostic(p, expected_scss_expression); @@ -70,27 +66,6 @@ pub(crate) fn parse_scss_declaration(p: &mut CssParser) -> ParsedSyntax { Present(m.complete(p, SCSS_DECLARATION)) } -#[inline] -fn is_at_scss_namespaced_identifier(p: &mut CssParser) -> bool { - is_nth_at_identifier(p, 0) - && p.nth_at(1, T![.]) - && p.nth_at(2, T![$]) - && is_nth_at_identifier(p, 3) -} - -#[inline] -fn parse_scss_namespaced_identifier(p: &mut CssParser) -> ParsedSyntax { - if !is_at_scss_namespaced_identifier(p) { - return Absent; - } - - let m = p.start(); - parse_regular_identifier(p).ok(); - p.expect(T![.]); - parse_scss_identifier(p).ok(); - Present(m.complete(p, SCSS_NAMESPACED_IDENTIFIER)) -} - #[inline] fn parse_scss_declaration_name(p: &mut CssParser) -> ParsedSyntax { if is_at_scss_namespaced_identifier(p) { @@ -99,106 +74,3 @@ fn parse_scss_declaration_name(p: &mut CssParser) -> ParsedSyntax { parse_scss_identifier(p) } } - -const SCSS_VARIABLE_MODIFIER_LIST_END_SET: TokenSet = - token_set![T![;], T!['}'], EOF]; -const SCSS_VARIABLE_MODIFIER_TOKEN_SET: TokenSet = - token_set![T![default], T![global]]; - -#[inline] -fn parse_scss_variable_modifiers(p: &mut CssParser) { - ScssVariableModifierList.parse_list(p); - recover_scss_variable_modifier_tail(p); -} - -#[inline] -fn recover_scss_variable_modifier_tail(p: &mut CssParser) { - loop { - if p.at_ts(SCSS_VARIABLE_MODIFIER_LIST_END_SET) { - return; - } - - if p.at(T![!]) { - parse_scss_variable_modifier(p).ok(); - continue; - } - - if p.at(ERROR_TOKEN) { - p.bump_any(); - continue; - } - - // Recover malformed modifier separators only when they directly precede - // another modifier (`bar !global`). Otherwise leave the token for - // missing-semicolon recovery at declaration level. - if p.nth_at(1, T![!]) { - let range = p.cur_range(); - p.error( - p.err_builder("Unexpected value or character.", range) - .with_hint("Expected a variable modifier or the end of the declaration."), - ); - p.bump_any(); - continue; - } - - return; - } -} - -#[inline] -fn parse_scss_variable_modifier(p: &mut CssParser) -> ParsedSyntax { - if !p.at(T![!]) { - return Absent; - } - - let m = p.start(); - p.bump(T![!]); - - if p.at_ts(SCSS_VARIABLE_MODIFIER_TOKEN_SET) { - p.bump_ts(SCSS_VARIABLE_MODIFIER_TOKEN_SET); - } else if p.at(T![important]) { - p.error(important_modifier_not_allowed(p, p.cur_range())); - p.bump(T![important]); - } else { - p.error(expected_token_any(&[T![default], T![global]])); - if !p.at_ts(SCSS_VARIABLE_MODIFIER_LIST_END_SET) { - p.bump_any(); - } - } - - Present(m.complete(p, SCSS_VARIABLE_MODIFIER)) -} - -fn important_modifier_not_allowed(p: &CssParser, range: TextRange) -> ParseDiagnostic { - p.err_builder("`!important` is not valid here.", range) - .with_hint( - "SCSS variable declarations only support the `!default` and `!global` modifiers.", - ) -} - -struct ScssVariableModifierList; - -impl ParseNodeList for ScssVariableModifierList { - type Kind = CssSyntaxKind; - type Parser<'source> = CssParser<'source>; - const LIST_KIND: Self::Kind = SCSS_VARIABLE_MODIFIER_LIST; - - fn parse_element(&mut self, p: &mut Self::Parser<'_>) -> ParsedSyntax { - parse_scss_variable_modifier(p) - } - - fn is_at_list_end(&self, p: &mut Self::Parser<'_>) -> bool { - p.at_ts(SCSS_VARIABLE_MODIFIER_LIST_END_SET) || !p.at(T![!]) - } - - fn recover( - &mut self, - _p: &mut Self::Parser<'_>, - parsed_element: ParsedSyntax, - ) -> RecoveryResult { - match parsed_element { - Absent => Err(RecoveryError::AlreadyRecovered), - Present(m) => Ok(m), - } - } -} diff --git a/crates/biome_css_parser/src/syntax/scss/declaration/variable_modifier.rs b/crates/biome_css_parser/src/syntax/scss/declaration/variable_modifier.rs new file mode 100644 index 000000000000..c780f06cf700 --- /dev/null +++ b/crates/biome_css_parser/src/syntax/scss/declaration/variable_modifier.rs @@ -0,0 +1,137 @@ +use crate::parser::CssParser; +use crate::syntax::scss::{ + SCSS_IDENT_CONTINUATION_SET, SCSS_STATEMENT_START_SET, SCSS_VARIABLE_MODIFIER_LIST_END_SET, + expected_scss_variable_modifier, +}; +use biome_css_syntax::CssSyntaxKind::{ + CSS_BOGUS, SCSS_VARIABLE_MODIFIER, SCSS_VARIABLE_MODIFIER_LIST, +}; +use biome_css_syntax::{CssSyntaxKind, T}; +use biome_parser::parse_lists::ParseNodeList; +use biome_parser::parse_recovery::{ParseRecovery, RecoveryResult}; +use biome_parser::prelude::ParsedSyntax; +use biome_parser::prelude::ParsedSyntax::{Absent, Present}; +use biome_parser::{Parser, TokenSet, token_set}; +use biome_rowan::TextRange; + +const SCSS_VARIABLE_MODIFIER_TOKEN_SET: TokenSet = + token_set![T![default], T![global]]; + +/// Parses trailing SCSS variable modifiers (`!default`, `!global`) after a +/// variable value. +/// +/// Example: +/// ```scss +/// $x: 1 !default !global; +/// ``` +/// +/// Docs: https://sass-lang.com/documentation/variables +#[inline] +pub(crate) fn parse_scss_variable_modifiers(p: &mut CssParser) { + ScssVariableModifierList.parse_list(p); +} + +/// Parses `!default` or `!global` after a variable value and emits a targeted +/// error for any other `!` token to avoid silently accepting invalid modifiers. +/// +/// Example: +/// ```scss +/// $x: 1 !global; +/// ``` +/// +/// Docs: https://sass-lang.com/documentation/variables +#[inline] +fn parse_scss_variable_modifier(p: &mut CssParser) -> ParsedSyntax { + if !p.at(T![!]) { + return Absent; + } + + let bang_range = p.cur_range(); + let m = p.start(); + p.bump(T![!]); + + if p.at_ts(SCSS_VARIABLE_MODIFIER_TOKEN_SET) { + if p.at(T![default]) { + p.bump(T![default]); + } else { + p.bump(T![global]); + } + } else { + let range = TextRange::new(bang_range.start(), p.cur_range().end()); + p.error(expected_scss_variable_modifier(p, range)); + if !p.at_ts(SCSS_VARIABLE_MODIFIER_LIST_END_SET) { + p.bump_any(); + } + } + + Present(m.complete(p, SCSS_VARIABLE_MODIFIER)) +} + +/// Collects trailing variable modifiers so they don't get folded into the value +/// list. +/// +/// Example: +/// ```scss +/// $x: 1 !default !global; +/// ``` +/// +/// Docs: https://sass-lang.com/documentation/variables +struct ScssVariableModifierList; + +impl ParseNodeList for ScssVariableModifierList { + type Kind = CssSyntaxKind; + type Parser<'source> = CssParser<'source>; + const LIST_KIND: Self::Kind = SCSS_VARIABLE_MODIFIER_LIST; + + fn parse_element(&mut self, p: &mut Self::Parser<'_>) -> ParsedSyntax { + parse_scss_variable_modifier(p) + } + + fn is_at_list_end(&self, p: &mut Self::Parser<'_>) -> bool { + p.at_ts(SCSS_VARIABLE_MODIFIER_LIST_END_SET) || is_at_scss_statement_boundary(p) + } + + fn recover( + &mut self, + p: &mut Self::Parser<'_>, + parsed_element: ParsedSyntax, + ) -> RecoveryResult { + match parsed_element { + Absent => Absent.or_recover(p, &ScssVariableModifierListParseRecovery, |p, range| { + p.err_builder("Unexpected value or character.", range) + .with_hint("Expected a variable modifier or the end of the declaration.") + }), + Present(m) => Ok(m), + } + } +} + +struct ScssVariableModifierListParseRecovery; + +impl ParseRecovery for ScssVariableModifierListParseRecovery { + type Kind = CssSyntaxKind; + type Parser<'source> = CssParser<'source>; + const RECOVERED_KIND: Self::Kind = CSS_BOGUS; + + fn is_at_recovered(&self, p: &mut Self::Parser<'_>) -> bool { + p.at(T![!]) + || p.at_ts(SCSS_VARIABLE_MODIFIER_LIST_END_SET) + || p.has_preceding_line_break() + || is_at_scss_statement_boundary(p) + } +} + +#[inline] +fn is_at_scss_statement_boundary(p: &mut CssParser) -> bool { + p.at_ts(SCSS_STATEMENT_START_SET) || is_at_identifier_started_scss_statement_boundary(p) +} + +#[inline] +fn is_at_identifier_started_scss_statement_boundary(p: &mut CssParser) -> bool { + p.at(T![ident]) + && (p.nth_at(1, T![:]) + || p.nth_at_ts(1, SCSS_IDENT_CONTINUATION_SET) + || (p.nth_at(1, T![*]) && p.nth_at(2, T![:])) + || (p.nth_at(1, T![-]) && p.nth_at(2, T![*]) && p.nth_at(3, T![:])) + || p.nth_at(1, T!['{'])) +} diff --git a/crates/biome_css_parser/src/syntax/scss/expression/list.rs b/crates/biome_css_parser/src/syntax/scss/expression/list.rs new file mode 100644 index 000000000000..bbb5c32e7b9d --- /dev/null +++ b/crates/biome_css_parser/src/syntax/scss/expression/list.rs @@ -0,0 +1,330 @@ +use crate::parser::CssParser; +use crate::syntax::parse_error::expected_component_value; +use crate::syntax::property::{is_at_generic_delimiter, parse_generic_component_value}; +use crate::syntax::scss::expression::precedence::parse_scss_binary_expression; +use crate::syntax::scss::{ + END_OF_SCSS_EXPRESSION_TOKEN_SET, expected_scss_expression, is_at_scss_identifier, + parse_scss_identifier, scss_ellipsis_not_allowed, +}; +use biome_css_syntax::CssSyntaxKind::{ + CSS_BOGUS_PROPERTY_VALUE, EOF, SCSS_ARBITRARY_ARGUMENT, SCSS_EXPRESSION, + SCSS_EXPRESSION_ITEM_LIST, SCSS_KEYWORD_ARGUMENT, SCSS_LIST_EXPRESSION, + SCSS_LIST_EXPRESSION_ELEMENT, SCSS_LIST_EXPRESSION_ELEMENT_LIST, +}; +use biome_css_syntax::{CssSyntaxKind, T}; +use biome_parser::parse_recovery::ParseRecoveryTokenSet; +use biome_parser::prelude::ParsedSyntax; +use biome_parser::prelude::ParsedSyntax::{Absent, Present}; +use biome_parser::{CompletedMarker, Parser, ParserProgress, TokenSet, token_set}; + +use super::{ScssExpressionOptions, is_at_scss_expression_end}; + +pub(super) const SCSS_LIST_EXPRESSION_ELEMENT_END_TOKEN_SET: TokenSet = + token_set![T![,], T![')']]; + +/// Parses a SCSS expression, deferring the list-vs-expression decision until a +/// comma is seen. +/// +/// Example: +/// ```scss +/// margin: 1px 2px, 3px 4px; +/// ``` +/// +/// Docs: https://sass-lang.com/documentation/values/lists +#[inline] +pub(crate) fn parse_scss_expression(p: &mut CssParser) -> ParsedSyntax { + parse_scss_expression_until(p, END_OF_SCSS_EXPRESSION_TOKEN_SET) +} + +/// Parses a SCSS expression list that may be empty in contexts like nested +/// properties. +/// +/// Example: +/// ```scss +/// font: { +/// size: 12px; +/// } +/// ``` +/// +/// Specification: https://sass-lang.com/documentation/style-rules/declarations#nested-properties +#[inline] +pub(crate) fn parse_scss_expression_allow_empty_value_until( + p: &mut CssParser, + end_ts: TokenSet, +) -> ParsedSyntax { + parse_scss_expression_with_options(p, ScssExpressionOptions::optional_value(end_ts)) +} + +/// Parses a SCSS expression until a caller-provided terminator, used by map +/// pairs and other contexts that embed expressions in larger constructs. +/// +/// Example: +/// ```scss +/// $map: (a: 1); +/// ``` +/// +/// Docs: https://sass-lang.com/documentation/values/maps +#[inline] +pub(crate) fn parse_scss_expression_until( + p: &mut CssParser, + end_ts: TokenSet, +) -> ParsedSyntax { + parse_scss_expression_with_options(p, ScssExpressionOptions::value(end_ts)) +} + +/// Parses arguments where `...` may terminate or expand the list and keyword +/// arguments are legal. +/// +/// Example: +/// ```scss +/// @include foo($args..., $kw: 1); +/// ``` +/// +/// Docs: https://sass-lang.com/documentation/at-rules/mixin +#[inline] +pub(crate) fn parse_scss_expression_in_args_until( + p: &mut CssParser, + end_ts: TokenSet, +) -> ParsedSyntax { + parse_scss_expression_with_options(p, ScssExpressionOptions::args(end_ts)) +} + +#[inline] +pub(super) fn parse_scss_inner_expression_until( + p: &mut CssParser, + end_ts: TokenSet, +) -> ParsedSyntax { + parse_scss_expression_with_options(p, ScssExpressionOptions::value(end_ts)) +} + +#[inline] +pub(super) fn complete_empty_scss_expression(p: &mut CssParser) -> CompletedMarker { + let expression = p.start(); + let expression_items = p.start(); + expression_items.complete(p, SCSS_EXPRESSION_ITEM_LIST); + expression.complete(p, SCSS_EXPRESSION) +} + +/// Shared entrypoint so map pairs, arglists, and declarations can reuse the +/// same list/spacing ambiguity logic without speculative parsing. +/// +/// Example: +/// ```scss +/// $map: (a: 1, b: 2); +/// ``` +/// +/// Docs: https://sass-lang.com/documentation/values/maps +#[inline] +fn parse_scss_expression_with_options( + p: &mut CssParser, + options: ScssExpressionOptions, +) -> ParsedSyntax { + if is_at_scss_expression_sequence_end(p, options) { + return if options.allows_empty_value { + Present(complete_empty_scss_expression(p)) + } else { + Absent + }; + } + + let Present(first_expression) = parse_scss_expression_sequence(p, options) else { + return Absent; + }; + + if !options.comma_separates_list() || !p.at(T![,]) { + return Present(first_expression); + } + + let first_element = complete_scss_list_expression_element(p, first_expression); + let list_expression = complete_scss_list_expression(p, first_element, options); + Present(complete_scss_expression_from_list(p, list_expression)) +} + +#[inline] +fn parse_scss_expression_sequence( + p: &mut CssParser, + options: ScssExpressionOptions, +) -> ParsedSyntax { + if is_at_scss_expression_sequence_end(p, options) { + return Absent; + } + + let expression = p.start(); + let expression_items = p.start(); + let mut progress = ParserProgress::default(); + + while !is_at_scss_expression_sequence_end(p, options) { + progress.assert_progressing(p); + + let parsed_item = parse_scss_expression_item(p, options); + if parsed_item + .or_recover_with_token_set( + p, + &ParseRecoveryTokenSet::new(CSS_BOGUS_PROPERTY_VALUE, options.recovery_end_ts()) + .enable_recovery_on_line_break(), + expected_scss_expression, + ) + .is_err() + { + break; + } + } + + expression_items.complete(p, SCSS_EXPRESSION_ITEM_LIST); + Present(expression.complete(p, SCSS_EXPRESSION)) +} + +#[inline] +fn is_at_scss_expression_sequence_end(p: &mut CssParser, options: ScssExpressionOptions) -> bool { + p.at(EOF) + || is_at_scss_expression_end(p, options) + || (options.comma_separates_list() && p.at(T![,])) +} + +#[inline] +fn parse_scss_expression_item(p: &mut CssParser, options: ScssExpressionOptions) -> ParsedSyntax { + if is_at_scss_keyword_argument(p, options) { + return parse_scss_keyword_argument(p, options); + } + + if is_at_generic_delimiter(p) { + return parse_generic_component_value(p); + } + + let expression = parse_scss_binary_expression(p, 0).or_else(|| { + if p.at(T![...]) { + report_and_bump_scss_ellipsis(p); + } + + Absent + }); + let expression = match expression { + Present(expression) => expression, + Absent => return Absent, + }; + + if !p.at(T![...]) { + return Present(expression); + } + + if !options.allows_ellipsis { + report_and_bump_scss_ellipsis(p); + return Present(expression); + } + + let m = expression.precede(p); + p.bump(T![...]); + Present(m.complete(p, SCSS_ARBITRARY_ARGUMENT)) +} + +#[inline] +fn report_and_bump_scss_ellipsis(p: &mut CssParser) { + let range = p.cur_range(); + p.error(scss_ellipsis_not_allowed(p, range)); + p.bump(T![...]); +} + +#[inline] +fn is_at_scss_keyword_argument(p: &mut CssParser, options: ScssExpressionOptions) -> bool { + options.allows_keyword_arguments + && !options.end_ts.contains(T![:]) + && is_at_scss_identifier(p) + && p.nth_at(2, T![:]) +} + +#[inline] +fn parse_scss_keyword_argument(p: &mut CssParser, options: ScssExpressionOptions) -> ParsedSyntax { + if !is_at_scss_keyword_argument(p, options) { + return Absent; + } + + let m = p.start(); + parse_scss_identifier(p).ok(); + p.expect(T![:]); + + parse_scss_expression_with_options( + p, + ScssExpressionOptions { + end_ts: options.end_ts, + allows_empty_value: false, + allows_keyword_arguments: false, + allows_ellipsis: false, + }, + ) + .or_add_diagnostic(p, expected_component_value); + + Present(m.complete(p, SCSS_KEYWORD_ARGUMENT)) +} + +#[inline] +pub(super) fn complete_scss_list_expression( + p: &mut CssParser, + first_element: CompletedMarker, + options: ScssExpressionOptions, +) -> CompletedMarker { + let list_elements = first_element.precede(p); + let mut progress = ParserProgress::default(); + + while p.at(T![,]) { + p.bump(T![,]); + + if p.at(T![,]) { + let empty_expression = complete_empty_scss_expression(p); + complete_scss_list_expression_element(p, empty_expression); + continue; + } + + if p.at(EOF) || is_at_scss_expression_end(p, options) { + break; + } + + progress.assert_progressing(p); + + if parse_scss_list_expression_element(p, options) + .or_recover_with_token_set( + p, + &ParseRecoveryTokenSet::new(CSS_BOGUS_PROPERTY_VALUE, options.recovery_end_ts()) + .enable_recovery_on_line_break(), + expected_scss_expression, + ) + .is_err() + { + break; + } + } + + list_elements + .complete(p, SCSS_LIST_EXPRESSION_ELEMENT_LIST) + .precede(p) + .complete(p, SCSS_LIST_EXPRESSION) +} + +#[inline] +fn complete_scss_expression_from_list( + p: &mut CssParser, + list_expression: CompletedMarker, +) -> CompletedMarker { + let expression_items = list_expression + .precede(p) + .complete(p, SCSS_EXPRESSION_ITEM_LIST); + expression_items.precede(p).complete(p, SCSS_EXPRESSION) +} + +#[inline] +fn parse_scss_list_expression_element( + p: &mut CssParser, + options: ScssExpressionOptions, +) -> ParsedSyntax { + parse_scss_expression_sequence(p, options) + .map(|expression| complete_scss_list_expression_element(p, expression)) +} + +#[inline] +pub(super) fn complete_scss_list_expression_element( + p: &mut CssParser, + expression: CompletedMarker, +) -> CompletedMarker { + expression + .precede(p) + .complete(p, SCSS_LIST_EXPRESSION_ELEMENT) +} diff --git a/crates/biome_css_parser/src/syntax/scss/expression/map.rs b/crates/biome_css_parser/src/syntax/scss/expression/map.rs new file mode 100644 index 000000000000..b4f2d459223b --- /dev/null +++ b/crates/biome_css_parser/src/syntax/scss/expression/map.rs @@ -0,0 +1,137 @@ +use crate::parser::CssParser; +use crate::syntax::scss::expected_scss_expression; +use biome_css_syntax::CssSyntaxKind::{ + CSS_BOGUS_PROPERTY_VALUE, SCSS_MAP_EXPRESSION, SCSS_MAP_EXPRESSION_PAIR, + SCSS_MAP_EXPRESSION_PAIR_LIST, SCSS_PARENTHESIZED_EXPRESSION, +}; +use biome_css_syntax::{CssSyntaxKind, T}; +use biome_parser::parse_recovery::ParseRecoveryTokenSet; +use biome_parser::prelude::ParsedSyntax; +use biome_parser::prelude::ParsedSyntax::{Absent, Present}; +use biome_parser::{CompletedMarker, Parser, ParserProgress, TokenSet, token_set}; + +use super::ScssExpressionOptions; +use super::list::{ + SCSS_LIST_EXPRESSION_ELEMENT_END_TOKEN_SET, complete_scss_list_expression, + complete_scss_list_expression_element, parse_scss_inner_expression_until, +}; + +const SCSS_MAP_EXPRESSION_KEY_END_TOKEN_SET: TokenSet = + token_set![T![,], T![:], T![')']]; +const SCSS_MAP_EXPRESSION_VALUE_END_TOKEN_SET: TokenSet = token_set![T![,], T![')']]; + +/// Parses a parenthesized SCSS expression and upgrades it to a map when a `:` +/// appears after the first item. +/// +/// Example: +/// ```scss +/// $map: (a: 1, b: 2); +/// ``` +/// +/// Docs: https://sass-lang.com/documentation/values/maps +#[inline] +pub(super) fn parse_scss_parenthesized_or_map_expression(p: &mut CssParser) -> ParsedSyntax { + if !p.at(T!['(']) { + return Absent; + } + + let m = p.start(); + p.bump(T!['(']); + + if p.at(T![')']) { + let empty_pairs = p.start(); + empty_pairs.complete(p, SCSS_MAP_EXPRESSION_PAIR_LIST); + p.bump(T![')']); + return Present(m.complete(p, SCSS_MAP_EXPRESSION)); + } + + let first_expression = + parse_scss_inner_expression_until(p, SCSS_MAP_EXPRESSION_KEY_END_TOKEN_SET) + .or_add_diagnostic(p, expected_scss_expression); + + let Some(first_expression) = first_expression else { + p.expect(T![')']); + return Present(m.complete(p, SCSS_PARENTHESIZED_EXPRESSION)); + }; + + if p.at(T![:]) { + let first_pair = parse_scss_map_expression_pair_with_key(p, first_expression); + complete_scss_map_expression_pair_list(p, first_pair); + p.expect(T![')']); + return Present(m.complete(p, SCSS_MAP_EXPRESSION)); + } + + if p.at(T![,]) { + let first_element = complete_scss_list_expression_element(p, first_expression); + complete_scss_list_expression( + p, + first_element, + ScssExpressionOptions::value(SCSS_LIST_EXPRESSION_ELEMENT_END_TOKEN_SET), + ); + p.expect(T![')']); + return Present(m.complete(p, SCSS_PARENTHESIZED_EXPRESSION)); + } + + p.expect(T![')']); + Present(m.complete(p, SCSS_PARENTHESIZED_EXPRESSION)) +} + +/// Parses a single `key: value` pair after the key has already been parsed as an +/// expression. +/// +/// Example: +/// ```scss +/// $colors: ("primary": #c00); +/// ``` +/// +/// Docs: https://sass-lang.com/documentation/values/maps +#[inline] +fn parse_scss_map_expression_pair_with_key( + p: &mut CssParser, + key: CompletedMarker, +) -> CompletedMarker { + let pair_marker = key.precede(p); + p.expect(T![:]); + parse_scss_inner_expression_until(p, SCSS_MAP_EXPRESSION_VALUE_END_TOKEN_SET) + .or_add_diagnostic(p, expected_scss_expression); + pair_marker.complete(p, SCSS_MAP_EXPRESSION_PAIR) +} + +#[inline] +fn complete_scss_map_expression_pair_list(p: &mut CssParser, first_pair: CompletedMarker) { + let pairs_marker = first_pair.precede(p); + let mut progress = ParserProgress::default(); + + while p.at(T![,]) { + p.bump(T![,]); + + if p.at(T![')']) { + break; + } + + progress.assert_progressing(p); + + let pair = match parse_scss_inner_expression_until(p, SCSS_MAP_EXPRESSION_KEY_END_TOKEN_SET) + { + Present(key) => Present(parse_scss_map_expression_pair_with_key(p, key)), + Absent => Absent, + }; + + if pair + .or_recover_with_token_set( + p, + &ParseRecoveryTokenSet::new( + CSS_BOGUS_PROPERTY_VALUE, + SCSS_MAP_EXPRESSION_VALUE_END_TOKEN_SET, + ) + .enable_recovery_on_line_break(), + expected_scss_expression, + ) + .is_err() + { + break; + } + } + + pairs_marker.complete(p, SCSS_MAP_EXPRESSION_PAIR_LIST); +} diff --git a/crates/biome_css_parser/src/syntax/scss/expression/mod.rs b/crates/biome_css_parser/src/syntax/scss/expression/mod.rs index 8861f3460b8e..c354ff88730d 100644 --- a/crates/biome_css_parser/src/syntax/scss/expression/mod.rs +++ b/crates/biome_css_parser/src/syntax/scss/expression/mod.rs @@ -1,460 +1,75 @@ -use crate::lexer::CssReLexContext; -use crate::parser::CssParser; -use crate::syntax::parse_error::{ - expected_component_value, expected_scss_expression, scss_ellipsis_not_allowed, -}; -use crate::syntax::property::{is_at_generic_delimiter, parse_generic_component_value}; -use crate::syntax::scss::{is_at_scss_identifier, parse_scss_identifier}; -use crate::syntax::value::dimension::is_at_any_dimension; -use biome_css_syntax::CssSyntaxKind::{ - CSS_BOGUS_PROPERTY_VALUE, CSS_NUMBER_LITERAL, EOF, SCSS_ARBITRARY_ARGUMENT, - SCSS_BINARY_EXPRESSION, SCSS_EXPRESSION, SCSS_EXPRESSION_ITEM_LIST, SCSS_KEYWORD_ARGUMENT, - SCSS_LIST_EXPRESSION, SCSS_LIST_EXPRESSION_ELEMENT, SCSS_LIST_EXPRESSION_ELEMENT_LIST, - SCSS_MAP_EXPRESSION, SCSS_MAP_EXPRESSION_PAIR, SCSS_MAP_EXPRESSION_PAIR_LIST, - SCSS_PARENTHESIZED_EXPRESSION, SCSS_UNARY_EXPRESSION, -}; -use biome_css_syntax::{CssSyntaxKind, T}; -use biome_parser::parse_recovery::ParseRecoveryTokenSet; -use biome_parser::prelude::ParsedSyntax; -use biome_parser::prelude::ParsedSyntax::{Absent, Present}; -use biome_parser::{CompletedMarker, Parser, ParserProgress, TokenSet, token_set}; +mod list; +mod map; +mod precedence; +mod primary; -const SCSS_BINARY_OPERATOR_TOKEN_SET: TokenSet = token_set![ - T![*], - T![/], - T![%], - T![+], - T![-], - T![>], - T![>=], - T![<], - T![<=], - T![==], - T![!=], - T![and], - T![or], -]; -pub(crate) const SCSS_UNARY_OPERATOR_TOKEN_SET: TokenSet = - token_set![T![+], T![-], T![not]]; +use biome_css_syntax::{CssSyntaxKind, T}; +use biome_parser::{Parser, TokenSet, token_set}; -const SCSS_MAP_EXPRESSION_KEY_END_TOKEN_SET: TokenSet = - token_set![T![,], T![:], T![')']]; -const SCSS_MAP_EXPRESSION_VALUE_END_TOKEN_SET: TokenSet = token_set![T![,], T![')']]; -const SCSS_LIST_EXPRESSION_ELEMENT_END_TOKEN_SET: TokenSet = - token_set![T![,], T![')']]; -pub(crate) const END_OF_SCSS_EXPRESSION_TOKEN_SET: TokenSet = - token_set![T![,], T![')'], T![;], T!['}']]; +pub(crate) use list::{ + parse_scss_expression, parse_scss_expression_allow_empty_value_until, + parse_scss_expression_in_args_until, parse_scss_expression_until, +}; +pub(crate) use precedence::SCSS_UNARY_OPERATOR_TOKEN_SET; +/// Carries the caller-specific rules for parsing ambiguous SCSS expressions. +/// +/// SCSS values reuse the same core parser in declaration, argument, and map +/// contexts, but each context differs on whether empty values, keyword +/// arguments, or `...` are legal. #[derive(Clone, Copy)] -struct ScssExpressionOptions { +pub(super) struct ScssExpressionOptions { end_ts: TokenSet, + allows_empty_value: bool, allows_keyword_arguments: bool, allows_ellipsis: bool, } impl ScssExpressionOptions { - fn value(end_ts: TokenSet) -> Self { + pub(super) fn value(end_ts: TokenSet) -> Self { Self { end_ts, + allows_empty_value: false, allows_keyword_arguments: false, allows_ellipsis: false, } } - fn args(end_ts: TokenSet) -> Self { + pub(super) fn optional_value(end_ts: TokenSet) -> Self { Self { end_ts, - allows_keyword_arguments: true, - allows_ellipsis: true, - } - } -} - -#[inline] -pub(crate) fn parse_scss_expression(p: &mut CssParser) -> ParsedSyntax { - parse_scss_expression_until(p, END_OF_SCSS_EXPRESSION_TOKEN_SET) -} - -#[inline] -pub(crate) fn parse_scss_expression_allow_empty_value_until( - p: &mut CssParser, - end_ts: TokenSet, -) -> ParsedSyntax { - if p.at_ts(end_ts) || p.at(EOF) { - return parse_empty_scss_expression(p); - } - - parse_scss_expression_until(p, end_ts) -} - -#[inline] -fn parse_empty_scss_expression(p: &mut CssParser) -> ParsedSyntax { - let expression = p.start(); - let expression_items = p.start(); - expression_items.complete(p, SCSS_EXPRESSION_ITEM_LIST); - Present(expression.complete(p, SCSS_EXPRESSION)) -} - -#[inline] -pub(crate) fn parse_scss_expression_until( - p: &mut CssParser, - end_ts: TokenSet, -) -> ParsedSyntax { - parse_scss_expression_with_options(p, ScssExpressionOptions::value(end_ts)) -} - -#[inline] -pub(crate) fn parse_scss_expression_in_args_until( - p: &mut CssParser, - end_ts: TokenSet, -) -> ParsedSyntax { - parse_scss_expression_with_options(p, ScssExpressionOptions::args(end_ts)) -} - -#[inline] -fn parse_scss_inner_expression_until( - p: &mut CssParser, - end_ts: TokenSet, -) -> ParsedSyntax { - parse_scss_expression_with_options(p, ScssExpressionOptions::value(end_ts)) -} - -#[inline] -fn parse_scss_expression_with_options( - p: &mut CssParser, - options: ScssExpressionOptions, -) -> ParsedSyntax { - if p.at_ts(options.end_ts) || p.at(EOF) { - return Absent; - } - - let expression = p.start(); - let expression_items = p.start(); - let mut progress = ParserProgress::default(); - - while !p.at(EOF) && !p.at_ts(options.end_ts) { - progress.assert_progressing(p); - - let parsed_item = parse_scss_expression_item(p, options); - if parsed_item - .or_recover_with_token_set( - p, - &ParseRecoveryTokenSet::new(CSS_BOGUS_PROPERTY_VALUE, options.end_ts) - .enable_recovery_on_line_break(), - expected_scss_expression, - ) - .is_err() - { - break; - } - } - - expression_items.complete(p, SCSS_EXPRESSION_ITEM_LIST); - Present(expression.complete(p, SCSS_EXPRESSION)) -} - -#[inline] -fn parse_scss_expression_item(p: &mut CssParser, options: ScssExpressionOptions) -> ParsedSyntax { - if is_at_scss_keyword_argument(p, options) { - return parse_scss_keyword_argument(p, options); - } - - if is_at_generic_delimiter(p) { - return parse_generic_component_value(p); - } - - let expression = parse_scss_binary_expression(p, 0).or_else(|| { - if p.at(T![...]) { - report_and_bump_scss_ellipsis(p); - } - - Absent - }); - let expression = match expression { - Present(expression) => expression, - Absent => return Absent, - }; - - if !p.at(T![...]) { - return Present(expression); - } - - if !options.allows_ellipsis { - report_and_bump_scss_ellipsis(p); - return Present(expression); - } - - let m = expression.precede(p); - p.bump(T![...]); - Present(m.complete(p, SCSS_ARBITRARY_ARGUMENT)) -} - -#[inline] -fn report_and_bump_scss_ellipsis(p: &mut CssParser) { - let range = p.cur_range(); - p.error(scss_ellipsis_not_allowed(p, range)); - p.bump(T![...]); -} - -#[inline] -fn is_at_scss_keyword_argument(p: &mut CssParser, options: ScssExpressionOptions) -> bool { - options.allows_keyword_arguments - && !options.end_ts.contains(T![:]) - && is_at_scss_identifier(p) - && p.nth_at(2, T![:]) -} - -#[inline] -fn parse_scss_keyword_argument(p: &mut CssParser, options: ScssExpressionOptions) -> ParsedSyntax { - if !is_at_scss_keyword_argument(p, options) { - return Absent; - } - - let m = p.start(); - parse_scss_identifier(p).ok(); - p.expect(T![:]); - - parse_scss_expression_with_options( - p, - ScssExpressionOptions { - end_ts: options.end_ts, + allows_empty_value: true, allows_keyword_arguments: false, allows_ellipsis: false, - }, - ) - .or_add_diagnostic(p, expected_component_value); - - Present(m.complete(p, SCSS_KEYWORD_ARGUMENT)) -} - -#[inline] -fn parse_scss_binary_expression(p: &mut CssParser, min_prec: u8) -> ParsedSyntax { - let mut left = match parse_scss_unary_expression(p) { - Present(left) => left, - Absent => return Absent, - }; - - loop { - let Some(prec) = scss_binary_precedence(p) else { - break; - }; - - if prec < min_prec { - break; } - - let m = left.precede(p); - p.bump_ts(SCSS_BINARY_OPERATOR_TOKEN_SET); - - parse_scss_binary_expression(p, prec + 1).or_add_diagnostic(p, expected_component_value); - - left = m.complete(p, SCSS_BINARY_EXPRESSION); } - Present(left) -} - -#[inline] -fn parse_scss_unary_expression(p: &mut CssParser) -> ParsedSyntax { - if is_at_scss_unary_operator(p) { - let m = p.start(); - p.bump_ts(SCSS_UNARY_OPERATOR_TOKEN_SET); - parse_scss_unary_expression(p).or_add_diagnostic(p, expected_component_value); - return Present(m.complete(p, SCSS_UNARY_EXPRESSION)); - } - - parse_scss_primary_expression(p) -} - -#[inline] -fn parse_scss_primary_expression(p: &mut CssParser) -> ParsedSyntax { - if p.at(T!['(']) { - parse_scss_parenthesized_or_map_expression(p) - } else { - parse_generic_component_value(p) - } -} - -/// Re-lexes signed numeric tokens in SCSS expression context. -/// -/// If the current token is `CSS_NUMBER_LITERAL` or any dimension starting with `+` or `-`, -/// this mutates parser state via `CssParser::re_lex(CssReLexContext::ScssExpression)`. -#[inline] -fn re_lex_signed_numeric_as_scss_operator(p: &mut CssParser) { - if !(p.at(CSS_NUMBER_LITERAL) || is_at_any_dimension(p)) { - return; - } - - let text = p.cur_text(); - if matches!(text.as_bytes().first(), Some(b'+' | b'-')) { - p.re_lex(CssReLexContext::ScssExpression); - } -} - -/// Returns the precedence level for the current SCSS binary operator token. -/// -/// Docs: https://sass-lang.com/documentation/operators/#order-of-operations -#[inline] -fn scss_binary_precedence(p: &mut CssParser) -> Option { - re_lex_signed_numeric_as_scss_operator(p); - - if !p.at_ts(SCSS_BINARY_OPERATOR_TOKEN_SET) { - return None; - } - - Some(match p.cur() { - T![or] => 1, - T![and] => 2, - T![==] | T![!=] => 3, - T![<] | T![<=] | T![>] | T![>=] => 4, - T![+] | T![-] => 5, - T![*] | T![/] | T![%] => 6, - _ => return None, - }) -} - -#[inline] -fn is_at_scss_unary_operator(p: &mut CssParser) -> bool { - p.at_ts(SCSS_UNARY_OPERATOR_TOKEN_SET) -} - -#[inline] -fn parse_scss_parenthesized_or_map_expression(p: &mut CssParser) -> ParsedSyntax { - if !p.at(T!['(']) { - return Absent; - } - - let m = p.start(); - p.bump(T!['(']); - - if p.at(T![')']) { - let empty_pairs = p.start(); - empty_pairs.complete(p, SCSS_MAP_EXPRESSION_PAIR_LIST); - p.bump(T![')']); - return Present(m.complete(p, SCSS_MAP_EXPRESSION)); - } - - let first_expression = - parse_scss_inner_expression_until(p, SCSS_MAP_EXPRESSION_KEY_END_TOKEN_SET) - .or_add_diagnostic(p, expected_scss_expression); - - let Some(first_expression) = first_expression else { - p.expect(T![')']); - return Present(m.complete(p, SCSS_PARENTHESIZED_EXPRESSION)); - }; - - if p.at(T![:]) { - let first_pair = parse_scss_map_expression_pair_with_key(p, first_expression); - complete_scss_map_expression_pair_list(p, first_pair); - p.expect(T![')']); - return Present(m.complete(p, SCSS_MAP_EXPRESSION)); - } - - if p.at(T![,]) { - let first_element = complete_scss_list_expression_element(p, first_expression); - complete_scss_list_expression(p, first_element); - p.expect(T![')']); - return Present(m.complete(p, SCSS_PARENTHESIZED_EXPRESSION)); - } - - p.expect(T![')']); - Present(m.complete(p, SCSS_PARENTHESIZED_EXPRESSION)) -} - -#[inline] -fn parse_scss_map_expression_pair_with_key( - p: &mut CssParser, - key: CompletedMarker, -) -> CompletedMarker { - let pair_marker = key.precede(p); - p.expect(T![:]); - parse_scss_inner_expression_until(p, SCSS_MAP_EXPRESSION_VALUE_END_TOKEN_SET) - .or_add_diagnostic(p, expected_scss_expression); - pair_marker.complete(p, SCSS_MAP_EXPRESSION_PAIR) -} - -#[inline] -fn complete_scss_map_expression_pair_list(p: &mut CssParser, first_pair: CompletedMarker) { - let pairs_marker = first_pair.precede(p); - let mut progress = ParserProgress::default(); - - while p.at(T![,]) { - p.bump(T![,]); - - if p.at(T![')']) { - break; - } - - progress.assert_progressing(p); - - let pair = match parse_scss_inner_expression_until(p, SCSS_MAP_EXPRESSION_KEY_END_TOKEN_SET) - { - Present(key) => Present(parse_scss_map_expression_pair_with_key(p, key)), - Absent => Absent, - }; - - if pair - .or_recover_with_token_set( - p, - &ParseRecoveryTokenSet::new( - CSS_BOGUS_PROPERTY_VALUE, - SCSS_MAP_EXPRESSION_VALUE_END_TOKEN_SET, - ) - .enable_recovery_on_line_break(), - expected_scss_expression, - ) - .is_err() - { - break; + pub(super) fn args(end_ts: TokenSet) -> Self { + Self { + end_ts, + allows_empty_value: false, + allows_keyword_arguments: true, + allows_ellipsis: true, } } - pairs_marker.complete(p, SCSS_MAP_EXPRESSION_PAIR_LIST); -} - -#[inline] -fn complete_scss_list_expression(p: &mut CssParser, first_element: CompletedMarker) { - let list_elements = first_element.precede(p); - let mut progress = ParserProgress::default(); - - while p.at(T![,]) { - p.bump(T![,]); - - if p.at(T![')']) { - break; - } - - progress.assert_progressing(p); + pub(super) fn comma_separates_list(self) -> bool { + !self.end_ts.contains(T![,]) + } - if parse_scss_inner_expression_until(p, SCSS_LIST_EXPRESSION_ELEMENT_END_TOKEN_SET) - .map(|expression| complete_scss_list_expression_element(p, expression)) - .or_recover_with_token_set( - p, - &ParseRecoveryTokenSet::new( - CSS_BOGUS_PROPERTY_VALUE, - SCSS_LIST_EXPRESSION_ELEMENT_END_TOKEN_SET, - ) - .enable_recovery_on_line_break(), - expected_scss_expression, - ) - .is_err() - { - break; + pub(super) fn recovery_end_ts(self) -> TokenSet { + if self.comma_separates_list() { + self.end_ts.union(token_set![T![,]]) + } else { + self.end_ts } } - - list_elements - .complete(p, SCSS_LIST_EXPRESSION_ELEMENT_LIST) - .precede(p) - .complete(p, SCSS_LIST_EXPRESSION); } #[inline] -fn complete_scss_list_expression_element( - p: &mut CssParser, - expression: CompletedMarker, -) -> CompletedMarker { - expression - .precede(p) - .complete(p, SCSS_LIST_EXPRESSION_ELEMENT) +pub(super) fn is_at_scss_expression_end( + p: &mut crate::parser::CssParser, + options: ScssExpressionOptions, +) -> bool { + p.at_ts(options.end_ts) || p.at(T![')']) } diff --git a/crates/biome_css_parser/src/syntax/scss/expression/precedence.rs b/crates/biome_css_parser/src/syntax/scss/expression/precedence.rs new file mode 100644 index 000000000000..115d67a4891f --- /dev/null +++ b/crates/biome_css_parser/src/syntax/scss/expression/precedence.rs @@ -0,0 +1,131 @@ +use crate::lexer::CssReLexContext; +use crate::parser::CssParser; +use crate::syntax::parse_error::expected_component_value; +use crate::syntax::value::dimension::is_at_any_dimension; +use biome_css_syntax::CssSyntaxKind::{ + CSS_NUMBER_LITERAL, SCSS_BINARY_EXPRESSION, SCSS_UNARY_EXPRESSION, +}; +use biome_css_syntax::{CssSyntaxKind, T}; +use biome_parser::prelude::ParsedSyntax; +use biome_parser::prelude::ParsedSyntax::{Absent, Present}; +use biome_parser::{Parser, TokenSet, token_set}; + +use super::primary::parse_scss_primary_expression; + +pub(super) const SCSS_BINARY_OPERATOR_TOKEN_SET: TokenSet = token_set![ + T![*], + T![/], + T![%], + T![+], + T![-], + T![>], + T![>=], + T![<], + T![<=], + T![==], + T![!=], + T![and], + T![or], +]; +pub(crate) const SCSS_UNARY_OPERATOR_TOKEN_SET: TokenSet = + token_set![T![+], T![-], T![not]]; + +/// Parses SCSS expressions with Sass operator precedence using precedence +/// climbing. +/// +/// Example: +/// ```scss +/// $x: 1 + 2 * 3; +/// ``` +/// +/// Docs: https://sass-lang.com/documentation/operators +#[inline] +pub(super) fn parse_scss_binary_expression(p: &mut CssParser, min_prec: u8) -> ParsedSyntax { + let mut left = match parse_scss_unary_expression(p) { + Present(left) => left, + Absent => return Absent, + }; + + loop { + let Some(prec) = scss_binary_precedence(p) else { + break; + }; + + if prec < min_prec { + break; + } + + let m = left.precede(p); + p.bump_ts(SCSS_BINARY_OPERATOR_TOKEN_SET); + + parse_scss_binary_expression(p, prec + 1).or_add_diagnostic(p, expected_component_value); + + left = m.complete(p, SCSS_BINARY_EXPRESSION); + } + + Present(left) +} + +/// Parses chained unary operators (`-`, `+`, `not`) before the primary +/// expression. +/// +/// Example: +/// ```scss +/// $x: not -$y; +/// ``` +/// +/// Docs: https://sass-lang.com/documentation/operators +#[inline] +fn parse_scss_unary_expression(p: &mut CssParser) -> ParsedSyntax { + if is_at_scss_unary_operator(p) { + let m = p.start(); + p.bump_ts(SCSS_UNARY_OPERATOR_TOKEN_SET); + parse_scss_unary_expression(p).or_add_diagnostic(p, expected_component_value); + return Present(m.complete(p, SCSS_UNARY_EXPRESSION)); + } + + parse_scss_primary_expression(p) +} + +/// Re-lexes signed numeric tokens in SCSS expression context. +/// +/// If the current token is `CSS_NUMBER_LITERAL` or any dimension starting with `+` or `-`, +/// this mutates parser state via `CssParser::re_lex(CssReLexContext::ScssExpression)`. +#[inline] +fn re_lex_signed_numeric_as_scss_operator(p: &mut CssParser) { + if !(p.at(CSS_NUMBER_LITERAL) || is_at_any_dimension(p)) { + return; + } + + let text = p.cur_text(); + if matches!(text.as_bytes().first(), Some(b'+' | b'-')) { + p.re_lex(CssReLexContext::ScssExpression); + } +} + +/// Returns the precedence level for the current SCSS binary operator token. +/// +/// Docs: https://sass-lang.com/documentation/operators/#order-of-operations +#[inline] +fn scss_binary_precedence(p: &mut CssParser) -> Option { + re_lex_signed_numeric_as_scss_operator(p); + + if !p.at_ts(SCSS_BINARY_OPERATOR_TOKEN_SET) { + return None; + } + + Some(match p.cur() { + T![or] => 1, + T![and] => 2, + T![==] | T![!=] => 3, + T![<] | T![<=] | T![>] | T![>=] => 4, + T![+] | T![-] => 5, + T![*] | T![/] | T![%] => 6, + _ => return None, + }) +} + +#[inline] +fn is_at_scss_unary_operator(p: &mut CssParser) -> bool { + p.at_ts(SCSS_UNARY_OPERATOR_TOKEN_SET) +} diff --git a/crates/biome_css_parser/src/syntax/scss/expression/primary.rs b/crates/biome_css_parser/src/syntax/scss/expression/primary.rs new file mode 100644 index 000000000000..a318357140bd --- /dev/null +++ b/crates/biome_css_parser/src/syntax/scss/expression/primary.rs @@ -0,0 +1,34 @@ +use crate::parser::CssParser; +use crate::syntax::declaration::{is_at_declaration_important, parse_declaration_important}; +use crate::syntax::property::parse_generic_component_value; +use crate::syntax::scss::parse_scss_fallback_value; +use biome_css_syntax::T; +use biome_parser::Parser; +use biome_parser::prelude::ParsedSyntax; + +use super::map::parse_scss_parenthesized_or_map_expression; + +/// Parses SCSS primaries such as parenthesized values, maps, `!important`, and +/// SCSS-only fallback values. +/// +/// Example: +/// ```scss +/// foo($x: 1, $y: 2); +/// ``` +/// +/// Docs: https://sass-lang.com/documentation/at-rules/function +#[inline] +pub(super) fn parse_scss_primary_expression(p: &mut CssParser) -> ParsedSyntax { + if p.at(T!['(']) { + parse_scss_parenthesized_or_map_expression(p) + } else if is_at_declaration_important(p) { + parse_declaration_important(p) + } else { + let value = parse_generic_component_value(p); + if value.is_absent() { + parse_scss_fallback_value(p) + } else { + value + } + } +} diff --git a/crates/biome_css_parser/src/syntax/scss/function_name.rs b/crates/biome_css_parser/src/syntax/scss/function_name.rs new file mode 100644 index 000000000000..e442f84b99bc --- /dev/null +++ b/crates/biome_css_parser/src/syntax/scss/function_name.rs @@ -0,0 +1,23 @@ +use crate::parser::CssParser; +use crate::syntax::parse_regular_identifier; +use biome_parser::prelude::ParsedSyntax; + +use super::{is_at_scss_qualified_name, parse_scss_qualified_name}; + +/// Parses a function name that may be module-qualified, preserving module +/// scoping. +/// +/// Example: +/// ```scss +/// color.adjust($c, $lightness: 10%); +/// ``` +/// +/// Docs: https://sass-lang.com/documentation/at-rules/use +#[inline] +pub(crate) fn parse_scss_function_name(p: &mut CssParser) -> ParsedSyntax { + if is_at_scss_qualified_name(p) { + parse_scss_qualified_name(p) + } else { + parse_regular_identifier(p) + } +} diff --git a/crates/biome_css_parser/src/syntax/scss/identifiers/identifier.rs b/crates/biome_css_parser/src/syntax/scss/identifiers/identifier.rs new file mode 100644 index 000000000000..632c80e6eb61 --- /dev/null +++ b/crates/biome_css_parser/src/syntax/scss/identifiers/identifier.rs @@ -0,0 +1,79 @@ +use crate::parser::CssParser; +use crate::syntax::{is_nth_at_identifier, parse_regular_identifier}; +use biome_css_syntax::CssSyntaxKind::{SCSS_IDENTIFIER, SCSS_NAMESPACED_IDENTIFIER}; +use biome_css_syntax::T; +use biome_parser::Parser; +use biome_parser::prelude::ParsedSyntax; +use biome_parser::prelude::ParsedSyntax::{Absent, Present}; + +/// Checks for a Sass variable identifier (`$name`) so it can be parsed as a +/// value. +/// +/// Example: +/// ```scss +/// $color: red; +/// ``` +/// +/// Docs: https://sass-lang.com/documentation/variables +#[inline] +pub(crate) fn is_at_scss_identifier(p: &mut CssParser) -> bool { + p.at(T![$]) && is_nth_at_identifier(p, 1) +} + +/// Detects module-qualified variables (`module.$name`) from the Sass module +/// system. +/// +/// Example: +/// ```scss +/// math.$pi +/// ``` +/// +/// Docs: https://sass-lang.com/documentation/modules +#[inline] +pub(crate) fn is_at_scss_namespaced_identifier(p: &mut CssParser) -> bool { + is_nth_at_identifier(p, 0) + && p.nth_at(1, T![.]) + && p.nth_at(2, T![$]) + && is_nth_at_identifier(p, 3) +} + +/// Parses `$name` as a single variable identifier token. +/// +/// Example: +/// ```scss +/// $spacing: 1rem; +/// ``` +/// +/// Docs: https://sass-lang.com/documentation/variables +#[inline] +pub(crate) fn parse_scss_identifier(p: &mut CssParser) -> ParsedSyntax { + if !is_at_scss_identifier(p) { + return Absent; + } + + let m = p.start(); + p.bump(T![$]); + parse_regular_identifier(p).ok(); + Present(m.complete(p, SCSS_IDENTIFIER)) +} + +/// Parses `module.$name` as a single AST node for module scoping. +/// +/// Example: +/// ```scss +/// color.$red +/// ``` +/// +/// Docs: https://sass-lang.com/documentation/modules +#[inline] +pub(crate) fn parse_scss_namespaced_identifier(p: &mut CssParser) -> ParsedSyntax { + if !is_at_scss_namespaced_identifier(p) { + return Absent; + } + + let m = p.start(); + parse_regular_identifier(p).ok(); + p.expect(T![.]); + parse_scss_identifier(p).ok(); + Present(m.complete(p, SCSS_NAMESPACED_IDENTIFIER)) +} diff --git a/crates/biome_css_parser/src/syntax/scss/identifiers/mod.rs b/crates/biome_css_parser/src/syntax/scss/identifiers/mod.rs new file mode 100644 index 000000000000..5fc924e9aa0d --- /dev/null +++ b/crates/biome_css_parser/src/syntax/scss/identifiers/mod.rs @@ -0,0 +1,10 @@ +mod identifier; +mod qualified_name; + +pub(crate) use identifier::{ + is_at_scss_identifier, is_at_scss_namespaced_identifier, parse_scss_identifier, + parse_scss_namespaced_identifier, +}; +pub(crate) use qualified_name::{ + is_at_scss_qualified_name, is_nth_at_scss_qualified_name, parse_scss_qualified_name, +}; diff --git a/crates/biome_css_parser/src/syntax/scss/identifiers/qualified_name.rs b/crates/biome_css_parser/src/syntax/scss/identifiers/qualified_name.rs new file mode 100644 index 000000000000..85a726b76334 --- /dev/null +++ b/crates/biome_css_parser/src/syntax/scss/identifiers/qualified_name.rs @@ -0,0 +1,67 @@ +use crate::parser::CssParser; +use crate::syntax::{is_nth_at_identifier, parse_regular_identifier}; +use biome_css_syntax::CssSyntaxKind::SCSS_QUALIFIED_NAME; +use biome_css_syntax::T; +use biome_parser::Parser; +use biome_parser::prelude::ParsedSyntax; +use biome_parser::prelude::ParsedSyntax::{Absent, Present}; + +use super::{is_at_scss_identifier, parse_scss_identifier}; + +/// Detects `module.member` or `module.$var` so module-qualified +/// values/functions are recognized before plain identifiers. +/// +/// Example: +/// ```scss +/// math.$pi +/// ``` +/// +/// Docs: https://sass-lang.com/documentation/modules +#[inline] +pub(crate) fn is_at_scss_qualified_name(p: &mut CssParser) -> bool { + is_nth_at_scss_qualified_name(p, 0) +} + +/// Detects a qualified name starting `n` tokens ahead. +/// +/// Example: +/// ```scss +/// math.pow(2, 3) +/// ``` +/// +/// Docs: https://sass-lang.com/documentation/modules +#[inline] +pub(crate) fn is_nth_at_scss_qualified_name(p: &mut CssParser, n: usize) -> bool { + is_nth_at_identifier(p, n) + && p.nth_at(n + 1, T![.]) + && ((p.nth_at(n + 2, T![$]) && is_nth_at_identifier(p, n + 3)) + || is_nth_at_identifier(p, n + 2)) +} + +/// Parses a module-qualified name, preserving whether the member is a `$var` or +/// a plain identifier for later resolution. +/// +/// Example: +/// ```scss +/// math.pow(2, 3) +/// ``` +/// +/// Docs: https://sass-lang.com/documentation/modules +#[inline] +pub(crate) fn parse_scss_qualified_name(p: &mut CssParser) -> ParsedSyntax { + if !is_at_scss_qualified_name(p) { + return Absent; + } + + let m = p.start(); + parse_regular_identifier(p).ok(); + p.expect(T![.]); + + if is_at_scss_identifier(p) { + parse_scss_identifier(p).ok(); + } else { + parse_regular_identifier(p).ok(); + } + + Present(m.complete(p, SCSS_QUALIFIED_NAME)) +} diff --git a/crates/biome_css_parser/src/syntax/scss/mod.rs b/crates/biome_css_parser/src/syntax/scss/mod.rs index 4d5604e97b23..c6143b78d5e6 100644 --- a/crates/biome_css_parser/src/syntax/scss/mod.rs +++ b/crates/biome_css_parser/src/syntax/scss/mod.rs @@ -1,16 +1,10 @@ mod declaration; mod expression; - -use crate::parser::CssParser; -use crate::syntax::{CssSyntaxFeatures, is_nth_at_identifier, parse_regular_identifier}; -use biome_css_syntax::CssSyntaxKind::{ - SCSS_IDENTIFIER, SCSS_PARENT_SELECTOR_VALUE, SCSS_QUALIFIED_NAME, -}; -use biome_css_syntax::T; -use biome_parser::Parser; -use biome_parser::SyntaxFeature; -use biome_parser::prelude::ParsedSyntax; -use biome_parser::prelude::ParsedSyntax::{Absent, Present}; +mod function_name; +mod identifiers; +mod parse_error; +mod token_sets; +mod value; pub(crate) use declaration::{ is_at_scss_declaration, is_at_scss_nesting_declaration, parse_scss_declaration, @@ -21,79 +15,19 @@ pub(crate) use expression::{ parse_scss_expression_allow_empty_value_until, parse_scss_expression_in_args_until, parse_scss_expression_until, }; - -#[inline] -pub(crate) fn is_at_scss_identifier(p: &mut CssParser) -> bool { - p.at(T![$]) && is_nth_at_identifier(p, 1) -} - -#[inline] -pub(crate) fn parse_scss_identifier(p: &mut CssParser) -> ParsedSyntax { - if !is_at_scss_identifier(p) { - return Absent; - } - - let m = p.start(); - p.bump(T![$]); - parse_regular_identifier(p).ok(); - Present(m.complete(p, SCSS_IDENTIFIER)) -} - -#[inline] -pub(crate) fn is_at_scss_qualified_name(p: &mut CssParser) -> bool { - is_nth_at_scss_qualified_name(p, 0) -} - -#[inline] -pub(crate) fn is_nth_at_scss_qualified_name(p: &mut CssParser, n: usize) -> bool { - is_nth_at_identifier(p, n) - && p.nth_at(n + 1, T![.]) - && ((p.nth_at(n + 2, T![$]) && is_nth_at_identifier(p, n + 3)) - || is_nth_at_identifier(p, n + 2)) -} - -#[inline] -pub(crate) fn parse_scss_qualified_name(p: &mut CssParser) -> ParsedSyntax { - if !is_at_scss_qualified_name(p) { - return Absent; - } - - let m = p.start(); - parse_regular_identifier(p).ok(); - p.expect(T![.]); - - if is_at_scss_identifier(p) { - parse_scss_identifier(p).ok(); - } else { - parse_regular_identifier(p).ok(); - } - - Present(m.complete(p, SCSS_QUALIFIED_NAME)) -} - -#[inline] -pub(crate) fn parse_scss_function_name(p: &mut CssParser) -> ParsedSyntax { - if is_at_scss_qualified_name(p) { - parse_scss_qualified_name(p) - } else { - parse_regular_identifier(p) - } -} - -#[inline] -pub(crate) fn is_at_scss_parent_selector_value(p: &mut CssParser) -> bool { - // `&` is a generic token in CSS parsing/recovery. Keep the SCSS gate here so - // plain CSS doesn't accidentally route through SCSS-only diagnostics. - CssSyntaxFeatures::Scss.is_supported(p) && p.at(T![&]) -} - -#[inline] -pub(crate) fn parse_scss_parent_selector_value(p: &mut CssParser) -> ParsedSyntax { - if !is_at_scss_parent_selector_value(p) { - return Absent; - } - - let m = p.start(); - p.bump(T![&]); - Present(m.complete(p, SCSS_PARENT_SELECTOR_VALUE)) -} +pub(crate) use function_name::parse_scss_function_name; +pub(crate) use identifiers::{ + is_at_scss_identifier, is_at_scss_namespaced_identifier, is_at_scss_qualified_name, + is_nth_at_scss_qualified_name, parse_scss_identifier, parse_scss_namespaced_identifier, + parse_scss_qualified_name, +}; +pub(crate) use parse_error::{ + expected_scss_expression, expected_scss_variable_modifier, scss_ellipsis_not_allowed, +}; +pub(crate) use token_sets::{ + END_OF_SCSS_EXPRESSION_TOKEN_SET, SCSS_IDENT_CONTINUATION_SET, SCSS_NESTING_VALUE_END_SET, + SCSS_STATEMENT_START_SET, SCSS_VARIABLE_MODIFIER_LIST_END_SET, +}; +pub(crate) use value::{ + is_at_scss_parent_selector_value, parse_scss_fallback_value, parse_scss_parent_selector_value, +}; diff --git a/crates/biome_css_parser/src/syntax/scss/parse_error.rs b/crates/biome_css_parser/src/syntax/scss/parse_error.rs new file mode 100644 index 000000000000..48a7b11f0416 --- /dev/null +++ b/crates/biome_css_parser/src/syntax/scss/parse_error.rs @@ -0,0 +1,64 @@ +use crate::parser::CssParser; +use biome_console::markup; +use biome_css_syntax::CssSyntaxKind::EOF; +use biome_parser::Parser; +use biome_parser::diagnostic::expected_node; +use biome_parser::prelude::ParseDiagnostic; +use biome_rowan::TextRange; + +/// Emits a diagnostic when a SCSS expression is required. +/// +/// Example: +/// ```scss +/// $x: 1 + ; +/// ``` +#[inline] +pub(crate) fn expected_scss_expression(p: &CssParser, range: TextRange) -> ParseDiagnostic { + expected_node("SCSS expression", range, p) +} + +/// Emits a diagnostic when `...` is used outside function call arguments. +/// +/// Example: +/// ```scss +/// $x: $args...; +/// ``` +#[inline] +pub(crate) fn scss_ellipsis_not_allowed(p: &CssParser, range: TextRange) -> ParseDiagnostic { + p.err_builder( + "SCSS arbitrary arguments (`...`) are only allowed in function call arguments.", + range, + ) + .with_hint(markup! { + "Use `...` only for function arguments, for example `fn($args...)`." + }) +} + +/// Emits a focused diagnostic when a SCSS variable modifier isn't `default` or +/// `global`. +/// +/// Example: +/// ```scss +/// $x: 1 !bad; +/// ``` +/// +/// Docs: https://sass-lang.com/documentation/variables +#[inline] +pub(crate) fn expected_scss_variable_modifier(p: &CssParser, range: TextRange) -> ParseDiagnostic { + if p.cur() == EOF { + p.err_builder( + "expected 'default', or 'global' but instead the file ends", + range, + ) + .with_detail(range, "the file ends here") + } else { + p.err_builder( + format!( + "expected 'default', or 'global' but instead found `{}`", + p.cur_text() + ), + range, + ) + .with_hint(format!("Remove {}", p.text(range))) + } +} diff --git a/crates/biome_css_parser/src/syntax/scss/token_sets.rs b/crates/biome_css_parser/src/syntax/scss/token_sets.rs new file mode 100644 index 000000000000..729d46ce1a00 --- /dev/null +++ b/crates/biome_css_parser/src/syntax/scss/token_sets.rs @@ -0,0 +1,40 @@ +use biome_css_syntax::CssSyntaxKind::*; +use biome_css_syntax::{CssSyntaxKind, T}; +use biome_parser::{TokenSet, token_set}; + +pub(crate) const END_OF_SCSS_EXPRESSION_TOKEN_SET: TokenSet = + token_set![T![')'], T![;], T!['}']]; +pub(crate) const SCSS_NESTING_VALUE_END_SET: TokenSet = + token_set![T!['{'], T![;], T!['}'], T![!], EOF]; +pub(crate) const SCSS_VARIABLE_MODIFIER_LIST_END_SET: TokenSet = + token_set![T![;], T!['}'], EOF]; + +pub(crate) const SCSS_STATEMENT_START_SET: TokenSet = token_set![ + T![@], + T![$], + T![&], + T![.], + T![#], + T![:], + T![::], + T!['['], + T![*], + T![|], + T![>], + T![+], + T![~], + T![||], +]; + +pub(crate) const SCSS_IDENT_CONTINUATION_SET: TokenSet = token_set![ + T![.], + T![#], + T![:], + T![::], + T!['['], + T![|], + T![>], + T![+], + T![~], + T![||], +]; diff --git a/crates/biome_css_parser/src/syntax/scss/value.rs b/crates/biome_css_parser/src/syntax/scss/value.rs new file mode 100644 index 000000000000..e406e5c86f02 --- /dev/null +++ b/crates/biome_css_parser/src/syntax/scss/value.rs @@ -0,0 +1,42 @@ +use crate::parser::CssParser; +use crate::syntax::CssSyntaxFeatures; +use biome_css_syntax::CssSyntaxKind::SCSS_PARENT_SELECTOR_VALUE; +use biome_css_syntax::T; +use biome_parser::Parser; +use biome_parser::SyntaxFeature; +use biome_parser::prelude::ParsedSyntax; +use biome_parser::prelude::ParsedSyntax::{Absent, Present}; + +/// Detects the SCSS parent selector value `&`. +#[inline] +pub(crate) fn is_at_scss_parent_selector_value(p: &mut CssParser) -> bool { + // `&` is a generic token in CSS parsing/recovery. Keep the SCSS gate here so + // plain CSS doesn't accidentally route through SCSS-only diagnostics. + CssSyntaxFeatures::Scss.is_supported(p) && p.at(T![&]) +} + +/// Parses the SCSS parent selector value `&`. +#[inline] +pub(crate) fn parse_scss_parent_selector_value(p: &mut CssParser) -> ParsedSyntax { + if !is_at_scss_parent_selector_value(p) { + return Absent; + } + + let m = p.start(); + p.bump(T![&]); + Present(m.complete(p, SCSS_PARENT_SELECTOR_VALUE)) +} + +/// Parses SCSS-only fallback values that are valid expression items but not +/// generic CSS values. +/// +/// Example: +/// ```scss +/// $sel: &:hover; +/// ``` +/// +/// Docs: https://sass-lang.com/documentation/style-rules/parent-selector +#[inline] +pub(crate) fn parse_scss_fallback_value(p: &mut CssParser) -> ParsedSyntax { + parse_scss_parent_selector_value(p) +} diff --git a/crates/biome_css_parser/src/syntax/value/function/call.rs b/crates/biome_css_parser/src/syntax/value/function/call.rs index 32afd766004a..aabfb4c4bca2 100644 --- a/crates/biome_css_parser/src/syntax/value/function/call.rs +++ b/crates/biome_css_parser/src/syntax/value/function/call.rs @@ -32,7 +32,7 @@ pub(crate) fn is_at_any_function_with_context( context: ValueParsingContext, ) -> bool { is_at_url_function(p) - || is_at_if_function(p) + || is_at_css_if_function_in_context(p, context) || is_at_attr_function(p) || is_at_vue_v_bind_function(p) || is_at_function_with_context(p, context) @@ -49,7 +49,7 @@ pub(crate) fn parse_any_function_with_context( if is_at_url_function(p) { parse_url_function_with_context(p, context) - } else if is_at_if_function(p) { + } else if is_at_css_if_function_in_context(p, context) { parse_if_function(p) } else if is_at_attr_function(p) { parse_attr_function(p) @@ -64,6 +64,28 @@ pub(crate) fn parse_any_function_with_context( } } +#[inline] +fn is_at_css_if_function_in_context(p: &mut CssParser, context: ValueParsingContext) -> bool { + if !is_at_if_function(p) { + return false; + } + + if !context.is_scss_parsing_allowed() { + return true; + } + + // CSS if() branches can only start with supported condition syntax: + // `style(...)`, `media(...)`, `supports(...)`, `not`, `else`, or a + // parenthesized boolean expression. Anything else remains a regular + // function call in SCSS-aware mode, such as Sass `if($cond, a, b)`. + p.nth_at(2, T![style]) + || p.nth_at(2, T![media]) + || p.nth_at(2, T![supports]) + || p.nth_at(2, T![not]) + || p.nth_at(2, T![else]) + || p.nth_at(2, T!['(']) +} + #[inline] pub(crate) fn is_at_function(p: &mut CssParser) -> bool { is_at_function_with_context(p, ValueParsingContext::new(p, ValueParsingMode::ScssAware)) @@ -101,7 +123,7 @@ fn is_nth_at_function_with_context( n: usize, context: ValueParsingContext, ) -> bool { - (is_nth_at_identifier(p, n) && p.nth_at(n + 1, T!['('])) + is_nth_at_identifier(p, n) && p.nth_at(n + 1, T!['(']) || (context.is_scss_syntax_allowed() && is_nth_at_scss_qualified_name(p, n) && p.nth_at(n + 3, T!['('])) diff --git a/crates/biome_css_parser/tests/css_test_suite/error/scss/declaration/duplicate-modifier-recovery.scss.snap b/crates/biome_css_parser/tests/css_test_suite/error/scss/declaration/duplicate-modifier-recovery.scss.snap index db59fa1ee1e3..19b6a3f6fae1 100644 --- a/crates/biome_css_parser/tests/css_test_suite/error/scss/declaration/duplicate-modifier-recovery.scss.snap +++ b/crates/biome_css_parser/tests/css_test_suite/error/scss/declaration/duplicate-modifier-recovery.scss.snap @@ -1,5 +1,6 @@ --- source: crates/biome_css_parser/tests/spec_test.rs +assertion_line: 208 expression: snapshot --- @@ -36,18 +37,24 @@ CssRoot { }, ], }, - ScssVariableModifierList [ - ScssVariableModifier { - excl_token: BANG@144..145 "!" [] [], - value: DEFAULT_KW@145..153 "default" [] [Whitespace(" ")], - }, - ], - ERROR_TOKEN@153..154 "?" [] [], - ERROR_TOKEN@154..155 "?" [] [], - ERROR_TOKEN@155..157 "?" [] [Whitespace(" ")], - ScssVariableModifier { - excl_token: BANG@157..158 "!" [] [], - value: DEFAULT_KW@158..165 "default" [] [], + CssBogus { + items: [ + ScssVariableModifier { + excl_token: BANG@144..145 "!" [] [], + value: DEFAULT_KW@145..153 "default" [] [Whitespace(" ")], + }, + CssBogus { + items: [ + ERROR_TOKEN@153..154 "?" [] [], + ERROR_TOKEN@154..155 "?" [] [], + ERROR_TOKEN@155..157 "?" [] [Whitespace(" ")], + ], + }, + ScssVariableModifier { + excl_token: BANG@157..158 "!" [] [], + value: DEFAULT_KW@158..165 "default" [] [], + }, + ], }, SEMICOLON@165..166 ";" [] [], ], @@ -68,18 +75,24 @@ CssRoot { }, ], }, - ScssVariableModifierList [ - ScssVariableModifier { - excl_token: BANG@187..188 "!" [] [], - value: GLOBAL_KW@188..195 "global" [] [Whitespace(" ")], - }, - ], - ERROR_TOKEN@195..196 "?" [] [], - ERROR_TOKEN@196..197 "?" [] [], - ERROR_TOKEN@197..199 "?" [] [Whitespace(" ")], - ScssVariableModifier { - excl_token: BANG@199..200 "!" [] [], - value: GLOBAL_KW@200..206 "global" [] [], + CssBogus { + items: [ + ScssVariableModifier { + excl_token: BANG@187..188 "!" [] [], + value: GLOBAL_KW@188..195 "global" [] [Whitespace(" ")], + }, + CssBogus { + items: [ + ERROR_TOKEN@195..196 "?" [] [], + ERROR_TOKEN@196..197 "?" [] [], + ERROR_TOKEN@197..199 "?" [] [Whitespace(" ")], + ], + }, + ScssVariableModifier { + excl_token: BANG@199..200 "!" [] [], + value: GLOBAL_KW@200..206 "global" [] [], + }, + ], }, SEMICOLON@206..207 ";" [] [], ], @@ -105,17 +118,18 @@ CssRoot { 0: SCSS_EXPRESSION_ITEM_LIST@142..144 0: CSS_NUMBER@142..144 0: CSS_NUMBER_LITERAL@142..144 "1" [] [Whitespace(" ")] - 3: SCSS_VARIABLE_MODIFIER_LIST@144..153 + 3: CSS_BOGUS@144..165 0: SCSS_VARIABLE_MODIFIER@144..153 0: BANG@144..145 "!" [] [] 1: DEFAULT_KW@145..153 "default" [] [Whitespace(" ")] - 4: ERROR_TOKEN@153..154 "?" [] [] - 5: ERROR_TOKEN@154..155 "?" [] [] - 6: ERROR_TOKEN@155..157 "?" [] [Whitespace(" ")] - 7: SCSS_VARIABLE_MODIFIER@157..165 - 0: BANG@157..158 "!" [] [] - 1: DEFAULT_KW@158..165 "default" [] [] - 8: SEMICOLON@165..166 ";" [] [] + 1: CSS_BOGUS@153..157 + 0: ERROR_TOKEN@153..154 "?" [] [] + 1: ERROR_TOKEN@154..155 "?" [] [] + 2: ERROR_TOKEN@155..157 "?" [] [Whitespace(" ")] + 2: SCSS_VARIABLE_MODIFIER@157..165 + 0: BANG@157..158 "!" [] [] + 1: DEFAULT_KW@158..165 "default" [] [] + 4: SEMICOLON@165..166 ";" [] [] 1: CSS_BOGUS@166..207 0: SCSS_IDENTIFIER@166..183 0: DOLLAR@166..168 "$" [Newline("\n")] [] @@ -126,17 +140,18 @@ CssRoot { 0: SCSS_EXPRESSION_ITEM_LIST@185..187 0: CSS_NUMBER@185..187 0: CSS_NUMBER_LITERAL@185..187 "1" [] [Whitespace(" ")] - 3: SCSS_VARIABLE_MODIFIER_LIST@187..195 + 3: CSS_BOGUS@187..206 0: SCSS_VARIABLE_MODIFIER@187..195 0: BANG@187..188 "!" [] [] 1: GLOBAL_KW@188..195 "global" [] [Whitespace(" ")] - 4: ERROR_TOKEN@195..196 "?" [] [] - 5: ERROR_TOKEN@196..197 "?" [] [] - 6: ERROR_TOKEN@197..199 "?" [] [Whitespace(" ")] - 7: SCSS_VARIABLE_MODIFIER@199..206 - 0: BANG@199..200 "!" [] [] - 1: GLOBAL_KW@200..206 "global" [] [] - 8: SEMICOLON@206..207 ";" [] [] + 1: CSS_BOGUS@195..199 + 0: ERROR_TOKEN@195..196 "?" [] [] + 1: ERROR_TOKEN@196..197 "?" [] [] + 2: ERROR_TOKEN@197..199 "?" [] [Whitespace(" ")] + 2: SCSS_VARIABLE_MODIFIER@199..206 + 0: BANG@199..200 "!" [] [] + 1: GLOBAL_KW@200..206 "global" [] [] + 4: SEMICOLON@206..207 ";" [] [] 2: EOF@207..208 "" [Newline("\n")] [] ``` diff --git a/crates/biome_css_parser/tests/css_test_suite/error/scss/declaration/invalid-modifier.scss b/crates/biome_css_parser/tests/css_test_suite/error/scss/declaration/invalid-modifier.scss index 4330a102c2bc..5118148f9da6 100644 --- a/crates/biome_css_parser/tests/css_test_suite/error/scss/declaration/invalid-modifier.scss +++ b/crates/biome_css_parser/tests/css_test_suite/error/scss/declaration/invalid-modifier.scss @@ -1,4 +1,4 @@ -// Invalid modifier - `!important` is not allowed on SCSS variable declarations +// Invalid modifier - `!important` falls back to the generic modifier error $color: red !important; // Invalid modifier - just a random word diff --git a/crates/biome_css_parser/tests/css_test_suite/error/scss/declaration/invalid-modifier.scss.snap b/crates/biome_css_parser/tests/css_test_suite/error/scss/declaration/invalid-modifier.scss.snap index b568ec4ce34d..a7f36ff7b525 100644 --- a/crates/biome_css_parser/tests/css_test_suite/error/scss/declaration/invalid-modifier.scss.snap +++ b/crates/biome_css_parser/tests/css_test_suite/error/scss/declaration/invalid-modifier.scss.snap @@ -6,7 +6,7 @@ expression: snapshot ## Input ```css -// Invalid modifier - `!important` is not allowed on SCSS variable declarations +// Invalid modifier - `!important` falls back to the generic modifier error $color: red !important; // Invalid modifier - just a random word @@ -33,16 +33,16 @@ CssRoot { CssBogus { items: [ ScssIdentifier { - dollar_token: DOLLAR@0..81 "$" [Comments("// Invalid modifier - ..."), Newline("\n")] [], + dollar_token: DOLLAR@0..77 "$" [Comments("// Invalid modifier - ..."), Newline("\n")] [], name: CssIdentifier { - value_token: IDENT@81..86 "color" [] [], + value_token: IDENT@77..82 "color" [] [], }, }, - COLON@86..88 ":" [] [Whitespace(" ")], + COLON@82..84 ":" [] [Whitespace(" ")], ScssExpression { items: ScssExpressionItemList [ CssIdentifier { - value_token: IDENT@88..92 "red" [] [Whitespace(" ")], + value_token: IDENT@84..88 "red" [] [Whitespace(" ")], }, ], }, @@ -50,29 +50,29 @@ CssRoot { items: [ CssBogus { items: [ - BANG@92..93 "!" [] [], - IMPORTANT_KW@93..102 "important" [] [], + BANG@88..89 "!" [] [], + IMPORTANT_KW@89..98 "important" [] [], ], }, ], }, - SEMICOLON@102..103 ";" [] [], + SEMICOLON@98..99 ";" [] [], ], }, CssBogus { items: [ ScssIdentifier { - dollar_token: DOLLAR@103..147 "$" [Newline("\n"), Newline("\n"), Comments("// Invalid modifier - ..."), Newline("\n")] [], + dollar_token: DOLLAR@99..143 "$" [Newline("\n"), Newline("\n"), Comments("// Invalid modifier - ..."), Newline("\n")] [], name: CssIdentifier { - value_token: IDENT@147..152 "width" [] [], + value_token: IDENT@143..148 "width" [] [], }, }, - COLON@152..154 ":" [] [Whitespace(" ")], + COLON@148..150 ":" [] [Whitespace(" ")], ScssExpression { items: ScssExpressionItemList [ CssRegularDimension { - value_token: CSS_NUMBER_LITERAL@154..157 "100" [] [], - unit_token: IDENT@157..160 "px" [] [Whitespace(" ")], + value_token: CSS_NUMBER_LITERAL@150..153 "100" [] [], + unit_token: IDENT@153..156 "px" [] [Whitespace(" ")], }, ], }, @@ -80,29 +80,29 @@ CssRoot { items: [ CssBogus { items: [ - BANG@160..161 "!" [] [], - IDENT@161..167 "random" [] [], + BANG@156..157 "!" [] [], + IDENT@157..163 "random" [] [], ], }, ], }, - SEMICOLON@167..168 ";" [] [], + SEMICOLON@163..164 ";" [] [], ], }, CssBogus { items: [ ScssIdentifier { - dollar_token: DOLLAR@168..209 "$" [Newline("\n"), Newline("\n"), Comments("// Invalid modifier - ..."), Newline("\n")] [], + dollar_token: DOLLAR@164..205 "$" [Newline("\n"), Newline("\n"), Comments("// Invalid modifier - ..."), Newline("\n")] [], name: CssIdentifier { - value_token: IDENT@209..215 "height" [] [], + value_token: IDENT@205..211 "height" [] [], }, }, - COLON@215..217 ":" [] [Whitespace(" ")], + COLON@211..213 ":" [] [Whitespace(" ")], ScssExpression { items: ScssExpressionItemList [ CssRegularDimension { - value_token: CSS_NUMBER_LITERAL@217..219 "50" [] [], - unit_token: IDENT@219..222 "vh" [] [Whitespace(" ")], + value_token: CSS_NUMBER_LITERAL@213..215 "50" [] [], + unit_token: IDENT@215..218 "vh" [] [Whitespace(" ")], }, ], }, @@ -110,29 +110,29 @@ CssRoot { items: [ CssBogus { items: [ - BANG@222..223 "!" [] [], - IDENT@223..229 "defalt" [] [], + BANG@218..219 "!" [] [], + IDENT@219..225 "defalt" [] [], ], }, ], }, - SEMICOLON@229..230 ";" [] [], + SEMICOLON@225..226 ";" [] [], ], }, CssBogus { items: [ ScssIdentifier { - dollar_token: DOLLAR@230..270 "$" [Newline("\n"), Newline("\n"), Comments("// Invalid modifier - ..."), Newline("\n")] [], + dollar_token: DOLLAR@226..266 "$" [Newline("\n"), Newline("\n"), Comments("// Invalid modifier - ..."), Newline("\n")] [], name: CssIdentifier { - value_token: IDENT@270..279 "font-size" [] [], + value_token: IDENT@266..275 "font-size" [] [], }, }, - COLON@279..281 ":" [] [Whitespace(" ")], + COLON@275..277 ":" [] [Whitespace(" ")], ScssExpression { items: ScssExpressionItemList [ CssRegularDimension { - value_token: CSS_NUMBER_LITERAL@281..283 "16" [] [], - unit_token: IDENT@283..286 "px" [] [Whitespace(" ")], + value_token: CSS_NUMBER_LITERAL@277..279 "16" [] [], + unit_token: IDENT@279..282 "px" [] [Whitespace(" ")], }, ], }, @@ -140,29 +140,29 @@ CssRoot { items: [ CssBogus { items: [ - BANG@286..287 "!" [] [], - IDENT@287..292 "globl" [] [], + BANG@282..283 "!" [] [], + IDENT@283..288 "globl" [] [], ], }, ], }, - SEMICOLON@292..293 ";" [] [], + SEMICOLON@288..289 ";" [] [], ], }, CssBogus { items: [ ScssIdentifier { - dollar_token: DOLLAR@293..326 "$" [Newline("\n"), Newline("\n"), Comments("// Multiple invalid m ..."), Newline("\n")] [], + dollar_token: DOLLAR@289..322 "$" [Newline("\n"), Newline("\n"), Comments("// Multiple invalid m ..."), Newline("\n")] [], name: CssIdentifier { - value_token: IDENT@326..332 "margin" [] [], + value_token: IDENT@322..328 "margin" [] [], }, }, - COLON@332..334 ":" [] [Whitespace(" ")], + COLON@328..330 ":" [] [Whitespace(" ")], ScssExpression { items: ScssExpressionItemList [ CssRegularDimension { - value_token: CSS_NUMBER_LITERAL@334..336 "10" [] [], - unit_token: IDENT@336..339 "px" [] [Whitespace(" ")], + value_token: CSS_NUMBER_LITERAL@330..332 "10" [] [], + unit_token: IDENT@332..335 "px" [] [Whitespace(" ")], }, ], }, @@ -170,189 +170,189 @@ CssRoot { items: [ CssBogus { items: [ - BANG@339..340 "!" [] [], - IDENT@340..346 "wrong" [] [Whitespace(" ")], + BANG@335..336 "!" [] [], + IDENT@336..342 "wrong" [] [Whitespace(" ")], ], }, CssBogus { items: [ - BANG@346..347 "!" [] [], - IDENT@347..354 "invalid" [] [], + BANG@342..343 "!" [] [], + IDENT@343..350 "invalid" [] [], ], }, ], }, - SEMICOLON@354..355 ";" [] [], + SEMICOLON@350..351 ";" [] [], ], }, ], - eof_token: EOF@355..356 "" [Newline("\n")] [], + eof_token: EOF@351..352 "" [Newline("\n")] [], } ``` ## CST ``` -0: CSS_ROOT@0..356 +0: CSS_ROOT@0..352 0: (empty) - 1: CSS_ROOT_ITEM_LIST@0..355 - 0: CSS_BOGUS@0..103 - 0: SCSS_IDENTIFIER@0..86 - 0: DOLLAR@0..81 "$" [Comments("// Invalid modifier - ..."), Newline("\n")] [] - 1: CSS_IDENTIFIER@81..86 - 0: IDENT@81..86 "color" [] [] - 1: COLON@86..88 ":" [] [Whitespace(" ")] - 2: SCSS_EXPRESSION@88..92 - 0: SCSS_EXPRESSION_ITEM_LIST@88..92 - 0: CSS_IDENTIFIER@88..92 - 0: IDENT@88..92 "red" [] [Whitespace(" ")] - 3: CSS_BOGUS@92..102 - 0: CSS_BOGUS@92..102 - 0: BANG@92..93 "!" [] [] - 1: IMPORTANT_KW@93..102 "important" [] [] - 4: SEMICOLON@102..103 ";" [] [] - 1: CSS_BOGUS@103..168 - 0: SCSS_IDENTIFIER@103..152 - 0: DOLLAR@103..147 "$" [Newline("\n"), Newline("\n"), Comments("// Invalid modifier - ..."), Newline("\n")] [] - 1: CSS_IDENTIFIER@147..152 - 0: IDENT@147..152 "width" [] [] - 1: COLON@152..154 ":" [] [Whitespace(" ")] - 2: SCSS_EXPRESSION@154..160 - 0: SCSS_EXPRESSION_ITEM_LIST@154..160 - 0: CSS_REGULAR_DIMENSION@154..160 - 0: CSS_NUMBER_LITERAL@154..157 "100" [] [] - 1: IDENT@157..160 "px" [] [Whitespace(" ")] - 3: CSS_BOGUS@160..167 - 0: CSS_BOGUS@160..167 - 0: BANG@160..161 "!" [] [] - 1: IDENT@161..167 "random" [] [] - 4: SEMICOLON@167..168 ";" [] [] - 2: CSS_BOGUS@168..230 - 0: SCSS_IDENTIFIER@168..215 - 0: DOLLAR@168..209 "$" [Newline("\n"), Newline("\n"), Comments("// Invalid modifier - ..."), Newline("\n")] [] - 1: CSS_IDENTIFIER@209..215 - 0: IDENT@209..215 "height" [] [] - 1: COLON@215..217 ":" [] [Whitespace(" ")] - 2: SCSS_EXPRESSION@217..222 - 0: SCSS_EXPRESSION_ITEM_LIST@217..222 - 0: CSS_REGULAR_DIMENSION@217..222 - 0: CSS_NUMBER_LITERAL@217..219 "50" [] [] - 1: IDENT@219..222 "vh" [] [Whitespace(" ")] - 3: CSS_BOGUS@222..229 - 0: CSS_BOGUS@222..229 - 0: BANG@222..223 "!" [] [] - 1: IDENT@223..229 "defalt" [] [] - 4: SEMICOLON@229..230 ";" [] [] - 3: CSS_BOGUS@230..293 - 0: SCSS_IDENTIFIER@230..279 - 0: DOLLAR@230..270 "$" [Newline("\n"), Newline("\n"), Comments("// Invalid modifier - ..."), Newline("\n")] [] - 1: CSS_IDENTIFIER@270..279 - 0: IDENT@270..279 "font-size" [] [] - 1: COLON@279..281 ":" [] [Whitespace(" ")] - 2: SCSS_EXPRESSION@281..286 - 0: SCSS_EXPRESSION_ITEM_LIST@281..286 - 0: CSS_REGULAR_DIMENSION@281..286 - 0: CSS_NUMBER_LITERAL@281..283 "16" [] [] - 1: IDENT@283..286 "px" [] [Whitespace(" ")] - 3: CSS_BOGUS@286..292 - 0: CSS_BOGUS@286..292 - 0: BANG@286..287 "!" [] [] - 1: IDENT@287..292 "globl" [] [] - 4: SEMICOLON@292..293 ";" [] [] - 4: CSS_BOGUS@293..355 - 0: SCSS_IDENTIFIER@293..332 - 0: DOLLAR@293..326 "$" [Newline("\n"), Newline("\n"), Comments("// Multiple invalid m ..."), Newline("\n")] [] - 1: CSS_IDENTIFIER@326..332 - 0: IDENT@326..332 "margin" [] [] - 1: COLON@332..334 ":" [] [Whitespace(" ")] - 2: SCSS_EXPRESSION@334..339 - 0: SCSS_EXPRESSION_ITEM_LIST@334..339 - 0: CSS_REGULAR_DIMENSION@334..339 - 0: CSS_NUMBER_LITERAL@334..336 "10" [] [] - 1: IDENT@336..339 "px" [] [Whitespace(" ")] - 3: CSS_BOGUS@339..354 - 0: CSS_BOGUS@339..346 - 0: BANG@339..340 "!" [] [] - 1: IDENT@340..346 "wrong" [] [Whitespace(" ")] - 1: CSS_BOGUS@346..354 - 0: BANG@346..347 "!" [] [] - 1: IDENT@347..354 "invalid" [] [] - 4: SEMICOLON@354..355 ";" [] [] - 2: EOF@355..356 "" [Newline("\n")] [] + 1: CSS_ROOT_ITEM_LIST@0..351 + 0: CSS_BOGUS@0..99 + 0: SCSS_IDENTIFIER@0..82 + 0: DOLLAR@0..77 "$" [Comments("// Invalid modifier - ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@77..82 + 0: IDENT@77..82 "color" [] [] + 1: COLON@82..84 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@84..88 + 0: SCSS_EXPRESSION_ITEM_LIST@84..88 + 0: CSS_IDENTIFIER@84..88 + 0: IDENT@84..88 "red" [] [Whitespace(" ")] + 3: CSS_BOGUS@88..98 + 0: CSS_BOGUS@88..98 + 0: BANG@88..89 "!" [] [] + 1: IMPORTANT_KW@89..98 "important" [] [] + 4: SEMICOLON@98..99 ";" [] [] + 1: CSS_BOGUS@99..164 + 0: SCSS_IDENTIFIER@99..148 + 0: DOLLAR@99..143 "$" [Newline("\n"), Newline("\n"), Comments("// Invalid modifier - ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@143..148 + 0: IDENT@143..148 "width" [] [] + 1: COLON@148..150 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@150..156 + 0: SCSS_EXPRESSION_ITEM_LIST@150..156 + 0: CSS_REGULAR_DIMENSION@150..156 + 0: CSS_NUMBER_LITERAL@150..153 "100" [] [] + 1: IDENT@153..156 "px" [] [Whitespace(" ")] + 3: CSS_BOGUS@156..163 + 0: CSS_BOGUS@156..163 + 0: BANG@156..157 "!" [] [] + 1: IDENT@157..163 "random" [] [] + 4: SEMICOLON@163..164 ";" [] [] + 2: CSS_BOGUS@164..226 + 0: SCSS_IDENTIFIER@164..211 + 0: DOLLAR@164..205 "$" [Newline("\n"), Newline("\n"), Comments("// Invalid modifier - ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@205..211 + 0: IDENT@205..211 "height" [] [] + 1: COLON@211..213 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@213..218 + 0: SCSS_EXPRESSION_ITEM_LIST@213..218 + 0: CSS_REGULAR_DIMENSION@213..218 + 0: CSS_NUMBER_LITERAL@213..215 "50" [] [] + 1: IDENT@215..218 "vh" [] [Whitespace(" ")] + 3: CSS_BOGUS@218..225 + 0: CSS_BOGUS@218..225 + 0: BANG@218..219 "!" [] [] + 1: IDENT@219..225 "defalt" [] [] + 4: SEMICOLON@225..226 ";" [] [] + 3: CSS_BOGUS@226..289 + 0: SCSS_IDENTIFIER@226..275 + 0: DOLLAR@226..266 "$" [Newline("\n"), Newline("\n"), Comments("// Invalid modifier - ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@266..275 + 0: IDENT@266..275 "font-size" [] [] + 1: COLON@275..277 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@277..282 + 0: SCSS_EXPRESSION_ITEM_LIST@277..282 + 0: CSS_REGULAR_DIMENSION@277..282 + 0: CSS_NUMBER_LITERAL@277..279 "16" [] [] + 1: IDENT@279..282 "px" [] [Whitespace(" ")] + 3: CSS_BOGUS@282..288 + 0: CSS_BOGUS@282..288 + 0: BANG@282..283 "!" [] [] + 1: IDENT@283..288 "globl" [] [] + 4: SEMICOLON@288..289 ";" [] [] + 4: CSS_BOGUS@289..351 + 0: SCSS_IDENTIFIER@289..328 + 0: DOLLAR@289..322 "$" [Newline("\n"), Newline("\n"), Comments("// Multiple invalid m ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@322..328 + 0: IDENT@322..328 "margin" [] [] + 1: COLON@328..330 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@330..335 + 0: SCSS_EXPRESSION_ITEM_LIST@330..335 + 0: CSS_REGULAR_DIMENSION@330..335 + 0: CSS_NUMBER_LITERAL@330..332 "10" [] [] + 1: IDENT@332..335 "px" [] [Whitespace(" ")] + 3: CSS_BOGUS@335..350 + 0: CSS_BOGUS@335..342 + 0: BANG@335..336 "!" [] [] + 1: IDENT@336..342 "wrong" [] [Whitespace(" ")] + 1: CSS_BOGUS@342..350 + 0: BANG@342..343 "!" [] [] + 1: IDENT@343..350 "invalid" [] [] + 4: SEMICOLON@350..351 ";" [] [] + 2: EOF@351..352 "" [Newline("\n")] [] ``` ## Diagnostics ``` -invalid-modifier.scss:2:14 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +invalid-modifier.scss:2:13 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - × `!important` is not valid here. + × expected 'default', or 'global' but instead found `important` - 1 │ // Invalid modifier - `!important` is not allowed on SCSS variable declarations + 1 │ // Invalid modifier - `!important` falls back to the generic modifier error > 2 │ $color: red !important; - │ ^^^^^^^^^ + │ ^^^^^^^^^^ 3 │ 4 │ // Invalid modifier - just a random word - i SCSS variable declarations only support the `!default` and `!global` modifiers. + i Remove !important -invalid-modifier.scss:5:16 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +invalid-modifier.scss:5:15 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ × expected 'default', or 'global' but instead found `random` 4 │ // Invalid modifier - just a random word > 5 │ $width: 100px !random; - │ ^^^^^^ + │ ^^^^^^^ 6 │ 7 │ // Invalid modifier - typo in default - i Remove random + i Remove !random -invalid-modifier.scss:8:16 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +invalid-modifier.scss:8:15 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ × expected 'default', or 'global' but instead found `defalt` 7 │ // Invalid modifier - typo in default > 8 │ $height: 50vh !defalt; - │ ^^^^^^ + │ ^^^^^^^ 9 │ 10 │ // Invalid modifier - typo in global - i Remove defalt + i Remove !defalt -invalid-modifier.scss:11:19 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +invalid-modifier.scss:11:18 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ × expected 'default', or 'global' but instead found `globl` 10 │ // Invalid modifier - typo in global > 11 │ $font-size: 16px !globl; - │ ^^^^^ + │ ^^^^^^ 12 │ 13 │ // Multiple invalid modifiers - i Remove globl + i Remove !globl -invalid-modifier.scss:14:16 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +invalid-modifier.scss:14:15 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ × expected 'default', or 'global' but instead found `wrong` 13 │ // Multiple invalid modifiers > 14 │ $margin: 10px !wrong !invalid; - │ ^^^^^ + │ ^^^^^^ 15 │ - i Remove wrong + i Remove !wrong -invalid-modifier.scss:14:23 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +invalid-modifier.scss:14:22 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ × expected 'default', or 'global' but instead found `invalid` 13 │ // Multiple invalid modifiers > 14 │ $margin: 10px !wrong !invalid; - │ ^^^^^^^ + │ ^^^^^^^^ 15 │ - i Remove invalid + i Remove !invalid ``` diff --git a/crates/biome_css_parser/tests/css_test_suite/error/scss/declaration/missing-modifier.scss.snap b/crates/biome_css_parser/tests/css_test_suite/error/scss/declaration/missing-modifier.scss.snap index 97aab5fe59b2..dadf680fca90 100644 --- a/crates/biome_css_parser/tests/css_test_suite/error/scss/declaration/missing-modifier.scss.snap +++ b/crates/biome_css_parser/tests/css_test_suite/error/scss/declaration/missing-modifier.scss.snap @@ -160,43 +160,45 @@ CssRoot { ## Diagnostics ``` -missing-modifier.scss:2:14 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +missing-modifier.scss:2:13 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ × expected 'default', or 'global' but instead found `;` 1 │ // Exclamation mark but no modifier > 2 │ $color: red !; - │ ^ + │ ^^ 3 │ 4 │ // Exclamation mark with space but no modifier - i Remove ; + i Remove !; -missing-modifier.scss:5:17 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +missing-modifier.scss:5:15 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ × expected 'default', or 'global' but instead found `;` 4 │ // Exclamation mark with space but no modifier > 5 │ $width: 100px ! ; - │ ^ + │ ^^^ 6 │ 7 │ // Exclamation mark at the end - i Remove ; + i Remove ! ; -missing-modifier.scss:9:1 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +missing-modifier.scss:8:15 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ × expected 'default', or 'global' but instead the file ends 7 │ // Exclamation mark at the end - 8 │ $height: 50vh ! + > 8 │ $height: 50vh ! + │ ^ > 9 │ │ i the file ends here 7 │ // Exclamation mark at the end - 8 │ $height: 50vh ! + > 8 │ $height: 50vh ! + │ ^ > 9 │ │ diff --git a/crates/biome_css_parser/tests/css_test_suite/error/scss/declaration/modifier-recovery.scss b/crates/biome_css_parser/tests/css_test_suite/error/scss/declaration/modifier-recovery.scss index 844129d6d596..e9f79d4a160f 100644 --- a/crates/biome_css_parser/tests/css_test_suite/error/scss/declaration/modifier-recovery.scss +++ b/crates/biome_css_parser/tests/css_test_suite/error/scss/declaration/modifier-recovery.scss @@ -4,5 +4,5 @@ $color: red foo !global; // Unexpected token between modifiers should not stop parsing later modifiers $gap: 1 !default bar !global; -// !important should report an invalid modifier diagnostic and allow later modifiers +// !important should report the generic invalid modifier diagnostic and allow later modifiers $size: 2 !important !global; diff --git a/crates/biome_css_parser/tests/css_test_suite/error/scss/declaration/modifier-recovery.scss.snap b/crates/biome_css_parser/tests/css_test_suite/error/scss/declaration/modifier-recovery.scss.snap index 174194b3c199..9c4c7532df71 100644 --- a/crates/biome_css_parser/tests/css_test_suite/error/scss/declaration/modifier-recovery.scss.snap +++ b/crates/biome_css_parser/tests/css_test_suite/error/scss/declaration/modifier-recovery.scss.snap @@ -1,5 +1,6 @@ --- source: crates/biome_css_parser/tests/spec_test.rs +assertion_line: 208 expression: snapshot --- @@ -12,7 +13,7 @@ $color: red foo !global; // Unexpected token between modifiers should not stop parsing later modifiers $gap: 1 !default bar !global; -// !important should report an invalid modifier diagnostic and allow later modifiers +// !important should report the generic invalid modifier diagnostic and allow later modifiers $size: 2 !important !global; ``` @@ -66,16 +67,22 @@ CssRoot { }, ], }, - ScssVariableModifierList [ - ScssVariableModifier { - excl_token: BANG@189..190 "!" [] [], - value: DEFAULT_KW@190..198 "default" [] [Whitespace(" ")], - }, - ], - IDENT@198..202 "bar" [] [Whitespace(" ")], - ScssVariableModifier { - excl_token: BANG@202..203 "!" [] [], - value: GLOBAL_KW@203..209 "global" [] [], + CssBogus { + items: [ + ScssVariableModifier { + excl_token: BANG@189..190 "!" [] [], + value: DEFAULT_KW@190..198 "default" [] [Whitespace(" ")], + }, + CssBogus { + items: [ + IDENT@198..202 "bar" [] [Whitespace(" ")], + ], + }, + ScssVariableModifier { + excl_token: BANG@202..203 "!" [] [], + value: GLOBAL_KW@203..209 "global" [] [], + }, + ], }, SEMICOLON@209..210 ";" [] [], ], @@ -83,16 +90,16 @@ CssRoot { CssBogus { items: [ ScssIdentifier { - dollar_token: DOLLAR@210..298 "$" [Newline("\n"), Newline("\n"), Comments("// !important should ..."), Newline("\n")] [], + dollar_token: DOLLAR@210..307 "$" [Newline("\n"), Newline("\n"), Comments("// !important should ..."), Newline("\n")] [], name: CssIdentifier { - value_token: IDENT@298..302 "size" [] [], + value_token: IDENT@307..311 "size" [] [], }, }, - COLON@302..304 ":" [] [Whitespace(" ")], + COLON@311..313 ":" [] [Whitespace(" ")], ScssExpression { items: ScssExpressionItemList [ CssNumber { - value_token: CSS_NUMBER_LITERAL@304..306 "2" [] [Whitespace(" ")], + value_token: CSS_NUMBER_LITERAL@313..315 "2" [] [Whitespace(" ")], }, ], }, @@ -100,30 +107,30 @@ CssRoot { items: [ CssBogus { items: [ - BANG@306..307 "!" [] [], - IMPORTANT_KW@307..317 "important" [] [Whitespace(" ")], + BANG@315..316 "!" [] [], + IMPORTANT_KW@316..326 "important" [] [Whitespace(" ")], ], }, ScssVariableModifier { - excl_token: BANG@317..318 "!" [] [], - value: GLOBAL_KW@318..324 "global" [] [], + excl_token: BANG@326..327 "!" [] [], + value: GLOBAL_KW@327..333 "global" [] [], }, ], }, - SEMICOLON@324..325 ";" [] [], + SEMICOLON@333..334 ";" [] [], ], }, ], - eof_token: EOF@325..326 "" [Newline("\n")] [], + eof_token: EOF@334..335 "" [Newline("\n")] [], } ``` ## CST ``` -0: CSS_ROOT@0..326 +0: CSS_ROOT@0..335 0: (empty) - 1: CSS_ROOT_ITEM_LIST@0..325 + 1: CSS_ROOT_ITEM_LIST@0..334 0: SCSS_DECLARATION@0..101 0: SCSS_IDENTIFIER@0..83 0: DOLLAR@0..78 "$" [Comments("// Unexpected token b ..."), Newline("\n")] [] @@ -151,34 +158,35 @@ CssRoot { 0: SCSS_EXPRESSION_ITEM_LIST@187..189 0: CSS_NUMBER@187..189 0: CSS_NUMBER_LITERAL@187..189 "1" [] [Whitespace(" ")] - 3: SCSS_VARIABLE_MODIFIER_LIST@189..198 + 3: CSS_BOGUS@189..209 0: SCSS_VARIABLE_MODIFIER@189..198 0: BANG@189..190 "!" [] [] 1: DEFAULT_KW@190..198 "default" [] [Whitespace(" ")] - 4: IDENT@198..202 "bar" [] [Whitespace(" ")] - 5: SCSS_VARIABLE_MODIFIER@202..209 - 0: BANG@202..203 "!" [] [] - 1: GLOBAL_KW@203..209 "global" [] [] - 6: SEMICOLON@209..210 ";" [] [] - 2: CSS_BOGUS@210..325 - 0: SCSS_IDENTIFIER@210..302 - 0: DOLLAR@210..298 "$" [Newline("\n"), Newline("\n"), Comments("// !important should ..."), Newline("\n")] [] - 1: CSS_IDENTIFIER@298..302 - 0: IDENT@298..302 "size" [] [] - 1: COLON@302..304 ":" [] [Whitespace(" ")] - 2: SCSS_EXPRESSION@304..306 - 0: SCSS_EXPRESSION_ITEM_LIST@304..306 - 0: CSS_NUMBER@304..306 - 0: CSS_NUMBER_LITERAL@304..306 "2" [] [Whitespace(" ")] - 3: CSS_BOGUS@306..324 - 0: CSS_BOGUS@306..317 - 0: BANG@306..307 "!" [] [] - 1: IMPORTANT_KW@307..317 "important" [] [Whitespace(" ")] - 1: SCSS_VARIABLE_MODIFIER@317..324 - 0: BANG@317..318 "!" [] [] - 1: GLOBAL_KW@318..324 "global" [] [] - 4: SEMICOLON@324..325 ";" [] [] - 2: EOF@325..326 "" [Newline("\n")] [] + 1: CSS_BOGUS@198..202 + 0: IDENT@198..202 "bar" [] [Whitespace(" ")] + 2: SCSS_VARIABLE_MODIFIER@202..209 + 0: BANG@202..203 "!" [] [] + 1: GLOBAL_KW@203..209 "global" [] [] + 4: SEMICOLON@209..210 ";" [] [] + 2: CSS_BOGUS@210..334 + 0: SCSS_IDENTIFIER@210..311 + 0: DOLLAR@210..307 "$" [Newline("\n"), Newline("\n"), Comments("// !important should ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@307..311 + 0: IDENT@307..311 "size" [] [] + 1: COLON@311..313 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@313..315 + 0: SCSS_EXPRESSION_ITEM_LIST@313..315 + 0: CSS_NUMBER@313..315 + 0: CSS_NUMBER_LITERAL@313..315 "2" [] [Whitespace(" ")] + 3: CSS_BOGUS@315..333 + 0: CSS_BOGUS@315..326 + 0: BANG@315..316 "!" [] [] + 1: IMPORTANT_KW@316..326 "important" [] [Whitespace(" ")] + 1: SCSS_VARIABLE_MODIFIER@326..333 + 0: BANG@326..327 "!" [] [] + 1: GLOBAL_KW@327..333 "global" [] [] + 4: SEMICOLON@333..334 ";" [] [] + 2: EOF@334..335 "" [Newline("\n")] [] ``` @@ -193,19 +201,19 @@ modifier-recovery.scss:5:18 parse ━━━━━━━━━━━━━━━ > 5 │ $gap: 1 !default bar !global; │ ^^^ 6 │ - 7 │ // !important should report an invalid modifier diagnostic and allow later modifiers + 7 │ // !important should report the generic invalid modifier diagnostic and allow later modifiers i Expected a variable modifier or the end of the declaration. -modifier-recovery.scss:8:11 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +modifier-recovery.scss:8:10 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - × `!important` is not valid here. + × expected 'default', or 'global' but instead found `important` - 7 │ // !important should report an invalid modifier diagnostic and allow later modifiers + 7 │ // !important should report the generic invalid modifier diagnostic and allow later modifiers > 8 │ $size: 2 !important !global; - │ ^^^^^^^^^ + │ ^^^^^^^^^^ 9 │ - i SCSS variable declarations only support the `!default` and `!global` modifiers. + i Remove !important ``` diff --git a/crates/biome_css_parser/tests/css_test_suite/error/scss/expression/list-map-paren.scss b/crates/biome_css_parser/tests/css_test_suite/error/scss/expression/list-map-paren.scss index 7a32711fae45..5e850f872a50 100644 --- a/crates/biome_css_parser/tests/css_test_suite/error/scss/expression/list-map-paren.scss +++ b/crates/biome_css_parser/tests/css_test_suite/error/scss/expression/list-map-paren.scss @@ -2,5 +2,4 @@ missing-close: fn((1, 2); missing-map-value: fn((primary:, secondary: blue)); missing-map-key: fn((primary: red, : blue)); - double-comma: fn((1,, 2)); } diff --git a/crates/biome_css_parser/tests/css_test_suite/error/scss/expression/list-map-paren.scss.snap b/crates/biome_css_parser/tests/css_test_suite/error/scss/expression/list-map-paren.scss.snap index ed5e757ec832..c9802ef2a68f 100644 --- a/crates/biome_css_parser/tests/css_test_suite/error/scss/expression/list-map-paren.scss.snap +++ b/crates/biome_css_parser/tests/css_test_suite/error/scss/expression/list-map-paren.scss.snap @@ -1,5 +1,6 @@ --- source: crates/biome_css_parser/tests/spec_test.rs +assertion_line: 208 expression: snapshot --- @@ -10,7 +11,6 @@ expression: snapshot missing-close: fn((1, 2); missing-map-value: fn((primary:, secondary: blue)); missing-map-key: fn((primary: red, : blue)); - double-comma: fn((1,, 2)); } ``` @@ -237,88 +237,22 @@ CssRoot { }, semicolon_token: SEMICOLON@135..136 ";" [] [], }, - CssDeclarationWithSemicolon { - declaration: CssDeclaration { - property: CssBogusProperty { - items: [ - CssIdentifier { - value_token: IDENT@136..151 "double-comma" [Newline("\n"), Whitespace(" ")] [], - }, - COLON@151..153 ":" [] [Whitespace(" ")], - CssBogus { - items: [ - CssBogus { - items: [ - CssFunction { - name: CssIdentifier { - value_token: IDENT@153..155 "fn" [] [], - }, - l_paren_token: L_PAREN@155..156 "(" [] [], - items: CssParameterList [ - ScssExpression { - items: ScssExpressionItemList [ - ScssParenthesizedExpression { - l_paren_token: L_PAREN@156..157 "(" [] [], - expression: ScssListExpression { - elements: ScssListExpressionElementList [ - ScssListExpressionElement { - value: ScssExpression { - items: ScssExpressionItemList [ - CssNumber { - value_token: CSS_NUMBER_LITERAL@157..158 "1" [] [], - }, - ], - }, - }, - COMMA@158..159 "," [] [], - ], - }, - r_paren_token: missing (required), - }, - ], - }, - COMMA@159..161 "," [] [Whitespace(" ")], - ScssExpression { - items: ScssExpressionItemList [ - CssNumber { - value_token: CSS_NUMBER_LITERAL@161..162 "2" [] [], - }, - ], - }, - ], - r_paren_token: R_PAREN@162..163 ")" [] [], - }, - CssBogusPropertyValue { - items: [ - R_PAREN@163..164 ")" [] [], - ], - }, - ], - }, - ], - }, - ], - }, - important: missing (optional), - }, - semicolon_token: SEMICOLON@164..165 ";" [] [], - }, ], - r_curly_token: R_CURLY@165..167 "}" [Newline("\n")] [], + r_curly_token: R_CURLY@136..138 "}" [Newline("\n")] [], }, }, ], - eof_token: EOF@167..168 "" [Newline("\n")] [], + eof_token: EOF@138..139 "" [Newline("\n")] [], } ``` ## CST ``` -0: CSS_ROOT@0..168 +0: CSS_ROOT@0..139 0: (empty) - 1: CSS_ROOT_ITEM_LIST@0..167 - 0: CSS_QUALIFIED_RULE@0..167 + 1: CSS_ROOT_ITEM_LIST@0..138 + 0: CSS_QUALIFIED_RULE@0..138 0: CSS_SELECTOR_LIST@0..6 0: CSS_COMPOUND_SELECTOR@0..6 0: CSS_NESTED_SELECTOR_LIST@0..0 @@ -328,9 +262,9 @@ CssRoot { 0: DOT@0..1 "." [] [] 1: CSS_CUSTOM_IDENTIFIER@1..6 0: IDENT@1..6 "test" [] [Whitespace(" ")] - 1: CSS_DECLARATION_OR_RULE_BLOCK@6..167 + 1: CSS_DECLARATION_OR_RULE_BLOCK@6..138 0: L_CURLY@6..7 "{" [] [] - 1: CSS_DECLARATION_OR_RULE_LIST@7..165 + 1: CSS_DECLARATION_OR_RULE_LIST@7..136 0: CSS_DECLARATION_WITH_SEMICOLON@7..35 0: CSS_DECLARATION@7..34 0: CSS_GENERIC_PROPERTY@7..34 @@ -441,44 +375,8 @@ CssRoot { 3: R_PAREN@134..135 ")" [] [] 1: (empty) 1: SEMICOLON@135..136 ";" [] [] - 3: CSS_DECLARATION_WITH_SEMICOLON@136..165 - 0: CSS_DECLARATION@136..164 - 0: CSS_BOGUS_PROPERTY@136..164 - 0: CSS_IDENTIFIER@136..151 - 0: IDENT@136..151 "double-comma" [Newline("\n"), Whitespace(" ")] [] - 1: COLON@151..153 ":" [] [Whitespace(" ")] - 2: CSS_BOGUS@153..164 - 0: CSS_BOGUS@153..164 - 0: CSS_FUNCTION@153..163 - 0: CSS_IDENTIFIER@153..155 - 0: IDENT@153..155 "fn" [] [] - 1: L_PAREN@155..156 "(" [] [] - 2: CSS_PARAMETER_LIST@156..162 - 0: SCSS_EXPRESSION@156..159 - 0: SCSS_EXPRESSION_ITEM_LIST@156..159 - 0: SCSS_PARENTHESIZED_EXPRESSION@156..159 - 0: L_PAREN@156..157 "(" [] [] - 1: SCSS_LIST_EXPRESSION@157..159 - 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@157..159 - 0: SCSS_LIST_EXPRESSION_ELEMENT@157..158 - 0: SCSS_EXPRESSION@157..158 - 0: SCSS_EXPRESSION_ITEM_LIST@157..158 - 0: CSS_NUMBER@157..158 - 0: CSS_NUMBER_LITERAL@157..158 "1" [] [] - 1: COMMA@158..159 "," [] [] - 2: (empty) - 1: COMMA@159..161 "," [] [Whitespace(" ")] - 2: SCSS_EXPRESSION@161..162 - 0: SCSS_EXPRESSION_ITEM_LIST@161..162 - 0: CSS_NUMBER@161..162 - 0: CSS_NUMBER_LITERAL@161..162 "2" [] [] - 3: R_PAREN@162..163 ")" [] [] - 1: CSS_BOGUS_PROPERTY_VALUE@163..164 - 0: R_PAREN@163..164 ")" [] [] - 1: (empty) - 1: SEMICOLON@164..165 ";" [] [] - 2: R_CURLY@165..167 "}" [Newline("\n")] [] - 2: EOF@167..168 "" [Newline("\n")] [] + 2: R_CURLY@136..138 "}" [Newline("\n")] [] + 2: EOF@138..139 "" [Newline("\n")] [] ``` @@ -506,7 +404,7 @@ list-map-paren.scss:3:34 parse ━━━━━━━━━━━━━━━━ > 3 │ missing-map-value: fn((primary:, secondary: blue)); │ ^ 4 │ missing-map-key: fn((primary: red, : blue)); - 5 │ double-comma: fn((1,, 2)); + 5 │ } i Expected a SCSS expression here. @@ -515,7 +413,7 @@ list-map-paren.scss:3:34 parse ━━━━━━━━━━━━━━━━ > 3 │ missing-map-value: fn((primary:, secondary: blue)); │ ^ 4 │ missing-map-key: fn((primary: red, : blue)); - 5 │ double-comma: fn((1,, 2)); + 5 │ } list-map-paren.scss:4:38 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ @@ -525,8 +423,8 @@ list-map-paren.scss:4:38 parse ━━━━━━━━━━━━━━━━ 3 │ missing-map-value: fn((primary:, secondary: blue)); > 4 │ missing-map-key: fn((primary: red, : blue)); │ ^^^^^^ - 5 │ double-comma: fn((1,, 2)); - 6 │ } + 5 │ } + 6 │ i Expected a SCSS expression here. @@ -534,47 +432,7 @@ list-map-paren.scss:4:38 parse ━━━━━━━━━━━━━━━━ 3 │ missing-map-value: fn((primary:, secondary: blue)); > 4 │ missing-map-key: fn((primary: red, : blue)); │ ^^^^^^ - 5 │ double-comma: fn((1,, 2)); - 6 │ } - -list-map-paren.scss:5:23 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - × Expected a SCSS expression but instead found ','. - - 3 │ missing-map-value: fn((primary:, secondary: blue)); - 4 │ missing-map-key: fn((primary: red, : blue)); - > 5 │ double-comma: fn((1,, 2)); - │ ^ - 6 │ } - 7 │ - - i Expected a SCSS expression here. - - 3 │ missing-map-value: fn((primary:, secondary: blue)); - 4 │ missing-map-key: fn((primary: red, : blue)); - > 5 │ double-comma: fn((1,, 2)); - │ ^ - 6 │ } - 7 │ - -list-map-paren.scss:5:27 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - × Expected a SCSS expression but instead found ')'. - - 3 │ missing-map-value: fn((primary:, secondary: blue)); - 4 │ missing-map-key: fn((primary: red, : blue)); - > 5 │ double-comma: fn((1,, 2)); - │ ^ - 6 │ } - 7 │ - - i Expected a SCSS expression here. - - 3 │ missing-map-value: fn((primary:, secondary: blue)); - 4 │ missing-map-key: fn((primary: red, : blue)); - > 5 │ double-comma: fn((1,, 2)); - │ ^ - 6 │ } - 7 │ + 5 │ } + 6 │ ``` diff --git a/crates/biome_css_parser/tests/css_test_suite/error/scss/value/colon-value.scss b/crates/biome_css_parser/tests/css_test_suite/error/scss/value/colon-value.scss deleted file mode 100644 index 632c746f8caf..000000000000 --- a/crates/biome_css_parser/tests/css_test_suite/error/scss/value/colon-value.scss +++ /dev/null @@ -1 +0,0 @@ -$sep: :; diff --git a/crates/biome_css_parser/tests/css_test_suite/error/scss/value/colon-value.scss.snap b/crates/biome_css_parser/tests/css_test_suite/error/scss/value/colon-value.scss.snap deleted file mode 100644 index 94f4c31536b7..000000000000 --- a/crates/biome_css_parser/tests/css_test_suite/error/scss/value/colon-value.scss.snap +++ /dev/null @@ -1,90 +0,0 @@ ---- -source: crates/biome_css_parser/tests/spec_test.rs -expression: snapshot ---- - -## Input - -```css -$sep: :; - -``` - - -## AST - -``` -CssRoot { - bom_token: missing (optional), - items: CssRootItemList [ - CssBogus { - items: [ - ScssIdentifier { - dollar_token: DOLLAR@0..1 "$" [] [], - name: CssIdentifier { - value_token: IDENT@1..4 "sep" [] [], - }, - }, - COLON@4..6 ":" [] [Whitespace(" ")], - CssBogus { - items: [ - CssBogus { - items: [ - CssBogusPropertyValue { - items: [ - COLON@6..7 ":" [] [], - ], - }, - ], - }, - ], - }, - ScssVariableModifierList [], - SEMICOLON@7..8 ";" [] [], - ], - }, - ], - eof_token: EOF@8..9 "" [Newline("\n")] [], -} -``` - -## CST - -``` -0: CSS_ROOT@0..9 - 0: (empty) - 1: CSS_ROOT_ITEM_LIST@0..8 - 0: CSS_BOGUS@0..8 - 0: SCSS_IDENTIFIER@0..4 - 0: DOLLAR@0..1 "$" [] [] - 1: CSS_IDENTIFIER@1..4 - 0: IDENT@1..4 "sep" [] [] - 1: COLON@4..6 ":" [] [Whitespace(" ")] - 2: CSS_BOGUS@6..7 - 0: CSS_BOGUS@6..7 - 0: CSS_BOGUS_PROPERTY_VALUE@6..7 - 0: COLON@6..7 ":" [] [] - 3: SCSS_VARIABLE_MODIFIER_LIST@7..7 - 4: SEMICOLON@7..8 ";" [] [] - 2: EOF@8..9 "" [Newline("\n")] [] - -``` - -## Diagnostics - -``` -colon-value.scss:1:7 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - - × Expected a SCSS expression but instead found ':'. - - > 1 │ $sep: :; - │ ^ - 2 │ - - i Expected a SCSS expression here. - - > 1 │ $sep: :; - │ ^ - 2 │ - -``` diff --git a/crates/biome_css_parser/tests/css_test_suite/error/scss/value/if-disambiguation-recovery.scss b/crates/biome_css_parser/tests/css_test_suite/error/scss/value/if-disambiguation-recovery.scss new file mode 100644 index 000000000000..818db033fbae --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/error/scss/value/if-disambiguation-recovery.scss @@ -0,0 +1,4 @@ +.test { + color: if(not style(--foo: bar): black ??? else: white); + background: if((style(--bar: baz)): red ??? else: blue); +} diff --git a/crates/biome_css_parser/tests/css_test_suite/error/scss/value/if-disambiguation-recovery.scss.snap b/crates/biome_css_parser/tests/css_test_suite/error/scss/value/if-disambiguation-recovery.scss.snap new file mode 100644 index 000000000000..6f9a342bb427 --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/error/scss/value/if-disambiguation-recovery.scss.snap @@ -0,0 +1,420 @@ +--- +source: crates/biome_css_parser/tests/spec_test.rs +assertion_line: 208 +expression: snapshot +--- + +## Input + +```css +.test { + color: if(not style(--foo: bar): black ??? else: white); + background: if((style(--bar: baz)): red ??? else: blue); +} + +``` + + +## AST + +``` +CssRoot { + bom_token: missing (optional), + items: CssRootItemList [ + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@0..1 "." [] [], + name: CssCustomIdentifier { + value_token: IDENT@1..6 "test" [] [Whitespace(" ")], + }, + }, + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@6..7 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@7..15 "color" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@15..17 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIfFunction { + if_token: IF_KW@17..19 "if" [] [], + l_paren_token: L_PAREN@19..20 "(" [] [], + css_if_branch_list: CssIfBranchList [ + CssBogusIfBranch { + items: [ + CssIfTestBooleanNotExpr { + not_token: NOT_KW@20..24 "not" [] [Whitespace(" ")], + expression: CssIfStyleTest { + style_token: STYLE_KW@24..29 "style" [] [], + l_paren_token: L_PAREN@29..30 "(" [] [], + test: CssDeclaration { + property: CssGenericProperty { + name: CssDashedIdentifier { + value_token: IDENT@30..35 "--foo" [] [], + }, + colon_token: COLON@35..37 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@37..40 "bar" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + r_paren_token: R_PAREN@40..41 ")" [] [], + }, + }, + COLON@41..43 ":" [] [Whitespace(" ")], + CssBogus { + items: [ + CssIdentifier { + value_token: IDENT@43..49 "black" [] [Whitespace(" ")], + }, + CssBogusPropertyValue { + items: [ + ERROR_TOKEN@49..50 "?" [] [], + ERROR_TOKEN@50..51 "?" [] [], + ERROR_TOKEN@51..53 "?" [] [Whitespace(" ")], + ], + }, + ], + }, + ], + }, + missing separator, + CssIfBranch { + condition: CssElseKeyword { + else_token: ELSE_KW@53..57 "else" [] [], + }, + colon_token: COLON@57..59 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@59..64 "white" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@64..65 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@65..66 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@66..79 "background" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@79..81 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIfFunction { + if_token: IF_KW@81..83 "if" [] [], + l_paren_token: L_PAREN@83..84 "(" [] [], + css_if_branch_list: CssIfBranchList [ + CssBogusIfBranch { + items: [ + CssIfTestBooleanExprInParens { + l_paren_token: L_PAREN@84..85 "(" [] [], + expression: CssIfStyleTest { + style_token: STYLE_KW@85..90 "style" [] [], + l_paren_token: L_PAREN@90..91 "(" [] [], + test: CssDeclaration { + property: CssGenericProperty { + name: CssDashedIdentifier { + value_token: IDENT@91..96 "--bar" [] [], + }, + colon_token: COLON@96..98 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@98..101 "baz" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + r_paren_token: R_PAREN@101..102 ")" [] [], + }, + r_paren_token: R_PAREN@102..103 ")" [] [], + }, + COLON@103..105 ":" [] [Whitespace(" ")], + CssBogus { + items: [ + CssIdentifier { + value_token: IDENT@105..109 "red" [] [Whitespace(" ")], + }, + CssBogusPropertyValue { + items: [ + ERROR_TOKEN@109..110 "?" [] [], + ERROR_TOKEN@110..111 "?" [] [], + ERROR_TOKEN@111..113 "?" [] [Whitespace(" ")], + ], + }, + ], + }, + ], + }, + missing separator, + CssIfBranch { + condition: CssElseKeyword { + else_token: ELSE_KW@113..117 "else" [] [], + }, + colon_token: COLON@117..119 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@119..123 "blue" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@123..124 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@124..125 ";" [] [], + }, + ], + r_curly_token: R_CURLY@125..127 "}" [Newline("\n")] [], + }, + }, + ], + eof_token: EOF@127..128 "" [Newline("\n")] [], +} +``` + +## CST + +``` +0: CSS_ROOT@0..128 + 0: (empty) + 1: CSS_ROOT_ITEM_LIST@0..127 + 0: CSS_QUALIFIED_RULE@0..127 + 0: CSS_SELECTOR_LIST@0..6 + 0: CSS_COMPOUND_SELECTOR@0..6 + 0: CSS_NESTED_SELECTOR_LIST@0..0 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@0..6 + 0: CSS_CLASS_SELECTOR@0..6 + 0: DOT@0..1 "." [] [] + 1: CSS_CUSTOM_IDENTIFIER@1..6 + 0: IDENT@1..6 "test" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@6..127 + 0: L_CURLY@6..7 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@7..125 + 0: CSS_DECLARATION_WITH_SEMICOLON@7..66 + 0: CSS_DECLARATION@7..65 + 0: CSS_GENERIC_PROPERTY@7..65 + 0: CSS_IDENTIFIER@7..15 + 0: IDENT@7..15 "color" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@15..17 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@17..65 + 0: SCSS_EXPRESSION_ITEM_LIST@17..65 + 0: CSS_IF_FUNCTION@17..65 + 0: IF_KW@17..19 "if" [] [] + 1: L_PAREN@19..20 "(" [] [] + 2: CSS_IF_BRANCH_LIST@20..64 + 0: CSS_BOGUS_IF_BRANCH@20..53 + 0: CSS_IF_TEST_BOOLEAN_NOT_EXPR@20..41 + 0: NOT_KW@20..24 "not" [] [Whitespace(" ")] + 1: CSS_IF_STYLE_TEST@24..41 + 0: STYLE_KW@24..29 "style" [] [] + 1: L_PAREN@29..30 "(" [] [] + 2: CSS_DECLARATION@30..40 + 0: CSS_GENERIC_PROPERTY@30..40 + 0: CSS_DASHED_IDENTIFIER@30..35 + 0: IDENT@30..35 "--foo" [] [] + 1: COLON@35..37 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@37..40 + 0: SCSS_EXPRESSION_ITEM_LIST@37..40 + 0: CSS_IDENTIFIER@37..40 + 0: IDENT@37..40 "bar" [] [] + 1: (empty) + 3: R_PAREN@40..41 ")" [] [] + 1: COLON@41..43 ":" [] [Whitespace(" ")] + 2: CSS_BOGUS@43..53 + 0: CSS_IDENTIFIER@43..49 + 0: IDENT@43..49 "black" [] [Whitespace(" ")] + 1: CSS_BOGUS_PROPERTY_VALUE@49..53 + 0: ERROR_TOKEN@49..50 "?" [] [] + 1: ERROR_TOKEN@50..51 "?" [] [] + 2: ERROR_TOKEN@51..53 "?" [] [Whitespace(" ")] + 1: (empty) + 2: CSS_IF_BRANCH@53..64 + 0: CSS_ELSE_KEYWORD@53..57 + 0: ELSE_KW@53..57 "else" [] [] + 1: COLON@57..59 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@59..64 + 0: CSS_IDENTIFIER@59..64 + 0: IDENT@59..64 "white" [] [] + 3: R_PAREN@64..65 ")" [] [] + 1: (empty) + 1: SEMICOLON@65..66 ";" [] [] + 1: CSS_DECLARATION_WITH_SEMICOLON@66..125 + 0: CSS_DECLARATION@66..124 + 0: CSS_GENERIC_PROPERTY@66..124 + 0: CSS_IDENTIFIER@66..79 + 0: IDENT@66..79 "background" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@79..81 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@81..124 + 0: SCSS_EXPRESSION_ITEM_LIST@81..124 + 0: CSS_IF_FUNCTION@81..124 + 0: IF_KW@81..83 "if" [] [] + 1: L_PAREN@83..84 "(" [] [] + 2: CSS_IF_BRANCH_LIST@84..123 + 0: CSS_BOGUS_IF_BRANCH@84..113 + 0: CSS_IF_TEST_BOOLEAN_EXPR_IN_PARENS@84..103 + 0: L_PAREN@84..85 "(" [] [] + 1: CSS_IF_STYLE_TEST@85..102 + 0: STYLE_KW@85..90 "style" [] [] + 1: L_PAREN@90..91 "(" [] [] + 2: CSS_DECLARATION@91..101 + 0: CSS_GENERIC_PROPERTY@91..101 + 0: CSS_DASHED_IDENTIFIER@91..96 + 0: IDENT@91..96 "--bar" [] [] + 1: COLON@96..98 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@98..101 + 0: SCSS_EXPRESSION_ITEM_LIST@98..101 + 0: CSS_IDENTIFIER@98..101 + 0: IDENT@98..101 "baz" [] [] + 1: (empty) + 3: R_PAREN@101..102 ")" [] [] + 2: R_PAREN@102..103 ")" [] [] + 1: COLON@103..105 ":" [] [Whitespace(" ")] + 2: CSS_BOGUS@105..113 + 0: CSS_IDENTIFIER@105..109 + 0: IDENT@105..109 "red" [] [Whitespace(" ")] + 1: CSS_BOGUS_PROPERTY_VALUE@109..113 + 0: ERROR_TOKEN@109..110 "?" [] [] + 1: ERROR_TOKEN@110..111 "?" [] [] + 2: ERROR_TOKEN@111..113 "?" [] [Whitespace(" ")] + 1: (empty) + 2: CSS_IF_BRANCH@113..123 + 0: CSS_ELSE_KEYWORD@113..117 + 0: ELSE_KW@113..117 "else" [] [] + 1: COLON@117..119 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@119..123 + 0: CSS_IDENTIFIER@119..123 + 0: IDENT@119..123 "blue" [] [] + 3: R_PAREN@123..124 ")" [] [] + 1: (empty) + 1: SEMICOLON@124..125 ";" [] [] + 2: R_CURLY@125..127 "}" [Newline("\n")] [] + 2: EOF@127..128 "" [Newline("\n")] [] + +``` + +## Diagnostics + +``` +if-disambiguation-recovery.scss:2:42 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × unexpected character `?` + + 1 │ .test { + > 2 │ color: if(not style(--foo: bar): black ??? else: white); + │ ^ + 3 │ background: if((style(--bar: baz)): red ??? else: blue); + 4 │ } + +if-disambiguation-recovery.scss:2:43 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × unexpected character `?` + + 1 │ .test { + > 2 │ color: if(not style(--foo: bar): black ??? else: white); + │ ^ + 3 │ background: if((style(--bar: baz)): red ??? else: blue); + 4 │ } + +if-disambiguation-recovery.scss:2:44 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × unexpected character `?` + + 1 │ .test { + > 2 │ color: if(not style(--foo: bar): black ??? else: white); + │ ^ + 3 │ background: if((style(--bar: baz)): red ??? else: blue); + 4 │ } + +if-disambiguation-recovery.scss:2:46 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `;` but instead found `else` + + 1 │ .test { + > 2 │ color: if(not style(--foo: bar): black ??? else: white); + │ ^^^^ + 3 │ background: if((style(--bar: baz)): red ??? else: blue); + 4 │ } + + i Remove else + +if-disambiguation-recovery.scss:3:43 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × unexpected character `?` + + 1 │ .test { + 2 │ color: if(not style(--foo: bar): black ??? else: white); + > 3 │ background: if((style(--bar: baz)): red ??? else: blue); + │ ^ + 4 │ } + 5 │ + +if-disambiguation-recovery.scss:3:44 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × unexpected character `?` + + 1 │ .test { + 2 │ color: if(not style(--foo: bar): black ??? else: white); + > 3 │ background: if((style(--bar: baz)): red ??? else: blue); + │ ^ + 4 │ } + 5 │ + +if-disambiguation-recovery.scss:3:45 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × unexpected character `?` + + 1 │ .test { + 2 │ color: if(not style(--foo: bar): black ??? else: white); + > 3 │ background: if((style(--bar: baz)): red ??? else: blue); + │ ^ + 4 │ } + 5 │ + +if-disambiguation-recovery.scss:3:47 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × expected `;` but instead found `else` + + 1 │ .test { + 2 │ color: if(not style(--foo: bar): black ??? else: white); + > 3 │ background: if((style(--bar: baz)): red ??? else: blue); + │ ^^^^ + 4 │ } + 5 │ + + i Remove else + +``` diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/comment/multiline.scss b/crates/biome_css_parser/tests/css_test_suite/ok/scss/comment/multiline.scss index 5af7e108a20a..6c627d3afde8 100644 --- a/crates/biome_css_parser/tests/css_test_suite/ok/scss/comment/multiline.scss +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/comment/multiline.scss @@ -21,18 +21,30 @@ $line-comment: true; background: white; } +/** + * Documentation style comment + * @param $size - The size value + * @returns Computed size + */ +/* TODO(scss at-rules): +@function compute-size($size) { + @return $size * 2; +} +*/ + /* Comment with special chars: @#$%^&*() */ $special: 10px; /* * Comment before mixin */ +/* TODO(scss at-rules): @mixin test-mixin { /* Comment inside mixin */ margin: 0; } +*/ /* Comment at end of file */ - diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/comment/multiline.scss.snap b/crates/biome_css_parser/tests/css_test_suite/ok/scss/comment/multiline.scss.snap index 1e0f3de03ad1..b51e4b6442a9 100644 --- a/crates/biome_css_parser/tests/css_test_suite/ok/scss/comment/multiline.scss.snap +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/comment/multiline.scss.snap @@ -29,22 +29,34 @@ $line-comment: true; background: white; } +/** + * Documentation style comment + * @param $size - The size value + * @returns Computed size + */ +/* TODO(scss at-rules): +@function compute-size($size) { + @return $size * 2; +} +*/ + /* Comment with special chars: @#$%^&*() */ $special: 10px; /* * Comment before mixin */ +/* TODO(scss at-rules): @mixin test-mixin { /* Comment inside mixin */ margin: 0; } +*/ /* Comment at end of file */ - ``` @@ -192,72 +204,34 @@ CssRoot { }, ScssDeclaration { name: ScssIdentifier { - dollar_token: DOLLAR@351..398 "$" [Newline("\n"), Newline("\n"), Comments("/* Comment with speci ..."), Newline("\n")] [], + dollar_token: DOLLAR@351..579 "$" [Newline("\n"), Newline("\n"), Comments("/**\n * Documentation ..."), Newline("\n"), Comments("/* TODO(scss at-rules ..."), Newline("\n"), Newline("\n"), Comments("/* Comment with speci ..."), Newline("\n")] [], name: CssIdentifier { - value_token: IDENT@398..405 "special" [] [], + value_token: IDENT@579..586 "special" [] [], }, }, - colon_token: COLON@405..407 ":" [] [Whitespace(" ")], + colon_token: COLON@586..588 ":" [] [Whitespace(" ")], value: ScssExpression { items: ScssExpressionItemList [ CssRegularDimension { - value_token: CSS_NUMBER_LITERAL@407..409 "10" [] [], - unit_token: IDENT@409..411 "px" [] [], + value_token: CSS_NUMBER_LITERAL@588..590 "10" [] [], + unit_token: IDENT@590..592 "px" [] [], }, ], }, modifiers: ScssVariableModifierList [], - semicolon_token: SEMICOLON@411..412 ";" [] [], - }, - CssAtRule { - at_token: AT@412..446 "@" [Newline("\n"), Newline("\n"), Comments("/*\n * Comment before ..."), Newline("\n")] [], - rule: CssUnknownBlockAtRule { - name: CssIdentifier { - value_token: IDENT@446..452 "mixin" [] [Whitespace(" ")], - }, - components: CssUnknownAtRuleComponentList { - items: [ - IDENT@452..463 "test-mixin" [] [Whitespace(" ")], - ], - }, - block: CssDeclarationOrRuleBlock { - l_curly_token: L_CURLY@463..464 "{" [] [], - items: CssDeclarationOrRuleList [ - CssDeclarationWithSemicolon { - declaration: CssDeclaration { - property: CssGenericProperty { - name: CssIdentifier { - value_token: IDENT@464..502 "margin" [Newline("\n"), Whitespace(" "), Comments("/* Comment inside mix ..."), Newline("\n"), Whitespace(" ")] [], - }, - colon_token: COLON@502..504 ":" [] [Whitespace(" ")], - value: ScssExpression { - items: ScssExpressionItemList [ - CssNumber { - value_token: CSS_NUMBER_LITERAL@504..505 "0" [] [], - }, - ], - }, - }, - important: missing (optional), - }, - semicolon_token: SEMICOLON@505..506 ";" [] [], - }, - ], - r_curly_token: R_CURLY@506..508 "}" [Newline("\n")] [], - }, - }, + semicolon_token: SEMICOLON@592..593 ";" [] [], }, ], - eof_token: EOF@508..542 "" [Newline("\n"), Newline("\n"), Comments("/* Comment at end of ..."), Newline("\n"), Newline("\n"), Newline("\n"), Newline("\n")] [], + eof_token: EOF@593..749 "" [Newline("\n"), Newline("\n"), Comments("/*\n * Comment before ..."), Newline("\n"), Comments("/* TODO(scss at-rules ..."), Newline("\n"), Newline("\n"), Comments("/* Comment at end of ..."), Newline("\n"), Newline("\n"), Newline("\n")] [], } ``` ## CST ``` -0: CSS_ROOT@0..542 +0: CSS_ROOT@0..749 0: (empty) - 1: CSS_ROOT_ITEM_LIST@0..508 + 1: CSS_ROOT_ITEM_LIST@0..593 0: SCSS_DECLARATION@0..68 0: SCSS_IDENTIFIER@0..60 0: DOLLAR@0..57 "$" [Comments("/* Standard CSS multi ..."), Newline("\n")] [] @@ -346,42 +320,19 @@ CssRoot { 1: (empty) 1: SEMICOLON@348..349 ";" [] [] 2: R_CURLY@349..351 "}" [Newline("\n")] [] - 5: SCSS_DECLARATION@351..412 - 0: SCSS_IDENTIFIER@351..405 - 0: DOLLAR@351..398 "$" [Newline("\n"), Newline("\n"), Comments("/* Comment with speci ..."), Newline("\n")] [] - 1: CSS_IDENTIFIER@398..405 - 0: IDENT@398..405 "special" [] [] - 1: COLON@405..407 ":" [] [Whitespace(" ")] - 2: SCSS_EXPRESSION@407..411 - 0: SCSS_EXPRESSION_ITEM_LIST@407..411 - 0: CSS_REGULAR_DIMENSION@407..411 - 0: CSS_NUMBER_LITERAL@407..409 "10" [] [] - 1: IDENT@409..411 "px" [] [] - 3: SCSS_VARIABLE_MODIFIER_LIST@411..411 - 4: SEMICOLON@411..412 ";" [] [] - 6: CSS_AT_RULE@412..508 - 0: AT@412..446 "@" [Newline("\n"), Newline("\n"), Comments("/*\n * Comment before ..."), Newline("\n")] [] - 1: CSS_UNKNOWN_BLOCK_AT_RULE@446..508 - 0: CSS_IDENTIFIER@446..452 - 0: IDENT@446..452 "mixin" [] [Whitespace(" ")] - 1: CSS_UNKNOWN_AT_RULE_COMPONENT_LIST@452..463 - 0: IDENT@452..463 "test-mixin" [] [Whitespace(" ")] - 2: CSS_DECLARATION_OR_RULE_BLOCK@463..508 - 0: L_CURLY@463..464 "{" [] [] - 1: CSS_DECLARATION_OR_RULE_LIST@464..506 - 0: CSS_DECLARATION_WITH_SEMICOLON@464..506 - 0: CSS_DECLARATION@464..505 - 0: CSS_GENERIC_PROPERTY@464..505 - 0: CSS_IDENTIFIER@464..502 - 0: IDENT@464..502 "margin" [Newline("\n"), Whitespace(" "), Comments("/* Comment inside mix ..."), Newline("\n"), Whitespace(" ")] [] - 1: COLON@502..504 ":" [] [Whitespace(" ")] - 2: SCSS_EXPRESSION@504..505 - 0: SCSS_EXPRESSION_ITEM_LIST@504..505 - 0: CSS_NUMBER@504..505 - 0: CSS_NUMBER_LITERAL@504..505 "0" [] [] - 1: (empty) - 1: SEMICOLON@505..506 ";" [] [] - 2: R_CURLY@506..508 "}" [Newline("\n")] [] - 2: EOF@508..542 "" [Newline("\n"), Newline("\n"), Comments("/* Comment at end of ..."), Newline("\n"), Newline("\n"), Newline("\n"), Newline("\n")] [] + 5: SCSS_DECLARATION@351..593 + 0: SCSS_IDENTIFIER@351..586 + 0: DOLLAR@351..579 "$" [Newline("\n"), Newline("\n"), Comments("/**\n * Documentation ..."), Newline("\n"), Comments("/* TODO(scss at-rules ..."), Newline("\n"), Newline("\n"), Comments("/* Comment with speci ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@579..586 + 0: IDENT@579..586 "special" [] [] + 1: COLON@586..588 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@588..592 + 0: SCSS_EXPRESSION_ITEM_LIST@588..592 + 0: CSS_REGULAR_DIMENSION@588..592 + 0: CSS_NUMBER_LITERAL@588..590 "10" [] [] + 1: IDENT@590..592 "px" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@592..592 + 4: SEMICOLON@592..593 ";" [] [] + 2: EOF@593..749 "" [Newline("\n"), Newline("\n"), Comments("/*\n * Comment before ..."), Newline("\n"), Comments("/* TODO(scss at-rules ..."), Newline("\n"), Newline("\n"), Comments("/* Comment at end of ..."), Newline("\n"), Newline("\n"), Newline("\n")] [] ``` diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/expression/complex-expressions.scss.snap b/crates/biome_css_parser/tests/css_test_suite/ok/scss/expression/complex-expressions.scss.snap index a0db089d1ff9..ed5396394fd0 100644 --- a/crates/biome_css_parser/tests/css_test_suite/ok/scss/expression/complex-expressions.scss.snap +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/expression/complex-expressions.scss.snap @@ -2214,20 +2214,38 @@ CssRoot { colon_token: COLON@2324..2326 ":" [] [Whitespace(" ")], value: ScssExpression { items: ScssExpressionItemList [ - CssNumber { - value_token: CSS_NUMBER_LITERAL@2326..2327 "1" [] [], - }, - CssGenericDelimiter { - value: COMMA@2327..2329 "," [] [Whitespace(" ")], - }, - CssNumber { - value_token: CSS_NUMBER_LITERAL@2329..2330 "2" [] [], - }, - CssGenericDelimiter { - value: COMMA@2330..2332 "," [] [Whitespace(" ")], - }, - CssNumber { - value_token: CSS_NUMBER_LITERAL@2332..2333 "3" [] [], + ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@2326..2327 "1" [] [], + }, + ], + }, + }, + COMMA@2327..2329 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@2329..2330 "2" [] [], + }, + ], + }, + }, + COMMA@2330..2332 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@2332..2333 "3" [] [], + }, + ], + }, + }, + ], }, ], }, @@ -4536,16 +4554,25 @@ CssRoot { 1: COLON@2324..2326 ":" [] [Whitespace(" ")] 2: SCSS_EXPRESSION@2326..2333 0: SCSS_EXPRESSION_ITEM_LIST@2326..2333 - 0: CSS_NUMBER@2326..2327 - 0: CSS_NUMBER_LITERAL@2326..2327 "1" [] [] - 1: CSS_GENERIC_DELIMITER@2327..2329 - 0: COMMA@2327..2329 "," [] [Whitespace(" ")] - 2: CSS_NUMBER@2329..2330 - 0: CSS_NUMBER_LITERAL@2329..2330 "2" [] [] - 3: CSS_GENERIC_DELIMITER@2330..2332 - 0: COMMA@2330..2332 "," [] [Whitespace(" ")] - 4: CSS_NUMBER@2332..2333 - 0: CSS_NUMBER_LITERAL@2332..2333 "3" [] [] + 0: SCSS_LIST_EXPRESSION@2326..2333 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@2326..2333 + 0: SCSS_LIST_EXPRESSION_ELEMENT@2326..2327 + 0: SCSS_EXPRESSION@2326..2327 + 0: SCSS_EXPRESSION_ITEM_LIST@2326..2327 + 0: CSS_NUMBER@2326..2327 + 0: CSS_NUMBER_LITERAL@2326..2327 "1" [] [] + 1: COMMA@2327..2329 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@2329..2330 + 0: SCSS_EXPRESSION@2329..2330 + 0: SCSS_EXPRESSION_ITEM_LIST@2329..2330 + 0: CSS_NUMBER@2329..2330 + 0: CSS_NUMBER_LITERAL@2329..2330 "2" [] [] + 3: COMMA@2330..2332 "," [] [Whitespace(" ")] + 4: SCSS_LIST_EXPRESSION_ELEMENT@2332..2333 + 0: SCSS_EXPRESSION@2332..2333 + 0: SCSS_EXPRESSION_ITEM_LIST@2332..2333 + 0: CSS_NUMBER@2332..2333 + 0: CSS_NUMBER_LITERAL@2332..2333 "3" [] [] 3: SCSS_VARIABLE_MODIFIER_LIST@2333..2333 4: SEMICOLON@2333..2334 ";" [] [] 58: SCSS_DECLARATION@2334..2389 diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/expression/fallback-values.scss.snap b/crates/biome_css_parser/tests/css_test_suite/ok/scss/expression/fallback-values.scss.snap index 6af92addf8e8..c64ed589129a 100644 --- a/crates/biome_css_parser/tests/css_test_suite/ok/scss/expression/fallback-values.scss.snap +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/expression/fallback-values.scss.snap @@ -1,5 +1,6 @@ --- source: crates/biome_css_parser/tests/spec_test.rs +assertion_line: 208 expression: snapshot --- diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/expression/keyword-argument-context.scss b/crates/biome_css_parser/tests/css_test_suite/ok/scss/expression/keyword-argument-context.scss index ac1fc2953cc6..bcaa3120295c 100644 --- a/crates/biome_css_parser/tests/css_test_suite/ok/scss/expression/keyword-argument-context.scss +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/expression/keyword-argument-context.scss @@ -1,4 +1,5 @@ -.demo { +.keyword-arg-context { + width: fn($a: $b); first: fn($name: 1); second: fn(($name: 1), $args...); } diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/expression/keyword-argument-context.scss.snap b/crates/biome_css_parser/tests/css_test_suite/ok/scss/expression/keyword-argument-context.scss.snap index d47d9b28ef0f..5119c7ef165a 100644 --- a/crates/biome_css_parser/tests/css_test_suite/ok/scss/expression/keyword-argument-context.scss.snap +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/expression/keyword-argument-context.scss.snap @@ -1,12 +1,14 @@ --- source: crates/biome_css_parser/tests/spec_test.rs +assertion_line: 208 expression: snapshot --- ## Input ```css -.demo { +.keyword-arg-context { + width: fn($a: $b); first: fn($name: 1); second: fn(($name: 1), $args...); } @@ -29,44 +31,92 @@ CssRoot { CssClassSelector { dot_token: DOT@0..1 "." [] [], name: CssCustomIdentifier { - value_token: IDENT@1..6 "demo" [] [Whitespace(" ")], + value_token: IDENT@1..21 "keyword-arg-context" [] [Whitespace(" ")], }, }, ], }, ], block: CssDeclarationOrRuleBlock { - l_curly_token: L_CURLY@6..7 "{" [] [], + l_curly_token: L_CURLY@21..22 "{" [] [], items: CssDeclarationOrRuleList [ CssDeclarationWithSemicolon { declaration: CssDeclaration { property: CssGenericProperty { name: CssIdentifier { - value_token: IDENT@7..15 "first" [Newline("\n"), Whitespace(" ")] [], + value_token: IDENT@22..30 "width" [Newline("\n"), Whitespace(" ")] [], }, - colon_token: COLON@15..17 ":" [] [Whitespace(" ")], + colon_token: COLON@30..32 ":" [] [Whitespace(" ")], value: ScssExpression { items: ScssExpressionItemList [ CssFunction { name: CssIdentifier { - value_token: IDENT@17..19 "fn" [] [], + value_token: IDENT@32..34 "fn" [] [], }, - l_paren_token: L_PAREN@19..20 "(" [] [], + l_paren_token: L_PAREN@34..35 "(" [] [], items: CssParameterList [ ScssExpression { items: ScssExpressionItemList [ ScssKeywordArgument { name: ScssIdentifier { - dollar_token: DOLLAR@20..21 "$" [] [], + dollar_token: DOLLAR@35..36 "$" [] [], name: CssIdentifier { - value_token: IDENT@21..25 "name" [] [], + value_token: IDENT@36..37 "a" [] [], }, }, - colon_token: COLON@25..27 ":" [] [Whitespace(" ")], + colon_token: COLON@37..39 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssIdentifier { + dollar_token: DOLLAR@39..40 "$" [] [], + name: CssIdentifier { + value_token: IDENT@40..41 "b" [] [], + }, + }, + ], + }, + }, + ], + }, + ], + r_paren_token: R_PAREN@41..42 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@42..43 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@43..51 "first" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@51..53 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@53..55 "fn" [] [], + }, + l_paren_token: L_PAREN@55..56 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssKeywordArgument { + name: ScssIdentifier { + dollar_token: DOLLAR@56..57 "$" [] [], + name: CssIdentifier { + value_token: IDENT@57..61 "name" [] [], + }, + }, + colon_token: COLON@61..63 ":" [] [Whitespace(" ")], value: ScssExpression { items: ScssExpressionItemList [ CssNumber { - value_token: CSS_NUMBER_LITERAL@27..28 "1" [] [], + value_token: CSS_NUMBER_LITERAL@63..64 "1" [] [], }, ], }, @@ -74,184 +124,214 @@ CssRoot { ], }, ], - r_paren_token: R_PAREN@28..29 ")" [] [], + r_paren_token: R_PAREN@64..65 ")" [] [], }, ], }, }, important: missing (optional), }, - semicolon_token: SEMICOLON@29..30 ";" [] [], + semicolon_token: SEMICOLON@65..66 ";" [] [], }, CssDeclarationWithSemicolon { declaration: CssDeclaration { property: CssGenericProperty { name: CssIdentifier { - value_token: IDENT@30..39 "second" [Newline("\n"), Whitespace(" ")] [], + value_token: IDENT@66..75 "second" [Newline("\n"), Whitespace(" ")] [], }, - colon_token: COLON@39..41 ":" [] [Whitespace(" ")], + colon_token: COLON@75..77 ":" [] [Whitespace(" ")], value: ScssExpression { items: ScssExpressionItemList [ CssFunction { name: CssIdentifier { - value_token: IDENT@41..43 "fn" [] [], + value_token: IDENT@77..79 "fn" [] [], }, - l_paren_token: L_PAREN@43..44 "(" [] [], + l_paren_token: L_PAREN@79..80 "(" [] [], items: CssParameterList [ ScssExpression { items: ScssExpressionItemList [ ScssMapExpression { - l_paren_token: L_PAREN@44..45 "(" [] [], + l_paren_token: L_PAREN@80..81 "(" [] [], pairs: ScssMapExpressionPairList [ ScssMapExpressionPair { key: ScssExpression { items: ScssExpressionItemList [ ScssIdentifier { - dollar_token: DOLLAR@45..46 "$" [] [], + dollar_token: DOLLAR@81..82 "$" [] [], name: CssIdentifier { - value_token: IDENT@46..50 "name" [] [], + value_token: IDENT@82..86 "name" [] [], }, }, ], }, - colon_token: COLON@50..52 ":" [] [Whitespace(" ")], + colon_token: COLON@86..88 ":" [] [Whitespace(" ")], value: ScssExpression { items: ScssExpressionItemList [ CssNumber { - value_token: CSS_NUMBER_LITERAL@52..53 "1" [] [], + value_token: CSS_NUMBER_LITERAL@88..89 "1" [] [], }, ], }, }, ], - r_paren_token: R_PAREN@53..54 ")" [] [], + r_paren_token: R_PAREN@89..90 ")" [] [], }, ], }, - COMMA@54..56 "," [] [Whitespace(" ")], + COMMA@90..92 "," [] [Whitespace(" ")], ScssExpression { items: ScssExpressionItemList [ ScssArbitraryArgument { value: ScssIdentifier { - dollar_token: DOLLAR@56..57 "$" [] [], + dollar_token: DOLLAR@92..93 "$" [] [], name: CssIdentifier { - value_token: IDENT@57..61 "args" [] [], + value_token: IDENT@93..97 "args" [] [], }, }, - dotdotdot_token: DOT3@61..64 "..." [] [], + dotdotdot_token: DOT3@97..100 "..." [] [], }, ], }, ], - r_paren_token: R_PAREN@64..65 ")" [] [], + r_paren_token: R_PAREN@100..101 ")" [] [], }, ], }, }, important: missing (optional), }, - semicolon_token: SEMICOLON@65..66 ";" [] [], + semicolon_token: SEMICOLON@101..102 ";" [] [], }, ], - r_curly_token: R_CURLY@66..68 "}" [Newline("\n")] [], + r_curly_token: R_CURLY@102..104 "}" [Newline("\n")] [], }, }, ], - eof_token: EOF@68..69 "" [Newline("\n")] [], + eof_token: EOF@104..105 "" [Newline("\n")] [], } ``` ## CST ``` -0: CSS_ROOT@0..69 +0: CSS_ROOT@0..105 0: (empty) - 1: CSS_ROOT_ITEM_LIST@0..68 - 0: CSS_QUALIFIED_RULE@0..68 - 0: CSS_SELECTOR_LIST@0..6 - 0: CSS_COMPOUND_SELECTOR@0..6 + 1: CSS_ROOT_ITEM_LIST@0..104 + 0: CSS_QUALIFIED_RULE@0..104 + 0: CSS_SELECTOR_LIST@0..21 + 0: CSS_COMPOUND_SELECTOR@0..21 0: CSS_NESTED_SELECTOR_LIST@0..0 1: (empty) - 2: CSS_SUB_SELECTOR_LIST@0..6 - 0: CSS_CLASS_SELECTOR@0..6 + 2: CSS_SUB_SELECTOR_LIST@0..21 + 0: CSS_CLASS_SELECTOR@0..21 0: DOT@0..1 "." [] [] - 1: CSS_CUSTOM_IDENTIFIER@1..6 - 0: IDENT@1..6 "demo" [] [Whitespace(" ")] - 1: CSS_DECLARATION_OR_RULE_BLOCK@6..68 - 0: L_CURLY@6..7 "{" [] [] - 1: CSS_DECLARATION_OR_RULE_LIST@7..66 - 0: CSS_DECLARATION_WITH_SEMICOLON@7..30 - 0: CSS_DECLARATION@7..29 - 0: CSS_GENERIC_PROPERTY@7..29 - 0: CSS_IDENTIFIER@7..15 - 0: IDENT@7..15 "first" [Newline("\n"), Whitespace(" ")] [] - 1: COLON@15..17 ":" [] [Whitespace(" ")] - 2: SCSS_EXPRESSION@17..29 - 0: SCSS_EXPRESSION_ITEM_LIST@17..29 - 0: CSS_FUNCTION@17..29 - 0: CSS_IDENTIFIER@17..19 - 0: IDENT@17..19 "fn" [] [] - 1: L_PAREN@19..20 "(" [] [] - 2: CSS_PARAMETER_LIST@20..28 - 0: SCSS_EXPRESSION@20..28 - 0: SCSS_EXPRESSION_ITEM_LIST@20..28 - 0: SCSS_KEYWORD_ARGUMENT@20..28 - 0: SCSS_IDENTIFIER@20..25 - 0: DOLLAR@20..21 "$" [] [] - 1: CSS_IDENTIFIER@21..25 - 0: IDENT@21..25 "name" [] [] - 1: COLON@25..27 ":" [] [Whitespace(" ")] - 2: SCSS_EXPRESSION@27..28 - 0: SCSS_EXPRESSION_ITEM_LIST@27..28 - 0: CSS_NUMBER@27..28 - 0: CSS_NUMBER_LITERAL@27..28 "1" [] [] - 3: R_PAREN@28..29 ")" [] [] + 1: CSS_CUSTOM_IDENTIFIER@1..21 + 0: IDENT@1..21 "keyword-arg-context" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@21..104 + 0: L_CURLY@21..22 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@22..102 + 0: CSS_DECLARATION_WITH_SEMICOLON@22..43 + 0: CSS_DECLARATION@22..42 + 0: CSS_GENERIC_PROPERTY@22..42 + 0: CSS_IDENTIFIER@22..30 + 0: IDENT@22..30 "width" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@30..32 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@32..42 + 0: SCSS_EXPRESSION_ITEM_LIST@32..42 + 0: CSS_FUNCTION@32..42 + 0: CSS_IDENTIFIER@32..34 + 0: IDENT@32..34 "fn" [] [] + 1: L_PAREN@34..35 "(" [] [] + 2: CSS_PARAMETER_LIST@35..41 + 0: SCSS_EXPRESSION@35..41 + 0: SCSS_EXPRESSION_ITEM_LIST@35..41 + 0: SCSS_KEYWORD_ARGUMENT@35..41 + 0: SCSS_IDENTIFIER@35..37 + 0: DOLLAR@35..36 "$" [] [] + 1: CSS_IDENTIFIER@36..37 + 0: IDENT@36..37 "a" [] [] + 1: COLON@37..39 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@39..41 + 0: SCSS_EXPRESSION_ITEM_LIST@39..41 + 0: SCSS_IDENTIFIER@39..41 + 0: DOLLAR@39..40 "$" [] [] + 1: CSS_IDENTIFIER@40..41 + 0: IDENT@40..41 "b" [] [] + 3: R_PAREN@41..42 ")" [] [] 1: (empty) - 1: SEMICOLON@29..30 ";" [] [] - 1: CSS_DECLARATION_WITH_SEMICOLON@30..66 - 0: CSS_DECLARATION@30..65 - 0: CSS_GENERIC_PROPERTY@30..65 - 0: CSS_IDENTIFIER@30..39 - 0: IDENT@30..39 "second" [Newline("\n"), Whitespace(" ")] [] - 1: COLON@39..41 ":" [] [Whitespace(" ")] - 2: SCSS_EXPRESSION@41..65 - 0: SCSS_EXPRESSION_ITEM_LIST@41..65 - 0: CSS_FUNCTION@41..65 - 0: CSS_IDENTIFIER@41..43 - 0: IDENT@41..43 "fn" [] [] - 1: L_PAREN@43..44 "(" [] [] - 2: CSS_PARAMETER_LIST@44..64 - 0: SCSS_EXPRESSION@44..54 - 0: SCSS_EXPRESSION_ITEM_LIST@44..54 - 0: SCSS_MAP_EXPRESSION@44..54 - 0: L_PAREN@44..45 "(" [] [] - 1: SCSS_MAP_EXPRESSION_PAIR_LIST@45..53 - 0: SCSS_MAP_EXPRESSION_PAIR@45..53 - 0: SCSS_EXPRESSION@45..50 - 0: SCSS_EXPRESSION_ITEM_LIST@45..50 - 0: SCSS_IDENTIFIER@45..50 - 0: DOLLAR@45..46 "$" [] [] - 1: CSS_IDENTIFIER@46..50 - 0: IDENT@46..50 "name" [] [] - 1: COLON@50..52 ":" [] [Whitespace(" ")] - 2: SCSS_EXPRESSION@52..53 - 0: SCSS_EXPRESSION_ITEM_LIST@52..53 - 0: CSS_NUMBER@52..53 - 0: CSS_NUMBER_LITERAL@52..53 "1" [] [] - 2: R_PAREN@53..54 ")" [] [] - 1: COMMA@54..56 "," [] [Whitespace(" ")] - 2: SCSS_EXPRESSION@56..64 + 1: SEMICOLON@42..43 ";" [] [] + 1: CSS_DECLARATION_WITH_SEMICOLON@43..66 + 0: CSS_DECLARATION@43..65 + 0: CSS_GENERIC_PROPERTY@43..65 + 0: CSS_IDENTIFIER@43..51 + 0: IDENT@43..51 "first" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@51..53 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@53..65 + 0: SCSS_EXPRESSION_ITEM_LIST@53..65 + 0: CSS_FUNCTION@53..65 + 0: CSS_IDENTIFIER@53..55 + 0: IDENT@53..55 "fn" [] [] + 1: L_PAREN@55..56 "(" [] [] + 2: CSS_PARAMETER_LIST@56..64 + 0: SCSS_EXPRESSION@56..64 0: SCSS_EXPRESSION_ITEM_LIST@56..64 - 0: SCSS_ARBITRARY_ARGUMENT@56..64 + 0: SCSS_KEYWORD_ARGUMENT@56..64 0: SCSS_IDENTIFIER@56..61 0: DOLLAR@56..57 "$" [] [] 1: CSS_IDENTIFIER@57..61 - 0: IDENT@57..61 "args" [] [] - 1: DOT3@61..64 "..." [] [] + 0: IDENT@57..61 "name" [] [] + 1: COLON@61..63 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@63..64 + 0: SCSS_EXPRESSION_ITEM_LIST@63..64 + 0: CSS_NUMBER@63..64 + 0: CSS_NUMBER_LITERAL@63..64 "1" [] [] 3: R_PAREN@64..65 ")" [] [] 1: (empty) 1: SEMICOLON@65..66 ";" [] [] - 2: R_CURLY@66..68 "}" [Newline("\n")] [] - 2: EOF@68..69 "" [Newline("\n")] [] + 2: CSS_DECLARATION_WITH_SEMICOLON@66..102 + 0: CSS_DECLARATION@66..101 + 0: CSS_GENERIC_PROPERTY@66..101 + 0: CSS_IDENTIFIER@66..75 + 0: IDENT@66..75 "second" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@75..77 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@77..101 + 0: SCSS_EXPRESSION_ITEM_LIST@77..101 + 0: CSS_FUNCTION@77..101 + 0: CSS_IDENTIFIER@77..79 + 0: IDENT@77..79 "fn" [] [] + 1: L_PAREN@79..80 "(" [] [] + 2: CSS_PARAMETER_LIST@80..100 + 0: SCSS_EXPRESSION@80..90 + 0: SCSS_EXPRESSION_ITEM_LIST@80..90 + 0: SCSS_MAP_EXPRESSION@80..90 + 0: L_PAREN@80..81 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@81..89 + 0: SCSS_MAP_EXPRESSION_PAIR@81..89 + 0: SCSS_EXPRESSION@81..86 + 0: SCSS_EXPRESSION_ITEM_LIST@81..86 + 0: SCSS_IDENTIFIER@81..86 + 0: DOLLAR@81..82 "$" [] [] + 1: CSS_IDENTIFIER@82..86 + 0: IDENT@82..86 "name" [] [] + 1: COLON@86..88 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@88..89 + 0: SCSS_EXPRESSION_ITEM_LIST@88..89 + 0: CSS_NUMBER@88..89 + 0: CSS_NUMBER_LITERAL@88..89 "1" [] [] + 2: R_PAREN@89..90 ")" [] [] + 1: COMMA@90..92 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@92..100 + 0: SCSS_EXPRESSION_ITEM_LIST@92..100 + 0: SCSS_ARBITRARY_ARGUMENT@92..100 + 0: SCSS_IDENTIFIER@92..97 + 0: DOLLAR@92..93 "$" [] [] + 1: CSS_IDENTIFIER@93..97 + 0: IDENT@93..97 "args" [] [] + 1: DOT3@97..100 "..." [] [] + 3: R_PAREN@100..101 ")" [] [] + 1: (empty) + 1: SEMICOLON@101..102 ";" [] [] + 2: R_CURLY@102..104 "}" [Newline("\n")] [] + 2: EOF@104..105 "" [Newline("\n")] [] ``` diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/recovery/list-space-trailing-comma.scss.snap b/crates/biome_css_parser/tests/css_test_suite/ok/scss/recovery/list-space-trailing-comma.scss.snap index 0bb168f4fc0c..74801f08dd88 100644 --- a/crates/biome_css_parser/tests/css_test_suite/ok/scss/recovery/list-space-trailing-comma.scss.snap +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/recovery/list-space-trailing-comma.scss.snap @@ -1,5 +1,6 @@ --- source: crates/biome_css_parser/tests/spec_test.rs +assertion_line: 208 expression: snapshot --- @@ -46,20 +47,32 @@ CssRoot { colon_token: COLON@14..16 ":" [] [Whitespace(" ")], value: ScssExpression { items: ScssExpressionItemList [ - CssNumber { - value_token: CSS_NUMBER_LITERAL@16..18 "1" [] [Whitespace(" ")], - }, - CssNumber { - value_token: CSS_NUMBER_LITERAL@18..19 "2" [] [], - }, - CssGenericDelimiter { - value: COMMA@19..21 "," [] [Whitespace(" ")], - }, - CssNumber { - value_token: CSS_NUMBER_LITERAL@21..22 "3" [] [], - }, - CssGenericDelimiter { - value: COMMA@22..23 "," [] [], + ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@16..18 "1" [] [Whitespace(" ")], + }, + CssNumber { + value_token: CSS_NUMBER_LITERAL@18..19 "2" [] [], + }, + ], + }, + }, + COMMA@19..21 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@21..22 "3" [] [], + }, + ], + }, + }, + COMMA@22..23 "," [] [], + ], }, ], }, @@ -104,16 +117,22 @@ CssRoot { 1: COLON@14..16 ":" [] [Whitespace(" ")] 2: SCSS_EXPRESSION@16..23 0: SCSS_EXPRESSION_ITEM_LIST@16..23 - 0: CSS_NUMBER@16..18 - 0: CSS_NUMBER_LITERAL@16..18 "1" [] [Whitespace(" ")] - 1: CSS_NUMBER@18..19 - 0: CSS_NUMBER_LITERAL@18..19 "2" [] [] - 2: CSS_GENERIC_DELIMITER@19..21 - 0: COMMA@19..21 "," [] [Whitespace(" ")] - 3: CSS_NUMBER@21..22 - 0: CSS_NUMBER_LITERAL@21..22 "3" [] [] - 4: CSS_GENERIC_DELIMITER@22..23 - 0: COMMA@22..23 "," [] [] + 0: SCSS_LIST_EXPRESSION@16..23 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@16..23 + 0: SCSS_LIST_EXPRESSION_ELEMENT@16..19 + 0: SCSS_EXPRESSION@16..19 + 0: SCSS_EXPRESSION_ITEM_LIST@16..19 + 0: CSS_NUMBER@16..18 + 0: CSS_NUMBER_LITERAL@16..18 "1" [] [Whitespace(" ")] + 1: CSS_NUMBER@18..19 + 0: CSS_NUMBER_LITERAL@18..19 "2" [] [] + 1: COMMA@19..21 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@21..22 + 0: SCSS_EXPRESSION@21..22 + 0: SCSS_EXPRESSION_ITEM_LIST@21..22 + 0: CSS_NUMBER@21..22 + 0: CSS_NUMBER_LITERAL@21..22 "3" [] [] + 3: COMMA@22..23 "," [] [] 1: (empty) 1: SEMICOLON@23..24 ";" [] [] 2: R_CURLY@24..26 "}" [Newline("\n")] [] diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/binary-operators.scss.snap b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/binary-operators.scss.snap index 38c65a1be2f7..317177861687 100644 --- a/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/binary-operators.scss.snap +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/binary-operators.scss.snap @@ -1,5 +1,6 @@ --- source: crates/biome_css_parser/tests/spec_test.rs +assertion_line: 208 expression: snapshot --- @@ -395,20 +396,34 @@ CssRoot { colon_token: COLON@527..529 ":" [] [Whitespace(" ")], value: ScssExpression { items: ScssExpressionItemList [ - CssIdentifier { - value_token: IDENT@529..530 "a" [] [], - }, - CssGenericDelimiter { - value: COMMA@530..531 "," [] [], - }, - ScssBinaryExpression { - left: CssNumber { - value_token: CSS_NUMBER_LITERAL@531..533 "-1" [] [], - }, - operator: STAR@533..534 "*" [] [], - right: CssIdentifier { - value_token: IDENT@534..535 "b" [] [], - }, + ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@529..530 "a" [] [], + }, + ], + }, + }, + COMMA@530..531 "," [] [], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + ScssBinaryExpression { + left: CssNumber { + value_token: CSS_NUMBER_LITERAL@531..533 "-1" [] [], + }, + operator: STAR@533..534 "*" [] [], + right: CssIdentifier { + value_token: IDENT@534..535 "b" [] [], + }, + }, + ], + }, + }, + ], }, ], }, @@ -656,16 +671,23 @@ CssRoot { 1: COLON@527..529 ":" [] [Whitespace(" ")] 2: SCSS_EXPRESSION@529..535 0: SCSS_EXPRESSION_ITEM_LIST@529..535 - 0: CSS_IDENTIFIER@529..530 - 0: IDENT@529..530 "a" [] [] - 1: CSS_GENERIC_DELIMITER@530..531 - 0: COMMA@530..531 "," [] [] - 2: SCSS_BINARY_EXPRESSION@531..535 - 0: CSS_NUMBER@531..533 - 0: CSS_NUMBER_LITERAL@531..533 "-1" [] [] - 1: STAR@533..534 "*" [] [] - 2: CSS_IDENTIFIER@534..535 - 0: IDENT@534..535 "b" [] [] + 0: SCSS_LIST_EXPRESSION@529..535 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@529..535 + 0: SCSS_LIST_EXPRESSION_ELEMENT@529..530 + 0: SCSS_EXPRESSION@529..530 + 0: SCSS_EXPRESSION_ITEM_LIST@529..530 + 0: CSS_IDENTIFIER@529..530 + 0: IDENT@529..530 "a" [] [] + 1: COMMA@530..531 "," [] [] + 2: SCSS_LIST_EXPRESSION_ELEMENT@531..535 + 0: SCSS_EXPRESSION@531..535 + 0: SCSS_EXPRESSION_ITEM_LIST@531..535 + 0: SCSS_BINARY_EXPRESSION@531..535 + 0: CSS_NUMBER@531..533 + 0: CSS_NUMBER_LITERAL@531..533 "-1" [] [] + 1: STAR@533..534 "*" [] [] + 2: CSS_IDENTIFIER@534..535 + 0: IDENT@534..535 "b" [] [] 1: (empty) 1: SEMICOLON@535..536 ";" [] [] 2: R_CURLY@536..538 "}" [Newline("\n")] [] diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/builtin-modules.scss b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/builtin-modules.scss new file mode 100644 index 000000000000..aa973a9b57b2 --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/builtin-modules.scss @@ -0,0 +1,77 @@ +// Built-in SCSS modules +// TODO(scss at-rules): @use "sass:math"; +// TODO(scss at-rules): @use "sass:color"; +// TODO(scss at-rules): @use "sass:string"; +// TODO(scss at-rules): @use "sass:list"; +// TODO(scss at-rules): @use "sass:map"; +// TODO(scss at-rules): @use "sass:selector"; +// TODO(scss at-rules): @use "sass:meta"; + +// Math module +.math-test { + width: math.div(100px, 2); + height: math.ceil(10.3px); + padding: math.floor(15.9px); + margin: math.round(12.5px); + max: math.max(10px, 20px, 30px); + min: math.min(10px, 20px, 30px); + power: math.pow(2, 3); +} + +// Color module +.color-test { + color: color.adjust(#036, $lightness: 20%); + background: color.scale(#036, $lightness: 50%); + border-color: color.change(#036, $alpha: 0.5); + mix: color.mix(#036, #f00, 50%); + invert: color.invert(#036); + complement: color.complement(#036); +} + +// String module +.string-test { + content: string.quote("hello"); + unquote: string.unquote('"hello"'); + length: string.length("hello"); + insert: string.insert("hello", "X", 3); + index: string.index("hello", "ll"); + slice: string.slice("hello", 2, 4); +} + +// List module +$my-list: (a, b, c); +.list-test { + length: list.length($my-list); + nth: list.nth($my-list, 2); + index: list.index($my-list, b); + append: list.append($my-list, d); + join: list.join($my-list, (x, y)); +} + +// Map module +$my-map: (key1: value1, key2: value2); +.map-test { + get: map.get($my-map, key1); + has-key: map.has-key($my-map, key1); + keys: map.keys($my-map); + values: map.values($my-map); + merge: map.merge($my-map, (key3: value3)); +} + +// Selector module +.selector-test { + is-superselector: selector.is-superselector(".foo", ".foo.bar"); + append: selector.append(".foo", ".bar"); + extend: selector.extend(".a", ".b", ".c"); +} + +// Meta module +.meta-test { + type: meta.type-of(10px); + unit: meta.unit(10px); + unitless: meta.unitless(10); + comparable: meta.comparable(10px, 10em); +} + + + diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/builtin-modules.scss.snap b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/builtin-modules.scss.snap new file mode 100644 index 000000000000..2be10ebe822d --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/builtin-modules.scss.snap @@ -0,0 +1,3363 @@ +--- +source: crates/biome_css_parser/tests/spec_test.rs +expression: snapshot +--- + +## Input + +```css +// Built-in SCSS modules +// TODO(scss at-rules): @use "sass:math"; +// TODO(scss at-rules): @use "sass:color"; +// TODO(scss at-rules): @use "sass:string"; +// TODO(scss at-rules): @use "sass:list"; +// TODO(scss at-rules): @use "sass:map"; +// TODO(scss at-rules): @use "sass:selector"; +// TODO(scss at-rules): @use "sass:meta"; + +// Math module +.math-test { + width: math.div(100px, 2); + height: math.ceil(10.3px); + padding: math.floor(15.9px); + margin: math.round(12.5px); + max: math.max(10px, 20px, 30px); + min: math.min(10px, 20px, 30px); + power: math.pow(2, 3); +} + +// Color module +.color-test { + color: color.adjust(#036, $lightness: 20%); + background: color.scale(#036, $lightness: 50%); + border-color: color.change(#036, $alpha: 0.5); + mix: color.mix(#036, #f00, 50%); + invert: color.invert(#036); + complement: color.complement(#036); +} + +// String module +.string-test { + content: string.quote("hello"); + unquote: string.unquote('"hello"'); + length: string.length("hello"); + insert: string.insert("hello", "X", 3); + index: string.index("hello", "ll"); + slice: string.slice("hello", 2, 4); +} + +// List module +$my-list: (a, b, c); +.list-test { + length: list.length($my-list); + nth: list.nth($my-list, 2); + index: list.index($my-list, b); + append: list.append($my-list, d); + join: list.join($my-list, (x, y)); +} + +// Map module +$my-map: (key1: value1, key2: value2); +.map-test { + get: map.get($my-map, key1); + has-key: map.has-key($my-map, key1); + keys: map.keys($my-map); + values: map.values($my-map); + merge: map.merge($my-map, (key3: value3)); +} + +// Selector module +.selector-test { + is-superselector: selector.is-superselector(".foo", ".foo.bar"); + append: selector.append(".foo", ".bar"); + extend: selector.extend(".a", ".b", ".c"); +} + +// Meta module +.meta-test { + type: meta.type-of(10px); + unit: meta.unit(10px); + unitless: meta.unitless(10); + comparable: meta.comparable(10px, 10em); +} + + + + +``` + + +## AST + +``` +CssRoot { + bom_token: missing (optional), + items: CssRootItemList [ + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@0..342 "." [Comments("// Built-in SCSS modules"), Newline("\n"), Comments("// TODO(scss at-rules ..."), Newline("\n"), Comments("// TODO(scss at-rules ..."), Newline("\n"), Comments("// TODO(scss at-rules ..."), Newline("\n"), Comments("// TODO(scss at-rules ..."), Newline("\n"), Comments("// TODO(scss at-rules ..."), Newline("\n"), Comments("// TODO(scss at-rules ..."), Newline("\n"), Comments("// TODO(scss at-rules ..."), Newline("\n"), Newline("\n"), Comments("// Math module"), Newline("\n")] [], + name: CssCustomIdentifier { + value_token: IDENT@342..352 "math-test" [] [Whitespace(" ")], + }, + }, + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@352..353 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@353..361 "width" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@361..363 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@363..367 "math" [] [], + }, + dot_token: DOT@367..368 "." [] [], + member: CssIdentifier { + value_token: IDENT@368..371 "div" [] [], + }, + }, + l_paren_token: L_PAREN@371..372 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@372..375 "100" [] [], + unit_token: IDENT@375..377 "px" [] [], + }, + ], + }, + COMMA@377..379 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@379..380 "2" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@380..381 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@381..382 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@382..391 "height" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@391..393 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@393..397 "math" [] [], + }, + dot_token: DOT@397..398 "." [] [], + member: CssIdentifier { + value_token: IDENT@398..402 "ceil" [] [], + }, + }, + l_paren_token: L_PAREN@402..403 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@403..407 "10.3" [] [], + unit_token: IDENT@407..409 "px" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@409..410 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@410..411 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@411..421 "padding" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@421..423 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@423..427 "math" [] [], + }, + dot_token: DOT@427..428 "." [] [], + member: CssIdentifier { + value_token: IDENT@428..433 "floor" [] [], + }, + }, + l_paren_token: L_PAREN@433..434 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@434..438 "15.9" [] [], + unit_token: IDENT@438..440 "px" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@440..441 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@441..442 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@442..451 "margin" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@451..453 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@453..457 "math" [] [], + }, + dot_token: DOT@457..458 "." [] [], + member: CssIdentifier { + value_token: IDENT@458..463 "round" [] [], + }, + }, + l_paren_token: L_PAREN@463..464 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@464..468 "12.5" [] [], + unit_token: IDENT@468..470 "px" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@470..471 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@471..472 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@472..478 "max" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@478..480 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@480..484 "math" [] [], + }, + dot_token: DOT@484..485 "." [] [], + member: CssIdentifier { + value_token: IDENT@485..488 "max" [] [], + }, + }, + l_paren_token: L_PAREN@488..489 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@489..491 "10" [] [], + unit_token: IDENT@491..493 "px" [] [], + }, + ], + }, + COMMA@493..495 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@495..497 "20" [] [], + unit_token: IDENT@497..499 "px" [] [], + }, + ], + }, + COMMA@499..501 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@501..503 "30" [] [], + unit_token: IDENT@503..505 "px" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@505..506 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@506..507 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@507..513 "min" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@513..515 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@515..519 "math" [] [], + }, + dot_token: DOT@519..520 "." [] [], + member: CssIdentifier { + value_token: IDENT@520..523 "min" [] [], + }, + }, + l_paren_token: L_PAREN@523..524 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@524..526 "10" [] [], + unit_token: IDENT@526..528 "px" [] [], + }, + ], + }, + COMMA@528..530 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@530..532 "20" [] [], + unit_token: IDENT@532..534 "px" [] [], + }, + ], + }, + COMMA@534..536 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@536..538 "30" [] [], + unit_token: IDENT@538..540 "px" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@540..541 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@541..542 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@542..550 "power" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@550..552 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@552..556 "math" [] [], + }, + dot_token: DOT@556..557 "." [] [], + member: CssIdentifier { + value_token: IDENT@557..560 "pow" [] [], + }, + }, + l_paren_token: L_PAREN@560..561 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@561..562 "2" [] [], + }, + ], + }, + COMMA@562..564 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@564..565 "3" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@565..566 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@566..567 ";" [] [], + }, + ], + r_curly_token: R_CURLY@567..569 "}" [Newline("\n")] [], + }, + }, + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@569..588 "." [Newline("\n"), Newline("\n"), Comments("// Color module"), Newline("\n")] [], + name: CssCustomIdentifier { + value_token: IDENT@588..599 "color-test" [] [Whitespace(" ")], + }, + }, + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@599..600 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@600..608 "color" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@608..610 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@610..615 "color" [] [], + }, + dot_token: DOT@615..616 "." [] [], + member: CssIdentifier { + value_token: IDENT@616..622 "adjust" [] [], + }, + }, + l_paren_token: L_PAREN@622..623 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssColor { + hash_token: HASH@623..624 "#" [] [], + value_token: CSS_COLOR_LITERAL@624..627 "036" [] [], + }, + ], + }, + COMMA@627..629 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + ScssKeywordArgument { + name: ScssIdentifier { + dollar_token: DOLLAR@629..630 "$" [] [], + name: CssIdentifier { + value_token: IDENT@630..639 "lightness" [] [], + }, + }, + colon_token: COLON@639..641 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssPercentage { + value_token: CSS_NUMBER_LITERAL@641..643 "20" [] [], + percent_token: PERCENT@643..644 "%" [] [], + }, + ], + }, + }, + ], + }, + ], + r_paren_token: R_PAREN@644..645 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@645..646 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@646..659 "background" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@659..661 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@661..666 "color" [] [], + }, + dot_token: DOT@666..667 "." [] [], + member: CssIdentifier { + value_token: IDENT@667..672 "scale" [] [], + }, + }, + l_paren_token: L_PAREN@672..673 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssColor { + hash_token: HASH@673..674 "#" [] [], + value_token: CSS_COLOR_LITERAL@674..677 "036" [] [], + }, + ], + }, + COMMA@677..679 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + ScssKeywordArgument { + name: ScssIdentifier { + dollar_token: DOLLAR@679..680 "$" [] [], + name: CssIdentifier { + value_token: IDENT@680..689 "lightness" [] [], + }, + }, + colon_token: COLON@689..691 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssPercentage { + value_token: CSS_NUMBER_LITERAL@691..693 "50" [] [], + percent_token: PERCENT@693..694 "%" [] [], + }, + ], + }, + }, + ], + }, + ], + r_paren_token: R_PAREN@694..695 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@695..696 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@696..711 "border-color" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@711..713 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@713..718 "color" [] [], + }, + dot_token: DOT@718..719 "." [] [], + member: CssIdentifier { + value_token: IDENT@719..725 "change" [] [], + }, + }, + l_paren_token: L_PAREN@725..726 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssColor { + hash_token: HASH@726..727 "#" [] [], + value_token: CSS_COLOR_LITERAL@727..730 "036" [] [], + }, + ], + }, + COMMA@730..732 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + ScssKeywordArgument { + name: ScssIdentifier { + dollar_token: DOLLAR@732..733 "$" [] [], + name: CssIdentifier { + value_token: IDENT@733..738 "alpha" [] [], + }, + }, + colon_token: COLON@738..740 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@740..743 "0.5" [] [], + }, + ], + }, + }, + ], + }, + ], + r_paren_token: R_PAREN@743..744 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@744..745 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@745..751 "mix" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@751..753 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@753..758 "color" [] [], + }, + dot_token: DOT@758..759 "." [] [], + member: CssIdentifier { + value_token: IDENT@759..762 "mix" [] [], + }, + }, + l_paren_token: L_PAREN@762..763 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssColor { + hash_token: HASH@763..764 "#" [] [], + value_token: CSS_COLOR_LITERAL@764..767 "036" [] [], + }, + ], + }, + COMMA@767..769 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssColor { + hash_token: HASH@769..770 "#" [] [], + value_token: CSS_COLOR_LITERAL@770..773 "f00" [] [], + }, + ], + }, + COMMA@773..775 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssPercentage { + value_token: CSS_NUMBER_LITERAL@775..777 "50" [] [], + percent_token: PERCENT@777..778 "%" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@778..779 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@779..780 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@780..789 "invert" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@789..791 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@791..796 "color" [] [], + }, + dot_token: DOT@796..797 "." [] [], + member: CssIdentifier { + value_token: IDENT@797..803 "invert" [] [], + }, + }, + l_paren_token: L_PAREN@803..804 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssColor { + hash_token: HASH@804..805 "#" [] [], + value_token: CSS_COLOR_LITERAL@805..808 "036" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@808..809 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@809..810 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@810..823 "complement" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@823..825 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@825..830 "color" [] [], + }, + dot_token: DOT@830..831 "." [] [], + member: CssIdentifier { + value_token: IDENT@831..841 "complement" [] [], + }, + }, + l_paren_token: L_PAREN@841..842 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssColor { + hash_token: HASH@842..843 "#" [] [], + value_token: CSS_COLOR_LITERAL@843..846 "036" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@846..847 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@847..848 ";" [] [], + }, + ], + r_curly_token: R_CURLY@848..850 "}" [Newline("\n")] [], + }, + }, + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@850..870 "." [Newline("\n"), Newline("\n"), Comments("// String module"), Newline("\n")] [], + name: CssCustomIdentifier { + value_token: IDENT@870..882 "string-test" [] [Whitespace(" ")], + }, + }, + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@882..883 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@883..893 "content" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@893..895 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@895..901 "string" [] [], + }, + dot_token: DOT@901..902 "." [] [], + member: CssIdentifier { + value_token: IDENT@902..907 "quote" [] [], + }, + }, + l_paren_token: L_PAREN@907..908 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@908..915 "\"hello\"" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@915..916 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@916..917 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@917..927 "unquote" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@927..929 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@929..935 "string" [] [], + }, + dot_token: DOT@935..936 "." [] [], + member: CssIdentifier { + value_token: IDENT@936..943 "unquote" [] [], + }, + }, + l_paren_token: L_PAREN@943..944 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@944..953 "'\"hello\"'" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@953..954 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@954..955 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@955..964 "length" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@964..966 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@966..972 "string" [] [], + }, + dot_token: DOT@972..973 "." [] [], + member: CssIdentifier { + value_token: IDENT@973..979 "length" [] [], + }, + }, + l_paren_token: L_PAREN@979..980 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@980..987 "\"hello\"" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@987..988 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@988..989 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@989..998 "insert" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@998..1000 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@1000..1006 "string" [] [], + }, + dot_token: DOT@1006..1007 "." [] [], + member: CssIdentifier { + value_token: IDENT@1007..1013 "insert" [] [], + }, + }, + l_paren_token: L_PAREN@1013..1014 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@1014..1021 "\"hello\"" [] [], + }, + ], + }, + COMMA@1021..1023 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@1023..1026 "\"X\"" [] [], + }, + ], + }, + COMMA@1026..1028 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@1028..1029 "3" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@1029..1030 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1030..1031 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1031..1039 "index" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@1039..1041 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@1041..1047 "string" [] [], + }, + dot_token: DOT@1047..1048 "." [] [], + member: CssIdentifier { + value_token: IDENT@1048..1053 "index" [] [], + }, + }, + l_paren_token: L_PAREN@1053..1054 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@1054..1061 "\"hello\"" [] [], + }, + ], + }, + COMMA@1061..1063 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@1063..1067 "\"ll\"" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@1067..1068 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1068..1069 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1069..1077 "slice" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@1077..1079 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@1079..1085 "string" [] [], + }, + dot_token: DOT@1085..1086 "." [] [], + member: CssIdentifier { + value_token: IDENT@1086..1091 "slice" [] [], + }, + }, + l_paren_token: L_PAREN@1091..1092 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@1092..1099 "\"hello\"" [] [], + }, + ], + }, + COMMA@1099..1101 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@1101..1102 "2" [] [], + }, + ], + }, + COMMA@1102..1104 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@1104..1105 "4" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@1105..1106 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1106..1107 ";" [] [], + }, + ], + r_curly_token: R_CURLY@1107..1109 "}" [Newline("\n")] [], + }, + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@1109..1127 "$" [Newline("\n"), Newline("\n"), Comments("// List module"), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@1127..1134 "my-list" [] [], + }, + }, + colon_token: COLON@1134..1136 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@1136..1137 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1137..1138 "a" [] [], + }, + ], + }, + }, + COMMA@1138..1140 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1140..1141 "b" [] [], + }, + ], + }, + }, + COMMA@1141..1143 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1143..1144 "c" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@1144..1145 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@1145..1146 ";" [] [], + }, + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@1146..1148 "." [Newline("\n")] [], + name: CssCustomIdentifier { + value_token: IDENT@1148..1158 "list-test" [] [Whitespace(" ")], + }, + }, + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@1158..1159 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1159..1168 "length" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@1168..1170 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@1170..1174 "list" [] [], + }, + dot_token: DOT@1174..1175 "." [] [], + member: CssIdentifier { + value_token: IDENT@1175..1181 "length" [] [], + }, + }, + l_paren_token: L_PAREN@1181..1182 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssIdentifier { + dollar_token: DOLLAR@1182..1183 "$" [] [], + name: CssIdentifier { + value_token: IDENT@1183..1190 "my-list" [] [], + }, + }, + ], + }, + ], + r_paren_token: R_PAREN@1190..1191 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1191..1192 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1192..1198 "nth" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@1198..1200 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@1200..1204 "list" [] [], + }, + dot_token: DOT@1204..1205 "." [] [], + member: CssIdentifier { + value_token: IDENT@1205..1208 "nth" [] [], + }, + }, + l_paren_token: L_PAREN@1208..1209 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssIdentifier { + dollar_token: DOLLAR@1209..1210 "$" [] [], + name: CssIdentifier { + value_token: IDENT@1210..1217 "my-list" [] [], + }, + }, + ], + }, + COMMA@1217..1219 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@1219..1220 "2" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@1220..1221 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1221..1222 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1222..1230 "index" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@1230..1232 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@1232..1236 "list" [] [], + }, + dot_token: DOT@1236..1237 "." [] [], + member: CssIdentifier { + value_token: IDENT@1237..1242 "index" [] [], + }, + }, + l_paren_token: L_PAREN@1242..1243 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssIdentifier { + dollar_token: DOLLAR@1243..1244 "$" [] [], + name: CssIdentifier { + value_token: IDENT@1244..1251 "my-list" [] [], + }, + }, + ], + }, + COMMA@1251..1253 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1253..1254 "b" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@1254..1255 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1255..1256 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1256..1265 "append" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@1265..1267 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@1267..1271 "list" [] [], + }, + dot_token: DOT@1271..1272 "." [] [], + member: CssIdentifier { + value_token: IDENT@1272..1278 "append" [] [], + }, + }, + l_paren_token: L_PAREN@1278..1279 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssIdentifier { + dollar_token: DOLLAR@1279..1280 "$" [] [], + name: CssIdentifier { + value_token: IDENT@1280..1287 "my-list" [] [], + }, + }, + ], + }, + COMMA@1287..1289 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1289..1290 "d" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@1290..1291 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1291..1292 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1292..1299 "join" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@1299..1301 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@1301..1305 "list" [] [], + }, + dot_token: DOT@1305..1306 "." [] [], + member: CssIdentifier { + value_token: IDENT@1306..1310 "join" [] [], + }, + }, + l_paren_token: L_PAREN@1310..1311 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssIdentifier { + dollar_token: DOLLAR@1311..1312 "$" [] [], + name: CssIdentifier { + value_token: IDENT@1312..1319 "my-list" [] [], + }, + }, + ], + }, + COMMA@1319..1321 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@1321..1322 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1322..1323 "x" [] [], + }, + ], + }, + }, + COMMA@1323..1325 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1325..1326 "y" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@1326..1327 ")" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@1327..1328 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1328..1329 ";" [] [], + }, + ], + r_curly_token: R_CURLY@1329..1331 "}" [Newline("\n")] [], + }, + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@1331..1348 "$" [Newline("\n"), Newline("\n"), Comments("// Map module"), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@1348..1354 "my-map" [] [], + }, + }, + colon_token: COLON@1354..1356 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@1356..1357 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1357..1361 "key1" [] [], + }, + ], + }, + colon_token: COLON@1361..1363 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1363..1369 "value1" [] [], + }, + ], + }, + }, + COMMA@1369..1371 "," [] [Whitespace(" ")], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1371..1375 "key2" [] [], + }, + ], + }, + colon_token: COLON@1375..1377 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1377..1383 "value2" [] [], + }, + ], + }, + }, + ], + r_paren_token: R_PAREN@1383..1384 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@1384..1385 ";" [] [], + }, + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@1385..1387 "." [Newline("\n")] [], + name: CssCustomIdentifier { + value_token: IDENT@1387..1396 "map-test" [] [Whitespace(" ")], + }, + }, + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@1396..1397 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1397..1403 "get" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@1403..1405 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@1405..1408 "map" [] [], + }, + dot_token: DOT@1408..1409 "." [] [], + member: CssIdentifier { + value_token: IDENT@1409..1412 "get" [] [], + }, + }, + l_paren_token: L_PAREN@1412..1413 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssIdentifier { + dollar_token: DOLLAR@1413..1414 "$" [] [], + name: CssIdentifier { + value_token: IDENT@1414..1420 "my-map" [] [], + }, + }, + ], + }, + COMMA@1420..1422 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1422..1426 "key1" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@1426..1427 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1427..1428 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1428..1438 "has-key" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@1438..1440 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@1440..1443 "map" [] [], + }, + dot_token: DOT@1443..1444 "." [] [], + member: CssIdentifier { + value_token: IDENT@1444..1451 "has-key" [] [], + }, + }, + l_paren_token: L_PAREN@1451..1452 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssIdentifier { + dollar_token: DOLLAR@1452..1453 "$" [] [], + name: CssIdentifier { + value_token: IDENT@1453..1459 "my-map" [] [], + }, + }, + ], + }, + COMMA@1459..1461 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1461..1465 "key1" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@1465..1466 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1466..1467 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1467..1474 "keys" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@1474..1476 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@1476..1479 "map" [] [], + }, + dot_token: DOT@1479..1480 "." [] [], + member: CssIdentifier { + value_token: IDENT@1480..1484 "keys" [] [], + }, + }, + l_paren_token: L_PAREN@1484..1485 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssIdentifier { + dollar_token: DOLLAR@1485..1486 "$" [] [], + name: CssIdentifier { + value_token: IDENT@1486..1492 "my-map" [] [], + }, + }, + ], + }, + ], + r_paren_token: R_PAREN@1492..1493 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1493..1494 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1494..1503 "values" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@1503..1505 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@1505..1508 "map" [] [], + }, + dot_token: DOT@1508..1509 "." [] [], + member: CssIdentifier { + value_token: IDENT@1509..1515 "values" [] [], + }, + }, + l_paren_token: L_PAREN@1515..1516 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssIdentifier { + dollar_token: DOLLAR@1516..1517 "$" [] [], + name: CssIdentifier { + value_token: IDENT@1517..1523 "my-map" [] [], + }, + }, + ], + }, + ], + r_paren_token: R_PAREN@1523..1524 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1524..1525 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1525..1533 "merge" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@1533..1535 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@1535..1538 "map" [] [], + }, + dot_token: DOT@1538..1539 "." [] [], + member: CssIdentifier { + value_token: IDENT@1539..1544 "merge" [] [], + }, + }, + l_paren_token: L_PAREN@1544..1545 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssIdentifier { + dollar_token: DOLLAR@1545..1546 "$" [] [], + name: CssIdentifier { + value_token: IDENT@1546..1552 "my-map" [] [], + }, + }, + ], + }, + COMMA@1552..1554 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@1554..1555 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1555..1559 "key3" [] [], + }, + ], + }, + colon_token: COLON@1559..1561 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1561..1567 "value3" [] [], + }, + ], + }, + }, + ], + r_paren_token: R_PAREN@1567..1568 ")" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@1568..1569 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1569..1570 ";" [] [], + }, + ], + r_curly_token: R_CURLY@1570..1572 "}" [Newline("\n")] [], + }, + }, + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@1572..1594 "." [Newline("\n"), Newline("\n"), Comments("// Selector module"), Newline("\n")] [], + name: CssCustomIdentifier { + value_token: IDENT@1594..1608 "selector-test" [] [Whitespace(" ")], + }, + }, + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@1608..1609 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1609..1628 "is-superselector" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@1628..1630 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@1630..1638 "selector" [] [], + }, + dot_token: DOT@1638..1639 "." [] [], + member: CssIdentifier { + value_token: IDENT@1639..1655 "is-superselector" [] [], + }, + }, + l_paren_token: L_PAREN@1655..1656 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@1656..1662 "\".foo\"" [] [], + }, + ], + }, + COMMA@1662..1664 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@1664..1674 "\".foo.bar\"" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@1674..1675 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1675..1676 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1676..1685 "append" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@1685..1687 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@1687..1695 "selector" [] [], + }, + dot_token: DOT@1695..1696 "." [] [], + member: CssIdentifier { + value_token: IDENT@1696..1702 "append" [] [], + }, + }, + l_paren_token: L_PAREN@1702..1703 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@1703..1709 "\".foo\"" [] [], + }, + ], + }, + COMMA@1709..1711 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@1711..1717 "\".bar\"" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@1717..1718 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1718..1719 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1719..1728 "extend" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@1728..1730 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@1730..1738 "selector" [] [], + }, + dot_token: DOT@1738..1739 "." [] [], + member: CssIdentifier { + value_token: IDENT@1739..1745 "extend" [] [], + }, + }, + l_paren_token: L_PAREN@1745..1746 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@1746..1750 "\".a\"" [] [], + }, + ], + }, + COMMA@1750..1752 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@1752..1756 "\".b\"" [] [], + }, + ], + }, + COMMA@1756..1758 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@1758..1762 "\".c\"" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@1762..1763 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1763..1764 ";" [] [], + }, + ], + r_curly_token: R_CURLY@1764..1766 "}" [Newline("\n")] [], + }, + }, + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@1766..1784 "." [Newline("\n"), Newline("\n"), Comments("// Meta module"), Newline("\n")] [], + name: CssCustomIdentifier { + value_token: IDENT@1784..1794 "meta-test" [] [Whitespace(" ")], + }, + }, + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@1794..1795 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1795..1802 "type" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@1802..1804 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@1804..1808 "meta" [] [], + }, + dot_token: DOT@1808..1809 "." [] [], + member: CssIdentifier { + value_token: IDENT@1809..1816 "type-of" [] [], + }, + }, + l_paren_token: L_PAREN@1816..1817 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@1817..1819 "10" [] [], + unit_token: IDENT@1819..1821 "px" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@1821..1822 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1822..1823 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1823..1830 "unit" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@1830..1832 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@1832..1836 "meta" [] [], + }, + dot_token: DOT@1836..1837 "." [] [], + member: CssIdentifier { + value_token: IDENT@1837..1841 "unit" [] [], + }, + }, + l_paren_token: L_PAREN@1841..1842 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@1842..1844 "10" [] [], + unit_token: IDENT@1844..1846 "px" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@1846..1847 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1847..1848 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1848..1859 "unitless" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@1859..1861 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@1861..1865 "meta" [] [], + }, + dot_token: DOT@1865..1866 "." [] [], + member: CssIdentifier { + value_token: IDENT@1866..1874 "unitless" [] [], + }, + }, + l_paren_token: L_PAREN@1874..1875 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@1875..1877 "10" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@1877..1878 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1878..1879 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1879..1892 "comparable" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@1892..1894 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@1894..1898 "meta" [] [], + }, + dot_token: DOT@1898..1899 "." [] [], + member: CssIdentifier { + value_token: IDENT@1899..1909 "comparable" [] [], + }, + }, + l_paren_token: L_PAREN@1909..1910 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@1910..1912 "10" [] [], + unit_token: IDENT@1912..1914 "px" [] [], + }, + ], + }, + COMMA@1914..1916 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@1916..1918 "10" [] [], + unit_token: IDENT@1918..1920 "em" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@1920..1921 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1921..1922 ";" [] [], + }, + ], + r_curly_token: R_CURLY@1922..1924 "}" [Newline("\n")] [], + }, + }, + ], + eof_token: EOF@1924..1928 "" [Newline("\n"), Newline("\n"), Newline("\n"), Newline("\n")] [], +} +``` + +## CST + +``` +0: CSS_ROOT@0..1928 + 0: (empty) + 1: CSS_ROOT_ITEM_LIST@0..1924 + 0: CSS_QUALIFIED_RULE@0..569 + 0: CSS_SELECTOR_LIST@0..352 + 0: CSS_COMPOUND_SELECTOR@0..352 + 0: CSS_NESTED_SELECTOR_LIST@0..0 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@0..352 + 0: CSS_CLASS_SELECTOR@0..352 + 0: DOT@0..342 "." [Comments("// Built-in SCSS modules"), Newline("\n"), Comments("// TODO(scss at-rules ..."), Newline("\n"), Comments("// TODO(scss at-rules ..."), Newline("\n"), Comments("// TODO(scss at-rules ..."), Newline("\n"), Comments("// TODO(scss at-rules ..."), Newline("\n"), Comments("// TODO(scss at-rules ..."), Newline("\n"), Comments("// TODO(scss at-rules ..."), Newline("\n"), Comments("// TODO(scss at-rules ..."), Newline("\n"), Newline("\n"), Comments("// Math module"), Newline("\n")] [] + 1: CSS_CUSTOM_IDENTIFIER@342..352 + 0: IDENT@342..352 "math-test" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@352..569 + 0: L_CURLY@352..353 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@353..567 + 0: CSS_DECLARATION_WITH_SEMICOLON@353..382 + 0: CSS_DECLARATION@353..381 + 0: CSS_GENERIC_PROPERTY@353..381 + 0: CSS_IDENTIFIER@353..361 + 0: IDENT@353..361 "width" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@361..363 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@363..381 + 0: SCSS_EXPRESSION_ITEM_LIST@363..381 + 0: CSS_FUNCTION@363..381 + 0: SCSS_QUALIFIED_NAME@363..371 + 0: CSS_IDENTIFIER@363..367 + 0: IDENT@363..367 "math" [] [] + 1: DOT@367..368 "." [] [] + 2: CSS_IDENTIFIER@368..371 + 0: IDENT@368..371 "div" [] [] + 1: L_PAREN@371..372 "(" [] [] + 2: CSS_PARAMETER_LIST@372..380 + 0: SCSS_EXPRESSION@372..377 + 0: SCSS_EXPRESSION_ITEM_LIST@372..377 + 0: CSS_REGULAR_DIMENSION@372..377 + 0: CSS_NUMBER_LITERAL@372..375 "100" [] [] + 1: IDENT@375..377 "px" [] [] + 1: COMMA@377..379 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@379..380 + 0: SCSS_EXPRESSION_ITEM_LIST@379..380 + 0: CSS_NUMBER@379..380 + 0: CSS_NUMBER_LITERAL@379..380 "2" [] [] + 3: R_PAREN@380..381 ")" [] [] + 1: (empty) + 1: SEMICOLON@381..382 ";" [] [] + 1: CSS_DECLARATION_WITH_SEMICOLON@382..411 + 0: CSS_DECLARATION@382..410 + 0: CSS_GENERIC_PROPERTY@382..410 + 0: CSS_IDENTIFIER@382..391 + 0: IDENT@382..391 "height" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@391..393 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@393..410 + 0: SCSS_EXPRESSION_ITEM_LIST@393..410 + 0: CSS_FUNCTION@393..410 + 0: SCSS_QUALIFIED_NAME@393..402 + 0: CSS_IDENTIFIER@393..397 + 0: IDENT@393..397 "math" [] [] + 1: DOT@397..398 "." [] [] + 2: CSS_IDENTIFIER@398..402 + 0: IDENT@398..402 "ceil" [] [] + 1: L_PAREN@402..403 "(" [] [] + 2: CSS_PARAMETER_LIST@403..409 + 0: SCSS_EXPRESSION@403..409 + 0: SCSS_EXPRESSION_ITEM_LIST@403..409 + 0: CSS_REGULAR_DIMENSION@403..409 + 0: CSS_NUMBER_LITERAL@403..407 "10.3" [] [] + 1: IDENT@407..409 "px" [] [] + 3: R_PAREN@409..410 ")" [] [] + 1: (empty) + 1: SEMICOLON@410..411 ";" [] [] + 2: CSS_DECLARATION_WITH_SEMICOLON@411..442 + 0: CSS_DECLARATION@411..441 + 0: CSS_GENERIC_PROPERTY@411..441 + 0: CSS_IDENTIFIER@411..421 + 0: IDENT@411..421 "padding" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@421..423 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@423..441 + 0: SCSS_EXPRESSION_ITEM_LIST@423..441 + 0: CSS_FUNCTION@423..441 + 0: SCSS_QUALIFIED_NAME@423..433 + 0: CSS_IDENTIFIER@423..427 + 0: IDENT@423..427 "math" [] [] + 1: DOT@427..428 "." [] [] + 2: CSS_IDENTIFIER@428..433 + 0: IDENT@428..433 "floor" [] [] + 1: L_PAREN@433..434 "(" [] [] + 2: CSS_PARAMETER_LIST@434..440 + 0: SCSS_EXPRESSION@434..440 + 0: SCSS_EXPRESSION_ITEM_LIST@434..440 + 0: CSS_REGULAR_DIMENSION@434..440 + 0: CSS_NUMBER_LITERAL@434..438 "15.9" [] [] + 1: IDENT@438..440 "px" [] [] + 3: R_PAREN@440..441 ")" [] [] + 1: (empty) + 1: SEMICOLON@441..442 ";" [] [] + 3: CSS_DECLARATION_WITH_SEMICOLON@442..472 + 0: CSS_DECLARATION@442..471 + 0: CSS_GENERIC_PROPERTY@442..471 + 0: CSS_IDENTIFIER@442..451 + 0: IDENT@442..451 "margin" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@451..453 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@453..471 + 0: SCSS_EXPRESSION_ITEM_LIST@453..471 + 0: CSS_FUNCTION@453..471 + 0: SCSS_QUALIFIED_NAME@453..463 + 0: CSS_IDENTIFIER@453..457 + 0: IDENT@453..457 "math" [] [] + 1: DOT@457..458 "." [] [] + 2: CSS_IDENTIFIER@458..463 + 0: IDENT@458..463 "round" [] [] + 1: L_PAREN@463..464 "(" [] [] + 2: CSS_PARAMETER_LIST@464..470 + 0: SCSS_EXPRESSION@464..470 + 0: SCSS_EXPRESSION_ITEM_LIST@464..470 + 0: CSS_REGULAR_DIMENSION@464..470 + 0: CSS_NUMBER_LITERAL@464..468 "12.5" [] [] + 1: IDENT@468..470 "px" [] [] + 3: R_PAREN@470..471 ")" [] [] + 1: (empty) + 1: SEMICOLON@471..472 ";" [] [] + 4: CSS_DECLARATION_WITH_SEMICOLON@472..507 + 0: CSS_DECLARATION@472..506 + 0: CSS_GENERIC_PROPERTY@472..506 + 0: CSS_IDENTIFIER@472..478 + 0: IDENT@472..478 "max" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@478..480 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@480..506 + 0: SCSS_EXPRESSION_ITEM_LIST@480..506 + 0: CSS_FUNCTION@480..506 + 0: SCSS_QUALIFIED_NAME@480..488 + 0: CSS_IDENTIFIER@480..484 + 0: IDENT@480..484 "math" [] [] + 1: DOT@484..485 "." [] [] + 2: CSS_IDENTIFIER@485..488 + 0: IDENT@485..488 "max" [] [] + 1: L_PAREN@488..489 "(" [] [] + 2: CSS_PARAMETER_LIST@489..505 + 0: SCSS_EXPRESSION@489..493 + 0: SCSS_EXPRESSION_ITEM_LIST@489..493 + 0: CSS_REGULAR_DIMENSION@489..493 + 0: CSS_NUMBER_LITERAL@489..491 "10" [] [] + 1: IDENT@491..493 "px" [] [] + 1: COMMA@493..495 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@495..499 + 0: SCSS_EXPRESSION_ITEM_LIST@495..499 + 0: CSS_REGULAR_DIMENSION@495..499 + 0: CSS_NUMBER_LITERAL@495..497 "20" [] [] + 1: IDENT@497..499 "px" [] [] + 3: COMMA@499..501 "," [] [Whitespace(" ")] + 4: SCSS_EXPRESSION@501..505 + 0: SCSS_EXPRESSION_ITEM_LIST@501..505 + 0: CSS_REGULAR_DIMENSION@501..505 + 0: CSS_NUMBER_LITERAL@501..503 "30" [] [] + 1: IDENT@503..505 "px" [] [] + 3: R_PAREN@505..506 ")" [] [] + 1: (empty) + 1: SEMICOLON@506..507 ";" [] [] + 5: CSS_DECLARATION_WITH_SEMICOLON@507..542 + 0: CSS_DECLARATION@507..541 + 0: CSS_GENERIC_PROPERTY@507..541 + 0: CSS_IDENTIFIER@507..513 + 0: IDENT@507..513 "min" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@513..515 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@515..541 + 0: SCSS_EXPRESSION_ITEM_LIST@515..541 + 0: CSS_FUNCTION@515..541 + 0: SCSS_QUALIFIED_NAME@515..523 + 0: CSS_IDENTIFIER@515..519 + 0: IDENT@515..519 "math" [] [] + 1: DOT@519..520 "." [] [] + 2: CSS_IDENTIFIER@520..523 + 0: IDENT@520..523 "min" [] [] + 1: L_PAREN@523..524 "(" [] [] + 2: CSS_PARAMETER_LIST@524..540 + 0: SCSS_EXPRESSION@524..528 + 0: SCSS_EXPRESSION_ITEM_LIST@524..528 + 0: CSS_REGULAR_DIMENSION@524..528 + 0: CSS_NUMBER_LITERAL@524..526 "10" [] [] + 1: IDENT@526..528 "px" [] [] + 1: COMMA@528..530 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@530..534 + 0: SCSS_EXPRESSION_ITEM_LIST@530..534 + 0: CSS_REGULAR_DIMENSION@530..534 + 0: CSS_NUMBER_LITERAL@530..532 "20" [] [] + 1: IDENT@532..534 "px" [] [] + 3: COMMA@534..536 "," [] [Whitespace(" ")] + 4: SCSS_EXPRESSION@536..540 + 0: SCSS_EXPRESSION_ITEM_LIST@536..540 + 0: CSS_REGULAR_DIMENSION@536..540 + 0: CSS_NUMBER_LITERAL@536..538 "30" [] [] + 1: IDENT@538..540 "px" [] [] + 3: R_PAREN@540..541 ")" [] [] + 1: (empty) + 1: SEMICOLON@541..542 ";" [] [] + 6: CSS_DECLARATION_WITH_SEMICOLON@542..567 + 0: CSS_DECLARATION@542..566 + 0: CSS_GENERIC_PROPERTY@542..566 + 0: CSS_IDENTIFIER@542..550 + 0: IDENT@542..550 "power" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@550..552 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@552..566 + 0: SCSS_EXPRESSION_ITEM_LIST@552..566 + 0: CSS_FUNCTION@552..566 + 0: SCSS_QUALIFIED_NAME@552..560 + 0: CSS_IDENTIFIER@552..556 + 0: IDENT@552..556 "math" [] [] + 1: DOT@556..557 "." [] [] + 2: CSS_IDENTIFIER@557..560 + 0: IDENT@557..560 "pow" [] [] + 1: L_PAREN@560..561 "(" [] [] + 2: CSS_PARAMETER_LIST@561..565 + 0: SCSS_EXPRESSION@561..562 + 0: SCSS_EXPRESSION_ITEM_LIST@561..562 + 0: CSS_NUMBER@561..562 + 0: CSS_NUMBER_LITERAL@561..562 "2" [] [] + 1: COMMA@562..564 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@564..565 + 0: SCSS_EXPRESSION_ITEM_LIST@564..565 + 0: CSS_NUMBER@564..565 + 0: CSS_NUMBER_LITERAL@564..565 "3" [] [] + 3: R_PAREN@565..566 ")" [] [] + 1: (empty) + 1: SEMICOLON@566..567 ";" [] [] + 2: R_CURLY@567..569 "}" [Newline("\n")] [] + 1: CSS_QUALIFIED_RULE@569..850 + 0: CSS_SELECTOR_LIST@569..599 + 0: CSS_COMPOUND_SELECTOR@569..599 + 0: CSS_NESTED_SELECTOR_LIST@569..569 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@569..599 + 0: CSS_CLASS_SELECTOR@569..599 + 0: DOT@569..588 "." [Newline("\n"), Newline("\n"), Comments("// Color module"), Newline("\n")] [] + 1: CSS_CUSTOM_IDENTIFIER@588..599 + 0: IDENT@588..599 "color-test" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@599..850 + 0: L_CURLY@599..600 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@600..848 + 0: CSS_DECLARATION_WITH_SEMICOLON@600..646 + 0: CSS_DECLARATION@600..645 + 0: CSS_GENERIC_PROPERTY@600..645 + 0: CSS_IDENTIFIER@600..608 + 0: IDENT@600..608 "color" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@608..610 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@610..645 + 0: SCSS_EXPRESSION_ITEM_LIST@610..645 + 0: CSS_FUNCTION@610..645 + 0: SCSS_QUALIFIED_NAME@610..622 + 0: CSS_IDENTIFIER@610..615 + 0: IDENT@610..615 "color" [] [] + 1: DOT@615..616 "." [] [] + 2: CSS_IDENTIFIER@616..622 + 0: IDENT@616..622 "adjust" [] [] + 1: L_PAREN@622..623 "(" [] [] + 2: CSS_PARAMETER_LIST@623..644 + 0: SCSS_EXPRESSION@623..627 + 0: SCSS_EXPRESSION_ITEM_LIST@623..627 + 0: CSS_COLOR@623..627 + 0: HASH@623..624 "#" [] [] + 1: CSS_COLOR_LITERAL@624..627 "036" [] [] + 1: COMMA@627..629 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@629..644 + 0: SCSS_EXPRESSION_ITEM_LIST@629..644 + 0: SCSS_KEYWORD_ARGUMENT@629..644 + 0: SCSS_IDENTIFIER@629..639 + 0: DOLLAR@629..630 "$" [] [] + 1: CSS_IDENTIFIER@630..639 + 0: IDENT@630..639 "lightness" [] [] + 1: COLON@639..641 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@641..644 + 0: SCSS_EXPRESSION_ITEM_LIST@641..644 + 0: CSS_PERCENTAGE@641..644 + 0: CSS_NUMBER_LITERAL@641..643 "20" [] [] + 1: PERCENT@643..644 "%" [] [] + 3: R_PAREN@644..645 ")" [] [] + 1: (empty) + 1: SEMICOLON@645..646 ";" [] [] + 1: CSS_DECLARATION_WITH_SEMICOLON@646..696 + 0: CSS_DECLARATION@646..695 + 0: CSS_GENERIC_PROPERTY@646..695 + 0: CSS_IDENTIFIER@646..659 + 0: IDENT@646..659 "background" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@659..661 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@661..695 + 0: SCSS_EXPRESSION_ITEM_LIST@661..695 + 0: CSS_FUNCTION@661..695 + 0: SCSS_QUALIFIED_NAME@661..672 + 0: CSS_IDENTIFIER@661..666 + 0: IDENT@661..666 "color" [] [] + 1: DOT@666..667 "." [] [] + 2: CSS_IDENTIFIER@667..672 + 0: IDENT@667..672 "scale" [] [] + 1: L_PAREN@672..673 "(" [] [] + 2: CSS_PARAMETER_LIST@673..694 + 0: SCSS_EXPRESSION@673..677 + 0: SCSS_EXPRESSION_ITEM_LIST@673..677 + 0: CSS_COLOR@673..677 + 0: HASH@673..674 "#" [] [] + 1: CSS_COLOR_LITERAL@674..677 "036" [] [] + 1: COMMA@677..679 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@679..694 + 0: SCSS_EXPRESSION_ITEM_LIST@679..694 + 0: SCSS_KEYWORD_ARGUMENT@679..694 + 0: SCSS_IDENTIFIER@679..689 + 0: DOLLAR@679..680 "$" [] [] + 1: CSS_IDENTIFIER@680..689 + 0: IDENT@680..689 "lightness" [] [] + 1: COLON@689..691 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@691..694 + 0: SCSS_EXPRESSION_ITEM_LIST@691..694 + 0: CSS_PERCENTAGE@691..694 + 0: CSS_NUMBER_LITERAL@691..693 "50" [] [] + 1: PERCENT@693..694 "%" [] [] + 3: R_PAREN@694..695 ")" [] [] + 1: (empty) + 1: SEMICOLON@695..696 ";" [] [] + 2: CSS_DECLARATION_WITH_SEMICOLON@696..745 + 0: CSS_DECLARATION@696..744 + 0: CSS_GENERIC_PROPERTY@696..744 + 0: CSS_IDENTIFIER@696..711 + 0: IDENT@696..711 "border-color" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@711..713 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@713..744 + 0: SCSS_EXPRESSION_ITEM_LIST@713..744 + 0: CSS_FUNCTION@713..744 + 0: SCSS_QUALIFIED_NAME@713..725 + 0: CSS_IDENTIFIER@713..718 + 0: IDENT@713..718 "color" [] [] + 1: DOT@718..719 "." [] [] + 2: CSS_IDENTIFIER@719..725 + 0: IDENT@719..725 "change" [] [] + 1: L_PAREN@725..726 "(" [] [] + 2: CSS_PARAMETER_LIST@726..743 + 0: SCSS_EXPRESSION@726..730 + 0: SCSS_EXPRESSION_ITEM_LIST@726..730 + 0: CSS_COLOR@726..730 + 0: HASH@726..727 "#" [] [] + 1: CSS_COLOR_LITERAL@727..730 "036" [] [] + 1: COMMA@730..732 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@732..743 + 0: SCSS_EXPRESSION_ITEM_LIST@732..743 + 0: SCSS_KEYWORD_ARGUMENT@732..743 + 0: SCSS_IDENTIFIER@732..738 + 0: DOLLAR@732..733 "$" [] [] + 1: CSS_IDENTIFIER@733..738 + 0: IDENT@733..738 "alpha" [] [] + 1: COLON@738..740 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@740..743 + 0: SCSS_EXPRESSION_ITEM_LIST@740..743 + 0: CSS_NUMBER@740..743 + 0: CSS_NUMBER_LITERAL@740..743 "0.5" [] [] + 3: R_PAREN@743..744 ")" [] [] + 1: (empty) + 1: SEMICOLON@744..745 ";" [] [] + 3: CSS_DECLARATION_WITH_SEMICOLON@745..780 + 0: CSS_DECLARATION@745..779 + 0: CSS_GENERIC_PROPERTY@745..779 + 0: CSS_IDENTIFIER@745..751 + 0: IDENT@745..751 "mix" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@751..753 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@753..779 + 0: SCSS_EXPRESSION_ITEM_LIST@753..779 + 0: CSS_FUNCTION@753..779 + 0: SCSS_QUALIFIED_NAME@753..762 + 0: CSS_IDENTIFIER@753..758 + 0: IDENT@753..758 "color" [] [] + 1: DOT@758..759 "." [] [] + 2: CSS_IDENTIFIER@759..762 + 0: IDENT@759..762 "mix" [] [] + 1: L_PAREN@762..763 "(" [] [] + 2: CSS_PARAMETER_LIST@763..778 + 0: SCSS_EXPRESSION@763..767 + 0: SCSS_EXPRESSION_ITEM_LIST@763..767 + 0: CSS_COLOR@763..767 + 0: HASH@763..764 "#" [] [] + 1: CSS_COLOR_LITERAL@764..767 "036" [] [] + 1: COMMA@767..769 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@769..773 + 0: SCSS_EXPRESSION_ITEM_LIST@769..773 + 0: CSS_COLOR@769..773 + 0: HASH@769..770 "#" [] [] + 1: CSS_COLOR_LITERAL@770..773 "f00" [] [] + 3: COMMA@773..775 "," [] [Whitespace(" ")] + 4: SCSS_EXPRESSION@775..778 + 0: SCSS_EXPRESSION_ITEM_LIST@775..778 + 0: CSS_PERCENTAGE@775..778 + 0: CSS_NUMBER_LITERAL@775..777 "50" [] [] + 1: PERCENT@777..778 "%" [] [] + 3: R_PAREN@778..779 ")" [] [] + 1: (empty) + 1: SEMICOLON@779..780 ";" [] [] + 4: CSS_DECLARATION_WITH_SEMICOLON@780..810 + 0: CSS_DECLARATION@780..809 + 0: CSS_GENERIC_PROPERTY@780..809 + 0: CSS_IDENTIFIER@780..789 + 0: IDENT@780..789 "invert" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@789..791 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@791..809 + 0: SCSS_EXPRESSION_ITEM_LIST@791..809 + 0: CSS_FUNCTION@791..809 + 0: SCSS_QUALIFIED_NAME@791..803 + 0: CSS_IDENTIFIER@791..796 + 0: IDENT@791..796 "color" [] [] + 1: DOT@796..797 "." [] [] + 2: CSS_IDENTIFIER@797..803 + 0: IDENT@797..803 "invert" [] [] + 1: L_PAREN@803..804 "(" [] [] + 2: CSS_PARAMETER_LIST@804..808 + 0: SCSS_EXPRESSION@804..808 + 0: SCSS_EXPRESSION_ITEM_LIST@804..808 + 0: CSS_COLOR@804..808 + 0: HASH@804..805 "#" [] [] + 1: CSS_COLOR_LITERAL@805..808 "036" [] [] + 3: R_PAREN@808..809 ")" [] [] + 1: (empty) + 1: SEMICOLON@809..810 ";" [] [] + 5: CSS_DECLARATION_WITH_SEMICOLON@810..848 + 0: CSS_DECLARATION@810..847 + 0: CSS_GENERIC_PROPERTY@810..847 + 0: CSS_IDENTIFIER@810..823 + 0: IDENT@810..823 "complement" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@823..825 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@825..847 + 0: SCSS_EXPRESSION_ITEM_LIST@825..847 + 0: CSS_FUNCTION@825..847 + 0: SCSS_QUALIFIED_NAME@825..841 + 0: CSS_IDENTIFIER@825..830 + 0: IDENT@825..830 "color" [] [] + 1: DOT@830..831 "." [] [] + 2: CSS_IDENTIFIER@831..841 + 0: IDENT@831..841 "complement" [] [] + 1: L_PAREN@841..842 "(" [] [] + 2: CSS_PARAMETER_LIST@842..846 + 0: SCSS_EXPRESSION@842..846 + 0: SCSS_EXPRESSION_ITEM_LIST@842..846 + 0: CSS_COLOR@842..846 + 0: HASH@842..843 "#" [] [] + 1: CSS_COLOR_LITERAL@843..846 "036" [] [] + 3: R_PAREN@846..847 ")" [] [] + 1: (empty) + 1: SEMICOLON@847..848 ";" [] [] + 2: R_CURLY@848..850 "}" [Newline("\n")] [] + 2: CSS_QUALIFIED_RULE@850..1109 + 0: CSS_SELECTOR_LIST@850..882 + 0: CSS_COMPOUND_SELECTOR@850..882 + 0: CSS_NESTED_SELECTOR_LIST@850..850 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@850..882 + 0: CSS_CLASS_SELECTOR@850..882 + 0: DOT@850..870 "." [Newline("\n"), Newline("\n"), Comments("// String module"), Newline("\n")] [] + 1: CSS_CUSTOM_IDENTIFIER@870..882 + 0: IDENT@870..882 "string-test" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@882..1109 + 0: L_CURLY@882..883 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@883..1107 + 0: CSS_DECLARATION_WITH_SEMICOLON@883..917 + 0: CSS_DECLARATION@883..916 + 0: CSS_GENERIC_PROPERTY@883..916 + 0: CSS_IDENTIFIER@883..893 + 0: IDENT@883..893 "content" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@893..895 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@895..916 + 0: SCSS_EXPRESSION_ITEM_LIST@895..916 + 0: CSS_FUNCTION@895..916 + 0: SCSS_QUALIFIED_NAME@895..907 + 0: CSS_IDENTIFIER@895..901 + 0: IDENT@895..901 "string" [] [] + 1: DOT@901..902 "." [] [] + 2: CSS_IDENTIFIER@902..907 + 0: IDENT@902..907 "quote" [] [] + 1: L_PAREN@907..908 "(" [] [] + 2: CSS_PARAMETER_LIST@908..915 + 0: SCSS_EXPRESSION@908..915 + 0: SCSS_EXPRESSION_ITEM_LIST@908..915 + 0: CSS_STRING@908..915 + 0: CSS_STRING_LITERAL@908..915 "\"hello\"" [] [] + 3: R_PAREN@915..916 ")" [] [] + 1: (empty) + 1: SEMICOLON@916..917 ";" [] [] + 1: CSS_DECLARATION_WITH_SEMICOLON@917..955 + 0: CSS_DECLARATION@917..954 + 0: CSS_GENERIC_PROPERTY@917..954 + 0: CSS_IDENTIFIER@917..927 + 0: IDENT@917..927 "unquote" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@927..929 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@929..954 + 0: SCSS_EXPRESSION_ITEM_LIST@929..954 + 0: CSS_FUNCTION@929..954 + 0: SCSS_QUALIFIED_NAME@929..943 + 0: CSS_IDENTIFIER@929..935 + 0: IDENT@929..935 "string" [] [] + 1: DOT@935..936 "." [] [] + 2: CSS_IDENTIFIER@936..943 + 0: IDENT@936..943 "unquote" [] [] + 1: L_PAREN@943..944 "(" [] [] + 2: CSS_PARAMETER_LIST@944..953 + 0: SCSS_EXPRESSION@944..953 + 0: SCSS_EXPRESSION_ITEM_LIST@944..953 + 0: CSS_STRING@944..953 + 0: CSS_STRING_LITERAL@944..953 "'\"hello\"'" [] [] + 3: R_PAREN@953..954 ")" [] [] + 1: (empty) + 1: SEMICOLON@954..955 ";" [] [] + 2: CSS_DECLARATION_WITH_SEMICOLON@955..989 + 0: CSS_DECLARATION@955..988 + 0: CSS_GENERIC_PROPERTY@955..988 + 0: CSS_IDENTIFIER@955..964 + 0: IDENT@955..964 "length" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@964..966 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@966..988 + 0: SCSS_EXPRESSION_ITEM_LIST@966..988 + 0: CSS_FUNCTION@966..988 + 0: SCSS_QUALIFIED_NAME@966..979 + 0: CSS_IDENTIFIER@966..972 + 0: IDENT@966..972 "string" [] [] + 1: DOT@972..973 "." [] [] + 2: CSS_IDENTIFIER@973..979 + 0: IDENT@973..979 "length" [] [] + 1: L_PAREN@979..980 "(" [] [] + 2: CSS_PARAMETER_LIST@980..987 + 0: SCSS_EXPRESSION@980..987 + 0: SCSS_EXPRESSION_ITEM_LIST@980..987 + 0: CSS_STRING@980..987 + 0: CSS_STRING_LITERAL@980..987 "\"hello\"" [] [] + 3: R_PAREN@987..988 ")" [] [] + 1: (empty) + 1: SEMICOLON@988..989 ";" [] [] + 3: CSS_DECLARATION_WITH_SEMICOLON@989..1031 + 0: CSS_DECLARATION@989..1030 + 0: CSS_GENERIC_PROPERTY@989..1030 + 0: CSS_IDENTIFIER@989..998 + 0: IDENT@989..998 "insert" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@998..1000 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1000..1030 + 0: SCSS_EXPRESSION_ITEM_LIST@1000..1030 + 0: CSS_FUNCTION@1000..1030 + 0: SCSS_QUALIFIED_NAME@1000..1013 + 0: CSS_IDENTIFIER@1000..1006 + 0: IDENT@1000..1006 "string" [] [] + 1: DOT@1006..1007 "." [] [] + 2: CSS_IDENTIFIER@1007..1013 + 0: IDENT@1007..1013 "insert" [] [] + 1: L_PAREN@1013..1014 "(" [] [] + 2: CSS_PARAMETER_LIST@1014..1029 + 0: SCSS_EXPRESSION@1014..1021 + 0: SCSS_EXPRESSION_ITEM_LIST@1014..1021 + 0: CSS_STRING@1014..1021 + 0: CSS_STRING_LITERAL@1014..1021 "\"hello\"" [] [] + 1: COMMA@1021..1023 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1023..1026 + 0: SCSS_EXPRESSION_ITEM_LIST@1023..1026 + 0: CSS_STRING@1023..1026 + 0: CSS_STRING_LITERAL@1023..1026 "\"X\"" [] [] + 3: COMMA@1026..1028 "," [] [Whitespace(" ")] + 4: SCSS_EXPRESSION@1028..1029 + 0: SCSS_EXPRESSION_ITEM_LIST@1028..1029 + 0: CSS_NUMBER@1028..1029 + 0: CSS_NUMBER_LITERAL@1028..1029 "3" [] [] + 3: R_PAREN@1029..1030 ")" [] [] + 1: (empty) + 1: SEMICOLON@1030..1031 ";" [] [] + 4: CSS_DECLARATION_WITH_SEMICOLON@1031..1069 + 0: CSS_DECLARATION@1031..1068 + 0: CSS_GENERIC_PROPERTY@1031..1068 + 0: CSS_IDENTIFIER@1031..1039 + 0: IDENT@1031..1039 "index" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1039..1041 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1041..1068 + 0: SCSS_EXPRESSION_ITEM_LIST@1041..1068 + 0: CSS_FUNCTION@1041..1068 + 0: SCSS_QUALIFIED_NAME@1041..1053 + 0: CSS_IDENTIFIER@1041..1047 + 0: IDENT@1041..1047 "string" [] [] + 1: DOT@1047..1048 "." [] [] + 2: CSS_IDENTIFIER@1048..1053 + 0: IDENT@1048..1053 "index" [] [] + 1: L_PAREN@1053..1054 "(" [] [] + 2: CSS_PARAMETER_LIST@1054..1067 + 0: SCSS_EXPRESSION@1054..1061 + 0: SCSS_EXPRESSION_ITEM_LIST@1054..1061 + 0: CSS_STRING@1054..1061 + 0: CSS_STRING_LITERAL@1054..1061 "\"hello\"" [] [] + 1: COMMA@1061..1063 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1063..1067 + 0: SCSS_EXPRESSION_ITEM_LIST@1063..1067 + 0: CSS_STRING@1063..1067 + 0: CSS_STRING_LITERAL@1063..1067 "\"ll\"" [] [] + 3: R_PAREN@1067..1068 ")" [] [] + 1: (empty) + 1: SEMICOLON@1068..1069 ";" [] [] + 5: CSS_DECLARATION_WITH_SEMICOLON@1069..1107 + 0: CSS_DECLARATION@1069..1106 + 0: CSS_GENERIC_PROPERTY@1069..1106 + 0: CSS_IDENTIFIER@1069..1077 + 0: IDENT@1069..1077 "slice" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1077..1079 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1079..1106 + 0: SCSS_EXPRESSION_ITEM_LIST@1079..1106 + 0: CSS_FUNCTION@1079..1106 + 0: SCSS_QUALIFIED_NAME@1079..1091 + 0: CSS_IDENTIFIER@1079..1085 + 0: IDENT@1079..1085 "string" [] [] + 1: DOT@1085..1086 "." [] [] + 2: CSS_IDENTIFIER@1086..1091 + 0: IDENT@1086..1091 "slice" [] [] + 1: L_PAREN@1091..1092 "(" [] [] + 2: CSS_PARAMETER_LIST@1092..1105 + 0: SCSS_EXPRESSION@1092..1099 + 0: SCSS_EXPRESSION_ITEM_LIST@1092..1099 + 0: CSS_STRING@1092..1099 + 0: CSS_STRING_LITERAL@1092..1099 "\"hello\"" [] [] + 1: COMMA@1099..1101 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1101..1102 + 0: SCSS_EXPRESSION_ITEM_LIST@1101..1102 + 0: CSS_NUMBER@1101..1102 + 0: CSS_NUMBER_LITERAL@1101..1102 "2" [] [] + 3: COMMA@1102..1104 "," [] [Whitespace(" ")] + 4: SCSS_EXPRESSION@1104..1105 + 0: SCSS_EXPRESSION_ITEM_LIST@1104..1105 + 0: CSS_NUMBER@1104..1105 + 0: CSS_NUMBER_LITERAL@1104..1105 "4" [] [] + 3: R_PAREN@1105..1106 ")" [] [] + 1: (empty) + 1: SEMICOLON@1106..1107 ";" [] [] + 2: R_CURLY@1107..1109 "}" [Newline("\n")] [] + 3: SCSS_DECLARATION@1109..1146 + 0: SCSS_IDENTIFIER@1109..1134 + 0: DOLLAR@1109..1127 "$" [Newline("\n"), Newline("\n"), Comments("// List module"), Newline("\n")] [] + 1: CSS_IDENTIFIER@1127..1134 + 0: IDENT@1127..1134 "my-list" [] [] + 1: COLON@1134..1136 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1136..1145 + 0: SCSS_EXPRESSION_ITEM_LIST@1136..1145 + 0: SCSS_PARENTHESIZED_EXPRESSION@1136..1145 + 0: L_PAREN@1136..1137 "(" [] [] + 1: SCSS_LIST_EXPRESSION@1137..1144 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@1137..1144 + 0: SCSS_LIST_EXPRESSION_ELEMENT@1137..1138 + 0: SCSS_EXPRESSION@1137..1138 + 0: SCSS_EXPRESSION_ITEM_LIST@1137..1138 + 0: CSS_IDENTIFIER@1137..1138 + 0: IDENT@1137..1138 "a" [] [] + 1: COMMA@1138..1140 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@1140..1141 + 0: SCSS_EXPRESSION@1140..1141 + 0: SCSS_EXPRESSION_ITEM_LIST@1140..1141 + 0: CSS_IDENTIFIER@1140..1141 + 0: IDENT@1140..1141 "b" [] [] + 3: COMMA@1141..1143 "," [] [Whitespace(" ")] + 4: SCSS_LIST_EXPRESSION_ELEMENT@1143..1144 + 0: SCSS_EXPRESSION@1143..1144 + 0: SCSS_EXPRESSION_ITEM_LIST@1143..1144 + 0: CSS_IDENTIFIER@1143..1144 + 0: IDENT@1143..1144 "c" [] [] + 2: R_PAREN@1144..1145 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@1145..1145 + 4: SEMICOLON@1145..1146 ";" [] [] + 4: CSS_QUALIFIED_RULE@1146..1331 + 0: CSS_SELECTOR_LIST@1146..1158 + 0: CSS_COMPOUND_SELECTOR@1146..1158 + 0: CSS_NESTED_SELECTOR_LIST@1146..1146 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@1146..1158 + 0: CSS_CLASS_SELECTOR@1146..1158 + 0: DOT@1146..1148 "." [Newline("\n")] [] + 1: CSS_CUSTOM_IDENTIFIER@1148..1158 + 0: IDENT@1148..1158 "list-test" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@1158..1331 + 0: L_CURLY@1158..1159 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@1159..1329 + 0: CSS_DECLARATION_WITH_SEMICOLON@1159..1192 + 0: CSS_DECLARATION@1159..1191 + 0: CSS_GENERIC_PROPERTY@1159..1191 + 0: CSS_IDENTIFIER@1159..1168 + 0: IDENT@1159..1168 "length" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1168..1170 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1170..1191 + 0: SCSS_EXPRESSION_ITEM_LIST@1170..1191 + 0: CSS_FUNCTION@1170..1191 + 0: SCSS_QUALIFIED_NAME@1170..1181 + 0: CSS_IDENTIFIER@1170..1174 + 0: IDENT@1170..1174 "list" [] [] + 1: DOT@1174..1175 "." [] [] + 2: CSS_IDENTIFIER@1175..1181 + 0: IDENT@1175..1181 "length" [] [] + 1: L_PAREN@1181..1182 "(" [] [] + 2: CSS_PARAMETER_LIST@1182..1190 + 0: SCSS_EXPRESSION@1182..1190 + 0: SCSS_EXPRESSION_ITEM_LIST@1182..1190 + 0: SCSS_IDENTIFIER@1182..1190 + 0: DOLLAR@1182..1183 "$" [] [] + 1: CSS_IDENTIFIER@1183..1190 + 0: IDENT@1183..1190 "my-list" [] [] + 3: R_PAREN@1190..1191 ")" [] [] + 1: (empty) + 1: SEMICOLON@1191..1192 ";" [] [] + 1: CSS_DECLARATION_WITH_SEMICOLON@1192..1222 + 0: CSS_DECLARATION@1192..1221 + 0: CSS_GENERIC_PROPERTY@1192..1221 + 0: CSS_IDENTIFIER@1192..1198 + 0: IDENT@1192..1198 "nth" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1198..1200 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1200..1221 + 0: SCSS_EXPRESSION_ITEM_LIST@1200..1221 + 0: CSS_FUNCTION@1200..1221 + 0: SCSS_QUALIFIED_NAME@1200..1208 + 0: CSS_IDENTIFIER@1200..1204 + 0: IDENT@1200..1204 "list" [] [] + 1: DOT@1204..1205 "." [] [] + 2: CSS_IDENTIFIER@1205..1208 + 0: IDENT@1205..1208 "nth" [] [] + 1: L_PAREN@1208..1209 "(" [] [] + 2: CSS_PARAMETER_LIST@1209..1220 + 0: SCSS_EXPRESSION@1209..1217 + 0: SCSS_EXPRESSION_ITEM_LIST@1209..1217 + 0: SCSS_IDENTIFIER@1209..1217 + 0: DOLLAR@1209..1210 "$" [] [] + 1: CSS_IDENTIFIER@1210..1217 + 0: IDENT@1210..1217 "my-list" [] [] + 1: COMMA@1217..1219 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1219..1220 + 0: SCSS_EXPRESSION_ITEM_LIST@1219..1220 + 0: CSS_NUMBER@1219..1220 + 0: CSS_NUMBER_LITERAL@1219..1220 "2" [] [] + 3: R_PAREN@1220..1221 ")" [] [] + 1: (empty) + 1: SEMICOLON@1221..1222 ";" [] [] + 2: CSS_DECLARATION_WITH_SEMICOLON@1222..1256 + 0: CSS_DECLARATION@1222..1255 + 0: CSS_GENERIC_PROPERTY@1222..1255 + 0: CSS_IDENTIFIER@1222..1230 + 0: IDENT@1222..1230 "index" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1230..1232 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1232..1255 + 0: SCSS_EXPRESSION_ITEM_LIST@1232..1255 + 0: CSS_FUNCTION@1232..1255 + 0: SCSS_QUALIFIED_NAME@1232..1242 + 0: CSS_IDENTIFIER@1232..1236 + 0: IDENT@1232..1236 "list" [] [] + 1: DOT@1236..1237 "." [] [] + 2: CSS_IDENTIFIER@1237..1242 + 0: IDENT@1237..1242 "index" [] [] + 1: L_PAREN@1242..1243 "(" [] [] + 2: CSS_PARAMETER_LIST@1243..1254 + 0: SCSS_EXPRESSION@1243..1251 + 0: SCSS_EXPRESSION_ITEM_LIST@1243..1251 + 0: SCSS_IDENTIFIER@1243..1251 + 0: DOLLAR@1243..1244 "$" [] [] + 1: CSS_IDENTIFIER@1244..1251 + 0: IDENT@1244..1251 "my-list" [] [] + 1: COMMA@1251..1253 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1253..1254 + 0: SCSS_EXPRESSION_ITEM_LIST@1253..1254 + 0: CSS_IDENTIFIER@1253..1254 + 0: IDENT@1253..1254 "b" [] [] + 3: R_PAREN@1254..1255 ")" [] [] + 1: (empty) + 1: SEMICOLON@1255..1256 ";" [] [] + 3: CSS_DECLARATION_WITH_SEMICOLON@1256..1292 + 0: CSS_DECLARATION@1256..1291 + 0: CSS_GENERIC_PROPERTY@1256..1291 + 0: CSS_IDENTIFIER@1256..1265 + 0: IDENT@1256..1265 "append" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1265..1267 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1267..1291 + 0: SCSS_EXPRESSION_ITEM_LIST@1267..1291 + 0: CSS_FUNCTION@1267..1291 + 0: SCSS_QUALIFIED_NAME@1267..1278 + 0: CSS_IDENTIFIER@1267..1271 + 0: IDENT@1267..1271 "list" [] [] + 1: DOT@1271..1272 "." [] [] + 2: CSS_IDENTIFIER@1272..1278 + 0: IDENT@1272..1278 "append" [] [] + 1: L_PAREN@1278..1279 "(" [] [] + 2: CSS_PARAMETER_LIST@1279..1290 + 0: SCSS_EXPRESSION@1279..1287 + 0: SCSS_EXPRESSION_ITEM_LIST@1279..1287 + 0: SCSS_IDENTIFIER@1279..1287 + 0: DOLLAR@1279..1280 "$" [] [] + 1: CSS_IDENTIFIER@1280..1287 + 0: IDENT@1280..1287 "my-list" [] [] + 1: COMMA@1287..1289 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1289..1290 + 0: SCSS_EXPRESSION_ITEM_LIST@1289..1290 + 0: CSS_IDENTIFIER@1289..1290 + 0: IDENT@1289..1290 "d" [] [] + 3: R_PAREN@1290..1291 ")" [] [] + 1: (empty) + 1: SEMICOLON@1291..1292 ";" [] [] + 4: CSS_DECLARATION_WITH_SEMICOLON@1292..1329 + 0: CSS_DECLARATION@1292..1328 + 0: CSS_GENERIC_PROPERTY@1292..1328 + 0: CSS_IDENTIFIER@1292..1299 + 0: IDENT@1292..1299 "join" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1299..1301 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1301..1328 + 0: SCSS_EXPRESSION_ITEM_LIST@1301..1328 + 0: CSS_FUNCTION@1301..1328 + 0: SCSS_QUALIFIED_NAME@1301..1310 + 0: CSS_IDENTIFIER@1301..1305 + 0: IDENT@1301..1305 "list" [] [] + 1: DOT@1305..1306 "." [] [] + 2: CSS_IDENTIFIER@1306..1310 + 0: IDENT@1306..1310 "join" [] [] + 1: L_PAREN@1310..1311 "(" [] [] + 2: CSS_PARAMETER_LIST@1311..1327 + 0: SCSS_EXPRESSION@1311..1319 + 0: SCSS_EXPRESSION_ITEM_LIST@1311..1319 + 0: SCSS_IDENTIFIER@1311..1319 + 0: DOLLAR@1311..1312 "$" [] [] + 1: CSS_IDENTIFIER@1312..1319 + 0: IDENT@1312..1319 "my-list" [] [] + 1: COMMA@1319..1321 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1321..1327 + 0: SCSS_EXPRESSION_ITEM_LIST@1321..1327 + 0: SCSS_PARENTHESIZED_EXPRESSION@1321..1327 + 0: L_PAREN@1321..1322 "(" [] [] + 1: SCSS_LIST_EXPRESSION@1322..1326 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@1322..1326 + 0: SCSS_LIST_EXPRESSION_ELEMENT@1322..1323 + 0: SCSS_EXPRESSION@1322..1323 + 0: SCSS_EXPRESSION_ITEM_LIST@1322..1323 + 0: CSS_IDENTIFIER@1322..1323 + 0: IDENT@1322..1323 "x" [] [] + 1: COMMA@1323..1325 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@1325..1326 + 0: SCSS_EXPRESSION@1325..1326 + 0: SCSS_EXPRESSION_ITEM_LIST@1325..1326 + 0: CSS_IDENTIFIER@1325..1326 + 0: IDENT@1325..1326 "y" [] [] + 2: R_PAREN@1326..1327 ")" [] [] + 3: R_PAREN@1327..1328 ")" [] [] + 1: (empty) + 1: SEMICOLON@1328..1329 ";" [] [] + 2: R_CURLY@1329..1331 "}" [Newline("\n")] [] + 5: SCSS_DECLARATION@1331..1385 + 0: SCSS_IDENTIFIER@1331..1354 + 0: DOLLAR@1331..1348 "$" [Newline("\n"), Newline("\n"), Comments("// Map module"), Newline("\n")] [] + 1: CSS_IDENTIFIER@1348..1354 + 0: IDENT@1348..1354 "my-map" [] [] + 1: COLON@1354..1356 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1356..1384 + 0: SCSS_EXPRESSION_ITEM_LIST@1356..1384 + 0: SCSS_MAP_EXPRESSION@1356..1384 + 0: L_PAREN@1356..1357 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@1357..1383 + 0: SCSS_MAP_EXPRESSION_PAIR@1357..1369 + 0: SCSS_EXPRESSION@1357..1361 + 0: SCSS_EXPRESSION_ITEM_LIST@1357..1361 + 0: CSS_IDENTIFIER@1357..1361 + 0: IDENT@1357..1361 "key1" [] [] + 1: COLON@1361..1363 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1363..1369 + 0: SCSS_EXPRESSION_ITEM_LIST@1363..1369 + 0: CSS_IDENTIFIER@1363..1369 + 0: IDENT@1363..1369 "value1" [] [] + 1: COMMA@1369..1371 "," [] [Whitespace(" ")] + 2: SCSS_MAP_EXPRESSION_PAIR@1371..1383 + 0: SCSS_EXPRESSION@1371..1375 + 0: SCSS_EXPRESSION_ITEM_LIST@1371..1375 + 0: CSS_IDENTIFIER@1371..1375 + 0: IDENT@1371..1375 "key2" [] [] + 1: COLON@1375..1377 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1377..1383 + 0: SCSS_EXPRESSION_ITEM_LIST@1377..1383 + 0: CSS_IDENTIFIER@1377..1383 + 0: IDENT@1377..1383 "value2" [] [] + 2: R_PAREN@1383..1384 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@1384..1384 + 4: SEMICOLON@1384..1385 ";" [] [] + 6: CSS_QUALIFIED_RULE@1385..1572 + 0: CSS_SELECTOR_LIST@1385..1396 + 0: CSS_COMPOUND_SELECTOR@1385..1396 + 0: CSS_NESTED_SELECTOR_LIST@1385..1385 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@1385..1396 + 0: CSS_CLASS_SELECTOR@1385..1396 + 0: DOT@1385..1387 "." [Newline("\n")] [] + 1: CSS_CUSTOM_IDENTIFIER@1387..1396 + 0: IDENT@1387..1396 "map-test" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@1396..1572 + 0: L_CURLY@1396..1397 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@1397..1570 + 0: CSS_DECLARATION_WITH_SEMICOLON@1397..1428 + 0: CSS_DECLARATION@1397..1427 + 0: CSS_GENERIC_PROPERTY@1397..1427 + 0: CSS_IDENTIFIER@1397..1403 + 0: IDENT@1397..1403 "get" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1403..1405 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1405..1427 + 0: SCSS_EXPRESSION_ITEM_LIST@1405..1427 + 0: CSS_FUNCTION@1405..1427 + 0: SCSS_QUALIFIED_NAME@1405..1412 + 0: CSS_IDENTIFIER@1405..1408 + 0: IDENT@1405..1408 "map" [] [] + 1: DOT@1408..1409 "." [] [] + 2: CSS_IDENTIFIER@1409..1412 + 0: IDENT@1409..1412 "get" [] [] + 1: L_PAREN@1412..1413 "(" [] [] + 2: CSS_PARAMETER_LIST@1413..1426 + 0: SCSS_EXPRESSION@1413..1420 + 0: SCSS_EXPRESSION_ITEM_LIST@1413..1420 + 0: SCSS_IDENTIFIER@1413..1420 + 0: DOLLAR@1413..1414 "$" [] [] + 1: CSS_IDENTIFIER@1414..1420 + 0: IDENT@1414..1420 "my-map" [] [] + 1: COMMA@1420..1422 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1422..1426 + 0: SCSS_EXPRESSION_ITEM_LIST@1422..1426 + 0: CSS_IDENTIFIER@1422..1426 + 0: IDENT@1422..1426 "key1" [] [] + 3: R_PAREN@1426..1427 ")" [] [] + 1: (empty) + 1: SEMICOLON@1427..1428 ";" [] [] + 1: CSS_DECLARATION_WITH_SEMICOLON@1428..1467 + 0: CSS_DECLARATION@1428..1466 + 0: CSS_GENERIC_PROPERTY@1428..1466 + 0: CSS_IDENTIFIER@1428..1438 + 0: IDENT@1428..1438 "has-key" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1438..1440 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1440..1466 + 0: SCSS_EXPRESSION_ITEM_LIST@1440..1466 + 0: CSS_FUNCTION@1440..1466 + 0: SCSS_QUALIFIED_NAME@1440..1451 + 0: CSS_IDENTIFIER@1440..1443 + 0: IDENT@1440..1443 "map" [] [] + 1: DOT@1443..1444 "." [] [] + 2: CSS_IDENTIFIER@1444..1451 + 0: IDENT@1444..1451 "has-key" [] [] + 1: L_PAREN@1451..1452 "(" [] [] + 2: CSS_PARAMETER_LIST@1452..1465 + 0: SCSS_EXPRESSION@1452..1459 + 0: SCSS_EXPRESSION_ITEM_LIST@1452..1459 + 0: SCSS_IDENTIFIER@1452..1459 + 0: DOLLAR@1452..1453 "$" [] [] + 1: CSS_IDENTIFIER@1453..1459 + 0: IDENT@1453..1459 "my-map" [] [] + 1: COMMA@1459..1461 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1461..1465 + 0: SCSS_EXPRESSION_ITEM_LIST@1461..1465 + 0: CSS_IDENTIFIER@1461..1465 + 0: IDENT@1461..1465 "key1" [] [] + 3: R_PAREN@1465..1466 ")" [] [] + 1: (empty) + 1: SEMICOLON@1466..1467 ";" [] [] + 2: CSS_DECLARATION_WITH_SEMICOLON@1467..1494 + 0: CSS_DECLARATION@1467..1493 + 0: CSS_GENERIC_PROPERTY@1467..1493 + 0: CSS_IDENTIFIER@1467..1474 + 0: IDENT@1467..1474 "keys" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1474..1476 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1476..1493 + 0: SCSS_EXPRESSION_ITEM_LIST@1476..1493 + 0: CSS_FUNCTION@1476..1493 + 0: SCSS_QUALIFIED_NAME@1476..1484 + 0: CSS_IDENTIFIER@1476..1479 + 0: IDENT@1476..1479 "map" [] [] + 1: DOT@1479..1480 "." [] [] + 2: CSS_IDENTIFIER@1480..1484 + 0: IDENT@1480..1484 "keys" [] [] + 1: L_PAREN@1484..1485 "(" [] [] + 2: CSS_PARAMETER_LIST@1485..1492 + 0: SCSS_EXPRESSION@1485..1492 + 0: SCSS_EXPRESSION_ITEM_LIST@1485..1492 + 0: SCSS_IDENTIFIER@1485..1492 + 0: DOLLAR@1485..1486 "$" [] [] + 1: CSS_IDENTIFIER@1486..1492 + 0: IDENT@1486..1492 "my-map" [] [] + 3: R_PAREN@1492..1493 ")" [] [] + 1: (empty) + 1: SEMICOLON@1493..1494 ";" [] [] + 3: CSS_DECLARATION_WITH_SEMICOLON@1494..1525 + 0: CSS_DECLARATION@1494..1524 + 0: CSS_GENERIC_PROPERTY@1494..1524 + 0: CSS_IDENTIFIER@1494..1503 + 0: IDENT@1494..1503 "values" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1503..1505 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1505..1524 + 0: SCSS_EXPRESSION_ITEM_LIST@1505..1524 + 0: CSS_FUNCTION@1505..1524 + 0: SCSS_QUALIFIED_NAME@1505..1515 + 0: CSS_IDENTIFIER@1505..1508 + 0: IDENT@1505..1508 "map" [] [] + 1: DOT@1508..1509 "." [] [] + 2: CSS_IDENTIFIER@1509..1515 + 0: IDENT@1509..1515 "values" [] [] + 1: L_PAREN@1515..1516 "(" [] [] + 2: CSS_PARAMETER_LIST@1516..1523 + 0: SCSS_EXPRESSION@1516..1523 + 0: SCSS_EXPRESSION_ITEM_LIST@1516..1523 + 0: SCSS_IDENTIFIER@1516..1523 + 0: DOLLAR@1516..1517 "$" [] [] + 1: CSS_IDENTIFIER@1517..1523 + 0: IDENT@1517..1523 "my-map" [] [] + 3: R_PAREN@1523..1524 ")" [] [] + 1: (empty) + 1: SEMICOLON@1524..1525 ";" [] [] + 4: CSS_DECLARATION_WITH_SEMICOLON@1525..1570 + 0: CSS_DECLARATION@1525..1569 + 0: CSS_GENERIC_PROPERTY@1525..1569 + 0: CSS_IDENTIFIER@1525..1533 + 0: IDENT@1525..1533 "merge" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1533..1535 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1535..1569 + 0: SCSS_EXPRESSION_ITEM_LIST@1535..1569 + 0: CSS_FUNCTION@1535..1569 + 0: SCSS_QUALIFIED_NAME@1535..1544 + 0: CSS_IDENTIFIER@1535..1538 + 0: IDENT@1535..1538 "map" [] [] + 1: DOT@1538..1539 "." [] [] + 2: CSS_IDENTIFIER@1539..1544 + 0: IDENT@1539..1544 "merge" [] [] + 1: L_PAREN@1544..1545 "(" [] [] + 2: CSS_PARAMETER_LIST@1545..1568 + 0: SCSS_EXPRESSION@1545..1552 + 0: SCSS_EXPRESSION_ITEM_LIST@1545..1552 + 0: SCSS_IDENTIFIER@1545..1552 + 0: DOLLAR@1545..1546 "$" [] [] + 1: CSS_IDENTIFIER@1546..1552 + 0: IDENT@1546..1552 "my-map" [] [] + 1: COMMA@1552..1554 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1554..1568 + 0: SCSS_EXPRESSION_ITEM_LIST@1554..1568 + 0: SCSS_MAP_EXPRESSION@1554..1568 + 0: L_PAREN@1554..1555 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@1555..1567 + 0: SCSS_MAP_EXPRESSION_PAIR@1555..1567 + 0: SCSS_EXPRESSION@1555..1559 + 0: SCSS_EXPRESSION_ITEM_LIST@1555..1559 + 0: CSS_IDENTIFIER@1555..1559 + 0: IDENT@1555..1559 "key3" [] [] + 1: COLON@1559..1561 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1561..1567 + 0: SCSS_EXPRESSION_ITEM_LIST@1561..1567 + 0: CSS_IDENTIFIER@1561..1567 + 0: IDENT@1561..1567 "value3" [] [] + 2: R_PAREN@1567..1568 ")" [] [] + 3: R_PAREN@1568..1569 ")" [] [] + 1: (empty) + 1: SEMICOLON@1569..1570 ";" [] [] + 2: R_CURLY@1570..1572 "}" [Newline("\n")] [] + 7: CSS_QUALIFIED_RULE@1572..1766 + 0: CSS_SELECTOR_LIST@1572..1608 + 0: CSS_COMPOUND_SELECTOR@1572..1608 + 0: CSS_NESTED_SELECTOR_LIST@1572..1572 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@1572..1608 + 0: CSS_CLASS_SELECTOR@1572..1608 + 0: DOT@1572..1594 "." [Newline("\n"), Newline("\n"), Comments("// Selector module"), Newline("\n")] [] + 1: CSS_CUSTOM_IDENTIFIER@1594..1608 + 0: IDENT@1594..1608 "selector-test" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@1608..1766 + 0: L_CURLY@1608..1609 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@1609..1764 + 0: CSS_DECLARATION_WITH_SEMICOLON@1609..1676 + 0: CSS_DECLARATION@1609..1675 + 0: CSS_GENERIC_PROPERTY@1609..1675 + 0: CSS_IDENTIFIER@1609..1628 + 0: IDENT@1609..1628 "is-superselector" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1628..1630 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1630..1675 + 0: SCSS_EXPRESSION_ITEM_LIST@1630..1675 + 0: CSS_FUNCTION@1630..1675 + 0: SCSS_QUALIFIED_NAME@1630..1655 + 0: CSS_IDENTIFIER@1630..1638 + 0: IDENT@1630..1638 "selector" [] [] + 1: DOT@1638..1639 "." [] [] + 2: CSS_IDENTIFIER@1639..1655 + 0: IDENT@1639..1655 "is-superselector" [] [] + 1: L_PAREN@1655..1656 "(" [] [] + 2: CSS_PARAMETER_LIST@1656..1674 + 0: SCSS_EXPRESSION@1656..1662 + 0: SCSS_EXPRESSION_ITEM_LIST@1656..1662 + 0: CSS_STRING@1656..1662 + 0: CSS_STRING_LITERAL@1656..1662 "\".foo\"" [] [] + 1: COMMA@1662..1664 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1664..1674 + 0: SCSS_EXPRESSION_ITEM_LIST@1664..1674 + 0: CSS_STRING@1664..1674 + 0: CSS_STRING_LITERAL@1664..1674 "\".foo.bar\"" [] [] + 3: R_PAREN@1674..1675 ")" [] [] + 1: (empty) + 1: SEMICOLON@1675..1676 ";" [] [] + 1: CSS_DECLARATION_WITH_SEMICOLON@1676..1719 + 0: CSS_DECLARATION@1676..1718 + 0: CSS_GENERIC_PROPERTY@1676..1718 + 0: CSS_IDENTIFIER@1676..1685 + 0: IDENT@1676..1685 "append" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1685..1687 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1687..1718 + 0: SCSS_EXPRESSION_ITEM_LIST@1687..1718 + 0: CSS_FUNCTION@1687..1718 + 0: SCSS_QUALIFIED_NAME@1687..1702 + 0: CSS_IDENTIFIER@1687..1695 + 0: IDENT@1687..1695 "selector" [] [] + 1: DOT@1695..1696 "." [] [] + 2: CSS_IDENTIFIER@1696..1702 + 0: IDENT@1696..1702 "append" [] [] + 1: L_PAREN@1702..1703 "(" [] [] + 2: CSS_PARAMETER_LIST@1703..1717 + 0: SCSS_EXPRESSION@1703..1709 + 0: SCSS_EXPRESSION_ITEM_LIST@1703..1709 + 0: CSS_STRING@1703..1709 + 0: CSS_STRING_LITERAL@1703..1709 "\".foo\"" [] [] + 1: COMMA@1709..1711 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1711..1717 + 0: SCSS_EXPRESSION_ITEM_LIST@1711..1717 + 0: CSS_STRING@1711..1717 + 0: CSS_STRING_LITERAL@1711..1717 "\".bar\"" [] [] + 3: R_PAREN@1717..1718 ")" [] [] + 1: (empty) + 1: SEMICOLON@1718..1719 ";" [] [] + 2: CSS_DECLARATION_WITH_SEMICOLON@1719..1764 + 0: CSS_DECLARATION@1719..1763 + 0: CSS_GENERIC_PROPERTY@1719..1763 + 0: CSS_IDENTIFIER@1719..1728 + 0: IDENT@1719..1728 "extend" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1728..1730 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1730..1763 + 0: SCSS_EXPRESSION_ITEM_LIST@1730..1763 + 0: CSS_FUNCTION@1730..1763 + 0: SCSS_QUALIFIED_NAME@1730..1745 + 0: CSS_IDENTIFIER@1730..1738 + 0: IDENT@1730..1738 "selector" [] [] + 1: DOT@1738..1739 "." [] [] + 2: CSS_IDENTIFIER@1739..1745 + 0: IDENT@1739..1745 "extend" [] [] + 1: L_PAREN@1745..1746 "(" [] [] + 2: CSS_PARAMETER_LIST@1746..1762 + 0: SCSS_EXPRESSION@1746..1750 + 0: SCSS_EXPRESSION_ITEM_LIST@1746..1750 + 0: CSS_STRING@1746..1750 + 0: CSS_STRING_LITERAL@1746..1750 "\".a\"" [] [] + 1: COMMA@1750..1752 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1752..1756 + 0: SCSS_EXPRESSION_ITEM_LIST@1752..1756 + 0: CSS_STRING@1752..1756 + 0: CSS_STRING_LITERAL@1752..1756 "\".b\"" [] [] + 3: COMMA@1756..1758 "," [] [Whitespace(" ")] + 4: SCSS_EXPRESSION@1758..1762 + 0: SCSS_EXPRESSION_ITEM_LIST@1758..1762 + 0: CSS_STRING@1758..1762 + 0: CSS_STRING_LITERAL@1758..1762 "\".c\"" [] [] + 3: R_PAREN@1762..1763 ")" [] [] + 1: (empty) + 1: SEMICOLON@1763..1764 ";" [] [] + 2: R_CURLY@1764..1766 "}" [Newline("\n")] [] + 8: CSS_QUALIFIED_RULE@1766..1924 + 0: CSS_SELECTOR_LIST@1766..1794 + 0: CSS_COMPOUND_SELECTOR@1766..1794 + 0: CSS_NESTED_SELECTOR_LIST@1766..1766 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@1766..1794 + 0: CSS_CLASS_SELECTOR@1766..1794 + 0: DOT@1766..1784 "." [Newline("\n"), Newline("\n"), Comments("// Meta module"), Newline("\n")] [] + 1: CSS_CUSTOM_IDENTIFIER@1784..1794 + 0: IDENT@1784..1794 "meta-test" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@1794..1924 + 0: L_CURLY@1794..1795 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@1795..1922 + 0: CSS_DECLARATION_WITH_SEMICOLON@1795..1823 + 0: CSS_DECLARATION@1795..1822 + 0: CSS_GENERIC_PROPERTY@1795..1822 + 0: CSS_IDENTIFIER@1795..1802 + 0: IDENT@1795..1802 "type" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1802..1804 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1804..1822 + 0: SCSS_EXPRESSION_ITEM_LIST@1804..1822 + 0: CSS_FUNCTION@1804..1822 + 0: SCSS_QUALIFIED_NAME@1804..1816 + 0: CSS_IDENTIFIER@1804..1808 + 0: IDENT@1804..1808 "meta" [] [] + 1: DOT@1808..1809 "." [] [] + 2: CSS_IDENTIFIER@1809..1816 + 0: IDENT@1809..1816 "type-of" [] [] + 1: L_PAREN@1816..1817 "(" [] [] + 2: CSS_PARAMETER_LIST@1817..1821 + 0: SCSS_EXPRESSION@1817..1821 + 0: SCSS_EXPRESSION_ITEM_LIST@1817..1821 + 0: CSS_REGULAR_DIMENSION@1817..1821 + 0: CSS_NUMBER_LITERAL@1817..1819 "10" [] [] + 1: IDENT@1819..1821 "px" [] [] + 3: R_PAREN@1821..1822 ")" [] [] + 1: (empty) + 1: SEMICOLON@1822..1823 ";" [] [] + 1: CSS_DECLARATION_WITH_SEMICOLON@1823..1848 + 0: CSS_DECLARATION@1823..1847 + 0: CSS_GENERIC_PROPERTY@1823..1847 + 0: CSS_IDENTIFIER@1823..1830 + 0: IDENT@1823..1830 "unit" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1830..1832 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1832..1847 + 0: SCSS_EXPRESSION_ITEM_LIST@1832..1847 + 0: CSS_FUNCTION@1832..1847 + 0: SCSS_QUALIFIED_NAME@1832..1841 + 0: CSS_IDENTIFIER@1832..1836 + 0: IDENT@1832..1836 "meta" [] [] + 1: DOT@1836..1837 "." [] [] + 2: CSS_IDENTIFIER@1837..1841 + 0: IDENT@1837..1841 "unit" [] [] + 1: L_PAREN@1841..1842 "(" [] [] + 2: CSS_PARAMETER_LIST@1842..1846 + 0: SCSS_EXPRESSION@1842..1846 + 0: SCSS_EXPRESSION_ITEM_LIST@1842..1846 + 0: CSS_REGULAR_DIMENSION@1842..1846 + 0: CSS_NUMBER_LITERAL@1842..1844 "10" [] [] + 1: IDENT@1844..1846 "px" [] [] + 3: R_PAREN@1846..1847 ")" [] [] + 1: (empty) + 1: SEMICOLON@1847..1848 ";" [] [] + 2: CSS_DECLARATION_WITH_SEMICOLON@1848..1879 + 0: CSS_DECLARATION@1848..1878 + 0: CSS_GENERIC_PROPERTY@1848..1878 + 0: CSS_IDENTIFIER@1848..1859 + 0: IDENT@1848..1859 "unitless" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1859..1861 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1861..1878 + 0: SCSS_EXPRESSION_ITEM_LIST@1861..1878 + 0: CSS_FUNCTION@1861..1878 + 0: SCSS_QUALIFIED_NAME@1861..1874 + 0: CSS_IDENTIFIER@1861..1865 + 0: IDENT@1861..1865 "meta" [] [] + 1: DOT@1865..1866 "." [] [] + 2: CSS_IDENTIFIER@1866..1874 + 0: IDENT@1866..1874 "unitless" [] [] + 1: L_PAREN@1874..1875 "(" [] [] + 2: CSS_PARAMETER_LIST@1875..1877 + 0: SCSS_EXPRESSION@1875..1877 + 0: SCSS_EXPRESSION_ITEM_LIST@1875..1877 + 0: CSS_NUMBER@1875..1877 + 0: CSS_NUMBER_LITERAL@1875..1877 "10" [] [] + 3: R_PAREN@1877..1878 ")" [] [] + 1: (empty) + 1: SEMICOLON@1878..1879 ";" [] [] + 3: CSS_DECLARATION_WITH_SEMICOLON@1879..1922 + 0: CSS_DECLARATION@1879..1921 + 0: CSS_GENERIC_PROPERTY@1879..1921 + 0: CSS_IDENTIFIER@1879..1892 + 0: IDENT@1879..1892 "comparable" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1892..1894 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1894..1921 + 0: SCSS_EXPRESSION_ITEM_LIST@1894..1921 + 0: CSS_FUNCTION@1894..1921 + 0: SCSS_QUALIFIED_NAME@1894..1909 + 0: CSS_IDENTIFIER@1894..1898 + 0: IDENT@1894..1898 "meta" [] [] + 1: DOT@1898..1899 "." [] [] + 2: CSS_IDENTIFIER@1899..1909 + 0: IDENT@1899..1909 "comparable" [] [] + 1: L_PAREN@1909..1910 "(" [] [] + 2: CSS_PARAMETER_LIST@1910..1920 + 0: SCSS_EXPRESSION@1910..1914 + 0: SCSS_EXPRESSION_ITEM_LIST@1910..1914 + 0: CSS_REGULAR_DIMENSION@1910..1914 + 0: CSS_NUMBER_LITERAL@1910..1912 "10" [] [] + 1: IDENT@1912..1914 "px" [] [] + 1: COMMA@1914..1916 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1916..1920 + 0: SCSS_EXPRESSION_ITEM_LIST@1916..1920 + 0: CSS_REGULAR_DIMENSION@1916..1920 + 0: CSS_NUMBER_LITERAL@1916..1918 "10" [] [] + 1: IDENT@1918..1920 "em" [] [] + 3: R_PAREN@1920..1921 ")" [] [] + 1: (empty) + 1: SEMICOLON@1921..1922 ";" [] [] + 2: R_CURLY@1922..1924 "}" [Newline("\n")] [] + 2: EOF@1924..1928 "" [Newline("\n"), Newline("\n"), Newline("\n"), Newline("\n")] [] + +``` diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/function-call.scss b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/function-call.scss new file mode 100644 index 000000000000..e3db2029db1c --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/function-call.scss @@ -0,0 +1,24 @@ +.calls { + one-positional-arg: one-positional-arg(a,); + two-positional-args: two-positional-args(a,b,); + one-keyword-arg: one-keyword-arg($a: z,); + two-keyword-args: two-keyword-args($a: y,$b: z,); + mixed-args: mixed-args(y, $b: z,); +} + +.function-name { + // TODO(interpolation support): start: #{1 + 1}foo(arg); + // TODO(interpolation support): mid: foo#{1 + 1}bar(arg); + // TODO(interpolation support): end: foo#{1 + 1}(arg); + // TODO(interpolation support): full: #{foo}(arg); + width: max($numbers...); + width: max($numbers ...); + width: max($numbers/**/...); + prop: fn(value ...); + prop: fn(value/**/...); + color: rgba(50 50 0.50 50...); +} + + + + diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/function-call.scss.snap b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/function-call.scss.snap new file mode 100644 index 000000000000..f8a35ccf5fdb --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/function-call.scss.snap @@ -0,0 +1,894 @@ +--- +source: crates/biome_css_parser/tests/spec_test.rs +assertion_line: 208 +expression: snapshot +--- + +## Input + +```css +.calls { + one-positional-arg: one-positional-arg(a,); + two-positional-args: two-positional-args(a,b,); + one-keyword-arg: one-keyword-arg($a: z,); + two-keyword-args: two-keyword-args($a: y,$b: z,); + mixed-args: mixed-args(y, $b: z,); +} + +.function-name { + // TODO(interpolation support): start: #{1 + 1}foo(arg); + // TODO(interpolation support): mid: foo#{1 + 1}bar(arg); + // TODO(interpolation support): end: foo#{1 + 1}(arg); + // TODO(interpolation support): full: #{foo}(arg); + width: max($numbers...); + width: max($numbers ...); + width: max($numbers/**/...); + prop: fn(value ...); + prop: fn(value/**/...); + color: rgba(50 50 0.50 50...); +} + + + + + +``` + + +## AST + +``` +CssRoot { + bom_token: missing (optional), + items: CssRootItemList [ + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@0..1 "." [] [], + name: CssCustomIdentifier { + value_token: IDENT@1..7 "calls" [] [Whitespace(" ")], + }, + }, + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@7..8 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@8..29 "one-positional-arg" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@29..31 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@31..49 "one-positional-arg" [] [], + }, + l_paren_token: L_PAREN@49..50 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@50..51 "a" [] [], + }, + ], + }, + COMMA@51..52 "," [] [], + ], + r_paren_token: R_PAREN@52..53 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@53..54 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@54..76 "two-positional-args" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@76..78 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@78..97 "two-positional-args" [] [], + }, + l_paren_token: L_PAREN@97..98 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@98..99 "a" [] [], + }, + ], + }, + COMMA@99..100 "," [] [], + ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@100..101 "b" [] [], + }, + ], + }, + COMMA@101..102 "," [] [], + ], + r_paren_token: R_PAREN@102..103 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@103..104 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@104..122 "one-keyword-arg" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@122..124 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@124..139 "one-keyword-arg" [] [], + }, + l_paren_token: L_PAREN@139..140 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssKeywordArgument { + name: ScssIdentifier { + dollar_token: DOLLAR@140..141 "$" [] [], + name: CssIdentifier { + value_token: IDENT@141..142 "a" [] [], + }, + }, + colon_token: COLON@142..144 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@144..145 "z" [] [], + }, + ], + }, + }, + ], + }, + COMMA@145..146 "," [] [], + ], + r_paren_token: R_PAREN@146..147 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@147..148 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@148..167 "two-keyword-args" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@167..169 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@169..185 "two-keyword-args" [] [], + }, + l_paren_token: L_PAREN@185..186 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssKeywordArgument { + name: ScssIdentifier { + dollar_token: DOLLAR@186..187 "$" [] [], + name: CssIdentifier { + value_token: IDENT@187..188 "a" [] [], + }, + }, + colon_token: COLON@188..190 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@190..191 "y" [] [], + }, + ], + }, + }, + ], + }, + COMMA@191..192 "," [] [], + ScssExpression { + items: ScssExpressionItemList [ + ScssKeywordArgument { + name: ScssIdentifier { + dollar_token: DOLLAR@192..193 "$" [] [], + name: CssIdentifier { + value_token: IDENT@193..194 "b" [] [], + }, + }, + colon_token: COLON@194..196 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@196..197 "z" [] [], + }, + ], + }, + }, + ], + }, + COMMA@197..198 "," [] [], + ], + r_paren_token: R_PAREN@198..199 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@199..200 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@200..213 "mixed-args" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@213..215 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@215..225 "mixed-args" [] [], + }, + l_paren_token: L_PAREN@225..226 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@226..227 "y" [] [], + }, + ], + }, + COMMA@227..229 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + ScssKeywordArgument { + name: ScssIdentifier { + dollar_token: DOLLAR@229..230 "$" [] [], + name: CssIdentifier { + value_token: IDENT@230..231 "b" [] [], + }, + }, + colon_token: COLON@231..233 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@233..234 "z" [] [], + }, + ], + }, + }, + ], + }, + COMMA@234..235 "," [] [], + ], + r_paren_token: R_PAREN@235..236 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@236..237 ";" [] [], + }, + ], + r_curly_token: R_CURLY@237..239 "}" [Newline("\n")] [], + }, + }, + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@239..242 "." [Newline("\n"), Newline("\n")] [], + name: CssCustomIdentifier { + value_token: IDENT@242..256 "function-name" [] [Whitespace(" ")], + }, + }, + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@256..257 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@257..494 "width" [Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@494..496 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@496..499 "max" [] [], + }, + l_paren_token: L_PAREN@499..500 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssArbitraryArgument { + value: ScssIdentifier { + dollar_token: DOLLAR@500..501 "$" [] [], + name: CssIdentifier { + value_token: IDENT@501..508 "numbers" [] [], + }, + }, + dotdotdot_token: DOT3@508..511 "..." [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@511..512 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@512..513 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@513..521 "width" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@521..523 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@523..526 "max" [] [], + }, + l_paren_token: L_PAREN@526..527 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssArbitraryArgument { + value: ScssIdentifier { + dollar_token: DOLLAR@527..528 "$" [] [], + name: CssIdentifier { + value_token: IDENT@528..539 "numbers" [] [Whitespace(" ")], + }, + }, + dotdotdot_token: DOT3@539..542 "..." [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@542..543 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@543..544 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@544..552 "width" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@552..554 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@554..557 "max" [] [], + }, + l_paren_token: L_PAREN@557..558 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssArbitraryArgument { + value: ScssIdentifier { + dollar_token: DOLLAR@558..559 "$" [] [], + name: CssIdentifier { + value_token: IDENT@559..570 "numbers" [] [Comments("/**/")], + }, + }, + dotdotdot_token: DOT3@570..573 "..." [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@573..574 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@574..575 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@575..582 "prop" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@582..584 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@584..586 "fn" [] [], + }, + l_paren_token: L_PAREN@586..587 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssArbitraryArgument { + value: CssIdentifier { + value_token: IDENT@587..596 "value" [] [Whitespace(" ")], + }, + dotdotdot_token: DOT3@596..599 "..." [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@599..600 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@600..601 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@601..608 "prop" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@608..610 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@610..612 "fn" [] [], + }, + l_paren_token: L_PAREN@612..613 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssArbitraryArgument { + value: CssIdentifier { + value_token: IDENT@613..622 "value" [] [Comments("/**/")], + }, + dotdotdot_token: DOT3@622..625 "..." [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@625..626 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@626..627 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@627..635 "color" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@635..637 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@637..641 "rgba" [] [], + }, + l_paren_token: L_PAREN@641..642 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@642..645 "50" [] [Whitespace(" ")], + }, + CssNumber { + value_token: CSS_NUMBER_LITERAL@645..648 "50" [] [Whitespace(" ")], + }, + CssNumber { + value_token: CSS_NUMBER_LITERAL@648..653 "0.50" [] [Whitespace(" ")], + }, + ScssArbitraryArgument { + value: CssNumber { + value_token: CSS_NUMBER_LITERAL@653..655 "50" [] [], + }, + dotdotdot_token: DOT3@655..658 "..." [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@658..659 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@659..660 ";" [] [], + }, + ], + r_curly_token: R_CURLY@660..662 "}" [Newline("\n")] [], + }, + }, + ], + eof_token: EOF@662..667 "" [Newline("\n"), Newline("\n"), Newline("\n"), Newline("\n"), Newline("\n")] [], +} +``` + +## CST + +``` +0: CSS_ROOT@0..667 + 0: (empty) + 1: CSS_ROOT_ITEM_LIST@0..662 + 0: CSS_QUALIFIED_RULE@0..239 + 0: CSS_SELECTOR_LIST@0..7 + 0: CSS_COMPOUND_SELECTOR@0..7 + 0: CSS_NESTED_SELECTOR_LIST@0..0 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@0..7 + 0: CSS_CLASS_SELECTOR@0..7 + 0: DOT@0..1 "." [] [] + 1: CSS_CUSTOM_IDENTIFIER@1..7 + 0: IDENT@1..7 "calls" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@7..239 + 0: L_CURLY@7..8 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@8..237 + 0: CSS_DECLARATION_WITH_SEMICOLON@8..54 + 0: CSS_DECLARATION@8..53 + 0: CSS_GENERIC_PROPERTY@8..53 + 0: CSS_IDENTIFIER@8..29 + 0: IDENT@8..29 "one-positional-arg" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@29..31 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@31..53 + 0: SCSS_EXPRESSION_ITEM_LIST@31..53 + 0: CSS_FUNCTION@31..53 + 0: CSS_IDENTIFIER@31..49 + 0: IDENT@31..49 "one-positional-arg" [] [] + 1: L_PAREN@49..50 "(" [] [] + 2: CSS_PARAMETER_LIST@50..52 + 0: SCSS_EXPRESSION@50..51 + 0: SCSS_EXPRESSION_ITEM_LIST@50..51 + 0: CSS_IDENTIFIER@50..51 + 0: IDENT@50..51 "a" [] [] + 1: COMMA@51..52 "," [] [] + 3: R_PAREN@52..53 ")" [] [] + 1: (empty) + 1: SEMICOLON@53..54 ";" [] [] + 1: CSS_DECLARATION_WITH_SEMICOLON@54..104 + 0: CSS_DECLARATION@54..103 + 0: CSS_GENERIC_PROPERTY@54..103 + 0: CSS_IDENTIFIER@54..76 + 0: IDENT@54..76 "two-positional-args" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@76..78 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@78..103 + 0: SCSS_EXPRESSION_ITEM_LIST@78..103 + 0: CSS_FUNCTION@78..103 + 0: CSS_IDENTIFIER@78..97 + 0: IDENT@78..97 "two-positional-args" [] [] + 1: L_PAREN@97..98 "(" [] [] + 2: CSS_PARAMETER_LIST@98..102 + 0: SCSS_EXPRESSION@98..99 + 0: SCSS_EXPRESSION_ITEM_LIST@98..99 + 0: CSS_IDENTIFIER@98..99 + 0: IDENT@98..99 "a" [] [] + 1: COMMA@99..100 "," [] [] + 2: SCSS_EXPRESSION@100..101 + 0: SCSS_EXPRESSION_ITEM_LIST@100..101 + 0: CSS_IDENTIFIER@100..101 + 0: IDENT@100..101 "b" [] [] + 3: COMMA@101..102 "," [] [] + 3: R_PAREN@102..103 ")" [] [] + 1: (empty) + 1: SEMICOLON@103..104 ";" [] [] + 2: CSS_DECLARATION_WITH_SEMICOLON@104..148 + 0: CSS_DECLARATION@104..147 + 0: CSS_GENERIC_PROPERTY@104..147 + 0: CSS_IDENTIFIER@104..122 + 0: IDENT@104..122 "one-keyword-arg" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@122..124 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@124..147 + 0: SCSS_EXPRESSION_ITEM_LIST@124..147 + 0: CSS_FUNCTION@124..147 + 0: CSS_IDENTIFIER@124..139 + 0: IDENT@124..139 "one-keyword-arg" [] [] + 1: L_PAREN@139..140 "(" [] [] + 2: CSS_PARAMETER_LIST@140..146 + 0: SCSS_EXPRESSION@140..145 + 0: SCSS_EXPRESSION_ITEM_LIST@140..145 + 0: SCSS_KEYWORD_ARGUMENT@140..145 + 0: SCSS_IDENTIFIER@140..142 + 0: DOLLAR@140..141 "$" [] [] + 1: CSS_IDENTIFIER@141..142 + 0: IDENT@141..142 "a" [] [] + 1: COLON@142..144 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@144..145 + 0: SCSS_EXPRESSION_ITEM_LIST@144..145 + 0: CSS_IDENTIFIER@144..145 + 0: IDENT@144..145 "z" [] [] + 1: COMMA@145..146 "," [] [] + 3: R_PAREN@146..147 ")" [] [] + 1: (empty) + 1: SEMICOLON@147..148 ";" [] [] + 3: CSS_DECLARATION_WITH_SEMICOLON@148..200 + 0: CSS_DECLARATION@148..199 + 0: CSS_GENERIC_PROPERTY@148..199 + 0: CSS_IDENTIFIER@148..167 + 0: IDENT@148..167 "two-keyword-args" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@167..169 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@169..199 + 0: SCSS_EXPRESSION_ITEM_LIST@169..199 + 0: CSS_FUNCTION@169..199 + 0: CSS_IDENTIFIER@169..185 + 0: IDENT@169..185 "two-keyword-args" [] [] + 1: L_PAREN@185..186 "(" [] [] + 2: CSS_PARAMETER_LIST@186..198 + 0: SCSS_EXPRESSION@186..191 + 0: SCSS_EXPRESSION_ITEM_LIST@186..191 + 0: SCSS_KEYWORD_ARGUMENT@186..191 + 0: SCSS_IDENTIFIER@186..188 + 0: DOLLAR@186..187 "$" [] [] + 1: CSS_IDENTIFIER@187..188 + 0: IDENT@187..188 "a" [] [] + 1: COLON@188..190 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@190..191 + 0: SCSS_EXPRESSION_ITEM_LIST@190..191 + 0: CSS_IDENTIFIER@190..191 + 0: IDENT@190..191 "y" [] [] + 1: COMMA@191..192 "," [] [] + 2: SCSS_EXPRESSION@192..197 + 0: SCSS_EXPRESSION_ITEM_LIST@192..197 + 0: SCSS_KEYWORD_ARGUMENT@192..197 + 0: SCSS_IDENTIFIER@192..194 + 0: DOLLAR@192..193 "$" [] [] + 1: CSS_IDENTIFIER@193..194 + 0: IDENT@193..194 "b" [] [] + 1: COLON@194..196 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@196..197 + 0: SCSS_EXPRESSION_ITEM_LIST@196..197 + 0: CSS_IDENTIFIER@196..197 + 0: IDENT@196..197 "z" [] [] + 3: COMMA@197..198 "," [] [] + 3: R_PAREN@198..199 ")" [] [] + 1: (empty) + 1: SEMICOLON@199..200 ";" [] [] + 4: CSS_DECLARATION_WITH_SEMICOLON@200..237 + 0: CSS_DECLARATION@200..236 + 0: CSS_GENERIC_PROPERTY@200..236 + 0: CSS_IDENTIFIER@200..213 + 0: IDENT@200..213 "mixed-args" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@213..215 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@215..236 + 0: SCSS_EXPRESSION_ITEM_LIST@215..236 + 0: CSS_FUNCTION@215..236 + 0: CSS_IDENTIFIER@215..225 + 0: IDENT@215..225 "mixed-args" [] [] + 1: L_PAREN@225..226 "(" [] [] + 2: CSS_PARAMETER_LIST@226..235 + 0: SCSS_EXPRESSION@226..227 + 0: SCSS_EXPRESSION_ITEM_LIST@226..227 + 0: CSS_IDENTIFIER@226..227 + 0: IDENT@226..227 "y" [] [] + 1: COMMA@227..229 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@229..234 + 0: SCSS_EXPRESSION_ITEM_LIST@229..234 + 0: SCSS_KEYWORD_ARGUMENT@229..234 + 0: SCSS_IDENTIFIER@229..231 + 0: DOLLAR@229..230 "$" [] [] + 1: CSS_IDENTIFIER@230..231 + 0: IDENT@230..231 "b" [] [] + 1: COLON@231..233 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@233..234 + 0: SCSS_EXPRESSION_ITEM_LIST@233..234 + 0: CSS_IDENTIFIER@233..234 + 0: IDENT@233..234 "z" [] [] + 3: COMMA@234..235 "," [] [] + 3: R_PAREN@235..236 ")" [] [] + 1: (empty) + 1: SEMICOLON@236..237 ";" [] [] + 2: R_CURLY@237..239 "}" [Newline("\n")] [] + 1: CSS_QUALIFIED_RULE@239..662 + 0: CSS_SELECTOR_LIST@239..256 + 0: CSS_COMPOUND_SELECTOR@239..256 + 0: CSS_NESTED_SELECTOR_LIST@239..239 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@239..256 + 0: CSS_CLASS_SELECTOR@239..256 + 0: DOT@239..242 "." [Newline("\n"), Newline("\n")] [] + 1: CSS_CUSTOM_IDENTIFIER@242..256 + 0: IDENT@242..256 "function-name" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@256..662 + 0: L_CURLY@256..257 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@257..660 + 0: CSS_DECLARATION_WITH_SEMICOLON@257..513 + 0: CSS_DECLARATION@257..512 + 0: CSS_GENERIC_PROPERTY@257..512 + 0: CSS_IDENTIFIER@257..494 + 0: IDENT@257..494 "width" [Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n"), Whitespace(" ")] [] + 1: COLON@494..496 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@496..512 + 0: SCSS_EXPRESSION_ITEM_LIST@496..512 + 0: CSS_FUNCTION@496..512 + 0: CSS_IDENTIFIER@496..499 + 0: IDENT@496..499 "max" [] [] + 1: L_PAREN@499..500 "(" [] [] + 2: CSS_PARAMETER_LIST@500..511 + 0: SCSS_EXPRESSION@500..511 + 0: SCSS_EXPRESSION_ITEM_LIST@500..511 + 0: SCSS_ARBITRARY_ARGUMENT@500..511 + 0: SCSS_IDENTIFIER@500..508 + 0: DOLLAR@500..501 "$" [] [] + 1: CSS_IDENTIFIER@501..508 + 0: IDENT@501..508 "numbers" [] [] + 1: DOT3@508..511 "..." [] [] + 3: R_PAREN@511..512 ")" [] [] + 1: (empty) + 1: SEMICOLON@512..513 ";" [] [] + 1: CSS_DECLARATION_WITH_SEMICOLON@513..544 + 0: CSS_DECLARATION@513..543 + 0: CSS_GENERIC_PROPERTY@513..543 + 0: CSS_IDENTIFIER@513..521 + 0: IDENT@513..521 "width" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@521..523 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@523..543 + 0: SCSS_EXPRESSION_ITEM_LIST@523..543 + 0: CSS_FUNCTION@523..543 + 0: CSS_IDENTIFIER@523..526 + 0: IDENT@523..526 "max" [] [] + 1: L_PAREN@526..527 "(" [] [] + 2: CSS_PARAMETER_LIST@527..542 + 0: SCSS_EXPRESSION@527..542 + 0: SCSS_EXPRESSION_ITEM_LIST@527..542 + 0: SCSS_ARBITRARY_ARGUMENT@527..542 + 0: SCSS_IDENTIFIER@527..539 + 0: DOLLAR@527..528 "$" [] [] + 1: CSS_IDENTIFIER@528..539 + 0: IDENT@528..539 "numbers" [] [Whitespace(" ")] + 1: DOT3@539..542 "..." [] [] + 3: R_PAREN@542..543 ")" [] [] + 1: (empty) + 1: SEMICOLON@543..544 ";" [] [] + 2: CSS_DECLARATION_WITH_SEMICOLON@544..575 + 0: CSS_DECLARATION@544..574 + 0: CSS_GENERIC_PROPERTY@544..574 + 0: CSS_IDENTIFIER@544..552 + 0: IDENT@544..552 "width" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@552..554 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@554..574 + 0: SCSS_EXPRESSION_ITEM_LIST@554..574 + 0: CSS_FUNCTION@554..574 + 0: CSS_IDENTIFIER@554..557 + 0: IDENT@554..557 "max" [] [] + 1: L_PAREN@557..558 "(" [] [] + 2: CSS_PARAMETER_LIST@558..573 + 0: SCSS_EXPRESSION@558..573 + 0: SCSS_EXPRESSION_ITEM_LIST@558..573 + 0: SCSS_ARBITRARY_ARGUMENT@558..573 + 0: SCSS_IDENTIFIER@558..570 + 0: DOLLAR@558..559 "$" [] [] + 1: CSS_IDENTIFIER@559..570 + 0: IDENT@559..570 "numbers" [] [Comments("/**/")] + 1: DOT3@570..573 "..." [] [] + 3: R_PAREN@573..574 ")" [] [] + 1: (empty) + 1: SEMICOLON@574..575 ";" [] [] + 3: CSS_DECLARATION_WITH_SEMICOLON@575..601 + 0: CSS_DECLARATION@575..600 + 0: CSS_GENERIC_PROPERTY@575..600 + 0: CSS_IDENTIFIER@575..582 + 0: IDENT@575..582 "prop" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@582..584 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@584..600 + 0: SCSS_EXPRESSION_ITEM_LIST@584..600 + 0: CSS_FUNCTION@584..600 + 0: CSS_IDENTIFIER@584..586 + 0: IDENT@584..586 "fn" [] [] + 1: L_PAREN@586..587 "(" [] [] + 2: CSS_PARAMETER_LIST@587..599 + 0: SCSS_EXPRESSION@587..599 + 0: SCSS_EXPRESSION_ITEM_LIST@587..599 + 0: SCSS_ARBITRARY_ARGUMENT@587..599 + 0: CSS_IDENTIFIER@587..596 + 0: IDENT@587..596 "value" [] [Whitespace(" ")] + 1: DOT3@596..599 "..." [] [] + 3: R_PAREN@599..600 ")" [] [] + 1: (empty) + 1: SEMICOLON@600..601 ";" [] [] + 4: CSS_DECLARATION_WITH_SEMICOLON@601..627 + 0: CSS_DECLARATION@601..626 + 0: CSS_GENERIC_PROPERTY@601..626 + 0: CSS_IDENTIFIER@601..608 + 0: IDENT@601..608 "prop" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@608..610 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@610..626 + 0: SCSS_EXPRESSION_ITEM_LIST@610..626 + 0: CSS_FUNCTION@610..626 + 0: CSS_IDENTIFIER@610..612 + 0: IDENT@610..612 "fn" [] [] + 1: L_PAREN@612..613 "(" [] [] + 2: CSS_PARAMETER_LIST@613..625 + 0: SCSS_EXPRESSION@613..625 + 0: SCSS_EXPRESSION_ITEM_LIST@613..625 + 0: SCSS_ARBITRARY_ARGUMENT@613..625 + 0: CSS_IDENTIFIER@613..622 + 0: IDENT@613..622 "value" [] [Comments("/**/")] + 1: DOT3@622..625 "..." [] [] + 3: R_PAREN@625..626 ")" [] [] + 1: (empty) + 1: SEMICOLON@626..627 ";" [] [] + 5: CSS_DECLARATION_WITH_SEMICOLON@627..660 + 0: CSS_DECLARATION@627..659 + 0: CSS_GENERIC_PROPERTY@627..659 + 0: CSS_IDENTIFIER@627..635 + 0: IDENT@627..635 "color" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@635..637 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@637..659 + 0: SCSS_EXPRESSION_ITEM_LIST@637..659 + 0: CSS_FUNCTION@637..659 + 0: CSS_IDENTIFIER@637..641 + 0: IDENT@637..641 "rgba" [] [] + 1: L_PAREN@641..642 "(" [] [] + 2: CSS_PARAMETER_LIST@642..658 + 0: SCSS_EXPRESSION@642..658 + 0: SCSS_EXPRESSION_ITEM_LIST@642..658 + 0: CSS_NUMBER@642..645 + 0: CSS_NUMBER_LITERAL@642..645 "50" [] [Whitespace(" ")] + 1: CSS_NUMBER@645..648 + 0: CSS_NUMBER_LITERAL@645..648 "50" [] [Whitespace(" ")] + 2: CSS_NUMBER@648..653 + 0: CSS_NUMBER_LITERAL@648..653 "0.50" [] [Whitespace(" ")] + 3: SCSS_ARBITRARY_ARGUMENT@653..658 + 0: CSS_NUMBER@653..655 + 0: CSS_NUMBER_LITERAL@653..655 "50" [] [] + 1: DOT3@655..658 "..." [] [] + 3: R_PAREN@658..659 ")" [] [] + 1: (empty) + 1: SEMICOLON@659..660 ";" [] [] + 2: R_CURLY@660..662 "}" [Newline("\n")] [] + 2: EOF@662..667 "" [Newline("\n"), Newline("\n"), Newline("\n"), Newline("\n"), Newline("\n")] [] + +``` diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/functions-advanced.scss b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/functions-advanced.scss new file mode 100644 index 000000000000..f2480c55da88 --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/functions-advanced.scss @@ -0,0 +1,306 @@ +// Advanced function tests +/* TODO(scss at-rules): + +// Basic function +@function simple() { + @return 42; +} + +// Function with parameters +@function add($a, $b) { + @return $a + $b; +} + +// Function with default parameters +@function with-defaults($width: 100px, $height: 50px) { + @return $width * $height; +} + +// Function with variadic parameters +@function sum($numbers...) { + $total: 0; + @each $num in $numbers { + $total: $total + $num; + } + @return $total; +} + +// Function with conditional logic +@function abs($number) { + @if $number < 0 { + @return -$number; + } + @return $number; +} + +// Function with complex logic +@function clamp($value, $min, $max) { + @if $value < $min { + @return $min; + } @else if $value > $max { + @return $max; + } + @return $value; +} + +// Function with loop +@function power($base, $exponent) { + $result: 1; + @for $i from 1 through $exponent { + $result: $result * $base; + } + @return $result; +} + +// Function with @while +@function factorial($n) { + $result: 1; + @while $n > 1 { + $result: $result * $n; + $n: $n - 1; + } + @return $result; +} + +// Function with @each +@function list-length($list) { + $count: 0; + @each $item in $list { + $count: $count + 1; + } + @return $count; +} + +// Recursive function +@function fibonacci($n) { + @if $n <= 1 { + @return $n; + } + @return fibonacci($n - 1) + fibonacci($n - 2); +} + +// Function calling another function +@function double($n) { + @return $n * 2; +} + +@function quadruple($n) { + @return double(double($n)); +} + +// Function with map operations +@function get-nested($map, $keys...) { + @each $key in $keys { + $map: map-get($map, $key); + } + @return $map; +} + +// Function with string operations +@function str-replace($string, $search, $replace) { + $index: str-index($string, $search); + @if $index { + @return str-slice($string, 1, $index - 1) + $replace + str-slice($string, $index + str-length($search)); + } + @return $string; +} + +// Function with color operations +@function tint($color, $percentage) { + @return mix(white, $color, $percentage); +} + +@function shade($color, $percentage) { + @return mix(black, $color, $percentage); +} + +// Function with type checking +@function to-number($value) { + @if type-of($value) == "number" { + @return $value; + } + @return 0; +} + +// Function with unit conversion +@function px-to-rem($px, $base: 16px) { + @return ($px / $base) * 1rem; +} + +// Function with multiple returns +@function validate($value) { + @if $value == null { + @return false; + } + @if $value == "" { + @return false; + } + @return true; +} + +// Function with @warn and @error +@function safe-divide($a, $b) { + @if $b == 0 { + @warn "Division by zero"; + @return null; + } + @return $a / $b; +} + +@function strict-divide($a, $b) { + @if $b == 0 { + @error "Cannot divide by zero"; + } + @return $a / $b; +} + +// Function with @debug +@function debug-value($value) { + // TODO(interpolation support): @debug "Value: #{$value}"; + @return $value; +} + +// Function with keyword arguments +@function spacing($top: 0, $right: 0, $bottom: 0, $left: 0) { + @return $top $right $bottom $left; +} + +// Function with trailing comma in parameters +@function trailing-comma($a, $b,) { + @return $a + $b; +} + +// Function with calculations +@function calculate-columns($width, $gap, $count) { + @return ($width - ($gap * ($count - 1))) / $count; +} + +// Function with nested conditionals +@function get-color($name, $variant: "normal") { + @if $name == "primary" { + @if $variant == "light" { + @return #6495ed; + } @else if $variant == "dark" { + @return #00008b; + } @else { + @return #0000ff; + } + } + @return gray; +} + +// Function with list operations +@function reverse-list($list) { + $result: (); + @for $i from length($list) through 1 { + $result: append($result, nth($list, $i)); + } + @return $result; +} + +// Function with map operations +@function merge-deep($map1, $map2) { + $result: $map1; + @each $key, $value in $map2 { + $result: map-merge($result, ($key: $value)); + } + @return $result; +} + +// Function with interpolation +@function generate-selector($prefix, $name) { + // TODO(interpolation support): @return "#{$prefix}-#{$name}"; +} + +// Function returning map +@function create-theme($primary, $secondary) { + @return ( + primary: $primary, + secondary: $secondary, + accent: mix($primary, $secondary, 50%) + ); +} + +// Function returning list +@function create-spacing-scale($base) { + @return ($base, $base * 2, $base * 4, $base * 8); +} + +// Function with null handling +@function default-to($value, $default) { + @if $value == null or $value == "" { + @return $default; + } + @return $value; +} + +// Function with boolean logic +@function is-valid-size($size) { + @return $size > 0 and type-of($size) == "number"; +} + +// Complex real-world function +@function responsive-size($min, $max, $min-vw: 320px, $max-vw: 1200px) { + $slope: ($max - $min) / ($max-vw - $min-vw); + $intercept: $min - $slope * $min-vw; + // TODO(interpolation support): @return clamp(#{$min}, #{$intercept} + #{$slope * 100}vw, #{$max}); +} + +// Function with @at-root (edge case) +@function with-at-root() { + @at-root { + .global { color: red; } + } + @return true; +} + +// Function with variable scoping +@function scoped() { + $local: 10px; + @return $local * 2; +} + +// Function with !global (edge case) +@function global-setter() { + $global-var: 20px !global; + @return $global-var; +} + +// Function with module namespace +@function math-operation() { + @return math.pow(2, 3); +} +*/ + +// Using functions +.test { + simple: simple(); + add: add(10, 20); + defaults: with-defaults(); + sum: sum(1, 2, 3, 4, 5); + abs: abs(-42); + clamp: clamp(50, 0, 100); + power: power(2, 8); + factorial: factorial(5); + double: double(21); + quadruple: quadruple(10); + tint: tint(#f00, 50%); + px-to-rem: px-to-rem(16px); + spacing: spacing($top: 10px, $bottom: 20px); +} + +// Nested function calls +.complex { + value: add(multiply(2, 3), divide(10, 2)); + color: shade(tint(#f00, 20%), 10%); + size: px-to-rem(calculate-columns(1000px, 20px, 4)); +} + +// Function in expressions +.expressions { + width: power(2, 3) + 10px; + height: if(is-valid-size($size), $size, 100px); + margin: spacing($top: add(5px, 5px)); +} + + diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/functions-advanced.scss.snap b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/functions-advanced.scss.snap new file mode 100644 index 000000000000..5fef476a2819 --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/functions-advanced.scss.snap @@ -0,0 +1,1921 @@ +--- +source: crates/biome_css_parser/tests/spec_test.rs +assertion_line: 208 +expression: snapshot +--- + +## Input + +```css +// Advanced function tests +/* TODO(scss at-rules): + +// Basic function +@function simple() { + @return 42; +} + +// Function with parameters +@function add($a, $b) { + @return $a + $b; +} + +// Function with default parameters +@function with-defaults($width: 100px, $height: 50px) { + @return $width * $height; +} + +// Function with variadic parameters +@function sum($numbers...) { + $total: 0; + @each $num in $numbers { + $total: $total + $num; + } + @return $total; +} + +// Function with conditional logic +@function abs($number) { + @if $number < 0 { + @return -$number; + } + @return $number; +} + +// Function with complex logic +@function clamp($value, $min, $max) { + @if $value < $min { + @return $min; + } @else if $value > $max { + @return $max; + } + @return $value; +} + +// Function with loop +@function power($base, $exponent) { + $result: 1; + @for $i from 1 through $exponent { + $result: $result * $base; + } + @return $result; +} + +// Function with @while +@function factorial($n) { + $result: 1; + @while $n > 1 { + $result: $result * $n; + $n: $n - 1; + } + @return $result; +} + +// Function with @each +@function list-length($list) { + $count: 0; + @each $item in $list { + $count: $count + 1; + } + @return $count; +} + +// Recursive function +@function fibonacci($n) { + @if $n <= 1 { + @return $n; + } + @return fibonacci($n - 1) + fibonacci($n - 2); +} + +// Function calling another function +@function double($n) { + @return $n * 2; +} + +@function quadruple($n) { + @return double(double($n)); +} + +// Function with map operations +@function get-nested($map, $keys...) { + @each $key in $keys { + $map: map-get($map, $key); + } + @return $map; +} + +// Function with string operations +@function str-replace($string, $search, $replace) { + $index: str-index($string, $search); + @if $index { + @return str-slice($string, 1, $index - 1) + $replace + str-slice($string, $index + str-length($search)); + } + @return $string; +} + +// Function with color operations +@function tint($color, $percentage) { + @return mix(white, $color, $percentage); +} + +@function shade($color, $percentage) { + @return mix(black, $color, $percentage); +} + +// Function with type checking +@function to-number($value) { + @if type-of($value) == "number" { + @return $value; + } + @return 0; +} + +// Function with unit conversion +@function px-to-rem($px, $base: 16px) { + @return ($px / $base) * 1rem; +} + +// Function with multiple returns +@function validate($value) { + @if $value == null { + @return false; + } + @if $value == "" { + @return false; + } + @return true; +} + +// Function with @warn and @error +@function safe-divide($a, $b) { + @if $b == 0 { + @warn "Division by zero"; + @return null; + } + @return $a / $b; +} + +@function strict-divide($a, $b) { + @if $b == 0 { + @error "Cannot divide by zero"; + } + @return $a / $b; +} + +// Function with @debug +@function debug-value($value) { + // TODO(interpolation support): @debug "Value: #{$value}"; + @return $value; +} + +// Function with keyword arguments +@function spacing($top: 0, $right: 0, $bottom: 0, $left: 0) { + @return $top $right $bottom $left; +} + +// Function with trailing comma in parameters +@function trailing-comma($a, $b,) { + @return $a + $b; +} + +// Function with calculations +@function calculate-columns($width, $gap, $count) { + @return ($width - ($gap * ($count - 1))) / $count; +} + +// Function with nested conditionals +@function get-color($name, $variant: "normal") { + @if $name == "primary" { + @if $variant == "light" { + @return #6495ed; + } @else if $variant == "dark" { + @return #00008b; + } @else { + @return #0000ff; + } + } + @return gray; +} + +// Function with list operations +@function reverse-list($list) { + $result: (); + @for $i from length($list) through 1 { + $result: append($result, nth($list, $i)); + } + @return $result; +} + +// Function with map operations +@function merge-deep($map1, $map2) { + $result: $map1; + @each $key, $value in $map2 { + $result: map-merge($result, ($key: $value)); + } + @return $result; +} + +// Function with interpolation +@function generate-selector($prefix, $name) { + // TODO(interpolation support): @return "#{$prefix}-#{$name}"; +} + +// Function returning map +@function create-theme($primary, $secondary) { + @return ( + primary: $primary, + secondary: $secondary, + accent: mix($primary, $secondary, 50%) + ); +} + +// Function returning list +@function create-spacing-scale($base) { + @return ($base, $base * 2, $base * 4, $base * 8); +} + +// Function with null handling +@function default-to($value, $default) { + @if $value == null or $value == "" { + @return $default; + } + @return $value; +} + +// Function with boolean logic +@function is-valid-size($size) { + @return $size > 0 and type-of($size) == "number"; +} + +// Complex real-world function +@function responsive-size($min, $max, $min-vw: 320px, $max-vw: 1200px) { + $slope: ($max - $min) / ($max-vw - $min-vw); + $intercept: $min - $slope * $min-vw; + // TODO(interpolation support): @return clamp(#{$min}, #{$intercept} + #{$slope * 100}vw, #{$max}); +} + +// Function with @at-root (edge case) +@function with-at-root() { + @at-root { + .global { color: red; } + } + @return true; +} + +// Function with variable scoping +@function scoped() { + $local: 10px; + @return $local * 2; +} + +// Function with !global (edge case) +@function global-setter() { + $global-var: 20px !global; + @return $global-var; +} + +// Function with module namespace +@function math-operation() { + @return math.pow(2, 3); +} +*/ + +// Using functions +.test { + simple: simple(); + add: add(10, 20); + defaults: with-defaults(); + sum: sum(1, 2, 3, 4, 5); + abs: abs(-42); + clamp: clamp(50, 0, 100); + power: power(2, 8); + factorial: factorial(5); + double: double(21); + quadruple: quadruple(10); + tint: tint(#f00, 50%); + px-to-rem: px-to-rem(16px); + spacing: spacing($top: 10px, $bottom: 20px); +} + +// Nested function calls +.complex { + value: add(multiply(2, 3), divide(10, 2)); + color: shade(tint(#f00, 20%), 10%); + size: px-to-rem(calculate-columns(1000px, 20px, 4)); +} + +// Function in expressions +.expressions { + width: power(2, 3) + 10px; + height: if(is-valid-size($size), $size, 100px); + margin: spacing($top: add(5px, 5px)); +} + + + +``` + + +## AST + +``` +CssRoot { + bom_token: missing (optional), + items: CssRootItemList [ + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@0..5498 "." [Comments("// Advanced function ..."), Newline("\n"), Comments("/* TODO(scss at-rules ..."), Newline("\n"), Newline("\n"), Comments("// Using functions"), Newline("\n")] [], + name: CssCustomIdentifier { + value_token: IDENT@5498..5503 "test" [] [Whitespace(" ")], + }, + }, + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@5503..5504 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@5504..5513 "simple" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@5513..5515 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@5515..5521 "simple" [] [], + }, + l_paren_token: L_PAREN@5521..5522 "(" [] [], + items: CssParameterList [], + r_paren_token: R_PAREN@5522..5523 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@5523..5524 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@5524..5530 "add" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@5530..5532 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@5532..5535 "add" [] [], + }, + l_paren_token: L_PAREN@5535..5536 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@5536..5538 "10" [] [], + }, + ], + }, + COMMA@5538..5540 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@5540..5542 "20" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@5542..5543 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@5543..5544 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@5544..5555 "defaults" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@5555..5557 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@5557..5570 "with-defaults" [] [], + }, + l_paren_token: L_PAREN@5570..5571 "(" [] [], + items: CssParameterList [], + r_paren_token: R_PAREN@5571..5572 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@5572..5573 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@5573..5579 "sum" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@5579..5581 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@5581..5584 "sum" [] [], + }, + l_paren_token: L_PAREN@5584..5585 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@5585..5586 "1" [] [], + }, + ], + }, + COMMA@5586..5588 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@5588..5589 "2" [] [], + }, + ], + }, + COMMA@5589..5591 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@5591..5592 "3" [] [], + }, + ], + }, + COMMA@5592..5594 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@5594..5595 "4" [] [], + }, + ], + }, + COMMA@5595..5597 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@5597..5598 "5" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@5598..5599 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@5599..5600 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@5600..5606 "abs" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@5606..5608 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@5608..5611 "abs" [] [], + }, + l_paren_token: L_PAREN@5611..5612 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@5612..5615 "-42" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@5615..5616 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@5616..5617 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@5617..5625 "clamp" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@5625..5627 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@5627..5632 "clamp" [] [], + }, + l_paren_token: L_PAREN@5632..5633 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@5633..5635 "50" [] [], + }, + ], + }, + COMMA@5635..5637 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@5637..5638 "0" [] [], + }, + ], + }, + COMMA@5638..5640 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@5640..5643 "100" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@5643..5644 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@5644..5645 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@5645..5653 "power" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@5653..5655 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@5655..5660 "power" [] [], + }, + l_paren_token: L_PAREN@5660..5661 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@5661..5662 "2" [] [], + }, + ], + }, + COMMA@5662..5664 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@5664..5665 "8" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@5665..5666 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@5666..5667 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@5667..5679 "factorial" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@5679..5681 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@5681..5690 "factorial" [] [], + }, + l_paren_token: L_PAREN@5690..5691 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@5691..5692 "5" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@5692..5693 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@5693..5694 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@5694..5703 "double" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@5703..5705 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@5705..5711 "double" [] [], + }, + l_paren_token: L_PAREN@5711..5712 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@5712..5714 "21" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@5714..5715 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@5715..5716 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@5716..5728 "quadruple" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@5728..5730 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@5730..5739 "quadruple" [] [], + }, + l_paren_token: L_PAREN@5739..5740 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@5740..5742 "10" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@5742..5743 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@5743..5744 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@5744..5751 "tint" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@5751..5753 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@5753..5757 "tint" [] [], + }, + l_paren_token: L_PAREN@5757..5758 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssColor { + hash_token: HASH@5758..5759 "#" [] [], + value_token: CSS_COLOR_LITERAL@5759..5762 "f00" [] [], + }, + ], + }, + COMMA@5762..5764 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssPercentage { + value_token: CSS_NUMBER_LITERAL@5764..5766 "50" [] [], + percent_token: PERCENT@5766..5767 "%" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@5767..5768 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@5768..5769 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@5769..5781 "px-to-rem" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@5781..5783 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@5783..5792 "px-to-rem" [] [], + }, + l_paren_token: L_PAREN@5792..5793 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@5793..5795 "16" [] [], + unit_token: IDENT@5795..5797 "px" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@5797..5798 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@5798..5799 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@5799..5809 "spacing" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@5809..5811 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@5811..5818 "spacing" [] [], + }, + l_paren_token: L_PAREN@5818..5819 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssKeywordArgument { + name: ScssIdentifier { + dollar_token: DOLLAR@5819..5820 "$" [] [], + name: CssIdentifier { + value_token: IDENT@5820..5823 "top" [] [], + }, + }, + colon_token: COLON@5823..5825 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@5825..5827 "10" [] [], + unit_token: IDENT@5827..5829 "px" [] [], + }, + ], + }, + }, + ], + }, + COMMA@5829..5831 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + ScssKeywordArgument { + name: ScssIdentifier { + dollar_token: DOLLAR@5831..5832 "$" [] [], + name: CssIdentifier { + value_token: IDENT@5832..5838 "bottom" [] [], + }, + }, + colon_token: COLON@5838..5840 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@5840..5842 "20" [] [], + unit_token: IDENT@5842..5844 "px" [] [], + }, + ], + }, + }, + ], + }, + ], + r_paren_token: R_PAREN@5844..5845 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@5845..5846 ";" [] [], + }, + ], + r_curly_token: R_CURLY@5846..5848 "}" [Newline("\n")] [], + }, + }, + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@5848..5876 "." [Newline("\n"), Newline("\n"), Comments("// Nested function calls"), Newline("\n")] [], + name: CssCustomIdentifier { + value_token: IDENT@5876..5884 "complex" [] [Whitespace(" ")], + }, + }, + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@5884..5885 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@5885..5893 "value" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@5893..5895 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@5895..5898 "add" [] [], + }, + l_paren_token: L_PAREN@5898..5899 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@5899..5907 "multiply" [] [], + }, + l_paren_token: L_PAREN@5907..5908 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@5908..5909 "2" [] [], + }, + ], + }, + COMMA@5909..5911 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@5911..5912 "3" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@5912..5913 ")" [] [], + }, + ], + }, + COMMA@5913..5915 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@5915..5921 "divide" [] [], + }, + l_paren_token: L_PAREN@5921..5922 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@5922..5924 "10" [] [], + }, + ], + }, + COMMA@5924..5926 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@5926..5927 "2" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@5927..5928 ")" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@5928..5929 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@5929..5930 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@5930..5938 "color" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@5938..5940 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@5940..5945 "shade" [] [], + }, + l_paren_token: L_PAREN@5945..5946 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@5946..5950 "tint" [] [], + }, + l_paren_token: L_PAREN@5950..5951 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssColor { + hash_token: HASH@5951..5952 "#" [] [], + value_token: CSS_COLOR_LITERAL@5952..5955 "f00" [] [], + }, + ], + }, + COMMA@5955..5957 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssPercentage { + value_token: CSS_NUMBER_LITERAL@5957..5959 "20" [] [], + percent_token: PERCENT@5959..5960 "%" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@5960..5961 ")" [] [], + }, + ], + }, + COMMA@5961..5963 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssPercentage { + value_token: CSS_NUMBER_LITERAL@5963..5965 "10" [] [], + percent_token: PERCENT@5965..5966 "%" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@5966..5967 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@5967..5968 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@5968..5975 "size" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@5975..5977 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@5977..5986 "px-to-rem" [] [], + }, + l_paren_token: L_PAREN@5986..5987 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@5987..6004 "calculate-columns" [] [], + }, + l_paren_token: L_PAREN@6004..6005 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@6005..6009 "1000" [] [], + unit_token: IDENT@6009..6011 "px" [] [], + }, + ], + }, + COMMA@6011..6013 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@6013..6015 "20" [] [], + unit_token: IDENT@6015..6017 "px" [] [], + }, + ], + }, + COMMA@6017..6019 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@6019..6020 "4" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@6020..6021 ")" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@6021..6022 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@6022..6023 ";" [] [], + }, + ], + r_curly_token: R_CURLY@6023..6025 "}" [Newline("\n")] [], + }, + }, + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@6025..6055 "." [Newline("\n"), Newline("\n"), Comments("// Function in expres ..."), Newline("\n")] [], + name: CssCustomIdentifier { + value_token: IDENT@6055..6067 "expressions" [] [Whitespace(" ")], + }, + }, + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@6067..6068 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@6068..6076 "width" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@6076..6078 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssBinaryExpression { + left: CssFunction { + name: CssIdentifier { + value_token: IDENT@6078..6083 "power" [] [], + }, + l_paren_token: L_PAREN@6083..6084 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@6084..6085 "2" [] [], + }, + ], + }, + COMMA@6085..6087 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@6087..6088 "3" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@6088..6090 ")" [] [Whitespace(" ")], + }, + operator: PLUS@6090..6092 "+" [] [Whitespace(" ")], + right: CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@6092..6094 "10" [] [], + unit_token: IDENT@6094..6096 "px" [] [], + }, + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@6096..6097 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@6097..6106 "height" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@6106..6108 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@6108..6110 "if" [] [], + }, + l_paren_token: L_PAREN@6110..6111 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@6111..6124 "is-valid-size" [] [], + }, + l_paren_token: L_PAREN@6124..6125 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssIdentifier { + dollar_token: DOLLAR@6125..6126 "$" [] [], + name: CssIdentifier { + value_token: IDENT@6126..6130 "size" [] [], + }, + }, + ], + }, + ], + r_paren_token: R_PAREN@6130..6131 ")" [] [], + }, + ], + }, + COMMA@6131..6133 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + ScssIdentifier { + dollar_token: DOLLAR@6133..6134 "$" [] [], + name: CssIdentifier { + value_token: IDENT@6134..6138 "size" [] [], + }, + }, + ], + }, + COMMA@6138..6140 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@6140..6143 "100" [] [], + unit_token: IDENT@6143..6145 "px" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@6145..6146 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@6146..6147 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@6147..6156 "margin" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@6156..6158 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@6158..6165 "spacing" [] [], + }, + l_paren_token: L_PAREN@6165..6166 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssKeywordArgument { + name: ScssIdentifier { + dollar_token: DOLLAR@6166..6167 "$" [] [], + name: CssIdentifier { + value_token: IDENT@6167..6170 "top" [] [], + }, + }, + colon_token: COLON@6170..6172 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@6172..6175 "add" [] [], + }, + l_paren_token: L_PAREN@6175..6176 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@6176..6177 "5" [] [], + unit_token: IDENT@6177..6179 "px" [] [], + }, + ], + }, + COMMA@6179..6181 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@6181..6182 "5" [] [], + unit_token: IDENT@6182..6184 "px" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@6184..6185 ")" [] [], + }, + ], + }, + }, + ], + }, + ], + r_paren_token: R_PAREN@6185..6186 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@6186..6187 ";" [] [], + }, + ], + r_curly_token: R_CURLY@6187..6189 "}" [Newline("\n")] [], + }, + }, + ], + eof_token: EOF@6189..6192 "" [Newline("\n"), Newline("\n"), Newline("\n")] [], +} +``` + +## CST + +``` +0: CSS_ROOT@0..6192 + 0: (empty) + 1: CSS_ROOT_ITEM_LIST@0..6189 + 0: CSS_QUALIFIED_RULE@0..5848 + 0: CSS_SELECTOR_LIST@0..5503 + 0: CSS_COMPOUND_SELECTOR@0..5503 + 0: CSS_NESTED_SELECTOR_LIST@0..0 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@0..5503 + 0: CSS_CLASS_SELECTOR@0..5503 + 0: DOT@0..5498 "." [Comments("// Advanced function ..."), Newline("\n"), Comments("/* TODO(scss at-rules ..."), Newline("\n"), Newline("\n"), Comments("// Using functions"), Newline("\n")] [] + 1: CSS_CUSTOM_IDENTIFIER@5498..5503 + 0: IDENT@5498..5503 "test" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@5503..5848 + 0: L_CURLY@5503..5504 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@5504..5846 + 0: CSS_DECLARATION_WITH_SEMICOLON@5504..5524 + 0: CSS_DECLARATION@5504..5523 + 0: CSS_GENERIC_PROPERTY@5504..5523 + 0: CSS_IDENTIFIER@5504..5513 + 0: IDENT@5504..5513 "simple" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@5513..5515 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@5515..5523 + 0: SCSS_EXPRESSION_ITEM_LIST@5515..5523 + 0: CSS_FUNCTION@5515..5523 + 0: CSS_IDENTIFIER@5515..5521 + 0: IDENT@5515..5521 "simple" [] [] + 1: L_PAREN@5521..5522 "(" [] [] + 2: CSS_PARAMETER_LIST@5522..5522 + 3: R_PAREN@5522..5523 ")" [] [] + 1: (empty) + 1: SEMICOLON@5523..5524 ";" [] [] + 1: CSS_DECLARATION_WITH_SEMICOLON@5524..5544 + 0: CSS_DECLARATION@5524..5543 + 0: CSS_GENERIC_PROPERTY@5524..5543 + 0: CSS_IDENTIFIER@5524..5530 + 0: IDENT@5524..5530 "add" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@5530..5532 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@5532..5543 + 0: SCSS_EXPRESSION_ITEM_LIST@5532..5543 + 0: CSS_FUNCTION@5532..5543 + 0: CSS_IDENTIFIER@5532..5535 + 0: IDENT@5532..5535 "add" [] [] + 1: L_PAREN@5535..5536 "(" [] [] + 2: CSS_PARAMETER_LIST@5536..5542 + 0: SCSS_EXPRESSION@5536..5538 + 0: SCSS_EXPRESSION_ITEM_LIST@5536..5538 + 0: CSS_NUMBER@5536..5538 + 0: CSS_NUMBER_LITERAL@5536..5538 "10" [] [] + 1: COMMA@5538..5540 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@5540..5542 + 0: SCSS_EXPRESSION_ITEM_LIST@5540..5542 + 0: CSS_NUMBER@5540..5542 + 0: CSS_NUMBER_LITERAL@5540..5542 "20" [] [] + 3: R_PAREN@5542..5543 ")" [] [] + 1: (empty) + 1: SEMICOLON@5543..5544 ";" [] [] + 2: CSS_DECLARATION_WITH_SEMICOLON@5544..5573 + 0: CSS_DECLARATION@5544..5572 + 0: CSS_GENERIC_PROPERTY@5544..5572 + 0: CSS_IDENTIFIER@5544..5555 + 0: IDENT@5544..5555 "defaults" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@5555..5557 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@5557..5572 + 0: SCSS_EXPRESSION_ITEM_LIST@5557..5572 + 0: CSS_FUNCTION@5557..5572 + 0: CSS_IDENTIFIER@5557..5570 + 0: IDENT@5557..5570 "with-defaults" [] [] + 1: L_PAREN@5570..5571 "(" [] [] + 2: CSS_PARAMETER_LIST@5571..5571 + 3: R_PAREN@5571..5572 ")" [] [] + 1: (empty) + 1: SEMICOLON@5572..5573 ";" [] [] + 3: CSS_DECLARATION_WITH_SEMICOLON@5573..5600 + 0: CSS_DECLARATION@5573..5599 + 0: CSS_GENERIC_PROPERTY@5573..5599 + 0: CSS_IDENTIFIER@5573..5579 + 0: IDENT@5573..5579 "sum" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@5579..5581 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@5581..5599 + 0: SCSS_EXPRESSION_ITEM_LIST@5581..5599 + 0: CSS_FUNCTION@5581..5599 + 0: CSS_IDENTIFIER@5581..5584 + 0: IDENT@5581..5584 "sum" [] [] + 1: L_PAREN@5584..5585 "(" [] [] + 2: CSS_PARAMETER_LIST@5585..5598 + 0: SCSS_EXPRESSION@5585..5586 + 0: SCSS_EXPRESSION_ITEM_LIST@5585..5586 + 0: CSS_NUMBER@5585..5586 + 0: CSS_NUMBER_LITERAL@5585..5586 "1" [] [] + 1: COMMA@5586..5588 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@5588..5589 + 0: SCSS_EXPRESSION_ITEM_LIST@5588..5589 + 0: CSS_NUMBER@5588..5589 + 0: CSS_NUMBER_LITERAL@5588..5589 "2" [] [] + 3: COMMA@5589..5591 "," [] [Whitespace(" ")] + 4: SCSS_EXPRESSION@5591..5592 + 0: SCSS_EXPRESSION_ITEM_LIST@5591..5592 + 0: CSS_NUMBER@5591..5592 + 0: CSS_NUMBER_LITERAL@5591..5592 "3" [] [] + 5: COMMA@5592..5594 "," [] [Whitespace(" ")] + 6: SCSS_EXPRESSION@5594..5595 + 0: SCSS_EXPRESSION_ITEM_LIST@5594..5595 + 0: CSS_NUMBER@5594..5595 + 0: CSS_NUMBER_LITERAL@5594..5595 "4" [] [] + 7: COMMA@5595..5597 "," [] [Whitespace(" ")] + 8: SCSS_EXPRESSION@5597..5598 + 0: SCSS_EXPRESSION_ITEM_LIST@5597..5598 + 0: CSS_NUMBER@5597..5598 + 0: CSS_NUMBER_LITERAL@5597..5598 "5" [] [] + 3: R_PAREN@5598..5599 ")" [] [] + 1: (empty) + 1: SEMICOLON@5599..5600 ";" [] [] + 4: CSS_DECLARATION_WITH_SEMICOLON@5600..5617 + 0: CSS_DECLARATION@5600..5616 + 0: CSS_GENERIC_PROPERTY@5600..5616 + 0: CSS_IDENTIFIER@5600..5606 + 0: IDENT@5600..5606 "abs" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@5606..5608 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@5608..5616 + 0: SCSS_EXPRESSION_ITEM_LIST@5608..5616 + 0: CSS_FUNCTION@5608..5616 + 0: CSS_IDENTIFIER@5608..5611 + 0: IDENT@5608..5611 "abs" [] [] + 1: L_PAREN@5611..5612 "(" [] [] + 2: CSS_PARAMETER_LIST@5612..5615 + 0: SCSS_EXPRESSION@5612..5615 + 0: SCSS_EXPRESSION_ITEM_LIST@5612..5615 + 0: CSS_NUMBER@5612..5615 + 0: CSS_NUMBER_LITERAL@5612..5615 "-42" [] [] + 3: R_PAREN@5615..5616 ")" [] [] + 1: (empty) + 1: SEMICOLON@5616..5617 ";" [] [] + 5: CSS_DECLARATION_WITH_SEMICOLON@5617..5645 + 0: CSS_DECLARATION@5617..5644 + 0: CSS_GENERIC_PROPERTY@5617..5644 + 0: CSS_IDENTIFIER@5617..5625 + 0: IDENT@5617..5625 "clamp" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@5625..5627 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@5627..5644 + 0: SCSS_EXPRESSION_ITEM_LIST@5627..5644 + 0: CSS_FUNCTION@5627..5644 + 0: CSS_IDENTIFIER@5627..5632 + 0: IDENT@5627..5632 "clamp" [] [] + 1: L_PAREN@5632..5633 "(" [] [] + 2: CSS_PARAMETER_LIST@5633..5643 + 0: SCSS_EXPRESSION@5633..5635 + 0: SCSS_EXPRESSION_ITEM_LIST@5633..5635 + 0: CSS_NUMBER@5633..5635 + 0: CSS_NUMBER_LITERAL@5633..5635 "50" [] [] + 1: COMMA@5635..5637 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@5637..5638 + 0: SCSS_EXPRESSION_ITEM_LIST@5637..5638 + 0: CSS_NUMBER@5637..5638 + 0: CSS_NUMBER_LITERAL@5637..5638 "0" [] [] + 3: COMMA@5638..5640 "," [] [Whitespace(" ")] + 4: SCSS_EXPRESSION@5640..5643 + 0: SCSS_EXPRESSION_ITEM_LIST@5640..5643 + 0: CSS_NUMBER@5640..5643 + 0: CSS_NUMBER_LITERAL@5640..5643 "100" [] [] + 3: R_PAREN@5643..5644 ")" [] [] + 1: (empty) + 1: SEMICOLON@5644..5645 ";" [] [] + 6: CSS_DECLARATION_WITH_SEMICOLON@5645..5667 + 0: CSS_DECLARATION@5645..5666 + 0: CSS_GENERIC_PROPERTY@5645..5666 + 0: CSS_IDENTIFIER@5645..5653 + 0: IDENT@5645..5653 "power" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@5653..5655 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@5655..5666 + 0: SCSS_EXPRESSION_ITEM_LIST@5655..5666 + 0: CSS_FUNCTION@5655..5666 + 0: CSS_IDENTIFIER@5655..5660 + 0: IDENT@5655..5660 "power" [] [] + 1: L_PAREN@5660..5661 "(" [] [] + 2: CSS_PARAMETER_LIST@5661..5665 + 0: SCSS_EXPRESSION@5661..5662 + 0: SCSS_EXPRESSION_ITEM_LIST@5661..5662 + 0: CSS_NUMBER@5661..5662 + 0: CSS_NUMBER_LITERAL@5661..5662 "2" [] [] + 1: COMMA@5662..5664 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@5664..5665 + 0: SCSS_EXPRESSION_ITEM_LIST@5664..5665 + 0: CSS_NUMBER@5664..5665 + 0: CSS_NUMBER_LITERAL@5664..5665 "8" [] [] + 3: R_PAREN@5665..5666 ")" [] [] + 1: (empty) + 1: SEMICOLON@5666..5667 ";" [] [] + 7: CSS_DECLARATION_WITH_SEMICOLON@5667..5694 + 0: CSS_DECLARATION@5667..5693 + 0: CSS_GENERIC_PROPERTY@5667..5693 + 0: CSS_IDENTIFIER@5667..5679 + 0: IDENT@5667..5679 "factorial" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@5679..5681 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@5681..5693 + 0: SCSS_EXPRESSION_ITEM_LIST@5681..5693 + 0: CSS_FUNCTION@5681..5693 + 0: CSS_IDENTIFIER@5681..5690 + 0: IDENT@5681..5690 "factorial" [] [] + 1: L_PAREN@5690..5691 "(" [] [] + 2: CSS_PARAMETER_LIST@5691..5692 + 0: SCSS_EXPRESSION@5691..5692 + 0: SCSS_EXPRESSION_ITEM_LIST@5691..5692 + 0: CSS_NUMBER@5691..5692 + 0: CSS_NUMBER_LITERAL@5691..5692 "5" [] [] + 3: R_PAREN@5692..5693 ")" [] [] + 1: (empty) + 1: SEMICOLON@5693..5694 ";" [] [] + 8: CSS_DECLARATION_WITH_SEMICOLON@5694..5716 + 0: CSS_DECLARATION@5694..5715 + 0: CSS_GENERIC_PROPERTY@5694..5715 + 0: CSS_IDENTIFIER@5694..5703 + 0: IDENT@5694..5703 "double" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@5703..5705 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@5705..5715 + 0: SCSS_EXPRESSION_ITEM_LIST@5705..5715 + 0: CSS_FUNCTION@5705..5715 + 0: CSS_IDENTIFIER@5705..5711 + 0: IDENT@5705..5711 "double" [] [] + 1: L_PAREN@5711..5712 "(" [] [] + 2: CSS_PARAMETER_LIST@5712..5714 + 0: SCSS_EXPRESSION@5712..5714 + 0: SCSS_EXPRESSION_ITEM_LIST@5712..5714 + 0: CSS_NUMBER@5712..5714 + 0: CSS_NUMBER_LITERAL@5712..5714 "21" [] [] + 3: R_PAREN@5714..5715 ")" [] [] + 1: (empty) + 1: SEMICOLON@5715..5716 ";" [] [] + 9: CSS_DECLARATION_WITH_SEMICOLON@5716..5744 + 0: CSS_DECLARATION@5716..5743 + 0: CSS_GENERIC_PROPERTY@5716..5743 + 0: CSS_IDENTIFIER@5716..5728 + 0: IDENT@5716..5728 "quadruple" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@5728..5730 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@5730..5743 + 0: SCSS_EXPRESSION_ITEM_LIST@5730..5743 + 0: CSS_FUNCTION@5730..5743 + 0: CSS_IDENTIFIER@5730..5739 + 0: IDENT@5730..5739 "quadruple" [] [] + 1: L_PAREN@5739..5740 "(" [] [] + 2: CSS_PARAMETER_LIST@5740..5742 + 0: SCSS_EXPRESSION@5740..5742 + 0: SCSS_EXPRESSION_ITEM_LIST@5740..5742 + 0: CSS_NUMBER@5740..5742 + 0: CSS_NUMBER_LITERAL@5740..5742 "10" [] [] + 3: R_PAREN@5742..5743 ")" [] [] + 1: (empty) + 1: SEMICOLON@5743..5744 ";" [] [] + 10: CSS_DECLARATION_WITH_SEMICOLON@5744..5769 + 0: CSS_DECLARATION@5744..5768 + 0: CSS_GENERIC_PROPERTY@5744..5768 + 0: CSS_IDENTIFIER@5744..5751 + 0: IDENT@5744..5751 "tint" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@5751..5753 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@5753..5768 + 0: SCSS_EXPRESSION_ITEM_LIST@5753..5768 + 0: CSS_FUNCTION@5753..5768 + 0: CSS_IDENTIFIER@5753..5757 + 0: IDENT@5753..5757 "tint" [] [] + 1: L_PAREN@5757..5758 "(" [] [] + 2: CSS_PARAMETER_LIST@5758..5767 + 0: SCSS_EXPRESSION@5758..5762 + 0: SCSS_EXPRESSION_ITEM_LIST@5758..5762 + 0: CSS_COLOR@5758..5762 + 0: HASH@5758..5759 "#" [] [] + 1: CSS_COLOR_LITERAL@5759..5762 "f00" [] [] + 1: COMMA@5762..5764 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@5764..5767 + 0: SCSS_EXPRESSION_ITEM_LIST@5764..5767 + 0: CSS_PERCENTAGE@5764..5767 + 0: CSS_NUMBER_LITERAL@5764..5766 "50" [] [] + 1: PERCENT@5766..5767 "%" [] [] + 3: R_PAREN@5767..5768 ")" [] [] + 1: (empty) + 1: SEMICOLON@5768..5769 ";" [] [] + 11: CSS_DECLARATION_WITH_SEMICOLON@5769..5799 + 0: CSS_DECLARATION@5769..5798 + 0: CSS_GENERIC_PROPERTY@5769..5798 + 0: CSS_IDENTIFIER@5769..5781 + 0: IDENT@5769..5781 "px-to-rem" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@5781..5783 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@5783..5798 + 0: SCSS_EXPRESSION_ITEM_LIST@5783..5798 + 0: CSS_FUNCTION@5783..5798 + 0: CSS_IDENTIFIER@5783..5792 + 0: IDENT@5783..5792 "px-to-rem" [] [] + 1: L_PAREN@5792..5793 "(" [] [] + 2: CSS_PARAMETER_LIST@5793..5797 + 0: SCSS_EXPRESSION@5793..5797 + 0: SCSS_EXPRESSION_ITEM_LIST@5793..5797 + 0: CSS_REGULAR_DIMENSION@5793..5797 + 0: CSS_NUMBER_LITERAL@5793..5795 "16" [] [] + 1: IDENT@5795..5797 "px" [] [] + 3: R_PAREN@5797..5798 ")" [] [] + 1: (empty) + 1: SEMICOLON@5798..5799 ";" [] [] + 12: CSS_DECLARATION_WITH_SEMICOLON@5799..5846 + 0: CSS_DECLARATION@5799..5845 + 0: CSS_GENERIC_PROPERTY@5799..5845 + 0: CSS_IDENTIFIER@5799..5809 + 0: IDENT@5799..5809 "spacing" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@5809..5811 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@5811..5845 + 0: SCSS_EXPRESSION_ITEM_LIST@5811..5845 + 0: CSS_FUNCTION@5811..5845 + 0: CSS_IDENTIFIER@5811..5818 + 0: IDENT@5811..5818 "spacing" [] [] + 1: L_PAREN@5818..5819 "(" [] [] + 2: CSS_PARAMETER_LIST@5819..5844 + 0: SCSS_EXPRESSION@5819..5829 + 0: SCSS_EXPRESSION_ITEM_LIST@5819..5829 + 0: SCSS_KEYWORD_ARGUMENT@5819..5829 + 0: SCSS_IDENTIFIER@5819..5823 + 0: DOLLAR@5819..5820 "$" [] [] + 1: CSS_IDENTIFIER@5820..5823 + 0: IDENT@5820..5823 "top" [] [] + 1: COLON@5823..5825 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@5825..5829 + 0: SCSS_EXPRESSION_ITEM_LIST@5825..5829 + 0: CSS_REGULAR_DIMENSION@5825..5829 + 0: CSS_NUMBER_LITERAL@5825..5827 "10" [] [] + 1: IDENT@5827..5829 "px" [] [] + 1: COMMA@5829..5831 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@5831..5844 + 0: SCSS_EXPRESSION_ITEM_LIST@5831..5844 + 0: SCSS_KEYWORD_ARGUMENT@5831..5844 + 0: SCSS_IDENTIFIER@5831..5838 + 0: DOLLAR@5831..5832 "$" [] [] + 1: CSS_IDENTIFIER@5832..5838 + 0: IDENT@5832..5838 "bottom" [] [] + 1: COLON@5838..5840 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@5840..5844 + 0: SCSS_EXPRESSION_ITEM_LIST@5840..5844 + 0: CSS_REGULAR_DIMENSION@5840..5844 + 0: CSS_NUMBER_LITERAL@5840..5842 "20" [] [] + 1: IDENT@5842..5844 "px" [] [] + 3: R_PAREN@5844..5845 ")" [] [] + 1: (empty) + 1: SEMICOLON@5845..5846 ";" [] [] + 2: R_CURLY@5846..5848 "}" [Newline("\n")] [] + 1: CSS_QUALIFIED_RULE@5848..6025 + 0: CSS_SELECTOR_LIST@5848..5884 + 0: CSS_COMPOUND_SELECTOR@5848..5884 + 0: CSS_NESTED_SELECTOR_LIST@5848..5848 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@5848..5884 + 0: CSS_CLASS_SELECTOR@5848..5884 + 0: DOT@5848..5876 "." [Newline("\n"), Newline("\n"), Comments("// Nested function calls"), Newline("\n")] [] + 1: CSS_CUSTOM_IDENTIFIER@5876..5884 + 0: IDENT@5876..5884 "complex" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@5884..6025 + 0: L_CURLY@5884..5885 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@5885..6023 + 0: CSS_DECLARATION_WITH_SEMICOLON@5885..5930 + 0: CSS_DECLARATION@5885..5929 + 0: CSS_GENERIC_PROPERTY@5885..5929 + 0: CSS_IDENTIFIER@5885..5893 + 0: IDENT@5885..5893 "value" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@5893..5895 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@5895..5929 + 0: SCSS_EXPRESSION_ITEM_LIST@5895..5929 + 0: CSS_FUNCTION@5895..5929 + 0: CSS_IDENTIFIER@5895..5898 + 0: IDENT@5895..5898 "add" [] [] + 1: L_PAREN@5898..5899 "(" [] [] + 2: CSS_PARAMETER_LIST@5899..5928 + 0: SCSS_EXPRESSION@5899..5913 + 0: SCSS_EXPRESSION_ITEM_LIST@5899..5913 + 0: CSS_FUNCTION@5899..5913 + 0: CSS_IDENTIFIER@5899..5907 + 0: IDENT@5899..5907 "multiply" [] [] + 1: L_PAREN@5907..5908 "(" [] [] + 2: CSS_PARAMETER_LIST@5908..5912 + 0: SCSS_EXPRESSION@5908..5909 + 0: SCSS_EXPRESSION_ITEM_LIST@5908..5909 + 0: CSS_NUMBER@5908..5909 + 0: CSS_NUMBER_LITERAL@5908..5909 "2" [] [] + 1: COMMA@5909..5911 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@5911..5912 + 0: SCSS_EXPRESSION_ITEM_LIST@5911..5912 + 0: CSS_NUMBER@5911..5912 + 0: CSS_NUMBER_LITERAL@5911..5912 "3" [] [] + 3: R_PAREN@5912..5913 ")" [] [] + 1: COMMA@5913..5915 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@5915..5928 + 0: SCSS_EXPRESSION_ITEM_LIST@5915..5928 + 0: CSS_FUNCTION@5915..5928 + 0: CSS_IDENTIFIER@5915..5921 + 0: IDENT@5915..5921 "divide" [] [] + 1: L_PAREN@5921..5922 "(" [] [] + 2: CSS_PARAMETER_LIST@5922..5927 + 0: SCSS_EXPRESSION@5922..5924 + 0: SCSS_EXPRESSION_ITEM_LIST@5922..5924 + 0: CSS_NUMBER@5922..5924 + 0: CSS_NUMBER_LITERAL@5922..5924 "10" [] [] + 1: COMMA@5924..5926 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@5926..5927 + 0: SCSS_EXPRESSION_ITEM_LIST@5926..5927 + 0: CSS_NUMBER@5926..5927 + 0: CSS_NUMBER_LITERAL@5926..5927 "2" [] [] + 3: R_PAREN@5927..5928 ")" [] [] + 3: R_PAREN@5928..5929 ")" [] [] + 1: (empty) + 1: SEMICOLON@5929..5930 ";" [] [] + 1: CSS_DECLARATION_WITH_SEMICOLON@5930..5968 + 0: CSS_DECLARATION@5930..5967 + 0: CSS_GENERIC_PROPERTY@5930..5967 + 0: CSS_IDENTIFIER@5930..5938 + 0: IDENT@5930..5938 "color" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@5938..5940 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@5940..5967 + 0: SCSS_EXPRESSION_ITEM_LIST@5940..5967 + 0: CSS_FUNCTION@5940..5967 + 0: CSS_IDENTIFIER@5940..5945 + 0: IDENT@5940..5945 "shade" [] [] + 1: L_PAREN@5945..5946 "(" [] [] + 2: CSS_PARAMETER_LIST@5946..5966 + 0: SCSS_EXPRESSION@5946..5961 + 0: SCSS_EXPRESSION_ITEM_LIST@5946..5961 + 0: CSS_FUNCTION@5946..5961 + 0: CSS_IDENTIFIER@5946..5950 + 0: IDENT@5946..5950 "tint" [] [] + 1: L_PAREN@5950..5951 "(" [] [] + 2: CSS_PARAMETER_LIST@5951..5960 + 0: SCSS_EXPRESSION@5951..5955 + 0: SCSS_EXPRESSION_ITEM_LIST@5951..5955 + 0: CSS_COLOR@5951..5955 + 0: HASH@5951..5952 "#" [] [] + 1: CSS_COLOR_LITERAL@5952..5955 "f00" [] [] + 1: COMMA@5955..5957 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@5957..5960 + 0: SCSS_EXPRESSION_ITEM_LIST@5957..5960 + 0: CSS_PERCENTAGE@5957..5960 + 0: CSS_NUMBER_LITERAL@5957..5959 "20" [] [] + 1: PERCENT@5959..5960 "%" [] [] + 3: R_PAREN@5960..5961 ")" [] [] + 1: COMMA@5961..5963 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@5963..5966 + 0: SCSS_EXPRESSION_ITEM_LIST@5963..5966 + 0: CSS_PERCENTAGE@5963..5966 + 0: CSS_NUMBER_LITERAL@5963..5965 "10" [] [] + 1: PERCENT@5965..5966 "%" [] [] + 3: R_PAREN@5966..5967 ")" [] [] + 1: (empty) + 1: SEMICOLON@5967..5968 ";" [] [] + 2: CSS_DECLARATION_WITH_SEMICOLON@5968..6023 + 0: CSS_DECLARATION@5968..6022 + 0: CSS_GENERIC_PROPERTY@5968..6022 + 0: CSS_IDENTIFIER@5968..5975 + 0: IDENT@5968..5975 "size" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@5975..5977 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@5977..6022 + 0: SCSS_EXPRESSION_ITEM_LIST@5977..6022 + 0: CSS_FUNCTION@5977..6022 + 0: CSS_IDENTIFIER@5977..5986 + 0: IDENT@5977..5986 "px-to-rem" [] [] + 1: L_PAREN@5986..5987 "(" [] [] + 2: CSS_PARAMETER_LIST@5987..6021 + 0: SCSS_EXPRESSION@5987..6021 + 0: SCSS_EXPRESSION_ITEM_LIST@5987..6021 + 0: CSS_FUNCTION@5987..6021 + 0: CSS_IDENTIFIER@5987..6004 + 0: IDENT@5987..6004 "calculate-columns" [] [] + 1: L_PAREN@6004..6005 "(" [] [] + 2: CSS_PARAMETER_LIST@6005..6020 + 0: SCSS_EXPRESSION@6005..6011 + 0: SCSS_EXPRESSION_ITEM_LIST@6005..6011 + 0: CSS_REGULAR_DIMENSION@6005..6011 + 0: CSS_NUMBER_LITERAL@6005..6009 "1000" [] [] + 1: IDENT@6009..6011 "px" [] [] + 1: COMMA@6011..6013 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@6013..6017 + 0: SCSS_EXPRESSION_ITEM_LIST@6013..6017 + 0: CSS_REGULAR_DIMENSION@6013..6017 + 0: CSS_NUMBER_LITERAL@6013..6015 "20" [] [] + 1: IDENT@6015..6017 "px" [] [] + 3: COMMA@6017..6019 "," [] [Whitespace(" ")] + 4: SCSS_EXPRESSION@6019..6020 + 0: SCSS_EXPRESSION_ITEM_LIST@6019..6020 + 0: CSS_NUMBER@6019..6020 + 0: CSS_NUMBER_LITERAL@6019..6020 "4" [] [] + 3: R_PAREN@6020..6021 ")" [] [] + 3: R_PAREN@6021..6022 ")" [] [] + 1: (empty) + 1: SEMICOLON@6022..6023 ";" [] [] + 2: R_CURLY@6023..6025 "}" [Newline("\n")] [] + 2: CSS_QUALIFIED_RULE@6025..6189 + 0: CSS_SELECTOR_LIST@6025..6067 + 0: CSS_COMPOUND_SELECTOR@6025..6067 + 0: CSS_NESTED_SELECTOR_LIST@6025..6025 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@6025..6067 + 0: CSS_CLASS_SELECTOR@6025..6067 + 0: DOT@6025..6055 "." [Newline("\n"), Newline("\n"), Comments("// Function in expres ..."), Newline("\n")] [] + 1: CSS_CUSTOM_IDENTIFIER@6055..6067 + 0: IDENT@6055..6067 "expressions" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@6067..6189 + 0: L_CURLY@6067..6068 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@6068..6187 + 0: CSS_DECLARATION_WITH_SEMICOLON@6068..6097 + 0: CSS_DECLARATION@6068..6096 + 0: CSS_GENERIC_PROPERTY@6068..6096 + 0: CSS_IDENTIFIER@6068..6076 + 0: IDENT@6068..6076 "width" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@6076..6078 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@6078..6096 + 0: SCSS_EXPRESSION_ITEM_LIST@6078..6096 + 0: SCSS_BINARY_EXPRESSION@6078..6096 + 0: CSS_FUNCTION@6078..6090 + 0: CSS_IDENTIFIER@6078..6083 + 0: IDENT@6078..6083 "power" [] [] + 1: L_PAREN@6083..6084 "(" [] [] + 2: CSS_PARAMETER_LIST@6084..6088 + 0: SCSS_EXPRESSION@6084..6085 + 0: SCSS_EXPRESSION_ITEM_LIST@6084..6085 + 0: CSS_NUMBER@6084..6085 + 0: CSS_NUMBER_LITERAL@6084..6085 "2" [] [] + 1: COMMA@6085..6087 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@6087..6088 + 0: SCSS_EXPRESSION_ITEM_LIST@6087..6088 + 0: CSS_NUMBER@6087..6088 + 0: CSS_NUMBER_LITERAL@6087..6088 "3" [] [] + 3: R_PAREN@6088..6090 ")" [] [Whitespace(" ")] + 1: PLUS@6090..6092 "+" [] [Whitespace(" ")] + 2: CSS_REGULAR_DIMENSION@6092..6096 + 0: CSS_NUMBER_LITERAL@6092..6094 "10" [] [] + 1: IDENT@6094..6096 "px" [] [] + 1: (empty) + 1: SEMICOLON@6096..6097 ";" [] [] + 1: CSS_DECLARATION_WITH_SEMICOLON@6097..6147 + 0: CSS_DECLARATION@6097..6146 + 0: CSS_GENERIC_PROPERTY@6097..6146 + 0: CSS_IDENTIFIER@6097..6106 + 0: IDENT@6097..6106 "height" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@6106..6108 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@6108..6146 + 0: SCSS_EXPRESSION_ITEM_LIST@6108..6146 + 0: CSS_FUNCTION@6108..6146 + 0: CSS_IDENTIFIER@6108..6110 + 0: IDENT@6108..6110 "if" [] [] + 1: L_PAREN@6110..6111 "(" [] [] + 2: CSS_PARAMETER_LIST@6111..6145 + 0: SCSS_EXPRESSION@6111..6131 + 0: SCSS_EXPRESSION_ITEM_LIST@6111..6131 + 0: CSS_FUNCTION@6111..6131 + 0: CSS_IDENTIFIER@6111..6124 + 0: IDENT@6111..6124 "is-valid-size" [] [] + 1: L_PAREN@6124..6125 "(" [] [] + 2: CSS_PARAMETER_LIST@6125..6130 + 0: SCSS_EXPRESSION@6125..6130 + 0: SCSS_EXPRESSION_ITEM_LIST@6125..6130 + 0: SCSS_IDENTIFIER@6125..6130 + 0: DOLLAR@6125..6126 "$" [] [] + 1: CSS_IDENTIFIER@6126..6130 + 0: IDENT@6126..6130 "size" [] [] + 3: R_PAREN@6130..6131 ")" [] [] + 1: COMMA@6131..6133 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@6133..6138 + 0: SCSS_EXPRESSION_ITEM_LIST@6133..6138 + 0: SCSS_IDENTIFIER@6133..6138 + 0: DOLLAR@6133..6134 "$" [] [] + 1: CSS_IDENTIFIER@6134..6138 + 0: IDENT@6134..6138 "size" [] [] + 3: COMMA@6138..6140 "," [] [Whitespace(" ")] + 4: SCSS_EXPRESSION@6140..6145 + 0: SCSS_EXPRESSION_ITEM_LIST@6140..6145 + 0: CSS_REGULAR_DIMENSION@6140..6145 + 0: CSS_NUMBER_LITERAL@6140..6143 "100" [] [] + 1: IDENT@6143..6145 "px" [] [] + 3: R_PAREN@6145..6146 ")" [] [] + 1: (empty) + 1: SEMICOLON@6146..6147 ";" [] [] + 2: CSS_DECLARATION_WITH_SEMICOLON@6147..6187 + 0: CSS_DECLARATION@6147..6186 + 0: CSS_GENERIC_PROPERTY@6147..6186 + 0: CSS_IDENTIFIER@6147..6156 + 0: IDENT@6147..6156 "margin" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@6156..6158 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@6158..6186 + 0: SCSS_EXPRESSION_ITEM_LIST@6158..6186 + 0: CSS_FUNCTION@6158..6186 + 0: CSS_IDENTIFIER@6158..6165 + 0: IDENT@6158..6165 "spacing" [] [] + 1: L_PAREN@6165..6166 "(" [] [] + 2: CSS_PARAMETER_LIST@6166..6185 + 0: SCSS_EXPRESSION@6166..6185 + 0: SCSS_EXPRESSION_ITEM_LIST@6166..6185 + 0: SCSS_KEYWORD_ARGUMENT@6166..6185 + 0: SCSS_IDENTIFIER@6166..6170 + 0: DOLLAR@6166..6167 "$" [] [] + 1: CSS_IDENTIFIER@6167..6170 + 0: IDENT@6167..6170 "top" [] [] + 1: COLON@6170..6172 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@6172..6185 + 0: SCSS_EXPRESSION_ITEM_LIST@6172..6185 + 0: CSS_FUNCTION@6172..6185 + 0: CSS_IDENTIFIER@6172..6175 + 0: IDENT@6172..6175 "add" [] [] + 1: L_PAREN@6175..6176 "(" [] [] + 2: CSS_PARAMETER_LIST@6176..6184 + 0: SCSS_EXPRESSION@6176..6179 + 0: SCSS_EXPRESSION_ITEM_LIST@6176..6179 + 0: CSS_REGULAR_DIMENSION@6176..6179 + 0: CSS_NUMBER_LITERAL@6176..6177 "5" [] [] + 1: IDENT@6177..6179 "px" [] [] + 1: COMMA@6179..6181 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@6181..6184 + 0: SCSS_EXPRESSION_ITEM_LIST@6181..6184 + 0: CSS_REGULAR_DIMENSION@6181..6184 + 0: CSS_NUMBER_LITERAL@6181..6182 "5" [] [] + 1: IDENT@6182..6184 "px" [] [] + 3: R_PAREN@6184..6185 ")" [] [] + 3: R_PAREN@6185..6186 ")" [] [] + 1: (empty) + 1: SEMICOLON@6186..6187 ";" [] [] + 2: R_CURLY@6187..6189 "}" [Newline("\n")] [] + 2: EOF@6189..6192 "" [Newline("\n"), Newline("\n"), Newline("\n")] [] + +``` diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/if-disambiguation.scss b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/if-disambiguation.scss new file mode 100644 index 000000000000..69bec5d6ae7d --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/if-disambiguation.scss @@ -0,0 +1,8 @@ +.test { + color: if(style(--scheme: dark): #eeeeee; else: black;); + background: if(media(print): white; else: black;); + border-color: if(supports(color: red): red; else: blue;); + outline-color: if(not style(--scheme: light): white; else: black;); + accent-color: if((style(--scheme: dark)): green; else: red;); + height: if(is-valid-size($size), $size, 100px); +} diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/if-disambiguation.scss.snap b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/if-disambiguation.scss.snap new file mode 100644 index 000000000000..74c000d6ec70 --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/if-disambiguation.scss.snap @@ -0,0 +1,724 @@ +--- +source: crates/biome_css_parser/tests/spec_test.rs +assertion_line: 208 +expression: snapshot +--- + +## Input + +```css +.test { + color: if(style(--scheme: dark): #eeeeee; else: black;); + background: if(media(print): white; else: black;); + border-color: if(supports(color: red): red; else: blue;); + outline-color: if(not style(--scheme: light): white; else: black;); + accent-color: if((style(--scheme: dark)): green; else: red;); + height: if(is-valid-size($size), $size, 100px); +} + +``` + + +## AST + +``` +CssRoot { + bom_token: missing (optional), + items: CssRootItemList [ + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@0..1 "." [] [], + name: CssCustomIdentifier { + value_token: IDENT@1..6 "test" [] [Whitespace(" ")], + }, + }, + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@6..7 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@7..15 "color" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@15..17 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIfFunction { + if_token: IF_KW@17..19 "if" [] [], + l_paren_token: L_PAREN@19..20 "(" [] [], + css_if_branch_list: CssIfBranchList [ + CssIfBranch { + condition: CssIfStyleTest { + style_token: STYLE_KW@20..25 "style" [] [], + l_paren_token: L_PAREN@25..26 "(" [] [], + test: CssDeclaration { + property: CssGenericProperty { + name: CssDashedIdentifier { + value_token: IDENT@26..34 "--scheme" [] [], + }, + colon_token: COLON@34..36 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@36..40 "dark" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + r_paren_token: R_PAREN@40..41 ")" [] [], + }, + colon_token: COLON@41..43 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssColor { + hash_token: HASH@43..44 "#" [] [], + value_token: CSS_COLOR_LITERAL@44..50 "eeeeee" [] [], + }, + ], + }, + SEMICOLON@50..52 ";" [] [Whitespace(" ")], + CssIfBranch { + condition: CssElseKeyword { + else_token: ELSE_KW@52..56 "else" [] [], + }, + colon_token: COLON@56..58 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@58..63 "black" [] [], + }, + ], + }, + SEMICOLON@63..64 ";" [] [], + ], + r_paren_token: R_PAREN@64..65 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@65..66 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@66..79 "background" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@79..81 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIfFunction { + if_token: IF_KW@81..83 "if" [] [], + l_paren_token: L_PAREN@83..84 "(" [] [], + css_if_branch_list: CssIfBranchList [ + CssIfBranch { + condition: CssIfMediaTest { + media_token: MEDIA_KW@84..89 "media" [] [], + l_paren_token: L_PAREN@89..90 "(" [] [], + test: CssQueryFeatureBoolean { + name: CssIdentifier { + value_token: IDENT@90..95 "print" [] [], + }, + }, + r_paren_token: R_PAREN@95..96 ")" [] [], + }, + colon_token: COLON@96..98 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@98..103 "white" [] [], + }, + ], + }, + SEMICOLON@103..105 ";" [] [Whitespace(" ")], + CssIfBranch { + condition: CssElseKeyword { + else_token: ELSE_KW@105..109 "else" [] [], + }, + colon_token: COLON@109..111 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@111..116 "black" [] [], + }, + ], + }, + SEMICOLON@116..117 ";" [] [], + ], + r_paren_token: R_PAREN@117..118 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@118..119 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@119..134 "border-color" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@134..136 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIfFunction { + if_token: IF_KW@136..138 "if" [] [], + l_paren_token: L_PAREN@138..139 "(" [] [], + css_if_branch_list: CssIfBranchList [ + CssIfBranch { + condition: CssIfSupportsTest { + supports_token: SUPPORTS_KW@139..147 "supports" [] [], + l_paren_token: L_PAREN@147..148 "(" [] [], + test: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@148..153 "color" [] [], + }, + colon_token: COLON@153..155 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@155..158 "red" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + r_paren_token: R_PAREN@158..159 ")" [] [], + }, + colon_token: COLON@159..161 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@161..164 "red" [] [], + }, + ], + }, + SEMICOLON@164..166 ";" [] [Whitespace(" ")], + CssIfBranch { + condition: CssElseKeyword { + else_token: ELSE_KW@166..170 "else" [] [], + }, + colon_token: COLON@170..172 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@172..176 "blue" [] [], + }, + ], + }, + SEMICOLON@176..177 ";" [] [], + ], + r_paren_token: R_PAREN@177..178 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@178..179 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@179..195 "outline-color" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@195..197 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIfFunction { + if_token: IF_KW@197..199 "if" [] [], + l_paren_token: L_PAREN@199..200 "(" [] [], + css_if_branch_list: CssIfBranchList [ + CssIfBranch { + condition: CssIfTestBooleanNotExpr { + not_token: NOT_KW@200..204 "not" [] [Whitespace(" ")], + expression: CssIfStyleTest { + style_token: STYLE_KW@204..209 "style" [] [], + l_paren_token: L_PAREN@209..210 "(" [] [], + test: CssDeclaration { + property: CssGenericProperty { + name: CssDashedIdentifier { + value_token: IDENT@210..218 "--scheme" [] [], + }, + colon_token: COLON@218..220 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@220..225 "light" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + r_paren_token: R_PAREN@225..226 ")" [] [], + }, + }, + colon_token: COLON@226..228 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@228..233 "white" [] [], + }, + ], + }, + SEMICOLON@233..235 ";" [] [Whitespace(" ")], + CssIfBranch { + condition: CssElseKeyword { + else_token: ELSE_KW@235..239 "else" [] [], + }, + colon_token: COLON@239..241 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@241..246 "black" [] [], + }, + ], + }, + SEMICOLON@246..247 ";" [] [], + ], + r_paren_token: R_PAREN@247..248 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@248..249 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@249..264 "accent-color" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@264..266 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIfFunction { + if_token: IF_KW@266..268 "if" [] [], + l_paren_token: L_PAREN@268..269 "(" [] [], + css_if_branch_list: CssIfBranchList [ + CssIfBranch { + condition: CssIfTestBooleanExprInParens { + l_paren_token: L_PAREN@269..270 "(" [] [], + expression: CssIfStyleTest { + style_token: STYLE_KW@270..275 "style" [] [], + l_paren_token: L_PAREN@275..276 "(" [] [], + test: CssDeclaration { + property: CssGenericProperty { + name: CssDashedIdentifier { + value_token: IDENT@276..284 "--scheme" [] [], + }, + colon_token: COLON@284..286 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@286..290 "dark" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + r_paren_token: R_PAREN@290..291 ")" [] [], + }, + r_paren_token: R_PAREN@291..292 ")" [] [], + }, + colon_token: COLON@292..294 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@294..299 "green" [] [], + }, + ], + }, + SEMICOLON@299..301 ";" [] [Whitespace(" ")], + CssIfBranch { + condition: CssElseKeyword { + else_token: ELSE_KW@301..305 "else" [] [], + }, + colon_token: COLON@305..307 ":" [] [Whitespace(" ")], + value: CssGenericComponentValueList [ + CssIdentifier { + value_token: IDENT@307..310 "red" [] [], + }, + ], + }, + SEMICOLON@310..311 ";" [] [], + ], + r_paren_token: R_PAREN@311..312 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@312..313 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@313..322 "height" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@322..324 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@324..326 "if" [] [], + }, + l_paren_token: L_PAREN@326..327 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@327..340 "is-valid-size" [] [], + }, + l_paren_token: L_PAREN@340..341 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssIdentifier { + dollar_token: DOLLAR@341..342 "$" [] [], + name: CssIdentifier { + value_token: IDENT@342..346 "size" [] [], + }, + }, + ], + }, + ], + r_paren_token: R_PAREN@346..347 ")" [] [], + }, + ], + }, + COMMA@347..349 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + ScssIdentifier { + dollar_token: DOLLAR@349..350 "$" [] [], + name: CssIdentifier { + value_token: IDENT@350..354 "size" [] [], + }, + }, + ], + }, + COMMA@354..356 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@356..359 "100" [] [], + unit_token: IDENT@359..361 "px" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@361..362 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@362..363 ";" [] [], + }, + ], + r_curly_token: R_CURLY@363..365 "}" [Newline("\n")] [], + }, + }, + ], + eof_token: EOF@365..366 "" [Newline("\n")] [], +} +``` + +## CST + +``` +0: CSS_ROOT@0..366 + 0: (empty) + 1: CSS_ROOT_ITEM_LIST@0..365 + 0: CSS_QUALIFIED_RULE@0..365 + 0: CSS_SELECTOR_LIST@0..6 + 0: CSS_COMPOUND_SELECTOR@0..6 + 0: CSS_NESTED_SELECTOR_LIST@0..0 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@0..6 + 0: CSS_CLASS_SELECTOR@0..6 + 0: DOT@0..1 "." [] [] + 1: CSS_CUSTOM_IDENTIFIER@1..6 + 0: IDENT@1..6 "test" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@6..365 + 0: L_CURLY@6..7 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@7..363 + 0: CSS_DECLARATION_WITH_SEMICOLON@7..66 + 0: CSS_DECLARATION@7..65 + 0: CSS_GENERIC_PROPERTY@7..65 + 0: CSS_IDENTIFIER@7..15 + 0: IDENT@7..15 "color" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@15..17 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@17..65 + 0: SCSS_EXPRESSION_ITEM_LIST@17..65 + 0: CSS_IF_FUNCTION@17..65 + 0: IF_KW@17..19 "if" [] [] + 1: L_PAREN@19..20 "(" [] [] + 2: CSS_IF_BRANCH_LIST@20..64 + 0: CSS_IF_BRANCH@20..50 + 0: CSS_IF_STYLE_TEST@20..41 + 0: STYLE_KW@20..25 "style" [] [] + 1: L_PAREN@25..26 "(" [] [] + 2: CSS_DECLARATION@26..40 + 0: CSS_GENERIC_PROPERTY@26..40 + 0: CSS_DASHED_IDENTIFIER@26..34 + 0: IDENT@26..34 "--scheme" [] [] + 1: COLON@34..36 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@36..40 + 0: SCSS_EXPRESSION_ITEM_LIST@36..40 + 0: CSS_IDENTIFIER@36..40 + 0: IDENT@36..40 "dark" [] [] + 1: (empty) + 3: R_PAREN@40..41 ")" [] [] + 1: COLON@41..43 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@43..50 + 0: CSS_COLOR@43..50 + 0: HASH@43..44 "#" [] [] + 1: CSS_COLOR_LITERAL@44..50 "eeeeee" [] [] + 1: SEMICOLON@50..52 ";" [] [Whitespace(" ")] + 2: CSS_IF_BRANCH@52..63 + 0: CSS_ELSE_KEYWORD@52..56 + 0: ELSE_KW@52..56 "else" [] [] + 1: COLON@56..58 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@58..63 + 0: CSS_IDENTIFIER@58..63 + 0: IDENT@58..63 "black" [] [] + 3: SEMICOLON@63..64 ";" [] [] + 3: R_PAREN@64..65 ")" [] [] + 1: (empty) + 1: SEMICOLON@65..66 ";" [] [] + 1: CSS_DECLARATION_WITH_SEMICOLON@66..119 + 0: CSS_DECLARATION@66..118 + 0: CSS_GENERIC_PROPERTY@66..118 + 0: CSS_IDENTIFIER@66..79 + 0: IDENT@66..79 "background" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@79..81 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@81..118 + 0: SCSS_EXPRESSION_ITEM_LIST@81..118 + 0: CSS_IF_FUNCTION@81..118 + 0: IF_KW@81..83 "if" [] [] + 1: L_PAREN@83..84 "(" [] [] + 2: CSS_IF_BRANCH_LIST@84..117 + 0: CSS_IF_BRANCH@84..103 + 0: CSS_IF_MEDIA_TEST@84..96 + 0: MEDIA_KW@84..89 "media" [] [] + 1: L_PAREN@89..90 "(" [] [] + 2: CSS_QUERY_FEATURE_BOOLEAN@90..95 + 0: CSS_IDENTIFIER@90..95 + 0: IDENT@90..95 "print" [] [] + 3: R_PAREN@95..96 ")" [] [] + 1: COLON@96..98 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@98..103 + 0: CSS_IDENTIFIER@98..103 + 0: IDENT@98..103 "white" [] [] + 1: SEMICOLON@103..105 ";" [] [Whitespace(" ")] + 2: CSS_IF_BRANCH@105..116 + 0: CSS_ELSE_KEYWORD@105..109 + 0: ELSE_KW@105..109 "else" [] [] + 1: COLON@109..111 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@111..116 + 0: CSS_IDENTIFIER@111..116 + 0: IDENT@111..116 "black" [] [] + 3: SEMICOLON@116..117 ";" [] [] + 3: R_PAREN@117..118 ")" [] [] + 1: (empty) + 1: SEMICOLON@118..119 ";" [] [] + 2: CSS_DECLARATION_WITH_SEMICOLON@119..179 + 0: CSS_DECLARATION@119..178 + 0: CSS_GENERIC_PROPERTY@119..178 + 0: CSS_IDENTIFIER@119..134 + 0: IDENT@119..134 "border-color" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@134..136 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@136..178 + 0: SCSS_EXPRESSION_ITEM_LIST@136..178 + 0: CSS_IF_FUNCTION@136..178 + 0: IF_KW@136..138 "if" [] [] + 1: L_PAREN@138..139 "(" [] [] + 2: CSS_IF_BRANCH_LIST@139..177 + 0: CSS_IF_BRANCH@139..164 + 0: CSS_IF_SUPPORTS_TEST@139..159 + 0: SUPPORTS_KW@139..147 "supports" [] [] + 1: L_PAREN@147..148 "(" [] [] + 2: CSS_DECLARATION@148..158 + 0: CSS_GENERIC_PROPERTY@148..158 + 0: CSS_IDENTIFIER@148..153 + 0: IDENT@148..153 "color" [] [] + 1: COLON@153..155 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@155..158 + 0: SCSS_EXPRESSION_ITEM_LIST@155..158 + 0: CSS_IDENTIFIER@155..158 + 0: IDENT@155..158 "red" [] [] + 1: (empty) + 3: R_PAREN@158..159 ")" [] [] + 1: COLON@159..161 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@161..164 + 0: CSS_IDENTIFIER@161..164 + 0: IDENT@161..164 "red" [] [] + 1: SEMICOLON@164..166 ";" [] [Whitespace(" ")] + 2: CSS_IF_BRANCH@166..176 + 0: CSS_ELSE_KEYWORD@166..170 + 0: ELSE_KW@166..170 "else" [] [] + 1: COLON@170..172 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@172..176 + 0: CSS_IDENTIFIER@172..176 + 0: IDENT@172..176 "blue" [] [] + 3: SEMICOLON@176..177 ";" [] [] + 3: R_PAREN@177..178 ")" [] [] + 1: (empty) + 1: SEMICOLON@178..179 ";" [] [] + 3: CSS_DECLARATION_WITH_SEMICOLON@179..249 + 0: CSS_DECLARATION@179..248 + 0: CSS_GENERIC_PROPERTY@179..248 + 0: CSS_IDENTIFIER@179..195 + 0: IDENT@179..195 "outline-color" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@195..197 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@197..248 + 0: SCSS_EXPRESSION_ITEM_LIST@197..248 + 0: CSS_IF_FUNCTION@197..248 + 0: IF_KW@197..199 "if" [] [] + 1: L_PAREN@199..200 "(" [] [] + 2: CSS_IF_BRANCH_LIST@200..247 + 0: CSS_IF_BRANCH@200..233 + 0: CSS_IF_TEST_BOOLEAN_NOT_EXPR@200..226 + 0: NOT_KW@200..204 "not" [] [Whitespace(" ")] + 1: CSS_IF_STYLE_TEST@204..226 + 0: STYLE_KW@204..209 "style" [] [] + 1: L_PAREN@209..210 "(" [] [] + 2: CSS_DECLARATION@210..225 + 0: CSS_GENERIC_PROPERTY@210..225 + 0: CSS_DASHED_IDENTIFIER@210..218 + 0: IDENT@210..218 "--scheme" [] [] + 1: COLON@218..220 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@220..225 + 0: SCSS_EXPRESSION_ITEM_LIST@220..225 + 0: CSS_IDENTIFIER@220..225 + 0: IDENT@220..225 "light" [] [] + 1: (empty) + 3: R_PAREN@225..226 ")" [] [] + 1: COLON@226..228 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@228..233 + 0: CSS_IDENTIFIER@228..233 + 0: IDENT@228..233 "white" [] [] + 1: SEMICOLON@233..235 ";" [] [Whitespace(" ")] + 2: CSS_IF_BRANCH@235..246 + 0: CSS_ELSE_KEYWORD@235..239 + 0: ELSE_KW@235..239 "else" [] [] + 1: COLON@239..241 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@241..246 + 0: CSS_IDENTIFIER@241..246 + 0: IDENT@241..246 "black" [] [] + 3: SEMICOLON@246..247 ";" [] [] + 3: R_PAREN@247..248 ")" [] [] + 1: (empty) + 1: SEMICOLON@248..249 ";" [] [] + 4: CSS_DECLARATION_WITH_SEMICOLON@249..313 + 0: CSS_DECLARATION@249..312 + 0: CSS_GENERIC_PROPERTY@249..312 + 0: CSS_IDENTIFIER@249..264 + 0: IDENT@249..264 "accent-color" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@264..266 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@266..312 + 0: SCSS_EXPRESSION_ITEM_LIST@266..312 + 0: CSS_IF_FUNCTION@266..312 + 0: IF_KW@266..268 "if" [] [] + 1: L_PAREN@268..269 "(" [] [] + 2: CSS_IF_BRANCH_LIST@269..311 + 0: CSS_IF_BRANCH@269..299 + 0: CSS_IF_TEST_BOOLEAN_EXPR_IN_PARENS@269..292 + 0: L_PAREN@269..270 "(" [] [] + 1: CSS_IF_STYLE_TEST@270..291 + 0: STYLE_KW@270..275 "style" [] [] + 1: L_PAREN@275..276 "(" [] [] + 2: CSS_DECLARATION@276..290 + 0: CSS_GENERIC_PROPERTY@276..290 + 0: CSS_DASHED_IDENTIFIER@276..284 + 0: IDENT@276..284 "--scheme" [] [] + 1: COLON@284..286 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@286..290 + 0: SCSS_EXPRESSION_ITEM_LIST@286..290 + 0: CSS_IDENTIFIER@286..290 + 0: IDENT@286..290 "dark" [] [] + 1: (empty) + 3: R_PAREN@290..291 ")" [] [] + 2: R_PAREN@291..292 ")" [] [] + 1: COLON@292..294 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@294..299 + 0: CSS_IDENTIFIER@294..299 + 0: IDENT@294..299 "green" [] [] + 1: SEMICOLON@299..301 ";" [] [Whitespace(" ")] + 2: CSS_IF_BRANCH@301..310 + 0: CSS_ELSE_KEYWORD@301..305 + 0: ELSE_KW@301..305 "else" [] [] + 1: COLON@305..307 ":" [] [Whitespace(" ")] + 2: CSS_GENERIC_COMPONENT_VALUE_LIST@307..310 + 0: CSS_IDENTIFIER@307..310 + 0: IDENT@307..310 "red" [] [] + 3: SEMICOLON@310..311 ";" [] [] + 3: R_PAREN@311..312 ")" [] [] + 1: (empty) + 1: SEMICOLON@312..313 ";" [] [] + 5: CSS_DECLARATION_WITH_SEMICOLON@313..363 + 0: CSS_DECLARATION@313..362 + 0: CSS_GENERIC_PROPERTY@313..362 + 0: CSS_IDENTIFIER@313..322 + 0: IDENT@313..322 "height" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@322..324 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@324..362 + 0: SCSS_EXPRESSION_ITEM_LIST@324..362 + 0: CSS_FUNCTION@324..362 + 0: CSS_IDENTIFIER@324..326 + 0: IDENT@324..326 "if" [] [] + 1: L_PAREN@326..327 "(" [] [] + 2: CSS_PARAMETER_LIST@327..361 + 0: SCSS_EXPRESSION@327..347 + 0: SCSS_EXPRESSION_ITEM_LIST@327..347 + 0: CSS_FUNCTION@327..347 + 0: CSS_IDENTIFIER@327..340 + 0: IDENT@327..340 "is-valid-size" [] [] + 1: L_PAREN@340..341 "(" [] [] + 2: CSS_PARAMETER_LIST@341..346 + 0: SCSS_EXPRESSION@341..346 + 0: SCSS_EXPRESSION_ITEM_LIST@341..346 + 0: SCSS_IDENTIFIER@341..346 + 0: DOLLAR@341..342 "$" [] [] + 1: CSS_IDENTIFIER@342..346 + 0: IDENT@342..346 "size" [] [] + 3: R_PAREN@346..347 ")" [] [] + 1: COMMA@347..349 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@349..354 + 0: SCSS_EXPRESSION_ITEM_LIST@349..354 + 0: SCSS_IDENTIFIER@349..354 + 0: DOLLAR@349..350 "$" [] [] + 1: CSS_IDENTIFIER@350..354 + 0: IDENT@350..354 "size" [] [] + 3: COMMA@354..356 "," [] [Whitespace(" ")] + 4: SCSS_EXPRESSION@356..361 + 0: SCSS_EXPRESSION_ITEM_LIST@356..361 + 0: CSS_REGULAR_DIMENSION@356..361 + 0: CSS_NUMBER_LITERAL@356..359 "100" [] [] + 1: IDENT@359..361 "px" [] [] + 3: R_PAREN@361..362 ")" [] [] + 1: (empty) + 1: SEMICOLON@362..363 ";" [] [] + 2: R_CURLY@363..365 "}" [Newline("\n")] [] + 2: EOF@365..366 "" [Newline("\n")] [] + +``` diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/list-advanced.scss b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/list-advanced.scss new file mode 100644 index 000000000000..d2f79ec2c5c2 --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/list-advanced.scss @@ -0,0 +1,154 @@ +// Advanced list syntax tests + +// Empty list +$empty: (); + +// Single item list with comma +$single-comma: (item,); + +// Single item list without comma +$single-space: (item); + +// Space-separated list +$space-list: a b c d e; + +// Comma-separated list +$comma-list: a, b, c, d, e; + +// Mixed nesting +$mixed: (a b, c d, e f); + +// List with trailing comma +$trailing: (a, b, c,); + +// List with interpolation +// TODO(interpolation support): $interpolated: (a, #{$var}, c); +// TODO(interpolation support): $interpolated-space: a #{$var} c; +// List with calculations +$calculations: (10px + 5px, 20px * 2, 100px / 4); + +// List with functions +$functions: (rgb(255, 0, 0), calc(100% - 20px), url("image.png")); + +// Deeply nested lists +$nested: ((a, b), (c, d), (e, f)); +$deep: (((a, b), (c, d)), ((e, f), (g, h))); + +// List with maps +$with-maps: ((key1: val1), (key2: val2)); + +// List with mixed types +$mixed-types: ( + true, + false, + null, + 123, + "string", + $variable, +); + +// List with quoted strings +$quoted: ("a", 'b', "c d", 'e f'); + +// List with unquoted strings +$unquoted: (foo, bar, baz); + +// List as function argument +.test { + content: list-function((a, b, c)); + value: another-function(x y z); +} + +// List in variable with different separators +$brackets: [a, b, c]; // Note: SCSS doesn't have native bracket lists, but can be parsed +$parens-comma: (a, b, c); +$parens-space: (a b c); + +// Multi-line list +$multiline-comma: ( + item1, + item2, + item3, + item4, +); + +$multiline-space: ( + item1 + item2 + item3 + item4 +); + +// List with operators (space-separated takes precedence) +$with-operators: a + b c * d; +$parenthesized: (a + b) (c * d); + +// List with negative numbers +$negatives: (-1, -2, -3); +$negative-space: -1 -2 -3; + +// List with units +$units: 10px 20em 30% 40vh; + +// Complex expressions in list +$expressions: ( + (1 + 2), + ($a * $b), + (10px / 2), +); + +// List with special values +$special: ( + inherit, + initial, + unset, + auto, +); + +// List with color values +$colors: (#fff, rgb(0, 0, 0), hsl(120, 100%, 50%)); + +// List with CSS keywords +$keywords: ( + none, + auto, + inherit, + initial, + unset, + revert, +); + +// Slash-separated (for font shorthand) +$font: 16px/1.5; +$font-list: (12px/1.2, 14px/1.4, 16px/1.6); + +// List with URL +$urls: (url("a.png"), url('b.jpg'), url(c.gif)); + +// List with custom properties +$custom: (--var-1, --var-2, --var-3); + +// List with attr() +$attrs: (attr(data-foo), attr(data-bar)); + +// Nested space and comma lists +$complex-nested: (a b, c d e, f); + +// List with calc +$calcs: (calc(100% - 10px), calc(50vh - 20px)); + +// Empty items in list (compressed) +$sparse: (a,, c); // Note: This might be invalid, testing parser + +// List with important (edge case) +$with-important: (red !important, blue); + +// Unicode in lists +$unicode: (émoji, 🎨, 日本語, ключ); + +// Escaped characters in lists +$escaped: (\escaped, "escaped\"quote", 'escaped\'quote'); + + + + diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/list-advanced.scss.snap b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/list-advanced.scss.snap new file mode 100644 index 000000000000..b0f4d5df402d --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/list-advanced.scss.snap @@ -0,0 +1,4418 @@ +--- +source: crates/biome_css_parser/tests/spec_test.rs +assertion_line: 208 +expression: snapshot +--- + +## Input + +```css +// Advanced list syntax tests + +// Empty list +$empty: (); + +// Single item list with comma +$single-comma: (item,); + +// Single item list without comma +$single-space: (item); + +// Space-separated list +$space-list: a b c d e; + +// Comma-separated list +$comma-list: a, b, c, d, e; + +// Mixed nesting +$mixed: (a b, c d, e f); + +// List with trailing comma +$trailing: (a, b, c,); + +// List with interpolation +// TODO(interpolation support): $interpolated: (a, #{$var}, c); +// TODO(interpolation support): $interpolated-space: a #{$var} c; +// List with calculations +$calculations: (10px + 5px, 20px * 2, 100px / 4); + +// List with functions +$functions: (rgb(255, 0, 0), calc(100% - 20px), url("image.png")); + +// Deeply nested lists +$nested: ((a, b), (c, d), (e, f)); +$deep: (((a, b), (c, d)), ((e, f), (g, h))); + +// List with maps +$with-maps: ((key1: val1), (key2: val2)); + +// List with mixed types +$mixed-types: ( + true, + false, + null, + 123, + "string", + $variable, +); + +// List with quoted strings +$quoted: ("a", 'b', "c d", 'e f'); + +// List with unquoted strings +$unquoted: (foo, bar, baz); + +// List as function argument +.test { + content: list-function((a, b, c)); + value: another-function(x y z); +} + +// List in variable with different separators +$brackets: [a, b, c]; // Note: SCSS doesn't have native bracket lists, but can be parsed +$parens-comma: (a, b, c); +$parens-space: (a b c); + +// Multi-line list +$multiline-comma: ( + item1, + item2, + item3, + item4, +); + +$multiline-space: ( + item1 + item2 + item3 + item4 +); + +// List with operators (space-separated takes precedence) +$with-operators: a + b c * d; +$parenthesized: (a + b) (c * d); + +// List with negative numbers +$negatives: (-1, -2, -3); +$negative-space: -1 -2 -3; + +// List with units +$units: 10px 20em 30% 40vh; + +// Complex expressions in list +$expressions: ( + (1 + 2), + ($a * $b), + (10px / 2), +); + +// List with special values +$special: ( + inherit, + initial, + unset, + auto, +); + +// List with color values +$colors: (#fff, rgb(0, 0, 0), hsl(120, 100%, 50%)); + +// List with CSS keywords +$keywords: ( + none, + auto, + inherit, + initial, + unset, + revert, +); + +// Slash-separated (for font shorthand) +$font: 16px/1.5; +$font-list: (12px/1.2, 14px/1.4, 16px/1.6); + +// List with URL +$urls: (url("a.png"), url('b.jpg'), url(c.gif)); + +// List with custom properties +$custom: (--var-1, --var-2, --var-3); + +// List with attr() +$attrs: (attr(data-foo), attr(data-bar)); + +// Nested space and comma lists +$complex-nested: (a b, c d e, f); + +// List with calc +$calcs: (calc(100% - 10px), calc(50vh - 20px)); + +// Empty items in list (compressed) +$sparse: (a,, c); // Note: This might be invalid, testing parser + +// List with important (edge case) +$with-important: (red !important, blue); + +// Unicode in lists +$unicode: (émoji, 🎨, 日本語, ключ); + +// Escaped characters in lists +$escaped: (\escaped, "escaped\"quote", 'escaped\'quote'); + + + + + +``` + + +## AST + +``` +CssRoot { + bom_token: missing (optional), + items: CssRootItemList [ + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@0..46 "$" [Comments("// Advanced list synt ..."), Newline("\n"), Newline("\n"), Comments("// Empty list"), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@46..51 "empty" [] [], + }, + }, + colon_token: COLON@51..53 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@53..54 "(" [] [], + pairs: ScssMapExpressionPairList [], + r_paren_token: R_PAREN@54..55 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@55..56 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@56..90 "$" [Newline("\n"), Newline("\n"), Comments("// Single item list w ..."), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@90..102 "single-comma" [] [], + }, + }, + colon_token: COLON@102..104 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@104..105 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@105..109 "item" [] [], + }, + ], + }, + }, + COMMA@109..110 "," [] [], + ], + }, + r_paren_token: R_PAREN@110..111 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@111..112 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@112..149 "$" [Newline("\n"), Newline("\n"), Comments("// Single item list w ..."), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@149..161 "single-space" [] [], + }, + }, + colon_token: COLON@161..163 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@163..164 "(" [] [], + expression: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@164..168 "item" [] [], + }, + ], + }, + r_paren_token: R_PAREN@168..169 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@169..170 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@170..197 "$" [Newline("\n"), Newline("\n"), Comments("// Space-separated list"), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@197..207 "space-list" [] [], + }, + }, + colon_token: COLON@207..209 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@209..211 "a" [] [Whitespace(" ")], + }, + CssIdentifier { + value_token: IDENT@211..213 "b" [] [Whitespace(" ")], + }, + CssIdentifier { + value_token: IDENT@213..215 "c" [] [Whitespace(" ")], + }, + CssIdentifier { + value_token: IDENT@215..217 "d" [] [Whitespace(" ")], + }, + CssIdentifier { + value_token: IDENT@217..218 "e" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@218..219 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@219..246 "$" [Newline("\n"), Newline("\n"), Comments("// Comma-separated list"), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@246..256 "comma-list" [] [], + }, + }, + colon_token: COLON@256..258 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@258..259 "a" [] [], + }, + ], + }, + }, + COMMA@259..261 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@261..262 "b" [] [], + }, + ], + }, + }, + COMMA@262..264 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@264..265 "c" [] [], + }, + ], + }, + }, + COMMA@265..267 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@267..268 "d" [] [], + }, + ], + }, + }, + COMMA@268..270 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@270..271 "e" [] [], + }, + ], + }, + }, + ], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@271..272 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@272..292 "$" [Newline("\n"), Newline("\n"), Comments("// Mixed nesting"), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@292..297 "mixed" [] [], + }, + }, + colon_token: COLON@297..299 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@299..300 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@300..302 "a" [] [Whitespace(" ")], + }, + CssIdentifier { + value_token: IDENT@302..303 "b" [] [], + }, + ], + }, + }, + COMMA@303..305 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@305..307 "c" [] [Whitespace(" ")], + }, + CssIdentifier { + value_token: IDENT@307..308 "d" [] [], + }, + ], + }, + }, + COMMA@308..310 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@310..312 "e" [] [Whitespace(" ")], + }, + CssIdentifier { + value_token: IDENT@312..313 "f" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@313..314 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@314..315 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@315..346 "$" [Newline("\n"), Newline("\n"), Comments("// List with trailing ..."), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@346..354 "trailing" [] [], + }, + }, + colon_token: COLON@354..356 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@356..357 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@357..358 "a" [] [], + }, + ], + }, + }, + COMMA@358..360 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@360..361 "b" [] [], + }, + ], + }, + }, + COMMA@361..363 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@363..364 "c" [] [], + }, + ], + }, + }, + COMMA@364..365 "," [] [], + ], + }, + r_paren_token: R_PAREN@365..366 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@366..367 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@367..553 "$" [Newline("\n"), Newline("\n"), Comments("// List with interpol ..."), Newline("\n"), Comments("// TODO(interpolation ..."), Newline("\n"), Comments("// TODO(interpolation ..."), Newline("\n"), Comments("// List with calculat ..."), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@553..565 "calculations" [] [], + }, + }, + colon_token: COLON@565..567 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@567..568 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + ScssBinaryExpression { + left: CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@568..570 "10" [] [], + unit_token: IDENT@570..573 "px" [] [Whitespace(" ")], + }, + operator: PLUS@573..575 "+" [] [Whitespace(" ")], + right: CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@575..576 "5" [] [], + unit_token: IDENT@576..578 "px" [] [], + }, + }, + ], + }, + }, + COMMA@578..580 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + ScssBinaryExpression { + left: CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@580..582 "20" [] [], + unit_token: IDENT@582..585 "px" [] [Whitespace(" ")], + }, + operator: STAR@585..587 "*" [] [Whitespace(" ")], + right: CssNumber { + value_token: CSS_NUMBER_LITERAL@587..588 "2" [] [], + }, + }, + ], + }, + }, + COMMA@588..590 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + ScssBinaryExpression { + left: CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@590..593 "100" [] [], + unit_token: IDENT@593..596 "px" [] [Whitespace(" ")], + }, + operator: SLASH@596..598 "/" [] [Whitespace(" ")], + right: CssNumber { + value_token: CSS_NUMBER_LITERAL@598..599 "4" [] [], + }, + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@599..600 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@600..601 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@601..627 "$" [Newline("\n"), Newline("\n"), Comments("// List with functions"), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@627..636 "functions" [] [], + }, + }, + colon_token: COLON@636..638 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@638..639 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@639..642 "rgb" [] [], + }, + l_paren_token: L_PAREN@642..643 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@643..646 "255" [] [], + }, + ], + }, + COMMA@646..648 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@648..649 "0" [] [], + }, + ], + }, + COMMA@649..651 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@651..652 "0" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@652..653 ")" [] [], + }, + ], + }, + }, + COMMA@653..655 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@655..659 "calc" [] [], + }, + l_paren_token: L_PAREN@659..660 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssBinaryExpression { + left: CssPercentage { + value_token: CSS_NUMBER_LITERAL@660..663 "100" [] [], + percent_token: PERCENT@663..665 "%" [] [Whitespace(" ")], + }, + operator: MINUS@665..667 "-" [] [Whitespace(" ")], + right: CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@667..669 "20" [] [], + unit_token: IDENT@669..671 "px" [] [], + }, + }, + ], + }, + ], + r_paren_token: R_PAREN@671..672 ")" [] [], + }, + ], + }, + }, + COMMA@672..674 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssUrlFunction { + name: URL_KW@674..677 "url" [] [], + l_paren_token: L_PAREN@677..678 "(" [] [], + value: CssString { + value_token: CSS_STRING_LITERAL@678..689 "\"image.png\"" [] [], + }, + modifiers: CssUrlModifierList [], + r_paren_token: R_PAREN@689..690 ")" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@690..691 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@691..692 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@692..718 "$" [Newline("\n"), Newline("\n"), Comments("// Deeply nested lists"), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@718..724 "nested" [] [], + }, + }, + colon_token: COLON@724..726 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@726..727 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@727..728 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@728..729 "a" [] [], + }, + ], + }, + }, + COMMA@729..731 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@731..732 "b" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@732..733 ")" [] [], + }, + ], + }, + }, + COMMA@733..735 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@735..736 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@736..737 "c" [] [], + }, + ], + }, + }, + COMMA@737..739 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@739..740 "d" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@740..741 ")" [] [], + }, + ], + }, + }, + COMMA@741..743 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@743..744 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@744..745 "e" [] [], + }, + ], + }, + }, + COMMA@745..747 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@747..748 "f" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@748..749 ")" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@749..750 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@750..751 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@751..753 "$" [Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@753..757 "deep" [] [], + }, + }, + colon_token: COLON@757..759 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@759..760 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@760..761 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@761..762 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@762..763 "a" [] [], + }, + ], + }, + }, + COMMA@763..765 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@765..766 "b" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@766..767 ")" [] [], + }, + ], + }, + }, + COMMA@767..769 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@769..770 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@770..771 "c" [] [], + }, + ], + }, + }, + COMMA@771..773 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@773..774 "d" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@774..775 ")" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@775..776 ")" [] [], + }, + ], + }, + }, + COMMA@776..778 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@778..779 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@779..780 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@780..781 "e" [] [], + }, + ], + }, + }, + COMMA@781..783 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@783..784 "f" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@784..785 ")" [] [], + }, + ], + }, + }, + COMMA@785..787 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@787..788 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@788..789 "g" [] [], + }, + ], + }, + }, + COMMA@789..791 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@791..792 "h" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@792..793 ")" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@793..794 ")" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@794..795 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@795..796 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@796..817 "$" [Newline("\n"), Newline("\n"), Comments("// List with maps"), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@817..826 "with-maps" [] [], + }, + }, + colon_token: COLON@826..828 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@828..829 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@829..830 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@830..834 "key1" [] [], + }, + ], + }, + colon_token: COLON@834..836 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@836..840 "val1" [] [], + }, + ], + }, + }, + ], + r_paren_token: R_PAREN@840..841 ")" [] [], + }, + ], + }, + }, + COMMA@841..843 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@843..844 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@844..848 "key2" [] [], + }, + ], + }, + colon_token: COLON@848..850 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@850..854 "val2" [] [], + }, + ], + }, + }, + ], + r_paren_token: R_PAREN@854..855 ")" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@855..856 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@856..857 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@857..885 "$" [Newline("\n"), Newline("\n"), Comments("// List with mixed types"), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@885..896 "mixed-types" [] [], + }, + }, + colon_token: COLON@896..898 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@898..899 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@899..906 "true" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + }, + COMMA@906..907 "," [] [], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@907..915 "false" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + }, + COMMA@915..916 "," [] [], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@916..923 "null" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + }, + COMMA@923..924 "," [] [], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@924..930 "123" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + }, + COMMA@930..931 "," [] [], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@931..942 "\"string\"" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + }, + COMMA@942..943 "," [] [], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + ScssIdentifier { + dollar_token: DOLLAR@943..947 "$" [Newline("\n"), Whitespace(" ")] [], + name: CssIdentifier { + value_token: IDENT@947..955 "variable" [] [], + }, + }, + ], + }, + }, + COMMA@955..956 "," [] [], + ], + }, + r_paren_token: R_PAREN@956..958 ")" [Newline("\n")] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@958..959 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@959..990 "$" [Newline("\n"), Newline("\n"), Comments("// List with quoted s ..."), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@990..996 "quoted" [] [], + }, + }, + colon_token: COLON@996..998 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@998..999 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@999..1002 "\"a\"" [] [], + }, + ], + }, + }, + COMMA@1002..1004 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@1004..1007 "'b'" [] [], + }, + ], + }, + }, + COMMA@1007..1009 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@1009..1014 "\"c d\"" [] [], + }, + ], + }, + }, + COMMA@1014..1016 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@1016..1021 "'e f'" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@1021..1022 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@1022..1023 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@1023..1056 "$" [Newline("\n"), Newline("\n"), Comments("// List with unquoted ..."), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@1056..1064 "unquoted" [] [], + }, + }, + colon_token: COLON@1064..1066 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@1066..1067 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1067..1070 "foo" [] [], + }, + ], + }, + }, + COMMA@1070..1072 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1072..1075 "bar" [] [], + }, + ], + }, + }, + COMMA@1075..1077 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1077..1080 "baz" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@1080..1081 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@1081..1082 ";" [] [], + }, + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@1082..1114 "." [Newline("\n"), Newline("\n"), Comments("// List as function a ..."), Newline("\n")] [], + name: CssCustomIdentifier { + value_token: IDENT@1114..1119 "test" [] [Whitespace(" ")], + }, + }, + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@1119..1120 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1120..1130 "content" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@1130..1132 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@1132..1145 "list-function" [] [], + }, + l_paren_token: L_PAREN@1145..1146 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@1146..1147 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1147..1148 "a" [] [], + }, + ], + }, + }, + COMMA@1148..1150 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1150..1151 "b" [] [], + }, + ], + }, + }, + COMMA@1151..1153 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1153..1154 "c" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@1154..1155 ")" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@1155..1156 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1156..1157 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1157..1165 "value" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@1165..1167 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@1167..1183 "another-function" [] [], + }, + l_paren_token: L_PAREN@1183..1184 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1184..1186 "x" [] [Whitespace(" ")], + }, + CssIdentifier { + value_token: IDENT@1186..1188 "y" [] [Whitespace(" ")], + }, + CssIdentifier { + value_token: IDENT@1188..1189 "z" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@1189..1190 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1190..1191 ";" [] [], + }, + ], + r_curly_token: R_CURLY@1191..1193 "}" [Newline("\n")] [], + }, + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@1193..1242 "$" [Newline("\n"), Newline("\n"), Comments("// List in variable w ..."), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@1242..1250 "brackets" [] [], + }, + }, + colon_token: COLON@1250..1252 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssBracketedValue { + l_brack_token: L_BRACK@1252..1253 "[" [] [], + items: CssBracketedValueList [ + CssCustomIdentifier { + value_token: IDENT@1253..1254 "a" [] [], + }, + CssGenericDelimiter { + value: COMMA@1254..1256 "," [] [Whitespace(" ")], + }, + CssCustomIdentifier { + value_token: IDENT@1256..1257 "b" [] [], + }, + CssGenericDelimiter { + value: COMMA@1257..1259 "," [] [Whitespace(" ")], + }, + CssCustomIdentifier { + value_token: IDENT@1259..1260 "c" [] [], + }, + ], + r_brack_token: R_BRACK@1260..1261 "]" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@1261..1329 ";" [] [Whitespace(" "), Comments("// Note: SCSS doesn't ...")], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@1329..1331 "$" [Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@1331..1343 "parens-comma" [] [], + }, + }, + colon_token: COLON@1343..1345 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@1345..1346 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1346..1347 "a" [] [], + }, + ], + }, + }, + COMMA@1347..1349 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1349..1350 "b" [] [], + }, + ], + }, + }, + COMMA@1350..1352 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1352..1353 "c" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@1353..1354 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@1354..1355 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@1355..1357 "$" [Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@1357..1369 "parens-space" [] [], + }, + }, + colon_token: COLON@1369..1371 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@1371..1372 "(" [] [], + expression: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1372..1374 "a" [] [Whitespace(" ")], + }, + CssIdentifier { + value_token: IDENT@1374..1376 "b" [] [Whitespace(" ")], + }, + CssIdentifier { + value_token: IDENT@1376..1377 "c" [] [], + }, + ], + }, + r_paren_token: R_PAREN@1377..1378 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@1378..1379 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@1379..1401 "$" [Newline("\n"), Newline("\n"), Comments("// Multi-line list"), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@1401..1416 "multiline-comma" [] [], + }, + }, + colon_token: COLON@1416..1418 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@1418..1419 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1419..1427 "item1" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + }, + COMMA@1427..1428 "," [] [], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1428..1436 "item2" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + }, + COMMA@1436..1437 "," [] [], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1437..1445 "item3" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + }, + COMMA@1445..1446 "," [] [], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1446..1454 "item4" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + }, + COMMA@1454..1455 "," [] [], + ], + }, + r_paren_token: R_PAREN@1455..1457 ")" [Newline("\n")] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@1457..1458 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@1458..1461 "$" [Newline("\n"), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@1461..1476 "multiline-space" [] [], + }, + }, + colon_token: COLON@1476..1478 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@1478..1479 "(" [] [], + expression: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1479..1487 "item1" [Newline("\n"), Whitespace(" ")] [], + }, + CssIdentifier { + value_token: IDENT@1487..1495 "item2" [Newline("\n"), Whitespace(" ")] [], + }, + CssIdentifier { + value_token: IDENT@1495..1503 "item3" [Newline("\n"), Whitespace(" ")] [], + }, + CssIdentifier { + value_token: IDENT@1503..1511 "item4" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + r_paren_token: R_PAREN@1511..1513 ")" [Newline("\n")] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@1513..1514 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@1514..1575 "$" [Newline("\n"), Newline("\n"), Comments("// List with operator ..."), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@1575..1589 "with-operators" [] [], + }, + }, + colon_token: COLON@1589..1591 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssBinaryExpression { + left: CssIdentifier { + value_token: IDENT@1591..1593 "a" [] [Whitespace(" ")], + }, + operator: PLUS@1593..1595 "+" [] [Whitespace(" ")], + right: CssIdentifier { + value_token: IDENT@1595..1597 "b" [] [Whitespace(" ")], + }, + }, + ScssBinaryExpression { + left: CssIdentifier { + value_token: IDENT@1597..1599 "c" [] [Whitespace(" ")], + }, + operator: STAR@1599..1601 "*" [] [Whitespace(" ")], + right: CssIdentifier { + value_token: IDENT@1601..1602 "d" [] [], + }, + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@1602..1603 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@1603..1605 "$" [Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@1605..1618 "parenthesized" [] [], + }, + }, + colon_token: COLON@1618..1620 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@1620..1621 "(" [] [], + expression: ScssExpression { + items: ScssExpressionItemList [ + ScssBinaryExpression { + left: CssIdentifier { + value_token: IDENT@1621..1623 "a" [] [Whitespace(" ")], + }, + operator: PLUS@1623..1625 "+" [] [Whitespace(" ")], + right: CssIdentifier { + value_token: IDENT@1625..1626 "b" [] [], + }, + }, + ], + }, + r_paren_token: R_PAREN@1626..1628 ")" [] [Whitespace(" ")], + }, + ScssParenthesizedExpression { + l_paren_token: L_PAREN@1628..1629 "(" [] [], + expression: ScssExpression { + items: ScssExpressionItemList [ + ScssBinaryExpression { + left: CssIdentifier { + value_token: IDENT@1629..1631 "c" [] [Whitespace(" ")], + }, + operator: STAR@1631..1633 "*" [] [Whitespace(" ")], + right: CssIdentifier { + value_token: IDENT@1633..1634 "d" [] [], + }, + }, + ], + }, + r_paren_token: R_PAREN@1634..1635 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@1635..1636 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@1636..1669 "$" [Newline("\n"), Newline("\n"), Comments("// List with negative ..."), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@1669..1678 "negatives" [] [], + }, + }, + colon_token: COLON@1678..1680 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@1680..1681 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@1681..1683 "-1" [] [], + }, + ], + }, + }, + COMMA@1683..1685 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@1685..1687 "-2" [] [], + }, + ], + }, + }, + COMMA@1687..1689 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@1689..1691 "-3" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@1691..1692 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@1692..1693 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@1693..1695 "$" [Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@1695..1709 "negative-space" [] [], + }, + }, + colon_token: COLON@1709..1711 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssBinaryExpression { + left: ScssBinaryExpression { + left: CssNumber { + value_token: CSS_NUMBER_LITERAL@1711..1714 "-1" [] [Whitespace(" ")], + }, + operator: MINUS@1714..1715 "-" [] [], + right: CssNumber { + value_token: CSS_NUMBER_LITERAL@1715..1717 "2" [] [Whitespace(" ")], + }, + }, + operator: MINUS@1717..1718 "-" [] [], + right: CssNumber { + value_token: CSS_NUMBER_LITERAL@1718..1719 "3" [] [], + }, + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@1719..1720 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@1720..1742 "$" [Newline("\n"), Newline("\n"), Comments("// List with units"), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@1742..1747 "units" [] [], + }, + }, + colon_token: COLON@1747..1749 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@1749..1751 "10" [] [], + unit_token: IDENT@1751..1754 "px" [] [Whitespace(" ")], + }, + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@1754..1756 "20" [] [], + unit_token: IDENT@1756..1759 "em" [] [Whitespace(" ")], + }, + CssPercentage { + value_token: CSS_NUMBER_LITERAL@1759..1761 "30" [] [], + percent_token: PERCENT@1761..1763 "%" [] [Whitespace(" ")], + }, + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@1763..1765 "40" [] [], + unit_token: IDENT@1765..1767 "vh" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@1767..1768 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@1768..1802 "$" [Newline("\n"), Newline("\n"), Comments("// Complex expression ..."), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@1802..1813 "expressions" [] [], + }, + }, + colon_token: COLON@1813..1815 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@1815..1816 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@1816..1820 "(" [Newline("\n"), Whitespace(" ")] [], + expression: ScssExpression { + items: ScssExpressionItemList [ + ScssBinaryExpression { + left: CssNumber { + value_token: CSS_NUMBER_LITERAL@1820..1822 "1" [] [Whitespace(" ")], + }, + operator: PLUS@1822..1824 "+" [] [Whitespace(" ")], + right: CssNumber { + value_token: CSS_NUMBER_LITERAL@1824..1825 "2" [] [], + }, + }, + ], + }, + r_paren_token: R_PAREN@1825..1826 ")" [] [], + }, + ], + }, + }, + COMMA@1826..1827 "," [] [], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@1827..1831 "(" [Newline("\n"), Whitespace(" ")] [], + expression: ScssExpression { + items: ScssExpressionItemList [ + ScssBinaryExpression { + left: ScssIdentifier { + dollar_token: DOLLAR@1831..1832 "$" [] [], + name: CssIdentifier { + value_token: IDENT@1832..1834 "a" [] [Whitespace(" ")], + }, + }, + operator: STAR@1834..1836 "*" [] [Whitespace(" ")], + right: ScssIdentifier { + dollar_token: DOLLAR@1836..1837 "$" [] [], + name: CssIdentifier { + value_token: IDENT@1837..1838 "b" [] [], + }, + }, + }, + ], + }, + r_paren_token: R_PAREN@1838..1839 ")" [] [], + }, + ], + }, + }, + COMMA@1839..1840 "," [] [], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@1840..1844 "(" [Newline("\n"), Whitespace(" ")] [], + expression: ScssExpression { + items: ScssExpressionItemList [ + ScssBinaryExpression { + left: CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@1844..1846 "10" [] [], + unit_token: IDENT@1846..1849 "px" [] [Whitespace(" ")], + }, + operator: SLASH@1849..1851 "/" [] [Whitespace(" ")], + right: CssNumber { + value_token: CSS_NUMBER_LITERAL@1851..1852 "2" [] [], + }, + }, + ], + }, + r_paren_token: R_PAREN@1852..1853 ")" [] [], + }, + ], + }, + }, + COMMA@1853..1854 "," [] [], + ], + }, + r_paren_token: R_PAREN@1854..1856 ")" [Newline("\n")] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@1856..1857 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@1857..1888 "$" [Newline("\n"), Newline("\n"), Comments("// List with special ..."), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@1888..1895 "special" [] [], + }, + }, + colon_token: COLON@1895..1897 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@1897..1898 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1898..1908 "inherit" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + }, + COMMA@1908..1909 "," [] [], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1909..1919 "initial" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + }, + COMMA@1919..1920 "," [] [], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1920..1928 "unset" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + }, + COMMA@1928..1929 "," [] [], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1929..1936 "auto" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + }, + COMMA@1936..1937 "," [] [], + ], + }, + r_paren_token: R_PAREN@1937..1939 ")" [Newline("\n")] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@1939..1940 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@1940..1969 "$" [Newline("\n"), Newline("\n"), Comments("// List with color va ..."), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@1969..1975 "colors" [] [], + }, + }, + colon_token: COLON@1975..1977 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@1977..1978 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssColor { + hash_token: HASH@1978..1979 "#" [] [], + value_token: CSS_COLOR_LITERAL@1979..1982 "fff" [] [], + }, + ], + }, + }, + COMMA@1982..1984 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@1984..1987 "rgb" [] [], + }, + l_paren_token: L_PAREN@1987..1988 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@1988..1989 "0" [] [], + }, + ], + }, + COMMA@1989..1991 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@1991..1992 "0" [] [], + }, + ], + }, + COMMA@1992..1994 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@1994..1995 "0" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@1995..1996 ")" [] [], + }, + ], + }, + }, + COMMA@1996..1998 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@1998..2001 "hsl" [] [], + }, + l_paren_token: L_PAREN@2001..2002 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@2002..2005 "120" [] [], + }, + ], + }, + COMMA@2005..2007 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssPercentage { + value_token: CSS_NUMBER_LITERAL@2007..2010 "100" [] [], + percent_token: PERCENT@2010..2011 "%" [] [], + }, + ], + }, + COMMA@2011..2013 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssPercentage { + value_token: CSS_NUMBER_LITERAL@2013..2015 "50" [] [], + percent_token: PERCENT@2015..2016 "%" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@2016..2017 ")" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@2017..2018 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@2018..2019 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@2019..2048 "$" [Newline("\n"), Newline("\n"), Comments("// List with CSS keyw ..."), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@2048..2056 "keywords" [] [], + }, + }, + colon_token: COLON@2056..2058 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@2058..2059 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2059..2066 "none" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + }, + COMMA@2066..2067 "," [] [], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2067..2074 "auto" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + }, + COMMA@2074..2075 "," [] [], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2075..2085 "inherit" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + }, + COMMA@2085..2086 "," [] [], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2086..2096 "initial" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + }, + COMMA@2096..2097 "," [] [], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2097..2105 "unset" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + }, + COMMA@2105..2106 "," [] [], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2106..2115 "revert" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + }, + COMMA@2115..2116 "," [] [], + ], + }, + r_paren_token: R_PAREN@2116..2118 ")" [Newline("\n")] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@2118..2119 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@2119..2162 "$" [Newline("\n"), Newline("\n"), Comments("// Slash-separated (f ..."), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@2162..2166 "font" [] [], + }, + }, + colon_token: COLON@2166..2168 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssBinaryExpression { + left: CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@2168..2170 "16" [] [], + unit_token: IDENT@2170..2172 "px" [] [], + }, + operator: SLASH@2172..2173 "/" [] [], + right: CssNumber { + value_token: CSS_NUMBER_LITERAL@2173..2176 "1.5" [] [], + }, + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@2176..2177 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@2177..2179 "$" [Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@2179..2188 "font-list" [] [], + }, + }, + colon_token: COLON@2188..2190 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@2190..2191 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + ScssBinaryExpression { + left: CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@2191..2193 "12" [] [], + unit_token: IDENT@2193..2195 "px" [] [], + }, + operator: SLASH@2195..2196 "/" [] [], + right: CssNumber { + value_token: CSS_NUMBER_LITERAL@2196..2199 "1.2" [] [], + }, + }, + ], + }, + }, + COMMA@2199..2201 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + ScssBinaryExpression { + left: CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@2201..2203 "14" [] [], + unit_token: IDENT@2203..2205 "px" [] [], + }, + operator: SLASH@2205..2206 "/" [] [], + right: CssNumber { + value_token: CSS_NUMBER_LITERAL@2206..2209 "1.4" [] [], + }, + }, + ], + }, + }, + COMMA@2209..2211 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + ScssBinaryExpression { + left: CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@2211..2213 "16" [] [], + unit_token: IDENT@2213..2215 "px" [] [], + }, + operator: SLASH@2215..2216 "/" [] [], + right: CssNumber { + value_token: CSS_NUMBER_LITERAL@2216..2219 "1.6" [] [], + }, + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@2219..2220 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@2220..2221 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@2221..2241 "$" [Newline("\n"), Newline("\n"), Comments("// List with URL"), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@2241..2245 "urls" [] [], + }, + }, + colon_token: COLON@2245..2247 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@2247..2248 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssUrlFunction { + name: URL_KW@2248..2251 "url" [] [], + l_paren_token: L_PAREN@2251..2252 "(" [] [], + value: CssString { + value_token: CSS_STRING_LITERAL@2252..2259 "\"a.png\"" [] [], + }, + modifiers: CssUrlModifierList [], + r_paren_token: R_PAREN@2259..2260 ")" [] [], + }, + ], + }, + }, + COMMA@2260..2262 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssUrlFunction { + name: URL_KW@2262..2265 "url" [] [], + l_paren_token: L_PAREN@2265..2266 "(" [] [], + value: CssString { + value_token: CSS_STRING_LITERAL@2266..2273 "'b.jpg'" [] [], + }, + modifiers: CssUrlModifierList [], + r_paren_token: R_PAREN@2273..2274 ")" [] [], + }, + ], + }, + }, + COMMA@2274..2276 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssUrlFunction { + name: URL_KW@2276..2279 "url" [] [], + l_paren_token: L_PAREN@2279..2280 "(" [] [], + value: CssUrlValueRaw { + value_token: CSS_URL_VALUE_RAW_LITERAL@2280..2285 "c.gif" [] [], + }, + modifiers: CssUrlModifierList [], + r_paren_token: R_PAREN@2285..2286 ")" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@2286..2287 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@2287..2288 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@2288..2322 "$" [Newline("\n"), Newline("\n"), Comments("// List with custom p ..."), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@2322..2328 "custom" [] [], + }, + }, + colon_token: COLON@2328..2330 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@2330..2331 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssDashedIdentifier { + value_token: IDENT@2331..2338 "--var-1" [] [], + }, + ], + }, + }, + COMMA@2338..2340 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssDashedIdentifier { + value_token: IDENT@2340..2347 "--var-2" [] [], + }, + ], + }, + }, + COMMA@2347..2349 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssDashedIdentifier { + value_token: IDENT@2349..2356 "--var-3" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@2356..2357 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@2357..2358 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@2358..2381 "$" [Newline("\n"), Newline("\n"), Comments("// List with attr()"), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@2381..2386 "attrs" [] [], + }, + }, + colon_token: COLON@2386..2388 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@2388..2389 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssAttrFunction { + name_token: ATTR_KW@2389..2393 "attr" [] [], + l_paren_token: L_PAREN@2393..2394 "(" [] [], + attr_name: CssAttrNameList [ + CssIdentifier { + value_token: IDENT@2394..2402 "data-foo" [] [], + }, + ], + attr_type: missing (optional), + fallback_value: missing (optional), + r_paren_token: R_PAREN@2402..2403 ")" [] [], + }, + ], + }, + }, + COMMA@2403..2405 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssAttrFunction { + name_token: ATTR_KW@2405..2409 "attr" [] [], + l_paren_token: L_PAREN@2409..2410 "(" [] [], + attr_name: CssAttrNameList [ + CssIdentifier { + value_token: IDENT@2410..2418 "data-bar" [] [], + }, + ], + attr_type: missing (optional), + fallback_value: missing (optional), + r_paren_token: R_PAREN@2418..2419 ")" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@2419..2420 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@2420..2421 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@2421..2456 "$" [Newline("\n"), Newline("\n"), Comments("// Nested space and c ..."), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@2456..2470 "complex-nested" [] [], + }, + }, + colon_token: COLON@2470..2472 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@2472..2473 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2473..2475 "a" [] [Whitespace(" ")], + }, + CssIdentifier { + value_token: IDENT@2475..2476 "b" [] [], + }, + ], + }, + }, + COMMA@2476..2478 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2478..2480 "c" [] [Whitespace(" ")], + }, + CssIdentifier { + value_token: IDENT@2480..2482 "d" [] [Whitespace(" ")], + }, + CssIdentifier { + value_token: IDENT@2482..2483 "e" [] [], + }, + ], + }, + }, + COMMA@2483..2485 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2485..2486 "f" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@2486..2487 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@2487..2488 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@2488..2509 "$" [Newline("\n"), Newline("\n"), Comments("// List with calc"), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@2509..2514 "calcs" [] [], + }, + }, + colon_token: COLON@2514..2516 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@2516..2517 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@2517..2521 "calc" [] [], + }, + l_paren_token: L_PAREN@2521..2522 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssBinaryExpression { + left: CssPercentage { + value_token: CSS_NUMBER_LITERAL@2522..2525 "100" [] [], + percent_token: PERCENT@2525..2527 "%" [] [Whitespace(" ")], + }, + operator: MINUS@2527..2529 "-" [] [Whitespace(" ")], + right: CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@2529..2531 "10" [] [], + unit_token: IDENT@2531..2533 "px" [] [], + }, + }, + ], + }, + ], + r_paren_token: R_PAREN@2533..2534 ")" [] [], + }, + ], + }, + }, + COMMA@2534..2536 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@2536..2540 "calc" [] [], + }, + l_paren_token: L_PAREN@2540..2541 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssBinaryExpression { + left: CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@2541..2543 "50" [] [], + unit_token: IDENT@2543..2546 "vh" [] [Whitespace(" ")], + }, + operator: MINUS@2546..2548 "-" [] [Whitespace(" ")], + right: CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@2548..2550 "20" [] [], + unit_token: IDENT@2550..2552 "px" [] [], + }, + }, + ], + }, + ], + r_paren_token: R_PAREN@2552..2553 ")" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@2553..2554 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@2554..2555 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@2555..2594 "$" [Newline("\n"), Newline("\n"), Comments("// Empty items in lis ..."), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@2594..2600 "sparse" [] [], + }, + }, + colon_token: COLON@2600..2602 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@2602..2603 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2603..2604 "a" [] [], + }, + ], + }, + }, + COMMA@2604..2605 "," [] [], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [], + }, + }, + COMMA@2605..2607 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2607..2608 "c" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@2608..2609 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@2609..2657 ";" [] [Whitespace(" "), Comments("// Note: This might b ...")], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@2657..2695 "$" [Newline("\n"), Newline("\n"), Comments("// List with importan ..."), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@2695..2709 "with-important" [] [], + }, + }, + colon_token: COLON@2709..2711 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@2711..2712 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2712..2716 "red" [] [Whitespace(" ")], + }, + CssDeclarationImportant { + excl_token: BANG@2716..2717 "!" [] [], + important_token: IMPORTANT_KW@2717..2726 "important" [] [], + }, + ], + }, + }, + COMMA@2726..2728 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2728..2732 "blue" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@2732..2733 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@2733..2734 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@2734..2757 "$" [Newline("\n"), Newline("\n"), Comments("// Unicode in lists"), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@2757..2764 "unicode" [] [], + }, + }, + colon_token: COLON@2764..2766 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@2766..2767 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2767..2773 "émoji" [] [], + }, + ], + }, + }, + COMMA@2773..2775 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2775..2779 "🎨" [] [], + }, + ], + }, + }, + COMMA@2779..2781 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2781..2790 "日本語" [] [], + }, + ], + }, + }, + COMMA@2790..2792 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2792..2800 "ключ" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@2800..2801 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@2801..2802 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@2802..2836 "$" [Newline("\n"), Newline("\n"), Comments("// Escaped characters ..."), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@2836..2843 "escaped" [] [], + }, + }, + colon_token: COLON@2843..2845 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@2845..2846 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2846..2854 "\\escaped" [] [], + }, + ], + }, + }, + COMMA@2854..2856 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@2856..2872 "\"escaped\\\"quote\"" [] [], + }, + ], + }, + }, + COMMA@2872..2874 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@2874..2890 "'escaped\\'quote'" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@2890..2891 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@2891..2892 ";" [] [], + }, + ], + eof_token: EOF@2892..2897 "" [Newline("\n"), Newline("\n"), Newline("\n"), Newline("\n"), Newline("\n")] [], +} +``` + +## CST + +``` +0: CSS_ROOT@0..2897 + 0: (empty) + 1: CSS_ROOT_ITEM_LIST@0..2892 + 0: SCSS_DECLARATION@0..56 + 0: SCSS_IDENTIFIER@0..51 + 0: DOLLAR@0..46 "$" [Comments("// Advanced list synt ..."), Newline("\n"), Newline("\n"), Comments("// Empty list"), Newline("\n")] [] + 1: CSS_IDENTIFIER@46..51 + 0: IDENT@46..51 "empty" [] [] + 1: COLON@51..53 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@53..55 + 0: SCSS_EXPRESSION_ITEM_LIST@53..55 + 0: SCSS_MAP_EXPRESSION@53..55 + 0: L_PAREN@53..54 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@54..54 + 2: R_PAREN@54..55 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@55..55 + 4: SEMICOLON@55..56 ";" [] [] + 1: SCSS_DECLARATION@56..112 + 0: SCSS_IDENTIFIER@56..102 + 0: DOLLAR@56..90 "$" [Newline("\n"), Newline("\n"), Comments("// Single item list w ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@90..102 + 0: IDENT@90..102 "single-comma" [] [] + 1: COLON@102..104 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@104..111 + 0: SCSS_EXPRESSION_ITEM_LIST@104..111 + 0: SCSS_PARENTHESIZED_EXPRESSION@104..111 + 0: L_PAREN@104..105 "(" [] [] + 1: SCSS_LIST_EXPRESSION@105..110 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@105..110 + 0: SCSS_LIST_EXPRESSION_ELEMENT@105..109 + 0: SCSS_EXPRESSION@105..109 + 0: SCSS_EXPRESSION_ITEM_LIST@105..109 + 0: CSS_IDENTIFIER@105..109 + 0: IDENT@105..109 "item" [] [] + 1: COMMA@109..110 "," [] [] + 2: R_PAREN@110..111 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@111..111 + 4: SEMICOLON@111..112 ";" [] [] + 2: SCSS_DECLARATION@112..170 + 0: SCSS_IDENTIFIER@112..161 + 0: DOLLAR@112..149 "$" [Newline("\n"), Newline("\n"), Comments("// Single item list w ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@149..161 + 0: IDENT@149..161 "single-space" [] [] + 1: COLON@161..163 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@163..169 + 0: SCSS_EXPRESSION_ITEM_LIST@163..169 + 0: SCSS_PARENTHESIZED_EXPRESSION@163..169 + 0: L_PAREN@163..164 "(" [] [] + 1: SCSS_EXPRESSION@164..168 + 0: SCSS_EXPRESSION_ITEM_LIST@164..168 + 0: CSS_IDENTIFIER@164..168 + 0: IDENT@164..168 "item" [] [] + 2: R_PAREN@168..169 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@169..169 + 4: SEMICOLON@169..170 ";" [] [] + 3: SCSS_DECLARATION@170..219 + 0: SCSS_IDENTIFIER@170..207 + 0: DOLLAR@170..197 "$" [Newline("\n"), Newline("\n"), Comments("// Space-separated list"), Newline("\n")] [] + 1: CSS_IDENTIFIER@197..207 + 0: IDENT@197..207 "space-list" [] [] + 1: COLON@207..209 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@209..218 + 0: SCSS_EXPRESSION_ITEM_LIST@209..218 + 0: CSS_IDENTIFIER@209..211 + 0: IDENT@209..211 "a" [] [Whitespace(" ")] + 1: CSS_IDENTIFIER@211..213 + 0: IDENT@211..213 "b" [] [Whitespace(" ")] + 2: CSS_IDENTIFIER@213..215 + 0: IDENT@213..215 "c" [] [Whitespace(" ")] + 3: CSS_IDENTIFIER@215..217 + 0: IDENT@215..217 "d" [] [Whitespace(" ")] + 4: CSS_IDENTIFIER@217..218 + 0: IDENT@217..218 "e" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@218..218 + 4: SEMICOLON@218..219 ";" [] [] + 4: SCSS_DECLARATION@219..272 + 0: SCSS_IDENTIFIER@219..256 + 0: DOLLAR@219..246 "$" [Newline("\n"), Newline("\n"), Comments("// Comma-separated list"), Newline("\n")] [] + 1: CSS_IDENTIFIER@246..256 + 0: IDENT@246..256 "comma-list" [] [] + 1: COLON@256..258 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@258..271 + 0: SCSS_EXPRESSION_ITEM_LIST@258..271 + 0: SCSS_LIST_EXPRESSION@258..271 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@258..271 + 0: SCSS_LIST_EXPRESSION_ELEMENT@258..259 + 0: SCSS_EXPRESSION@258..259 + 0: SCSS_EXPRESSION_ITEM_LIST@258..259 + 0: CSS_IDENTIFIER@258..259 + 0: IDENT@258..259 "a" [] [] + 1: COMMA@259..261 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@261..262 + 0: SCSS_EXPRESSION@261..262 + 0: SCSS_EXPRESSION_ITEM_LIST@261..262 + 0: CSS_IDENTIFIER@261..262 + 0: IDENT@261..262 "b" [] [] + 3: COMMA@262..264 "," [] [Whitespace(" ")] + 4: SCSS_LIST_EXPRESSION_ELEMENT@264..265 + 0: SCSS_EXPRESSION@264..265 + 0: SCSS_EXPRESSION_ITEM_LIST@264..265 + 0: CSS_IDENTIFIER@264..265 + 0: IDENT@264..265 "c" [] [] + 5: COMMA@265..267 "," [] [Whitespace(" ")] + 6: SCSS_LIST_EXPRESSION_ELEMENT@267..268 + 0: SCSS_EXPRESSION@267..268 + 0: SCSS_EXPRESSION_ITEM_LIST@267..268 + 0: CSS_IDENTIFIER@267..268 + 0: IDENT@267..268 "d" [] [] + 7: COMMA@268..270 "," [] [Whitespace(" ")] + 8: SCSS_LIST_EXPRESSION_ELEMENT@270..271 + 0: SCSS_EXPRESSION@270..271 + 0: SCSS_EXPRESSION_ITEM_LIST@270..271 + 0: CSS_IDENTIFIER@270..271 + 0: IDENT@270..271 "e" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@271..271 + 4: SEMICOLON@271..272 ";" [] [] + 5: SCSS_DECLARATION@272..315 + 0: SCSS_IDENTIFIER@272..297 + 0: DOLLAR@272..292 "$" [Newline("\n"), Newline("\n"), Comments("// Mixed nesting"), Newline("\n")] [] + 1: CSS_IDENTIFIER@292..297 + 0: IDENT@292..297 "mixed" [] [] + 1: COLON@297..299 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@299..314 + 0: SCSS_EXPRESSION_ITEM_LIST@299..314 + 0: SCSS_PARENTHESIZED_EXPRESSION@299..314 + 0: L_PAREN@299..300 "(" [] [] + 1: SCSS_LIST_EXPRESSION@300..313 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@300..313 + 0: SCSS_LIST_EXPRESSION_ELEMENT@300..303 + 0: SCSS_EXPRESSION@300..303 + 0: SCSS_EXPRESSION_ITEM_LIST@300..303 + 0: CSS_IDENTIFIER@300..302 + 0: IDENT@300..302 "a" [] [Whitespace(" ")] + 1: CSS_IDENTIFIER@302..303 + 0: IDENT@302..303 "b" [] [] + 1: COMMA@303..305 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@305..308 + 0: SCSS_EXPRESSION@305..308 + 0: SCSS_EXPRESSION_ITEM_LIST@305..308 + 0: CSS_IDENTIFIER@305..307 + 0: IDENT@305..307 "c" [] [Whitespace(" ")] + 1: CSS_IDENTIFIER@307..308 + 0: IDENT@307..308 "d" [] [] + 3: COMMA@308..310 "," [] [Whitespace(" ")] + 4: SCSS_LIST_EXPRESSION_ELEMENT@310..313 + 0: SCSS_EXPRESSION@310..313 + 0: SCSS_EXPRESSION_ITEM_LIST@310..313 + 0: CSS_IDENTIFIER@310..312 + 0: IDENT@310..312 "e" [] [Whitespace(" ")] + 1: CSS_IDENTIFIER@312..313 + 0: IDENT@312..313 "f" [] [] + 2: R_PAREN@313..314 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@314..314 + 4: SEMICOLON@314..315 ";" [] [] + 6: SCSS_DECLARATION@315..367 + 0: SCSS_IDENTIFIER@315..354 + 0: DOLLAR@315..346 "$" [Newline("\n"), Newline("\n"), Comments("// List with trailing ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@346..354 + 0: IDENT@346..354 "trailing" [] [] + 1: COLON@354..356 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@356..366 + 0: SCSS_EXPRESSION_ITEM_LIST@356..366 + 0: SCSS_PARENTHESIZED_EXPRESSION@356..366 + 0: L_PAREN@356..357 "(" [] [] + 1: SCSS_LIST_EXPRESSION@357..365 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@357..365 + 0: SCSS_LIST_EXPRESSION_ELEMENT@357..358 + 0: SCSS_EXPRESSION@357..358 + 0: SCSS_EXPRESSION_ITEM_LIST@357..358 + 0: CSS_IDENTIFIER@357..358 + 0: IDENT@357..358 "a" [] [] + 1: COMMA@358..360 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@360..361 + 0: SCSS_EXPRESSION@360..361 + 0: SCSS_EXPRESSION_ITEM_LIST@360..361 + 0: CSS_IDENTIFIER@360..361 + 0: IDENT@360..361 "b" [] [] + 3: COMMA@361..363 "," [] [Whitespace(" ")] + 4: SCSS_LIST_EXPRESSION_ELEMENT@363..364 + 0: SCSS_EXPRESSION@363..364 + 0: SCSS_EXPRESSION_ITEM_LIST@363..364 + 0: CSS_IDENTIFIER@363..364 + 0: IDENT@363..364 "c" [] [] + 5: COMMA@364..365 "," [] [] + 2: R_PAREN@365..366 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@366..366 + 4: SEMICOLON@366..367 ";" [] [] + 7: SCSS_DECLARATION@367..601 + 0: SCSS_IDENTIFIER@367..565 + 0: DOLLAR@367..553 "$" [Newline("\n"), Newline("\n"), Comments("// List with interpol ..."), Newline("\n"), Comments("// TODO(interpolation ..."), Newline("\n"), Comments("// TODO(interpolation ..."), Newline("\n"), Comments("// List with calculat ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@553..565 + 0: IDENT@553..565 "calculations" [] [] + 1: COLON@565..567 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@567..600 + 0: SCSS_EXPRESSION_ITEM_LIST@567..600 + 0: SCSS_PARENTHESIZED_EXPRESSION@567..600 + 0: L_PAREN@567..568 "(" [] [] + 1: SCSS_LIST_EXPRESSION@568..599 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@568..599 + 0: SCSS_LIST_EXPRESSION_ELEMENT@568..578 + 0: SCSS_EXPRESSION@568..578 + 0: SCSS_EXPRESSION_ITEM_LIST@568..578 + 0: SCSS_BINARY_EXPRESSION@568..578 + 0: CSS_REGULAR_DIMENSION@568..573 + 0: CSS_NUMBER_LITERAL@568..570 "10" [] [] + 1: IDENT@570..573 "px" [] [Whitespace(" ")] + 1: PLUS@573..575 "+" [] [Whitespace(" ")] + 2: CSS_REGULAR_DIMENSION@575..578 + 0: CSS_NUMBER_LITERAL@575..576 "5" [] [] + 1: IDENT@576..578 "px" [] [] + 1: COMMA@578..580 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@580..588 + 0: SCSS_EXPRESSION@580..588 + 0: SCSS_EXPRESSION_ITEM_LIST@580..588 + 0: SCSS_BINARY_EXPRESSION@580..588 + 0: CSS_REGULAR_DIMENSION@580..585 + 0: CSS_NUMBER_LITERAL@580..582 "20" [] [] + 1: IDENT@582..585 "px" [] [Whitespace(" ")] + 1: STAR@585..587 "*" [] [Whitespace(" ")] + 2: CSS_NUMBER@587..588 + 0: CSS_NUMBER_LITERAL@587..588 "2" [] [] + 3: COMMA@588..590 "," [] [Whitespace(" ")] + 4: SCSS_LIST_EXPRESSION_ELEMENT@590..599 + 0: SCSS_EXPRESSION@590..599 + 0: SCSS_EXPRESSION_ITEM_LIST@590..599 + 0: SCSS_BINARY_EXPRESSION@590..599 + 0: CSS_REGULAR_DIMENSION@590..596 + 0: CSS_NUMBER_LITERAL@590..593 "100" [] [] + 1: IDENT@593..596 "px" [] [Whitespace(" ")] + 1: SLASH@596..598 "/" [] [Whitespace(" ")] + 2: CSS_NUMBER@598..599 + 0: CSS_NUMBER_LITERAL@598..599 "4" [] [] + 2: R_PAREN@599..600 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@600..600 + 4: SEMICOLON@600..601 ";" [] [] + 8: SCSS_DECLARATION@601..692 + 0: SCSS_IDENTIFIER@601..636 + 0: DOLLAR@601..627 "$" [Newline("\n"), Newline("\n"), Comments("// List with functions"), Newline("\n")] [] + 1: CSS_IDENTIFIER@627..636 + 0: IDENT@627..636 "functions" [] [] + 1: COLON@636..638 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@638..691 + 0: SCSS_EXPRESSION_ITEM_LIST@638..691 + 0: SCSS_PARENTHESIZED_EXPRESSION@638..691 + 0: L_PAREN@638..639 "(" [] [] + 1: SCSS_LIST_EXPRESSION@639..690 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@639..690 + 0: SCSS_LIST_EXPRESSION_ELEMENT@639..653 + 0: SCSS_EXPRESSION@639..653 + 0: SCSS_EXPRESSION_ITEM_LIST@639..653 + 0: CSS_FUNCTION@639..653 + 0: CSS_IDENTIFIER@639..642 + 0: IDENT@639..642 "rgb" [] [] + 1: L_PAREN@642..643 "(" [] [] + 2: CSS_PARAMETER_LIST@643..652 + 0: SCSS_EXPRESSION@643..646 + 0: SCSS_EXPRESSION_ITEM_LIST@643..646 + 0: CSS_NUMBER@643..646 + 0: CSS_NUMBER_LITERAL@643..646 "255" [] [] + 1: COMMA@646..648 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@648..649 + 0: SCSS_EXPRESSION_ITEM_LIST@648..649 + 0: CSS_NUMBER@648..649 + 0: CSS_NUMBER_LITERAL@648..649 "0" [] [] + 3: COMMA@649..651 "," [] [Whitespace(" ")] + 4: SCSS_EXPRESSION@651..652 + 0: SCSS_EXPRESSION_ITEM_LIST@651..652 + 0: CSS_NUMBER@651..652 + 0: CSS_NUMBER_LITERAL@651..652 "0" [] [] + 3: R_PAREN@652..653 ")" [] [] + 1: COMMA@653..655 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@655..672 + 0: SCSS_EXPRESSION@655..672 + 0: SCSS_EXPRESSION_ITEM_LIST@655..672 + 0: CSS_FUNCTION@655..672 + 0: CSS_IDENTIFIER@655..659 + 0: IDENT@655..659 "calc" [] [] + 1: L_PAREN@659..660 "(" [] [] + 2: CSS_PARAMETER_LIST@660..671 + 0: SCSS_EXPRESSION@660..671 + 0: SCSS_EXPRESSION_ITEM_LIST@660..671 + 0: SCSS_BINARY_EXPRESSION@660..671 + 0: CSS_PERCENTAGE@660..665 + 0: CSS_NUMBER_LITERAL@660..663 "100" [] [] + 1: PERCENT@663..665 "%" [] [Whitespace(" ")] + 1: MINUS@665..667 "-" [] [Whitespace(" ")] + 2: CSS_REGULAR_DIMENSION@667..671 + 0: CSS_NUMBER_LITERAL@667..669 "20" [] [] + 1: IDENT@669..671 "px" [] [] + 3: R_PAREN@671..672 ")" [] [] + 3: COMMA@672..674 "," [] [Whitespace(" ")] + 4: SCSS_LIST_EXPRESSION_ELEMENT@674..690 + 0: SCSS_EXPRESSION@674..690 + 0: SCSS_EXPRESSION_ITEM_LIST@674..690 + 0: CSS_URL_FUNCTION@674..690 + 0: URL_KW@674..677 "url" [] [] + 1: L_PAREN@677..678 "(" [] [] + 2: CSS_STRING@678..689 + 0: CSS_STRING_LITERAL@678..689 "\"image.png\"" [] [] + 3: CSS_URL_MODIFIER_LIST@689..689 + 4: R_PAREN@689..690 ")" [] [] + 2: R_PAREN@690..691 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@691..691 + 4: SEMICOLON@691..692 ";" [] [] + 9: SCSS_DECLARATION@692..751 + 0: SCSS_IDENTIFIER@692..724 + 0: DOLLAR@692..718 "$" [Newline("\n"), Newline("\n"), Comments("// Deeply nested lists"), Newline("\n")] [] + 1: CSS_IDENTIFIER@718..724 + 0: IDENT@718..724 "nested" [] [] + 1: COLON@724..726 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@726..750 + 0: SCSS_EXPRESSION_ITEM_LIST@726..750 + 0: SCSS_PARENTHESIZED_EXPRESSION@726..750 + 0: L_PAREN@726..727 "(" [] [] + 1: SCSS_LIST_EXPRESSION@727..749 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@727..749 + 0: SCSS_LIST_EXPRESSION_ELEMENT@727..733 + 0: SCSS_EXPRESSION@727..733 + 0: SCSS_EXPRESSION_ITEM_LIST@727..733 + 0: SCSS_PARENTHESIZED_EXPRESSION@727..733 + 0: L_PAREN@727..728 "(" [] [] + 1: SCSS_LIST_EXPRESSION@728..732 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@728..732 + 0: SCSS_LIST_EXPRESSION_ELEMENT@728..729 + 0: SCSS_EXPRESSION@728..729 + 0: SCSS_EXPRESSION_ITEM_LIST@728..729 + 0: CSS_IDENTIFIER@728..729 + 0: IDENT@728..729 "a" [] [] + 1: COMMA@729..731 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@731..732 + 0: SCSS_EXPRESSION@731..732 + 0: SCSS_EXPRESSION_ITEM_LIST@731..732 + 0: CSS_IDENTIFIER@731..732 + 0: IDENT@731..732 "b" [] [] + 2: R_PAREN@732..733 ")" [] [] + 1: COMMA@733..735 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@735..741 + 0: SCSS_EXPRESSION@735..741 + 0: SCSS_EXPRESSION_ITEM_LIST@735..741 + 0: SCSS_PARENTHESIZED_EXPRESSION@735..741 + 0: L_PAREN@735..736 "(" [] [] + 1: SCSS_LIST_EXPRESSION@736..740 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@736..740 + 0: SCSS_LIST_EXPRESSION_ELEMENT@736..737 + 0: SCSS_EXPRESSION@736..737 + 0: SCSS_EXPRESSION_ITEM_LIST@736..737 + 0: CSS_IDENTIFIER@736..737 + 0: IDENT@736..737 "c" [] [] + 1: COMMA@737..739 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@739..740 + 0: SCSS_EXPRESSION@739..740 + 0: SCSS_EXPRESSION_ITEM_LIST@739..740 + 0: CSS_IDENTIFIER@739..740 + 0: IDENT@739..740 "d" [] [] + 2: R_PAREN@740..741 ")" [] [] + 3: COMMA@741..743 "," [] [Whitespace(" ")] + 4: SCSS_LIST_EXPRESSION_ELEMENT@743..749 + 0: SCSS_EXPRESSION@743..749 + 0: SCSS_EXPRESSION_ITEM_LIST@743..749 + 0: SCSS_PARENTHESIZED_EXPRESSION@743..749 + 0: L_PAREN@743..744 "(" [] [] + 1: SCSS_LIST_EXPRESSION@744..748 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@744..748 + 0: SCSS_LIST_EXPRESSION_ELEMENT@744..745 + 0: SCSS_EXPRESSION@744..745 + 0: SCSS_EXPRESSION_ITEM_LIST@744..745 + 0: CSS_IDENTIFIER@744..745 + 0: IDENT@744..745 "e" [] [] + 1: COMMA@745..747 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@747..748 + 0: SCSS_EXPRESSION@747..748 + 0: SCSS_EXPRESSION_ITEM_LIST@747..748 + 0: CSS_IDENTIFIER@747..748 + 0: IDENT@747..748 "f" [] [] + 2: R_PAREN@748..749 ")" [] [] + 2: R_PAREN@749..750 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@750..750 + 4: SEMICOLON@750..751 ";" [] [] + 10: SCSS_DECLARATION@751..796 + 0: SCSS_IDENTIFIER@751..757 + 0: DOLLAR@751..753 "$" [Newline("\n")] [] + 1: CSS_IDENTIFIER@753..757 + 0: IDENT@753..757 "deep" [] [] + 1: COLON@757..759 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@759..795 + 0: SCSS_EXPRESSION_ITEM_LIST@759..795 + 0: SCSS_PARENTHESIZED_EXPRESSION@759..795 + 0: L_PAREN@759..760 "(" [] [] + 1: SCSS_LIST_EXPRESSION@760..794 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@760..794 + 0: SCSS_LIST_EXPRESSION_ELEMENT@760..776 + 0: SCSS_EXPRESSION@760..776 + 0: SCSS_EXPRESSION_ITEM_LIST@760..776 + 0: SCSS_PARENTHESIZED_EXPRESSION@760..776 + 0: L_PAREN@760..761 "(" [] [] + 1: SCSS_LIST_EXPRESSION@761..775 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@761..775 + 0: SCSS_LIST_EXPRESSION_ELEMENT@761..767 + 0: SCSS_EXPRESSION@761..767 + 0: SCSS_EXPRESSION_ITEM_LIST@761..767 + 0: SCSS_PARENTHESIZED_EXPRESSION@761..767 + 0: L_PAREN@761..762 "(" [] [] + 1: SCSS_LIST_EXPRESSION@762..766 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@762..766 + 0: SCSS_LIST_EXPRESSION_ELEMENT@762..763 + 0: SCSS_EXPRESSION@762..763 + 0: SCSS_EXPRESSION_ITEM_LIST@762..763 + 0: CSS_IDENTIFIER@762..763 + 0: IDENT@762..763 "a" [] [] + 1: COMMA@763..765 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@765..766 + 0: SCSS_EXPRESSION@765..766 + 0: SCSS_EXPRESSION_ITEM_LIST@765..766 + 0: CSS_IDENTIFIER@765..766 + 0: IDENT@765..766 "b" [] [] + 2: R_PAREN@766..767 ")" [] [] + 1: COMMA@767..769 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@769..775 + 0: SCSS_EXPRESSION@769..775 + 0: SCSS_EXPRESSION_ITEM_LIST@769..775 + 0: SCSS_PARENTHESIZED_EXPRESSION@769..775 + 0: L_PAREN@769..770 "(" [] [] + 1: SCSS_LIST_EXPRESSION@770..774 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@770..774 + 0: SCSS_LIST_EXPRESSION_ELEMENT@770..771 + 0: SCSS_EXPRESSION@770..771 + 0: SCSS_EXPRESSION_ITEM_LIST@770..771 + 0: CSS_IDENTIFIER@770..771 + 0: IDENT@770..771 "c" [] [] + 1: COMMA@771..773 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@773..774 + 0: SCSS_EXPRESSION@773..774 + 0: SCSS_EXPRESSION_ITEM_LIST@773..774 + 0: CSS_IDENTIFIER@773..774 + 0: IDENT@773..774 "d" [] [] + 2: R_PAREN@774..775 ")" [] [] + 2: R_PAREN@775..776 ")" [] [] + 1: COMMA@776..778 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@778..794 + 0: SCSS_EXPRESSION@778..794 + 0: SCSS_EXPRESSION_ITEM_LIST@778..794 + 0: SCSS_PARENTHESIZED_EXPRESSION@778..794 + 0: L_PAREN@778..779 "(" [] [] + 1: SCSS_LIST_EXPRESSION@779..793 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@779..793 + 0: SCSS_LIST_EXPRESSION_ELEMENT@779..785 + 0: SCSS_EXPRESSION@779..785 + 0: SCSS_EXPRESSION_ITEM_LIST@779..785 + 0: SCSS_PARENTHESIZED_EXPRESSION@779..785 + 0: L_PAREN@779..780 "(" [] [] + 1: SCSS_LIST_EXPRESSION@780..784 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@780..784 + 0: SCSS_LIST_EXPRESSION_ELEMENT@780..781 + 0: SCSS_EXPRESSION@780..781 + 0: SCSS_EXPRESSION_ITEM_LIST@780..781 + 0: CSS_IDENTIFIER@780..781 + 0: IDENT@780..781 "e" [] [] + 1: COMMA@781..783 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@783..784 + 0: SCSS_EXPRESSION@783..784 + 0: SCSS_EXPRESSION_ITEM_LIST@783..784 + 0: CSS_IDENTIFIER@783..784 + 0: IDENT@783..784 "f" [] [] + 2: R_PAREN@784..785 ")" [] [] + 1: COMMA@785..787 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@787..793 + 0: SCSS_EXPRESSION@787..793 + 0: SCSS_EXPRESSION_ITEM_LIST@787..793 + 0: SCSS_PARENTHESIZED_EXPRESSION@787..793 + 0: L_PAREN@787..788 "(" [] [] + 1: SCSS_LIST_EXPRESSION@788..792 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@788..792 + 0: SCSS_LIST_EXPRESSION_ELEMENT@788..789 + 0: SCSS_EXPRESSION@788..789 + 0: SCSS_EXPRESSION_ITEM_LIST@788..789 + 0: CSS_IDENTIFIER@788..789 + 0: IDENT@788..789 "g" [] [] + 1: COMMA@789..791 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@791..792 + 0: SCSS_EXPRESSION@791..792 + 0: SCSS_EXPRESSION_ITEM_LIST@791..792 + 0: CSS_IDENTIFIER@791..792 + 0: IDENT@791..792 "h" [] [] + 2: R_PAREN@792..793 ")" [] [] + 2: R_PAREN@793..794 ")" [] [] + 2: R_PAREN@794..795 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@795..795 + 4: SEMICOLON@795..796 ";" [] [] + 11: SCSS_DECLARATION@796..857 + 0: SCSS_IDENTIFIER@796..826 + 0: DOLLAR@796..817 "$" [Newline("\n"), Newline("\n"), Comments("// List with maps"), Newline("\n")] [] + 1: CSS_IDENTIFIER@817..826 + 0: IDENT@817..826 "with-maps" [] [] + 1: COLON@826..828 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@828..856 + 0: SCSS_EXPRESSION_ITEM_LIST@828..856 + 0: SCSS_PARENTHESIZED_EXPRESSION@828..856 + 0: L_PAREN@828..829 "(" [] [] + 1: SCSS_LIST_EXPRESSION@829..855 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@829..855 + 0: SCSS_LIST_EXPRESSION_ELEMENT@829..841 + 0: SCSS_EXPRESSION@829..841 + 0: SCSS_EXPRESSION_ITEM_LIST@829..841 + 0: SCSS_MAP_EXPRESSION@829..841 + 0: L_PAREN@829..830 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@830..840 + 0: SCSS_MAP_EXPRESSION_PAIR@830..840 + 0: SCSS_EXPRESSION@830..834 + 0: SCSS_EXPRESSION_ITEM_LIST@830..834 + 0: CSS_IDENTIFIER@830..834 + 0: IDENT@830..834 "key1" [] [] + 1: COLON@834..836 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@836..840 + 0: SCSS_EXPRESSION_ITEM_LIST@836..840 + 0: CSS_IDENTIFIER@836..840 + 0: IDENT@836..840 "val1" [] [] + 2: R_PAREN@840..841 ")" [] [] + 1: COMMA@841..843 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@843..855 + 0: SCSS_EXPRESSION@843..855 + 0: SCSS_EXPRESSION_ITEM_LIST@843..855 + 0: SCSS_MAP_EXPRESSION@843..855 + 0: L_PAREN@843..844 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@844..854 + 0: SCSS_MAP_EXPRESSION_PAIR@844..854 + 0: SCSS_EXPRESSION@844..848 + 0: SCSS_EXPRESSION_ITEM_LIST@844..848 + 0: CSS_IDENTIFIER@844..848 + 0: IDENT@844..848 "key2" [] [] + 1: COLON@848..850 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@850..854 + 0: SCSS_EXPRESSION_ITEM_LIST@850..854 + 0: CSS_IDENTIFIER@850..854 + 0: IDENT@850..854 "val2" [] [] + 2: R_PAREN@854..855 ")" [] [] + 2: R_PAREN@855..856 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@856..856 + 4: SEMICOLON@856..857 ";" [] [] + 12: SCSS_DECLARATION@857..959 + 0: SCSS_IDENTIFIER@857..896 + 0: DOLLAR@857..885 "$" [Newline("\n"), Newline("\n"), Comments("// List with mixed types"), Newline("\n")] [] + 1: CSS_IDENTIFIER@885..896 + 0: IDENT@885..896 "mixed-types" [] [] + 1: COLON@896..898 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@898..958 + 0: SCSS_EXPRESSION_ITEM_LIST@898..958 + 0: SCSS_PARENTHESIZED_EXPRESSION@898..958 + 0: L_PAREN@898..899 "(" [] [] + 1: SCSS_LIST_EXPRESSION@899..956 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@899..956 + 0: SCSS_LIST_EXPRESSION_ELEMENT@899..906 + 0: SCSS_EXPRESSION@899..906 + 0: SCSS_EXPRESSION_ITEM_LIST@899..906 + 0: CSS_IDENTIFIER@899..906 + 0: IDENT@899..906 "true" [Newline("\n"), Whitespace(" ")] [] + 1: COMMA@906..907 "," [] [] + 2: SCSS_LIST_EXPRESSION_ELEMENT@907..915 + 0: SCSS_EXPRESSION@907..915 + 0: SCSS_EXPRESSION_ITEM_LIST@907..915 + 0: CSS_IDENTIFIER@907..915 + 0: IDENT@907..915 "false" [Newline("\n"), Whitespace(" ")] [] + 3: COMMA@915..916 "," [] [] + 4: SCSS_LIST_EXPRESSION_ELEMENT@916..923 + 0: SCSS_EXPRESSION@916..923 + 0: SCSS_EXPRESSION_ITEM_LIST@916..923 + 0: CSS_IDENTIFIER@916..923 + 0: IDENT@916..923 "null" [Newline("\n"), Whitespace(" ")] [] + 5: COMMA@923..924 "," [] [] + 6: SCSS_LIST_EXPRESSION_ELEMENT@924..930 + 0: SCSS_EXPRESSION@924..930 + 0: SCSS_EXPRESSION_ITEM_LIST@924..930 + 0: CSS_NUMBER@924..930 + 0: CSS_NUMBER_LITERAL@924..930 "123" [Newline("\n"), Whitespace(" ")] [] + 7: COMMA@930..931 "," [] [] + 8: SCSS_LIST_EXPRESSION_ELEMENT@931..942 + 0: SCSS_EXPRESSION@931..942 + 0: SCSS_EXPRESSION_ITEM_LIST@931..942 + 0: CSS_STRING@931..942 + 0: CSS_STRING_LITERAL@931..942 "\"string\"" [Newline("\n"), Whitespace(" ")] [] + 9: COMMA@942..943 "," [] [] + 10: SCSS_LIST_EXPRESSION_ELEMENT@943..955 + 0: SCSS_EXPRESSION@943..955 + 0: SCSS_EXPRESSION_ITEM_LIST@943..955 + 0: SCSS_IDENTIFIER@943..955 + 0: DOLLAR@943..947 "$" [Newline("\n"), Whitespace(" ")] [] + 1: CSS_IDENTIFIER@947..955 + 0: IDENT@947..955 "variable" [] [] + 11: COMMA@955..956 "," [] [] + 2: R_PAREN@956..958 ")" [Newline("\n")] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@958..958 + 4: SEMICOLON@958..959 ";" [] [] + 13: SCSS_DECLARATION@959..1023 + 0: SCSS_IDENTIFIER@959..996 + 0: DOLLAR@959..990 "$" [Newline("\n"), Newline("\n"), Comments("// List with quoted s ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@990..996 + 0: IDENT@990..996 "quoted" [] [] + 1: COLON@996..998 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@998..1022 + 0: SCSS_EXPRESSION_ITEM_LIST@998..1022 + 0: SCSS_PARENTHESIZED_EXPRESSION@998..1022 + 0: L_PAREN@998..999 "(" [] [] + 1: SCSS_LIST_EXPRESSION@999..1021 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@999..1021 + 0: SCSS_LIST_EXPRESSION_ELEMENT@999..1002 + 0: SCSS_EXPRESSION@999..1002 + 0: SCSS_EXPRESSION_ITEM_LIST@999..1002 + 0: CSS_STRING@999..1002 + 0: CSS_STRING_LITERAL@999..1002 "\"a\"" [] [] + 1: COMMA@1002..1004 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@1004..1007 + 0: SCSS_EXPRESSION@1004..1007 + 0: SCSS_EXPRESSION_ITEM_LIST@1004..1007 + 0: CSS_STRING@1004..1007 + 0: CSS_STRING_LITERAL@1004..1007 "'b'" [] [] + 3: COMMA@1007..1009 "," [] [Whitespace(" ")] + 4: SCSS_LIST_EXPRESSION_ELEMENT@1009..1014 + 0: SCSS_EXPRESSION@1009..1014 + 0: SCSS_EXPRESSION_ITEM_LIST@1009..1014 + 0: CSS_STRING@1009..1014 + 0: CSS_STRING_LITERAL@1009..1014 "\"c d\"" [] [] + 5: COMMA@1014..1016 "," [] [Whitespace(" ")] + 6: SCSS_LIST_EXPRESSION_ELEMENT@1016..1021 + 0: SCSS_EXPRESSION@1016..1021 + 0: SCSS_EXPRESSION_ITEM_LIST@1016..1021 + 0: CSS_STRING@1016..1021 + 0: CSS_STRING_LITERAL@1016..1021 "'e f'" [] [] + 2: R_PAREN@1021..1022 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@1022..1022 + 4: SEMICOLON@1022..1023 ";" [] [] + 14: SCSS_DECLARATION@1023..1082 + 0: SCSS_IDENTIFIER@1023..1064 + 0: DOLLAR@1023..1056 "$" [Newline("\n"), Newline("\n"), Comments("// List with unquoted ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@1056..1064 + 0: IDENT@1056..1064 "unquoted" [] [] + 1: COLON@1064..1066 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1066..1081 + 0: SCSS_EXPRESSION_ITEM_LIST@1066..1081 + 0: SCSS_PARENTHESIZED_EXPRESSION@1066..1081 + 0: L_PAREN@1066..1067 "(" [] [] + 1: SCSS_LIST_EXPRESSION@1067..1080 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@1067..1080 + 0: SCSS_LIST_EXPRESSION_ELEMENT@1067..1070 + 0: SCSS_EXPRESSION@1067..1070 + 0: SCSS_EXPRESSION_ITEM_LIST@1067..1070 + 0: CSS_IDENTIFIER@1067..1070 + 0: IDENT@1067..1070 "foo" [] [] + 1: COMMA@1070..1072 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@1072..1075 + 0: SCSS_EXPRESSION@1072..1075 + 0: SCSS_EXPRESSION_ITEM_LIST@1072..1075 + 0: CSS_IDENTIFIER@1072..1075 + 0: IDENT@1072..1075 "bar" [] [] + 3: COMMA@1075..1077 "," [] [Whitespace(" ")] + 4: SCSS_LIST_EXPRESSION_ELEMENT@1077..1080 + 0: SCSS_EXPRESSION@1077..1080 + 0: SCSS_EXPRESSION_ITEM_LIST@1077..1080 + 0: CSS_IDENTIFIER@1077..1080 + 0: IDENT@1077..1080 "baz" [] [] + 2: R_PAREN@1080..1081 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@1081..1081 + 4: SEMICOLON@1081..1082 ";" [] [] + 15: CSS_QUALIFIED_RULE@1082..1193 + 0: CSS_SELECTOR_LIST@1082..1119 + 0: CSS_COMPOUND_SELECTOR@1082..1119 + 0: CSS_NESTED_SELECTOR_LIST@1082..1082 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@1082..1119 + 0: CSS_CLASS_SELECTOR@1082..1119 + 0: DOT@1082..1114 "." [Newline("\n"), Newline("\n"), Comments("// List as function a ..."), Newline("\n")] [] + 1: CSS_CUSTOM_IDENTIFIER@1114..1119 + 0: IDENT@1114..1119 "test" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@1119..1193 + 0: L_CURLY@1119..1120 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@1120..1191 + 0: CSS_DECLARATION_WITH_SEMICOLON@1120..1157 + 0: CSS_DECLARATION@1120..1156 + 0: CSS_GENERIC_PROPERTY@1120..1156 + 0: CSS_IDENTIFIER@1120..1130 + 0: IDENT@1120..1130 "content" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1130..1132 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1132..1156 + 0: SCSS_EXPRESSION_ITEM_LIST@1132..1156 + 0: CSS_FUNCTION@1132..1156 + 0: CSS_IDENTIFIER@1132..1145 + 0: IDENT@1132..1145 "list-function" [] [] + 1: L_PAREN@1145..1146 "(" [] [] + 2: CSS_PARAMETER_LIST@1146..1155 + 0: SCSS_EXPRESSION@1146..1155 + 0: SCSS_EXPRESSION_ITEM_LIST@1146..1155 + 0: SCSS_PARENTHESIZED_EXPRESSION@1146..1155 + 0: L_PAREN@1146..1147 "(" [] [] + 1: SCSS_LIST_EXPRESSION@1147..1154 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@1147..1154 + 0: SCSS_LIST_EXPRESSION_ELEMENT@1147..1148 + 0: SCSS_EXPRESSION@1147..1148 + 0: SCSS_EXPRESSION_ITEM_LIST@1147..1148 + 0: CSS_IDENTIFIER@1147..1148 + 0: IDENT@1147..1148 "a" [] [] + 1: COMMA@1148..1150 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@1150..1151 + 0: SCSS_EXPRESSION@1150..1151 + 0: SCSS_EXPRESSION_ITEM_LIST@1150..1151 + 0: CSS_IDENTIFIER@1150..1151 + 0: IDENT@1150..1151 "b" [] [] + 3: COMMA@1151..1153 "," [] [Whitespace(" ")] + 4: SCSS_LIST_EXPRESSION_ELEMENT@1153..1154 + 0: SCSS_EXPRESSION@1153..1154 + 0: SCSS_EXPRESSION_ITEM_LIST@1153..1154 + 0: CSS_IDENTIFIER@1153..1154 + 0: IDENT@1153..1154 "c" [] [] + 2: R_PAREN@1154..1155 ")" [] [] + 3: R_PAREN@1155..1156 ")" [] [] + 1: (empty) + 1: SEMICOLON@1156..1157 ";" [] [] + 1: CSS_DECLARATION_WITH_SEMICOLON@1157..1191 + 0: CSS_DECLARATION@1157..1190 + 0: CSS_GENERIC_PROPERTY@1157..1190 + 0: CSS_IDENTIFIER@1157..1165 + 0: IDENT@1157..1165 "value" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1165..1167 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1167..1190 + 0: SCSS_EXPRESSION_ITEM_LIST@1167..1190 + 0: CSS_FUNCTION@1167..1190 + 0: CSS_IDENTIFIER@1167..1183 + 0: IDENT@1167..1183 "another-function" [] [] + 1: L_PAREN@1183..1184 "(" [] [] + 2: CSS_PARAMETER_LIST@1184..1189 + 0: SCSS_EXPRESSION@1184..1189 + 0: SCSS_EXPRESSION_ITEM_LIST@1184..1189 + 0: CSS_IDENTIFIER@1184..1186 + 0: IDENT@1184..1186 "x" [] [Whitespace(" ")] + 1: CSS_IDENTIFIER@1186..1188 + 0: IDENT@1186..1188 "y" [] [Whitespace(" ")] + 2: CSS_IDENTIFIER@1188..1189 + 0: IDENT@1188..1189 "z" [] [] + 3: R_PAREN@1189..1190 ")" [] [] + 1: (empty) + 1: SEMICOLON@1190..1191 ";" [] [] + 2: R_CURLY@1191..1193 "}" [Newline("\n")] [] + 16: SCSS_DECLARATION@1193..1329 + 0: SCSS_IDENTIFIER@1193..1250 + 0: DOLLAR@1193..1242 "$" [Newline("\n"), Newline("\n"), Comments("// List in variable w ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@1242..1250 + 0: IDENT@1242..1250 "brackets" [] [] + 1: COLON@1250..1252 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1252..1261 + 0: SCSS_EXPRESSION_ITEM_LIST@1252..1261 + 0: CSS_BRACKETED_VALUE@1252..1261 + 0: L_BRACK@1252..1253 "[" [] [] + 1: CSS_BRACKETED_VALUE_LIST@1253..1260 + 0: CSS_CUSTOM_IDENTIFIER@1253..1254 + 0: IDENT@1253..1254 "a" [] [] + 1: CSS_GENERIC_DELIMITER@1254..1256 + 0: COMMA@1254..1256 "," [] [Whitespace(" ")] + 2: CSS_CUSTOM_IDENTIFIER@1256..1257 + 0: IDENT@1256..1257 "b" [] [] + 3: CSS_GENERIC_DELIMITER@1257..1259 + 0: COMMA@1257..1259 "," [] [Whitespace(" ")] + 4: CSS_CUSTOM_IDENTIFIER@1259..1260 + 0: IDENT@1259..1260 "c" [] [] + 2: R_BRACK@1260..1261 "]" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@1261..1261 + 4: SEMICOLON@1261..1329 ";" [] [Whitespace(" "), Comments("// Note: SCSS doesn't ...")] + 17: SCSS_DECLARATION@1329..1355 + 0: SCSS_IDENTIFIER@1329..1343 + 0: DOLLAR@1329..1331 "$" [Newline("\n")] [] + 1: CSS_IDENTIFIER@1331..1343 + 0: IDENT@1331..1343 "parens-comma" [] [] + 1: COLON@1343..1345 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1345..1354 + 0: SCSS_EXPRESSION_ITEM_LIST@1345..1354 + 0: SCSS_PARENTHESIZED_EXPRESSION@1345..1354 + 0: L_PAREN@1345..1346 "(" [] [] + 1: SCSS_LIST_EXPRESSION@1346..1353 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@1346..1353 + 0: SCSS_LIST_EXPRESSION_ELEMENT@1346..1347 + 0: SCSS_EXPRESSION@1346..1347 + 0: SCSS_EXPRESSION_ITEM_LIST@1346..1347 + 0: CSS_IDENTIFIER@1346..1347 + 0: IDENT@1346..1347 "a" [] [] + 1: COMMA@1347..1349 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@1349..1350 + 0: SCSS_EXPRESSION@1349..1350 + 0: SCSS_EXPRESSION_ITEM_LIST@1349..1350 + 0: CSS_IDENTIFIER@1349..1350 + 0: IDENT@1349..1350 "b" [] [] + 3: COMMA@1350..1352 "," [] [Whitespace(" ")] + 4: SCSS_LIST_EXPRESSION_ELEMENT@1352..1353 + 0: SCSS_EXPRESSION@1352..1353 + 0: SCSS_EXPRESSION_ITEM_LIST@1352..1353 + 0: CSS_IDENTIFIER@1352..1353 + 0: IDENT@1352..1353 "c" [] [] + 2: R_PAREN@1353..1354 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@1354..1354 + 4: SEMICOLON@1354..1355 ";" [] [] + 18: SCSS_DECLARATION@1355..1379 + 0: SCSS_IDENTIFIER@1355..1369 + 0: DOLLAR@1355..1357 "$" [Newline("\n")] [] + 1: CSS_IDENTIFIER@1357..1369 + 0: IDENT@1357..1369 "parens-space" [] [] + 1: COLON@1369..1371 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1371..1378 + 0: SCSS_EXPRESSION_ITEM_LIST@1371..1378 + 0: SCSS_PARENTHESIZED_EXPRESSION@1371..1378 + 0: L_PAREN@1371..1372 "(" [] [] + 1: SCSS_EXPRESSION@1372..1377 + 0: SCSS_EXPRESSION_ITEM_LIST@1372..1377 + 0: CSS_IDENTIFIER@1372..1374 + 0: IDENT@1372..1374 "a" [] [Whitespace(" ")] + 1: CSS_IDENTIFIER@1374..1376 + 0: IDENT@1374..1376 "b" [] [Whitespace(" ")] + 2: CSS_IDENTIFIER@1376..1377 + 0: IDENT@1376..1377 "c" [] [] + 2: R_PAREN@1377..1378 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@1378..1378 + 4: SEMICOLON@1378..1379 ";" [] [] + 19: SCSS_DECLARATION@1379..1458 + 0: SCSS_IDENTIFIER@1379..1416 + 0: DOLLAR@1379..1401 "$" [Newline("\n"), Newline("\n"), Comments("// Multi-line list"), Newline("\n")] [] + 1: CSS_IDENTIFIER@1401..1416 + 0: IDENT@1401..1416 "multiline-comma" [] [] + 1: COLON@1416..1418 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1418..1457 + 0: SCSS_EXPRESSION_ITEM_LIST@1418..1457 + 0: SCSS_PARENTHESIZED_EXPRESSION@1418..1457 + 0: L_PAREN@1418..1419 "(" [] [] + 1: SCSS_LIST_EXPRESSION@1419..1455 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@1419..1455 + 0: SCSS_LIST_EXPRESSION_ELEMENT@1419..1427 + 0: SCSS_EXPRESSION@1419..1427 + 0: SCSS_EXPRESSION_ITEM_LIST@1419..1427 + 0: CSS_IDENTIFIER@1419..1427 + 0: IDENT@1419..1427 "item1" [Newline("\n"), Whitespace(" ")] [] + 1: COMMA@1427..1428 "," [] [] + 2: SCSS_LIST_EXPRESSION_ELEMENT@1428..1436 + 0: SCSS_EXPRESSION@1428..1436 + 0: SCSS_EXPRESSION_ITEM_LIST@1428..1436 + 0: CSS_IDENTIFIER@1428..1436 + 0: IDENT@1428..1436 "item2" [Newline("\n"), Whitespace(" ")] [] + 3: COMMA@1436..1437 "," [] [] + 4: SCSS_LIST_EXPRESSION_ELEMENT@1437..1445 + 0: SCSS_EXPRESSION@1437..1445 + 0: SCSS_EXPRESSION_ITEM_LIST@1437..1445 + 0: CSS_IDENTIFIER@1437..1445 + 0: IDENT@1437..1445 "item3" [Newline("\n"), Whitespace(" ")] [] + 5: COMMA@1445..1446 "," [] [] + 6: SCSS_LIST_EXPRESSION_ELEMENT@1446..1454 + 0: SCSS_EXPRESSION@1446..1454 + 0: SCSS_EXPRESSION_ITEM_LIST@1446..1454 + 0: CSS_IDENTIFIER@1446..1454 + 0: IDENT@1446..1454 "item4" [Newline("\n"), Whitespace(" ")] [] + 7: COMMA@1454..1455 "," [] [] + 2: R_PAREN@1455..1457 ")" [Newline("\n")] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@1457..1457 + 4: SEMICOLON@1457..1458 ";" [] [] + 20: SCSS_DECLARATION@1458..1514 + 0: SCSS_IDENTIFIER@1458..1476 + 0: DOLLAR@1458..1461 "$" [Newline("\n"), Newline("\n")] [] + 1: CSS_IDENTIFIER@1461..1476 + 0: IDENT@1461..1476 "multiline-space" [] [] + 1: COLON@1476..1478 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1478..1513 + 0: SCSS_EXPRESSION_ITEM_LIST@1478..1513 + 0: SCSS_PARENTHESIZED_EXPRESSION@1478..1513 + 0: L_PAREN@1478..1479 "(" [] [] + 1: SCSS_EXPRESSION@1479..1511 + 0: SCSS_EXPRESSION_ITEM_LIST@1479..1511 + 0: CSS_IDENTIFIER@1479..1487 + 0: IDENT@1479..1487 "item1" [Newline("\n"), Whitespace(" ")] [] + 1: CSS_IDENTIFIER@1487..1495 + 0: IDENT@1487..1495 "item2" [Newline("\n"), Whitespace(" ")] [] + 2: CSS_IDENTIFIER@1495..1503 + 0: IDENT@1495..1503 "item3" [Newline("\n"), Whitespace(" ")] [] + 3: CSS_IDENTIFIER@1503..1511 + 0: IDENT@1503..1511 "item4" [Newline("\n"), Whitespace(" ")] [] + 2: R_PAREN@1511..1513 ")" [Newline("\n")] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@1513..1513 + 4: SEMICOLON@1513..1514 ";" [] [] + 21: SCSS_DECLARATION@1514..1603 + 0: SCSS_IDENTIFIER@1514..1589 + 0: DOLLAR@1514..1575 "$" [Newline("\n"), Newline("\n"), Comments("// List with operator ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@1575..1589 + 0: IDENT@1575..1589 "with-operators" [] [] + 1: COLON@1589..1591 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1591..1602 + 0: SCSS_EXPRESSION_ITEM_LIST@1591..1602 + 0: SCSS_BINARY_EXPRESSION@1591..1597 + 0: CSS_IDENTIFIER@1591..1593 + 0: IDENT@1591..1593 "a" [] [Whitespace(" ")] + 1: PLUS@1593..1595 "+" [] [Whitespace(" ")] + 2: CSS_IDENTIFIER@1595..1597 + 0: IDENT@1595..1597 "b" [] [Whitespace(" ")] + 1: SCSS_BINARY_EXPRESSION@1597..1602 + 0: CSS_IDENTIFIER@1597..1599 + 0: IDENT@1597..1599 "c" [] [Whitespace(" ")] + 1: STAR@1599..1601 "*" [] [Whitespace(" ")] + 2: CSS_IDENTIFIER@1601..1602 + 0: IDENT@1601..1602 "d" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@1602..1602 + 4: SEMICOLON@1602..1603 ";" [] [] + 22: SCSS_DECLARATION@1603..1636 + 0: SCSS_IDENTIFIER@1603..1618 + 0: DOLLAR@1603..1605 "$" [Newline("\n")] [] + 1: CSS_IDENTIFIER@1605..1618 + 0: IDENT@1605..1618 "parenthesized" [] [] + 1: COLON@1618..1620 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1620..1635 + 0: SCSS_EXPRESSION_ITEM_LIST@1620..1635 + 0: SCSS_PARENTHESIZED_EXPRESSION@1620..1628 + 0: L_PAREN@1620..1621 "(" [] [] + 1: SCSS_EXPRESSION@1621..1626 + 0: SCSS_EXPRESSION_ITEM_LIST@1621..1626 + 0: SCSS_BINARY_EXPRESSION@1621..1626 + 0: CSS_IDENTIFIER@1621..1623 + 0: IDENT@1621..1623 "a" [] [Whitespace(" ")] + 1: PLUS@1623..1625 "+" [] [Whitespace(" ")] + 2: CSS_IDENTIFIER@1625..1626 + 0: IDENT@1625..1626 "b" [] [] + 2: R_PAREN@1626..1628 ")" [] [Whitespace(" ")] + 1: SCSS_PARENTHESIZED_EXPRESSION@1628..1635 + 0: L_PAREN@1628..1629 "(" [] [] + 1: SCSS_EXPRESSION@1629..1634 + 0: SCSS_EXPRESSION_ITEM_LIST@1629..1634 + 0: SCSS_BINARY_EXPRESSION@1629..1634 + 0: CSS_IDENTIFIER@1629..1631 + 0: IDENT@1629..1631 "c" [] [Whitespace(" ")] + 1: STAR@1631..1633 "*" [] [Whitespace(" ")] + 2: CSS_IDENTIFIER@1633..1634 + 0: IDENT@1633..1634 "d" [] [] + 2: R_PAREN@1634..1635 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@1635..1635 + 4: SEMICOLON@1635..1636 ";" [] [] + 23: SCSS_DECLARATION@1636..1693 + 0: SCSS_IDENTIFIER@1636..1678 + 0: DOLLAR@1636..1669 "$" [Newline("\n"), Newline("\n"), Comments("// List with negative ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@1669..1678 + 0: IDENT@1669..1678 "negatives" [] [] + 1: COLON@1678..1680 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1680..1692 + 0: SCSS_EXPRESSION_ITEM_LIST@1680..1692 + 0: SCSS_PARENTHESIZED_EXPRESSION@1680..1692 + 0: L_PAREN@1680..1681 "(" [] [] + 1: SCSS_LIST_EXPRESSION@1681..1691 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@1681..1691 + 0: SCSS_LIST_EXPRESSION_ELEMENT@1681..1683 + 0: SCSS_EXPRESSION@1681..1683 + 0: SCSS_EXPRESSION_ITEM_LIST@1681..1683 + 0: CSS_NUMBER@1681..1683 + 0: CSS_NUMBER_LITERAL@1681..1683 "-1" [] [] + 1: COMMA@1683..1685 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@1685..1687 + 0: SCSS_EXPRESSION@1685..1687 + 0: SCSS_EXPRESSION_ITEM_LIST@1685..1687 + 0: CSS_NUMBER@1685..1687 + 0: CSS_NUMBER_LITERAL@1685..1687 "-2" [] [] + 3: COMMA@1687..1689 "," [] [Whitespace(" ")] + 4: SCSS_LIST_EXPRESSION_ELEMENT@1689..1691 + 0: SCSS_EXPRESSION@1689..1691 + 0: SCSS_EXPRESSION_ITEM_LIST@1689..1691 + 0: CSS_NUMBER@1689..1691 + 0: CSS_NUMBER_LITERAL@1689..1691 "-3" [] [] + 2: R_PAREN@1691..1692 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@1692..1692 + 4: SEMICOLON@1692..1693 ";" [] [] + 24: SCSS_DECLARATION@1693..1720 + 0: SCSS_IDENTIFIER@1693..1709 + 0: DOLLAR@1693..1695 "$" [Newline("\n")] [] + 1: CSS_IDENTIFIER@1695..1709 + 0: IDENT@1695..1709 "negative-space" [] [] + 1: COLON@1709..1711 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1711..1719 + 0: SCSS_EXPRESSION_ITEM_LIST@1711..1719 + 0: SCSS_BINARY_EXPRESSION@1711..1719 + 0: SCSS_BINARY_EXPRESSION@1711..1717 + 0: CSS_NUMBER@1711..1714 + 0: CSS_NUMBER_LITERAL@1711..1714 "-1" [] [Whitespace(" ")] + 1: MINUS@1714..1715 "-" [] [] + 2: CSS_NUMBER@1715..1717 + 0: CSS_NUMBER_LITERAL@1715..1717 "2" [] [Whitespace(" ")] + 1: MINUS@1717..1718 "-" [] [] + 2: CSS_NUMBER@1718..1719 + 0: CSS_NUMBER_LITERAL@1718..1719 "3" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@1719..1719 + 4: SEMICOLON@1719..1720 ";" [] [] + 25: SCSS_DECLARATION@1720..1768 + 0: SCSS_IDENTIFIER@1720..1747 + 0: DOLLAR@1720..1742 "$" [Newline("\n"), Newline("\n"), Comments("// List with units"), Newline("\n")] [] + 1: CSS_IDENTIFIER@1742..1747 + 0: IDENT@1742..1747 "units" [] [] + 1: COLON@1747..1749 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1749..1767 + 0: SCSS_EXPRESSION_ITEM_LIST@1749..1767 + 0: CSS_REGULAR_DIMENSION@1749..1754 + 0: CSS_NUMBER_LITERAL@1749..1751 "10" [] [] + 1: IDENT@1751..1754 "px" [] [Whitespace(" ")] + 1: CSS_REGULAR_DIMENSION@1754..1759 + 0: CSS_NUMBER_LITERAL@1754..1756 "20" [] [] + 1: IDENT@1756..1759 "em" [] [Whitespace(" ")] + 2: CSS_PERCENTAGE@1759..1763 + 0: CSS_NUMBER_LITERAL@1759..1761 "30" [] [] + 1: PERCENT@1761..1763 "%" [] [Whitespace(" ")] + 3: CSS_REGULAR_DIMENSION@1763..1767 + 0: CSS_NUMBER_LITERAL@1763..1765 "40" [] [] + 1: IDENT@1765..1767 "vh" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@1767..1767 + 4: SEMICOLON@1767..1768 ";" [] [] + 26: SCSS_DECLARATION@1768..1857 + 0: SCSS_IDENTIFIER@1768..1813 + 0: DOLLAR@1768..1802 "$" [Newline("\n"), Newline("\n"), Comments("// Complex expression ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@1802..1813 + 0: IDENT@1802..1813 "expressions" [] [] + 1: COLON@1813..1815 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1815..1856 + 0: SCSS_EXPRESSION_ITEM_LIST@1815..1856 + 0: SCSS_PARENTHESIZED_EXPRESSION@1815..1856 + 0: L_PAREN@1815..1816 "(" [] [] + 1: SCSS_LIST_EXPRESSION@1816..1854 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@1816..1854 + 0: SCSS_LIST_EXPRESSION_ELEMENT@1816..1826 + 0: SCSS_EXPRESSION@1816..1826 + 0: SCSS_EXPRESSION_ITEM_LIST@1816..1826 + 0: SCSS_PARENTHESIZED_EXPRESSION@1816..1826 + 0: L_PAREN@1816..1820 "(" [Newline("\n"), Whitespace(" ")] [] + 1: SCSS_EXPRESSION@1820..1825 + 0: SCSS_EXPRESSION_ITEM_LIST@1820..1825 + 0: SCSS_BINARY_EXPRESSION@1820..1825 + 0: CSS_NUMBER@1820..1822 + 0: CSS_NUMBER_LITERAL@1820..1822 "1" [] [Whitespace(" ")] + 1: PLUS@1822..1824 "+" [] [Whitespace(" ")] + 2: CSS_NUMBER@1824..1825 + 0: CSS_NUMBER_LITERAL@1824..1825 "2" [] [] + 2: R_PAREN@1825..1826 ")" [] [] + 1: COMMA@1826..1827 "," [] [] + 2: SCSS_LIST_EXPRESSION_ELEMENT@1827..1839 + 0: SCSS_EXPRESSION@1827..1839 + 0: SCSS_EXPRESSION_ITEM_LIST@1827..1839 + 0: SCSS_PARENTHESIZED_EXPRESSION@1827..1839 + 0: L_PAREN@1827..1831 "(" [Newline("\n"), Whitespace(" ")] [] + 1: SCSS_EXPRESSION@1831..1838 + 0: SCSS_EXPRESSION_ITEM_LIST@1831..1838 + 0: SCSS_BINARY_EXPRESSION@1831..1838 + 0: SCSS_IDENTIFIER@1831..1834 + 0: DOLLAR@1831..1832 "$" [] [] + 1: CSS_IDENTIFIER@1832..1834 + 0: IDENT@1832..1834 "a" [] [Whitespace(" ")] + 1: STAR@1834..1836 "*" [] [Whitespace(" ")] + 2: SCSS_IDENTIFIER@1836..1838 + 0: DOLLAR@1836..1837 "$" [] [] + 1: CSS_IDENTIFIER@1837..1838 + 0: IDENT@1837..1838 "b" [] [] + 2: R_PAREN@1838..1839 ")" [] [] + 3: COMMA@1839..1840 "," [] [] + 4: SCSS_LIST_EXPRESSION_ELEMENT@1840..1853 + 0: SCSS_EXPRESSION@1840..1853 + 0: SCSS_EXPRESSION_ITEM_LIST@1840..1853 + 0: SCSS_PARENTHESIZED_EXPRESSION@1840..1853 + 0: L_PAREN@1840..1844 "(" [Newline("\n"), Whitespace(" ")] [] + 1: SCSS_EXPRESSION@1844..1852 + 0: SCSS_EXPRESSION_ITEM_LIST@1844..1852 + 0: SCSS_BINARY_EXPRESSION@1844..1852 + 0: CSS_REGULAR_DIMENSION@1844..1849 + 0: CSS_NUMBER_LITERAL@1844..1846 "10" [] [] + 1: IDENT@1846..1849 "px" [] [Whitespace(" ")] + 1: SLASH@1849..1851 "/" [] [Whitespace(" ")] + 2: CSS_NUMBER@1851..1852 + 0: CSS_NUMBER_LITERAL@1851..1852 "2" [] [] + 2: R_PAREN@1852..1853 ")" [] [] + 5: COMMA@1853..1854 "," [] [] + 2: R_PAREN@1854..1856 ")" [Newline("\n")] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@1856..1856 + 4: SEMICOLON@1856..1857 ";" [] [] + 27: SCSS_DECLARATION@1857..1940 + 0: SCSS_IDENTIFIER@1857..1895 + 0: DOLLAR@1857..1888 "$" [Newline("\n"), Newline("\n"), Comments("// List with special ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@1888..1895 + 0: IDENT@1888..1895 "special" [] [] + 1: COLON@1895..1897 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1897..1939 + 0: SCSS_EXPRESSION_ITEM_LIST@1897..1939 + 0: SCSS_PARENTHESIZED_EXPRESSION@1897..1939 + 0: L_PAREN@1897..1898 "(" [] [] + 1: SCSS_LIST_EXPRESSION@1898..1937 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@1898..1937 + 0: SCSS_LIST_EXPRESSION_ELEMENT@1898..1908 + 0: SCSS_EXPRESSION@1898..1908 + 0: SCSS_EXPRESSION_ITEM_LIST@1898..1908 + 0: CSS_IDENTIFIER@1898..1908 + 0: IDENT@1898..1908 "inherit" [Newline("\n"), Whitespace(" ")] [] + 1: COMMA@1908..1909 "," [] [] + 2: SCSS_LIST_EXPRESSION_ELEMENT@1909..1919 + 0: SCSS_EXPRESSION@1909..1919 + 0: SCSS_EXPRESSION_ITEM_LIST@1909..1919 + 0: CSS_IDENTIFIER@1909..1919 + 0: IDENT@1909..1919 "initial" [Newline("\n"), Whitespace(" ")] [] + 3: COMMA@1919..1920 "," [] [] + 4: SCSS_LIST_EXPRESSION_ELEMENT@1920..1928 + 0: SCSS_EXPRESSION@1920..1928 + 0: SCSS_EXPRESSION_ITEM_LIST@1920..1928 + 0: CSS_IDENTIFIER@1920..1928 + 0: IDENT@1920..1928 "unset" [Newline("\n"), Whitespace(" ")] [] + 5: COMMA@1928..1929 "," [] [] + 6: SCSS_LIST_EXPRESSION_ELEMENT@1929..1936 + 0: SCSS_EXPRESSION@1929..1936 + 0: SCSS_EXPRESSION_ITEM_LIST@1929..1936 + 0: CSS_IDENTIFIER@1929..1936 + 0: IDENT@1929..1936 "auto" [Newline("\n"), Whitespace(" ")] [] + 7: COMMA@1936..1937 "," [] [] + 2: R_PAREN@1937..1939 ")" [Newline("\n")] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@1939..1939 + 4: SEMICOLON@1939..1940 ";" [] [] + 28: SCSS_DECLARATION@1940..2019 + 0: SCSS_IDENTIFIER@1940..1975 + 0: DOLLAR@1940..1969 "$" [Newline("\n"), Newline("\n"), Comments("// List with color va ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@1969..1975 + 0: IDENT@1969..1975 "colors" [] [] + 1: COLON@1975..1977 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1977..2018 + 0: SCSS_EXPRESSION_ITEM_LIST@1977..2018 + 0: SCSS_PARENTHESIZED_EXPRESSION@1977..2018 + 0: L_PAREN@1977..1978 "(" [] [] + 1: SCSS_LIST_EXPRESSION@1978..2017 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@1978..2017 + 0: SCSS_LIST_EXPRESSION_ELEMENT@1978..1982 + 0: SCSS_EXPRESSION@1978..1982 + 0: SCSS_EXPRESSION_ITEM_LIST@1978..1982 + 0: CSS_COLOR@1978..1982 + 0: HASH@1978..1979 "#" [] [] + 1: CSS_COLOR_LITERAL@1979..1982 "fff" [] [] + 1: COMMA@1982..1984 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@1984..1996 + 0: SCSS_EXPRESSION@1984..1996 + 0: SCSS_EXPRESSION_ITEM_LIST@1984..1996 + 0: CSS_FUNCTION@1984..1996 + 0: CSS_IDENTIFIER@1984..1987 + 0: IDENT@1984..1987 "rgb" [] [] + 1: L_PAREN@1987..1988 "(" [] [] + 2: CSS_PARAMETER_LIST@1988..1995 + 0: SCSS_EXPRESSION@1988..1989 + 0: SCSS_EXPRESSION_ITEM_LIST@1988..1989 + 0: CSS_NUMBER@1988..1989 + 0: CSS_NUMBER_LITERAL@1988..1989 "0" [] [] + 1: COMMA@1989..1991 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1991..1992 + 0: SCSS_EXPRESSION_ITEM_LIST@1991..1992 + 0: CSS_NUMBER@1991..1992 + 0: CSS_NUMBER_LITERAL@1991..1992 "0" [] [] + 3: COMMA@1992..1994 "," [] [Whitespace(" ")] + 4: SCSS_EXPRESSION@1994..1995 + 0: SCSS_EXPRESSION_ITEM_LIST@1994..1995 + 0: CSS_NUMBER@1994..1995 + 0: CSS_NUMBER_LITERAL@1994..1995 "0" [] [] + 3: R_PAREN@1995..1996 ")" [] [] + 3: COMMA@1996..1998 "," [] [Whitespace(" ")] + 4: SCSS_LIST_EXPRESSION_ELEMENT@1998..2017 + 0: SCSS_EXPRESSION@1998..2017 + 0: SCSS_EXPRESSION_ITEM_LIST@1998..2017 + 0: CSS_FUNCTION@1998..2017 + 0: CSS_IDENTIFIER@1998..2001 + 0: IDENT@1998..2001 "hsl" [] [] + 1: L_PAREN@2001..2002 "(" [] [] + 2: CSS_PARAMETER_LIST@2002..2016 + 0: SCSS_EXPRESSION@2002..2005 + 0: SCSS_EXPRESSION_ITEM_LIST@2002..2005 + 0: CSS_NUMBER@2002..2005 + 0: CSS_NUMBER_LITERAL@2002..2005 "120" [] [] + 1: COMMA@2005..2007 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2007..2011 + 0: SCSS_EXPRESSION_ITEM_LIST@2007..2011 + 0: CSS_PERCENTAGE@2007..2011 + 0: CSS_NUMBER_LITERAL@2007..2010 "100" [] [] + 1: PERCENT@2010..2011 "%" [] [] + 3: COMMA@2011..2013 "," [] [Whitespace(" ")] + 4: SCSS_EXPRESSION@2013..2016 + 0: SCSS_EXPRESSION_ITEM_LIST@2013..2016 + 0: CSS_PERCENTAGE@2013..2016 + 0: CSS_NUMBER_LITERAL@2013..2015 "50" [] [] + 1: PERCENT@2015..2016 "%" [] [] + 3: R_PAREN@2016..2017 ")" [] [] + 2: R_PAREN@2017..2018 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@2018..2018 + 4: SEMICOLON@2018..2019 ";" [] [] + 29: SCSS_DECLARATION@2019..2119 + 0: SCSS_IDENTIFIER@2019..2056 + 0: DOLLAR@2019..2048 "$" [Newline("\n"), Newline("\n"), Comments("// List with CSS keyw ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@2048..2056 + 0: IDENT@2048..2056 "keywords" [] [] + 1: COLON@2056..2058 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2058..2118 + 0: SCSS_EXPRESSION_ITEM_LIST@2058..2118 + 0: SCSS_PARENTHESIZED_EXPRESSION@2058..2118 + 0: L_PAREN@2058..2059 "(" [] [] + 1: SCSS_LIST_EXPRESSION@2059..2116 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@2059..2116 + 0: SCSS_LIST_EXPRESSION_ELEMENT@2059..2066 + 0: SCSS_EXPRESSION@2059..2066 + 0: SCSS_EXPRESSION_ITEM_LIST@2059..2066 + 0: CSS_IDENTIFIER@2059..2066 + 0: IDENT@2059..2066 "none" [Newline("\n"), Whitespace(" ")] [] + 1: COMMA@2066..2067 "," [] [] + 2: SCSS_LIST_EXPRESSION_ELEMENT@2067..2074 + 0: SCSS_EXPRESSION@2067..2074 + 0: SCSS_EXPRESSION_ITEM_LIST@2067..2074 + 0: CSS_IDENTIFIER@2067..2074 + 0: IDENT@2067..2074 "auto" [Newline("\n"), Whitespace(" ")] [] + 3: COMMA@2074..2075 "," [] [] + 4: SCSS_LIST_EXPRESSION_ELEMENT@2075..2085 + 0: SCSS_EXPRESSION@2075..2085 + 0: SCSS_EXPRESSION_ITEM_LIST@2075..2085 + 0: CSS_IDENTIFIER@2075..2085 + 0: IDENT@2075..2085 "inherit" [Newline("\n"), Whitespace(" ")] [] + 5: COMMA@2085..2086 "," [] [] + 6: SCSS_LIST_EXPRESSION_ELEMENT@2086..2096 + 0: SCSS_EXPRESSION@2086..2096 + 0: SCSS_EXPRESSION_ITEM_LIST@2086..2096 + 0: CSS_IDENTIFIER@2086..2096 + 0: IDENT@2086..2096 "initial" [Newline("\n"), Whitespace(" ")] [] + 7: COMMA@2096..2097 "," [] [] + 8: SCSS_LIST_EXPRESSION_ELEMENT@2097..2105 + 0: SCSS_EXPRESSION@2097..2105 + 0: SCSS_EXPRESSION_ITEM_LIST@2097..2105 + 0: CSS_IDENTIFIER@2097..2105 + 0: IDENT@2097..2105 "unset" [Newline("\n"), Whitespace(" ")] [] + 9: COMMA@2105..2106 "," [] [] + 10: SCSS_LIST_EXPRESSION_ELEMENT@2106..2115 + 0: SCSS_EXPRESSION@2106..2115 + 0: SCSS_EXPRESSION_ITEM_LIST@2106..2115 + 0: CSS_IDENTIFIER@2106..2115 + 0: IDENT@2106..2115 "revert" [Newline("\n"), Whitespace(" ")] [] + 11: COMMA@2115..2116 "," [] [] + 2: R_PAREN@2116..2118 ")" [Newline("\n")] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@2118..2118 + 4: SEMICOLON@2118..2119 ";" [] [] + 30: SCSS_DECLARATION@2119..2177 + 0: SCSS_IDENTIFIER@2119..2166 + 0: DOLLAR@2119..2162 "$" [Newline("\n"), Newline("\n"), Comments("// Slash-separated (f ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@2162..2166 + 0: IDENT@2162..2166 "font" [] [] + 1: COLON@2166..2168 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2168..2176 + 0: SCSS_EXPRESSION_ITEM_LIST@2168..2176 + 0: SCSS_BINARY_EXPRESSION@2168..2176 + 0: CSS_REGULAR_DIMENSION@2168..2172 + 0: CSS_NUMBER_LITERAL@2168..2170 "16" [] [] + 1: IDENT@2170..2172 "px" [] [] + 1: SLASH@2172..2173 "/" [] [] + 2: CSS_NUMBER@2173..2176 + 0: CSS_NUMBER_LITERAL@2173..2176 "1.5" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@2176..2176 + 4: SEMICOLON@2176..2177 ";" [] [] + 31: SCSS_DECLARATION@2177..2221 + 0: SCSS_IDENTIFIER@2177..2188 + 0: DOLLAR@2177..2179 "$" [Newline("\n")] [] + 1: CSS_IDENTIFIER@2179..2188 + 0: IDENT@2179..2188 "font-list" [] [] + 1: COLON@2188..2190 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2190..2220 + 0: SCSS_EXPRESSION_ITEM_LIST@2190..2220 + 0: SCSS_PARENTHESIZED_EXPRESSION@2190..2220 + 0: L_PAREN@2190..2191 "(" [] [] + 1: SCSS_LIST_EXPRESSION@2191..2219 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@2191..2219 + 0: SCSS_LIST_EXPRESSION_ELEMENT@2191..2199 + 0: SCSS_EXPRESSION@2191..2199 + 0: SCSS_EXPRESSION_ITEM_LIST@2191..2199 + 0: SCSS_BINARY_EXPRESSION@2191..2199 + 0: CSS_REGULAR_DIMENSION@2191..2195 + 0: CSS_NUMBER_LITERAL@2191..2193 "12" [] [] + 1: IDENT@2193..2195 "px" [] [] + 1: SLASH@2195..2196 "/" [] [] + 2: CSS_NUMBER@2196..2199 + 0: CSS_NUMBER_LITERAL@2196..2199 "1.2" [] [] + 1: COMMA@2199..2201 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@2201..2209 + 0: SCSS_EXPRESSION@2201..2209 + 0: SCSS_EXPRESSION_ITEM_LIST@2201..2209 + 0: SCSS_BINARY_EXPRESSION@2201..2209 + 0: CSS_REGULAR_DIMENSION@2201..2205 + 0: CSS_NUMBER_LITERAL@2201..2203 "14" [] [] + 1: IDENT@2203..2205 "px" [] [] + 1: SLASH@2205..2206 "/" [] [] + 2: CSS_NUMBER@2206..2209 + 0: CSS_NUMBER_LITERAL@2206..2209 "1.4" [] [] + 3: COMMA@2209..2211 "," [] [Whitespace(" ")] + 4: SCSS_LIST_EXPRESSION_ELEMENT@2211..2219 + 0: SCSS_EXPRESSION@2211..2219 + 0: SCSS_EXPRESSION_ITEM_LIST@2211..2219 + 0: SCSS_BINARY_EXPRESSION@2211..2219 + 0: CSS_REGULAR_DIMENSION@2211..2215 + 0: CSS_NUMBER_LITERAL@2211..2213 "16" [] [] + 1: IDENT@2213..2215 "px" [] [] + 1: SLASH@2215..2216 "/" [] [] + 2: CSS_NUMBER@2216..2219 + 0: CSS_NUMBER_LITERAL@2216..2219 "1.6" [] [] + 2: R_PAREN@2219..2220 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@2220..2220 + 4: SEMICOLON@2220..2221 ";" [] [] + 32: SCSS_DECLARATION@2221..2288 + 0: SCSS_IDENTIFIER@2221..2245 + 0: DOLLAR@2221..2241 "$" [Newline("\n"), Newline("\n"), Comments("// List with URL"), Newline("\n")] [] + 1: CSS_IDENTIFIER@2241..2245 + 0: IDENT@2241..2245 "urls" [] [] + 1: COLON@2245..2247 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2247..2287 + 0: SCSS_EXPRESSION_ITEM_LIST@2247..2287 + 0: SCSS_PARENTHESIZED_EXPRESSION@2247..2287 + 0: L_PAREN@2247..2248 "(" [] [] + 1: SCSS_LIST_EXPRESSION@2248..2286 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@2248..2286 + 0: SCSS_LIST_EXPRESSION_ELEMENT@2248..2260 + 0: SCSS_EXPRESSION@2248..2260 + 0: SCSS_EXPRESSION_ITEM_LIST@2248..2260 + 0: CSS_URL_FUNCTION@2248..2260 + 0: URL_KW@2248..2251 "url" [] [] + 1: L_PAREN@2251..2252 "(" [] [] + 2: CSS_STRING@2252..2259 + 0: CSS_STRING_LITERAL@2252..2259 "\"a.png\"" [] [] + 3: CSS_URL_MODIFIER_LIST@2259..2259 + 4: R_PAREN@2259..2260 ")" [] [] + 1: COMMA@2260..2262 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@2262..2274 + 0: SCSS_EXPRESSION@2262..2274 + 0: SCSS_EXPRESSION_ITEM_LIST@2262..2274 + 0: CSS_URL_FUNCTION@2262..2274 + 0: URL_KW@2262..2265 "url" [] [] + 1: L_PAREN@2265..2266 "(" [] [] + 2: CSS_STRING@2266..2273 + 0: CSS_STRING_LITERAL@2266..2273 "'b.jpg'" [] [] + 3: CSS_URL_MODIFIER_LIST@2273..2273 + 4: R_PAREN@2273..2274 ")" [] [] + 3: COMMA@2274..2276 "," [] [Whitespace(" ")] + 4: SCSS_LIST_EXPRESSION_ELEMENT@2276..2286 + 0: SCSS_EXPRESSION@2276..2286 + 0: SCSS_EXPRESSION_ITEM_LIST@2276..2286 + 0: CSS_URL_FUNCTION@2276..2286 + 0: URL_KW@2276..2279 "url" [] [] + 1: L_PAREN@2279..2280 "(" [] [] + 2: CSS_URL_VALUE_RAW@2280..2285 + 0: CSS_URL_VALUE_RAW_LITERAL@2280..2285 "c.gif" [] [] + 3: CSS_URL_MODIFIER_LIST@2285..2285 + 4: R_PAREN@2285..2286 ")" [] [] + 2: R_PAREN@2286..2287 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@2287..2287 + 4: SEMICOLON@2287..2288 ";" [] [] + 33: SCSS_DECLARATION@2288..2358 + 0: SCSS_IDENTIFIER@2288..2328 + 0: DOLLAR@2288..2322 "$" [Newline("\n"), Newline("\n"), Comments("// List with custom p ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@2322..2328 + 0: IDENT@2322..2328 "custom" [] [] + 1: COLON@2328..2330 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2330..2357 + 0: SCSS_EXPRESSION_ITEM_LIST@2330..2357 + 0: SCSS_PARENTHESIZED_EXPRESSION@2330..2357 + 0: L_PAREN@2330..2331 "(" [] [] + 1: SCSS_LIST_EXPRESSION@2331..2356 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@2331..2356 + 0: SCSS_LIST_EXPRESSION_ELEMENT@2331..2338 + 0: SCSS_EXPRESSION@2331..2338 + 0: SCSS_EXPRESSION_ITEM_LIST@2331..2338 + 0: CSS_DASHED_IDENTIFIER@2331..2338 + 0: IDENT@2331..2338 "--var-1" [] [] + 1: COMMA@2338..2340 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@2340..2347 + 0: SCSS_EXPRESSION@2340..2347 + 0: SCSS_EXPRESSION_ITEM_LIST@2340..2347 + 0: CSS_DASHED_IDENTIFIER@2340..2347 + 0: IDENT@2340..2347 "--var-2" [] [] + 3: COMMA@2347..2349 "," [] [Whitespace(" ")] + 4: SCSS_LIST_EXPRESSION_ELEMENT@2349..2356 + 0: SCSS_EXPRESSION@2349..2356 + 0: SCSS_EXPRESSION_ITEM_LIST@2349..2356 + 0: CSS_DASHED_IDENTIFIER@2349..2356 + 0: IDENT@2349..2356 "--var-3" [] [] + 2: R_PAREN@2356..2357 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@2357..2357 + 4: SEMICOLON@2357..2358 ";" [] [] + 34: SCSS_DECLARATION@2358..2421 + 0: SCSS_IDENTIFIER@2358..2386 + 0: DOLLAR@2358..2381 "$" [Newline("\n"), Newline("\n"), Comments("// List with attr()"), Newline("\n")] [] + 1: CSS_IDENTIFIER@2381..2386 + 0: IDENT@2381..2386 "attrs" [] [] + 1: COLON@2386..2388 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2388..2420 + 0: SCSS_EXPRESSION_ITEM_LIST@2388..2420 + 0: SCSS_PARENTHESIZED_EXPRESSION@2388..2420 + 0: L_PAREN@2388..2389 "(" [] [] + 1: SCSS_LIST_EXPRESSION@2389..2419 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@2389..2419 + 0: SCSS_LIST_EXPRESSION_ELEMENT@2389..2403 + 0: SCSS_EXPRESSION@2389..2403 + 0: SCSS_EXPRESSION_ITEM_LIST@2389..2403 + 0: CSS_ATTR_FUNCTION@2389..2403 + 0: ATTR_KW@2389..2393 "attr" [] [] + 1: L_PAREN@2393..2394 "(" [] [] + 2: CSS_ATTR_NAME_LIST@2394..2402 + 0: CSS_IDENTIFIER@2394..2402 + 0: IDENT@2394..2402 "data-foo" [] [] + 3: (empty) + 4: (empty) + 5: R_PAREN@2402..2403 ")" [] [] + 1: COMMA@2403..2405 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@2405..2419 + 0: SCSS_EXPRESSION@2405..2419 + 0: SCSS_EXPRESSION_ITEM_LIST@2405..2419 + 0: CSS_ATTR_FUNCTION@2405..2419 + 0: ATTR_KW@2405..2409 "attr" [] [] + 1: L_PAREN@2409..2410 "(" [] [] + 2: CSS_ATTR_NAME_LIST@2410..2418 + 0: CSS_IDENTIFIER@2410..2418 + 0: IDENT@2410..2418 "data-bar" [] [] + 3: (empty) + 4: (empty) + 5: R_PAREN@2418..2419 ")" [] [] + 2: R_PAREN@2419..2420 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@2420..2420 + 4: SEMICOLON@2420..2421 ";" [] [] + 35: SCSS_DECLARATION@2421..2488 + 0: SCSS_IDENTIFIER@2421..2470 + 0: DOLLAR@2421..2456 "$" [Newline("\n"), Newline("\n"), Comments("// Nested space and c ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@2456..2470 + 0: IDENT@2456..2470 "complex-nested" [] [] + 1: COLON@2470..2472 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2472..2487 + 0: SCSS_EXPRESSION_ITEM_LIST@2472..2487 + 0: SCSS_PARENTHESIZED_EXPRESSION@2472..2487 + 0: L_PAREN@2472..2473 "(" [] [] + 1: SCSS_LIST_EXPRESSION@2473..2486 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@2473..2486 + 0: SCSS_LIST_EXPRESSION_ELEMENT@2473..2476 + 0: SCSS_EXPRESSION@2473..2476 + 0: SCSS_EXPRESSION_ITEM_LIST@2473..2476 + 0: CSS_IDENTIFIER@2473..2475 + 0: IDENT@2473..2475 "a" [] [Whitespace(" ")] + 1: CSS_IDENTIFIER@2475..2476 + 0: IDENT@2475..2476 "b" [] [] + 1: COMMA@2476..2478 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@2478..2483 + 0: SCSS_EXPRESSION@2478..2483 + 0: SCSS_EXPRESSION_ITEM_LIST@2478..2483 + 0: CSS_IDENTIFIER@2478..2480 + 0: IDENT@2478..2480 "c" [] [Whitespace(" ")] + 1: CSS_IDENTIFIER@2480..2482 + 0: IDENT@2480..2482 "d" [] [Whitespace(" ")] + 2: CSS_IDENTIFIER@2482..2483 + 0: IDENT@2482..2483 "e" [] [] + 3: COMMA@2483..2485 "," [] [Whitespace(" ")] + 4: SCSS_LIST_EXPRESSION_ELEMENT@2485..2486 + 0: SCSS_EXPRESSION@2485..2486 + 0: SCSS_EXPRESSION_ITEM_LIST@2485..2486 + 0: CSS_IDENTIFIER@2485..2486 + 0: IDENT@2485..2486 "f" [] [] + 2: R_PAREN@2486..2487 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@2487..2487 + 4: SEMICOLON@2487..2488 ";" [] [] + 36: SCSS_DECLARATION@2488..2555 + 0: SCSS_IDENTIFIER@2488..2514 + 0: DOLLAR@2488..2509 "$" [Newline("\n"), Newline("\n"), Comments("// List with calc"), Newline("\n")] [] + 1: CSS_IDENTIFIER@2509..2514 + 0: IDENT@2509..2514 "calcs" [] [] + 1: COLON@2514..2516 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2516..2554 + 0: SCSS_EXPRESSION_ITEM_LIST@2516..2554 + 0: SCSS_PARENTHESIZED_EXPRESSION@2516..2554 + 0: L_PAREN@2516..2517 "(" [] [] + 1: SCSS_LIST_EXPRESSION@2517..2553 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@2517..2553 + 0: SCSS_LIST_EXPRESSION_ELEMENT@2517..2534 + 0: SCSS_EXPRESSION@2517..2534 + 0: SCSS_EXPRESSION_ITEM_LIST@2517..2534 + 0: CSS_FUNCTION@2517..2534 + 0: CSS_IDENTIFIER@2517..2521 + 0: IDENT@2517..2521 "calc" [] [] + 1: L_PAREN@2521..2522 "(" [] [] + 2: CSS_PARAMETER_LIST@2522..2533 + 0: SCSS_EXPRESSION@2522..2533 + 0: SCSS_EXPRESSION_ITEM_LIST@2522..2533 + 0: SCSS_BINARY_EXPRESSION@2522..2533 + 0: CSS_PERCENTAGE@2522..2527 + 0: CSS_NUMBER_LITERAL@2522..2525 "100" [] [] + 1: PERCENT@2525..2527 "%" [] [Whitespace(" ")] + 1: MINUS@2527..2529 "-" [] [Whitespace(" ")] + 2: CSS_REGULAR_DIMENSION@2529..2533 + 0: CSS_NUMBER_LITERAL@2529..2531 "10" [] [] + 1: IDENT@2531..2533 "px" [] [] + 3: R_PAREN@2533..2534 ")" [] [] + 1: COMMA@2534..2536 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@2536..2553 + 0: SCSS_EXPRESSION@2536..2553 + 0: SCSS_EXPRESSION_ITEM_LIST@2536..2553 + 0: CSS_FUNCTION@2536..2553 + 0: CSS_IDENTIFIER@2536..2540 + 0: IDENT@2536..2540 "calc" [] [] + 1: L_PAREN@2540..2541 "(" [] [] + 2: CSS_PARAMETER_LIST@2541..2552 + 0: SCSS_EXPRESSION@2541..2552 + 0: SCSS_EXPRESSION_ITEM_LIST@2541..2552 + 0: SCSS_BINARY_EXPRESSION@2541..2552 + 0: CSS_REGULAR_DIMENSION@2541..2546 + 0: CSS_NUMBER_LITERAL@2541..2543 "50" [] [] + 1: IDENT@2543..2546 "vh" [] [Whitespace(" ")] + 1: MINUS@2546..2548 "-" [] [Whitespace(" ")] + 2: CSS_REGULAR_DIMENSION@2548..2552 + 0: CSS_NUMBER_LITERAL@2548..2550 "20" [] [] + 1: IDENT@2550..2552 "px" [] [] + 3: R_PAREN@2552..2553 ")" [] [] + 2: R_PAREN@2553..2554 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@2554..2554 + 4: SEMICOLON@2554..2555 ";" [] [] + 37: SCSS_DECLARATION@2555..2657 + 0: SCSS_IDENTIFIER@2555..2600 + 0: DOLLAR@2555..2594 "$" [Newline("\n"), Newline("\n"), Comments("// Empty items in lis ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@2594..2600 + 0: IDENT@2594..2600 "sparse" [] [] + 1: COLON@2600..2602 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2602..2609 + 0: SCSS_EXPRESSION_ITEM_LIST@2602..2609 + 0: SCSS_PARENTHESIZED_EXPRESSION@2602..2609 + 0: L_PAREN@2602..2603 "(" [] [] + 1: SCSS_LIST_EXPRESSION@2603..2608 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@2603..2608 + 0: SCSS_LIST_EXPRESSION_ELEMENT@2603..2604 + 0: SCSS_EXPRESSION@2603..2604 + 0: SCSS_EXPRESSION_ITEM_LIST@2603..2604 + 0: CSS_IDENTIFIER@2603..2604 + 0: IDENT@2603..2604 "a" [] [] + 1: COMMA@2604..2605 "," [] [] + 2: SCSS_LIST_EXPRESSION_ELEMENT@2605..2605 + 0: SCSS_EXPRESSION@2605..2605 + 0: SCSS_EXPRESSION_ITEM_LIST@2605..2605 + 3: COMMA@2605..2607 "," [] [Whitespace(" ")] + 4: SCSS_LIST_EXPRESSION_ELEMENT@2607..2608 + 0: SCSS_EXPRESSION@2607..2608 + 0: SCSS_EXPRESSION_ITEM_LIST@2607..2608 + 0: CSS_IDENTIFIER@2607..2608 + 0: IDENT@2607..2608 "c" [] [] + 2: R_PAREN@2608..2609 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@2609..2609 + 4: SEMICOLON@2609..2657 ";" [] [Whitespace(" "), Comments("// Note: This might b ...")] + 38: SCSS_DECLARATION@2657..2734 + 0: SCSS_IDENTIFIER@2657..2709 + 0: DOLLAR@2657..2695 "$" [Newline("\n"), Newline("\n"), Comments("// List with importan ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@2695..2709 + 0: IDENT@2695..2709 "with-important" [] [] + 1: COLON@2709..2711 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2711..2733 + 0: SCSS_EXPRESSION_ITEM_LIST@2711..2733 + 0: SCSS_PARENTHESIZED_EXPRESSION@2711..2733 + 0: L_PAREN@2711..2712 "(" [] [] + 1: SCSS_LIST_EXPRESSION@2712..2732 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@2712..2732 + 0: SCSS_LIST_EXPRESSION_ELEMENT@2712..2726 + 0: SCSS_EXPRESSION@2712..2726 + 0: SCSS_EXPRESSION_ITEM_LIST@2712..2726 + 0: CSS_IDENTIFIER@2712..2716 + 0: IDENT@2712..2716 "red" [] [Whitespace(" ")] + 1: CSS_DECLARATION_IMPORTANT@2716..2726 + 0: BANG@2716..2717 "!" [] [] + 1: IMPORTANT_KW@2717..2726 "important" [] [] + 1: COMMA@2726..2728 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@2728..2732 + 0: SCSS_EXPRESSION@2728..2732 + 0: SCSS_EXPRESSION_ITEM_LIST@2728..2732 + 0: CSS_IDENTIFIER@2728..2732 + 0: IDENT@2728..2732 "blue" [] [] + 2: R_PAREN@2732..2733 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@2733..2733 + 4: SEMICOLON@2733..2734 ";" [] [] + 39: SCSS_DECLARATION@2734..2802 + 0: SCSS_IDENTIFIER@2734..2764 + 0: DOLLAR@2734..2757 "$" [Newline("\n"), Newline("\n"), Comments("// Unicode in lists"), Newline("\n")] [] + 1: CSS_IDENTIFIER@2757..2764 + 0: IDENT@2757..2764 "unicode" [] [] + 1: COLON@2764..2766 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2766..2801 + 0: SCSS_EXPRESSION_ITEM_LIST@2766..2801 + 0: SCSS_PARENTHESIZED_EXPRESSION@2766..2801 + 0: L_PAREN@2766..2767 "(" [] [] + 1: SCSS_LIST_EXPRESSION@2767..2800 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@2767..2800 + 0: SCSS_LIST_EXPRESSION_ELEMENT@2767..2773 + 0: SCSS_EXPRESSION@2767..2773 + 0: SCSS_EXPRESSION_ITEM_LIST@2767..2773 + 0: CSS_IDENTIFIER@2767..2773 + 0: IDENT@2767..2773 "émoji" [] [] + 1: COMMA@2773..2775 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@2775..2779 + 0: SCSS_EXPRESSION@2775..2779 + 0: SCSS_EXPRESSION_ITEM_LIST@2775..2779 + 0: CSS_IDENTIFIER@2775..2779 + 0: IDENT@2775..2779 "🎨" [] [] + 3: COMMA@2779..2781 "," [] [Whitespace(" ")] + 4: SCSS_LIST_EXPRESSION_ELEMENT@2781..2790 + 0: SCSS_EXPRESSION@2781..2790 + 0: SCSS_EXPRESSION_ITEM_LIST@2781..2790 + 0: CSS_IDENTIFIER@2781..2790 + 0: IDENT@2781..2790 "日本語" [] [] + 5: COMMA@2790..2792 "," [] [Whitespace(" ")] + 6: SCSS_LIST_EXPRESSION_ELEMENT@2792..2800 + 0: SCSS_EXPRESSION@2792..2800 + 0: SCSS_EXPRESSION_ITEM_LIST@2792..2800 + 0: CSS_IDENTIFIER@2792..2800 + 0: IDENT@2792..2800 "ключ" [] [] + 2: R_PAREN@2800..2801 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@2801..2801 + 4: SEMICOLON@2801..2802 ";" [] [] + 40: SCSS_DECLARATION@2802..2892 + 0: SCSS_IDENTIFIER@2802..2843 + 0: DOLLAR@2802..2836 "$" [Newline("\n"), Newline("\n"), Comments("// Escaped characters ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@2836..2843 + 0: IDENT@2836..2843 "escaped" [] [] + 1: COLON@2843..2845 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2845..2891 + 0: SCSS_EXPRESSION_ITEM_LIST@2845..2891 + 0: SCSS_PARENTHESIZED_EXPRESSION@2845..2891 + 0: L_PAREN@2845..2846 "(" [] [] + 1: SCSS_LIST_EXPRESSION@2846..2890 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@2846..2890 + 0: SCSS_LIST_EXPRESSION_ELEMENT@2846..2854 + 0: SCSS_EXPRESSION@2846..2854 + 0: SCSS_EXPRESSION_ITEM_LIST@2846..2854 + 0: CSS_IDENTIFIER@2846..2854 + 0: IDENT@2846..2854 "\\escaped" [] [] + 1: COMMA@2854..2856 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@2856..2872 + 0: SCSS_EXPRESSION@2856..2872 + 0: SCSS_EXPRESSION_ITEM_LIST@2856..2872 + 0: CSS_STRING@2856..2872 + 0: CSS_STRING_LITERAL@2856..2872 "\"escaped\\\"quote\"" [] [] + 3: COMMA@2872..2874 "," [] [Whitespace(" ")] + 4: SCSS_LIST_EXPRESSION_ELEMENT@2874..2890 + 0: SCSS_EXPRESSION@2874..2890 + 0: SCSS_EXPRESSION_ITEM_LIST@2874..2890 + 0: CSS_STRING@2874..2890 + 0: CSS_STRING_LITERAL@2874..2890 "'escaped\\'quote'" [] [] + 2: R_PAREN@2890..2891 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@2891..2891 + 4: SEMICOLON@2891..2892 ";" [] [] + 2: EOF@2892..2897 "" [Newline("\n"), Newline("\n"), Newline("\n"), Newline("\n"), Newline("\n")] [] + +``` diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/list-empty-elements.scss b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/list-empty-elements.scss new file mode 100644 index 000000000000..5b0b056c169b --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/list-empty-elements.scss @@ -0,0 +1 @@ +$list: a,,b; diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/list-empty-elements.scss.snap b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/list-empty-elements.scss.snap new file mode 100644 index 000000000000..4730cc2d6b66 --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/list-empty-elements.scss.snap @@ -0,0 +1,105 @@ +--- +source: crates/biome_css_parser/tests/spec_test.rs +assertion_line: 208 +expression: snapshot +--- + +## Input + +```css +$list: a,,b; + +``` + + +## AST + +``` +CssRoot { + bom_token: missing (optional), + items: CssRootItemList [ + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@0..1 "$" [] [], + name: CssIdentifier { + value_token: IDENT@1..5 "list" [] [], + }, + }, + colon_token: COLON@5..7 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@7..8 "a" [] [], + }, + ], + }, + }, + COMMA@8..9 "," [] [], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [], + }, + }, + COMMA@9..10 "," [] [], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@10..11 "b" [] [], + }, + ], + }, + }, + ], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@11..12 ";" [] [], + }, + ], + eof_token: EOF@12..13 "" [Newline("\n")] [], +} +``` + +## CST + +``` +0: CSS_ROOT@0..13 + 0: (empty) + 1: CSS_ROOT_ITEM_LIST@0..12 + 0: SCSS_DECLARATION@0..12 + 0: SCSS_IDENTIFIER@0..5 + 0: DOLLAR@0..1 "$" [] [] + 1: CSS_IDENTIFIER@1..5 + 0: IDENT@1..5 "list" [] [] + 1: COLON@5..7 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@7..11 + 0: SCSS_EXPRESSION_ITEM_LIST@7..11 + 0: SCSS_LIST_EXPRESSION@7..11 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@7..11 + 0: SCSS_LIST_EXPRESSION_ELEMENT@7..8 + 0: SCSS_EXPRESSION@7..8 + 0: SCSS_EXPRESSION_ITEM_LIST@7..8 + 0: CSS_IDENTIFIER@7..8 + 0: IDENT@7..8 "a" [] [] + 1: COMMA@8..9 "," [] [] + 2: SCSS_LIST_EXPRESSION_ELEMENT@9..9 + 0: SCSS_EXPRESSION@9..9 + 0: SCSS_EXPRESSION_ITEM_LIST@9..9 + 3: COMMA@9..10 "," [] [] + 4: SCSS_LIST_EXPRESSION_ELEMENT@10..11 + 0: SCSS_EXPRESSION@10..11 + 0: SCSS_EXPRESSION_ITEM_LIST@10..11 + 0: CSS_IDENTIFIER@10..11 + 0: IDENT@10..11 "b" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@11..11 + 4: SEMICOLON@11..12 ";" [] [] + 2: EOF@12..13 "" [Newline("\n")] [] + +``` diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/list-important-item.scss b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/list-important-item.scss new file mode 100644 index 000000000000..208d5b6ed6ce --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/list-important-item.scss @@ -0,0 +1 @@ +$with-important: (red !important, blue); diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/list-important-item.scss.snap b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/list-important-item.scss.snap new file mode 100644 index 000000000000..2f2780a6cce9 --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/list-important-item.scss.snap @@ -0,0 +1,109 @@ +--- +source: crates/biome_css_parser/tests/spec_test.rs +assertion_line: 208 +expression: snapshot +--- + +## Input + +```css +$with-important: (red !important, blue); + +``` + + +## AST + +``` +CssRoot { + bom_token: missing (optional), + items: CssRootItemList [ + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@0..1 "$" [] [], + name: CssIdentifier { + value_token: IDENT@1..15 "with-important" [] [], + }, + }, + colon_token: COLON@15..17 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@17..18 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@18..22 "red" [] [Whitespace(" ")], + }, + CssDeclarationImportant { + excl_token: BANG@22..23 "!" [] [], + important_token: IMPORTANT_KW@23..32 "important" [] [], + }, + ], + }, + }, + COMMA@32..34 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@34..38 "blue" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@38..39 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@39..40 ";" [] [], + }, + ], + eof_token: EOF@40..41 "" [Newline("\n")] [], +} +``` + +## CST + +``` +0: CSS_ROOT@0..41 + 0: (empty) + 1: CSS_ROOT_ITEM_LIST@0..40 + 0: SCSS_DECLARATION@0..40 + 0: SCSS_IDENTIFIER@0..15 + 0: DOLLAR@0..1 "$" [] [] + 1: CSS_IDENTIFIER@1..15 + 0: IDENT@1..15 "with-important" [] [] + 1: COLON@15..17 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@17..39 + 0: SCSS_EXPRESSION_ITEM_LIST@17..39 + 0: SCSS_PARENTHESIZED_EXPRESSION@17..39 + 0: L_PAREN@17..18 "(" [] [] + 1: SCSS_LIST_EXPRESSION@18..38 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@18..38 + 0: SCSS_LIST_EXPRESSION_ELEMENT@18..32 + 0: SCSS_EXPRESSION@18..32 + 0: SCSS_EXPRESSION_ITEM_LIST@18..32 + 0: CSS_IDENTIFIER@18..22 + 0: IDENT@18..22 "red" [] [Whitespace(" ")] + 1: CSS_DECLARATION_IMPORTANT@22..32 + 0: BANG@22..23 "!" [] [] + 1: IMPORTANT_KW@23..32 "important" [] [] + 1: COMMA@32..34 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@34..38 + 0: SCSS_EXPRESSION@34..38 + 0: SCSS_EXPRESSION_ITEM_LIST@34..38 + 0: CSS_IDENTIFIER@34..38 + 0: IDENT@34..38 "blue" [] [] + 2: R_PAREN@38..39 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@39..39 + 4: SEMICOLON@39..40 ";" [] [] + 2: EOF@40..41 "" [Newline("\n")] [] + +``` diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/list-space.scss b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/list-space.scss new file mode 100644 index 000000000000..9f6e423f93f7 --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/list-space.scss @@ -0,0 +1,13 @@ +$space-list: 1 2 3; +$space-list-strings: "a" "b" "c"; +$nested-space-list: (1 2) (3 4); +$mixed-list: 1 2, 3 4; + +.selector { + padding: 1px 2px 3px 4px; + box-shadow: 0 0 2px #000; +} + + + + diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/list-space.scss.snap b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/list-space.scss.snap new file mode 100644 index 000000000000..7afeb9228c59 --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/list-space.scss.snap @@ -0,0 +1,408 @@ +--- +source: crates/biome_css_parser/tests/spec_test.rs +assertion_line: 208 +expression: snapshot +--- + +## Input + +```css +$space-list: 1 2 3; +$space-list-strings: "a" "b" "c"; +$nested-space-list: (1 2) (3 4); +$mixed-list: 1 2, 3 4; + +.selector { + padding: 1px 2px 3px 4px; + box-shadow: 0 0 2px #000; +} + + + + + +``` + + +## AST + +``` +CssRoot { + bom_token: missing (optional), + items: CssRootItemList [ + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@0..1 "$" [] [], + name: CssIdentifier { + value_token: IDENT@1..11 "space-list" [] [], + }, + }, + colon_token: COLON@11..13 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@13..15 "1" [] [Whitespace(" ")], + }, + CssNumber { + value_token: CSS_NUMBER_LITERAL@15..17 "2" [] [Whitespace(" ")], + }, + CssNumber { + value_token: CSS_NUMBER_LITERAL@17..18 "3" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@18..19 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@19..21 "$" [Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@21..39 "space-list-strings" [] [], + }, + }, + colon_token: COLON@39..41 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@41..45 "\"a\"" [] [Whitespace(" ")], + }, + CssString { + value_token: CSS_STRING_LITERAL@45..49 "\"b\"" [] [Whitespace(" ")], + }, + CssString { + value_token: CSS_STRING_LITERAL@49..52 "\"c\"" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@52..53 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@53..55 "$" [Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@55..72 "nested-space-list" [] [], + }, + }, + colon_token: COLON@72..74 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@74..75 "(" [] [], + expression: ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@75..77 "1" [] [Whitespace(" ")], + }, + CssNumber { + value_token: CSS_NUMBER_LITERAL@77..78 "2" [] [], + }, + ], + }, + r_paren_token: R_PAREN@78..80 ")" [] [Whitespace(" ")], + }, + ScssParenthesizedExpression { + l_paren_token: L_PAREN@80..81 "(" [] [], + expression: ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@81..83 "3" [] [Whitespace(" ")], + }, + CssNumber { + value_token: CSS_NUMBER_LITERAL@83..84 "4" [] [], + }, + ], + }, + r_paren_token: R_PAREN@84..85 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@85..86 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@86..88 "$" [Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@88..98 "mixed-list" [] [], + }, + }, + colon_token: COLON@98..100 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@100..102 "1" [] [Whitespace(" ")], + }, + CssNumber { + value_token: CSS_NUMBER_LITERAL@102..103 "2" [] [], + }, + ], + }, + }, + COMMA@103..105 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@105..107 "3" [] [Whitespace(" ")], + }, + CssNumber { + value_token: CSS_NUMBER_LITERAL@107..108 "4" [] [], + }, + ], + }, + }, + ], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@108..109 ";" [] [], + }, + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@109..112 "." [Newline("\n"), Newline("\n")] [], + name: CssCustomIdentifier { + value_token: IDENT@112..121 "selector" [] [Whitespace(" ")], + }, + }, + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@121..122 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@122..132 "padding" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@132..134 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@134..135 "1" [] [], + unit_token: IDENT@135..138 "px" [] [Whitespace(" ")], + }, + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@138..139 "2" [] [], + unit_token: IDENT@139..142 "px" [] [Whitespace(" ")], + }, + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@142..143 "3" [] [], + unit_token: IDENT@143..146 "px" [] [Whitespace(" ")], + }, + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@146..147 "4" [] [], + unit_token: IDENT@147..149 "px" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@149..150 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@150..163 "box-shadow" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@163..165 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@165..167 "0" [] [Whitespace(" ")], + }, + CssNumber { + value_token: CSS_NUMBER_LITERAL@167..169 "0" [] [Whitespace(" ")], + }, + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@169..170 "2" [] [], + unit_token: IDENT@170..173 "px" [] [Whitespace(" ")], + }, + CssColor { + hash_token: HASH@173..174 "#" [] [], + value_token: CSS_COLOR_LITERAL@174..177 "000" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@177..178 ";" [] [], + }, + ], + r_curly_token: R_CURLY@178..180 "}" [Newline("\n")] [], + }, + }, + ], + eof_token: EOF@180..185 "" [Newline("\n"), Newline("\n"), Newline("\n"), Newline("\n"), Newline("\n")] [], +} +``` + +## CST + +``` +0: CSS_ROOT@0..185 + 0: (empty) + 1: CSS_ROOT_ITEM_LIST@0..180 + 0: SCSS_DECLARATION@0..19 + 0: SCSS_IDENTIFIER@0..11 + 0: DOLLAR@0..1 "$" [] [] + 1: CSS_IDENTIFIER@1..11 + 0: IDENT@1..11 "space-list" [] [] + 1: COLON@11..13 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@13..18 + 0: SCSS_EXPRESSION_ITEM_LIST@13..18 + 0: CSS_NUMBER@13..15 + 0: CSS_NUMBER_LITERAL@13..15 "1" [] [Whitespace(" ")] + 1: CSS_NUMBER@15..17 + 0: CSS_NUMBER_LITERAL@15..17 "2" [] [Whitespace(" ")] + 2: CSS_NUMBER@17..18 + 0: CSS_NUMBER_LITERAL@17..18 "3" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@18..18 + 4: SEMICOLON@18..19 ";" [] [] + 1: SCSS_DECLARATION@19..53 + 0: SCSS_IDENTIFIER@19..39 + 0: DOLLAR@19..21 "$" [Newline("\n")] [] + 1: CSS_IDENTIFIER@21..39 + 0: IDENT@21..39 "space-list-strings" [] [] + 1: COLON@39..41 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@41..52 + 0: SCSS_EXPRESSION_ITEM_LIST@41..52 + 0: CSS_STRING@41..45 + 0: CSS_STRING_LITERAL@41..45 "\"a\"" [] [Whitespace(" ")] + 1: CSS_STRING@45..49 + 0: CSS_STRING_LITERAL@45..49 "\"b\"" [] [Whitespace(" ")] + 2: CSS_STRING@49..52 + 0: CSS_STRING_LITERAL@49..52 "\"c\"" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@52..52 + 4: SEMICOLON@52..53 ";" [] [] + 2: SCSS_DECLARATION@53..86 + 0: SCSS_IDENTIFIER@53..72 + 0: DOLLAR@53..55 "$" [Newline("\n")] [] + 1: CSS_IDENTIFIER@55..72 + 0: IDENT@55..72 "nested-space-list" [] [] + 1: COLON@72..74 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@74..85 + 0: SCSS_EXPRESSION_ITEM_LIST@74..85 + 0: SCSS_PARENTHESIZED_EXPRESSION@74..80 + 0: L_PAREN@74..75 "(" [] [] + 1: SCSS_EXPRESSION@75..78 + 0: SCSS_EXPRESSION_ITEM_LIST@75..78 + 0: CSS_NUMBER@75..77 + 0: CSS_NUMBER_LITERAL@75..77 "1" [] [Whitespace(" ")] + 1: CSS_NUMBER@77..78 + 0: CSS_NUMBER_LITERAL@77..78 "2" [] [] + 2: R_PAREN@78..80 ")" [] [Whitespace(" ")] + 1: SCSS_PARENTHESIZED_EXPRESSION@80..85 + 0: L_PAREN@80..81 "(" [] [] + 1: SCSS_EXPRESSION@81..84 + 0: SCSS_EXPRESSION_ITEM_LIST@81..84 + 0: CSS_NUMBER@81..83 + 0: CSS_NUMBER_LITERAL@81..83 "3" [] [Whitespace(" ")] + 1: CSS_NUMBER@83..84 + 0: CSS_NUMBER_LITERAL@83..84 "4" [] [] + 2: R_PAREN@84..85 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@85..85 + 4: SEMICOLON@85..86 ";" [] [] + 3: SCSS_DECLARATION@86..109 + 0: SCSS_IDENTIFIER@86..98 + 0: DOLLAR@86..88 "$" [Newline("\n")] [] + 1: CSS_IDENTIFIER@88..98 + 0: IDENT@88..98 "mixed-list" [] [] + 1: COLON@98..100 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@100..108 + 0: SCSS_EXPRESSION_ITEM_LIST@100..108 + 0: SCSS_LIST_EXPRESSION@100..108 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@100..108 + 0: SCSS_LIST_EXPRESSION_ELEMENT@100..103 + 0: SCSS_EXPRESSION@100..103 + 0: SCSS_EXPRESSION_ITEM_LIST@100..103 + 0: CSS_NUMBER@100..102 + 0: CSS_NUMBER_LITERAL@100..102 "1" [] [Whitespace(" ")] + 1: CSS_NUMBER@102..103 + 0: CSS_NUMBER_LITERAL@102..103 "2" [] [] + 1: COMMA@103..105 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@105..108 + 0: SCSS_EXPRESSION@105..108 + 0: SCSS_EXPRESSION_ITEM_LIST@105..108 + 0: CSS_NUMBER@105..107 + 0: CSS_NUMBER_LITERAL@105..107 "3" [] [Whitespace(" ")] + 1: CSS_NUMBER@107..108 + 0: CSS_NUMBER_LITERAL@107..108 "4" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@108..108 + 4: SEMICOLON@108..109 ";" [] [] + 4: CSS_QUALIFIED_RULE@109..180 + 0: CSS_SELECTOR_LIST@109..121 + 0: CSS_COMPOUND_SELECTOR@109..121 + 0: CSS_NESTED_SELECTOR_LIST@109..109 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@109..121 + 0: CSS_CLASS_SELECTOR@109..121 + 0: DOT@109..112 "." [Newline("\n"), Newline("\n")] [] + 1: CSS_CUSTOM_IDENTIFIER@112..121 + 0: IDENT@112..121 "selector" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@121..180 + 0: L_CURLY@121..122 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@122..178 + 0: CSS_DECLARATION_WITH_SEMICOLON@122..150 + 0: CSS_DECLARATION@122..149 + 0: CSS_GENERIC_PROPERTY@122..149 + 0: CSS_IDENTIFIER@122..132 + 0: IDENT@122..132 "padding" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@132..134 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@134..149 + 0: SCSS_EXPRESSION_ITEM_LIST@134..149 + 0: CSS_REGULAR_DIMENSION@134..138 + 0: CSS_NUMBER_LITERAL@134..135 "1" [] [] + 1: IDENT@135..138 "px" [] [Whitespace(" ")] + 1: CSS_REGULAR_DIMENSION@138..142 + 0: CSS_NUMBER_LITERAL@138..139 "2" [] [] + 1: IDENT@139..142 "px" [] [Whitespace(" ")] + 2: CSS_REGULAR_DIMENSION@142..146 + 0: CSS_NUMBER_LITERAL@142..143 "3" [] [] + 1: IDENT@143..146 "px" [] [Whitespace(" ")] + 3: CSS_REGULAR_DIMENSION@146..149 + 0: CSS_NUMBER_LITERAL@146..147 "4" [] [] + 1: IDENT@147..149 "px" [] [] + 1: (empty) + 1: SEMICOLON@149..150 ";" [] [] + 1: CSS_DECLARATION_WITH_SEMICOLON@150..178 + 0: CSS_DECLARATION@150..177 + 0: CSS_GENERIC_PROPERTY@150..177 + 0: CSS_IDENTIFIER@150..163 + 0: IDENT@150..163 "box-shadow" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@163..165 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@165..177 + 0: SCSS_EXPRESSION_ITEM_LIST@165..177 + 0: CSS_NUMBER@165..167 + 0: CSS_NUMBER_LITERAL@165..167 "0" [] [Whitespace(" ")] + 1: CSS_NUMBER@167..169 + 0: CSS_NUMBER_LITERAL@167..169 "0" [] [Whitespace(" ")] + 2: CSS_REGULAR_DIMENSION@169..173 + 0: CSS_NUMBER_LITERAL@169..170 "2" [] [] + 1: IDENT@170..173 "px" [] [Whitespace(" ")] + 3: CSS_COLOR@173..177 + 0: HASH@173..174 "#" [] [] + 1: CSS_COLOR_LITERAL@174..177 "000" [] [] + 1: (empty) + 1: SEMICOLON@177..178 ";" [] [] + 2: R_CURLY@178..180 "}" [Newline("\n")] [] + 2: EOF@180..185 "" [Newline("\n"), Newline("\n"), Newline("\n"), Newline("\n"), Newline("\n")] [] + +``` diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/list.scss b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/list.scss new file mode 100644 index 000000000000..baa8084087a1 --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/list.scss @@ -0,0 +1,8 @@ +$mylist: (alpha, beta, gamma, ); +$my-single-item-list: (alpha,); +$box-shadow-first-two: 0 0.5em $background, 0 -0.5em $background; +$list2: (1px solid,); +// TODO(interpolation support): $no-whitespaces: $variable#{something}; + + + diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/list.scss.snap b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/list.scss.snap new file mode 100644 index 000000000000..854c0e6eb873 --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/list.scss.snap @@ -0,0 +1,342 @@ +--- +source: crates/biome_css_parser/tests/spec_test.rs +assertion_line: 208 +expression: snapshot +--- + +## Input + +```css +$mylist: (alpha, beta, gamma, ); +$my-single-item-list: (alpha,); +$box-shadow-first-two: 0 0.5em $background, 0 -0.5em $background; +$list2: (1px solid,); +// TODO(interpolation support): $no-whitespaces: $variable#{something}; + + + + +``` + + +## AST + +``` +CssRoot { + bom_token: missing (optional), + items: CssRootItemList [ + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@0..1 "$" [] [], + name: CssIdentifier { + value_token: IDENT@1..7 "mylist" [] [], + }, + }, + colon_token: COLON@7..9 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@9..10 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@10..15 "alpha" [] [], + }, + ], + }, + }, + COMMA@15..17 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@17..21 "beta" [] [], + }, + ], + }, + }, + COMMA@21..23 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@23..28 "gamma" [] [], + }, + ], + }, + }, + COMMA@28..30 "," [] [Whitespace(" ")], + ], + }, + r_paren_token: R_PAREN@30..31 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@31..32 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@32..34 "$" [Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@34..53 "my-single-item-list" [] [], + }, + }, + colon_token: COLON@53..55 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@55..56 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@56..61 "alpha" [] [], + }, + ], + }, + }, + COMMA@61..62 "," [] [], + ], + }, + r_paren_token: R_PAREN@62..63 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@63..64 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@64..66 "$" [Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@66..86 "box-shadow-first-two" [] [], + }, + }, + colon_token: COLON@86..88 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@88..90 "0" [] [Whitespace(" ")], + }, + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@90..93 "0.5" [] [], + unit_token: IDENT@93..96 "em" [] [Whitespace(" ")], + }, + ScssIdentifier { + dollar_token: DOLLAR@96..97 "$" [] [], + name: CssIdentifier { + value_token: IDENT@97..107 "background" [] [], + }, + }, + ], + }, + }, + COMMA@107..109 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + ScssBinaryExpression { + left: CssNumber { + value_token: CSS_NUMBER_LITERAL@109..111 "0" [] [Whitespace(" ")], + }, + operator: MINUS@111..112 "-" [] [], + right: CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@112..115 "0.5" [] [], + unit_token: IDENT@115..118 "em" [] [Whitespace(" ")], + }, + }, + ScssIdentifier { + dollar_token: DOLLAR@118..119 "$" [] [], + name: CssIdentifier { + value_token: IDENT@119..129 "background" [] [], + }, + }, + ], + }, + }, + ], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@129..130 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@130..132 "$" [Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@132..137 "list2" [] [], + }, + }, + colon_token: COLON@137..139 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@139..140 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@140..141 "1" [] [], + unit_token: IDENT@141..144 "px" [] [Whitespace(" ")], + }, + CssIdentifier { + value_token: IDENT@144..149 "solid" [] [], + }, + ], + }, + }, + COMMA@149..150 "," [] [], + ], + }, + r_paren_token: R_PAREN@150..151 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@151..152 ";" [] [], + }, + ], + eof_token: EOF@152..228 "" [Newline("\n"), Comments("// TODO(interpolation ..."), Newline("\n"), Newline("\n"), Newline("\n"), Newline("\n")] [], +} +``` + +## CST + +``` +0: CSS_ROOT@0..228 + 0: (empty) + 1: CSS_ROOT_ITEM_LIST@0..152 + 0: SCSS_DECLARATION@0..32 + 0: SCSS_IDENTIFIER@0..7 + 0: DOLLAR@0..1 "$" [] [] + 1: CSS_IDENTIFIER@1..7 + 0: IDENT@1..7 "mylist" [] [] + 1: COLON@7..9 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@9..31 + 0: SCSS_EXPRESSION_ITEM_LIST@9..31 + 0: SCSS_PARENTHESIZED_EXPRESSION@9..31 + 0: L_PAREN@9..10 "(" [] [] + 1: SCSS_LIST_EXPRESSION@10..30 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@10..30 + 0: SCSS_LIST_EXPRESSION_ELEMENT@10..15 + 0: SCSS_EXPRESSION@10..15 + 0: SCSS_EXPRESSION_ITEM_LIST@10..15 + 0: CSS_IDENTIFIER@10..15 + 0: IDENT@10..15 "alpha" [] [] + 1: COMMA@15..17 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@17..21 + 0: SCSS_EXPRESSION@17..21 + 0: SCSS_EXPRESSION_ITEM_LIST@17..21 + 0: CSS_IDENTIFIER@17..21 + 0: IDENT@17..21 "beta" [] [] + 3: COMMA@21..23 "," [] [Whitespace(" ")] + 4: SCSS_LIST_EXPRESSION_ELEMENT@23..28 + 0: SCSS_EXPRESSION@23..28 + 0: SCSS_EXPRESSION_ITEM_LIST@23..28 + 0: CSS_IDENTIFIER@23..28 + 0: IDENT@23..28 "gamma" [] [] + 5: COMMA@28..30 "," [] [Whitespace(" ")] + 2: R_PAREN@30..31 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@31..31 + 4: SEMICOLON@31..32 ";" [] [] + 1: SCSS_DECLARATION@32..64 + 0: SCSS_IDENTIFIER@32..53 + 0: DOLLAR@32..34 "$" [Newline("\n")] [] + 1: CSS_IDENTIFIER@34..53 + 0: IDENT@34..53 "my-single-item-list" [] [] + 1: COLON@53..55 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@55..63 + 0: SCSS_EXPRESSION_ITEM_LIST@55..63 + 0: SCSS_PARENTHESIZED_EXPRESSION@55..63 + 0: L_PAREN@55..56 "(" [] [] + 1: SCSS_LIST_EXPRESSION@56..62 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@56..62 + 0: SCSS_LIST_EXPRESSION_ELEMENT@56..61 + 0: SCSS_EXPRESSION@56..61 + 0: SCSS_EXPRESSION_ITEM_LIST@56..61 + 0: CSS_IDENTIFIER@56..61 + 0: IDENT@56..61 "alpha" [] [] + 1: COMMA@61..62 "," [] [] + 2: R_PAREN@62..63 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@63..63 + 4: SEMICOLON@63..64 ";" [] [] + 2: SCSS_DECLARATION@64..130 + 0: SCSS_IDENTIFIER@64..86 + 0: DOLLAR@64..66 "$" [Newline("\n")] [] + 1: CSS_IDENTIFIER@66..86 + 0: IDENT@66..86 "box-shadow-first-two" [] [] + 1: COLON@86..88 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@88..129 + 0: SCSS_EXPRESSION_ITEM_LIST@88..129 + 0: SCSS_LIST_EXPRESSION@88..129 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@88..129 + 0: SCSS_LIST_EXPRESSION_ELEMENT@88..107 + 0: SCSS_EXPRESSION@88..107 + 0: SCSS_EXPRESSION_ITEM_LIST@88..107 + 0: CSS_NUMBER@88..90 + 0: CSS_NUMBER_LITERAL@88..90 "0" [] [Whitespace(" ")] + 1: CSS_REGULAR_DIMENSION@90..96 + 0: CSS_NUMBER_LITERAL@90..93 "0.5" [] [] + 1: IDENT@93..96 "em" [] [Whitespace(" ")] + 2: SCSS_IDENTIFIER@96..107 + 0: DOLLAR@96..97 "$" [] [] + 1: CSS_IDENTIFIER@97..107 + 0: IDENT@97..107 "background" [] [] + 1: COMMA@107..109 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@109..129 + 0: SCSS_EXPRESSION@109..129 + 0: SCSS_EXPRESSION_ITEM_LIST@109..129 + 0: SCSS_BINARY_EXPRESSION@109..118 + 0: CSS_NUMBER@109..111 + 0: CSS_NUMBER_LITERAL@109..111 "0" [] [Whitespace(" ")] + 1: MINUS@111..112 "-" [] [] + 2: CSS_REGULAR_DIMENSION@112..118 + 0: CSS_NUMBER_LITERAL@112..115 "0.5" [] [] + 1: IDENT@115..118 "em" [] [Whitespace(" ")] + 1: SCSS_IDENTIFIER@118..129 + 0: DOLLAR@118..119 "$" [] [] + 1: CSS_IDENTIFIER@119..129 + 0: IDENT@119..129 "background" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@129..129 + 4: SEMICOLON@129..130 ";" [] [] + 3: SCSS_DECLARATION@130..152 + 0: SCSS_IDENTIFIER@130..137 + 0: DOLLAR@130..132 "$" [Newline("\n")] [] + 1: CSS_IDENTIFIER@132..137 + 0: IDENT@132..137 "list2" [] [] + 1: COLON@137..139 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@139..151 + 0: SCSS_EXPRESSION_ITEM_LIST@139..151 + 0: SCSS_PARENTHESIZED_EXPRESSION@139..151 + 0: L_PAREN@139..140 "(" [] [] + 1: SCSS_LIST_EXPRESSION@140..150 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@140..150 + 0: SCSS_LIST_EXPRESSION_ELEMENT@140..149 + 0: SCSS_EXPRESSION@140..149 + 0: SCSS_EXPRESSION_ITEM_LIST@140..149 + 0: CSS_REGULAR_DIMENSION@140..144 + 0: CSS_NUMBER_LITERAL@140..141 "1" [] [] + 1: IDENT@141..144 "px" [] [Whitespace(" ")] + 1: CSS_IDENTIFIER@144..149 + 0: IDENT@144..149 "solid" [] [] + 1: COMMA@149..150 "," [] [] + 2: R_PAREN@150..151 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@151..151 + 4: SEMICOLON@151..152 ";" [] [] + 2: EOF@152..228 "" [Newline("\n"), Comments("// TODO(interpolation ..."), Newline("\n"), Newline("\n"), Newline("\n"), Newline("\n")] [] + +``` diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/map-advanced.scss b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/map-advanced.scss new file mode 100644 index 000000000000..15356716375b --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/map-advanced.scss @@ -0,0 +1,160 @@ +// Advanced map syntax tests + +// Empty map +$empty-map: (); + +// Single entry map +$single: (key: value); + +// Map with trailing comma +$trailing: ( + key1: value1, + key2: value2, +); + +// Map with complex keys +$complex-keys: ( + "string-key": value1, + 123: value2, + (nested, list): value3, + $variable-key: value4, +); + +// Map with complex values +$complex-values: ( + key1: (nested: map), + key2: (a, b, c), + key3: 1px + 2px, + key4: $variable-value, + key5: "string value", +); + +// Deeply nested maps +$deep: ( + level1: ( + level2: ( + level3: ( + level4: final-value + ) + ) + ) +); + +// Map with interpolation in keys +$interpolated-key: ( + // TODO(interpolation support): #{$var}-key: value, + // TODO(interpolation support): prefix-#{$suffix}: value2, + // TODO(interpolation support): #{$a}-#{$b}: value3, +); + +// Map with interpolation in values +$interpolated-value: ( + // TODO(interpolation support): key1: #{$var}, + // TODO(interpolation support): key2: prefix-#{$suffix}, + // TODO(interpolation support): key3: #{$a + $b}, +); + +// Map with calculations +$calculations: ( + width: 100px / 2, + height: 50px * 2, + padding: 10px + 5px, + margin: 20px - 5px, +); + +// Map with functions +$functions: ( + color: rgb(255, 0, 0), + size: calc(100% - 20px), + transform: translate(10px, 20px), +); + +// Map with special characters +$special: ( + "key-with-dash": value, + "key.with.dot": value, + "key_with_underscore": value, + "key with space": value, +); + +// Map with boolean and null +$types: ( + bool-true: true, + bool-false: false, + null-value: null, + number: 42, + string: "text", +); + +// Map as function parameter +.test { + content: map-get((foo: bar, baz: qux), foo); + value: some-function((key: value)); +} + +// Map in variable declaration +$config: ( + theme: ( + primary: #036, + secondary: #069, + accent: #f00, + ), + spacing: ( + small: 4px, + medium: 8px, + large: 16px, + xlarge: 32px, + ), + breakpoints: ( + mobile: 320px, + tablet: 768px, + desktop: 1024px, + ), +); + +// Map with quoted keys +$quoted: ( + 'single-quotes': value1, + "double-quotes": value2, + 'mixed-"quotes"': value3, +); + +// Map with escape sequences +$escaped: ( + key\-escaped: value, + "key\nwith\nnewlines": value, +); + +// Map in list +$map-in-list: ((key1: val1), (key2: val2), (key3: val3)); + +// List in map +$list-in-map: ( + list1: (a, b, c), + list2: (1, 2, 3), +); + +// Map with expressions as keys +$expr-keys: ( + (1 + 1): value, + ($var + "-suffix"): value, +); + +// Map spanning multiple lines with different formatting +$multiline: ( + key1: + value1, + key2: value2, + key3: + (nested-key: nested-value), +); + +// Unicode in map +$unicode: ( + émoji: 🎨, + 日本語: 値, + ключ: значение, +); + + + diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/map-advanced.scss.snap b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/map-advanced.scss.snap new file mode 100644 index 000000000000..647c38f4d5d4 --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/map-advanced.scss.snap @@ -0,0 +1,3572 @@ +--- +source: crates/biome_css_parser/tests/spec_test.rs +assertion_line: 208 +expression: snapshot +--- + +## Input + +```css +// Advanced map syntax tests + +// Empty map +$empty-map: (); + +// Single entry map +$single: (key: value); + +// Map with trailing comma +$trailing: ( + key1: value1, + key2: value2, +); + +// Map with complex keys +$complex-keys: ( + "string-key": value1, + 123: value2, + (nested, list): value3, + $variable-key: value4, +); + +// Map with complex values +$complex-values: ( + key1: (nested: map), + key2: (a, b, c), + key3: 1px + 2px, + key4: $variable-value, + key5: "string value", +); + +// Deeply nested maps +$deep: ( + level1: ( + level2: ( + level3: ( + level4: final-value + ) + ) + ) +); + +// Map with interpolation in keys +$interpolated-key: ( + // TODO(interpolation support): #{$var}-key: value, + // TODO(interpolation support): prefix-#{$suffix}: value2, + // TODO(interpolation support): #{$a}-#{$b}: value3, +); + +// Map with interpolation in values +$interpolated-value: ( + // TODO(interpolation support): key1: #{$var}, + // TODO(interpolation support): key2: prefix-#{$suffix}, + // TODO(interpolation support): key3: #{$a + $b}, +); + +// Map with calculations +$calculations: ( + width: 100px / 2, + height: 50px * 2, + padding: 10px + 5px, + margin: 20px - 5px, +); + +// Map with functions +$functions: ( + color: rgb(255, 0, 0), + size: calc(100% - 20px), + transform: translate(10px, 20px), +); + +// Map with special characters +$special: ( + "key-with-dash": value, + "key.with.dot": value, + "key_with_underscore": value, + "key with space": value, +); + +// Map with boolean and null +$types: ( + bool-true: true, + bool-false: false, + null-value: null, + number: 42, + string: "text", +); + +// Map as function parameter +.test { + content: map-get((foo: bar, baz: qux), foo); + value: some-function((key: value)); +} + +// Map in variable declaration +$config: ( + theme: ( + primary: #036, + secondary: #069, + accent: #f00, + ), + spacing: ( + small: 4px, + medium: 8px, + large: 16px, + xlarge: 32px, + ), + breakpoints: ( + mobile: 320px, + tablet: 768px, + desktop: 1024px, + ), +); + +// Map with quoted keys +$quoted: ( + 'single-quotes': value1, + "double-quotes": value2, + 'mixed-"quotes"': value3, +); + +// Map with escape sequences +$escaped: ( + key\-escaped: value, + "key\nwith\nnewlines": value, +); + +// Map in list +$map-in-list: ((key1: val1), (key2: val2), (key3: val3)); + +// List in map +$list-in-map: ( + list1: (a, b, c), + list2: (1, 2, 3), +); + +// Map with expressions as keys +$expr-keys: ( + (1 + 1): value, + ($var + "-suffix"): value, +); + +// Map spanning multiple lines with different formatting +$multiline: ( + key1: + value1, + key2: value2, + key3: + (nested-key: nested-value), +); + +// Unicode in map +$unicode: ( + émoji: 🎨, + 日本語: 値, + ключ: значение, +); + + + + +``` + + +## AST + +``` +CssRoot { + bom_token: missing (optional), + items: CssRootItemList [ + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@0..44 "$" [Comments("// Advanced map synta ..."), Newline("\n"), Newline("\n"), Comments("// Empty map"), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@44..53 "empty-map" [] [], + }, + }, + colon_token: COLON@53..55 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@55..56 "(" [] [], + pairs: ScssMapExpressionPairList [], + r_paren_token: R_PAREN@56..57 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@57..58 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@58..81 "$" [Newline("\n"), Newline("\n"), Comments("// Single entry map"), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@81..87 "single" [] [], + }, + }, + colon_token: COLON@87..89 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@89..90 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@90..93 "key" [] [], + }, + ], + }, + colon_token: COLON@93..95 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@95..100 "value" [] [], + }, + ], + }, + }, + ], + r_paren_token: R_PAREN@100..101 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@101..102 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@102..132 "$" [Newline("\n"), Newline("\n"), Comments("// Map with trailing ..."), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@132..140 "trailing" [] [], + }, + }, + colon_token: COLON@140..142 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@142..143 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@143..150 "key1" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@150..152 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@152..158 "value1" [] [], + }, + ], + }, + }, + COMMA@158..159 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@159..166 "key2" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@166..168 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@168..174 "value2" [] [], + }, + ], + }, + }, + COMMA@174..175 "," [] [], + ], + r_paren_token: R_PAREN@175..177 ")" [Newline("\n")] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@177..178 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@178..206 "$" [Newline("\n"), Newline("\n"), Comments("// Map with complex keys"), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@206..218 "complex-keys" [] [], + }, + }, + colon_token: COLON@218..220 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@220..221 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@221..236 "\"string-key\"" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@236..238 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@238..244 "value1" [] [], + }, + ], + }, + }, + COMMA@244..245 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@245..251 "123" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@251..253 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@253..259 "value2" [] [], + }, + ], + }, + }, + COMMA@259..260 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@260..264 "(" [Newline("\n"), Whitespace(" ")] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@264..270 "nested" [] [], + }, + ], + }, + }, + COMMA@270..272 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@272..276 "list" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@276..277 ")" [] [], + }, + ], + }, + colon_token: COLON@277..279 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@279..285 "value3" [] [], + }, + ], + }, + }, + COMMA@285..286 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + ScssIdentifier { + dollar_token: DOLLAR@286..290 "$" [Newline("\n"), Whitespace(" ")] [], + name: CssIdentifier { + value_token: IDENT@290..302 "variable-key" [] [], + }, + }, + ], + }, + colon_token: COLON@302..304 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@304..310 "value4" [] [], + }, + ], + }, + }, + COMMA@310..311 "," [] [], + ], + r_paren_token: R_PAREN@311..313 ")" [Newline("\n")] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@313..314 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@314..344 "$" [Newline("\n"), Newline("\n"), Comments("// Map with complex v ..."), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@344..358 "complex-values" [] [], + }, + }, + colon_token: COLON@358..360 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@360..361 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@361..368 "key1" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@368..370 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@370..371 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@371..377 "nested" [] [], + }, + ], + }, + colon_token: COLON@377..379 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@379..382 "map" [] [], + }, + ], + }, + }, + ], + r_paren_token: R_PAREN@382..383 ")" [] [], + }, + ], + }, + }, + COMMA@383..384 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@384..391 "key2" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@391..393 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@393..394 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@394..395 "a" [] [], + }, + ], + }, + }, + COMMA@395..397 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@397..398 "b" [] [], + }, + ], + }, + }, + COMMA@398..400 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@400..401 "c" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@401..402 ")" [] [], + }, + ], + }, + }, + COMMA@402..403 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@403..410 "key3" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@410..412 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssBinaryExpression { + left: CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@412..413 "1" [] [], + unit_token: IDENT@413..416 "px" [] [Whitespace(" ")], + }, + operator: PLUS@416..418 "+" [] [Whitespace(" ")], + right: CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@418..419 "2" [] [], + unit_token: IDENT@419..421 "px" [] [], + }, + }, + ], + }, + }, + COMMA@421..422 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@422..429 "key4" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@429..431 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssIdentifier { + dollar_token: DOLLAR@431..432 "$" [] [], + name: CssIdentifier { + value_token: IDENT@432..446 "variable-value" [] [], + }, + }, + ], + }, + }, + COMMA@446..447 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@447..454 "key5" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@454..456 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@456..470 "\"string value\"" [] [], + }, + ], + }, + }, + COMMA@470..471 "," [] [], + ], + r_paren_token: R_PAREN@471..473 ")" [Newline("\n")] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@473..474 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@474..499 "$" [Newline("\n"), Newline("\n"), Comments("// Deeply nested maps"), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@499..503 "deep" [] [], + }, + }, + colon_token: COLON@503..505 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@505..506 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@506..515 "level1" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@515..517 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@517..518 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@518..529 "level2" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@529..531 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@531..532 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@532..545 "level3" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@545..547 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@547..548 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@548..563 "level4" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@563..565 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@565..576 "final-value" [] [], + }, + ], + }, + }, + ], + r_paren_token: R_PAREN@576..584 ")" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + }, + ], + r_paren_token: R_PAREN@584..590 ")" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + }, + ], + r_paren_token: R_PAREN@590..594 ")" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + }, + ], + r_paren_token: R_PAREN@594..596 ")" [Newline("\n")] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@596..597 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@597..634 "$" [Newline("\n"), Newline("\n"), Comments("// Map with interpola ..."), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@634..650 "interpolated-key" [] [], + }, + }, + colon_token: COLON@650..652 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@652..653 "(" [] [], + pairs: ScssMapExpressionPairList [], + r_paren_token: R_PAREN@653..825 ")" [Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n")] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@825..826 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@826..865 "$" [Newline("\n"), Newline("\n"), Comments("// Map with interpola ..."), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@865..883 "interpolated-value" [] [], + }, + }, + colon_token: COLON@883..885 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@885..886 "(" [] [], + pairs: ScssMapExpressionPairList [], + r_paren_token: R_PAREN@886..1048 ")" [Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n")] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@1048..1049 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@1049..1077 "$" [Newline("\n"), Newline("\n"), Comments("// Map with calculations"), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@1077..1089 "calculations" [] [], + }, + }, + colon_token: COLON@1089..1091 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@1091..1092 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1092..1100 "width" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@1100..1102 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssBinaryExpression { + left: CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@1102..1105 "100" [] [], + unit_token: IDENT@1105..1108 "px" [] [Whitespace(" ")], + }, + operator: SLASH@1108..1110 "/" [] [Whitespace(" ")], + right: CssNumber { + value_token: CSS_NUMBER_LITERAL@1110..1111 "2" [] [], + }, + }, + ], + }, + }, + COMMA@1111..1112 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1112..1121 "height" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@1121..1123 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssBinaryExpression { + left: CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@1123..1125 "50" [] [], + unit_token: IDENT@1125..1128 "px" [] [Whitespace(" ")], + }, + operator: STAR@1128..1130 "*" [] [Whitespace(" ")], + right: CssNumber { + value_token: CSS_NUMBER_LITERAL@1130..1131 "2" [] [], + }, + }, + ], + }, + }, + COMMA@1131..1132 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1132..1142 "padding" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@1142..1144 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssBinaryExpression { + left: CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@1144..1146 "10" [] [], + unit_token: IDENT@1146..1149 "px" [] [Whitespace(" ")], + }, + operator: PLUS@1149..1151 "+" [] [Whitespace(" ")], + right: CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@1151..1152 "5" [] [], + unit_token: IDENT@1152..1154 "px" [] [], + }, + }, + ], + }, + }, + COMMA@1154..1155 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1155..1164 "margin" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@1164..1166 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssBinaryExpression { + left: CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@1166..1168 "20" [] [], + unit_token: IDENT@1168..1171 "px" [] [Whitespace(" ")], + }, + operator: MINUS@1171..1173 "-" [] [Whitespace(" ")], + right: CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@1173..1174 "5" [] [], + unit_token: IDENT@1174..1176 "px" [] [], + }, + }, + ], + }, + }, + COMMA@1176..1177 "," [] [], + ], + r_paren_token: R_PAREN@1177..1179 ")" [Newline("\n")] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@1179..1180 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@1180..1205 "$" [Newline("\n"), Newline("\n"), Comments("// Map with functions"), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@1205..1214 "functions" [] [], + }, + }, + colon_token: COLON@1214..1216 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@1216..1217 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1217..1225 "color" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@1225..1227 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@1227..1230 "rgb" [] [], + }, + l_paren_token: L_PAREN@1230..1231 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@1231..1234 "255" [] [], + }, + ], + }, + COMMA@1234..1236 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@1236..1237 "0" [] [], + }, + ], + }, + COMMA@1237..1239 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@1239..1240 "0" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@1240..1241 ")" [] [], + }, + ], + }, + }, + COMMA@1241..1242 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1242..1249 "size" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@1249..1251 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@1251..1255 "calc" [] [], + }, + l_paren_token: L_PAREN@1255..1256 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssBinaryExpression { + left: CssPercentage { + value_token: CSS_NUMBER_LITERAL@1256..1259 "100" [] [], + percent_token: PERCENT@1259..1261 "%" [] [Whitespace(" ")], + }, + operator: MINUS@1261..1263 "-" [] [Whitespace(" ")], + right: CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@1263..1265 "20" [] [], + unit_token: IDENT@1265..1267 "px" [] [], + }, + }, + ], + }, + ], + r_paren_token: R_PAREN@1267..1268 ")" [] [], + }, + ], + }, + }, + COMMA@1268..1269 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1269..1281 "transform" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@1281..1283 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@1283..1292 "translate" [] [], + }, + l_paren_token: L_PAREN@1292..1293 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@1293..1295 "10" [] [], + unit_token: IDENT@1295..1297 "px" [] [], + }, + ], + }, + COMMA@1297..1299 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@1299..1301 "20" [] [], + unit_token: IDENT@1301..1303 "px" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@1303..1304 ")" [] [], + }, + ], + }, + }, + COMMA@1304..1305 "," [] [], + ], + r_paren_token: R_PAREN@1305..1307 ")" [Newline("\n")] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@1307..1308 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@1308..1342 "$" [Newline("\n"), Newline("\n"), Comments("// Map with special c ..."), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@1342..1349 "special" [] [], + }, + }, + colon_token: COLON@1349..1351 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@1351..1352 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@1352..1370 "\"key-with-dash\"" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@1370..1372 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1372..1377 "value" [] [], + }, + ], + }, + }, + COMMA@1377..1378 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@1378..1395 "\"key.with.dot\"" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@1395..1397 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1397..1402 "value" [] [], + }, + ], + }, + }, + COMMA@1402..1403 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@1403..1427 "\"key_with_underscore\"" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@1427..1429 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1429..1434 "value" [] [], + }, + ], + }, + }, + COMMA@1434..1435 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@1435..1454 "\"key with space\"" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@1454..1456 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1456..1461 "value" [] [], + }, + ], + }, + }, + COMMA@1461..1462 "," [] [], + ], + r_paren_token: R_PAREN@1462..1464 ")" [Newline("\n")] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@1464..1465 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@1465..1497 "$" [Newline("\n"), Newline("\n"), Comments("// Map with boolean a ..."), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@1497..1502 "types" [] [], + }, + }, + colon_token: COLON@1502..1504 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@1504..1505 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1505..1517 "bool-true" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@1517..1519 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1519..1523 "true" [] [], + }, + ], + }, + }, + COMMA@1523..1524 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1524..1537 "bool-false" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@1537..1539 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1539..1544 "false" [] [], + }, + ], + }, + }, + COMMA@1544..1545 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1545..1558 "null-value" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@1558..1560 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1560..1564 "null" [] [], + }, + ], + }, + }, + COMMA@1564..1565 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1565..1574 "number" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@1574..1576 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@1576..1578 "42" [] [], + }, + ], + }, + }, + COMMA@1578..1579 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1579..1588 "string" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@1588..1590 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@1590..1596 "\"text\"" [] [], + }, + ], + }, + }, + COMMA@1596..1597 "," [] [], + ], + r_paren_token: R_PAREN@1597..1599 ")" [Newline("\n")] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@1599..1600 ";" [] [], + }, + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@1600..1632 "." [Newline("\n"), Newline("\n"), Comments("// Map as function pa ..."), Newline("\n")] [], + name: CssCustomIdentifier { + value_token: IDENT@1632..1637 "test" [] [Whitespace(" ")], + }, + }, + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@1637..1638 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1638..1648 "content" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@1648..1650 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@1650..1657 "map-get" [] [], + }, + l_paren_token: L_PAREN@1657..1658 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@1658..1659 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1659..1662 "foo" [] [], + }, + ], + }, + colon_token: COLON@1662..1664 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1664..1667 "bar" [] [], + }, + ], + }, + }, + COMMA@1667..1669 "," [] [Whitespace(" ")], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1669..1672 "baz" [] [], + }, + ], + }, + colon_token: COLON@1672..1674 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1674..1677 "qux" [] [], + }, + ], + }, + }, + ], + r_paren_token: R_PAREN@1677..1678 ")" [] [], + }, + ], + }, + COMMA@1678..1680 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1680..1683 "foo" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@1683..1684 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1684..1685 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1685..1693 "value" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@1693..1695 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@1695..1708 "some-function" [] [], + }, + l_paren_token: L_PAREN@1708..1709 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@1709..1710 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1710..1713 "key" [] [], + }, + ], + }, + colon_token: COLON@1713..1715 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1715..1720 "value" [] [], + }, + ], + }, + }, + ], + r_paren_token: R_PAREN@1720..1721 ")" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@1721..1722 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1722..1723 ";" [] [], + }, + ], + r_curly_token: R_CURLY@1723..1725 "}" [Newline("\n")] [], + }, + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@1725..1759 "$" [Newline("\n"), Newline("\n"), Comments("// Map in variable de ..."), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@1759..1765 "config" [] [], + }, + }, + colon_token: COLON@1765..1767 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@1767..1768 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1768..1776 "theme" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@1776..1778 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@1778..1779 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1779..1791 "primary" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@1791..1793 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssColor { + hash_token: HASH@1793..1794 "#" [] [], + value_token: CSS_COLOR_LITERAL@1794..1797 "036" [] [], + }, + ], + }, + }, + COMMA@1797..1798 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1798..1812 "secondary" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@1812..1814 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssColor { + hash_token: HASH@1814..1815 "#" [] [], + value_token: CSS_COLOR_LITERAL@1815..1818 "069" [] [], + }, + ], + }, + }, + COMMA@1818..1819 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1819..1830 "accent" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@1830..1832 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssColor { + hash_token: HASH@1832..1833 "#" [] [], + value_token: CSS_COLOR_LITERAL@1833..1836 "f00" [] [], + }, + ], + }, + }, + COMMA@1836..1837 "," [] [], + ], + r_paren_token: R_PAREN@1837..1841 ")" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + }, + COMMA@1841..1842 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1842..1852 "spacing" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@1852..1854 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@1854..1855 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1855..1865 "small" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@1865..1867 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@1867..1868 "4" [] [], + unit_token: IDENT@1868..1870 "px" [] [], + }, + ], + }, + }, + COMMA@1870..1871 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1871..1882 "medium" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@1882..1884 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@1884..1885 "8" [] [], + unit_token: IDENT@1885..1887 "px" [] [], + }, + ], + }, + }, + COMMA@1887..1888 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1888..1898 "large" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@1898..1900 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@1900..1902 "16" [] [], + unit_token: IDENT@1902..1904 "px" [] [], + }, + ], + }, + }, + COMMA@1904..1905 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1905..1916 "xlarge" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@1916..1918 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@1918..1920 "32" [] [], + unit_token: IDENT@1920..1922 "px" [] [], + }, + ], + }, + }, + COMMA@1922..1923 "," [] [], + ], + r_paren_token: R_PAREN@1923..1927 ")" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + }, + COMMA@1927..1928 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1928..1942 "breakpoints" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@1942..1944 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@1944..1945 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1945..1956 "mobile" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@1956..1958 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@1958..1961 "320" [] [], + unit_token: IDENT@1961..1963 "px" [] [], + }, + ], + }, + }, + COMMA@1963..1964 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1964..1975 "tablet" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@1975..1977 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@1977..1980 "768" [] [], + unit_token: IDENT@1980..1982 "px" [] [], + }, + ], + }, + }, + COMMA@1982..1983 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@1983..1995 "desktop" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@1995..1997 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@1997..2001 "1024" [] [], + unit_token: IDENT@2001..2003 "px" [] [], + }, + ], + }, + }, + COMMA@2003..2004 "," [] [], + ], + r_paren_token: R_PAREN@2004..2008 ")" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + }, + COMMA@2008..2009 "," [] [], + ], + r_paren_token: R_PAREN@2009..2011 ")" [Newline("\n")] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@2011..2012 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@2012..2039 "$" [Newline("\n"), Newline("\n"), Comments("// Map with quoted keys"), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@2039..2045 "quoted" [] [], + }, + }, + colon_token: COLON@2045..2047 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@2047..2048 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@2048..2066 "'single-quotes'" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@2066..2068 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2068..2074 "value1" [] [], + }, + ], + }, + }, + COMMA@2074..2075 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@2075..2093 "\"double-quotes\"" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@2093..2095 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2095..2101 "value2" [] [], + }, + ], + }, + }, + COMMA@2101..2102 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@2102..2121 "'mixed-\"quotes\"'" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@2121..2123 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2123..2129 "value3" [] [], + }, + ], + }, + }, + COMMA@2129..2130 "," [] [], + ], + r_paren_token: R_PAREN@2130..2132 ")" [Newline("\n")] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@2132..2133 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@2133..2165 "$" [Newline("\n"), Newline("\n"), Comments("// Map with escape se ..."), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@2165..2172 "escaped" [] [], + }, + }, + colon_token: COLON@2172..2174 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@2174..2175 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2175..2190 "key\\-escaped" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@2190..2192 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2192..2197 "value" [] [], + }, + ], + }, + }, + COMMA@2197..2198 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@2198..2222 "\"key\\nwith\\nnewlines\"" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@2222..2224 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2224..2229 "value" [] [], + }, + ], + }, + }, + COMMA@2229..2230 "," [] [], + ], + r_paren_token: R_PAREN@2230..2232 ")" [Newline("\n")] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@2232..2233 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@2233..2251 "$" [Newline("\n"), Newline("\n"), Comments("// Map in list"), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@2251..2262 "map-in-list" [] [], + }, + }, + colon_token: COLON@2262..2264 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@2264..2265 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@2265..2266 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2266..2270 "key1" [] [], + }, + ], + }, + colon_token: COLON@2270..2272 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2272..2276 "val1" [] [], + }, + ], + }, + }, + ], + r_paren_token: R_PAREN@2276..2277 ")" [] [], + }, + ], + }, + }, + COMMA@2277..2279 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@2279..2280 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2280..2284 "key2" [] [], + }, + ], + }, + colon_token: COLON@2284..2286 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2286..2290 "val2" [] [], + }, + ], + }, + }, + ], + r_paren_token: R_PAREN@2290..2291 ")" [] [], + }, + ], + }, + }, + COMMA@2291..2293 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@2293..2294 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2294..2298 "key3" [] [], + }, + ], + }, + colon_token: COLON@2298..2300 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2300..2304 "val3" [] [], + }, + ], + }, + }, + ], + r_paren_token: R_PAREN@2304..2305 ")" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@2305..2306 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@2306..2307 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@2307..2325 "$" [Newline("\n"), Newline("\n"), Comments("// List in map"), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@2325..2336 "list-in-map" [] [], + }, + }, + colon_token: COLON@2336..2338 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@2338..2339 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2339..2347 "list1" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@2347..2349 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@2349..2350 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2350..2351 "a" [] [], + }, + ], + }, + }, + COMMA@2351..2353 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2353..2354 "b" [] [], + }, + ], + }, + }, + COMMA@2354..2356 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2356..2357 "c" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@2357..2358 ")" [] [], + }, + ], + }, + }, + COMMA@2358..2359 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2359..2367 "list2" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@2367..2369 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@2369..2370 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@2370..2371 "1" [] [], + }, + ], + }, + }, + COMMA@2371..2373 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@2373..2374 "2" [] [], + }, + ], + }, + }, + COMMA@2374..2376 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@2376..2377 "3" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@2377..2378 ")" [] [], + }, + ], + }, + }, + COMMA@2378..2379 "," [] [], + ], + r_paren_token: R_PAREN@2379..2381 ")" [Newline("\n")] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@2381..2382 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@2382..2417 "$" [Newline("\n"), Newline("\n"), Comments("// Map with expressio ..."), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@2417..2426 "expr-keys" [] [], + }, + }, + colon_token: COLON@2426..2428 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@2428..2429 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@2429..2433 "(" [Newline("\n"), Whitespace(" ")] [], + expression: ScssExpression { + items: ScssExpressionItemList [ + ScssBinaryExpression { + left: CssNumber { + value_token: CSS_NUMBER_LITERAL@2433..2435 "1" [] [Whitespace(" ")], + }, + operator: PLUS@2435..2437 "+" [] [Whitespace(" ")], + right: CssNumber { + value_token: CSS_NUMBER_LITERAL@2437..2438 "1" [] [], + }, + }, + ], + }, + r_paren_token: R_PAREN@2438..2439 ")" [] [], + }, + ], + }, + colon_token: COLON@2439..2441 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2441..2446 "value" [] [], + }, + ], + }, + }, + COMMA@2446..2447 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@2447..2451 "(" [Newline("\n"), Whitespace(" ")] [], + expression: ScssExpression { + items: ScssExpressionItemList [ + ScssBinaryExpression { + left: ScssIdentifier { + dollar_token: DOLLAR@2451..2452 "$" [] [], + name: CssIdentifier { + value_token: IDENT@2452..2456 "var" [] [Whitespace(" ")], + }, + }, + operator: PLUS@2456..2458 "+" [] [Whitespace(" ")], + right: CssString { + value_token: CSS_STRING_LITERAL@2458..2467 "\"-suffix\"" [] [], + }, + }, + ], + }, + r_paren_token: R_PAREN@2467..2468 ")" [] [], + }, + ], + }, + colon_token: COLON@2468..2470 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2470..2475 "value" [] [], + }, + ], + }, + }, + COMMA@2475..2476 "," [] [], + ], + r_paren_token: R_PAREN@2476..2478 ")" [Newline("\n")] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@2478..2479 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@2479..2539 "$" [Newline("\n"), Newline("\n"), Comments("// Map spanning multi ..."), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@2539..2548 "multiline" [] [], + }, + }, + colon_token: COLON@2548..2550 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@2550..2551 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2551..2558 "key1" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@2558..2559 ":" [] [], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2559..2570 "value1" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + }, + COMMA@2570..2571 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2571..2578 "key2" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@2578..2580 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2580..2586 "value2" [] [], + }, + ], + }, + }, + COMMA@2586..2587 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2587..2594 "key3" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@2594..2595 ":" [] [], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@2595..2601 "(" [Newline("\n"), Whitespace(" ")] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2601..2611 "nested-key" [] [], + }, + ], + }, + colon_token: COLON@2611..2613 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2613..2625 "nested-value" [] [], + }, + ], + }, + }, + ], + r_paren_token: R_PAREN@2625..2626 ")" [] [], + }, + ], + }, + }, + COMMA@2626..2627 "," [] [], + ], + r_paren_token: R_PAREN@2627..2629 ")" [Newline("\n")] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@2629..2630 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@2630..2651 "$" [Newline("\n"), Newline("\n"), Comments("// Unicode in map"), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@2651..2658 "unicode" [] [], + }, + }, + colon_token: COLON@2658..2660 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@2660..2661 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2661..2670 "émoji" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@2670..2672 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2672..2676 "🎨" [] [], + }, + ], + }, + }, + COMMA@2676..2677 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2677..2689 "日本語" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@2689..2691 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2691..2694 "値" [] [], + }, + ], + }, + }, + COMMA@2694..2695 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2695..2706 "ключ" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@2706..2708 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@2708..2724 "значение" [] [], + }, + ], + }, + }, + COMMA@2724..2725 "," [] [], + ], + r_paren_token: R_PAREN@2725..2727 ")" [Newline("\n")] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@2727..2728 ";" [] [], + }, + ], + eof_token: EOF@2728..2732 "" [Newline("\n"), Newline("\n"), Newline("\n"), Newline("\n")] [], +} +``` + +## CST + +``` +0: CSS_ROOT@0..2732 + 0: (empty) + 1: CSS_ROOT_ITEM_LIST@0..2728 + 0: SCSS_DECLARATION@0..58 + 0: SCSS_IDENTIFIER@0..53 + 0: DOLLAR@0..44 "$" [Comments("// Advanced map synta ..."), Newline("\n"), Newline("\n"), Comments("// Empty map"), Newline("\n")] [] + 1: CSS_IDENTIFIER@44..53 + 0: IDENT@44..53 "empty-map" [] [] + 1: COLON@53..55 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@55..57 + 0: SCSS_EXPRESSION_ITEM_LIST@55..57 + 0: SCSS_MAP_EXPRESSION@55..57 + 0: L_PAREN@55..56 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@56..56 + 2: R_PAREN@56..57 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@57..57 + 4: SEMICOLON@57..58 ";" [] [] + 1: SCSS_DECLARATION@58..102 + 0: SCSS_IDENTIFIER@58..87 + 0: DOLLAR@58..81 "$" [Newline("\n"), Newline("\n"), Comments("// Single entry map"), Newline("\n")] [] + 1: CSS_IDENTIFIER@81..87 + 0: IDENT@81..87 "single" [] [] + 1: COLON@87..89 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@89..101 + 0: SCSS_EXPRESSION_ITEM_LIST@89..101 + 0: SCSS_MAP_EXPRESSION@89..101 + 0: L_PAREN@89..90 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@90..100 + 0: SCSS_MAP_EXPRESSION_PAIR@90..100 + 0: SCSS_EXPRESSION@90..93 + 0: SCSS_EXPRESSION_ITEM_LIST@90..93 + 0: CSS_IDENTIFIER@90..93 + 0: IDENT@90..93 "key" [] [] + 1: COLON@93..95 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@95..100 + 0: SCSS_EXPRESSION_ITEM_LIST@95..100 + 0: CSS_IDENTIFIER@95..100 + 0: IDENT@95..100 "value" [] [] + 2: R_PAREN@100..101 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@101..101 + 4: SEMICOLON@101..102 ";" [] [] + 2: SCSS_DECLARATION@102..178 + 0: SCSS_IDENTIFIER@102..140 + 0: DOLLAR@102..132 "$" [Newline("\n"), Newline("\n"), Comments("// Map with trailing ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@132..140 + 0: IDENT@132..140 "trailing" [] [] + 1: COLON@140..142 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@142..177 + 0: SCSS_EXPRESSION_ITEM_LIST@142..177 + 0: SCSS_MAP_EXPRESSION@142..177 + 0: L_PAREN@142..143 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@143..175 + 0: SCSS_MAP_EXPRESSION_PAIR@143..158 + 0: SCSS_EXPRESSION@143..150 + 0: SCSS_EXPRESSION_ITEM_LIST@143..150 + 0: CSS_IDENTIFIER@143..150 + 0: IDENT@143..150 "key1" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@150..152 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@152..158 + 0: SCSS_EXPRESSION_ITEM_LIST@152..158 + 0: CSS_IDENTIFIER@152..158 + 0: IDENT@152..158 "value1" [] [] + 1: COMMA@158..159 "," [] [] + 2: SCSS_MAP_EXPRESSION_PAIR@159..174 + 0: SCSS_EXPRESSION@159..166 + 0: SCSS_EXPRESSION_ITEM_LIST@159..166 + 0: CSS_IDENTIFIER@159..166 + 0: IDENT@159..166 "key2" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@166..168 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@168..174 + 0: SCSS_EXPRESSION_ITEM_LIST@168..174 + 0: CSS_IDENTIFIER@168..174 + 0: IDENT@168..174 "value2" [] [] + 3: COMMA@174..175 "," [] [] + 2: R_PAREN@175..177 ")" [Newline("\n")] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@177..177 + 4: SEMICOLON@177..178 ";" [] [] + 3: SCSS_DECLARATION@178..314 + 0: SCSS_IDENTIFIER@178..218 + 0: DOLLAR@178..206 "$" [Newline("\n"), Newline("\n"), Comments("// Map with complex keys"), Newline("\n")] [] + 1: CSS_IDENTIFIER@206..218 + 0: IDENT@206..218 "complex-keys" [] [] + 1: COLON@218..220 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@220..313 + 0: SCSS_EXPRESSION_ITEM_LIST@220..313 + 0: SCSS_MAP_EXPRESSION@220..313 + 0: L_PAREN@220..221 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@221..311 + 0: SCSS_MAP_EXPRESSION_PAIR@221..244 + 0: SCSS_EXPRESSION@221..236 + 0: SCSS_EXPRESSION_ITEM_LIST@221..236 + 0: CSS_STRING@221..236 + 0: CSS_STRING_LITERAL@221..236 "\"string-key\"" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@236..238 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@238..244 + 0: SCSS_EXPRESSION_ITEM_LIST@238..244 + 0: CSS_IDENTIFIER@238..244 + 0: IDENT@238..244 "value1" [] [] + 1: COMMA@244..245 "," [] [] + 2: SCSS_MAP_EXPRESSION_PAIR@245..259 + 0: SCSS_EXPRESSION@245..251 + 0: SCSS_EXPRESSION_ITEM_LIST@245..251 + 0: CSS_NUMBER@245..251 + 0: CSS_NUMBER_LITERAL@245..251 "123" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@251..253 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@253..259 + 0: SCSS_EXPRESSION_ITEM_LIST@253..259 + 0: CSS_IDENTIFIER@253..259 + 0: IDENT@253..259 "value2" [] [] + 3: COMMA@259..260 "," [] [] + 4: SCSS_MAP_EXPRESSION_PAIR@260..285 + 0: SCSS_EXPRESSION@260..277 + 0: SCSS_EXPRESSION_ITEM_LIST@260..277 + 0: SCSS_PARENTHESIZED_EXPRESSION@260..277 + 0: L_PAREN@260..264 "(" [Newline("\n"), Whitespace(" ")] [] + 1: SCSS_LIST_EXPRESSION@264..276 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@264..276 + 0: SCSS_LIST_EXPRESSION_ELEMENT@264..270 + 0: SCSS_EXPRESSION@264..270 + 0: SCSS_EXPRESSION_ITEM_LIST@264..270 + 0: CSS_IDENTIFIER@264..270 + 0: IDENT@264..270 "nested" [] [] + 1: COMMA@270..272 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@272..276 + 0: SCSS_EXPRESSION@272..276 + 0: SCSS_EXPRESSION_ITEM_LIST@272..276 + 0: CSS_IDENTIFIER@272..276 + 0: IDENT@272..276 "list" [] [] + 2: R_PAREN@276..277 ")" [] [] + 1: COLON@277..279 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@279..285 + 0: SCSS_EXPRESSION_ITEM_LIST@279..285 + 0: CSS_IDENTIFIER@279..285 + 0: IDENT@279..285 "value3" [] [] + 5: COMMA@285..286 "," [] [] + 6: SCSS_MAP_EXPRESSION_PAIR@286..310 + 0: SCSS_EXPRESSION@286..302 + 0: SCSS_EXPRESSION_ITEM_LIST@286..302 + 0: SCSS_IDENTIFIER@286..302 + 0: DOLLAR@286..290 "$" [Newline("\n"), Whitespace(" ")] [] + 1: CSS_IDENTIFIER@290..302 + 0: IDENT@290..302 "variable-key" [] [] + 1: COLON@302..304 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@304..310 + 0: SCSS_EXPRESSION_ITEM_LIST@304..310 + 0: CSS_IDENTIFIER@304..310 + 0: IDENT@304..310 "value4" [] [] + 7: COMMA@310..311 "," [] [] + 2: R_PAREN@311..313 ")" [Newline("\n")] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@313..313 + 4: SEMICOLON@313..314 ";" [] [] + 4: SCSS_DECLARATION@314..474 + 0: SCSS_IDENTIFIER@314..358 + 0: DOLLAR@314..344 "$" [Newline("\n"), Newline("\n"), Comments("// Map with complex v ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@344..358 + 0: IDENT@344..358 "complex-values" [] [] + 1: COLON@358..360 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@360..473 + 0: SCSS_EXPRESSION_ITEM_LIST@360..473 + 0: SCSS_MAP_EXPRESSION@360..473 + 0: L_PAREN@360..361 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@361..471 + 0: SCSS_MAP_EXPRESSION_PAIR@361..383 + 0: SCSS_EXPRESSION@361..368 + 0: SCSS_EXPRESSION_ITEM_LIST@361..368 + 0: CSS_IDENTIFIER@361..368 + 0: IDENT@361..368 "key1" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@368..370 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@370..383 + 0: SCSS_EXPRESSION_ITEM_LIST@370..383 + 0: SCSS_MAP_EXPRESSION@370..383 + 0: L_PAREN@370..371 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@371..382 + 0: SCSS_MAP_EXPRESSION_PAIR@371..382 + 0: SCSS_EXPRESSION@371..377 + 0: SCSS_EXPRESSION_ITEM_LIST@371..377 + 0: CSS_IDENTIFIER@371..377 + 0: IDENT@371..377 "nested" [] [] + 1: COLON@377..379 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@379..382 + 0: SCSS_EXPRESSION_ITEM_LIST@379..382 + 0: CSS_IDENTIFIER@379..382 + 0: IDENT@379..382 "map" [] [] + 2: R_PAREN@382..383 ")" [] [] + 1: COMMA@383..384 "," [] [] + 2: SCSS_MAP_EXPRESSION_PAIR@384..402 + 0: SCSS_EXPRESSION@384..391 + 0: SCSS_EXPRESSION_ITEM_LIST@384..391 + 0: CSS_IDENTIFIER@384..391 + 0: IDENT@384..391 "key2" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@391..393 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@393..402 + 0: SCSS_EXPRESSION_ITEM_LIST@393..402 + 0: SCSS_PARENTHESIZED_EXPRESSION@393..402 + 0: L_PAREN@393..394 "(" [] [] + 1: SCSS_LIST_EXPRESSION@394..401 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@394..401 + 0: SCSS_LIST_EXPRESSION_ELEMENT@394..395 + 0: SCSS_EXPRESSION@394..395 + 0: SCSS_EXPRESSION_ITEM_LIST@394..395 + 0: CSS_IDENTIFIER@394..395 + 0: IDENT@394..395 "a" [] [] + 1: COMMA@395..397 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@397..398 + 0: SCSS_EXPRESSION@397..398 + 0: SCSS_EXPRESSION_ITEM_LIST@397..398 + 0: CSS_IDENTIFIER@397..398 + 0: IDENT@397..398 "b" [] [] + 3: COMMA@398..400 "," [] [Whitespace(" ")] + 4: SCSS_LIST_EXPRESSION_ELEMENT@400..401 + 0: SCSS_EXPRESSION@400..401 + 0: SCSS_EXPRESSION_ITEM_LIST@400..401 + 0: CSS_IDENTIFIER@400..401 + 0: IDENT@400..401 "c" [] [] + 2: R_PAREN@401..402 ")" [] [] + 3: COMMA@402..403 "," [] [] + 4: SCSS_MAP_EXPRESSION_PAIR@403..421 + 0: SCSS_EXPRESSION@403..410 + 0: SCSS_EXPRESSION_ITEM_LIST@403..410 + 0: CSS_IDENTIFIER@403..410 + 0: IDENT@403..410 "key3" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@410..412 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@412..421 + 0: SCSS_EXPRESSION_ITEM_LIST@412..421 + 0: SCSS_BINARY_EXPRESSION@412..421 + 0: CSS_REGULAR_DIMENSION@412..416 + 0: CSS_NUMBER_LITERAL@412..413 "1" [] [] + 1: IDENT@413..416 "px" [] [Whitespace(" ")] + 1: PLUS@416..418 "+" [] [Whitespace(" ")] + 2: CSS_REGULAR_DIMENSION@418..421 + 0: CSS_NUMBER_LITERAL@418..419 "2" [] [] + 1: IDENT@419..421 "px" [] [] + 5: COMMA@421..422 "," [] [] + 6: SCSS_MAP_EXPRESSION_PAIR@422..446 + 0: SCSS_EXPRESSION@422..429 + 0: SCSS_EXPRESSION_ITEM_LIST@422..429 + 0: CSS_IDENTIFIER@422..429 + 0: IDENT@422..429 "key4" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@429..431 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@431..446 + 0: SCSS_EXPRESSION_ITEM_LIST@431..446 + 0: SCSS_IDENTIFIER@431..446 + 0: DOLLAR@431..432 "$" [] [] + 1: CSS_IDENTIFIER@432..446 + 0: IDENT@432..446 "variable-value" [] [] + 7: COMMA@446..447 "," [] [] + 8: SCSS_MAP_EXPRESSION_PAIR@447..470 + 0: SCSS_EXPRESSION@447..454 + 0: SCSS_EXPRESSION_ITEM_LIST@447..454 + 0: CSS_IDENTIFIER@447..454 + 0: IDENT@447..454 "key5" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@454..456 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@456..470 + 0: SCSS_EXPRESSION_ITEM_LIST@456..470 + 0: CSS_STRING@456..470 + 0: CSS_STRING_LITERAL@456..470 "\"string value\"" [] [] + 9: COMMA@470..471 "," [] [] + 2: R_PAREN@471..473 ")" [Newline("\n")] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@473..473 + 4: SEMICOLON@473..474 ";" [] [] + 5: SCSS_DECLARATION@474..597 + 0: SCSS_IDENTIFIER@474..503 + 0: DOLLAR@474..499 "$" [Newline("\n"), Newline("\n"), Comments("// Deeply nested maps"), Newline("\n")] [] + 1: CSS_IDENTIFIER@499..503 + 0: IDENT@499..503 "deep" [] [] + 1: COLON@503..505 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@505..596 + 0: SCSS_EXPRESSION_ITEM_LIST@505..596 + 0: SCSS_MAP_EXPRESSION@505..596 + 0: L_PAREN@505..506 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@506..594 + 0: SCSS_MAP_EXPRESSION_PAIR@506..594 + 0: SCSS_EXPRESSION@506..515 + 0: SCSS_EXPRESSION_ITEM_LIST@506..515 + 0: CSS_IDENTIFIER@506..515 + 0: IDENT@506..515 "level1" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@515..517 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@517..594 + 0: SCSS_EXPRESSION_ITEM_LIST@517..594 + 0: SCSS_MAP_EXPRESSION@517..594 + 0: L_PAREN@517..518 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@518..590 + 0: SCSS_MAP_EXPRESSION_PAIR@518..590 + 0: SCSS_EXPRESSION@518..529 + 0: SCSS_EXPRESSION_ITEM_LIST@518..529 + 0: CSS_IDENTIFIER@518..529 + 0: IDENT@518..529 "level2" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@529..531 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@531..590 + 0: SCSS_EXPRESSION_ITEM_LIST@531..590 + 0: SCSS_MAP_EXPRESSION@531..590 + 0: L_PAREN@531..532 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@532..584 + 0: SCSS_MAP_EXPRESSION_PAIR@532..584 + 0: SCSS_EXPRESSION@532..545 + 0: SCSS_EXPRESSION_ITEM_LIST@532..545 + 0: CSS_IDENTIFIER@532..545 + 0: IDENT@532..545 "level3" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@545..547 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@547..584 + 0: SCSS_EXPRESSION_ITEM_LIST@547..584 + 0: SCSS_MAP_EXPRESSION@547..584 + 0: L_PAREN@547..548 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@548..576 + 0: SCSS_MAP_EXPRESSION_PAIR@548..576 + 0: SCSS_EXPRESSION@548..563 + 0: SCSS_EXPRESSION_ITEM_LIST@548..563 + 0: CSS_IDENTIFIER@548..563 + 0: IDENT@548..563 "level4" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@563..565 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@565..576 + 0: SCSS_EXPRESSION_ITEM_LIST@565..576 + 0: CSS_IDENTIFIER@565..576 + 0: IDENT@565..576 "final-value" [] [] + 2: R_PAREN@576..584 ")" [Newline("\n"), Whitespace(" ")] [] + 2: R_PAREN@584..590 ")" [Newline("\n"), Whitespace(" ")] [] + 2: R_PAREN@590..594 ")" [Newline("\n"), Whitespace(" ")] [] + 2: R_PAREN@594..596 ")" [Newline("\n")] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@596..596 + 4: SEMICOLON@596..597 ";" [] [] + 6: SCSS_DECLARATION@597..826 + 0: SCSS_IDENTIFIER@597..650 + 0: DOLLAR@597..634 "$" [Newline("\n"), Newline("\n"), Comments("// Map with interpola ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@634..650 + 0: IDENT@634..650 "interpolated-key" [] [] + 1: COLON@650..652 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@652..825 + 0: SCSS_EXPRESSION_ITEM_LIST@652..825 + 0: SCSS_MAP_EXPRESSION@652..825 + 0: L_PAREN@652..653 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@653..653 + 2: R_PAREN@653..825 ")" [Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n")] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@825..825 + 4: SEMICOLON@825..826 ";" [] [] + 7: SCSS_DECLARATION@826..1049 + 0: SCSS_IDENTIFIER@826..883 + 0: DOLLAR@826..865 "$" [Newline("\n"), Newline("\n"), Comments("// Map with interpola ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@865..883 + 0: IDENT@865..883 "interpolated-value" [] [] + 1: COLON@883..885 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@885..1048 + 0: SCSS_EXPRESSION_ITEM_LIST@885..1048 + 0: SCSS_MAP_EXPRESSION@885..1048 + 0: L_PAREN@885..886 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@886..886 + 2: R_PAREN@886..1048 ")" [Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n")] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@1048..1048 + 4: SEMICOLON@1048..1049 ";" [] [] + 8: SCSS_DECLARATION@1049..1180 + 0: SCSS_IDENTIFIER@1049..1089 + 0: DOLLAR@1049..1077 "$" [Newline("\n"), Newline("\n"), Comments("// Map with calculations"), Newline("\n")] [] + 1: CSS_IDENTIFIER@1077..1089 + 0: IDENT@1077..1089 "calculations" [] [] + 1: COLON@1089..1091 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1091..1179 + 0: SCSS_EXPRESSION_ITEM_LIST@1091..1179 + 0: SCSS_MAP_EXPRESSION@1091..1179 + 0: L_PAREN@1091..1092 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@1092..1177 + 0: SCSS_MAP_EXPRESSION_PAIR@1092..1111 + 0: SCSS_EXPRESSION@1092..1100 + 0: SCSS_EXPRESSION_ITEM_LIST@1092..1100 + 0: CSS_IDENTIFIER@1092..1100 + 0: IDENT@1092..1100 "width" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1100..1102 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1102..1111 + 0: SCSS_EXPRESSION_ITEM_LIST@1102..1111 + 0: SCSS_BINARY_EXPRESSION@1102..1111 + 0: CSS_REGULAR_DIMENSION@1102..1108 + 0: CSS_NUMBER_LITERAL@1102..1105 "100" [] [] + 1: IDENT@1105..1108 "px" [] [Whitespace(" ")] + 1: SLASH@1108..1110 "/" [] [Whitespace(" ")] + 2: CSS_NUMBER@1110..1111 + 0: CSS_NUMBER_LITERAL@1110..1111 "2" [] [] + 1: COMMA@1111..1112 "," [] [] + 2: SCSS_MAP_EXPRESSION_PAIR@1112..1131 + 0: SCSS_EXPRESSION@1112..1121 + 0: SCSS_EXPRESSION_ITEM_LIST@1112..1121 + 0: CSS_IDENTIFIER@1112..1121 + 0: IDENT@1112..1121 "height" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1121..1123 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1123..1131 + 0: SCSS_EXPRESSION_ITEM_LIST@1123..1131 + 0: SCSS_BINARY_EXPRESSION@1123..1131 + 0: CSS_REGULAR_DIMENSION@1123..1128 + 0: CSS_NUMBER_LITERAL@1123..1125 "50" [] [] + 1: IDENT@1125..1128 "px" [] [Whitespace(" ")] + 1: STAR@1128..1130 "*" [] [Whitespace(" ")] + 2: CSS_NUMBER@1130..1131 + 0: CSS_NUMBER_LITERAL@1130..1131 "2" [] [] + 3: COMMA@1131..1132 "," [] [] + 4: SCSS_MAP_EXPRESSION_PAIR@1132..1154 + 0: SCSS_EXPRESSION@1132..1142 + 0: SCSS_EXPRESSION_ITEM_LIST@1132..1142 + 0: CSS_IDENTIFIER@1132..1142 + 0: IDENT@1132..1142 "padding" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1142..1144 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1144..1154 + 0: SCSS_EXPRESSION_ITEM_LIST@1144..1154 + 0: SCSS_BINARY_EXPRESSION@1144..1154 + 0: CSS_REGULAR_DIMENSION@1144..1149 + 0: CSS_NUMBER_LITERAL@1144..1146 "10" [] [] + 1: IDENT@1146..1149 "px" [] [Whitespace(" ")] + 1: PLUS@1149..1151 "+" [] [Whitespace(" ")] + 2: CSS_REGULAR_DIMENSION@1151..1154 + 0: CSS_NUMBER_LITERAL@1151..1152 "5" [] [] + 1: IDENT@1152..1154 "px" [] [] + 5: COMMA@1154..1155 "," [] [] + 6: SCSS_MAP_EXPRESSION_PAIR@1155..1176 + 0: SCSS_EXPRESSION@1155..1164 + 0: SCSS_EXPRESSION_ITEM_LIST@1155..1164 + 0: CSS_IDENTIFIER@1155..1164 + 0: IDENT@1155..1164 "margin" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1164..1166 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1166..1176 + 0: SCSS_EXPRESSION_ITEM_LIST@1166..1176 + 0: SCSS_BINARY_EXPRESSION@1166..1176 + 0: CSS_REGULAR_DIMENSION@1166..1171 + 0: CSS_NUMBER_LITERAL@1166..1168 "20" [] [] + 1: IDENT@1168..1171 "px" [] [Whitespace(" ")] + 1: MINUS@1171..1173 "-" [] [Whitespace(" ")] + 2: CSS_REGULAR_DIMENSION@1173..1176 + 0: CSS_NUMBER_LITERAL@1173..1174 "5" [] [] + 1: IDENT@1174..1176 "px" [] [] + 7: COMMA@1176..1177 "," [] [] + 2: R_PAREN@1177..1179 ")" [Newline("\n")] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@1179..1179 + 4: SEMICOLON@1179..1180 ";" [] [] + 9: SCSS_DECLARATION@1180..1308 + 0: SCSS_IDENTIFIER@1180..1214 + 0: DOLLAR@1180..1205 "$" [Newline("\n"), Newline("\n"), Comments("// Map with functions"), Newline("\n")] [] + 1: CSS_IDENTIFIER@1205..1214 + 0: IDENT@1205..1214 "functions" [] [] + 1: COLON@1214..1216 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1216..1307 + 0: SCSS_EXPRESSION_ITEM_LIST@1216..1307 + 0: SCSS_MAP_EXPRESSION@1216..1307 + 0: L_PAREN@1216..1217 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@1217..1305 + 0: SCSS_MAP_EXPRESSION_PAIR@1217..1241 + 0: SCSS_EXPRESSION@1217..1225 + 0: SCSS_EXPRESSION_ITEM_LIST@1217..1225 + 0: CSS_IDENTIFIER@1217..1225 + 0: IDENT@1217..1225 "color" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1225..1227 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1227..1241 + 0: SCSS_EXPRESSION_ITEM_LIST@1227..1241 + 0: CSS_FUNCTION@1227..1241 + 0: CSS_IDENTIFIER@1227..1230 + 0: IDENT@1227..1230 "rgb" [] [] + 1: L_PAREN@1230..1231 "(" [] [] + 2: CSS_PARAMETER_LIST@1231..1240 + 0: SCSS_EXPRESSION@1231..1234 + 0: SCSS_EXPRESSION_ITEM_LIST@1231..1234 + 0: CSS_NUMBER@1231..1234 + 0: CSS_NUMBER_LITERAL@1231..1234 "255" [] [] + 1: COMMA@1234..1236 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1236..1237 + 0: SCSS_EXPRESSION_ITEM_LIST@1236..1237 + 0: CSS_NUMBER@1236..1237 + 0: CSS_NUMBER_LITERAL@1236..1237 "0" [] [] + 3: COMMA@1237..1239 "," [] [Whitespace(" ")] + 4: SCSS_EXPRESSION@1239..1240 + 0: SCSS_EXPRESSION_ITEM_LIST@1239..1240 + 0: CSS_NUMBER@1239..1240 + 0: CSS_NUMBER_LITERAL@1239..1240 "0" [] [] + 3: R_PAREN@1240..1241 ")" [] [] + 1: COMMA@1241..1242 "," [] [] + 2: SCSS_MAP_EXPRESSION_PAIR@1242..1268 + 0: SCSS_EXPRESSION@1242..1249 + 0: SCSS_EXPRESSION_ITEM_LIST@1242..1249 + 0: CSS_IDENTIFIER@1242..1249 + 0: IDENT@1242..1249 "size" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1249..1251 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1251..1268 + 0: SCSS_EXPRESSION_ITEM_LIST@1251..1268 + 0: CSS_FUNCTION@1251..1268 + 0: CSS_IDENTIFIER@1251..1255 + 0: IDENT@1251..1255 "calc" [] [] + 1: L_PAREN@1255..1256 "(" [] [] + 2: CSS_PARAMETER_LIST@1256..1267 + 0: SCSS_EXPRESSION@1256..1267 + 0: SCSS_EXPRESSION_ITEM_LIST@1256..1267 + 0: SCSS_BINARY_EXPRESSION@1256..1267 + 0: CSS_PERCENTAGE@1256..1261 + 0: CSS_NUMBER_LITERAL@1256..1259 "100" [] [] + 1: PERCENT@1259..1261 "%" [] [Whitespace(" ")] + 1: MINUS@1261..1263 "-" [] [Whitespace(" ")] + 2: CSS_REGULAR_DIMENSION@1263..1267 + 0: CSS_NUMBER_LITERAL@1263..1265 "20" [] [] + 1: IDENT@1265..1267 "px" [] [] + 3: R_PAREN@1267..1268 ")" [] [] + 3: COMMA@1268..1269 "," [] [] + 4: SCSS_MAP_EXPRESSION_PAIR@1269..1304 + 0: SCSS_EXPRESSION@1269..1281 + 0: SCSS_EXPRESSION_ITEM_LIST@1269..1281 + 0: CSS_IDENTIFIER@1269..1281 + 0: IDENT@1269..1281 "transform" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1281..1283 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1283..1304 + 0: SCSS_EXPRESSION_ITEM_LIST@1283..1304 + 0: CSS_FUNCTION@1283..1304 + 0: CSS_IDENTIFIER@1283..1292 + 0: IDENT@1283..1292 "translate" [] [] + 1: L_PAREN@1292..1293 "(" [] [] + 2: CSS_PARAMETER_LIST@1293..1303 + 0: SCSS_EXPRESSION@1293..1297 + 0: SCSS_EXPRESSION_ITEM_LIST@1293..1297 + 0: CSS_REGULAR_DIMENSION@1293..1297 + 0: CSS_NUMBER_LITERAL@1293..1295 "10" [] [] + 1: IDENT@1295..1297 "px" [] [] + 1: COMMA@1297..1299 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1299..1303 + 0: SCSS_EXPRESSION_ITEM_LIST@1299..1303 + 0: CSS_REGULAR_DIMENSION@1299..1303 + 0: CSS_NUMBER_LITERAL@1299..1301 "20" [] [] + 1: IDENT@1301..1303 "px" [] [] + 3: R_PAREN@1303..1304 ")" [] [] + 5: COMMA@1304..1305 "," [] [] + 2: R_PAREN@1305..1307 ")" [Newline("\n")] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@1307..1307 + 4: SEMICOLON@1307..1308 ";" [] [] + 10: SCSS_DECLARATION@1308..1465 + 0: SCSS_IDENTIFIER@1308..1349 + 0: DOLLAR@1308..1342 "$" [Newline("\n"), Newline("\n"), Comments("// Map with special c ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@1342..1349 + 0: IDENT@1342..1349 "special" [] [] + 1: COLON@1349..1351 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1351..1464 + 0: SCSS_EXPRESSION_ITEM_LIST@1351..1464 + 0: SCSS_MAP_EXPRESSION@1351..1464 + 0: L_PAREN@1351..1352 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@1352..1462 + 0: SCSS_MAP_EXPRESSION_PAIR@1352..1377 + 0: SCSS_EXPRESSION@1352..1370 + 0: SCSS_EXPRESSION_ITEM_LIST@1352..1370 + 0: CSS_STRING@1352..1370 + 0: CSS_STRING_LITERAL@1352..1370 "\"key-with-dash\"" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1370..1372 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1372..1377 + 0: SCSS_EXPRESSION_ITEM_LIST@1372..1377 + 0: CSS_IDENTIFIER@1372..1377 + 0: IDENT@1372..1377 "value" [] [] + 1: COMMA@1377..1378 "," [] [] + 2: SCSS_MAP_EXPRESSION_PAIR@1378..1402 + 0: SCSS_EXPRESSION@1378..1395 + 0: SCSS_EXPRESSION_ITEM_LIST@1378..1395 + 0: CSS_STRING@1378..1395 + 0: CSS_STRING_LITERAL@1378..1395 "\"key.with.dot\"" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1395..1397 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1397..1402 + 0: SCSS_EXPRESSION_ITEM_LIST@1397..1402 + 0: CSS_IDENTIFIER@1397..1402 + 0: IDENT@1397..1402 "value" [] [] + 3: COMMA@1402..1403 "," [] [] + 4: SCSS_MAP_EXPRESSION_PAIR@1403..1434 + 0: SCSS_EXPRESSION@1403..1427 + 0: SCSS_EXPRESSION_ITEM_LIST@1403..1427 + 0: CSS_STRING@1403..1427 + 0: CSS_STRING_LITERAL@1403..1427 "\"key_with_underscore\"" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1427..1429 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1429..1434 + 0: SCSS_EXPRESSION_ITEM_LIST@1429..1434 + 0: CSS_IDENTIFIER@1429..1434 + 0: IDENT@1429..1434 "value" [] [] + 5: COMMA@1434..1435 "," [] [] + 6: SCSS_MAP_EXPRESSION_PAIR@1435..1461 + 0: SCSS_EXPRESSION@1435..1454 + 0: SCSS_EXPRESSION_ITEM_LIST@1435..1454 + 0: CSS_STRING@1435..1454 + 0: CSS_STRING_LITERAL@1435..1454 "\"key with space\"" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1454..1456 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1456..1461 + 0: SCSS_EXPRESSION_ITEM_LIST@1456..1461 + 0: CSS_IDENTIFIER@1456..1461 + 0: IDENT@1456..1461 "value" [] [] + 7: COMMA@1461..1462 "," [] [] + 2: R_PAREN@1462..1464 ")" [Newline("\n")] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@1464..1464 + 4: SEMICOLON@1464..1465 ";" [] [] + 11: SCSS_DECLARATION@1465..1600 + 0: SCSS_IDENTIFIER@1465..1502 + 0: DOLLAR@1465..1497 "$" [Newline("\n"), Newline("\n"), Comments("// Map with boolean a ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@1497..1502 + 0: IDENT@1497..1502 "types" [] [] + 1: COLON@1502..1504 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1504..1599 + 0: SCSS_EXPRESSION_ITEM_LIST@1504..1599 + 0: SCSS_MAP_EXPRESSION@1504..1599 + 0: L_PAREN@1504..1505 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@1505..1597 + 0: SCSS_MAP_EXPRESSION_PAIR@1505..1523 + 0: SCSS_EXPRESSION@1505..1517 + 0: SCSS_EXPRESSION_ITEM_LIST@1505..1517 + 0: CSS_IDENTIFIER@1505..1517 + 0: IDENT@1505..1517 "bool-true" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1517..1519 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1519..1523 + 0: SCSS_EXPRESSION_ITEM_LIST@1519..1523 + 0: CSS_IDENTIFIER@1519..1523 + 0: IDENT@1519..1523 "true" [] [] + 1: COMMA@1523..1524 "," [] [] + 2: SCSS_MAP_EXPRESSION_PAIR@1524..1544 + 0: SCSS_EXPRESSION@1524..1537 + 0: SCSS_EXPRESSION_ITEM_LIST@1524..1537 + 0: CSS_IDENTIFIER@1524..1537 + 0: IDENT@1524..1537 "bool-false" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1537..1539 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1539..1544 + 0: SCSS_EXPRESSION_ITEM_LIST@1539..1544 + 0: CSS_IDENTIFIER@1539..1544 + 0: IDENT@1539..1544 "false" [] [] + 3: COMMA@1544..1545 "," [] [] + 4: SCSS_MAP_EXPRESSION_PAIR@1545..1564 + 0: SCSS_EXPRESSION@1545..1558 + 0: SCSS_EXPRESSION_ITEM_LIST@1545..1558 + 0: CSS_IDENTIFIER@1545..1558 + 0: IDENT@1545..1558 "null-value" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1558..1560 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1560..1564 + 0: SCSS_EXPRESSION_ITEM_LIST@1560..1564 + 0: CSS_IDENTIFIER@1560..1564 + 0: IDENT@1560..1564 "null" [] [] + 5: COMMA@1564..1565 "," [] [] + 6: SCSS_MAP_EXPRESSION_PAIR@1565..1578 + 0: SCSS_EXPRESSION@1565..1574 + 0: SCSS_EXPRESSION_ITEM_LIST@1565..1574 + 0: CSS_IDENTIFIER@1565..1574 + 0: IDENT@1565..1574 "number" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1574..1576 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1576..1578 + 0: SCSS_EXPRESSION_ITEM_LIST@1576..1578 + 0: CSS_NUMBER@1576..1578 + 0: CSS_NUMBER_LITERAL@1576..1578 "42" [] [] + 7: COMMA@1578..1579 "," [] [] + 8: SCSS_MAP_EXPRESSION_PAIR@1579..1596 + 0: SCSS_EXPRESSION@1579..1588 + 0: SCSS_EXPRESSION_ITEM_LIST@1579..1588 + 0: CSS_IDENTIFIER@1579..1588 + 0: IDENT@1579..1588 "string" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1588..1590 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1590..1596 + 0: SCSS_EXPRESSION_ITEM_LIST@1590..1596 + 0: CSS_STRING@1590..1596 + 0: CSS_STRING_LITERAL@1590..1596 "\"text\"" [] [] + 9: COMMA@1596..1597 "," [] [] + 2: R_PAREN@1597..1599 ")" [Newline("\n")] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@1599..1599 + 4: SEMICOLON@1599..1600 ";" [] [] + 12: CSS_QUALIFIED_RULE@1600..1725 + 0: CSS_SELECTOR_LIST@1600..1637 + 0: CSS_COMPOUND_SELECTOR@1600..1637 + 0: CSS_NESTED_SELECTOR_LIST@1600..1600 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@1600..1637 + 0: CSS_CLASS_SELECTOR@1600..1637 + 0: DOT@1600..1632 "." [Newline("\n"), Newline("\n"), Comments("// Map as function pa ..."), Newline("\n")] [] + 1: CSS_CUSTOM_IDENTIFIER@1632..1637 + 0: IDENT@1632..1637 "test" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@1637..1725 + 0: L_CURLY@1637..1638 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@1638..1723 + 0: CSS_DECLARATION_WITH_SEMICOLON@1638..1685 + 0: CSS_DECLARATION@1638..1684 + 0: CSS_GENERIC_PROPERTY@1638..1684 + 0: CSS_IDENTIFIER@1638..1648 + 0: IDENT@1638..1648 "content" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1648..1650 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1650..1684 + 0: SCSS_EXPRESSION_ITEM_LIST@1650..1684 + 0: CSS_FUNCTION@1650..1684 + 0: CSS_IDENTIFIER@1650..1657 + 0: IDENT@1650..1657 "map-get" [] [] + 1: L_PAREN@1657..1658 "(" [] [] + 2: CSS_PARAMETER_LIST@1658..1683 + 0: SCSS_EXPRESSION@1658..1678 + 0: SCSS_EXPRESSION_ITEM_LIST@1658..1678 + 0: SCSS_MAP_EXPRESSION@1658..1678 + 0: L_PAREN@1658..1659 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@1659..1677 + 0: SCSS_MAP_EXPRESSION_PAIR@1659..1667 + 0: SCSS_EXPRESSION@1659..1662 + 0: SCSS_EXPRESSION_ITEM_LIST@1659..1662 + 0: CSS_IDENTIFIER@1659..1662 + 0: IDENT@1659..1662 "foo" [] [] + 1: COLON@1662..1664 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1664..1667 + 0: SCSS_EXPRESSION_ITEM_LIST@1664..1667 + 0: CSS_IDENTIFIER@1664..1667 + 0: IDENT@1664..1667 "bar" [] [] + 1: COMMA@1667..1669 "," [] [Whitespace(" ")] + 2: SCSS_MAP_EXPRESSION_PAIR@1669..1677 + 0: SCSS_EXPRESSION@1669..1672 + 0: SCSS_EXPRESSION_ITEM_LIST@1669..1672 + 0: CSS_IDENTIFIER@1669..1672 + 0: IDENT@1669..1672 "baz" [] [] + 1: COLON@1672..1674 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1674..1677 + 0: SCSS_EXPRESSION_ITEM_LIST@1674..1677 + 0: CSS_IDENTIFIER@1674..1677 + 0: IDENT@1674..1677 "qux" [] [] + 2: R_PAREN@1677..1678 ")" [] [] + 1: COMMA@1678..1680 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1680..1683 + 0: SCSS_EXPRESSION_ITEM_LIST@1680..1683 + 0: CSS_IDENTIFIER@1680..1683 + 0: IDENT@1680..1683 "foo" [] [] + 3: R_PAREN@1683..1684 ")" [] [] + 1: (empty) + 1: SEMICOLON@1684..1685 ";" [] [] + 1: CSS_DECLARATION_WITH_SEMICOLON@1685..1723 + 0: CSS_DECLARATION@1685..1722 + 0: CSS_GENERIC_PROPERTY@1685..1722 + 0: CSS_IDENTIFIER@1685..1693 + 0: IDENT@1685..1693 "value" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1693..1695 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1695..1722 + 0: SCSS_EXPRESSION_ITEM_LIST@1695..1722 + 0: CSS_FUNCTION@1695..1722 + 0: CSS_IDENTIFIER@1695..1708 + 0: IDENT@1695..1708 "some-function" [] [] + 1: L_PAREN@1708..1709 "(" [] [] + 2: CSS_PARAMETER_LIST@1709..1721 + 0: SCSS_EXPRESSION@1709..1721 + 0: SCSS_EXPRESSION_ITEM_LIST@1709..1721 + 0: SCSS_MAP_EXPRESSION@1709..1721 + 0: L_PAREN@1709..1710 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@1710..1720 + 0: SCSS_MAP_EXPRESSION_PAIR@1710..1720 + 0: SCSS_EXPRESSION@1710..1713 + 0: SCSS_EXPRESSION_ITEM_LIST@1710..1713 + 0: CSS_IDENTIFIER@1710..1713 + 0: IDENT@1710..1713 "key" [] [] + 1: COLON@1713..1715 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1715..1720 + 0: SCSS_EXPRESSION_ITEM_LIST@1715..1720 + 0: CSS_IDENTIFIER@1715..1720 + 0: IDENT@1715..1720 "value" [] [] + 2: R_PAREN@1720..1721 ")" [] [] + 3: R_PAREN@1721..1722 ")" [] [] + 1: (empty) + 1: SEMICOLON@1722..1723 ";" [] [] + 2: R_CURLY@1723..1725 "}" [Newline("\n")] [] + 13: SCSS_DECLARATION@1725..2012 + 0: SCSS_IDENTIFIER@1725..1765 + 0: DOLLAR@1725..1759 "$" [Newline("\n"), Newline("\n"), Comments("// Map in variable de ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@1759..1765 + 0: IDENT@1759..1765 "config" [] [] + 1: COLON@1765..1767 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1767..2011 + 0: SCSS_EXPRESSION_ITEM_LIST@1767..2011 + 0: SCSS_MAP_EXPRESSION@1767..2011 + 0: L_PAREN@1767..1768 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@1768..2009 + 0: SCSS_MAP_EXPRESSION_PAIR@1768..1841 + 0: SCSS_EXPRESSION@1768..1776 + 0: SCSS_EXPRESSION_ITEM_LIST@1768..1776 + 0: CSS_IDENTIFIER@1768..1776 + 0: IDENT@1768..1776 "theme" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1776..1778 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1778..1841 + 0: SCSS_EXPRESSION_ITEM_LIST@1778..1841 + 0: SCSS_MAP_EXPRESSION@1778..1841 + 0: L_PAREN@1778..1779 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@1779..1837 + 0: SCSS_MAP_EXPRESSION_PAIR@1779..1797 + 0: SCSS_EXPRESSION@1779..1791 + 0: SCSS_EXPRESSION_ITEM_LIST@1779..1791 + 0: CSS_IDENTIFIER@1779..1791 + 0: IDENT@1779..1791 "primary" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1791..1793 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1793..1797 + 0: SCSS_EXPRESSION_ITEM_LIST@1793..1797 + 0: CSS_COLOR@1793..1797 + 0: HASH@1793..1794 "#" [] [] + 1: CSS_COLOR_LITERAL@1794..1797 "036" [] [] + 1: COMMA@1797..1798 "," [] [] + 2: SCSS_MAP_EXPRESSION_PAIR@1798..1818 + 0: SCSS_EXPRESSION@1798..1812 + 0: SCSS_EXPRESSION_ITEM_LIST@1798..1812 + 0: CSS_IDENTIFIER@1798..1812 + 0: IDENT@1798..1812 "secondary" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1812..1814 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1814..1818 + 0: SCSS_EXPRESSION_ITEM_LIST@1814..1818 + 0: CSS_COLOR@1814..1818 + 0: HASH@1814..1815 "#" [] [] + 1: CSS_COLOR_LITERAL@1815..1818 "069" [] [] + 3: COMMA@1818..1819 "," [] [] + 4: SCSS_MAP_EXPRESSION_PAIR@1819..1836 + 0: SCSS_EXPRESSION@1819..1830 + 0: SCSS_EXPRESSION_ITEM_LIST@1819..1830 + 0: CSS_IDENTIFIER@1819..1830 + 0: IDENT@1819..1830 "accent" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1830..1832 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1832..1836 + 0: SCSS_EXPRESSION_ITEM_LIST@1832..1836 + 0: CSS_COLOR@1832..1836 + 0: HASH@1832..1833 "#" [] [] + 1: CSS_COLOR_LITERAL@1833..1836 "f00" [] [] + 5: COMMA@1836..1837 "," [] [] + 2: R_PAREN@1837..1841 ")" [Newline("\n"), Whitespace(" ")] [] + 1: COMMA@1841..1842 "," [] [] + 2: SCSS_MAP_EXPRESSION_PAIR@1842..1927 + 0: SCSS_EXPRESSION@1842..1852 + 0: SCSS_EXPRESSION_ITEM_LIST@1842..1852 + 0: CSS_IDENTIFIER@1842..1852 + 0: IDENT@1842..1852 "spacing" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1852..1854 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1854..1927 + 0: SCSS_EXPRESSION_ITEM_LIST@1854..1927 + 0: SCSS_MAP_EXPRESSION@1854..1927 + 0: L_PAREN@1854..1855 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@1855..1923 + 0: SCSS_MAP_EXPRESSION_PAIR@1855..1870 + 0: SCSS_EXPRESSION@1855..1865 + 0: SCSS_EXPRESSION_ITEM_LIST@1855..1865 + 0: CSS_IDENTIFIER@1855..1865 + 0: IDENT@1855..1865 "small" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1865..1867 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1867..1870 + 0: SCSS_EXPRESSION_ITEM_LIST@1867..1870 + 0: CSS_REGULAR_DIMENSION@1867..1870 + 0: CSS_NUMBER_LITERAL@1867..1868 "4" [] [] + 1: IDENT@1868..1870 "px" [] [] + 1: COMMA@1870..1871 "," [] [] + 2: SCSS_MAP_EXPRESSION_PAIR@1871..1887 + 0: SCSS_EXPRESSION@1871..1882 + 0: SCSS_EXPRESSION_ITEM_LIST@1871..1882 + 0: CSS_IDENTIFIER@1871..1882 + 0: IDENT@1871..1882 "medium" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1882..1884 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1884..1887 + 0: SCSS_EXPRESSION_ITEM_LIST@1884..1887 + 0: CSS_REGULAR_DIMENSION@1884..1887 + 0: CSS_NUMBER_LITERAL@1884..1885 "8" [] [] + 1: IDENT@1885..1887 "px" [] [] + 3: COMMA@1887..1888 "," [] [] + 4: SCSS_MAP_EXPRESSION_PAIR@1888..1904 + 0: SCSS_EXPRESSION@1888..1898 + 0: SCSS_EXPRESSION_ITEM_LIST@1888..1898 + 0: CSS_IDENTIFIER@1888..1898 + 0: IDENT@1888..1898 "large" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1898..1900 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1900..1904 + 0: SCSS_EXPRESSION_ITEM_LIST@1900..1904 + 0: CSS_REGULAR_DIMENSION@1900..1904 + 0: CSS_NUMBER_LITERAL@1900..1902 "16" [] [] + 1: IDENT@1902..1904 "px" [] [] + 5: COMMA@1904..1905 "," [] [] + 6: SCSS_MAP_EXPRESSION_PAIR@1905..1922 + 0: SCSS_EXPRESSION@1905..1916 + 0: SCSS_EXPRESSION_ITEM_LIST@1905..1916 + 0: CSS_IDENTIFIER@1905..1916 + 0: IDENT@1905..1916 "xlarge" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1916..1918 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1918..1922 + 0: SCSS_EXPRESSION_ITEM_LIST@1918..1922 + 0: CSS_REGULAR_DIMENSION@1918..1922 + 0: CSS_NUMBER_LITERAL@1918..1920 "32" [] [] + 1: IDENT@1920..1922 "px" [] [] + 7: COMMA@1922..1923 "," [] [] + 2: R_PAREN@1923..1927 ")" [Newline("\n"), Whitespace(" ")] [] + 3: COMMA@1927..1928 "," [] [] + 4: SCSS_MAP_EXPRESSION_PAIR@1928..2008 + 0: SCSS_EXPRESSION@1928..1942 + 0: SCSS_EXPRESSION_ITEM_LIST@1928..1942 + 0: CSS_IDENTIFIER@1928..1942 + 0: IDENT@1928..1942 "breakpoints" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1942..1944 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1944..2008 + 0: SCSS_EXPRESSION_ITEM_LIST@1944..2008 + 0: SCSS_MAP_EXPRESSION@1944..2008 + 0: L_PAREN@1944..1945 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@1945..2004 + 0: SCSS_MAP_EXPRESSION_PAIR@1945..1963 + 0: SCSS_EXPRESSION@1945..1956 + 0: SCSS_EXPRESSION_ITEM_LIST@1945..1956 + 0: CSS_IDENTIFIER@1945..1956 + 0: IDENT@1945..1956 "mobile" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1956..1958 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1958..1963 + 0: SCSS_EXPRESSION_ITEM_LIST@1958..1963 + 0: CSS_REGULAR_DIMENSION@1958..1963 + 0: CSS_NUMBER_LITERAL@1958..1961 "320" [] [] + 1: IDENT@1961..1963 "px" [] [] + 1: COMMA@1963..1964 "," [] [] + 2: SCSS_MAP_EXPRESSION_PAIR@1964..1982 + 0: SCSS_EXPRESSION@1964..1975 + 0: SCSS_EXPRESSION_ITEM_LIST@1964..1975 + 0: CSS_IDENTIFIER@1964..1975 + 0: IDENT@1964..1975 "tablet" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1975..1977 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1977..1982 + 0: SCSS_EXPRESSION_ITEM_LIST@1977..1982 + 0: CSS_REGULAR_DIMENSION@1977..1982 + 0: CSS_NUMBER_LITERAL@1977..1980 "768" [] [] + 1: IDENT@1980..1982 "px" [] [] + 3: COMMA@1982..1983 "," [] [] + 4: SCSS_MAP_EXPRESSION_PAIR@1983..2003 + 0: SCSS_EXPRESSION@1983..1995 + 0: SCSS_EXPRESSION_ITEM_LIST@1983..1995 + 0: CSS_IDENTIFIER@1983..1995 + 0: IDENT@1983..1995 "desktop" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1995..1997 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1997..2003 + 0: SCSS_EXPRESSION_ITEM_LIST@1997..2003 + 0: CSS_REGULAR_DIMENSION@1997..2003 + 0: CSS_NUMBER_LITERAL@1997..2001 "1024" [] [] + 1: IDENT@2001..2003 "px" [] [] + 5: COMMA@2003..2004 "," [] [] + 2: R_PAREN@2004..2008 ")" [Newline("\n"), Whitespace(" ")] [] + 5: COMMA@2008..2009 "," [] [] + 2: R_PAREN@2009..2011 ")" [Newline("\n")] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@2011..2011 + 4: SEMICOLON@2011..2012 ";" [] [] + 14: SCSS_DECLARATION@2012..2133 + 0: SCSS_IDENTIFIER@2012..2045 + 0: DOLLAR@2012..2039 "$" [Newline("\n"), Newline("\n"), Comments("// Map with quoted keys"), Newline("\n")] [] + 1: CSS_IDENTIFIER@2039..2045 + 0: IDENT@2039..2045 "quoted" [] [] + 1: COLON@2045..2047 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2047..2132 + 0: SCSS_EXPRESSION_ITEM_LIST@2047..2132 + 0: SCSS_MAP_EXPRESSION@2047..2132 + 0: L_PAREN@2047..2048 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@2048..2130 + 0: SCSS_MAP_EXPRESSION_PAIR@2048..2074 + 0: SCSS_EXPRESSION@2048..2066 + 0: SCSS_EXPRESSION_ITEM_LIST@2048..2066 + 0: CSS_STRING@2048..2066 + 0: CSS_STRING_LITERAL@2048..2066 "'single-quotes'" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@2066..2068 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2068..2074 + 0: SCSS_EXPRESSION_ITEM_LIST@2068..2074 + 0: CSS_IDENTIFIER@2068..2074 + 0: IDENT@2068..2074 "value1" [] [] + 1: COMMA@2074..2075 "," [] [] + 2: SCSS_MAP_EXPRESSION_PAIR@2075..2101 + 0: SCSS_EXPRESSION@2075..2093 + 0: SCSS_EXPRESSION_ITEM_LIST@2075..2093 + 0: CSS_STRING@2075..2093 + 0: CSS_STRING_LITERAL@2075..2093 "\"double-quotes\"" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@2093..2095 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2095..2101 + 0: SCSS_EXPRESSION_ITEM_LIST@2095..2101 + 0: CSS_IDENTIFIER@2095..2101 + 0: IDENT@2095..2101 "value2" [] [] + 3: COMMA@2101..2102 "," [] [] + 4: SCSS_MAP_EXPRESSION_PAIR@2102..2129 + 0: SCSS_EXPRESSION@2102..2121 + 0: SCSS_EXPRESSION_ITEM_LIST@2102..2121 + 0: CSS_STRING@2102..2121 + 0: CSS_STRING_LITERAL@2102..2121 "'mixed-\"quotes\"'" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@2121..2123 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2123..2129 + 0: SCSS_EXPRESSION_ITEM_LIST@2123..2129 + 0: CSS_IDENTIFIER@2123..2129 + 0: IDENT@2123..2129 "value3" [] [] + 5: COMMA@2129..2130 "," [] [] + 2: R_PAREN@2130..2132 ")" [Newline("\n")] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@2132..2132 + 4: SEMICOLON@2132..2133 ";" [] [] + 15: SCSS_DECLARATION@2133..2233 + 0: SCSS_IDENTIFIER@2133..2172 + 0: DOLLAR@2133..2165 "$" [Newline("\n"), Newline("\n"), Comments("// Map with escape se ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@2165..2172 + 0: IDENT@2165..2172 "escaped" [] [] + 1: COLON@2172..2174 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2174..2232 + 0: SCSS_EXPRESSION_ITEM_LIST@2174..2232 + 0: SCSS_MAP_EXPRESSION@2174..2232 + 0: L_PAREN@2174..2175 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@2175..2230 + 0: SCSS_MAP_EXPRESSION_PAIR@2175..2197 + 0: SCSS_EXPRESSION@2175..2190 + 0: SCSS_EXPRESSION_ITEM_LIST@2175..2190 + 0: CSS_IDENTIFIER@2175..2190 + 0: IDENT@2175..2190 "key\\-escaped" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@2190..2192 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2192..2197 + 0: SCSS_EXPRESSION_ITEM_LIST@2192..2197 + 0: CSS_IDENTIFIER@2192..2197 + 0: IDENT@2192..2197 "value" [] [] + 1: COMMA@2197..2198 "," [] [] + 2: SCSS_MAP_EXPRESSION_PAIR@2198..2229 + 0: SCSS_EXPRESSION@2198..2222 + 0: SCSS_EXPRESSION_ITEM_LIST@2198..2222 + 0: CSS_STRING@2198..2222 + 0: CSS_STRING_LITERAL@2198..2222 "\"key\\nwith\\nnewlines\"" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@2222..2224 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2224..2229 + 0: SCSS_EXPRESSION_ITEM_LIST@2224..2229 + 0: CSS_IDENTIFIER@2224..2229 + 0: IDENT@2224..2229 "value" [] [] + 3: COMMA@2229..2230 "," [] [] + 2: R_PAREN@2230..2232 ")" [Newline("\n")] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@2232..2232 + 4: SEMICOLON@2232..2233 ";" [] [] + 16: SCSS_DECLARATION@2233..2307 + 0: SCSS_IDENTIFIER@2233..2262 + 0: DOLLAR@2233..2251 "$" [Newline("\n"), Newline("\n"), Comments("// Map in list"), Newline("\n")] [] + 1: CSS_IDENTIFIER@2251..2262 + 0: IDENT@2251..2262 "map-in-list" [] [] + 1: COLON@2262..2264 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2264..2306 + 0: SCSS_EXPRESSION_ITEM_LIST@2264..2306 + 0: SCSS_PARENTHESIZED_EXPRESSION@2264..2306 + 0: L_PAREN@2264..2265 "(" [] [] + 1: SCSS_LIST_EXPRESSION@2265..2305 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@2265..2305 + 0: SCSS_LIST_EXPRESSION_ELEMENT@2265..2277 + 0: SCSS_EXPRESSION@2265..2277 + 0: SCSS_EXPRESSION_ITEM_LIST@2265..2277 + 0: SCSS_MAP_EXPRESSION@2265..2277 + 0: L_PAREN@2265..2266 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@2266..2276 + 0: SCSS_MAP_EXPRESSION_PAIR@2266..2276 + 0: SCSS_EXPRESSION@2266..2270 + 0: SCSS_EXPRESSION_ITEM_LIST@2266..2270 + 0: CSS_IDENTIFIER@2266..2270 + 0: IDENT@2266..2270 "key1" [] [] + 1: COLON@2270..2272 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2272..2276 + 0: SCSS_EXPRESSION_ITEM_LIST@2272..2276 + 0: CSS_IDENTIFIER@2272..2276 + 0: IDENT@2272..2276 "val1" [] [] + 2: R_PAREN@2276..2277 ")" [] [] + 1: COMMA@2277..2279 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@2279..2291 + 0: SCSS_EXPRESSION@2279..2291 + 0: SCSS_EXPRESSION_ITEM_LIST@2279..2291 + 0: SCSS_MAP_EXPRESSION@2279..2291 + 0: L_PAREN@2279..2280 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@2280..2290 + 0: SCSS_MAP_EXPRESSION_PAIR@2280..2290 + 0: SCSS_EXPRESSION@2280..2284 + 0: SCSS_EXPRESSION_ITEM_LIST@2280..2284 + 0: CSS_IDENTIFIER@2280..2284 + 0: IDENT@2280..2284 "key2" [] [] + 1: COLON@2284..2286 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2286..2290 + 0: SCSS_EXPRESSION_ITEM_LIST@2286..2290 + 0: CSS_IDENTIFIER@2286..2290 + 0: IDENT@2286..2290 "val2" [] [] + 2: R_PAREN@2290..2291 ")" [] [] + 3: COMMA@2291..2293 "," [] [Whitespace(" ")] + 4: SCSS_LIST_EXPRESSION_ELEMENT@2293..2305 + 0: SCSS_EXPRESSION@2293..2305 + 0: SCSS_EXPRESSION_ITEM_LIST@2293..2305 + 0: SCSS_MAP_EXPRESSION@2293..2305 + 0: L_PAREN@2293..2294 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@2294..2304 + 0: SCSS_MAP_EXPRESSION_PAIR@2294..2304 + 0: SCSS_EXPRESSION@2294..2298 + 0: SCSS_EXPRESSION_ITEM_LIST@2294..2298 + 0: CSS_IDENTIFIER@2294..2298 + 0: IDENT@2294..2298 "key3" [] [] + 1: COLON@2298..2300 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2300..2304 + 0: SCSS_EXPRESSION_ITEM_LIST@2300..2304 + 0: CSS_IDENTIFIER@2300..2304 + 0: IDENT@2300..2304 "val3" [] [] + 2: R_PAREN@2304..2305 ")" [] [] + 2: R_PAREN@2305..2306 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@2306..2306 + 4: SEMICOLON@2306..2307 ";" [] [] + 17: SCSS_DECLARATION@2307..2382 + 0: SCSS_IDENTIFIER@2307..2336 + 0: DOLLAR@2307..2325 "$" [Newline("\n"), Newline("\n"), Comments("// List in map"), Newline("\n")] [] + 1: CSS_IDENTIFIER@2325..2336 + 0: IDENT@2325..2336 "list-in-map" [] [] + 1: COLON@2336..2338 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2338..2381 + 0: SCSS_EXPRESSION_ITEM_LIST@2338..2381 + 0: SCSS_MAP_EXPRESSION@2338..2381 + 0: L_PAREN@2338..2339 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@2339..2379 + 0: SCSS_MAP_EXPRESSION_PAIR@2339..2358 + 0: SCSS_EXPRESSION@2339..2347 + 0: SCSS_EXPRESSION_ITEM_LIST@2339..2347 + 0: CSS_IDENTIFIER@2339..2347 + 0: IDENT@2339..2347 "list1" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@2347..2349 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2349..2358 + 0: SCSS_EXPRESSION_ITEM_LIST@2349..2358 + 0: SCSS_PARENTHESIZED_EXPRESSION@2349..2358 + 0: L_PAREN@2349..2350 "(" [] [] + 1: SCSS_LIST_EXPRESSION@2350..2357 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@2350..2357 + 0: SCSS_LIST_EXPRESSION_ELEMENT@2350..2351 + 0: SCSS_EXPRESSION@2350..2351 + 0: SCSS_EXPRESSION_ITEM_LIST@2350..2351 + 0: CSS_IDENTIFIER@2350..2351 + 0: IDENT@2350..2351 "a" [] [] + 1: COMMA@2351..2353 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@2353..2354 + 0: SCSS_EXPRESSION@2353..2354 + 0: SCSS_EXPRESSION_ITEM_LIST@2353..2354 + 0: CSS_IDENTIFIER@2353..2354 + 0: IDENT@2353..2354 "b" [] [] + 3: COMMA@2354..2356 "," [] [Whitespace(" ")] + 4: SCSS_LIST_EXPRESSION_ELEMENT@2356..2357 + 0: SCSS_EXPRESSION@2356..2357 + 0: SCSS_EXPRESSION_ITEM_LIST@2356..2357 + 0: CSS_IDENTIFIER@2356..2357 + 0: IDENT@2356..2357 "c" [] [] + 2: R_PAREN@2357..2358 ")" [] [] + 1: COMMA@2358..2359 "," [] [] + 2: SCSS_MAP_EXPRESSION_PAIR@2359..2378 + 0: SCSS_EXPRESSION@2359..2367 + 0: SCSS_EXPRESSION_ITEM_LIST@2359..2367 + 0: CSS_IDENTIFIER@2359..2367 + 0: IDENT@2359..2367 "list2" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@2367..2369 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2369..2378 + 0: SCSS_EXPRESSION_ITEM_LIST@2369..2378 + 0: SCSS_PARENTHESIZED_EXPRESSION@2369..2378 + 0: L_PAREN@2369..2370 "(" [] [] + 1: SCSS_LIST_EXPRESSION@2370..2377 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@2370..2377 + 0: SCSS_LIST_EXPRESSION_ELEMENT@2370..2371 + 0: SCSS_EXPRESSION@2370..2371 + 0: SCSS_EXPRESSION_ITEM_LIST@2370..2371 + 0: CSS_NUMBER@2370..2371 + 0: CSS_NUMBER_LITERAL@2370..2371 "1" [] [] + 1: COMMA@2371..2373 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@2373..2374 + 0: SCSS_EXPRESSION@2373..2374 + 0: SCSS_EXPRESSION_ITEM_LIST@2373..2374 + 0: CSS_NUMBER@2373..2374 + 0: CSS_NUMBER_LITERAL@2373..2374 "2" [] [] + 3: COMMA@2374..2376 "," [] [Whitespace(" ")] + 4: SCSS_LIST_EXPRESSION_ELEMENT@2376..2377 + 0: SCSS_EXPRESSION@2376..2377 + 0: SCSS_EXPRESSION_ITEM_LIST@2376..2377 + 0: CSS_NUMBER@2376..2377 + 0: CSS_NUMBER_LITERAL@2376..2377 "3" [] [] + 2: R_PAREN@2377..2378 ")" [] [] + 3: COMMA@2378..2379 "," [] [] + 2: R_PAREN@2379..2381 ")" [Newline("\n")] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@2381..2381 + 4: SEMICOLON@2381..2382 ";" [] [] + 18: SCSS_DECLARATION@2382..2479 + 0: SCSS_IDENTIFIER@2382..2426 + 0: DOLLAR@2382..2417 "$" [Newline("\n"), Newline("\n"), Comments("// Map with expressio ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@2417..2426 + 0: IDENT@2417..2426 "expr-keys" [] [] + 1: COLON@2426..2428 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2428..2478 + 0: SCSS_EXPRESSION_ITEM_LIST@2428..2478 + 0: SCSS_MAP_EXPRESSION@2428..2478 + 0: L_PAREN@2428..2429 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@2429..2476 + 0: SCSS_MAP_EXPRESSION_PAIR@2429..2446 + 0: SCSS_EXPRESSION@2429..2439 + 0: SCSS_EXPRESSION_ITEM_LIST@2429..2439 + 0: SCSS_PARENTHESIZED_EXPRESSION@2429..2439 + 0: L_PAREN@2429..2433 "(" [Newline("\n"), Whitespace(" ")] [] + 1: SCSS_EXPRESSION@2433..2438 + 0: SCSS_EXPRESSION_ITEM_LIST@2433..2438 + 0: SCSS_BINARY_EXPRESSION@2433..2438 + 0: CSS_NUMBER@2433..2435 + 0: CSS_NUMBER_LITERAL@2433..2435 "1" [] [Whitespace(" ")] + 1: PLUS@2435..2437 "+" [] [Whitespace(" ")] + 2: CSS_NUMBER@2437..2438 + 0: CSS_NUMBER_LITERAL@2437..2438 "1" [] [] + 2: R_PAREN@2438..2439 ")" [] [] + 1: COLON@2439..2441 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2441..2446 + 0: SCSS_EXPRESSION_ITEM_LIST@2441..2446 + 0: CSS_IDENTIFIER@2441..2446 + 0: IDENT@2441..2446 "value" [] [] + 1: COMMA@2446..2447 "," [] [] + 2: SCSS_MAP_EXPRESSION_PAIR@2447..2475 + 0: SCSS_EXPRESSION@2447..2468 + 0: SCSS_EXPRESSION_ITEM_LIST@2447..2468 + 0: SCSS_PARENTHESIZED_EXPRESSION@2447..2468 + 0: L_PAREN@2447..2451 "(" [Newline("\n"), Whitespace(" ")] [] + 1: SCSS_EXPRESSION@2451..2467 + 0: SCSS_EXPRESSION_ITEM_LIST@2451..2467 + 0: SCSS_BINARY_EXPRESSION@2451..2467 + 0: SCSS_IDENTIFIER@2451..2456 + 0: DOLLAR@2451..2452 "$" [] [] + 1: CSS_IDENTIFIER@2452..2456 + 0: IDENT@2452..2456 "var" [] [Whitespace(" ")] + 1: PLUS@2456..2458 "+" [] [Whitespace(" ")] + 2: CSS_STRING@2458..2467 + 0: CSS_STRING_LITERAL@2458..2467 "\"-suffix\"" [] [] + 2: R_PAREN@2467..2468 ")" [] [] + 1: COLON@2468..2470 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2470..2475 + 0: SCSS_EXPRESSION_ITEM_LIST@2470..2475 + 0: CSS_IDENTIFIER@2470..2475 + 0: IDENT@2470..2475 "value" [] [] + 3: COMMA@2475..2476 "," [] [] + 2: R_PAREN@2476..2478 ")" [Newline("\n")] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@2478..2478 + 4: SEMICOLON@2478..2479 ";" [] [] + 19: SCSS_DECLARATION@2479..2630 + 0: SCSS_IDENTIFIER@2479..2548 + 0: DOLLAR@2479..2539 "$" [Newline("\n"), Newline("\n"), Comments("// Map spanning multi ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@2539..2548 + 0: IDENT@2539..2548 "multiline" [] [] + 1: COLON@2548..2550 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2550..2629 + 0: SCSS_EXPRESSION_ITEM_LIST@2550..2629 + 0: SCSS_MAP_EXPRESSION@2550..2629 + 0: L_PAREN@2550..2551 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@2551..2627 + 0: SCSS_MAP_EXPRESSION_PAIR@2551..2570 + 0: SCSS_EXPRESSION@2551..2558 + 0: SCSS_EXPRESSION_ITEM_LIST@2551..2558 + 0: CSS_IDENTIFIER@2551..2558 + 0: IDENT@2551..2558 "key1" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@2558..2559 ":" [] [] + 2: SCSS_EXPRESSION@2559..2570 + 0: SCSS_EXPRESSION_ITEM_LIST@2559..2570 + 0: CSS_IDENTIFIER@2559..2570 + 0: IDENT@2559..2570 "value1" [Newline("\n"), Whitespace(" ")] [] + 1: COMMA@2570..2571 "," [] [] + 2: SCSS_MAP_EXPRESSION_PAIR@2571..2586 + 0: SCSS_EXPRESSION@2571..2578 + 0: SCSS_EXPRESSION_ITEM_LIST@2571..2578 + 0: CSS_IDENTIFIER@2571..2578 + 0: IDENT@2571..2578 "key2" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@2578..2580 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2580..2586 + 0: SCSS_EXPRESSION_ITEM_LIST@2580..2586 + 0: CSS_IDENTIFIER@2580..2586 + 0: IDENT@2580..2586 "value2" [] [] + 3: COMMA@2586..2587 "," [] [] + 4: SCSS_MAP_EXPRESSION_PAIR@2587..2626 + 0: SCSS_EXPRESSION@2587..2594 + 0: SCSS_EXPRESSION_ITEM_LIST@2587..2594 + 0: CSS_IDENTIFIER@2587..2594 + 0: IDENT@2587..2594 "key3" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@2594..2595 ":" [] [] + 2: SCSS_EXPRESSION@2595..2626 + 0: SCSS_EXPRESSION_ITEM_LIST@2595..2626 + 0: SCSS_MAP_EXPRESSION@2595..2626 + 0: L_PAREN@2595..2601 "(" [Newline("\n"), Whitespace(" ")] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@2601..2625 + 0: SCSS_MAP_EXPRESSION_PAIR@2601..2625 + 0: SCSS_EXPRESSION@2601..2611 + 0: SCSS_EXPRESSION_ITEM_LIST@2601..2611 + 0: CSS_IDENTIFIER@2601..2611 + 0: IDENT@2601..2611 "nested-key" [] [] + 1: COLON@2611..2613 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2613..2625 + 0: SCSS_EXPRESSION_ITEM_LIST@2613..2625 + 0: CSS_IDENTIFIER@2613..2625 + 0: IDENT@2613..2625 "nested-value" [] [] + 2: R_PAREN@2625..2626 ")" [] [] + 5: COMMA@2626..2627 "," [] [] + 2: R_PAREN@2627..2629 ")" [Newline("\n")] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@2629..2629 + 4: SEMICOLON@2629..2630 ";" [] [] + 20: SCSS_DECLARATION@2630..2728 + 0: SCSS_IDENTIFIER@2630..2658 + 0: DOLLAR@2630..2651 "$" [Newline("\n"), Newline("\n"), Comments("// Unicode in map"), Newline("\n")] [] + 1: CSS_IDENTIFIER@2651..2658 + 0: IDENT@2651..2658 "unicode" [] [] + 1: COLON@2658..2660 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2660..2727 + 0: SCSS_EXPRESSION_ITEM_LIST@2660..2727 + 0: SCSS_MAP_EXPRESSION@2660..2727 + 0: L_PAREN@2660..2661 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@2661..2725 + 0: SCSS_MAP_EXPRESSION_PAIR@2661..2676 + 0: SCSS_EXPRESSION@2661..2670 + 0: SCSS_EXPRESSION_ITEM_LIST@2661..2670 + 0: CSS_IDENTIFIER@2661..2670 + 0: IDENT@2661..2670 "émoji" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@2670..2672 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2672..2676 + 0: SCSS_EXPRESSION_ITEM_LIST@2672..2676 + 0: CSS_IDENTIFIER@2672..2676 + 0: IDENT@2672..2676 "🎨" [] [] + 1: COMMA@2676..2677 "," [] [] + 2: SCSS_MAP_EXPRESSION_PAIR@2677..2694 + 0: SCSS_EXPRESSION@2677..2689 + 0: SCSS_EXPRESSION_ITEM_LIST@2677..2689 + 0: CSS_IDENTIFIER@2677..2689 + 0: IDENT@2677..2689 "日本語" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@2689..2691 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2691..2694 + 0: SCSS_EXPRESSION_ITEM_LIST@2691..2694 + 0: CSS_IDENTIFIER@2691..2694 + 0: IDENT@2691..2694 "値" [] [] + 3: COMMA@2694..2695 "," [] [] + 4: SCSS_MAP_EXPRESSION_PAIR@2695..2724 + 0: SCSS_EXPRESSION@2695..2706 + 0: SCSS_EXPRESSION_ITEM_LIST@2695..2706 + 0: CSS_IDENTIFIER@2695..2706 + 0: IDENT@2695..2706 "ключ" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@2706..2708 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@2708..2724 + 0: SCSS_EXPRESSION_ITEM_LIST@2708..2724 + 0: CSS_IDENTIFIER@2708..2724 + 0: IDENT@2708..2724 "значение" [] [] + 5: COMMA@2724..2725 "," [] [] + 2: R_PAREN@2725..2727 ")" [Newline("\n")] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@2727..2727 + 4: SEMICOLON@2727..2728 ";" [] [] + 2: EOF@2728..2732 "" [Newline("\n"), Newline("\n"), Newline("\n"), Newline("\n")] [] + +``` diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/map-expression-key.scss b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/map-expression-key.scss new file mode 100644 index 000000000000..bf3b288b35c8 --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/map-expression-key.scss @@ -0,0 +1,5 @@ +$size: 2; +$map: ( + ($size + 1): foo, + (1 + 2): bar, +); diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/map-expression-key.scss.snap b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/map-expression-key.scss.snap new file mode 100644 index 000000000000..d04e085f9b02 --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/map-expression-key.scss.snap @@ -0,0 +1,212 @@ +--- +source: crates/biome_css_parser/tests/spec_test.rs +assertion_line: 208 +expression: snapshot +--- + +## Input + +```css +$size: 2; +$map: ( + ($size + 1): foo, + (1 + 2): bar, +); + +``` + + +## AST + +``` +CssRoot { + bom_token: missing (optional), + items: CssRootItemList [ + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@0..1 "$" [] [], + name: CssIdentifier { + value_token: IDENT@1..5 "size" [] [], + }, + }, + colon_token: COLON@5..7 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@7..8 "2" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@8..9 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@9..11 "$" [Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@11..14 "map" [] [], + }, + }, + colon_token: COLON@14..16 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@16..17 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@17..21 "(" [Newline("\n"), Whitespace(" ")] [], + expression: ScssExpression { + items: ScssExpressionItemList [ + ScssBinaryExpression { + left: ScssIdentifier { + dollar_token: DOLLAR@21..22 "$" [] [], + name: CssIdentifier { + value_token: IDENT@22..27 "size" [] [Whitespace(" ")], + }, + }, + operator: PLUS@27..29 "+" [] [Whitespace(" ")], + right: CssNumber { + value_token: CSS_NUMBER_LITERAL@29..30 "1" [] [], + }, + }, + ], + }, + r_paren_token: R_PAREN@30..31 ")" [] [], + }, + ], + }, + colon_token: COLON@31..33 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@33..36 "foo" [] [], + }, + ], + }, + }, + COMMA@36..37 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@37..41 "(" [Newline("\n"), Whitespace(" ")] [], + expression: ScssExpression { + items: ScssExpressionItemList [ + ScssBinaryExpression { + left: CssNumber { + value_token: CSS_NUMBER_LITERAL@41..43 "1" [] [Whitespace(" ")], + }, + operator: PLUS@43..45 "+" [] [Whitespace(" ")], + right: CssNumber { + value_token: CSS_NUMBER_LITERAL@45..46 "2" [] [], + }, + }, + ], + }, + r_paren_token: R_PAREN@46..47 ")" [] [], + }, + ], + }, + colon_token: COLON@47..49 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@49..52 "bar" [] [], + }, + ], + }, + }, + COMMA@52..53 "," [] [], + ], + r_paren_token: R_PAREN@53..55 ")" [Newline("\n")] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@55..56 ";" [] [], + }, + ], + eof_token: EOF@56..57 "" [Newline("\n")] [], +} +``` + +## CST + +``` +0: CSS_ROOT@0..57 + 0: (empty) + 1: CSS_ROOT_ITEM_LIST@0..56 + 0: SCSS_DECLARATION@0..9 + 0: SCSS_IDENTIFIER@0..5 + 0: DOLLAR@0..1 "$" [] [] + 1: CSS_IDENTIFIER@1..5 + 0: IDENT@1..5 "size" [] [] + 1: COLON@5..7 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@7..8 + 0: SCSS_EXPRESSION_ITEM_LIST@7..8 + 0: CSS_NUMBER@7..8 + 0: CSS_NUMBER_LITERAL@7..8 "2" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@8..8 + 4: SEMICOLON@8..9 ";" [] [] + 1: SCSS_DECLARATION@9..56 + 0: SCSS_IDENTIFIER@9..14 + 0: DOLLAR@9..11 "$" [Newline("\n")] [] + 1: CSS_IDENTIFIER@11..14 + 0: IDENT@11..14 "map" [] [] + 1: COLON@14..16 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@16..55 + 0: SCSS_EXPRESSION_ITEM_LIST@16..55 + 0: SCSS_MAP_EXPRESSION@16..55 + 0: L_PAREN@16..17 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@17..53 + 0: SCSS_MAP_EXPRESSION_PAIR@17..36 + 0: SCSS_EXPRESSION@17..31 + 0: SCSS_EXPRESSION_ITEM_LIST@17..31 + 0: SCSS_PARENTHESIZED_EXPRESSION@17..31 + 0: L_PAREN@17..21 "(" [Newline("\n"), Whitespace(" ")] [] + 1: SCSS_EXPRESSION@21..30 + 0: SCSS_EXPRESSION_ITEM_LIST@21..30 + 0: SCSS_BINARY_EXPRESSION@21..30 + 0: SCSS_IDENTIFIER@21..27 + 0: DOLLAR@21..22 "$" [] [] + 1: CSS_IDENTIFIER@22..27 + 0: IDENT@22..27 "size" [] [Whitespace(" ")] + 1: PLUS@27..29 "+" [] [Whitespace(" ")] + 2: CSS_NUMBER@29..30 + 0: CSS_NUMBER_LITERAL@29..30 "1" [] [] + 2: R_PAREN@30..31 ")" [] [] + 1: COLON@31..33 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@33..36 + 0: SCSS_EXPRESSION_ITEM_LIST@33..36 + 0: CSS_IDENTIFIER@33..36 + 0: IDENT@33..36 "foo" [] [] + 1: COMMA@36..37 "," [] [] + 2: SCSS_MAP_EXPRESSION_PAIR@37..52 + 0: SCSS_EXPRESSION@37..47 + 0: SCSS_EXPRESSION_ITEM_LIST@37..47 + 0: SCSS_PARENTHESIZED_EXPRESSION@37..47 + 0: L_PAREN@37..41 "(" [Newline("\n"), Whitespace(" ")] [] + 1: SCSS_EXPRESSION@41..46 + 0: SCSS_EXPRESSION_ITEM_LIST@41..46 + 0: SCSS_BINARY_EXPRESSION@41..46 + 0: CSS_NUMBER@41..43 + 0: CSS_NUMBER_LITERAL@41..43 "1" [] [Whitespace(" ")] + 1: PLUS@43..45 "+" [] [Whitespace(" ")] + 2: CSS_NUMBER@45..46 + 0: CSS_NUMBER_LITERAL@45..46 "2" [] [] + 2: R_PAREN@46..47 ")" [] [] + 1: COLON@47..49 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@49..52 + 0: SCSS_EXPRESSION_ITEM_LIST@49..52 + 0: CSS_IDENTIFIER@49..52 + 0: IDENT@49..52 "bar" [] [] + 3: COMMA@52..53 "," [] [] + 2: R_PAREN@53..55 ")" [Newline("\n")] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@55..55 + 4: SEMICOLON@55..56 ";" [] [] + 2: EOF@56..57 "" [Newline("\n")] [] + +``` diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/map-list-access.scss b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/map-list-access.scss new file mode 100644 index 000000000000..1eb2c821ffef --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/map-list-access.scss @@ -0,0 +1,36 @@ +// Map bracket access +$map: (key1: value1, key2: value2, key3: value3); +$value1: map.get($map, key1); + +// Nested map access +$theme: ( + colors: ( + primary: #036, + secondary: #069 + ), + sizes: ( + small: 10px, + large: 20px + ) +); + +$primary-color: map.get(map.get($theme, colors), primary); + +// List indexing (using nth function - SCSS doesn't have [] syntax natively) +$list: (a, b, c, d); +$second: list.nth($list, 2); + +// Map with complex keys +$complex-map: ( + (key1, key2): value1, + "string-key": value2 +); + +.test { + color: map.get($map, key1); + size: list.nth($list, 1); +} + + + + diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/map-list-access.scss.snap b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/map-list-access.scss.snap new file mode 100644 index 000000000000..7490e9f32bf7 --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/map-list-access.scss.snap @@ -0,0 +1,1116 @@ +--- +source: crates/biome_css_parser/tests/spec_test.rs +assertion_line: 208 +expression: snapshot +--- + +## Input + +```css +// Map bracket access +$map: (key1: value1, key2: value2, key3: value3); +$value1: map.get($map, key1); + +// Nested map access +$theme: ( + colors: ( + primary: #036, + secondary: #069 + ), + sizes: ( + small: 10px, + large: 20px + ) +); + +$primary-color: map.get(map.get($theme, colors), primary); + +// List indexing (using nth function - SCSS doesn't have [] syntax natively) +$list: (a, b, c, d); +$second: list.nth($list, 2); + +// Map with complex keys +$complex-map: ( + (key1, key2): value1, + "string-key": value2 +); + +.test { + color: map.get($map, key1); + size: list.nth($list, 1); +} + + + + + +``` + + +## AST + +``` +CssRoot { + bom_token: missing (optional), + items: CssRootItemList [ + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@0..23 "$" [Comments("// Map bracket access"), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@23..26 "map" [] [], + }, + }, + colon_token: COLON@26..28 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@28..29 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@29..33 "key1" [] [], + }, + ], + }, + colon_token: COLON@33..35 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@35..41 "value1" [] [], + }, + ], + }, + }, + COMMA@41..43 "," [] [Whitespace(" ")], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@43..47 "key2" [] [], + }, + ], + }, + colon_token: COLON@47..49 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@49..55 "value2" [] [], + }, + ], + }, + }, + COMMA@55..57 "," [] [Whitespace(" ")], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@57..61 "key3" [] [], + }, + ], + }, + colon_token: COLON@61..63 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@63..69 "value3" [] [], + }, + ], + }, + }, + ], + r_paren_token: R_PAREN@69..70 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@70..71 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@71..73 "$" [Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@73..79 "value1" [] [], + }, + }, + colon_token: COLON@79..81 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@81..84 "map" [] [], + }, + dot_token: DOT@84..85 "." [] [], + member: CssIdentifier { + value_token: IDENT@85..88 "get" [] [], + }, + }, + l_paren_token: L_PAREN@88..89 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssIdentifier { + dollar_token: DOLLAR@89..90 "$" [] [], + name: CssIdentifier { + value_token: IDENT@90..93 "map" [] [], + }, + }, + ], + }, + COMMA@93..95 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@95..99 "key1" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@99..100 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@100..101 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@101..125 "$" [Newline("\n"), Newline("\n"), Comments("// Nested map access"), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@125..130 "theme" [] [], + }, + }, + colon_token: COLON@130..132 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@132..133 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@133..142 "colors" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@142..144 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@144..145 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@145..157 "primary" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@157..159 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssColor { + hash_token: HASH@159..160 "#" [] [], + value_token: CSS_COLOR_LITERAL@160..163 "036" [] [], + }, + ], + }, + }, + COMMA@163..164 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@164..178 "secondary" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@178..180 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssColor { + hash_token: HASH@180..181 "#" [] [], + value_token: CSS_COLOR_LITERAL@181..184 "069" [] [], + }, + ], + }, + }, + ], + r_paren_token: R_PAREN@184..188 ")" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + }, + COMMA@188..189 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@189..197 "sizes" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@197..199 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@199..200 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@200..210 "small" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@210..212 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@212..214 "10" [] [], + unit_token: IDENT@214..216 "px" [] [], + }, + ], + }, + }, + COMMA@216..217 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@217..227 "large" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@227..229 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssRegularDimension { + value_token: CSS_NUMBER_LITERAL@229..231 "20" [] [], + unit_token: IDENT@231..233 "px" [] [], + }, + ], + }, + }, + ], + r_paren_token: R_PAREN@233..237 ")" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + }, + ], + r_paren_token: R_PAREN@237..239 ")" [Newline("\n")] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@239..240 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@240..243 "$" [Newline("\n"), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@243..256 "primary-color" [] [], + }, + }, + colon_token: COLON@256..258 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@258..261 "map" [] [], + }, + dot_token: DOT@261..262 "." [] [], + member: CssIdentifier { + value_token: IDENT@262..265 "get" [] [], + }, + }, + l_paren_token: L_PAREN@265..266 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@266..269 "map" [] [], + }, + dot_token: DOT@269..270 "." [] [], + member: CssIdentifier { + value_token: IDENT@270..273 "get" [] [], + }, + }, + l_paren_token: L_PAREN@273..274 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssIdentifier { + dollar_token: DOLLAR@274..275 "$" [] [], + name: CssIdentifier { + value_token: IDENT@275..280 "theme" [] [], + }, + }, + ], + }, + COMMA@280..282 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@282..288 "colors" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@288..289 ")" [] [], + }, + ], + }, + COMMA@289..291 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@291..298 "primary" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@298..299 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@299..300 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@300..380 "$" [Newline("\n"), Newline("\n"), Comments("// List indexing (usi ..."), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@380..384 "list" [] [], + }, + }, + colon_token: COLON@384..386 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@386..387 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@387..388 "a" [] [], + }, + ], + }, + }, + COMMA@388..390 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@390..391 "b" [] [], + }, + ], + }, + }, + COMMA@391..393 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@393..394 "c" [] [], + }, + ], + }, + }, + COMMA@394..396 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@396..397 "d" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@397..398 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@398..399 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@399..401 "$" [Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@401..407 "second" [] [], + }, + }, + colon_token: COLON@407..409 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@409..413 "list" [] [], + }, + dot_token: DOT@413..414 "." [] [], + member: CssIdentifier { + value_token: IDENT@414..417 "nth" [] [], + }, + }, + l_paren_token: L_PAREN@417..418 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssIdentifier { + dollar_token: DOLLAR@418..419 "$" [] [], + name: CssIdentifier { + value_token: IDENT@419..423 "list" [] [], + }, + }, + ], + }, + COMMA@423..425 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@425..426 "2" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@426..427 ")" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@427..428 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@428..456 "$" [Newline("\n"), Newline("\n"), Comments("// Map with complex keys"), Newline("\n")] [], + name: CssIdentifier { + value_token: IDENT@456..467 "complex-map" [] [], + }, + }, + colon_token: COLON@467..469 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@469..470 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@470..474 "(" [Newline("\n"), Whitespace(" ")] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@474..478 "key1" [] [], + }, + ], + }, + }, + COMMA@478..480 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@480..484 "key2" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@484..485 ")" [] [], + }, + ], + }, + colon_token: COLON@485..487 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@487..493 "value1" [] [], + }, + ], + }, + }, + COMMA@493..494 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@494..509 "\"string-key\"" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@509..511 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@511..517 "value2" [] [], + }, + ], + }, + }, + ], + r_paren_token: R_PAREN@517..519 ")" [Newline("\n")] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@519..520 ";" [] [], + }, + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: missing (optional), + sub_selectors: CssSubSelectorList [ + CssClassSelector { + dot_token: DOT@520..523 "." [Newline("\n"), Newline("\n")] [], + name: CssCustomIdentifier { + value_token: IDENT@523..528 "test" [] [Whitespace(" ")], + }, + }, + ], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@528..529 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@529..537 "color" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@537..539 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@539..542 "map" [] [], + }, + dot_token: DOT@542..543 "." [] [], + member: CssIdentifier { + value_token: IDENT@543..546 "get" [] [], + }, + }, + l_paren_token: L_PAREN@546..547 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssIdentifier { + dollar_token: DOLLAR@547..548 "$" [] [], + name: CssIdentifier { + value_token: IDENT@548..551 "map" [] [], + }, + }, + ], + }, + COMMA@551..553 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@553..557 "key1" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@557..558 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@558..559 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@559..566 "size" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@566..568 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: ScssQualifiedName { + module: CssIdentifier { + value_token: IDENT@568..572 "list" [] [], + }, + dot_token: DOT@572..573 "." [] [], + member: CssIdentifier { + value_token: IDENT@573..576 "nth" [] [], + }, + }, + l_paren_token: L_PAREN@576..577 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssIdentifier { + dollar_token: DOLLAR@577..578 "$" [] [], + name: CssIdentifier { + value_token: IDENT@578..582 "list" [] [], + }, + }, + ], + }, + COMMA@582..584 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@584..585 "1" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@585..586 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@586..587 ";" [] [], + }, + ], + r_curly_token: R_CURLY@587..589 "}" [Newline("\n")] [], + }, + }, + ], + eof_token: EOF@589..594 "" [Newline("\n"), Newline("\n"), Newline("\n"), Newline("\n"), Newline("\n")] [], +} +``` + +## CST + +``` +0: CSS_ROOT@0..594 + 0: (empty) + 1: CSS_ROOT_ITEM_LIST@0..589 + 0: SCSS_DECLARATION@0..71 + 0: SCSS_IDENTIFIER@0..26 + 0: DOLLAR@0..23 "$" [Comments("// Map bracket access"), Newline("\n")] [] + 1: CSS_IDENTIFIER@23..26 + 0: IDENT@23..26 "map" [] [] + 1: COLON@26..28 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@28..70 + 0: SCSS_EXPRESSION_ITEM_LIST@28..70 + 0: SCSS_MAP_EXPRESSION@28..70 + 0: L_PAREN@28..29 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@29..69 + 0: SCSS_MAP_EXPRESSION_PAIR@29..41 + 0: SCSS_EXPRESSION@29..33 + 0: SCSS_EXPRESSION_ITEM_LIST@29..33 + 0: CSS_IDENTIFIER@29..33 + 0: IDENT@29..33 "key1" [] [] + 1: COLON@33..35 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@35..41 + 0: SCSS_EXPRESSION_ITEM_LIST@35..41 + 0: CSS_IDENTIFIER@35..41 + 0: IDENT@35..41 "value1" [] [] + 1: COMMA@41..43 "," [] [Whitespace(" ")] + 2: SCSS_MAP_EXPRESSION_PAIR@43..55 + 0: SCSS_EXPRESSION@43..47 + 0: SCSS_EXPRESSION_ITEM_LIST@43..47 + 0: CSS_IDENTIFIER@43..47 + 0: IDENT@43..47 "key2" [] [] + 1: COLON@47..49 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@49..55 + 0: SCSS_EXPRESSION_ITEM_LIST@49..55 + 0: CSS_IDENTIFIER@49..55 + 0: IDENT@49..55 "value2" [] [] + 3: COMMA@55..57 "," [] [Whitespace(" ")] + 4: SCSS_MAP_EXPRESSION_PAIR@57..69 + 0: SCSS_EXPRESSION@57..61 + 0: SCSS_EXPRESSION_ITEM_LIST@57..61 + 0: CSS_IDENTIFIER@57..61 + 0: IDENT@57..61 "key3" [] [] + 1: COLON@61..63 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@63..69 + 0: SCSS_EXPRESSION_ITEM_LIST@63..69 + 0: CSS_IDENTIFIER@63..69 + 0: IDENT@63..69 "value3" [] [] + 2: R_PAREN@69..70 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@70..70 + 4: SEMICOLON@70..71 ";" [] [] + 1: SCSS_DECLARATION@71..101 + 0: SCSS_IDENTIFIER@71..79 + 0: DOLLAR@71..73 "$" [Newline("\n")] [] + 1: CSS_IDENTIFIER@73..79 + 0: IDENT@73..79 "value1" [] [] + 1: COLON@79..81 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@81..100 + 0: SCSS_EXPRESSION_ITEM_LIST@81..100 + 0: CSS_FUNCTION@81..100 + 0: SCSS_QUALIFIED_NAME@81..88 + 0: CSS_IDENTIFIER@81..84 + 0: IDENT@81..84 "map" [] [] + 1: DOT@84..85 "." [] [] + 2: CSS_IDENTIFIER@85..88 + 0: IDENT@85..88 "get" [] [] + 1: L_PAREN@88..89 "(" [] [] + 2: CSS_PARAMETER_LIST@89..99 + 0: SCSS_EXPRESSION@89..93 + 0: SCSS_EXPRESSION_ITEM_LIST@89..93 + 0: SCSS_IDENTIFIER@89..93 + 0: DOLLAR@89..90 "$" [] [] + 1: CSS_IDENTIFIER@90..93 + 0: IDENT@90..93 "map" [] [] + 1: COMMA@93..95 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@95..99 + 0: SCSS_EXPRESSION_ITEM_LIST@95..99 + 0: CSS_IDENTIFIER@95..99 + 0: IDENT@95..99 "key1" [] [] + 3: R_PAREN@99..100 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@100..100 + 4: SEMICOLON@100..101 ";" [] [] + 2: SCSS_DECLARATION@101..240 + 0: SCSS_IDENTIFIER@101..130 + 0: DOLLAR@101..125 "$" [Newline("\n"), Newline("\n"), Comments("// Nested map access"), Newline("\n")] [] + 1: CSS_IDENTIFIER@125..130 + 0: IDENT@125..130 "theme" [] [] + 1: COLON@130..132 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@132..239 + 0: SCSS_EXPRESSION_ITEM_LIST@132..239 + 0: SCSS_MAP_EXPRESSION@132..239 + 0: L_PAREN@132..133 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@133..237 + 0: SCSS_MAP_EXPRESSION_PAIR@133..188 + 0: SCSS_EXPRESSION@133..142 + 0: SCSS_EXPRESSION_ITEM_LIST@133..142 + 0: CSS_IDENTIFIER@133..142 + 0: IDENT@133..142 "colors" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@142..144 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@144..188 + 0: SCSS_EXPRESSION_ITEM_LIST@144..188 + 0: SCSS_MAP_EXPRESSION@144..188 + 0: L_PAREN@144..145 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@145..184 + 0: SCSS_MAP_EXPRESSION_PAIR@145..163 + 0: SCSS_EXPRESSION@145..157 + 0: SCSS_EXPRESSION_ITEM_LIST@145..157 + 0: CSS_IDENTIFIER@145..157 + 0: IDENT@145..157 "primary" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@157..159 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@159..163 + 0: SCSS_EXPRESSION_ITEM_LIST@159..163 + 0: CSS_COLOR@159..163 + 0: HASH@159..160 "#" [] [] + 1: CSS_COLOR_LITERAL@160..163 "036" [] [] + 1: COMMA@163..164 "," [] [] + 2: SCSS_MAP_EXPRESSION_PAIR@164..184 + 0: SCSS_EXPRESSION@164..178 + 0: SCSS_EXPRESSION_ITEM_LIST@164..178 + 0: CSS_IDENTIFIER@164..178 + 0: IDENT@164..178 "secondary" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@178..180 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@180..184 + 0: SCSS_EXPRESSION_ITEM_LIST@180..184 + 0: CSS_COLOR@180..184 + 0: HASH@180..181 "#" [] [] + 1: CSS_COLOR_LITERAL@181..184 "069" [] [] + 2: R_PAREN@184..188 ")" [Newline("\n"), Whitespace(" ")] [] + 1: COMMA@188..189 "," [] [] + 2: SCSS_MAP_EXPRESSION_PAIR@189..237 + 0: SCSS_EXPRESSION@189..197 + 0: SCSS_EXPRESSION_ITEM_LIST@189..197 + 0: CSS_IDENTIFIER@189..197 + 0: IDENT@189..197 "sizes" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@197..199 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@199..237 + 0: SCSS_EXPRESSION_ITEM_LIST@199..237 + 0: SCSS_MAP_EXPRESSION@199..237 + 0: L_PAREN@199..200 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@200..233 + 0: SCSS_MAP_EXPRESSION_PAIR@200..216 + 0: SCSS_EXPRESSION@200..210 + 0: SCSS_EXPRESSION_ITEM_LIST@200..210 + 0: CSS_IDENTIFIER@200..210 + 0: IDENT@200..210 "small" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@210..212 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@212..216 + 0: SCSS_EXPRESSION_ITEM_LIST@212..216 + 0: CSS_REGULAR_DIMENSION@212..216 + 0: CSS_NUMBER_LITERAL@212..214 "10" [] [] + 1: IDENT@214..216 "px" [] [] + 1: COMMA@216..217 "," [] [] + 2: SCSS_MAP_EXPRESSION_PAIR@217..233 + 0: SCSS_EXPRESSION@217..227 + 0: SCSS_EXPRESSION_ITEM_LIST@217..227 + 0: CSS_IDENTIFIER@217..227 + 0: IDENT@217..227 "large" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@227..229 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@229..233 + 0: SCSS_EXPRESSION_ITEM_LIST@229..233 + 0: CSS_REGULAR_DIMENSION@229..233 + 0: CSS_NUMBER_LITERAL@229..231 "20" [] [] + 1: IDENT@231..233 "px" [] [] + 2: R_PAREN@233..237 ")" [Newline("\n"), Whitespace(" ")] [] + 2: R_PAREN@237..239 ")" [Newline("\n")] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@239..239 + 4: SEMICOLON@239..240 ";" [] [] + 3: SCSS_DECLARATION@240..300 + 0: SCSS_IDENTIFIER@240..256 + 0: DOLLAR@240..243 "$" [Newline("\n"), Newline("\n")] [] + 1: CSS_IDENTIFIER@243..256 + 0: IDENT@243..256 "primary-color" [] [] + 1: COLON@256..258 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@258..299 + 0: SCSS_EXPRESSION_ITEM_LIST@258..299 + 0: CSS_FUNCTION@258..299 + 0: SCSS_QUALIFIED_NAME@258..265 + 0: CSS_IDENTIFIER@258..261 + 0: IDENT@258..261 "map" [] [] + 1: DOT@261..262 "." [] [] + 2: CSS_IDENTIFIER@262..265 + 0: IDENT@262..265 "get" [] [] + 1: L_PAREN@265..266 "(" [] [] + 2: CSS_PARAMETER_LIST@266..298 + 0: SCSS_EXPRESSION@266..289 + 0: SCSS_EXPRESSION_ITEM_LIST@266..289 + 0: CSS_FUNCTION@266..289 + 0: SCSS_QUALIFIED_NAME@266..273 + 0: CSS_IDENTIFIER@266..269 + 0: IDENT@266..269 "map" [] [] + 1: DOT@269..270 "." [] [] + 2: CSS_IDENTIFIER@270..273 + 0: IDENT@270..273 "get" [] [] + 1: L_PAREN@273..274 "(" [] [] + 2: CSS_PARAMETER_LIST@274..288 + 0: SCSS_EXPRESSION@274..280 + 0: SCSS_EXPRESSION_ITEM_LIST@274..280 + 0: SCSS_IDENTIFIER@274..280 + 0: DOLLAR@274..275 "$" [] [] + 1: CSS_IDENTIFIER@275..280 + 0: IDENT@275..280 "theme" [] [] + 1: COMMA@280..282 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@282..288 + 0: SCSS_EXPRESSION_ITEM_LIST@282..288 + 0: CSS_IDENTIFIER@282..288 + 0: IDENT@282..288 "colors" [] [] + 3: R_PAREN@288..289 ")" [] [] + 1: COMMA@289..291 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@291..298 + 0: SCSS_EXPRESSION_ITEM_LIST@291..298 + 0: CSS_IDENTIFIER@291..298 + 0: IDENT@291..298 "primary" [] [] + 3: R_PAREN@298..299 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@299..299 + 4: SEMICOLON@299..300 ";" [] [] + 4: SCSS_DECLARATION@300..399 + 0: SCSS_IDENTIFIER@300..384 + 0: DOLLAR@300..380 "$" [Newline("\n"), Newline("\n"), Comments("// List indexing (usi ..."), Newline("\n")] [] + 1: CSS_IDENTIFIER@380..384 + 0: IDENT@380..384 "list" [] [] + 1: COLON@384..386 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@386..398 + 0: SCSS_EXPRESSION_ITEM_LIST@386..398 + 0: SCSS_PARENTHESIZED_EXPRESSION@386..398 + 0: L_PAREN@386..387 "(" [] [] + 1: SCSS_LIST_EXPRESSION@387..397 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@387..397 + 0: SCSS_LIST_EXPRESSION_ELEMENT@387..388 + 0: SCSS_EXPRESSION@387..388 + 0: SCSS_EXPRESSION_ITEM_LIST@387..388 + 0: CSS_IDENTIFIER@387..388 + 0: IDENT@387..388 "a" [] [] + 1: COMMA@388..390 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@390..391 + 0: SCSS_EXPRESSION@390..391 + 0: SCSS_EXPRESSION_ITEM_LIST@390..391 + 0: CSS_IDENTIFIER@390..391 + 0: IDENT@390..391 "b" [] [] + 3: COMMA@391..393 "," [] [Whitespace(" ")] + 4: SCSS_LIST_EXPRESSION_ELEMENT@393..394 + 0: SCSS_EXPRESSION@393..394 + 0: SCSS_EXPRESSION_ITEM_LIST@393..394 + 0: CSS_IDENTIFIER@393..394 + 0: IDENT@393..394 "c" [] [] + 5: COMMA@394..396 "," [] [Whitespace(" ")] + 6: SCSS_LIST_EXPRESSION_ELEMENT@396..397 + 0: SCSS_EXPRESSION@396..397 + 0: SCSS_EXPRESSION_ITEM_LIST@396..397 + 0: CSS_IDENTIFIER@396..397 + 0: IDENT@396..397 "d" [] [] + 2: R_PAREN@397..398 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@398..398 + 4: SEMICOLON@398..399 ";" [] [] + 5: SCSS_DECLARATION@399..428 + 0: SCSS_IDENTIFIER@399..407 + 0: DOLLAR@399..401 "$" [Newline("\n")] [] + 1: CSS_IDENTIFIER@401..407 + 0: IDENT@401..407 "second" [] [] + 1: COLON@407..409 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@409..427 + 0: SCSS_EXPRESSION_ITEM_LIST@409..427 + 0: CSS_FUNCTION@409..427 + 0: SCSS_QUALIFIED_NAME@409..417 + 0: CSS_IDENTIFIER@409..413 + 0: IDENT@409..413 "list" [] [] + 1: DOT@413..414 "." [] [] + 2: CSS_IDENTIFIER@414..417 + 0: IDENT@414..417 "nth" [] [] + 1: L_PAREN@417..418 "(" [] [] + 2: CSS_PARAMETER_LIST@418..426 + 0: SCSS_EXPRESSION@418..423 + 0: SCSS_EXPRESSION_ITEM_LIST@418..423 + 0: SCSS_IDENTIFIER@418..423 + 0: DOLLAR@418..419 "$" [] [] + 1: CSS_IDENTIFIER@419..423 + 0: IDENT@419..423 "list" [] [] + 1: COMMA@423..425 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@425..426 + 0: SCSS_EXPRESSION_ITEM_LIST@425..426 + 0: CSS_NUMBER@425..426 + 0: CSS_NUMBER_LITERAL@425..426 "2" [] [] + 3: R_PAREN@426..427 ")" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@427..427 + 4: SEMICOLON@427..428 ";" [] [] + 6: SCSS_DECLARATION@428..520 + 0: SCSS_IDENTIFIER@428..467 + 0: DOLLAR@428..456 "$" [Newline("\n"), Newline("\n"), Comments("// Map with complex keys"), Newline("\n")] [] + 1: CSS_IDENTIFIER@456..467 + 0: IDENT@456..467 "complex-map" [] [] + 1: COLON@467..469 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@469..519 + 0: SCSS_EXPRESSION_ITEM_LIST@469..519 + 0: SCSS_MAP_EXPRESSION@469..519 + 0: L_PAREN@469..470 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@470..517 + 0: SCSS_MAP_EXPRESSION_PAIR@470..493 + 0: SCSS_EXPRESSION@470..485 + 0: SCSS_EXPRESSION_ITEM_LIST@470..485 + 0: SCSS_PARENTHESIZED_EXPRESSION@470..485 + 0: L_PAREN@470..474 "(" [Newline("\n"), Whitespace(" ")] [] + 1: SCSS_LIST_EXPRESSION@474..484 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@474..484 + 0: SCSS_LIST_EXPRESSION_ELEMENT@474..478 + 0: SCSS_EXPRESSION@474..478 + 0: SCSS_EXPRESSION_ITEM_LIST@474..478 + 0: CSS_IDENTIFIER@474..478 + 0: IDENT@474..478 "key1" [] [] + 1: COMMA@478..480 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@480..484 + 0: SCSS_EXPRESSION@480..484 + 0: SCSS_EXPRESSION_ITEM_LIST@480..484 + 0: CSS_IDENTIFIER@480..484 + 0: IDENT@480..484 "key2" [] [] + 2: R_PAREN@484..485 ")" [] [] + 1: COLON@485..487 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@487..493 + 0: SCSS_EXPRESSION_ITEM_LIST@487..493 + 0: CSS_IDENTIFIER@487..493 + 0: IDENT@487..493 "value1" [] [] + 1: COMMA@493..494 "," [] [] + 2: SCSS_MAP_EXPRESSION_PAIR@494..517 + 0: SCSS_EXPRESSION@494..509 + 0: SCSS_EXPRESSION_ITEM_LIST@494..509 + 0: CSS_STRING@494..509 + 0: CSS_STRING_LITERAL@494..509 "\"string-key\"" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@509..511 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@511..517 + 0: SCSS_EXPRESSION_ITEM_LIST@511..517 + 0: CSS_IDENTIFIER@511..517 + 0: IDENT@511..517 "value2" [] [] + 2: R_PAREN@517..519 ")" [Newline("\n")] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@519..519 + 4: SEMICOLON@519..520 ";" [] [] + 7: CSS_QUALIFIED_RULE@520..589 + 0: CSS_SELECTOR_LIST@520..528 + 0: CSS_COMPOUND_SELECTOR@520..528 + 0: CSS_NESTED_SELECTOR_LIST@520..520 + 1: (empty) + 2: CSS_SUB_SELECTOR_LIST@520..528 + 0: CSS_CLASS_SELECTOR@520..528 + 0: DOT@520..523 "." [Newline("\n"), Newline("\n")] [] + 1: CSS_CUSTOM_IDENTIFIER@523..528 + 0: IDENT@523..528 "test" [] [Whitespace(" ")] + 1: CSS_DECLARATION_OR_RULE_BLOCK@528..589 + 0: L_CURLY@528..529 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@529..587 + 0: CSS_DECLARATION_WITH_SEMICOLON@529..559 + 0: CSS_DECLARATION@529..558 + 0: CSS_GENERIC_PROPERTY@529..558 + 0: CSS_IDENTIFIER@529..537 + 0: IDENT@529..537 "color" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@537..539 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@539..558 + 0: SCSS_EXPRESSION_ITEM_LIST@539..558 + 0: CSS_FUNCTION@539..558 + 0: SCSS_QUALIFIED_NAME@539..546 + 0: CSS_IDENTIFIER@539..542 + 0: IDENT@539..542 "map" [] [] + 1: DOT@542..543 "." [] [] + 2: CSS_IDENTIFIER@543..546 + 0: IDENT@543..546 "get" [] [] + 1: L_PAREN@546..547 "(" [] [] + 2: CSS_PARAMETER_LIST@547..557 + 0: SCSS_EXPRESSION@547..551 + 0: SCSS_EXPRESSION_ITEM_LIST@547..551 + 0: SCSS_IDENTIFIER@547..551 + 0: DOLLAR@547..548 "$" [] [] + 1: CSS_IDENTIFIER@548..551 + 0: IDENT@548..551 "map" [] [] + 1: COMMA@551..553 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@553..557 + 0: SCSS_EXPRESSION_ITEM_LIST@553..557 + 0: CSS_IDENTIFIER@553..557 + 0: IDENT@553..557 "key1" [] [] + 3: R_PAREN@557..558 ")" [] [] + 1: (empty) + 1: SEMICOLON@558..559 ";" [] [] + 1: CSS_DECLARATION_WITH_SEMICOLON@559..587 + 0: CSS_DECLARATION@559..586 + 0: CSS_GENERIC_PROPERTY@559..586 + 0: CSS_IDENTIFIER@559..566 + 0: IDENT@559..566 "size" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@566..568 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@568..586 + 0: SCSS_EXPRESSION_ITEM_LIST@568..586 + 0: CSS_FUNCTION@568..586 + 0: SCSS_QUALIFIED_NAME@568..576 + 0: CSS_IDENTIFIER@568..572 + 0: IDENT@568..572 "list" [] [] + 1: DOT@572..573 "." [] [] + 2: CSS_IDENTIFIER@573..576 + 0: IDENT@573..576 "nth" [] [] + 1: L_PAREN@576..577 "(" [] [] + 2: CSS_PARAMETER_LIST@577..585 + 0: SCSS_EXPRESSION@577..582 + 0: SCSS_EXPRESSION_ITEM_LIST@577..582 + 0: SCSS_IDENTIFIER@577..582 + 0: DOLLAR@577..578 "$" [] [] + 1: CSS_IDENTIFIER@578..582 + 0: IDENT@578..582 "list" [] [] + 1: COMMA@582..584 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@584..585 + 0: SCSS_EXPRESSION_ITEM_LIST@584..585 + 0: CSS_NUMBER@584..585 + 0: CSS_NUMBER_LITERAL@584..585 "1" [] [] + 3: R_PAREN@585..586 ")" [] [] + 1: (empty) + 1: SEMICOLON@586..587 ";" [] [] + 2: R_CURLY@587..589 "}" [Newline("\n")] [] + 2: EOF@589..594 "" [Newline("\n"), Newline("\n"), Newline("\n"), Newline("\n"), Newline("\n")] [] + +``` diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/map.scss b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/map.scss new file mode 100644 index 000000000000..3e9bf9f9c8c1 --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/map.scss @@ -0,0 +1,24 @@ +$foo: ( + (key1): (value-1-0), + key2: value-2-0, + (key6): (value-6-0), + key-3-0 key-3-1 key-3-2: value-3-0 value-3-1 value-3-2, + key4: (value-4-0, value-4-1, value-4-2), + key5: (key-5-0: value-5-1), + (key-7-0: key-7-1): (value-7-0: value-7-1), + (key-8-0, key-8-1, key-8-2): (value-8-0, value-8-1, value-8-2), +); + +div { + foo: map-get((foo: 1, bar: 2), foo); + foo: map-get((foo: 1, bar: 2), bar); + foo: map-get((foo: 1, bar: 2), baz); + foo: map-get((), foo); + foo: map-get($foo, (key-5-0: value-5-1)); + foo: map-get($foo, (key2)); + foo: map-get($foo, (key-3-0 key-3-1 key-3-2)); +} + + + + diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/map.scss.snap b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/map.scss.snap new file mode 100644 index 000000000000..741e4053fd69 --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/map.scss.snap @@ -0,0 +1,1412 @@ +--- +source: crates/biome_css_parser/tests/spec_test.rs +assertion_line: 208 +expression: snapshot +--- + +## Input + +```css +$foo: ( + (key1): (value-1-0), + key2: value-2-0, + (key6): (value-6-0), + key-3-0 key-3-1 key-3-2: value-3-0 value-3-1 value-3-2, + key4: (value-4-0, value-4-1, value-4-2), + key5: (key-5-0: value-5-1), + (key-7-0: key-7-1): (value-7-0: value-7-1), + (key-8-0, key-8-1, key-8-2): (value-8-0, value-8-1, value-8-2), +); + +div { + foo: map-get((foo: 1, bar: 2), foo); + foo: map-get((foo: 1, bar: 2), bar); + foo: map-get((foo: 1, bar: 2), baz); + foo: map-get((), foo); + foo: map-get($foo, (key-5-0: value-5-1)); + foo: map-get($foo, (key2)); + foo: map-get($foo, (key-3-0 key-3-1 key-3-2)); +} + + + + + +``` + + +## AST + +``` +CssRoot { + bom_token: missing (optional), + items: CssRootItemList [ + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@0..1 "$" [] [], + name: CssIdentifier { + value_token: IDENT@1..4 "foo" [] [], + }, + }, + colon_token: COLON@4..6 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@6..7 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@7..11 "(" [Newline("\n"), Whitespace(" ")] [], + expression: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@11..15 "key1" [] [], + }, + ], + }, + r_paren_token: R_PAREN@15..16 ")" [] [], + }, + ], + }, + colon_token: COLON@16..18 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@18..19 "(" [] [], + expression: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@19..28 "value-1-0" [] [], + }, + ], + }, + r_paren_token: R_PAREN@28..29 ")" [] [], + }, + ], + }, + }, + COMMA@29..30 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@30..37 "key2" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@37..39 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@39..48 "value-2-0" [] [], + }, + ], + }, + }, + COMMA@48..49 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@49..53 "(" [Newline("\n"), Whitespace(" ")] [], + expression: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@53..57 "key6" [] [], + }, + ], + }, + r_paren_token: R_PAREN@57..58 ")" [] [], + }, + ], + }, + colon_token: COLON@58..60 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@60..61 "(" [] [], + expression: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@61..70 "value-6-0" [] [], + }, + ], + }, + r_paren_token: R_PAREN@70..71 ")" [] [], + }, + ], + }, + }, + COMMA@71..72 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@72..83 "key-3-0" [Newline("\n"), Whitespace(" ")] [Whitespace(" ")], + }, + CssIdentifier { + value_token: IDENT@83..91 "key-3-1" [] [Whitespace(" ")], + }, + CssIdentifier { + value_token: IDENT@91..98 "key-3-2" [] [], + }, + ], + }, + colon_token: COLON@98..100 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@100..110 "value-3-0" [] [Whitespace(" ")], + }, + CssIdentifier { + value_token: IDENT@110..120 "value-3-1" [] [Whitespace(" ")], + }, + CssIdentifier { + value_token: IDENT@120..129 "value-3-2" [] [], + }, + ], + }, + }, + COMMA@129..130 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@130..137 "key4" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@137..139 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@139..140 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@140..149 "value-4-0" [] [], + }, + ], + }, + }, + COMMA@149..151 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@151..160 "value-4-1" [] [], + }, + ], + }, + }, + COMMA@160..162 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@162..171 "value-4-2" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@171..172 ")" [] [], + }, + ], + }, + }, + COMMA@172..173 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@173..180 "key5" [Newline("\n"), Whitespace(" ")] [], + }, + ], + }, + colon_token: COLON@180..182 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@182..183 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@183..190 "key-5-0" [] [], + }, + ], + }, + colon_token: COLON@190..192 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@192..201 "value-5-1" [] [], + }, + ], + }, + }, + ], + r_paren_token: R_PAREN@201..202 ")" [] [], + }, + ], + }, + }, + COMMA@202..203 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@203..207 "(" [Newline("\n"), Whitespace(" ")] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@207..214 "key-7-0" [] [], + }, + ], + }, + colon_token: COLON@214..216 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@216..223 "key-7-1" [] [], + }, + ], + }, + }, + ], + r_paren_token: R_PAREN@223..224 ")" [] [], + }, + ], + }, + colon_token: COLON@224..226 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@226..227 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@227..236 "value-7-0" [] [], + }, + ], + }, + colon_token: COLON@236..238 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@238..247 "value-7-1" [] [], + }, + ], + }, + }, + ], + r_paren_token: R_PAREN@247..248 ")" [] [], + }, + ], + }, + }, + COMMA@248..249 "," [] [], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@249..253 "(" [Newline("\n"), Whitespace(" ")] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@253..260 "key-8-0" [] [], + }, + ], + }, + }, + COMMA@260..262 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@262..269 "key-8-1" [] [], + }, + ], + }, + }, + COMMA@269..271 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@271..278 "key-8-2" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@278..279 ")" [] [], + }, + ], + }, + colon_token: COLON@279..281 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@281..282 "(" [] [], + expression: ScssListExpression { + elements: ScssListExpressionElementList [ + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@282..291 "value-8-0" [] [], + }, + ], + }, + }, + COMMA@291..293 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@293..302 "value-8-1" [] [], + }, + ], + }, + }, + COMMA@302..304 "," [] [Whitespace(" ")], + ScssListExpressionElement { + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@304..313 "value-8-2" [] [], + }, + ], + }, + }, + ], + }, + r_paren_token: R_PAREN@313..314 ")" [] [], + }, + ], + }, + }, + COMMA@314..315 "," [] [], + ], + r_paren_token: R_PAREN@315..317 ")" [Newline("\n")] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@317..318 ";" [] [], + }, + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: CssTypeSelector { + namespace: missing (optional), + ident: CssIdentifier { + value_token: IDENT@318..324 "div" [Newline("\n"), Newline("\n")] [Whitespace(" ")], + }, + }, + sub_selectors: CssSubSelectorList [], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@324..325 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@325..331 "foo" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@331..333 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@333..340 "map-get" [] [], + }, + l_paren_token: L_PAREN@340..341 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@341..342 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@342..345 "foo" [] [], + }, + ], + }, + colon_token: COLON@345..347 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@347..348 "1" [] [], + }, + ], + }, + }, + COMMA@348..350 "," [] [Whitespace(" ")], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@350..353 "bar" [] [], + }, + ], + }, + colon_token: COLON@353..355 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@355..356 "2" [] [], + }, + ], + }, + }, + ], + r_paren_token: R_PAREN@356..357 ")" [] [], + }, + ], + }, + COMMA@357..359 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@359..362 "foo" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@362..363 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@363..364 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@364..370 "foo" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@370..372 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@372..379 "map-get" [] [], + }, + l_paren_token: L_PAREN@379..380 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@380..381 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@381..384 "foo" [] [], + }, + ], + }, + colon_token: COLON@384..386 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@386..387 "1" [] [], + }, + ], + }, + }, + COMMA@387..389 "," [] [Whitespace(" ")], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@389..392 "bar" [] [], + }, + ], + }, + colon_token: COLON@392..394 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@394..395 "2" [] [], + }, + ], + }, + }, + ], + r_paren_token: R_PAREN@395..396 ")" [] [], + }, + ], + }, + COMMA@396..398 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@398..401 "bar" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@401..402 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@402..403 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@403..409 "foo" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@409..411 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@411..418 "map-get" [] [], + }, + l_paren_token: L_PAREN@418..419 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@419..420 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@420..423 "foo" [] [], + }, + ], + }, + colon_token: COLON@423..425 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@425..426 "1" [] [], + }, + ], + }, + }, + COMMA@426..428 "," [] [Whitespace(" ")], + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@428..431 "bar" [] [], + }, + ], + }, + colon_token: COLON@431..433 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssNumber { + value_token: CSS_NUMBER_LITERAL@433..434 "2" [] [], + }, + ], + }, + }, + ], + r_paren_token: R_PAREN@434..435 ")" [] [], + }, + ], + }, + COMMA@435..437 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@437..440 "baz" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@440..441 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@441..442 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@442..448 "foo" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@448..450 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@450..457 "map-get" [] [], + }, + l_paren_token: L_PAREN@457..458 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@458..459 "(" [] [], + pairs: ScssMapExpressionPairList [], + r_paren_token: R_PAREN@459..460 ")" [] [], + }, + ], + }, + COMMA@460..462 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@462..465 "foo" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@465..466 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@466..467 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@467..473 "foo" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@473..475 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@475..482 "map-get" [] [], + }, + l_paren_token: L_PAREN@482..483 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssIdentifier { + dollar_token: DOLLAR@483..484 "$" [] [], + name: CssIdentifier { + value_token: IDENT@484..487 "foo" [] [], + }, + }, + ], + }, + COMMA@487..489 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + ScssMapExpression { + l_paren_token: L_PAREN@489..490 "(" [] [], + pairs: ScssMapExpressionPairList [ + ScssMapExpressionPair { + key: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@490..497 "key-5-0" [] [], + }, + ], + }, + colon_token: COLON@497..499 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@499..508 "value-5-1" [] [], + }, + ], + }, + }, + ], + r_paren_token: R_PAREN@508..509 ")" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@509..510 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@510..511 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@511..517 "foo" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@517..519 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@519..526 "map-get" [] [], + }, + l_paren_token: L_PAREN@526..527 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssIdentifier { + dollar_token: DOLLAR@527..528 "$" [] [], + name: CssIdentifier { + value_token: IDENT@528..531 "foo" [] [], + }, + }, + ], + }, + COMMA@531..533 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@533..534 "(" [] [], + expression: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@534..538 "key2" [] [], + }, + ], + }, + r_paren_token: R_PAREN@538..539 ")" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@539..540 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@540..541 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@541..547 "foo" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@547..549 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@549..556 "map-get" [] [], + }, + l_paren_token: L_PAREN@556..557 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + ScssIdentifier { + dollar_token: DOLLAR@557..558 "$" [] [], + name: CssIdentifier { + value_token: IDENT@558..561 "foo" [] [], + }, + }, + ], + }, + COMMA@561..563 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + ScssParenthesizedExpression { + l_paren_token: L_PAREN@563..564 "(" [] [], + expression: ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@564..572 "key-3-0" [] [Whitespace(" ")], + }, + CssIdentifier { + value_token: IDENT@572..580 "key-3-1" [] [Whitespace(" ")], + }, + CssIdentifier { + value_token: IDENT@580..587 "key-3-2" [] [], + }, + ], + }, + r_paren_token: R_PAREN@587..588 ")" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@588..589 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@589..590 ";" [] [], + }, + ], + r_curly_token: R_CURLY@590..592 "}" [Newline("\n")] [], + }, + }, + ], + eof_token: EOF@592..597 "" [Newline("\n"), Newline("\n"), Newline("\n"), Newline("\n"), Newline("\n")] [], +} +``` + +## CST + +``` +0: CSS_ROOT@0..597 + 0: (empty) + 1: CSS_ROOT_ITEM_LIST@0..592 + 0: SCSS_DECLARATION@0..318 + 0: SCSS_IDENTIFIER@0..4 + 0: DOLLAR@0..1 "$" [] [] + 1: CSS_IDENTIFIER@1..4 + 0: IDENT@1..4 "foo" [] [] + 1: COLON@4..6 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@6..317 + 0: SCSS_EXPRESSION_ITEM_LIST@6..317 + 0: SCSS_MAP_EXPRESSION@6..317 + 0: L_PAREN@6..7 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@7..315 + 0: SCSS_MAP_EXPRESSION_PAIR@7..29 + 0: SCSS_EXPRESSION@7..16 + 0: SCSS_EXPRESSION_ITEM_LIST@7..16 + 0: SCSS_PARENTHESIZED_EXPRESSION@7..16 + 0: L_PAREN@7..11 "(" [Newline("\n"), Whitespace(" ")] [] + 1: SCSS_EXPRESSION@11..15 + 0: SCSS_EXPRESSION_ITEM_LIST@11..15 + 0: CSS_IDENTIFIER@11..15 + 0: IDENT@11..15 "key1" [] [] + 2: R_PAREN@15..16 ")" [] [] + 1: COLON@16..18 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@18..29 + 0: SCSS_EXPRESSION_ITEM_LIST@18..29 + 0: SCSS_PARENTHESIZED_EXPRESSION@18..29 + 0: L_PAREN@18..19 "(" [] [] + 1: SCSS_EXPRESSION@19..28 + 0: SCSS_EXPRESSION_ITEM_LIST@19..28 + 0: CSS_IDENTIFIER@19..28 + 0: IDENT@19..28 "value-1-0" [] [] + 2: R_PAREN@28..29 ")" [] [] + 1: COMMA@29..30 "," [] [] + 2: SCSS_MAP_EXPRESSION_PAIR@30..48 + 0: SCSS_EXPRESSION@30..37 + 0: SCSS_EXPRESSION_ITEM_LIST@30..37 + 0: CSS_IDENTIFIER@30..37 + 0: IDENT@30..37 "key2" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@37..39 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@39..48 + 0: SCSS_EXPRESSION_ITEM_LIST@39..48 + 0: CSS_IDENTIFIER@39..48 + 0: IDENT@39..48 "value-2-0" [] [] + 3: COMMA@48..49 "," [] [] + 4: SCSS_MAP_EXPRESSION_PAIR@49..71 + 0: SCSS_EXPRESSION@49..58 + 0: SCSS_EXPRESSION_ITEM_LIST@49..58 + 0: SCSS_PARENTHESIZED_EXPRESSION@49..58 + 0: L_PAREN@49..53 "(" [Newline("\n"), Whitespace(" ")] [] + 1: SCSS_EXPRESSION@53..57 + 0: SCSS_EXPRESSION_ITEM_LIST@53..57 + 0: CSS_IDENTIFIER@53..57 + 0: IDENT@53..57 "key6" [] [] + 2: R_PAREN@57..58 ")" [] [] + 1: COLON@58..60 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@60..71 + 0: SCSS_EXPRESSION_ITEM_LIST@60..71 + 0: SCSS_PARENTHESIZED_EXPRESSION@60..71 + 0: L_PAREN@60..61 "(" [] [] + 1: SCSS_EXPRESSION@61..70 + 0: SCSS_EXPRESSION_ITEM_LIST@61..70 + 0: CSS_IDENTIFIER@61..70 + 0: IDENT@61..70 "value-6-0" [] [] + 2: R_PAREN@70..71 ")" [] [] + 5: COMMA@71..72 "," [] [] + 6: SCSS_MAP_EXPRESSION_PAIR@72..129 + 0: SCSS_EXPRESSION@72..98 + 0: SCSS_EXPRESSION_ITEM_LIST@72..98 + 0: CSS_IDENTIFIER@72..83 + 0: IDENT@72..83 "key-3-0" [Newline("\n"), Whitespace(" ")] [Whitespace(" ")] + 1: CSS_IDENTIFIER@83..91 + 0: IDENT@83..91 "key-3-1" [] [Whitespace(" ")] + 2: CSS_IDENTIFIER@91..98 + 0: IDENT@91..98 "key-3-2" [] [] + 1: COLON@98..100 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@100..129 + 0: SCSS_EXPRESSION_ITEM_LIST@100..129 + 0: CSS_IDENTIFIER@100..110 + 0: IDENT@100..110 "value-3-0" [] [Whitespace(" ")] + 1: CSS_IDENTIFIER@110..120 + 0: IDENT@110..120 "value-3-1" [] [Whitespace(" ")] + 2: CSS_IDENTIFIER@120..129 + 0: IDENT@120..129 "value-3-2" [] [] + 7: COMMA@129..130 "," [] [] + 8: SCSS_MAP_EXPRESSION_PAIR@130..172 + 0: SCSS_EXPRESSION@130..137 + 0: SCSS_EXPRESSION_ITEM_LIST@130..137 + 0: CSS_IDENTIFIER@130..137 + 0: IDENT@130..137 "key4" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@137..139 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@139..172 + 0: SCSS_EXPRESSION_ITEM_LIST@139..172 + 0: SCSS_PARENTHESIZED_EXPRESSION@139..172 + 0: L_PAREN@139..140 "(" [] [] + 1: SCSS_LIST_EXPRESSION@140..171 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@140..171 + 0: SCSS_LIST_EXPRESSION_ELEMENT@140..149 + 0: SCSS_EXPRESSION@140..149 + 0: SCSS_EXPRESSION_ITEM_LIST@140..149 + 0: CSS_IDENTIFIER@140..149 + 0: IDENT@140..149 "value-4-0" [] [] + 1: COMMA@149..151 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@151..160 + 0: SCSS_EXPRESSION@151..160 + 0: SCSS_EXPRESSION_ITEM_LIST@151..160 + 0: CSS_IDENTIFIER@151..160 + 0: IDENT@151..160 "value-4-1" [] [] + 3: COMMA@160..162 "," [] [Whitespace(" ")] + 4: SCSS_LIST_EXPRESSION_ELEMENT@162..171 + 0: SCSS_EXPRESSION@162..171 + 0: SCSS_EXPRESSION_ITEM_LIST@162..171 + 0: CSS_IDENTIFIER@162..171 + 0: IDENT@162..171 "value-4-2" [] [] + 2: R_PAREN@171..172 ")" [] [] + 9: COMMA@172..173 "," [] [] + 10: SCSS_MAP_EXPRESSION_PAIR@173..202 + 0: SCSS_EXPRESSION@173..180 + 0: SCSS_EXPRESSION_ITEM_LIST@173..180 + 0: CSS_IDENTIFIER@173..180 + 0: IDENT@173..180 "key5" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@180..182 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@182..202 + 0: SCSS_EXPRESSION_ITEM_LIST@182..202 + 0: SCSS_MAP_EXPRESSION@182..202 + 0: L_PAREN@182..183 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@183..201 + 0: SCSS_MAP_EXPRESSION_PAIR@183..201 + 0: SCSS_EXPRESSION@183..190 + 0: SCSS_EXPRESSION_ITEM_LIST@183..190 + 0: CSS_IDENTIFIER@183..190 + 0: IDENT@183..190 "key-5-0" [] [] + 1: COLON@190..192 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@192..201 + 0: SCSS_EXPRESSION_ITEM_LIST@192..201 + 0: CSS_IDENTIFIER@192..201 + 0: IDENT@192..201 "value-5-1" [] [] + 2: R_PAREN@201..202 ")" [] [] + 11: COMMA@202..203 "," [] [] + 12: SCSS_MAP_EXPRESSION_PAIR@203..248 + 0: SCSS_EXPRESSION@203..224 + 0: SCSS_EXPRESSION_ITEM_LIST@203..224 + 0: SCSS_MAP_EXPRESSION@203..224 + 0: L_PAREN@203..207 "(" [Newline("\n"), Whitespace(" ")] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@207..223 + 0: SCSS_MAP_EXPRESSION_PAIR@207..223 + 0: SCSS_EXPRESSION@207..214 + 0: SCSS_EXPRESSION_ITEM_LIST@207..214 + 0: CSS_IDENTIFIER@207..214 + 0: IDENT@207..214 "key-7-0" [] [] + 1: COLON@214..216 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@216..223 + 0: SCSS_EXPRESSION_ITEM_LIST@216..223 + 0: CSS_IDENTIFIER@216..223 + 0: IDENT@216..223 "key-7-1" [] [] + 2: R_PAREN@223..224 ")" [] [] + 1: COLON@224..226 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@226..248 + 0: SCSS_EXPRESSION_ITEM_LIST@226..248 + 0: SCSS_MAP_EXPRESSION@226..248 + 0: L_PAREN@226..227 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@227..247 + 0: SCSS_MAP_EXPRESSION_PAIR@227..247 + 0: SCSS_EXPRESSION@227..236 + 0: SCSS_EXPRESSION_ITEM_LIST@227..236 + 0: CSS_IDENTIFIER@227..236 + 0: IDENT@227..236 "value-7-0" [] [] + 1: COLON@236..238 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@238..247 + 0: SCSS_EXPRESSION_ITEM_LIST@238..247 + 0: CSS_IDENTIFIER@238..247 + 0: IDENT@238..247 "value-7-1" [] [] + 2: R_PAREN@247..248 ")" [] [] + 13: COMMA@248..249 "," [] [] + 14: SCSS_MAP_EXPRESSION_PAIR@249..314 + 0: SCSS_EXPRESSION@249..279 + 0: SCSS_EXPRESSION_ITEM_LIST@249..279 + 0: SCSS_PARENTHESIZED_EXPRESSION@249..279 + 0: L_PAREN@249..253 "(" [Newline("\n"), Whitespace(" ")] [] + 1: SCSS_LIST_EXPRESSION@253..278 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@253..278 + 0: SCSS_LIST_EXPRESSION_ELEMENT@253..260 + 0: SCSS_EXPRESSION@253..260 + 0: SCSS_EXPRESSION_ITEM_LIST@253..260 + 0: CSS_IDENTIFIER@253..260 + 0: IDENT@253..260 "key-8-0" [] [] + 1: COMMA@260..262 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@262..269 + 0: SCSS_EXPRESSION@262..269 + 0: SCSS_EXPRESSION_ITEM_LIST@262..269 + 0: CSS_IDENTIFIER@262..269 + 0: IDENT@262..269 "key-8-1" [] [] + 3: COMMA@269..271 "," [] [Whitespace(" ")] + 4: SCSS_LIST_EXPRESSION_ELEMENT@271..278 + 0: SCSS_EXPRESSION@271..278 + 0: SCSS_EXPRESSION_ITEM_LIST@271..278 + 0: CSS_IDENTIFIER@271..278 + 0: IDENT@271..278 "key-8-2" [] [] + 2: R_PAREN@278..279 ")" [] [] + 1: COLON@279..281 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@281..314 + 0: SCSS_EXPRESSION_ITEM_LIST@281..314 + 0: SCSS_PARENTHESIZED_EXPRESSION@281..314 + 0: L_PAREN@281..282 "(" [] [] + 1: SCSS_LIST_EXPRESSION@282..313 + 0: SCSS_LIST_EXPRESSION_ELEMENT_LIST@282..313 + 0: SCSS_LIST_EXPRESSION_ELEMENT@282..291 + 0: SCSS_EXPRESSION@282..291 + 0: SCSS_EXPRESSION_ITEM_LIST@282..291 + 0: CSS_IDENTIFIER@282..291 + 0: IDENT@282..291 "value-8-0" [] [] + 1: COMMA@291..293 "," [] [Whitespace(" ")] + 2: SCSS_LIST_EXPRESSION_ELEMENT@293..302 + 0: SCSS_EXPRESSION@293..302 + 0: SCSS_EXPRESSION_ITEM_LIST@293..302 + 0: CSS_IDENTIFIER@293..302 + 0: IDENT@293..302 "value-8-1" [] [] + 3: COMMA@302..304 "," [] [Whitespace(" ")] + 4: SCSS_LIST_EXPRESSION_ELEMENT@304..313 + 0: SCSS_EXPRESSION@304..313 + 0: SCSS_EXPRESSION_ITEM_LIST@304..313 + 0: CSS_IDENTIFIER@304..313 + 0: IDENT@304..313 "value-8-2" [] [] + 2: R_PAREN@313..314 ")" [] [] + 15: COMMA@314..315 "," [] [] + 2: R_PAREN@315..317 ")" [Newline("\n")] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@317..317 + 4: SEMICOLON@317..318 ";" [] [] + 1: CSS_QUALIFIED_RULE@318..592 + 0: CSS_SELECTOR_LIST@318..324 + 0: CSS_COMPOUND_SELECTOR@318..324 + 0: CSS_NESTED_SELECTOR_LIST@318..318 + 1: CSS_TYPE_SELECTOR@318..324 + 0: (empty) + 1: CSS_IDENTIFIER@318..324 + 0: IDENT@318..324 "div" [Newline("\n"), Newline("\n")] [Whitespace(" ")] + 2: CSS_SUB_SELECTOR_LIST@324..324 + 1: CSS_DECLARATION_OR_RULE_BLOCK@324..592 + 0: L_CURLY@324..325 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@325..590 + 0: CSS_DECLARATION_WITH_SEMICOLON@325..364 + 0: CSS_DECLARATION@325..363 + 0: CSS_GENERIC_PROPERTY@325..363 + 0: CSS_IDENTIFIER@325..331 + 0: IDENT@325..331 "foo" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@331..333 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@333..363 + 0: SCSS_EXPRESSION_ITEM_LIST@333..363 + 0: CSS_FUNCTION@333..363 + 0: CSS_IDENTIFIER@333..340 + 0: IDENT@333..340 "map-get" [] [] + 1: L_PAREN@340..341 "(" [] [] + 2: CSS_PARAMETER_LIST@341..362 + 0: SCSS_EXPRESSION@341..357 + 0: SCSS_EXPRESSION_ITEM_LIST@341..357 + 0: SCSS_MAP_EXPRESSION@341..357 + 0: L_PAREN@341..342 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@342..356 + 0: SCSS_MAP_EXPRESSION_PAIR@342..348 + 0: SCSS_EXPRESSION@342..345 + 0: SCSS_EXPRESSION_ITEM_LIST@342..345 + 0: CSS_IDENTIFIER@342..345 + 0: IDENT@342..345 "foo" [] [] + 1: COLON@345..347 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@347..348 + 0: SCSS_EXPRESSION_ITEM_LIST@347..348 + 0: CSS_NUMBER@347..348 + 0: CSS_NUMBER_LITERAL@347..348 "1" [] [] + 1: COMMA@348..350 "," [] [Whitespace(" ")] + 2: SCSS_MAP_EXPRESSION_PAIR@350..356 + 0: SCSS_EXPRESSION@350..353 + 0: SCSS_EXPRESSION_ITEM_LIST@350..353 + 0: CSS_IDENTIFIER@350..353 + 0: IDENT@350..353 "bar" [] [] + 1: COLON@353..355 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@355..356 + 0: SCSS_EXPRESSION_ITEM_LIST@355..356 + 0: CSS_NUMBER@355..356 + 0: CSS_NUMBER_LITERAL@355..356 "2" [] [] + 2: R_PAREN@356..357 ")" [] [] + 1: COMMA@357..359 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@359..362 + 0: SCSS_EXPRESSION_ITEM_LIST@359..362 + 0: CSS_IDENTIFIER@359..362 + 0: IDENT@359..362 "foo" [] [] + 3: R_PAREN@362..363 ")" [] [] + 1: (empty) + 1: SEMICOLON@363..364 ";" [] [] + 1: CSS_DECLARATION_WITH_SEMICOLON@364..403 + 0: CSS_DECLARATION@364..402 + 0: CSS_GENERIC_PROPERTY@364..402 + 0: CSS_IDENTIFIER@364..370 + 0: IDENT@364..370 "foo" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@370..372 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@372..402 + 0: SCSS_EXPRESSION_ITEM_LIST@372..402 + 0: CSS_FUNCTION@372..402 + 0: CSS_IDENTIFIER@372..379 + 0: IDENT@372..379 "map-get" [] [] + 1: L_PAREN@379..380 "(" [] [] + 2: CSS_PARAMETER_LIST@380..401 + 0: SCSS_EXPRESSION@380..396 + 0: SCSS_EXPRESSION_ITEM_LIST@380..396 + 0: SCSS_MAP_EXPRESSION@380..396 + 0: L_PAREN@380..381 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@381..395 + 0: SCSS_MAP_EXPRESSION_PAIR@381..387 + 0: SCSS_EXPRESSION@381..384 + 0: SCSS_EXPRESSION_ITEM_LIST@381..384 + 0: CSS_IDENTIFIER@381..384 + 0: IDENT@381..384 "foo" [] [] + 1: COLON@384..386 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@386..387 + 0: SCSS_EXPRESSION_ITEM_LIST@386..387 + 0: CSS_NUMBER@386..387 + 0: CSS_NUMBER_LITERAL@386..387 "1" [] [] + 1: COMMA@387..389 "," [] [Whitespace(" ")] + 2: SCSS_MAP_EXPRESSION_PAIR@389..395 + 0: SCSS_EXPRESSION@389..392 + 0: SCSS_EXPRESSION_ITEM_LIST@389..392 + 0: CSS_IDENTIFIER@389..392 + 0: IDENT@389..392 "bar" [] [] + 1: COLON@392..394 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@394..395 + 0: SCSS_EXPRESSION_ITEM_LIST@394..395 + 0: CSS_NUMBER@394..395 + 0: CSS_NUMBER_LITERAL@394..395 "2" [] [] + 2: R_PAREN@395..396 ")" [] [] + 1: COMMA@396..398 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@398..401 + 0: SCSS_EXPRESSION_ITEM_LIST@398..401 + 0: CSS_IDENTIFIER@398..401 + 0: IDENT@398..401 "bar" [] [] + 3: R_PAREN@401..402 ")" [] [] + 1: (empty) + 1: SEMICOLON@402..403 ";" [] [] + 2: CSS_DECLARATION_WITH_SEMICOLON@403..442 + 0: CSS_DECLARATION@403..441 + 0: CSS_GENERIC_PROPERTY@403..441 + 0: CSS_IDENTIFIER@403..409 + 0: IDENT@403..409 "foo" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@409..411 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@411..441 + 0: SCSS_EXPRESSION_ITEM_LIST@411..441 + 0: CSS_FUNCTION@411..441 + 0: CSS_IDENTIFIER@411..418 + 0: IDENT@411..418 "map-get" [] [] + 1: L_PAREN@418..419 "(" [] [] + 2: CSS_PARAMETER_LIST@419..440 + 0: SCSS_EXPRESSION@419..435 + 0: SCSS_EXPRESSION_ITEM_LIST@419..435 + 0: SCSS_MAP_EXPRESSION@419..435 + 0: L_PAREN@419..420 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@420..434 + 0: SCSS_MAP_EXPRESSION_PAIR@420..426 + 0: SCSS_EXPRESSION@420..423 + 0: SCSS_EXPRESSION_ITEM_LIST@420..423 + 0: CSS_IDENTIFIER@420..423 + 0: IDENT@420..423 "foo" [] [] + 1: COLON@423..425 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@425..426 + 0: SCSS_EXPRESSION_ITEM_LIST@425..426 + 0: CSS_NUMBER@425..426 + 0: CSS_NUMBER_LITERAL@425..426 "1" [] [] + 1: COMMA@426..428 "," [] [Whitespace(" ")] + 2: SCSS_MAP_EXPRESSION_PAIR@428..434 + 0: SCSS_EXPRESSION@428..431 + 0: SCSS_EXPRESSION_ITEM_LIST@428..431 + 0: CSS_IDENTIFIER@428..431 + 0: IDENT@428..431 "bar" [] [] + 1: COLON@431..433 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@433..434 + 0: SCSS_EXPRESSION_ITEM_LIST@433..434 + 0: CSS_NUMBER@433..434 + 0: CSS_NUMBER_LITERAL@433..434 "2" [] [] + 2: R_PAREN@434..435 ")" [] [] + 1: COMMA@435..437 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@437..440 + 0: SCSS_EXPRESSION_ITEM_LIST@437..440 + 0: CSS_IDENTIFIER@437..440 + 0: IDENT@437..440 "baz" [] [] + 3: R_PAREN@440..441 ")" [] [] + 1: (empty) + 1: SEMICOLON@441..442 ";" [] [] + 3: CSS_DECLARATION_WITH_SEMICOLON@442..467 + 0: CSS_DECLARATION@442..466 + 0: CSS_GENERIC_PROPERTY@442..466 + 0: CSS_IDENTIFIER@442..448 + 0: IDENT@442..448 "foo" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@448..450 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@450..466 + 0: SCSS_EXPRESSION_ITEM_LIST@450..466 + 0: CSS_FUNCTION@450..466 + 0: CSS_IDENTIFIER@450..457 + 0: IDENT@450..457 "map-get" [] [] + 1: L_PAREN@457..458 "(" [] [] + 2: CSS_PARAMETER_LIST@458..465 + 0: SCSS_EXPRESSION@458..460 + 0: SCSS_EXPRESSION_ITEM_LIST@458..460 + 0: SCSS_MAP_EXPRESSION@458..460 + 0: L_PAREN@458..459 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@459..459 + 2: R_PAREN@459..460 ")" [] [] + 1: COMMA@460..462 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@462..465 + 0: SCSS_EXPRESSION_ITEM_LIST@462..465 + 0: CSS_IDENTIFIER@462..465 + 0: IDENT@462..465 "foo" [] [] + 3: R_PAREN@465..466 ")" [] [] + 1: (empty) + 1: SEMICOLON@466..467 ";" [] [] + 4: CSS_DECLARATION_WITH_SEMICOLON@467..511 + 0: CSS_DECLARATION@467..510 + 0: CSS_GENERIC_PROPERTY@467..510 + 0: CSS_IDENTIFIER@467..473 + 0: IDENT@467..473 "foo" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@473..475 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@475..510 + 0: SCSS_EXPRESSION_ITEM_LIST@475..510 + 0: CSS_FUNCTION@475..510 + 0: CSS_IDENTIFIER@475..482 + 0: IDENT@475..482 "map-get" [] [] + 1: L_PAREN@482..483 "(" [] [] + 2: CSS_PARAMETER_LIST@483..509 + 0: SCSS_EXPRESSION@483..487 + 0: SCSS_EXPRESSION_ITEM_LIST@483..487 + 0: SCSS_IDENTIFIER@483..487 + 0: DOLLAR@483..484 "$" [] [] + 1: CSS_IDENTIFIER@484..487 + 0: IDENT@484..487 "foo" [] [] + 1: COMMA@487..489 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@489..509 + 0: SCSS_EXPRESSION_ITEM_LIST@489..509 + 0: SCSS_MAP_EXPRESSION@489..509 + 0: L_PAREN@489..490 "(" [] [] + 1: SCSS_MAP_EXPRESSION_PAIR_LIST@490..508 + 0: SCSS_MAP_EXPRESSION_PAIR@490..508 + 0: SCSS_EXPRESSION@490..497 + 0: SCSS_EXPRESSION_ITEM_LIST@490..497 + 0: CSS_IDENTIFIER@490..497 + 0: IDENT@490..497 "key-5-0" [] [] + 1: COLON@497..499 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@499..508 + 0: SCSS_EXPRESSION_ITEM_LIST@499..508 + 0: CSS_IDENTIFIER@499..508 + 0: IDENT@499..508 "value-5-1" [] [] + 2: R_PAREN@508..509 ")" [] [] + 3: R_PAREN@509..510 ")" [] [] + 1: (empty) + 1: SEMICOLON@510..511 ";" [] [] + 5: CSS_DECLARATION_WITH_SEMICOLON@511..541 + 0: CSS_DECLARATION@511..540 + 0: CSS_GENERIC_PROPERTY@511..540 + 0: CSS_IDENTIFIER@511..517 + 0: IDENT@511..517 "foo" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@517..519 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@519..540 + 0: SCSS_EXPRESSION_ITEM_LIST@519..540 + 0: CSS_FUNCTION@519..540 + 0: CSS_IDENTIFIER@519..526 + 0: IDENT@519..526 "map-get" [] [] + 1: L_PAREN@526..527 "(" [] [] + 2: CSS_PARAMETER_LIST@527..539 + 0: SCSS_EXPRESSION@527..531 + 0: SCSS_EXPRESSION_ITEM_LIST@527..531 + 0: SCSS_IDENTIFIER@527..531 + 0: DOLLAR@527..528 "$" [] [] + 1: CSS_IDENTIFIER@528..531 + 0: IDENT@528..531 "foo" [] [] + 1: COMMA@531..533 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@533..539 + 0: SCSS_EXPRESSION_ITEM_LIST@533..539 + 0: SCSS_PARENTHESIZED_EXPRESSION@533..539 + 0: L_PAREN@533..534 "(" [] [] + 1: SCSS_EXPRESSION@534..538 + 0: SCSS_EXPRESSION_ITEM_LIST@534..538 + 0: CSS_IDENTIFIER@534..538 + 0: IDENT@534..538 "key2" [] [] + 2: R_PAREN@538..539 ")" [] [] + 3: R_PAREN@539..540 ")" [] [] + 1: (empty) + 1: SEMICOLON@540..541 ";" [] [] + 6: CSS_DECLARATION_WITH_SEMICOLON@541..590 + 0: CSS_DECLARATION@541..589 + 0: CSS_GENERIC_PROPERTY@541..589 + 0: CSS_IDENTIFIER@541..547 + 0: IDENT@541..547 "foo" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@547..549 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@549..589 + 0: SCSS_EXPRESSION_ITEM_LIST@549..589 + 0: CSS_FUNCTION@549..589 + 0: CSS_IDENTIFIER@549..556 + 0: IDENT@549..556 "map-get" [] [] + 1: L_PAREN@556..557 "(" [] [] + 2: CSS_PARAMETER_LIST@557..588 + 0: SCSS_EXPRESSION@557..561 + 0: SCSS_EXPRESSION_ITEM_LIST@557..561 + 0: SCSS_IDENTIFIER@557..561 + 0: DOLLAR@557..558 "$" [] [] + 1: CSS_IDENTIFIER@558..561 + 0: IDENT@558..561 "foo" [] [] + 1: COMMA@561..563 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@563..588 + 0: SCSS_EXPRESSION_ITEM_LIST@563..588 + 0: SCSS_PARENTHESIZED_EXPRESSION@563..588 + 0: L_PAREN@563..564 "(" [] [] + 1: SCSS_EXPRESSION@564..587 + 0: SCSS_EXPRESSION_ITEM_LIST@564..587 + 0: CSS_IDENTIFIER@564..572 + 0: IDENT@564..572 "key-3-0" [] [Whitespace(" ")] + 1: CSS_IDENTIFIER@572..580 + 0: IDENT@572..580 "key-3-1" [] [Whitespace(" ")] + 2: CSS_IDENTIFIER@580..587 + 0: IDENT@580..587 "key-3-2" [] [] + 2: R_PAREN@587..588 ")" [] [] + 3: R_PAREN@588..589 ")" [] [] + 1: (empty) + 1: SEMICOLON@589..590 ";" [] [] + 2: R_CURLY@590..592 "}" [Newline("\n")] [] + 2: EOF@592..597 "" [Newline("\n"), Newline("\n"), Newline("\n"), Newline("\n"), Newline("\n")] [] + +``` diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/url.scss b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/url.scss new file mode 100644 index 000000000000..55492afcda31 --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/url.scss @@ -0,0 +1,24 @@ +div { + foo: url(bloo/blah.css); + bar: url(http://foo/bar/hux.css); + // TODO(interpolation support): foo: url(fudge#{$x}.css); + // TODO(interpolation support): bar: url("http://fudge#{$x}/styles.css"); + // TODO(interpolation support): hux: url(http://box_#{$y}////fudge#{$x}.css); + // TODO(interpolation support): gloo: url("hey#{1+2}.css"); + // TODO(interpolation support): floo: url(hadoop-#{$y+321}.css); + flum: image-url("fudge.png", hux); + $bg: "image.png"; + // TODO(interpolation support): background: url("#{$bg}"); + mudge: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAACeElEQVR42nySy29McRTHP/fOnTvT6bQNrdHKMGGhFkTSELGxwoJY8Q9YWFhYEUJsRSKCsJWikjYSJBIbinpVPJLSRlEkKK2WTnXmvl+/Y4F4tPVJPqtvzjcnJ0cTEQxdY/miFH6gcAJpaWrQl86t05rR9axSKD8UZ6KqJscm5bMdyDDgAYgIBoCORm2G1u0b6w8unJ/bmDG1QtpUmIYiZ8Zk0zEpYmW76tujV9J3/Ep04v0XdR2IDYAdWxYt27Sa8/l8btWIlaYSupgqpNaMUYbC0DUa8qKXWpLGNSvZEETpZO/Z4B5gGQCRMio1xdVfioUIa3AQJ/ZARWhJgkQJKq3wfJ3RwETGhRtPgx7ABtBEhCVNBqViU2tn5+5bLfXmgurIYwJrGFEJmqZh2T4jo2X0YIreZ+7dfeejrcCEiKADfCon3O4fHzp25Nx+8nnqF65lXnEphQUtNBYKaKkMcRgxVY29093JUWCCn+gAORMaTLh0dbCjo/1KO3X1kC6BGIR+QLVioSc+F+9HnW/G1DX+QAcw0j8c/QaHj3UfeN0/MMicEmSL+J5P6DkMDUcfLvZGJ4FwWoHl/lAEXo344zv3dO3ynXJIpg7XdnBtj46bwSnblwH+QQdQ8lsNeNg32nOm/fIh3CGS0OXOQHCv90XYwUyICM2NNX85f26WUnOu5smFzX0vu9qktZjeNtusAbB+XdvfAWDZnjeurX2XST1Y8X6s7zmzYABUrHBaYNshYRC4k340FcZU/1vg2JVpgeP4uJXypHK8soD134In/W+mb+AJvffvvC022It/ve1MaCJCXU6f4UCQy1CbNVONH7/Gw7Md8fsAtddMUh5fveYAAAAASUVORK5CYII=); + nudge: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGElEQVQYV2N4DwX/oYBhgARgDJjEAAkAAEC99wFuu0VFAAAAAElFTkSuQmCC); + pudge: url(http://wiki.jbussdieker.name/skins/common/images/Checker-16x16.png?2012-05-02T13:40:00Z); + // TODO(interpolation support): trailing-spaces: url(a#{b}c ); + expr1: url(join-url("..", "image.png")); + expr2: url(1 + 2); + // TODO(interpolation support): expr3: url(a#{b}"c"); +} + +// TODO(interpolation support): @import url(//fonts.googleapis.com/css?family=#{get-font-family( + + + diff --git a/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/url.scss.snap b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/url.scss.snap new file mode 100644 index 000000000000..81c3d6f349ec --- /dev/null +++ b/crates/biome_css_parser/tests/css_test_suite/ok/scss/value/url.scss.snap @@ -0,0 +1,516 @@ +--- +source: crates/biome_css_parser/tests/spec_test.rs +assertion_line: 208 +expression: snapshot +--- + +## Input + +```css +div { + foo: url(bloo/blah.css); + bar: url(http://foo/bar/hux.css); + // TODO(interpolation support): foo: url(fudge#{$x}.css); + // TODO(interpolation support): bar: url("http://fudge#{$x}/styles.css"); + // TODO(interpolation support): hux: url(http://box_#{$y}////fudge#{$x}.css); + // TODO(interpolation support): gloo: url("hey#{1+2}.css"); + // TODO(interpolation support): floo: url(hadoop-#{$y+321}.css); + flum: image-url("fudge.png", hux); + $bg: "image.png"; + // TODO(interpolation support): background: url("#{$bg}"); + mudge: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAACeElEQVR42nySy29McRTHP/fOnTvT6bQNrdHKMGGhFkTSELGxwoJY8Q9YWFhYEUJsRSKCsJWikjYSJBIbinpVPJLSRlEkKK2WTnXmvl+/Y4F4tPVJPqtvzjcnJ0cTEQxdY/miFH6gcAJpaWrQl86t05rR9axSKD8UZ6KqJscm5bMdyDDgAYgIBoCORm2G1u0b6w8unJ/bmDG1QtpUmIYiZ8Zk0zEpYmW76tujV9J3/Ep04v0XdR2IDYAdWxYt27Sa8/l8btWIlaYSupgqpNaMUYbC0DUa8qKXWpLGNSvZEETpZO/Z4B5gGQCRMio1xdVfioUIa3AQJ/ZARWhJgkQJKq3wfJ3RwETGhRtPgx7ABtBEhCVNBqViU2tn5+5bLfXmgurIYwJrGFEJmqZh2T4jo2X0YIreZ+7dfeejrcCEiKADfCon3O4fHzp25Nx+8nnqF65lXnEphQUtNBYKaKkMcRgxVY29093JUWCCn+gAORMaTLh0dbCjo/1KO3X1kC6BGIR+QLVioSc+F+9HnW/G1DX+QAcw0j8c/QaHj3UfeN0/MMicEmSL+J5P6DkMDUcfLvZGJ4FwWoHl/lAEXo344zv3dO3ynXJIpg7XdnBtj46bwSnblwH+QQdQ8lsNeNg32nOm/fIh3CGS0OXOQHCv90XYwUyICM2NNX85f26WUnOu5smFzX0vu9qktZjeNtusAbB+XdvfAWDZnjeurX2XST1Y8X6s7zmzYABUrHBaYNshYRC4k340FcZU/1vg2JVpgeP4uJXypHK8soD134In/W+mb+AJvffvvC022It/ve1MaCJCXU6f4UCQy1CbNVONH7/Gw7Md8fsAtddMUh5fveYAAAAASUVORK5CYII=); + nudge: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGElEQVQYV2N4DwX/oYBhgARgDJjEAAkAAEC99wFuu0VFAAAAAElFTkSuQmCC); + pudge: url(http://wiki.jbussdieker.name/skins/common/images/Checker-16x16.png?2012-05-02T13:40:00Z); + // TODO(interpolation support): trailing-spaces: url(a#{b}c ); + expr1: url(join-url("..", "image.png")); + expr2: url(1 + 2); + // TODO(interpolation support): expr3: url(a#{b}"c"); +} + +// TODO(interpolation support): @import url(//fonts.googleapis.com/css?family=#{get-font-family( + + + + +``` + + +## AST + +``` +CssRoot { + bom_token: missing (optional), + items: CssRootItemList [ + CssQualifiedRule { + prelude: CssSelectorList [ + CssCompoundSelector { + nesting_selectors: CssNestedSelectorList [], + simple_selector: CssTypeSelector { + namespace: missing (optional), + ident: CssIdentifier { + value_token: IDENT@0..4 "div" [] [Whitespace(" ")], + }, + }, + sub_selectors: CssSubSelectorList [], + }, + ], + block: CssDeclarationOrRuleBlock { + l_curly_token: L_CURLY@4..5 "{" [] [], + items: CssDeclarationOrRuleList [ + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@5..11 "foo" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@11..13 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssUrlFunction { + name: URL_KW@13..16 "url" [] [], + l_paren_token: L_PAREN@16..17 "(" [] [], + value: CssUrlValueRaw { + value_token: CSS_URL_VALUE_RAW_LITERAL@17..30 "bloo/blah.css" [] [], + }, + modifiers: CssUrlModifierList [], + r_paren_token: R_PAREN@30..31 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@31..32 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@32..38 "bar" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@38..40 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssUrlFunction { + name: URL_KW@40..43 "url" [] [], + l_paren_token: L_PAREN@43..44 "(" [] [], + value: CssUrlValueRaw { + value_token: CSS_URL_VALUE_RAW_LITERAL@44..66 "http://foo/bar/hux.css" [] [], + }, + modifiers: CssUrlModifierList [], + r_paren_token: R_PAREN@66..67 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@67..68 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@68..420 "flum" [Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@420..422 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@422..431 "image-url" [] [], + }, + l_paren_token: L_PAREN@431..432 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@432..443 "\"fudge.png\"" [] [], + }, + ], + }, + COMMA@443..445 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssIdentifier { + value_token: IDENT@445..448 "hux" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@448..449 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@449..450 ";" [] [], + }, + ScssDeclaration { + name: ScssIdentifier { + dollar_token: DOLLAR@450..454 "$" [Newline("\n"), Whitespace(" ")] [], + name: CssIdentifier { + value_token: IDENT@454..456 "bg" [] [], + }, + }, + colon_token: COLON@456..458 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@458..469 "\"image.png\"" [] [], + }, + ], + }, + modifiers: ScssVariableModifierList [], + semicolon_token: SEMICOLON@469..470 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@470..539 "mudge" [Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@539..541 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssUrlFunction { + name: URL_KW@541..544 "url" [] [], + l_paren_token: L_PAREN@544..545 "(" [] [], + value: CssUrlValueRaw { + value_token: CSS_URL_VALUE_RAW_LITERAL@545..1595 "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAACeElEQVR42nySy29McRTHP/fOnTvT6bQNrdHKMGGhFkTSELGxwoJY8Q9YWFhYEUJsRSKCsJWikjYSJBIbinpVPJLSRlEkKK2WTnXmvl+/Y4F4tPVJPqtvzjcnJ0cTEQxdY/miFH6gcAJpaWrQl86t05rR9axSKD8UZ6KqJscm5bMdyDDgAYgIBoCORm2G1u0b6w8unJ/bmDG1QtpUmIYiZ8Zk0zEpYmW76tujV9J3/Ep04v0XdR2IDYAdWxYt27Sa8/l8btWIlaYSupgqpNaMUYbC0DUa8qKXWpLGNSvZEETpZO/Z4B5gGQCRMio1xdVfioUIa3AQJ/ZARWhJgkQJKq3wfJ3RwETGhRtPgx7ABtBEhCVNBqViU2tn5+5bLfXmgurIYwJrGFEJmqZh2T4jo2X0YIreZ+7dfeejrcCEiKADfCon3O4fHzp25Nx+8nnqF65lXnEphQUtNBYKaKkMcRgxVY29093JUWCCn+gAORMaTLh0dbCjo/1KO3X1kC6BGIR+QLVioSc+F+9HnW/G1DX+QAcw0j8c/QaHj3UfeN0/MMicEmSL+J5P6DkMDUcfLvZGJ4FwWoHl/lAEXo344zv3dO3ynXJIpg7XdnBtj46bwSnblwH+QQdQ8lsNeNg32nOm/fIh3CGS0OXOQHCv90XYwUyICM2NNX85f26WUnOu5smFzX0vu9qktZjeNtusAbB+XdvfAWDZnjeurX2XST1Y8X6s7zmzYABUrHBaYNshYRC4k340FcZU/1vg2JVpgeP4uJXypHK8soD134In/W+mb+AJvffvvC022It/ve1MaCJCXU6f4UCQy1CbNVONH7/Gw7Md8fsAtddMUh5fveYAAAAASUVORK5CYII=" [] [], + }, + modifiers: CssUrlModifierList [], + r_paren_token: R_PAREN@1595..1596 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1596..1597 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1597..1605 "nudge" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@1605..1607 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssUrlFunction { + name: URL_KW@1607..1610 "url" [] [], + l_paren_token: L_PAREN@1610..1611 "(" [] [], + value: CssUrlValueRaw { + value_token: CSS_URL_VALUE_RAW_LITERAL@1611..1741 "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGElEQVQYV2N4DwX/oYBhgARgDJjEAAkAAEC99wFuu0VFAAAAAElFTkSuQmCC" [] [], + }, + modifiers: CssUrlModifierList [], + r_paren_token: R_PAREN@1741..1742 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1742..1743 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1743..1751 "pudge" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@1751..1753 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssUrlFunction { + name: URL_KW@1753..1756 "url" [] [], + l_paren_token: L_PAREN@1756..1757 "(" [] [], + value: CssUrlValueRaw { + value_token: CSS_URL_VALUE_RAW_LITERAL@1757..1844 "http://wiki.jbussdieker.name/skins/common/images/Checker-16x16.png?2012-05-02T13:40:00Z" [] [], + }, + modifiers: CssUrlModifierList [], + r_paren_token: R_PAREN@1844..1845 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1845..1846 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1846..1920 "expr1" [Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@1920..1922 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssUrlFunction { + name: URL_KW@1922..1925 "url" [] [], + l_paren_token: L_PAREN@1925..1926 "(" [] [], + value: missing (optional), + modifiers: CssUrlModifierList [ + CssFunction { + name: CssIdentifier { + value_token: IDENT@1926..1934 "join-url" [] [], + }, + l_paren_token: L_PAREN@1934..1935 "(" [] [], + items: CssParameterList [ + ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@1935..1939 "\"..\"" [] [], + }, + ], + }, + COMMA@1939..1941 "," [] [Whitespace(" ")], + ScssExpression { + items: ScssExpressionItemList [ + CssString { + value_token: CSS_STRING_LITERAL@1941..1952 "\"image.png\"" [] [], + }, + ], + }, + ], + r_paren_token: R_PAREN@1952..1953 ")" [] [], + }, + ], + r_paren_token: R_PAREN@1953..1954 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1954..1955 ";" [] [], + }, + CssDeclarationWithSemicolon { + declaration: CssDeclaration { + property: CssGenericProperty { + name: CssIdentifier { + value_token: IDENT@1955..1963 "expr2" [Newline("\n"), Whitespace(" ")] [], + }, + colon_token: COLON@1963..1965 ":" [] [Whitespace(" ")], + value: ScssExpression { + items: ScssExpressionItemList [ + CssUrlFunction { + name: URL_KW@1965..1968 "url" [] [], + l_paren_token: L_PAREN@1968..1969 "(" [] [], + value: CssUrlValueRaw { + value_token: CSS_URL_VALUE_RAW_LITERAL@1969..1974 "1 + 2" [] [], + }, + modifiers: CssUrlModifierList [], + r_paren_token: R_PAREN@1974..1975 ")" [] [], + }, + ], + }, + }, + important: missing (optional), + }, + semicolon_token: SEMICOLON@1975..1976 ";" [] [], + }, + ], + r_curly_token: R_CURLY@1976..2034 "}" [Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n")] [], + }, + }, + ], + eof_token: EOF@2034..2136 "" [Newline("\n"), Newline("\n"), Comments("// TODO(interpolation ..."), Newline("\n"), Newline("\n"), Newline("\n"), Newline("\n")] [], +} +``` + +## CST + +``` +0: CSS_ROOT@0..2136 + 0: (empty) + 1: CSS_ROOT_ITEM_LIST@0..2034 + 0: CSS_QUALIFIED_RULE@0..2034 + 0: CSS_SELECTOR_LIST@0..4 + 0: CSS_COMPOUND_SELECTOR@0..4 + 0: CSS_NESTED_SELECTOR_LIST@0..0 + 1: CSS_TYPE_SELECTOR@0..4 + 0: (empty) + 1: CSS_IDENTIFIER@0..4 + 0: IDENT@0..4 "div" [] [Whitespace(" ")] + 2: CSS_SUB_SELECTOR_LIST@4..4 + 1: CSS_DECLARATION_OR_RULE_BLOCK@4..2034 + 0: L_CURLY@4..5 "{" [] [] + 1: CSS_DECLARATION_OR_RULE_LIST@5..1976 + 0: CSS_DECLARATION_WITH_SEMICOLON@5..32 + 0: CSS_DECLARATION@5..31 + 0: CSS_GENERIC_PROPERTY@5..31 + 0: CSS_IDENTIFIER@5..11 + 0: IDENT@5..11 "foo" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@11..13 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@13..31 + 0: SCSS_EXPRESSION_ITEM_LIST@13..31 + 0: CSS_URL_FUNCTION@13..31 + 0: URL_KW@13..16 "url" [] [] + 1: L_PAREN@16..17 "(" [] [] + 2: CSS_URL_VALUE_RAW@17..30 + 0: CSS_URL_VALUE_RAW_LITERAL@17..30 "bloo/blah.css" [] [] + 3: CSS_URL_MODIFIER_LIST@30..30 + 4: R_PAREN@30..31 ")" [] [] + 1: (empty) + 1: SEMICOLON@31..32 ";" [] [] + 1: CSS_DECLARATION_WITH_SEMICOLON@32..68 + 0: CSS_DECLARATION@32..67 + 0: CSS_GENERIC_PROPERTY@32..67 + 0: CSS_IDENTIFIER@32..38 + 0: IDENT@32..38 "bar" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@38..40 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@40..67 + 0: SCSS_EXPRESSION_ITEM_LIST@40..67 + 0: CSS_URL_FUNCTION@40..67 + 0: URL_KW@40..43 "url" [] [] + 1: L_PAREN@43..44 "(" [] [] + 2: CSS_URL_VALUE_RAW@44..66 + 0: CSS_URL_VALUE_RAW_LITERAL@44..66 "http://foo/bar/hux.css" [] [] + 3: CSS_URL_MODIFIER_LIST@66..66 + 4: R_PAREN@66..67 ")" [] [] + 1: (empty) + 1: SEMICOLON@67..68 ";" [] [] + 2: CSS_DECLARATION_WITH_SEMICOLON@68..450 + 0: CSS_DECLARATION@68..449 + 0: CSS_GENERIC_PROPERTY@68..449 + 0: CSS_IDENTIFIER@68..420 + 0: IDENT@68..420 "flum" [Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n"), Whitespace(" ")] [] + 1: COLON@420..422 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@422..449 + 0: SCSS_EXPRESSION_ITEM_LIST@422..449 + 0: CSS_FUNCTION@422..449 + 0: CSS_IDENTIFIER@422..431 + 0: IDENT@422..431 "image-url" [] [] + 1: L_PAREN@431..432 "(" [] [] + 2: CSS_PARAMETER_LIST@432..448 + 0: SCSS_EXPRESSION@432..443 + 0: SCSS_EXPRESSION_ITEM_LIST@432..443 + 0: CSS_STRING@432..443 + 0: CSS_STRING_LITERAL@432..443 "\"fudge.png\"" [] [] + 1: COMMA@443..445 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@445..448 + 0: SCSS_EXPRESSION_ITEM_LIST@445..448 + 0: CSS_IDENTIFIER@445..448 + 0: IDENT@445..448 "hux" [] [] + 3: R_PAREN@448..449 ")" [] [] + 1: (empty) + 1: SEMICOLON@449..450 ";" [] [] + 3: SCSS_DECLARATION@450..470 + 0: SCSS_IDENTIFIER@450..456 + 0: DOLLAR@450..454 "$" [Newline("\n"), Whitespace(" ")] [] + 1: CSS_IDENTIFIER@454..456 + 0: IDENT@454..456 "bg" [] [] + 1: COLON@456..458 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@458..469 + 0: SCSS_EXPRESSION_ITEM_LIST@458..469 + 0: CSS_STRING@458..469 + 0: CSS_STRING_LITERAL@458..469 "\"image.png\"" [] [] + 3: SCSS_VARIABLE_MODIFIER_LIST@469..469 + 4: SEMICOLON@469..470 ";" [] [] + 4: CSS_DECLARATION_WITH_SEMICOLON@470..1597 + 0: CSS_DECLARATION@470..1596 + 0: CSS_GENERIC_PROPERTY@470..1596 + 0: CSS_IDENTIFIER@470..539 + 0: IDENT@470..539 "mudge" [Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n"), Whitespace(" ")] [] + 1: COLON@539..541 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@541..1596 + 0: SCSS_EXPRESSION_ITEM_LIST@541..1596 + 0: CSS_URL_FUNCTION@541..1596 + 0: URL_KW@541..544 "url" [] [] + 1: L_PAREN@544..545 "(" [] [] + 2: CSS_URL_VALUE_RAW@545..1595 + 0: CSS_URL_VALUE_RAW_LITERAL@545..1595 "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAACXBIWXMAAAsTAAALEwEAmpwYAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAAB6JQAAgIMAAPn/AACA6QAAdTAAAOpgAAA6mAAAF2+SX8VGAAACeElEQVR42nySy29McRTHP/fOnTvT6bQNrdHKMGGhFkTSELGxwoJY8Q9YWFhYEUJsRSKCsJWikjYSJBIbinpVPJLSRlEkKK2WTnXmvl+/Y4F4tPVJPqtvzjcnJ0cTEQxdY/miFH6gcAJpaWrQl86t05rR9axSKD8UZ6KqJscm5bMdyDDgAYgIBoCORm2G1u0b6w8unJ/bmDG1QtpUmIYiZ8Zk0zEpYmW76tujV9J3/Ep04v0XdR2IDYAdWxYt27Sa8/l8btWIlaYSupgqpNaMUYbC0DUa8qKXWpLGNSvZEETpZO/Z4B5gGQCRMio1xdVfioUIa3AQJ/ZARWhJgkQJKq3wfJ3RwETGhRtPgx7ABtBEhCVNBqViU2tn5+5bLfXmgurIYwJrGFEJmqZh2T4jo2X0YIreZ+7dfeejrcCEiKADfCon3O4fHzp25Nx+8nnqF65lXnEphQUtNBYKaKkMcRgxVY29093JUWCCn+gAORMaTLh0dbCjo/1KO3X1kC6BGIR+QLVioSc+F+9HnW/G1DX+QAcw0j8c/QaHj3UfeN0/MMicEmSL+J5P6DkMDUcfLvZGJ4FwWoHl/lAEXo344zv3dO3ynXJIpg7XdnBtj46bwSnblwH+QQdQ8lsNeNg32nOm/fIh3CGS0OXOQHCv90XYwUyICM2NNX85f26WUnOu5smFzX0vu9qktZjeNtusAbB+XdvfAWDZnjeurX2XST1Y8X6s7zmzYABUrHBaYNshYRC4k340FcZU/1vg2JVpgeP4uJXypHK8soD134In/W+mb+AJvffvvC022It/ve1MaCJCXU6f4UCQy1CbNVONH7/Gw7Md8fsAtddMUh5fveYAAAAASUVORK5CYII=" [] [] + 3: CSS_URL_MODIFIER_LIST@1595..1595 + 4: R_PAREN@1595..1596 ")" [] [] + 1: (empty) + 1: SEMICOLON@1596..1597 ";" [] [] + 5: CSS_DECLARATION_WITH_SEMICOLON@1597..1743 + 0: CSS_DECLARATION@1597..1742 + 0: CSS_GENERIC_PROPERTY@1597..1742 + 0: CSS_IDENTIFIER@1597..1605 + 0: IDENT@1597..1605 "nudge" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1605..1607 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1607..1742 + 0: SCSS_EXPRESSION_ITEM_LIST@1607..1742 + 0: CSS_URL_FUNCTION@1607..1742 + 0: URL_KW@1607..1610 "url" [] [] + 1: L_PAREN@1610..1611 "(" [] [] + 2: CSS_URL_VALUE_RAW@1611..1741 + 0: CSS_URL_VALUE_RAW_LITERAL@1611..1741 "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGElEQVQYV2N4DwX/oYBhgARgDJjEAAkAAEC99wFuu0VFAAAAAElFTkSuQmCC" [] [] + 3: CSS_URL_MODIFIER_LIST@1741..1741 + 4: R_PAREN@1741..1742 ")" [] [] + 1: (empty) + 1: SEMICOLON@1742..1743 ";" [] [] + 6: CSS_DECLARATION_WITH_SEMICOLON@1743..1846 + 0: CSS_DECLARATION@1743..1845 + 0: CSS_GENERIC_PROPERTY@1743..1845 + 0: CSS_IDENTIFIER@1743..1751 + 0: IDENT@1743..1751 "pudge" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1751..1753 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1753..1845 + 0: SCSS_EXPRESSION_ITEM_LIST@1753..1845 + 0: CSS_URL_FUNCTION@1753..1845 + 0: URL_KW@1753..1756 "url" [] [] + 1: L_PAREN@1756..1757 "(" [] [] + 2: CSS_URL_VALUE_RAW@1757..1844 + 0: CSS_URL_VALUE_RAW_LITERAL@1757..1844 "http://wiki.jbussdieker.name/skins/common/images/Checker-16x16.png?2012-05-02T13:40:00Z" [] [] + 3: CSS_URL_MODIFIER_LIST@1844..1844 + 4: R_PAREN@1844..1845 ")" [] [] + 1: (empty) + 1: SEMICOLON@1845..1846 ";" [] [] + 7: CSS_DECLARATION_WITH_SEMICOLON@1846..1955 + 0: CSS_DECLARATION@1846..1954 + 0: CSS_GENERIC_PROPERTY@1846..1954 + 0: CSS_IDENTIFIER@1846..1920 + 0: IDENT@1846..1920 "expr1" [Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n"), Whitespace(" ")] [] + 1: COLON@1920..1922 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1922..1954 + 0: SCSS_EXPRESSION_ITEM_LIST@1922..1954 + 0: CSS_URL_FUNCTION@1922..1954 + 0: URL_KW@1922..1925 "url" [] [] + 1: L_PAREN@1925..1926 "(" [] [] + 2: (empty) + 3: CSS_URL_MODIFIER_LIST@1926..1953 + 0: CSS_FUNCTION@1926..1953 + 0: CSS_IDENTIFIER@1926..1934 + 0: IDENT@1926..1934 "join-url" [] [] + 1: L_PAREN@1934..1935 "(" [] [] + 2: CSS_PARAMETER_LIST@1935..1952 + 0: SCSS_EXPRESSION@1935..1939 + 0: SCSS_EXPRESSION_ITEM_LIST@1935..1939 + 0: CSS_STRING@1935..1939 + 0: CSS_STRING_LITERAL@1935..1939 "\"..\"" [] [] + 1: COMMA@1939..1941 "," [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1941..1952 + 0: SCSS_EXPRESSION_ITEM_LIST@1941..1952 + 0: CSS_STRING@1941..1952 + 0: CSS_STRING_LITERAL@1941..1952 "\"image.png\"" [] [] + 3: R_PAREN@1952..1953 ")" [] [] + 4: R_PAREN@1953..1954 ")" [] [] + 1: (empty) + 1: SEMICOLON@1954..1955 ";" [] [] + 8: CSS_DECLARATION_WITH_SEMICOLON@1955..1976 + 0: CSS_DECLARATION@1955..1975 + 0: CSS_GENERIC_PROPERTY@1955..1975 + 0: CSS_IDENTIFIER@1955..1963 + 0: IDENT@1955..1963 "expr2" [Newline("\n"), Whitespace(" ")] [] + 1: COLON@1963..1965 ":" [] [Whitespace(" ")] + 2: SCSS_EXPRESSION@1965..1975 + 0: SCSS_EXPRESSION_ITEM_LIST@1965..1975 + 0: CSS_URL_FUNCTION@1965..1975 + 0: URL_KW@1965..1968 "url" [] [] + 1: L_PAREN@1968..1969 "(" [] [] + 2: CSS_URL_VALUE_RAW@1969..1974 + 0: CSS_URL_VALUE_RAW_LITERAL@1969..1974 "1 + 2" [] [] + 3: CSS_URL_MODIFIER_LIST@1974..1974 + 4: R_PAREN@1974..1975 ")" [] [] + 1: (empty) + 1: SEMICOLON@1975..1976 ";" [] [] + 2: R_CURLY@1976..2034 "}" [Newline("\n"), Whitespace(" "), Comments("// TODO(interpolation ..."), Newline("\n")] [] + 2: EOF@2034..2136 "" [Newline("\n"), Newline("\n"), Comments("// TODO(interpolation ..."), Newline("\n"), Newline("\n"), Newline("\n"), Newline("\n")] [] + +``` diff --git a/crates/biome_css_syntax/src/generated/nodes.rs b/crates/biome_css_syntax/src/generated/nodes.rs index 1932a3124704..d3ed6eaf0506 100644 --- a/crates/biome_css_syntax/src/generated/nodes.rs +++ b/crates/biome_css_syntax/src/generated/nodes.rs @@ -13562,6 +13562,7 @@ impl AnyScssExpression { #[derive(Clone, PartialEq, Eq, Hash, Serialize)] pub enum AnyScssExpressionItem { AnyCssValue(AnyCssValue), + CssDeclarationImportant(CssDeclarationImportant), CssGenericDelimiter(CssGenericDelimiter), ScssArbitraryArgument(ScssArbitraryArgument), ScssBinaryExpression(ScssBinaryExpression), @@ -13578,6 +13579,12 @@ impl AnyScssExpressionItem { _ => None, } } + pub fn as_css_declaration_important(&self) -> Option<&CssDeclarationImportant> { + match &self { + Self::CssDeclarationImportant(item) => Some(item), + _ => None, + } + } pub fn as_css_generic_delimiter(&self) -> Option<&CssGenericDelimiter> { match &self { Self::CssGenericDelimiter(item) => Some(item), @@ -35190,6 +35197,11 @@ impl From for SyntaxElement { node.into() } } +impl From for AnyScssExpressionItem { + fn from(node: CssDeclarationImportant) -> Self { + Self::CssDeclarationImportant(node) + } +} impl From for AnyScssExpressionItem { fn from(node: CssGenericDelimiter) -> Self { Self::CssGenericDelimiter(node) @@ -35233,6 +35245,7 @@ impl From for AnyScssExpressionItem { impl AstNode for AnyScssExpressionItem { type Language = Language; const KIND_SET: SyntaxKindSet = AnyCssValue::KIND_SET + .union(CssDeclarationImportant::KIND_SET) .union(CssGenericDelimiter::KIND_SET) .union(ScssArbitraryArgument::KIND_SET) .union(ScssBinaryExpression::KIND_SET) @@ -35243,7 +35256,8 @@ impl AstNode for AnyScssExpressionItem { .union(ScssUnaryExpression::KIND_SET); fn can_cast(kind: SyntaxKind) -> bool { match kind { - CSS_GENERIC_DELIMITER + CSS_DECLARATION_IMPORTANT + | CSS_GENERIC_DELIMITER | SCSS_ARBITRARY_ARGUMENT | SCSS_BINARY_EXPRESSION | SCSS_KEYWORD_ARGUMENT @@ -35257,6 +35271,9 @@ impl AstNode for AnyScssExpressionItem { } fn cast(syntax: SyntaxNode) -> Option { let res = match syntax.kind() { + CSS_DECLARATION_IMPORTANT => { + Self::CssDeclarationImportant(CssDeclarationImportant { syntax }) + } CSS_GENERIC_DELIMITER => Self::CssGenericDelimiter(CssGenericDelimiter { syntax }), SCSS_ARBITRARY_ARGUMENT => { Self::ScssArbitraryArgument(ScssArbitraryArgument { syntax }) @@ -35280,6 +35297,7 @@ impl AstNode for AnyScssExpressionItem { } fn syntax(&self) -> &SyntaxNode { match self { + Self::CssDeclarationImportant(it) => it.syntax(), Self::CssGenericDelimiter(it) => it.syntax(), Self::ScssArbitraryArgument(it) => it.syntax(), Self::ScssBinaryExpression(it) => it.syntax(), @@ -35293,6 +35311,7 @@ impl AstNode for AnyScssExpressionItem { } fn into_syntax(self) -> SyntaxNode { match self { + Self::CssDeclarationImportant(it) => it.into_syntax(), Self::CssGenericDelimiter(it) => it.into_syntax(), Self::ScssArbitraryArgument(it) => it.into_syntax(), Self::ScssBinaryExpression(it) => it.into_syntax(), @@ -35309,6 +35328,7 @@ impl std::fmt::Debug for AnyScssExpressionItem { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { Self::AnyCssValue(it) => std::fmt::Debug::fmt(it, f), + Self::CssDeclarationImportant(it) => std::fmt::Debug::fmt(it, f), Self::CssGenericDelimiter(it) => std::fmt::Debug::fmt(it, f), Self::ScssArbitraryArgument(it) => std::fmt::Debug::fmt(it, f), Self::ScssBinaryExpression(it) => std::fmt::Debug::fmt(it, f), @@ -35324,6 +35344,7 @@ impl From for SyntaxNode { fn from(n: AnyScssExpressionItem) -> Self { match n { AnyScssExpressionItem::AnyCssValue(it) => it.into_syntax(), + AnyScssExpressionItem::CssDeclarationImportant(it) => it.into_syntax(), AnyScssExpressionItem::CssGenericDelimiter(it) => it.into_syntax(), AnyScssExpressionItem::ScssArbitraryArgument(it) => it.into_syntax(), AnyScssExpressionItem::ScssBinaryExpression(it) => it.into_syntax(), diff --git a/xtask/codegen/css.ungram b/xtask/codegen/css.ungram index 277cc76773b1..58512f8e6194 100644 --- a/xtask/codegen/css.ungram +++ b/xtask/codegen/css.ungram @@ -2585,6 +2585,7 @@ ScssExpressionItemList = AnyScssExpressionItem* AnyScssExpressionItem = AnyCssValue | CssGenericDelimiter + | CssDeclarationImportant | ScssKeywordArgument | ScssArbitraryArgument | ScssBinaryExpression