Skip to content

Conversation

@taga3s
Copy link
Contributor

@taga3s taga3s commented Dec 21, 2025

Note

AI Assistance Disclosure: To understand the project structure and find problems, I used Claude Code.

Summary

This PR fixes the parameters of :active-view-transiton-type so that it can accept comma-separated custom identifiers. The current implementation of it accepts space-separated, which does not follow the spec (MDN)

To fix the problem, I defined CssCustomIdentifierSpaceSeparatedList to distinguish it from CssCustomIdentifierList . The former is for space-separated custom idents (which is currently used for @font-feature-values), and the latter is for comma-separated custom idents.

Test Plan

  • Snapshots of parser and formatter are updated
    • :active-view-transition-type
    • @font-feature-values (formatted result of css.snap not changed)

Docs

@changeset-bot
Copy link

changeset-bot bot commented Dec 21, 2025

🦋 Changeset detected

Latest commit: 6c69c79

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 13 packages
Name Type
@biomejs/biome Patch
@biomejs/cli-win32-x64 Patch
@biomejs/cli-win32-arm64 Patch
@biomejs/cli-darwin-x64 Patch
@biomejs/cli-darwin-arm64 Patch
@biomejs/cli-linux-x64 Patch
@biomejs/cli-linux-arm64 Patch
@biomejs/cli-linux-x64-musl Patch
@biomejs/cli-linux-arm64-musl Patch
@biomejs/wasm-web Patch
@biomejs/wasm-bundler Patch
@biomejs/wasm-nodejs Patch
@biomejs/backend-jsonrpc Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions github-actions bot added A-Parser Area: parser A-Formatter Area: formatter A-Tooling Area: internal tools L-CSS Language: CSS labels Dec 21, 2025
@taga3s taga3s changed the title fix(parser/css): :active-view-transition-type parameters should accept comma-separated custom idents Dec 21, 2025
@codspeed-hq
Copy link

codspeed-hq bot commented Dec 21, 2025

CodSpeed Performance Report

Merging #8531 will not alter performance

Comparing taga3s:fix-issue-8472 (6c69c79) with main (a704be9)

Summary

✅ 29 untouched
⏩ 126 skipped1

Footnotes

  1. 126 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

@taga3s taga3s marked this pull request as ready for review December 21, 2025 13:24
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Dec 21, 2025

Walkthrough

This pull request fixes CSS parser support for the :active-view-transition-type pseudo-class to accept comma-separated identifiers. The change introduces two distinct list types—comma-separated and space-separated—replacing the previous generic custom identifier list. Parser logic has been updated to treat the pseudo-class function arguments as comma-delimited, whilst formatter implementations have been refactored to handle both layout styles. Grammar and code generation files have been updated to reflect these new list variants.

Possibly related PRs

Suggested reviewers

  • ematipico
  • dyc3
  • siketyan

Pre-merge checks and finishing touches

✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The PR title accurately describes the main change: fixing the CSS parser to accept comma-separated custom identifiers for the :active-view-transition-type pseudo-class.
Description check ✅ Passed The PR description clearly explains the fix, references issue #8472, describes the approach (introducing CssCustomIdentifierSpaceSeparatedList), and documents test updates.
Linked Issues check ✅ Passed The PR successfully addresses issue #8472 by enabling the parser to accept comma-separated parameters in :active-view-transition-type without error, exactly as required by the spec.
Out of Scope Changes check ✅ Passed All changes are directly aligned with fixing the comma-separated identifier parsing for :active-view-transition-type; updates to @font-feature-values use the new space-separated type appropriately.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

📜 Recent review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 772951d and 6c69c79.

⛔ Files ignored due to path filters (9)
  • crates/biome_css_factory/src/generated/node_factory.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_css_factory/src/generated/syntax_factory.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_css_formatter/tests/specs/css/pseudo/pseudo_class_function_custom_identifier_list.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_parser/tests/css_test_suite/error/selector/pseudo_class/pseudo_class_function_custom_identifier_list_error.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_parser/tests/css_test_suite/ok/selector/pseudo_class/pseudo_class_function_custom_identifier_list.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_syntax/src/generated/kind.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_css_syntax/src/generated/macros.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_css_syntax/src/generated/nodes.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_css_syntax/src/generated/nodes_mut.rs is excluded by !**/generated/**, !**/generated/** and included by **
📒 Files selected for processing (8)
  • crates/biome_css_formatter/src/css/pseudo/pseudo_class_function_custom_identifier_list.rs (2 hunks)
  • crates/biome_css_formatter/src/generated.rs (1 hunks)
  • crates/biome_css_formatter/tests/specs/css/pseudo/pseudo_class_function_custom_identifier_list.css (1 hunks)
  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs (3 hunks)
  • crates/biome_css_parser/tests/css_test_suite/error/selector/pseudo_class/pseudo_class_function_custom_identifier_list_error.css (1 hunks)
  • crates/biome_css_parser/tests/css_test_suite/ok/selector/pseudo_class/pseudo_class_function_custom_identifier_list.css (1 hunks)
  • xtask/codegen/css.ungram (2 hunks)
  • xtask/codegen/src/css_kinds_src.rs (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • crates/biome_css_formatter/src/css/pseudo/pseudo_class_function_custom_identifier_list.rs
  • xtask/codegen/src/css_kinds_src.rs
🧰 Additional context used
📓 Path-based instructions (1)
**/*.rs

📄 CodeRabbit inference engine (CONTRIBUTING.md)

**/*.rs: Use inline rustdoc documentation for rules, assists, and their options
Use the dbg!() macro for debugging output in Rust tests and code
Use doc tests (doctest) format with code blocks in rustdoc comments; ensure assertions pass in tests

Files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
  • crates/biome_css_formatter/src/generated.rs
🧠 Learnings (23)
📚 Learning: 2025-12-04T13:29:49.287Z
Learnt from: dyc3
Repo: biomejs/biome PR: 8291
File: crates/biome_html_formatter/tests/specs/prettier/vue/html-vue/elastic-header.html:10-10
Timestamp: 2025-12-04T13:29:49.287Z
Learning: Files under `crates/biome_html_formatter/tests/specs/prettier` are test fixtures synced from Prettier and should not receive detailed code quality reviews (e.g., HTTP vs HTTPS, formatting suggestions, etc.). These files are test data meant to validate formatter behavior and should be preserved as-is.

Applied to files:

  • crates/biome_css_formatter/tests/specs/css/pseudo/pseudo_class_function_custom_identifier_list.css
  • crates/biome_css_parser/tests/css_test_suite/error/selector/pseudo_class/pseudo_class_function_custom_identifier_list_error.css
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/src/**/*.rs : Use `ParseSeparatedList` and `ParseNodeList` for parsing lists with error recovery to avoid infinite loops

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/src/**/*.rs : Implement error recovery in list parsing using `or_recover()` to wrap unparseable tokens in a `BOGUS_*` node and consume tokens until a recovery token is found

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
📚 Learning: 2025-11-24T18:05:27.810Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_js_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:27.810Z
Learning: Applies to crates/biome_js_formatter/**/*.rs : When formatting AST nodes, use mandatory tokens from the AST instead of hardcoding token strings (e.g., use `node.l_paren_token().format()` instead of `token("(")`)

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/src/**/*.rs : Parse rule functions must be prefixed with `parse_` and use the name defined in the grammar file, e.g., `parse_for_statement` or `parse_expression`

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/src/**/*.rs : Use `ConditionalParsedSyntax` for syntax that is only valid in specific contexts (e.g., strict mode, file types, language versions) and call `or_invalid_to_bogus()` to convert to a bogus node if not supported

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/src/**/*.rs : Use `p.eat(token)` for optional tokens, `p.expect(token)` for required tokens, `parse_rule(p).ok(p)` for optional nodes, and `parse_rule(p).or_add_diagnostic(p, error)` for required nodes

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/src/**/*.rs : Parse rules must return `ParsedSyntax::Absent` if the rule can't predict by the next token(s) if they form the expected node, and must not progress the parser in this case

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/src/**/*.rs : Parse rules must take a mutable reference to the parser as their only parameter and return a `ParsedSyntax`

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/*.ungram : Nodes for enclosing syntax errors must have the `Bogus` word, e.g., `HtmlBogusAttribute`, and must be part of a variant

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/src/**/*.rs : A parser struct must implement the `Parser` trait and save the token source, parser context, and optional parser options

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Applies to crates/biome_formatter/**/biome_*_formatter/src/context.rs : Define `<Language>FormatContext` struct in a `context.rs` file containing `comments` and `source_map` fields, implementing `FormatContext` and `CstFormatContext` traits

Applied to files:

  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:27.810Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_js_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:27.810Z
Learning: Applies to crates/biome_js_formatter/**/*.rs : Import the `FormatNode` trait and implement it for your Node when creating formatters in biome_js_formatter

Applied to files:

  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Applies to crates/biome_formatter/**/biome_*_formatter/src/lib.rs : Define a type alias `<Language>Formatter<'buf>` as `Formatter<'buf, <Language>FormatContext>` in the main formatter crate

Applied to files:

  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Applies to crates/biome_formatter/**/biome_*_formatter/tests/language.rs : Implement `TestFormatLanguage` trait in `tests/language.rs` for the formatter's test language

Applied to files:

  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Applies to crates/biome_formatter/**/biome_*_formatter/src/lib.rs : Expose a public `format_node` function that accepts formatting options and a root syntax node, returning a `FormatResult<Formatted<Context>>` with appropriate documentation

Applied to files:

  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-12-19T12:53:30.399Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_analyze/CONTRIBUTING.md:0-0
Timestamp: 2025-12-19T12:53:30.399Z
Learning: Applies to crates/biome_analyze/**/biome_rule_options/lib/**/*.rs : Wrap rule options fields in `Option<>` to properly track set and unset options during merge

Applied to files:

  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Applies to crates/biome_formatter/**/biome_*_formatter/Cargo.toml : Include development dependencies in `Cargo.toml` for formatter tests: `biome_formatter_test`, `biome_<language>_factory`, `biome_<language>_parser`, `biome_parser`, `biome_service`, `countme`, `iai`, `quickcheck`, `quickcheck_macros`, and `tests_macros`

Applied to files:

  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Applies to crates/biome_formatter/**/biome_*_formatter/src/comments.rs : Define `<Language>CommentStyle` as a public type alias for `Comments<<Language>Language>` in a `comments.rs` file

Applied to files:

  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Implement the `AsFormat<Context>` trait in `lib.rs` with generic implementations for references, `SyntaxResult`, and `Option` types as provided in the formatter boilerplate code

Applied to files:

  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Implement the `IntoFormat<Context>` trait in `lib.rs` with implementations for `SyntaxResult` and `Option` types as part of the formatter infrastructure

Applied to files:

  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Define `FormatHtmlSyntaxNode` struct in a `cst.rs` file implementing `FormatRule<HtmlSyntaxNode>`, `AsFormat<HtmlFormatContext>`, and `IntoFormat<HtmlFormatContext>` traits using the provided boilerplate code

Applied to files:

  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Implement the `FormatLanguage` trait with `SyntaxLanguage`, `Context`, and `FormatRule` associated types for the language's formatter

Applied to files:

  • crates/biome_css_formatter/src/generated.rs
🧬 Code graph analysis (1)
crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs (1)
crates/biome_css_parser/src/syntax/at_rule/font_feature_values.rs (1)
  • separating_element_kind (103-105)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (13)
  • GitHub Check: autofix
  • GitHub Check: Test Node.js API
  • GitHub Check: Parser conformance
  • GitHub Check: Lint project (depot-windows-2022)
  • GitHub Check: Bench (biome_css_analyze)
  • GitHub Check: Documentation
  • GitHub Check: Test (depot-windows-2022-16)
  • GitHub Check: Test (depot-ubuntu-24.04-arm-16)
  • GitHub Check: Bench (biome_css_parser)
  • GitHub Check: Lint project (depot-ubuntu-24.04-arm-16)
  • GitHub Check: End-to-end tests
  • GitHub Check: Bench (biome_css_formatter)
  • GitHub Check: Check Dependencies
🔇 Additional comments (9)
crates/biome_css_parser/tests/css_test_suite/error/selector/pseudo_class/pseudo_class_function_custom_identifier_list_error.css (1)

5-11: LGTM!

The error test cases have been correctly updated to use comma-separated format whilst maintaining the invalid identifiers (numbers and strings) that should trigger parser errors.

crates/biome_css_parser/tests/css_test_suite/ok/selector/pseudo_class/pseudo_class_function_custom_identifier_list.css (1)

1-2: LGTM!

Valid test case correctly updated to comma-separated format.

crates/biome_css_formatter/tests/specs/css/pseudo/pseudo_class_function_custom_identifier_list.css (1)

1-41: LGTM!

Formatter test cases correctly demonstrate comma-separated formatting with various whitespace and indentation patterns, including trailing commas.

xtask/codegen/css.ungram (2)

798-799: LGTM!

Correctly uses space-separated variant for font family names per CSS spec.


803-807: LGTM!

The list type definitions are correctly structured and follow the naming convention requested in previous review feedback to clearly indicate the separator type.

crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs (3)

8-8: LGTM!

Correctly switched from ParseNodeList to ParseSeparatedList to handle comma-separated identifiers.

Also applies to: 59-59


62-62: LGTM!

Constant correctly updated to reference the new comma-separated list kind from the grammar.


84-86: LGTM!

The separating_element_kind method correctly specifies comma as the separator, matching the implementation pattern from font_feature_values.rs.

crates/biome_css_formatter/src/generated.rs (1)

6843-6865: New custom-identifier list wiring looks sound

The AsFormat/IntoFormat impls for CssCustomIdentifierCommaSeparatedList and CssCustomIdentifierSpaceSeparatedList follow the existing generated pattern (Ref/Owned with the matching custom_identifier_*_separated_list rules) and line up with the new list split described in the PR. Assuming this file is wholly code‑generated from the updated grammar/codegen, this looks ready to go.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (2)
.changeset/strong-mails-raise.md (1)

5-5: Changeset looks good.

The description clearly explains the fix. Optionally, you could make it slightly more concise by removing "so that it can": "Fixed :active-view-transition-type parameters to accept comma-separated custom identifiers."

crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs (1)

1-46: Consider consolidating with custom_identifier_list.rs to reduce duplication.

The structure is nearly identical to the comma-separated formatter—only the separator differs. You could parameterise the separator (comma vs. none) or extract shared logic to reduce maintenance burden.

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4e7baf3 and 2a752b1.

⛔ Files ignored due to path filters (11)
  • crates/biome_css_factory/src/generated/node_factory.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_css_factory/src/generated/syntax_factory.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_css_formatter/tests/specs/css/pseudo/pseudo_class_function_custom_identifier_list.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_parser/tests/css_test_suite/error/at_rule/at_rule_font_feature_values_error.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_parser/tests/css_test_suite/error/selector/pseudo_class/pseudo_class_function_custom_identifier_list_error.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_parser/tests/css_test_suite/ok/at_rule/at_rule_font_feature_values.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_parser/tests/css_test_suite/ok/selector/pseudo_class/pseudo_class_function_custom_identifier_list.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_syntax/src/generated/kind.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_css_syntax/src/generated/macros.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_css_syntax/src/generated/nodes.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_css_syntax/src/generated/nodes_mut.rs is excluded by !**/generated/**, !**/generated/** and included by **
📒 Files selected for processing (12)
  • .changeset/strong-mails-raise.md (1 hunks)
  • crates/biome_css_formatter/src/css/lists/custom_identifier_list.rs (2 hunks)
  • crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs (1 hunks)
  • crates/biome_css_formatter/src/css/lists/mod.rs (1 hunks)
  • crates/biome_css_formatter/src/generated.rs (1 hunks)
  • crates/biome_css_formatter/tests/specs/css/pseudo/pseudo_class_function_custom_identifier_list.css (1 hunks)
  • crates/biome_css_parser/src/syntax/at_rule/font_feature_values.rs (2 hunks)
  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs (3 hunks)
  • crates/biome_css_parser/tests/css_test_suite/error/selector/pseudo_class/pseudo_class_function_custom_identifier_list_error.css (1 hunks)
  • crates/biome_css_parser/tests/css_test_suite/ok/selector/pseudo_class/pseudo_class_function_custom_identifier_list.css (1 hunks)
  • xtask/codegen/css.ungram (1 hunks)
  • xtask/codegen/src/css_kinds_src.rs (1 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
.changeset/*.md

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Write changesets that are concise (1-3 sentences), user-focused, use past tense for actions taken and present tense for Biome behavior, include code examples for rules, and end sentences with periods

Files:

  • .changeset/strong-mails-raise.md
crates/**/*.rs

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Update inline rustdoc documentation for rules, assists, and their options when adding new features or changing existing features in Rust crates

Files:

  • crates/biome_css_formatter/src/css/lists/mod.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_list.rs
  • crates/biome_css_formatter/src/generated.rs
  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
  • crates/biome_css_parser/src/syntax/at_rule/font_feature_values.rs
🧠 Learnings (36)
📚 Learning: 2025-12-12T10:11:05.564Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: CONTRIBUTING.md:0-0
Timestamp: 2025-12-12T10:11:05.564Z
Learning: Create a changeset for user-facing bug fixes and features using `just new-changeset`, selecting appropriate packages and change type (`major`, `minor`, or `patch`)

Applied to files:

  • .changeset/strong-mails-raise.md
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/src/**/*.rs : Use `ParseSeparatedList` and `ParseNodeList` for parsing lists with error recovery to avoid infinite loops

Applied to files:

  • crates/biome_css_formatter/src/css/lists/mod.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_list.rs
  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
  • crates/biome_css_parser/src/syntax/at_rule/font_feature_values.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/language_kind.rs : Add a new language prefix to the `LANGUAGE_PREFIXES` constant in `language_kind.rs` file

Applied to files:

  • crates/biome_css_formatter/src/css/lists/mod.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/language_kind.rs : Add a new variant to `LanguageKind` enum in `language_kind.rs` file and implement all methods for the new language variant

Applied to files:

  • crates/biome_css_formatter/src/css/lists/mod.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Applies to crates/biome_formatter/**/biome_*_formatter/src/context.rs : Define `<Language>FormatContext` struct in a `context.rs` file containing `comments` and `source_map` fields, implementing `FormatContext` and `CstFormatContext` traits

Applied to files:

  • crates/biome_css_formatter/src/css/lists/mod.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_list.rs
  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-12-19T12:53:30.399Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_analyze/CONTRIBUTING.md:0-0
Timestamp: 2025-12-19T12:53:30.399Z
Learning: Applies to crates/biome_analyze/**/*analyze/src/lint/nursery/**/*.rs : Add `issue_number` field to `declare_lint_rule!` macro for work-in-progress rules

Applied to files:

  • crates/biome_css_formatter/src/css/lists/mod.rs
📚 Learning: 2025-12-12T10:11:05.564Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: CONTRIBUTING.md:0-0
Timestamp: 2025-12-12T10:11:05.564Z
Learning: Applies to crates/**/*.rs : Update inline rustdoc documentation for rules, assists, and their options when adding new features or changing existing features in Rust crates

Applied to files:

  • crates/biome_css_formatter/src/css/lists/mod.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_list.rs
  • crates/biome_css_formatter/src/generated.rs
  • crates/biome_css_parser/src/syntax/at_rule/font_feature_values.rs
📚 Learning: 2025-12-19T12:53:30.399Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_analyze/CONTRIBUTING.md:0-0
Timestamp: 2025-12-19T12:53:30.399Z
Learning: Applies to crates/biome_analyze/**/*analyze/src/**/*.rs : Add `sources` field with `RuleSource` to cite ESLint or other rules that inspired the implementation

Applied to files:

  • crates/biome_css_formatter/src/css/lists/mod.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Applies to crates/biome_formatter/**/biome_*_formatter/src/comments.rs : Define `<Language>CommentStyle` as a public type alias for `Comments<<Language>Language>` in a `comments.rs` file

Applied to files:

  • crates/biome_css_formatter/src/css/lists/mod.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/*.ungram : Nodes that represent a list must end with the postfix `List`, e.g., `HtmlAttributeList`, and lists are mandatory (not optional) but empty by default

Applied to files:

  • crates/biome_css_formatter/src/css/lists/mod.rs
  • crates/biome_css_parser/src/syntax/at_rule/font_feature_values.rs
📚 Learning: 2025-11-24T18:05:27.810Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_js_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:27.810Z
Learning: Applies to crates/biome_js_formatter/**/*.rs : Import the `FormatNode` trait and implement it for your Node when creating formatters in biome_js_formatter

Applied to files:

  • crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_list.rs
  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Applies to crates/biome_formatter/**/biome_*_formatter/tests/language.rs : Implement `TestFormatLanguage` trait in `tests/language.rs` for the formatter's test language

Applied to files:

  • crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs
  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-12-19T12:53:30.399Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_analyze/CONTRIBUTING.md:0-0
Timestamp: 2025-12-19T12:53:30.399Z
Learning: Applies to crates/biome_analyze/**/biome_rule_options/lib/**/*.rs : Wrap rule options fields in `Option<>` to properly track set and unset options during merge

Applied to files:

  • crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Applies to crates/biome_formatter/**/biome_*_formatter/src/lib.rs : Define a type alias `<Language>Formatter<'buf>` as `Formatter<'buf, <Language>FormatContext>` in the main formatter crate

Applied to files:

  • crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_list.rs
  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-12-19T12:53:30.399Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_analyze/CONTRIBUTING.md:0-0
Timestamp: 2025-12-19T12:53:30.399Z
Learning: Applies to crates/biome_analyze/**/*analyze/src/**/*.rs : Rule documentation code blocks should be ordered as language, expect_diagnostic, options/full_options/use_options, ignore, file

Applied to files:

  • crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Create a new formatter crate using the command `just new-crate biome_<language>_formatter` where `<language>` is the target language (e.g., `biome_html_formatter` for HTML)

Applied to files:

  • crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Define `FormatHtmlSyntaxNode` struct in a `cst.rs` file implementing `FormatRule<HtmlSyntaxNode>`, `AsFormat<HtmlFormatContext>`, and `IntoFormat<HtmlFormatContext>` traits using the provided boilerplate code

Applied to files:

  • crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_list.rs
  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Applies to crates/biome_formatter/**/biome_*_formatter/src/lib.rs : Expose a public `format_node` function that accepts formatting options and a root syntax node, returning a `FormatResult<Formatted<Context>>` with appropriate documentation

Applied to files:

  • crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_list.rs
  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Implement the `FormatNodeRule<N>` trait with `fmt_fields` as the only required method; default implementations of `fmt`, `is_suppressed`, `fmt_leading_comments`, `fmt_dangling_comments`, and `fmt_trailing_comments` are provided

Applied to files:

  • crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_list.rs
📚 Learning: 2025-12-19T12:53:30.399Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_analyze/CONTRIBUTING.md:0-0
Timestamp: 2025-12-19T12:53:30.399Z
Learning: Applies to crates/biome_analyze/**/*analyze/src/**/*.rs : Prefix line with `#` in documentation code examples sparingly; prefer concise complete snippets

Applied to files:

  • crates/biome_css_formatter/src/css/lists/custom_identifier_list.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Implement the `IntoFormat<Context>` trait in `lib.rs` with implementations for `SyntaxResult` and `Option` types as part of the formatter infrastructure

Applied to files:

  • crates/biome_css_formatter/src/css/lists/custom_identifier_list.rs
  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Implement the `AsFormat<Context>` trait in `lib.rs` with generic implementations for references, `SyntaxResult`, and `Option` types as provided in the formatter boilerplate code

Applied to files:

  • crates/biome_css_formatter/src/css/lists/custom_identifier_list.rs
  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:27.810Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_js_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:27.810Z
Learning: The formatter foundation relies on using the generic `Format` trait and `FormatNode` for nodes, with creation of an intermediate IR via a series of helpers

Applied to files:

  • crates/biome_css_formatter/src/css/lists/custom_identifier_list.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Implement the `FormattedIterExt` trait and `FormattedIter` struct in `lib.rs` to provide iterator extensions for formatting

Applied to files:

  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Implement the `FormatLanguage` trait with `SyntaxLanguage`, `Context`, and `FormatRule` associated types for the language's formatter

Applied to files:

  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/src/**/*.rs : Parse rule functions must be prefixed with `parse_` and use the name defined in the grammar file, e.g., `parse_for_statement` or `parse_expression`

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
  • crates/biome_css_parser/src/syntax/at_rule/font_feature_values.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/src/**/*.rs : Implement error recovery in list parsing using `or_recover()` to wrap unparseable tokens in a `BOGUS_*` node and consume tokens until a recovery token is found

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
  • crates/biome_css_parser/src/syntax/at_rule/font_feature_values.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/src/**/*.rs : Use `ConditionalParsedSyntax` for syntax that is only valid in specific contexts (e.g., strict mode, file types, language versions) and call `or_invalid_to_bogus()` to convert to a bogus node if not supported

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
📚 Learning: 2025-11-24T18:05:27.810Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_js_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:27.810Z
Learning: Applies to crates/biome_js_formatter/**/*.rs : When formatting AST nodes, use mandatory tokens from the AST instead of hardcoding token strings (e.g., use `node.l_paren_token().format()` instead of `token("(")`)

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
  • crates/biome_css_parser/src/syntax/at_rule/font_feature_values.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/src/**/*.rs : Parse rules must take a mutable reference to the parser as their only parameter and return a `ParsedSyntax`

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/src/**/*.rs : Use `p.eat(token)` for optional tokens, `p.expect(token)` for required tokens, `parse_rule(p).ok(p)` for optional nodes, and `parse_rule(p).or_add_diagnostic(p, error)` for required nodes

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/src/**/*.rs : Parse rules must return `ParsedSyntax::Absent` if the rule can't predict by the next token(s) if they form the expected node, and must not progress the parser in this case

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/*.ungram : Nodes for enclosing syntax errors must have the `Bogus` word, e.g., `HtmlBogusAttribute`, and must be part of a variant

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/src/**/*.rs : A parser struct must implement the `Parser` trait and save the token source, parser context, and optional parser options

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
📚 Learning: 2025-12-19T12:53:30.399Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_analyze/CONTRIBUTING.md:0-0
Timestamp: 2025-12-19T12:53:30.399Z
Learning: Applies to crates/biome_analyze/**/biome_rule_options/lib/**/*.rs : Use `rename_all = "camelCase"` in serde derive macro for rule options

Applied to files:

  • crates/biome_css_parser/src/syntax/at_rule/font_feature_values.rs
📚 Learning: 2025-12-19T12:53:30.399Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_analyze/CONTRIBUTING.md:0-0
Timestamp: 2025-12-19T12:53:30.399Z
Learning: Applies to crates/biome_analyze/**/*analyze/src/**/*.rs : Assist rules should detect refactoring opportunities and emit code action signals

Applied to files:

  • crates/biome_css_parser/src/syntax/at_rule/font_feature_values.rs
🧬 Code graph analysis (3)
crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs (2)
crates/biome_css_formatter/src/css/lists/custom_identifier_list.rs (2)
  • with_options (51-54)
  • fmt (59-78)
crates/biome_formatter/src/builders.rs (2)
  • space (606-608)
  • soft_line_break_or_space (188-190)
crates/biome_css_formatter/src/css/lists/custom_identifier_list.rs (1)
crates/biome_formatter/src/builders.rs (2)
  • space (606-608)
  • soft_line_break_or_space (188-190)
crates/biome_css_parser/src/syntax/at_rule/font_feature_values.rs (1)
crates/biome_css_parser/src/syntax/parse_error.rs (1)
  • expected_non_css_wide_keyword_identifier (20-44)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Lint project (depot-windows-2022)
🔇 Additional comments (14)
xtask/codegen/css.ungram (1)

798-807: LGTM! Clean separation of concerns.

The grammar correctly distinguishes between space-separated custom identifiers (for font family names like "Times New Roman") and comma-separated identifiers (for :active-view-transition-type). The grammar syntax follows the established patterns.

crates/biome_css_parser/src/syntax/at_rule/font_feature_values.rs (1)

167-227: LGTM! Consistent rename and correct recovery logic.

The rename from CssCustomIdentifierList to CssCustomIdentifierSpaceSeparatedList is applied consistently across the struct, implementation, and recovery types. The is_at_list_end correctly checks for both '{' and ',' tokens, which makes sense for space-separated identifiers within a comma-separated list context.

crates/biome_css_formatter/src/css/lists/custom_identifier_list.rs (1)

59-78: LGTM! Correct comma-separated formatting.

The implementation now correctly formats comma-separated custom identifiers. The format_separated(",") handles comma insertion, whilst the joiner separator controls whitespace/line breaks after commas. This produces proper CSS syntax like :active-view-transition-type(value1, value2).

crates/biome_css_formatter/src/css/lists/mod.rs (1)

8-8: LGTM! Module correctly exposed.

The new custom_identifier_space_separated_list module is properly exposed as internal-only and maintains alphabetical ordering.

crates/biome_css_parser/tests/css_test_suite/ok/selector/pseudo_class/pseudo_class_function_custom_identifier_list.css (1)

1-2: LGTM! Test correctly updated.

The test now uses comma-separated custom identifiers, which matches the CSS spec and MDN examples for :active-view-transition-type.

xtask/codegen/src/css_kinds_src.rs (1)

444-444: LGTM! Node kind correctly added.

The new CSS_CUSTOM_IDENTIFIER_SPACE_SEPARATED_LIST node kind is properly added to the code generation in alphabetical order.

crates/biome_css_parser/tests/css_test_suite/error/selector/pseudo_class/pseudo_class_function_custom_identifier_list_error.css (1)

1-12: LGTM! Error tests correctly updated.

The error test cases now use comma-separated format whilst maintaining the same error conditions (invalid identifiers like numbers and string literals).

crates/biome_css_formatter/tests/specs/css/pseudo/pseudo_class_function_custom_identifier_list.css (1)

1-41: LGTM! Formatter test correctly reflects comma-separated syntax.

The trailing commas now properly format the comma-separated custom identifier lists for :active-view-transition-type(), matching the spec.

crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs (1)

8-8: Excellent! Correctly implements comma-separated parsing.

The switch from ParseNodeList to ParseSeparatedList with the comma separator properly implements the spec-compliant syntax. The pattern matches the existing implementation in font_feature_values.rs.

Based on learnings, using ParseSeparatedList ensures proper error recovery for list parsing.

Also applies to: 59-59, 84-86

crates/biome_css_formatter/src/generated.rs (1)

6868-6879: New list formatter wiring looks correct

The AsFormat/IntoFormat impls for CssCustomIdentifierSpaceSeparatedList follow the same pattern as CssCustomIdentifierList and point at the expected custom_identifier_space_separated_list rule. Assuming this was generated via cargo codegen formatter, this hook-up looks spot on.

crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs (4)

1-3: Imports look good.

The reuse of CssCustomIdentifierLayout from the sibling module maintains consistency between the comma-separated and space-separated formatters.


5-13: Struct declarations follow the standard formatter pattern.

The implementation correctly mirrors the structure of the comma-separated list formatter, using the same layout options for consistency.


15-24: Standard options wiring—correct.


26-46: Formatting logic is correct for space-separated identifiers.

The use of node.iter().formatted() (without comma separation) properly distinguishes this from the comma-separated list formatter. The OneLine and Fluid layouts behave as expected.

Copy link
Contributor

@dyc3 dyc3 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looking good, just a couple notes.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (2)
crates/biome_css_formatter/src/css/lists/custom_identifier_comma_separated_list.rs (2)

41-46: Consider extracting shared layout enum.

CssCustomIdentifierLayout is used by both comma-separated and space-separated list formatters, but it's currently defined in the comma-separated module, creating a cross-module dependency. Consider extracting it to a parent or shared module to avoid this coupling.


68-84: Consider using .entries() for consistency.

The space-separated formatter uses the more concise .entries(node.iter().formatted()) pattern, whilst this manually loops with .entry(). If format_separated() returns an iterator, you could use .entries(node.format_separated(",")) for consistency.

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2a752b1 and 772951d.

⛔ Files ignored due to path filters (9)
  • crates/biome_css_factory/src/generated/node_factory.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_css_factory/src/generated/syntax_factory.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_css_formatter/tests/specs/css/pseudo/pseudo_class_function_custom_identifier_comma_separated_list.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_parser/tests/css_test_suite/error/selector/pseudo_class/pseudo_class_function_custom_identifier_comma_separated_list_error.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_parser/tests/css_test_suite/ok/selector/pseudo_class/pseudo_class_function_custom_identifier_comma_separated_list.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_syntax/src/generated/kind.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_css_syntax/src/generated/macros.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_css_syntax/src/generated/nodes.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_css_syntax/src/generated/nodes_mut.rs is excluded by !**/generated/**, !**/generated/** and included by **
📒 Files selected for processing (17)
  • .changeset/strong-mails-raise.md (1 hunks)
  • crates/biome_css_formatter/src/css/any/pseudo_class.rs (1 hunks)
  • crates/biome_css_formatter/src/css/lists/custom_identifier_comma_separated_list.rs (1 hunks)
  • crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs (1 hunks)
  • crates/biome_css_formatter/src/css/lists/mod.rs (1 hunks)
  • crates/biome_css_formatter/src/css/pseudo/mod.rs (1 hunks)
  • crates/biome_css_formatter/src/css/pseudo/pseudo_class_function_custom_identifier_comma_separated_list.rs (1 hunks)
  • crates/biome_css_formatter/src/css/pseudo/pseudo_class_function_custom_identifier_list.rs (0 hunks)
  • crates/biome_css_formatter/src/generated.rs (2 hunks)
  • crates/biome_css_formatter/tests/specs/css/pseudo/pseudo_class_function_custom_identifier_comma_separated_list.css (1 hunks)
  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_comma_separated_list.rs (4 hunks)
  • crates/biome_css_parser/src/syntax/selector/pseudo_class/mod.rs (3 hunks)
  • crates/biome_css_parser/tests/css_test_suite/error/selector/pseudo_class/pseudo_class_function_custom_identifier_comma_separated_list_error.css (1 hunks)
  • crates/biome_css_parser/tests/css_test_suite/ok/selector/pseudo_class/pseudo_class_function_custom_identifier_comma_separated_list.css (1 hunks)
  • crates/biome_css_semantic/src/semantic_model/specificity.rs (1 hunks)
  • xtask/codegen/css.ungram (3 hunks)
  • xtask/codegen/src/css_kinds_src.rs (2 hunks)
💤 Files with no reviewable changes (1)
  • crates/biome_css_formatter/src/css/pseudo/pseudo_class_function_custom_identifier_list.rs
✅ Files skipped from review due to trivial changes (1)
  • crates/biome_css_parser/tests/css_test_suite/error/selector/pseudo_class/pseudo_class_function_custom_identifier_comma_separated_list_error.css
🚧 Files skipped from review as they are similar to previous changes (2)
  • xtask/codegen/src/css_kinds_src.rs
  • .changeset/strong-mails-raise.md
🧰 Additional context used
📓 Path-based instructions (1)
**/*.rs

📄 CodeRabbit inference engine (CONTRIBUTING.md)

**/*.rs: Use inline rustdoc documentation for rules, assists, and their options
Use the dbg!() macro for debugging output in Rust tests and code
Use doc tests (doctest) format with code blocks in rustdoc comments; ensure assertions pass in tests

Files:

  • crates/biome_css_formatter/src/css/pseudo/mod.rs
  • crates/biome_css_formatter/src/css/pseudo/pseudo_class_function_custom_identifier_comma_separated_list.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_comma_separated_list.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs
  • crates/biome_css_formatter/src/css/any/pseudo_class.rs
  • crates/biome_css_formatter/src/css/lists/mod.rs
  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_comma_separated_list.rs
  • crates/biome_css_semantic/src/semantic_model/specificity.rs
  • crates/biome_css_parser/src/syntax/selector/pseudo_class/mod.rs
  • crates/biome_css_formatter/src/generated.rs
🧠 Learnings (36)
📚 Learning: 2025-12-04T13:29:49.287Z
Learnt from: dyc3
Repo: biomejs/biome PR: 8291
File: crates/biome_html_formatter/tests/specs/prettier/vue/html-vue/elastic-header.html:10-10
Timestamp: 2025-12-04T13:29:49.287Z
Learning: Files under `crates/biome_html_formatter/tests/specs/prettier` are test fixtures synced from Prettier and should not receive detailed code quality reviews (e.g., HTTP vs HTTPS, formatting suggestions, etc.). These files are test data meant to validate formatter behavior and should be preserved as-is.

Applied to files:

  • crates/biome_css_formatter/tests/specs/css/pseudo/pseudo_class_function_custom_identifier_comma_separated_list.css
  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-12-19T12:53:30.399Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_analyze/CONTRIBUTING.md:0-0
Timestamp: 2025-12-19T12:53:30.399Z
Learning: Applies to crates/biome_analyze/**/biome_rule_options/lib/**/*.rs : Use `rename_all = "camelCase"` in serde derive macro for rule options

Applied to files:

  • crates/biome_css_formatter/src/css/pseudo/mod.rs
  • crates/biome_css_formatter/src/css/any/pseudo_class.rs
  • crates/biome_css_parser/src/syntax/selector/pseudo_class/mod.rs
  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/src/**/*.rs : Parse rule functions must be prefixed with `parse_` and use the name defined in the grammar file, e.g., `parse_for_statement` or `parse_expression`

Applied to files:

  • crates/biome_css_formatter/src/css/pseudo/mod.rs
  • crates/biome_css_formatter/src/css/pseudo/pseudo_class_function_custom_identifier_comma_separated_list.rs
  • crates/biome_css_formatter/src/css/any/pseudo_class.rs
  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_comma_separated_list.rs
  • crates/biome_css_parser/src/syntax/selector/pseudo_class/mod.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/src/**/*.rs : Use `ParseSeparatedList` and `ParseNodeList` for parsing lists with error recovery to avoid infinite loops

Applied to files:

  • crates/biome_css_formatter/src/css/pseudo/mod.rs
  • crates/biome_css_formatter/src/css/pseudo/pseudo_class_function_custom_identifier_comma_separated_list.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_comma_separated_list.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs
  • crates/biome_css_formatter/src/css/any/pseudo_class.rs
  • crates/biome_css_formatter/src/css/lists/mod.rs
  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_comma_separated_list.rs
  • crates/biome_css_parser/src/syntax/selector/pseudo_class/mod.rs
  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:42.356Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_js_type_info/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:42.356Z
Learning: Applies to crates/biome_js_type_info/**/*.rs : Use `TypeReference` instead of `Arc` for types that reference other types to avoid stale cache issues when modules are replaced

Applied to files:

  • crates/biome_css_formatter/src/css/pseudo/mod.rs
📚 Learning: 2025-12-19T12:53:30.399Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_analyze/CONTRIBUTING.md:0-0
Timestamp: 2025-12-19T12:53:30.399Z
Learning: Applies to crates/biome_analyze/**/*analyze/src/**/*.rs : Assist rules should detect refactoring opportunities and emit code action signals

Applied to files:

  • crates/biome_css_formatter/src/css/pseudo/mod.rs
  • crates/biome_css_semantic/src/semantic_model/specificity.rs
  • crates/biome_css_parser/src/syntax/selector/pseudo_class/mod.rs
  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/language_kind.rs : Add a new language prefix to the `LANGUAGE_PREFIXES` constant in `language_kind.rs` file

Applied to files:

  • crates/biome_css_formatter/src/css/pseudo/mod.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Applies to crates/biome_formatter/**/biome_*_formatter/src/comments.rs : Define `<Language>CommentStyle` as a public type alias for `Comments<<Language>Language>` in a `comments.rs` file

Applied to files:

  • crates/biome_css_formatter/src/css/pseudo/mod.rs
📚 Learning: 2025-11-24T18:05:27.810Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_js_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:27.810Z
Learning: Applies to crates/biome_js_formatter/**/*.rs : Import the `FormatNode` trait and implement it for your Node when creating formatters in biome_js_formatter

Applied to files:

  • crates/biome_css_formatter/src/css/pseudo/pseudo_class_function_custom_identifier_comma_separated_list.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_comma_separated_list.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs
  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:27.810Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_js_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:27.810Z
Learning: Applies to crates/biome_js_formatter/**/*.rs : When formatting AST nodes, use mandatory tokens from the AST instead of hardcoding token strings (e.g., use `node.l_paren_token().format()` instead of `token("(")`)

Applied to files:

  • crates/biome_css_formatter/src/css/pseudo/pseudo_class_function_custom_identifier_comma_separated_list.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_comma_separated_list.rs
  • crates/biome_css_formatter/src/css/any/pseudo_class.rs
  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Applies to crates/biome_formatter/**/biome_*_formatter/src/context.rs : Define `<Language>FormatContext` struct in a `context.rs` file containing `comments` and `source_map` fields, implementing `FormatContext` and `CstFormatContext` traits

Applied to files:

  • crates/biome_css_formatter/src/css/pseudo/pseudo_class_function_custom_identifier_comma_separated_list.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_comma_separated_list.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs
  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-12-19T12:53:30.399Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_analyze/CONTRIBUTING.md:0-0
Timestamp: 2025-12-19T12:53:30.399Z
Learning: Applies to crates/biome_analyze/**/*analyze/src/**/*.rs : Add `sources` field with `RuleSource` to cite ESLint or other rules that inspired the implementation

Applied to files:

  • crates/biome_css_formatter/src/css/pseudo/pseudo_class_function_custom_identifier_comma_separated_list.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs
  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-12-19T12:53:30.399Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_analyze/CONTRIBUTING.md:0-0
Timestamp: 2025-12-19T12:53:30.399Z
Learning: Applies to crates/biome_analyze/**/biome_rule_options/lib/**/*.rs : Wrap rule options fields in `Option<>` to properly track set and unset options during merge

Applied to files:

  • crates/biome_css_formatter/src/css/pseudo/pseudo_class_function_custom_identifier_comma_separated_list.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_comma_separated_list.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs
  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Applies to crates/biome_formatter/**/biome_*_formatter/src/lib.rs : Expose a public `format_node` function that accepts formatting options and a root syntax node, returning a `FormatResult<Formatted<Context>>` with appropriate documentation

Applied to files:

  • crates/biome_css_formatter/src/css/pseudo/pseudo_class_function_custom_identifier_comma_separated_list.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_comma_separated_list.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs
  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Applies to crates/biome_formatter/**/biome_*_formatter/tests/language.rs : Implement `TestFormatLanguage` trait in `tests/language.rs` for the formatter's test language

Applied to files:

  • crates/biome_css_formatter/src/css/pseudo/pseudo_class_function_custom_identifier_comma_separated_list.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_comma_separated_list.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs
📚 Learning: 2025-12-19T12:53:30.399Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_analyze/CONTRIBUTING.md:0-0
Timestamp: 2025-12-19T12:53:30.399Z
Learning: Applies to crates/biome_analyze/**/*analyze/src/lint/nursery/**/*.rs : Add `issue_number` field to `declare_lint_rule!` macro for work-in-progress rules

Applied to files:

  • crates/biome_css_formatter/src/css/pseudo/pseudo_class_function_custom_identifier_comma_separated_list.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Implement the `FormatNodeRule<N>` trait with `fmt_fields` as the only required method; default implementations of `fmt`, `is_suppressed`, `fmt_leading_comments`, `fmt_dangling_comments`, and `fmt_trailing_comments` are provided

Applied to files:

  • crates/biome_css_formatter/src/css/pseudo/pseudo_class_function_custom_identifier_comma_separated_list.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_comma_separated_list.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs
  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Define `FormatHtmlSyntaxNode` struct in a `cst.rs` file implementing `FormatRule<HtmlSyntaxNode>`, `AsFormat<HtmlFormatContext>`, and `IntoFormat<HtmlFormatContext>` traits using the provided boilerplate code

Applied to files:

  • crates/biome_css_formatter/src/css/pseudo/pseudo_class_function_custom_identifier_comma_separated_list.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_comma_separated_list.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs
  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Applies to crates/biome_formatter/**/biome_*_formatter/src/lib.rs : Define a type alias `<Language>Formatter<'buf>` as `Formatter<'buf, <Language>FormatContext>` in the main formatter crate

Applied to files:

  • crates/biome_css_formatter/src/css/lists/custom_identifier_comma_separated_list.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs
  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Create a new formatter crate using the command `just new-crate biome_<language>_formatter` where `<language>` is the target language (e.g., `biome_html_formatter` for HTML)

Applied to files:

  • crates/biome_css_formatter/src/css/lists/custom_identifier_comma_separated_list.rs
  • crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Implement the `FormattedIterExt` trait and `FormattedIter` struct in `lib.rs` to provide iterator extensions for formatting

Applied to files:

  • crates/biome_css_formatter/src/css/lists/custom_identifier_comma_separated_list.rs
📚 Learning: 2025-12-19T12:53:30.399Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_analyze/CONTRIBUTING.md:0-0
Timestamp: 2025-12-19T12:53:30.399Z
Learning: Applies to crates/biome_analyze/**/*analyze/src/**/*.rs : Rule documentation code blocks should be ordered as language, expect_diagnostic, options/full_options/use_options, ignore, file

Applied to files:

  • crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs
📚 Learning: 2025-12-19T12:53:30.399Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_analyze/CONTRIBUTING.md:0-0
Timestamp: 2025-12-19T12:53:30.399Z
Learning: Applies to crates/biome_analyze/**/*analyze/src/**/*.rs : Use generic rule names if the rule could potentially be implemented for multiple languages

Applied to files:

  • crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs
📚 Learning: 2025-12-19T12:53:30.399Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_analyze/CONTRIBUTING.md:0-0
Timestamp: 2025-12-19T12:53:30.399Z
Learning: Applies to crates/biome_analyze/**/*analyze/src/**/*.rs : Rule documentation must include `## Options` section if the rule has options

Applied to files:

  • crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs
📚 Learning: 2025-12-19T12:53:30.399Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_analyze/CONTRIBUTING.md:0-0
Timestamp: 2025-12-19T12:53:30.399Z
Learning: Applies to crates/biome_analyze/**/*analyze/src/**/*.rs : Use `options` code block property for rule-specific configuration snippets in documentation

Applied to files:

  • crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/*.ungram : Nodes that represent a list must end with the postfix `List`, e.g., `HtmlAttributeList`, and lists are mandatory (not optional) but empty by default

Applied to files:

  • crates/biome_css_formatter/src/css/lists/mod.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/src/**/*.rs : Implement error recovery in list parsing using `or_recover()` to wrap unparseable tokens in a `BOGUS_*` node and consume tokens until a recovery token is found

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_comma_separated_list.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/src/**/*.rs : Use `p.eat(token)` for optional tokens, `p.expect(token)` for required tokens, `parse_rule(p).ok(p)` for optional nodes, and `parse_rule(p).or_add_diagnostic(p, error)` for required nodes

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_comma_separated_list.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/src/**/*.rs : Use `ConditionalParsedSyntax` for syntax that is only valid in specific contexts (e.g., strict mode, file types, language versions) and call `or_invalid_to_bogus()` to convert to a bogus node if not supported

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_comma_separated_list.rs
  • crates/biome_css_parser/src/syntax/selector/pseudo_class/mod.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/src/**/*.rs : Parse rules must return `ParsedSyntax::Absent` if the rule can't predict by the next token(s) if they form the expected node, and must not progress the parser in this case

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_comma_separated_list.rs
📚 Learning: 2025-12-19T12:53:30.399Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_analyze/CONTRIBUTING.md:0-0
Timestamp: 2025-12-19T12:53:30.399Z
Learning: Applies to crates/biome_analyze/**/*analyze/src/**/*.rs : Use `Semantic<>` query type to access semantic model information like scopes and declarations

Applied to files:

  • crates/biome_css_semantic/src/semantic_model/specificity.rs
📚 Learning: 2025-12-19T12:53:30.399Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_analyze/CONTRIBUTING.md:0-0
Timestamp: 2025-12-19T12:53:30.399Z
Learning: Applies to crates/biome_analyze/**/*analyze/src/**/*.rs : Check if a variable is global using the semantic model to avoid false positives

Applied to files:

  • crates/biome_css_semantic/src/semantic_model/specificity.rs
📚 Learning: 2025-12-19T12:53:30.399Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_analyze/CONTRIBUTING.md:0-0
Timestamp: 2025-12-19T12:53:30.399Z
Learning: Applies to crates/biome_analyze/**/biome_rule_options/lib/**/*.rs : Implement `Merge` trait for rule options to support configuration inheritance

Applied to files:

  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Implement the `IntoFormat<Context>` trait in `lib.rs` with implementations for `SyntaxResult` and `Option` types as part of the formatter infrastructure

Applied to files:

  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Implement the `AsFormat<Context>` trait in `lib.rs` with generic implementations for references, `SyntaxResult`, and `Option` types as provided in the formatter boilerplate code

Applied to files:

  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Implement the `FormatLanguage` trait with `SyntaxLanguage`, `Context`, and `FormatRule` associated types for the language's formatter

Applied to files:

  • crates/biome_css_formatter/src/generated.rs
🧬 Code graph analysis (5)
crates/biome_css_formatter/src/css/pseudo/pseudo_class_function_custom_identifier_comma_separated_list.rs (3)
crates/biome_css_syntax/src/file_source.rs (1)
  • css (35-39)
crates/biome_formatter/src/builders.rs (1)
  • soft_block_indent (1260-1265)
crates/biome_css_formatter/src/css/lists/custom_identifier_comma_separated_list.rs (1)
  • with_fluid_layout (17-20)
crates/biome_css_formatter/src/css/lists/custom_identifier_comma_separated_list.rs (2)
crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs (1)
  • with_options (22-25)
crates/biome_formatter/src/builders.rs (2)
  • space (606-608)
  • soft_line_break_or_space (188-190)
crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs (2)
crates/biome_css_formatter/src/css/lists/custom_identifier_comma_separated_list.rs (1)
  • with_options (53-56)
crates/biome_formatter/src/builders.rs (2)
  • space (606-608)
  • soft_line_break_or_space (188-190)
crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_comma_separated_list.rs (1)
crates/biome_css_parser/src/syntax/parse_error.rs (1)
  • expected_non_css_wide_keyword_identifier (20-44)
crates/biome_css_parser/src/syntax/selector/pseudo_class/mod.rs (1)
crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_comma_separated_list.rs (2)
  • is_at_pseudo_class_function_custom_identifier_comma_separated_list (18-23)
  • parse_pseudo_class_function_custom_identifier_comma_separated_list (26-58)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (12)
  • GitHub Check: Test (depot-windows-2022-16)
  • GitHub Check: Parser conformance
  • GitHub Check: Lint project (depot-windows-2022)
  • GitHub Check: Test Node.js API
  • GitHub Check: Lint project (depot-ubuntu-24.04-arm-16)
  • GitHub Check: Test (depot-ubuntu-24.04-arm-16)
  • GitHub Check: Documentation
  • GitHub Check: Check Dependencies
  • GitHub Check: Bench (biome_css_analyze)
  • GitHub Check: Bench (biome_css_parser)
  • GitHub Check: Bench (biome_css_formatter)
  • GitHub Check: autofix
🔇 Additional comments (18)
crates/biome_css_parser/tests/css_test_suite/ok/selector/pseudo_class/pseudo_class_function_custom_identifier_comma_separated_list.css (1)

1-2: Test correctly demonstrates comma-separated parsing.

This test validates that :active-view-transition-type now accepts comma-separated custom identifiers per the spec. Nice work!

Optional: The test includes duplicate values (backwards and forwards each appear twice). If this is intentional to verify the parser handles repetition, brilliant. Otherwise, consider whether unique values might make the test clearer.

xtask/codegen/css.ungram (3)

230-230: LGTM! Naming follows feedback.

The variant name correctly indicates comma-separation, addressing the past review comment.


401-405: Correct structure for comma-separated lists.

The definition properly uses CssCustomIdentifierCommaSeparatedList for the items field, matching the spec requirements.


799-807: Well-separated concerns.

The grammar correctly distinguishes space-separated lists (for font family names) from comma-separated lists (for pseudo-class functions), each with appropriate syntax.

crates/biome_css_formatter/src/css/pseudo/pseudo_class_function_custom_identifier_comma_separated_list.rs (1)

15-44: Clean implementation.

The formatter correctly lowercases the pseudo-class name and uses fluid layout with soft indentation for the comma-separated identifiers. Well done.

crates/biome_css_formatter/src/css/pseudo/mod.rs (1)

6-6: Correct module rename.

The module name now accurately reflects the comma-separated nature of the list.

crates/biome_css_formatter/src/css/lists/custom_identifier_space_separated_list.rs (1)

28-47: Clean formatter implementation.

The logic correctly formats space-separated identifiers with the chosen layout. The use of .entries() is more concise than a manual loop.

crates/biome_css_formatter/src/css/lists/mod.rs (1)

7-8: Appropriate module split.

Separating comma-separated and space-separated list formatters into distinct modules clarifies their different purposes.

crates/biome_css_formatter/src/css/any/pseudo_class.rs (1)

17-19: Correct variant handling.

The match arm now correctly handles the comma-separated variant of the custom identifier list.

crates/biome_css_formatter/tests/specs/css/pseudo/pseudo_class_function_custom_identifier_comma_separated_list.css (1)

1-41: Good test coverage.

The test cases exercise comma-separated identifiers with irregular spacing and indentation, validating the formatter's normalisation behaviour.

crates/biome_css_semantic/src/semantic_model/specificity.rs (1)

112-114: LGTM! Type rename correctly aligned with parser changes.

The match arm update correctly tracks the parser layer's rename to CssPseudoClassFunctionCustomIdentifierCommaSeparatedList. The specificity calculation remains correct per CSS spec — pseudo-class functions receive CLASS_SPECIFICITY regardless of comma or space separation.

crates/biome_css_parser/src/syntax/selector/pseudo_class/mod.rs (1)

4-4: LGTM! Module and function references correctly updated.

The module path and function call updates are consistent throughout. The parsing order is preserved — checking for comma-separated lists before falling back to single custom identifiers ensures correct precedence.

Also applies to: 41-44, 100-101

crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_comma_separated_list.rs (4)

8-8: LGTM! Import and predicate correctly updated for comma-separated parsing.

The trait change from ParseNodeList to ParseSeparatedList is correct — comma-separated lists require the separated variant. The token set correctly restricts this parser to :active-view-transition-type per the CSS spec.

Also applies to: 14-15, 18-23


26-58: LGTM! Parse function correctly implements comma-separated list handling.

The function properly validates non-empty lists, applies error recovery with eat_or_recover_selector_function_close_token, and falls back to CSS_BOGUS_PSEUDO_CLASS on failure. The use of expected_non_css_wide_keyword_identifier correctly prevents CSS-wide keywords in this context.


60-90: LGTM! List implementation correctly enables comma separation.

The trait change to ParseSeparatedList with the new separating_element_kind method returning T![,] is the key change that implements comma-separated parsing per the CSS spec. The error recovery via or_recover follows the coding guidelines for avoiding infinite loops in list parsing.


92-102: LGTM! Recovery implementation correctly handles parse errors.

The recovery struct appropriately wraps unparseable tokens in CSS_BOGUS_CUSTOM_IDENTIFIER and recovers at closing parenthesis or the next identifier, providing good error resilience per the coding guidelines.

crates/biome_css_formatter/src/generated.rs (2)

4038-4053: Comma‑separated pseudo‑class custom identifier list wiring looks correct

FormatRule, AsFormat, and IntoFormat all consistently target CssPseudoClassFunctionCustomIdentifierCommaSeparatedList and FormatCssPseudoClassFunctionCustomIdentifierCommaSeparatedList, matching the surrounding patterns, so the new list node should format correctly alongside the parser changes.


6847-6869: Separate formatter bindings for comma‑ vs space‑separated custom identifier lists are spot on

Both CssCustomIdentifierCommaSeparatedList and CssCustomIdentifierSpaceSeparatedList are hooked up to their respective FormatCssCustomIdentifier*List implementations via AsFormat/IntoFormat in the same style as other list nodes, which cleanly reflects the grammar split without introducing any inconsistencies here.

…o CssPseudoClassFunctionCustomIdentifierCommaSeparatedList"

This reverts commit 772951d.
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
xtask/codegen/css.ungram (1)

399-405: Update the example comment to reflect comma-separated syntax.

Line 399's comment still shows the old space-separated format (backwards forwards), but the grammar now expects comma-separated. Update it to match the new behaviour.

🔎 Proposed fix
-// :active-view-transition-type(backwards forwards) { }
+// :active-view-transition-type(backwards, forwards) { }
 //  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 CssPseudoClassFunctionCustomIdentifierList =
 	name: CssIdentifier
 	'('
 	items: CssCustomIdentifierCommaSeparatedList
 	')'
📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 772951d and 6c69c79.

⛔ Files ignored due to path filters (9)
  • crates/biome_css_factory/src/generated/node_factory.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_css_factory/src/generated/syntax_factory.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_css_formatter/tests/specs/css/pseudo/pseudo_class_function_custom_identifier_list.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_parser/tests/css_test_suite/error/selector/pseudo_class/pseudo_class_function_custom_identifier_list_error.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_parser/tests/css_test_suite/ok/selector/pseudo_class/pseudo_class_function_custom_identifier_list.css.snap is excluded by !**/*.snap and included by **
  • crates/biome_css_syntax/src/generated/kind.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_css_syntax/src/generated/macros.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_css_syntax/src/generated/nodes.rs is excluded by !**/generated/**, !**/generated/** and included by **
  • crates/biome_css_syntax/src/generated/nodes_mut.rs is excluded by !**/generated/**, !**/generated/** and included by **
📒 Files selected for processing (8)
  • crates/biome_css_formatter/src/css/pseudo/pseudo_class_function_custom_identifier_list.rs (2 hunks)
  • crates/biome_css_formatter/src/generated.rs (1 hunks)
  • crates/biome_css_formatter/tests/specs/css/pseudo/pseudo_class_function_custom_identifier_list.css (1 hunks)
  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs (3 hunks)
  • crates/biome_css_parser/tests/css_test_suite/error/selector/pseudo_class/pseudo_class_function_custom_identifier_list_error.css (1 hunks)
  • crates/biome_css_parser/tests/css_test_suite/ok/selector/pseudo_class/pseudo_class_function_custom_identifier_list.css (1 hunks)
  • xtask/codegen/css.ungram (2 hunks)
  • xtask/codegen/src/css_kinds_src.rs (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • crates/biome_css_formatter/src/css/pseudo/pseudo_class_function_custom_identifier_list.rs
  • xtask/codegen/src/css_kinds_src.rs
🧰 Additional context used
📓 Path-based instructions (1)
**/*.rs

📄 CodeRabbit inference engine (CONTRIBUTING.md)

**/*.rs: Use inline rustdoc documentation for rules, assists, and their options
Use the dbg!() macro for debugging output in Rust tests and code
Use doc tests (doctest) format with code blocks in rustdoc comments; ensure assertions pass in tests

Files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
  • crates/biome_css_formatter/src/generated.rs
🧠 Learnings (23)
📚 Learning: 2025-12-04T13:29:49.287Z
Learnt from: dyc3
Repo: biomejs/biome PR: 8291
File: crates/biome_html_formatter/tests/specs/prettier/vue/html-vue/elastic-header.html:10-10
Timestamp: 2025-12-04T13:29:49.287Z
Learning: Files under `crates/biome_html_formatter/tests/specs/prettier` are test fixtures synced from Prettier and should not receive detailed code quality reviews (e.g., HTTP vs HTTPS, formatting suggestions, etc.). These files are test data meant to validate formatter behavior and should be preserved as-is.

Applied to files:

  • crates/biome_css_formatter/tests/specs/css/pseudo/pseudo_class_function_custom_identifier_list.css
  • crates/biome_css_parser/tests/css_test_suite/error/selector/pseudo_class/pseudo_class_function_custom_identifier_list_error.css
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/src/**/*.rs : Use `ParseSeparatedList` and `ParseNodeList` for parsing lists with error recovery to avoid infinite loops

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/src/**/*.rs : Implement error recovery in list parsing using `or_recover()` to wrap unparseable tokens in a `BOGUS_*` node and consume tokens until a recovery token is found

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
📚 Learning: 2025-11-24T18:05:27.810Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_js_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:27.810Z
Learning: Applies to crates/biome_js_formatter/**/*.rs : When formatting AST nodes, use mandatory tokens from the AST instead of hardcoding token strings (e.g., use `node.l_paren_token().format()` instead of `token("(")`)

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/src/**/*.rs : Parse rule functions must be prefixed with `parse_` and use the name defined in the grammar file, e.g., `parse_for_statement` or `parse_expression`

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/src/**/*.rs : Use `ConditionalParsedSyntax` for syntax that is only valid in specific contexts (e.g., strict mode, file types, language versions) and call `or_invalid_to_bogus()` to convert to a bogus node if not supported

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/src/**/*.rs : Use `p.eat(token)` for optional tokens, `p.expect(token)` for required tokens, `parse_rule(p).ok(p)` for optional nodes, and `parse_rule(p).or_add_diagnostic(p, error)` for required nodes

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/src/**/*.rs : Parse rules must return `ParsedSyntax::Absent` if the rule can't predict by the next token(s) if they form the expected node, and must not progress the parser in this case

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/src/**/*.rs : Parse rules must take a mutable reference to the parser as their only parameter and return a `ParsedSyntax`

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/*.ungram : Nodes for enclosing syntax errors must have the `Bogus` word, e.g., `HtmlBogusAttribute`, and must be part of a variant

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
📚 Learning: 2025-11-24T18:06:03.545Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:06:03.545Z
Learning: Applies to crates/biome_parser/**/src/**/*.rs : A parser struct must implement the `Parser` trait and save the token source, parser context, and optional parser options

Applied to files:

  • crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Applies to crates/biome_formatter/**/biome_*_formatter/src/context.rs : Define `<Language>FormatContext` struct in a `context.rs` file containing `comments` and `source_map` fields, implementing `FormatContext` and `CstFormatContext` traits

Applied to files:

  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:27.810Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_js_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:27.810Z
Learning: Applies to crates/biome_js_formatter/**/*.rs : Import the `FormatNode` trait and implement it for your Node when creating formatters in biome_js_formatter

Applied to files:

  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Applies to crates/biome_formatter/**/biome_*_formatter/src/lib.rs : Define a type alias `<Language>Formatter<'buf>` as `Formatter<'buf, <Language>FormatContext>` in the main formatter crate

Applied to files:

  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Applies to crates/biome_formatter/**/biome_*_formatter/tests/language.rs : Implement `TestFormatLanguage` trait in `tests/language.rs` for the formatter's test language

Applied to files:

  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Applies to crates/biome_formatter/**/biome_*_formatter/src/lib.rs : Expose a public `format_node` function that accepts formatting options and a root syntax node, returning a `FormatResult<Formatted<Context>>` with appropriate documentation

Applied to files:

  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-12-19T12:53:30.399Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_analyze/CONTRIBUTING.md:0-0
Timestamp: 2025-12-19T12:53:30.399Z
Learning: Applies to crates/biome_analyze/**/biome_rule_options/lib/**/*.rs : Wrap rule options fields in `Option<>` to properly track set and unset options during merge

Applied to files:

  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Applies to crates/biome_formatter/**/biome_*_formatter/Cargo.toml : Include development dependencies in `Cargo.toml` for formatter tests: `biome_formatter_test`, `biome_<language>_factory`, `biome_<language>_parser`, `biome_parser`, `biome_service`, `countme`, `iai`, `quickcheck`, `quickcheck_macros`, and `tests_macros`

Applied to files:

  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Applies to crates/biome_formatter/**/biome_*_formatter/src/comments.rs : Define `<Language>CommentStyle` as a public type alias for `Comments<<Language>Language>` in a `comments.rs` file

Applied to files:

  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Implement the `AsFormat<Context>` trait in `lib.rs` with generic implementations for references, `SyntaxResult`, and `Option` types as provided in the formatter boilerplate code

Applied to files:

  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Implement the `IntoFormat<Context>` trait in `lib.rs` with implementations for `SyntaxResult` and `Option` types as part of the formatter infrastructure

Applied to files:

  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Define `FormatHtmlSyntaxNode` struct in a `cst.rs` file implementing `FormatRule<HtmlSyntaxNode>`, `AsFormat<HtmlFormatContext>`, and `IntoFormat<HtmlFormatContext>` traits using the provided boilerplate code

Applied to files:

  • crates/biome_css_formatter/src/generated.rs
📚 Learning: 2025-11-24T18:05:20.371Z
Learnt from: CR
Repo: biomejs/biome PR: 0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-11-24T18:05:20.371Z
Learning: Implement the `FormatLanguage` trait with `SyntaxLanguage`, `Context`, and `FormatRule` associated types for the language's formatter

Applied to files:

  • crates/biome_css_formatter/src/generated.rs
🧬 Code graph analysis (1)
crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs (1)
crates/biome_css_parser/src/syntax/at_rule/font_feature_values.rs (1)
  • separating_element_kind (103-105)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (13)
  • GitHub Check: autofix
  • GitHub Check: Test Node.js API
  • GitHub Check: Parser conformance
  • GitHub Check: Lint project (depot-windows-2022)
  • GitHub Check: Bench (biome_css_analyze)
  • GitHub Check: Documentation
  • GitHub Check: Test (depot-windows-2022-16)
  • GitHub Check: Test (depot-ubuntu-24.04-arm-16)
  • GitHub Check: Bench (biome_css_parser)
  • GitHub Check: Lint project (depot-ubuntu-24.04-arm-16)
  • GitHub Check: End-to-end tests
  • GitHub Check: Bench (biome_css_formatter)
  • GitHub Check: Check Dependencies
🔇 Additional comments (9)
crates/biome_css_parser/tests/css_test_suite/error/selector/pseudo_class/pseudo_class_function_custom_identifier_list_error.css (1)

5-11: LGTM!

The error test cases have been correctly updated to use comma-separated format whilst maintaining the invalid identifiers (numbers and strings) that should trigger parser errors.

crates/biome_css_parser/tests/css_test_suite/ok/selector/pseudo_class/pseudo_class_function_custom_identifier_list.css (1)

1-2: LGTM!

Valid test case correctly updated to comma-separated format.

crates/biome_css_formatter/tests/specs/css/pseudo/pseudo_class_function_custom_identifier_list.css (1)

1-41: LGTM!

Formatter test cases correctly demonstrate comma-separated formatting with various whitespace and indentation patterns, including trailing commas.

xtask/codegen/css.ungram (2)

798-799: LGTM!

Correctly uses space-separated variant for font family names per CSS spec.


803-807: LGTM!

The list type definitions are correctly structured and follow the naming convention requested in previous review feedback to clearly indicate the separator type.

crates/biome_css_parser/src/syntax/selector/pseudo_class/function_custom_identifier_list.rs (3)

8-8: LGTM!

Correctly switched from ParseNodeList to ParseSeparatedList to handle comma-separated identifiers.

Also applies to: 59-59


62-62: LGTM!

Constant correctly updated to reference the new comma-separated list kind from the grammar.


84-86: LGTM!

The separating_element_kind method correctly specifies comma as the separator, matching the implementation pattern from font_feature_values.rs.

crates/biome_css_formatter/src/generated.rs (1)

6843-6865: New custom-identifier list wiring looks sound

The AsFormat/IntoFormat impls for CssCustomIdentifierCommaSeparatedList and CssCustomIdentifierSpaceSeparatedList follow the existing generated pattern (Ref/Owned with the matching custom_identifier_*_separated_list rules) and line up with the new list split described in the PR. Assuming this file is wholly code‑generated from the updated grammar/codegen, this looks ready to go.

@taga3s taga3s requested a review from dyc3 December 22, 2025 00:20
Copy link
Contributor

@dyc3 dyc3 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good. Thank you!

@dyc3 dyc3 merged commit 6b09620 into biomejs:main Dec 22, 2025
18 checks passed
@github-actions github-actions bot mentioned this pull request Dec 21, 2025
@taga3s taga3s deleted the fix-issue-8472 branch December 22, 2025 02:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-Formatter Area: formatter A-Parser Area: parser A-Tooling Area: internal tools L-CSS Language: CSS

2 participants