+
Skip to content

Conversation

ematipico
Copy link
Member

@ematipico ematipico commented Apr 29, 2025

Summary

This PR adds the biome_html_analyze to the project, and it adds the relevant plumbing inside the workspace.

I added just one rule for now: noHeaderScope, an easy one to implement.

Test Plan

Added new tests

Docs

biomejs/website#3170

@github-actions github-actions bot added A-CLI Area: CLI A-Project Area: project A-Linter Area: linter A-Tooling Area: internal tools L-HTML Language: HTML labels Apr 29, 2025
Copy link
Contributor

github-actions bot commented Apr 29, 2025

Parser conformance results on

js/262

Test result main count This PR count Difference
Total 50759 50759 0
Passed 49555 49555 0
Failed 1162 1162 0
Panics 42 42 0
Coverage 97.63% 97.63% 0.00%

jsx/babel

Test result main count This PR count Difference
Total 40 40 0
Passed 37 37 0
Failed 3 3 0
Panics 0 0 0
Coverage 92.50% 92.50% 0.00%

symbols/microsoft

Test result main count This PR count Difference
Total 6654 6654 0
Passed 2214 2214 0
Failed 4440 4440 0
Panics 0 0 0
Coverage 33.27% 33.27% 0.00%

ts/babel

Test result main count This PR count Difference
Total 835 835 0
Passed 742 742 0
Failed 93 93 0
Panics 0 0 0
Coverage 88.86% 88.86% 0.00%

ts/microsoft

Test result main count This PR count Difference
Total 18797 18797 0
Passed 14370 14370 0
Failed 4426 4426 0
Panics 1 1 0
Coverage 76.45% 76.45% 0.00%

Copy link

codspeed-hq bot commented Apr 29, 2025

CodSpeed Performance Report

Merging #5814 will not alter performance

Comparing feat/html-analyzer (633d2d1) with next (837f3f3)

Summary

✅ 53 untouched
⏩ 85 skipped1

Footnotes

  1. 85 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.

Copy link

changeset-bot bot commented Oct 3, 2025

⚠️ No Changeset found

Latest commit: 633d2d1

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

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

@ematipico ematipico changed the base branch from main to next October 3, 2025 16:15
@github-actions github-actions bot added A-Parser Area: parser A-Formatter Area: formatter L-JavaScript Language: JavaScript and super languages L-CSS Language: CSS L-JSON Language: JSON and super languages A-Diagnostic Area: diagnostocis L-Grit Language: GritQL labels Oct 3, 2025
@github-actions github-actions bot removed A-Parser Area: parser A-Formatter Area: formatter L-CSS Language: CSS L-Grit Language: GritQL labels Oct 3, 2025
@github-actions github-actions bot removed the A-Diagnostic Area: diagnostocis label Oct 3, 2025
@ematipico ematipico marked this pull request as ready for review October 5, 2025 08:18
@ematipico ematipico requested review from a team October 5, 2025 08:18
Copy link
Contributor

coderabbitai bot commented Oct 5, 2025

Walkthrough

Adds a new workspace crate biome_html_analyze providing HTML analysis entry points (analyze, analyze_with_inspect_matcher), a METADATA registry and visit_registry. Implements HTML suppression handling and a lint category/group a11y with the NoHeaderScope rule (diagnostic + fixer). Wires the crate into biome_cli, biome_service, xtask/codegen and xtask/rules_check. Extends service file handlers (lint, code_actions, fix_all) and documentation registries for HtmlLanguage. Adds tests, specs and suppression snapshots for the new HTML rules.

Possibly related PRs

Suggested reviewers

  • arendjr
  • dyc3

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Title Check ✅ Passed The title succinctly captures the addition of an HTML analyzer feature, directly reflecting the main change of introducing the biome_html_analyze component and workspace plumbing.
Description Check ✅ Passed The description clearly outlines the addition of the biome_html_analyze crate, the initial noHeaderScope rule, and the corresponding tests, and it includes a test plan and documentation reference that directly match the changes introduced.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/html-analyzer

📜 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 c815286 and 633d2d1.

📒 Files selected for processing (1)
  • crates/biome_html_syntax/src/element_ext.rs (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • crates/biome_html_syntax/src/element_ext.rs
⏰ 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). (21)
  • GitHub Check: Test (depot-windows-2022-16)
  • GitHub Check: Test (depot-ubuntu-24.04-arm-16)
  • GitHub Check: Documentation
  • GitHub Check: Lint project (depot-ubuntu-24.04-arm-16)
  • GitHub Check: Bench (biome_package)
  • GitHub Check: Lint project (depot-windows-2022)
  • GitHub Check: autofix
  • GitHub Check: Check Dependencies
  • GitHub Check: Bench (biome_graphql_parser)
  • GitHub Check: Bench (biome_graphql_formatter)
  • GitHub Check: Bench (biome_css_formatter)
  • GitHub Check: Bench (biome_css_analyze)
  • GitHub Check: Bench (biome_json_parser)
  • GitHub Check: Bench (biome_css_parser)
  • GitHub Check: Bench (biome_json_formatter)
  • GitHub Check: Bench (biome_js_parser)
  • GitHub Check: Bench (biome_js_formatter)
  • GitHub Check: Bench (biome_js_analyze)
  • GitHub Check: Bench (biome_json_analyze)
  • GitHub Check: Bench (biome_configuration)
  • GitHub Check: Bench (biome_module_graph)

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: 4

📜 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 837f3f3 and 4a90fd5.

⛔ Files ignored due to path filters (5)
  • Cargo.lock is excluded by !**/*.lock and included by **
  • crates/biome_cli/tests/snapshots/main_cases_html/should_lint_a_html_file.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_analyze/tests/specs/a11y/noHeaderScope/invalid.html.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_analyze/tests/specs/a11y/noHeaderScope/valid.html.snap is excluded by !**/*.snap and included by **
  • crates/biome_html_analyze/tests/suppression/a11y/noHeaderScope/noHeaderScope.html.snap is excluded by !**/*.snap and included by **
📒 Files selected for processing (25)
  • Cargo.toml (1 hunks)
  • crates/biome_cli/Cargo.toml (1 hunks)
  • crates/biome_cli/tests/cases/html.rs (1 hunks)
  • crates/biome_configuration/Cargo.toml (1 hunks)
  • crates/biome_html_analyze/Cargo.toml (1 hunks)
  • crates/biome_html_analyze/src/lib.rs (1 hunks)
  • crates/biome_html_analyze/src/lint.rs (1 hunks)
  • crates/biome_html_analyze/src/lint/a11y.rs (1 hunks)
  • crates/biome_html_analyze/src/lint/a11y/no_header_scope.rs (1 hunks)
  • crates/biome_html_analyze/src/options.rs (1 hunks)
  • crates/biome_html_analyze/src/registry.rs (1 hunks)
  • crates/biome_html_analyze/src/suppression_action.rs (1 hunks)
  • crates/biome_html_analyze/tests/spec_tests.rs (1 hunks)
  • crates/biome_html_analyze/tests/specs/a11y/noHeaderScope/invalid.html (1 hunks)
  • crates/biome_html_analyze/tests/specs/a11y/noHeaderScope/valid.html (1 hunks)
  • crates/biome_html_analyze/tests/suppression/a11y/noHeaderScope/noHeaderScope.html (1 hunks)
  • crates/biome_service/Cargo.toml (1 hunks)
  • crates/biome_service/src/documentation/mod.rs (3 hunks)
  • crates/biome_service/src/file_handlers/html.rs (3 hunks)
  • crates/biome_service/src/file_handlers/mod.rs (7 hunks)
  • xtask/codegen/Cargo.toml (2 hunks)
  • xtask/codegen/src/generate_analyzer.rs (3 hunks)
  • xtask/codegen/src/generate_configuration.rs (4 hunks)
  • xtask/rules_check/Cargo.toml (1 hunks)
  • xtask/rules_check/src/lib.rs (3 hunks)
🧰 Additional context used
📓 Path-based instructions (9)
crates/biome_*_{syntax,parser,formatter,analyze,factory,semantic}/**

📄 CodeRabbit inference engine (CLAUDE.md)

Maintain the per-language crate structure: biome_{lang}_{syntax,parser,formatter,analyze,factory,semantic}

Files:

  • crates/biome_html_analyze/src/options.rs
  • crates/biome_html_analyze/src/lint.rs
  • crates/biome_html_analyze/src/registry.rs
  • crates/biome_html_analyze/src/lint/a11y.rs
  • crates/biome_html_analyze/Cargo.toml
  • crates/biome_html_analyze/src/lint/a11y/no_header_scope.rs
  • crates/biome_html_analyze/tests/suppression/a11y/noHeaderScope/noHeaderScope.html
  • crates/biome_html_analyze/tests/specs/a11y/noHeaderScope/valid.html
  • crates/biome_html_analyze/tests/specs/a11y/noHeaderScope/invalid.html
  • crates/biome_html_analyze/src/suppression_action.rs
  • crates/biome_html_analyze/tests/spec_tests.rs
  • crates/biome_html_analyze/src/lib.rs
crates/biome_*/**

📄 CodeRabbit inference engine (CLAUDE.md)

Place core crates under /crates/biome_*/

Files:

  • crates/biome_html_analyze/src/options.rs
  • crates/biome_html_analyze/src/lint.rs
  • crates/biome_cli/Cargo.toml
  • crates/biome_html_analyze/src/registry.rs
  • crates/biome_html_analyze/src/lint/a11y.rs
  • crates/biome_service/src/documentation/mod.rs
  • crates/biome_html_analyze/Cargo.toml
  • crates/biome_html_analyze/src/lint/a11y/no_header_scope.rs
  • crates/biome_html_analyze/tests/suppression/a11y/noHeaderScope/noHeaderScope.html
  • crates/biome_html_analyze/tests/specs/a11y/noHeaderScope/valid.html
  • crates/biome_service/src/file_handlers/html.rs
  • crates/biome_service/src/file_handlers/mod.rs
  • crates/biome_cli/tests/cases/html.rs
  • crates/biome_html_analyze/tests/specs/a11y/noHeaderScope/invalid.html
  • crates/biome_html_analyze/src/suppression_action.rs
  • crates/biome_configuration/Cargo.toml
  • crates/biome_service/Cargo.toml
  • crates/biome_html_analyze/tests/spec_tests.rs
  • crates/biome_html_analyze/src/lib.rs
**/*.{rs,toml}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Before committing, format Rust and TOML files (e.g., via just f/just format)

Files:

  • crates/biome_html_analyze/src/options.rs
  • crates/biome_html_analyze/src/lint.rs
  • crates/biome_cli/Cargo.toml
  • crates/biome_html_analyze/src/registry.rs
  • crates/biome_html_analyze/src/lint/a11y.rs
  • crates/biome_service/src/documentation/mod.rs
  • xtask/codegen/Cargo.toml
  • crates/biome_html_analyze/Cargo.toml
  • xtask/rules_check/src/lib.rs
  • crates/biome_html_analyze/src/lint/a11y/no_header_scope.rs
  • xtask/codegen/src/generate_analyzer.rs
  • crates/biome_service/src/file_handlers/html.rs
  • xtask/rules_check/Cargo.toml
  • crates/biome_service/src/file_handlers/mod.rs
  • crates/biome_cli/tests/cases/html.rs
  • Cargo.toml
  • crates/biome_html_analyze/src/suppression_action.rs
  • crates/biome_configuration/Cargo.toml
  • crates/biome_service/Cargo.toml
  • crates/biome_html_analyze/tests/spec_tests.rs
  • xtask/codegen/src/generate_configuration.rs
  • crates/biome_html_analyze/src/lib.rs
**/*.rs

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Document rules, assists, and options via inline rustdoc in Rust source

Files:

  • crates/biome_html_analyze/src/options.rs
  • crates/biome_html_analyze/src/lint.rs
  • crates/biome_html_analyze/src/registry.rs
  • crates/biome_html_analyze/src/lint/a11y.rs
  • crates/biome_service/src/documentation/mod.rs
  • xtask/rules_check/src/lib.rs
  • crates/biome_html_analyze/src/lint/a11y/no_header_scope.rs
  • xtask/codegen/src/generate_analyzer.rs
  • crates/biome_service/src/file_handlers/html.rs
  • crates/biome_service/src/file_handlers/mod.rs
  • crates/biome_cli/tests/cases/html.rs
  • crates/biome_html_analyze/src/suppression_action.rs
  • crates/biome_html_analyze/tests/spec_tests.rs
  • xtask/codegen/src/generate_configuration.rs
  • crates/biome_html_analyze/src/lib.rs
**/*.toml

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Format TOML files with taplo (taplo-cli)

Files:

  • crates/biome_cli/Cargo.toml
  • xtask/codegen/Cargo.toml
  • crates/biome_html_analyze/Cargo.toml
  • xtask/rules_check/Cargo.toml
  • Cargo.toml
  • crates/biome_configuration/Cargo.toml
  • crates/biome_service/Cargo.toml
{Cargo.toml,crates/**/Cargo.toml}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Keep all crates on the same version when publishing/releases

Files:

  • crates/biome_cli/Cargo.toml
  • crates/biome_html_analyze/Cargo.toml
  • Cargo.toml
  • crates/biome_configuration/Cargo.toml
  • crates/biome_service/Cargo.toml
crates/**/Cargo.toml

📄 CodeRabbit inference engine (CONTRIBUTING.md)

crates/**/Cargo.toml: For internal crates, use workspace = true for dependencies
For dev-dependencies in internal crates, prefer path dependencies to avoid requiring published versions

Files:

  • crates/biome_cli/Cargo.toml
  • crates/biome_html_analyze/Cargo.toml
  • crates/biome_configuration/Cargo.toml
  • crates/biome_service/Cargo.toml
**/tests/**

📄 CodeRabbit inference engine (CLAUDE.md)

Place test files under a tests/ directory in each crate

Files:

  • crates/biome_html_analyze/tests/suppression/a11y/noHeaderScope/noHeaderScope.html
  • crates/biome_html_analyze/tests/specs/a11y/noHeaderScope/valid.html
  • crates/biome_cli/tests/cases/html.rs
  • crates/biome_html_analyze/tests/specs/a11y/noHeaderScope/invalid.html
  • crates/biome_html_analyze/tests/spec_tests.rs
Cargo.toml

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Define workspace dependencies in the root Cargo.toml using the workspace dependencies table

Files:

  • Cargo.toml
🧠 Learnings (21)
📚 Learning: 2025-10-02T12:58:46.820Z
Learnt from: CR
PR: biomejs/biome#0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-10-02T12:58:46.820Z
Learning: Applies to crates/biome_formatter/biome_html_formatter/Cargo.toml : Add the specified dev-dependencies (biome_formatter_test, biome_html_factory, biome_html_parser, biome_parser, biome_service, countme with feature enable, iai 0.1.1, quickcheck, quickcheck_macros, tests_macros)

Applied to files:

  • crates/biome_cli/Cargo.toml
  • xtask/codegen/Cargo.toml
  • crates/biome_html_analyze/Cargo.toml
  • Cargo.toml
  • crates/biome_configuration/Cargo.toml
  • crates/biome_service/Cargo.toml
📚 Learning: 2025-10-02T12:58:00.892Z
Learnt from: CR
PR: biomejs/biome#0
File: crates/biome_js_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-10-02T12:58:00.892Z
Learning: Applies to crates/biome_js_formatter/**/Cargo.toml : Add the internal formatter dependency in Cargo.toml: biome_js_formatter = { version = "0.0.1", path = "../biome_js_formatter" }

Applied to files:

  • crates/biome_cli/Cargo.toml
  • crates/biome_html_analyze/Cargo.toml
  • Cargo.toml
  • crates/biome_configuration/Cargo.toml
  • crates/biome_service/Cargo.toml
📚 Learning: 2025-10-02T12:55:57.541Z
Learnt from: CR
PR: biomejs/biome#0
File: CONTRIBUTING.md:0-0
Timestamp: 2025-10-02T12:55:57.541Z
Learning: Applies to crates/**/Cargo.toml : For internal crates, use `workspace = true` for dependencies

Applied to files:

  • crates/biome_cli/Cargo.toml
  • crates/biome_html_analyze/Cargo.toml
  • Cargo.toml
  • crates/biome_configuration/Cargo.toml
  • crates/biome_service/Cargo.toml
📚 Learning: 2025-10-02T12:56:59.406Z
Learnt from: CR
PR: biomejs/biome#0
File: crates/biome_diagnostics/CONTRIBUTING.md:0-0
Timestamp: 2025-10-02T12:56:59.406Z
Learning: Applies to crates/biome_diagnostics/crates/biome_diagnostics_categories/src/categories.rs : Register any new diagnostic category statically by adding it to crates/biome_diagnostics_categories/src/categories.rs

Applied to files:

  • crates/biome_html_analyze/src/registry.rs
📚 Learning: 2025-10-02T12:57:33.209Z
Learnt from: CR
PR: biomejs/biome#0
File: crates/biome_analyze/CONTRIBUTING.md:0-0
Timestamp: 2025-10-02T12:57:33.209Z
Learning: Applies to crates/biome_analyze/crates/biome_js_analyze/lib/src/lint/nursery/*.rs : Place all new JavaScript lint rules in the nursery group under biome_js_analyze/lib/src/lint/nursery/<rule_name>.rs

Applied to files:

  • crates/biome_html_analyze/src/lint/a11y.rs
📚 Learning: 2025-10-02T12:58:46.820Z
Learnt from: CR
PR: biomejs/biome#0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-10-02T12:58:46.820Z
Learning: Applies to crates/biome_formatter/biome_html_formatter/src/lib.rs : Implement `FormatLanguage` for `HtmlFormatLanguage` with associated types: `SyntaxLanguage = HtmlLanguage`, `Context = HtmlFormatContext`, `FormatRule = FormatHtmlSyntaxNode`

Applied to files:

  • crates/biome_service/src/documentation/mod.rs
  • xtask/rules_check/src/lib.rs
  • crates/biome_service/src/file_handlers/mod.rs
  • xtask/codegen/src/generate_configuration.rs
📚 Learning: 2025-10-02T13:00:04.816Z
Learnt from: CR
PR: biomejs/biome#0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-10-02T13:00:04.816Z
Learning: Applies to crates/biome_parser/**/language_kind.rs : Add the new language prefix (e.g., html_) to LANGUAGE_PREFIXES in language_kind.rs

Applied to files:

  • crates/biome_service/src/documentation/mod.rs
  • crates/biome_service/src/file_handlers/mod.rs
📚 Learning: 2025-10-02T13:00:04.816Z
Learnt from: CR
PR: biomejs/biome#0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-10-02T13:00:04.816Z
Learning: Applies to crates/biome_parser/**/language_kind.rs : Add a new LanguageKind variant (e.g., Html) in language_kind.rs and implement/cover all methods for it

Applied to files:

  • crates/biome_service/src/documentation/mod.rs
  • crates/biome_service/src/file_handlers/mod.rs
  • xtask/codegen/src/generate_configuration.rs
📚 Learning: 2025-10-02T12:58:46.820Z
Learnt from: CR
PR: biomejs/biome#0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-10-02T12:58:46.820Z
Learning: Applies to crates/biome_formatter/biome_html_formatter/tests/language.rs : Create `HtmlTestFormatLanguage` and implement the `TestFormatLanguage` trait

Applied to files:

  • crates/biome_service/src/documentation/mod.rs
  • crates/biome_cli/tests/cases/html.rs
  • xtask/codegen/src/generate_configuration.rs
📚 Learning: 2025-10-02T12:58:46.820Z
Learnt from: CR
PR: biomejs/biome#0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-10-02T12:58:46.820Z
Learning: Applies to crates/biome_formatter/biome_html_formatter/src/cst.rs : Create FormatHtmlSyntaxNode and implement `FormatRule<HtmlSyntaxNode>` plus `AsFormat<HtmlFormatContext>` and `IntoFormat<HtmlFormatContext>` for HtmlSyntaxNode using the provided mapping code

Applied to files:

  • crates/biome_service/src/documentation/mod.rs
📚 Learning: 2025-10-02T12:58:46.820Z
Learnt from: CR
PR: biomejs/biome#0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-10-02T12:58:46.820Z
Learning: Applies to crates/biome_formatter/biome_html_formatter/src/comments.rs : Define HtmlCommentStyle and implement CommentStyle; create a public type alias `pub type HtmlComments = Comments<HtmlLanguage>;` in comments.rs

Applied to files:

  • crates/biome_service/src/documentation/mod.rs
📚 Learning: 2025-10-02T12:55:57.541Z
Learnt from: CR
PR: biomejs/biome#0
File: CONTRIBUTING.md:0-0
Timestamp: 2025-10-02T12:55:57.541Z
Learning: Applies to Cargo.toml : Define workspace dependencies in the root Cargo.toml using the workspace dependencies table

Applied to files:

  • xtask/codegen/Cargo.toml
  • crates/biome_html_analyze/Cargo.toml
  • xtask/rules_check/Cargo.toml
  • Cargo.toml
  • crates/biome_configuration/Cargo.toml
  • crates/biome_service/Cargo.toml
📚 Learning: 2025-08-17T08:55:30.118Z
Learnt from: CR
PR: biomejs/biome#0
File: CLAUDE.md:0-0
Timestamp: 2025-08-17T08:55:30.118Z
Learning: Applies to crates/biome_*_{syntax,parser,formatter,analyze,factory,semantic}/** : Maintain the per-language crate structure: biome_{lang}_{syntax,parser,formatter,analyze,factory,semantic}

Applied to files:

  • crates/biome_html_analyze/Cargo.toml
  • Cargo.toml
  • crates/biome_configuration/Cargo.toml
  • xtask/codegen/src/generate_configuration.rs
📚 Learning: 2025-10-02T12:58:46.820Z
Learnt from: CR
PR: biomejs/biome#0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-10-02T12:58:46.820Z
Learning: Applies to crates/biome_formatter/biome_html_formatter/tests/spec_tests.rs : Configure test generation using `tests_macros::gen_tests! {"tests/specs/html/**/*.html", crate::spec_test::run, ""}` inside a formatter::html_module module

Applied to files:

  • crates/biome_cli/tests/cases/html.rs
  • crates/biome_html_analyze/tests/spec_tests.rs
📚 Learning: 2025-08-17T08:55:30.118Z
Learnt from: CR
PR: biomejs/biome#0
File: CLAUDE.md:0-0
Timestamp: 2025-08-17T08:55:30.118Z
Learning: Applies to crates/biome_html_formatter/benches/html_formatter.rs : Maintain the HTML formatter benchmark at benches/html_formatter.rs within the biome_html_formatter crate

Applied to files:

  • crates/biome_cli/tests/cases/html.rs
📚 Learning: 2025-10-02T12:58:46.820Z
Learnt from: CR
PR: biomejs/biome#0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-10-02T12:58:46.820Z
Learning: Applies to crates/biome_formatter/biome_html_formatter/tests/spec_test.rs : Provide a `run` function that builds a SpecSnapshot with HtmlFormatLanguage and HtmlTestFormatLanguage and calls `snapshot.test()`

Applied to files:

  • crates/biome_cli/tests/cases/html.rs
  • crates/biome_html_analyze/tests/spec_tests.rs
📚 Learning: 2025-10-02T13:00:04.816Z
Learnt from: CR
PR: biomejs/biome#0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-10-02T13:00:04.816Z
Learning: Applies to crates/biome_parser/crates/biome_*_@(syntax|factory)/** : Create two crates per language: biome_<lang>_syntax and biome_<lang>_factory under crates/

Applied to files:

  • Cargo.toml
📚 Learning: 2025-10-02T13:00:18.232Z
Learnt from: CR
PR: biomejs/biome#0
File: crates/biome_service/CONTRIBUTING.md:0-0
Timestamp: 2025-10-02T13:00:18.232Z
Learning: Applies to crates/biome_service/src/workspace.rs : `Workspace` trait implementation entry point is located at src/workspace.rs

Applied to files:

  • crates/biome_service/Cargo.toml
📚 Learning: 2025-10-02T12:58:46.820Z
Learnt from: CR
PR: biomejs/biome#0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-10-02T12:58:46.820Z
Learning: Applies to crates/biome_formatter/biome_html_formatter/tests/specs/html/**/*.html : Organize formatter specs as .html files under tests/specs/html, potentially grouped into subfolders

Applied to files:

  • crates/biome_html_analyze/tests/spec_tests.rs
📚 Learning: 2025-08-17T08:55:30.118Z
Learnt from: CR
PR: biomejs/biome#0
File: CLAUDE.md:0-0
Timestamp: 2025-08-17T08:55:30.118Z
Learning: Applies to **/tests/specs/**/*.snap : Use snapshot spec tests stored as .snap files under tests/specs/ (via cargo insta)

Applied to files:

  • crates/biome_html_analyze/tests/spec_tests.rs
📚 Learning: 2025-10-02T12:57:33.209Z
Learnt from: CR
PR: biomejs/biome#0
File: crates/biome_analyze/CONTRIBUTING.md:0-0
Timestamp: 2025-10-02T12:57:33.209Z
Learning: Applies to crates/biome_analyze/crates/biome_js_analyze/tests/quick_test.rs : Use tests/quick_test.rs for ad-hoc testing: un-ignore the test and set the rule filter (e.g., RuleFilter::Rule("nursery", "<ruleName>"))

Applied to files:

  • crates/biome_html_analyze/tests/spec_tests.rs
🧬 Code graph analysis (13)
crates/biome_html_analyze/src/lint.rs (1)
packages/@biomejs/backend-jsonrpc/src/workspace.ts (1)
  • A11y (1033-1186)
crates/biome_html_analyze/src/lint/a11y.rs (1)
packages/@biomejs/backend-jsonrpc/src/workspace.ts (1)
  • A11y (1033-1186)
crates/biome_service/src/documentation/mod.rs (2)
crates/biome_html_analyze/src/registry.rs (1)
  • visit_registry (5-7)
crates/biome_service/src/file_handlers/mod.rs (11)
  • record_rule (956-964)
  • record_rule (974-983)
  • record_rule (993-1002)
  • record_rule (1012-1021)
  • record_rule (1031-1040)
  • record_rule (1274-1283)
  • record_rule (1296-1306)
  • record_rule (1320-1330)
  • record_rule (1344-1354)
  • record_rule (1368-1378)
  • record_rule (1477-1482)
xtask/rules_check/src/lib.rs (5)
packages/@biomejs/backend-jsonrpc/src/workspace.ts (2)
  • Language (9440-9442)
  • DocumentFileSource (9403-9411)
crates/biome_html_analyze/src/registry.rs (1)
  • visit_registry (5-7)
crates/biome_service/src/file_handlers/html.rs (1)
  • parse (366-380)
crates/biome_html_parser/src/lib.rs (1)
  • parse_html (37-40)
crates/biome_html_analyze/src/lib.rs (1)
  • analyze (33-44)
crates/biome_html_analyze/src/lint/a11y/no_header_scope.rs (2)
packages/@biomejs/backend-jsonrpc/src/workspace.ts (2)
  • FixKind (7916-7916)
  • Severity (9237-9237)
crates/biome_analyze/src/rule.rs (3)
  • sources (610-613)
  • same (246-251)
  • recommended (595-598)
xtask/codegen/src/generate_analyzer.rs (3)
xtask/src/lib.rs (2)
  • project_root (22-30)
  • reformat (43-45)
crates/biome_service/src/documentation/mod.rs (1)
  • new (51-63)
crates/biome_html_analyze/src/registry.rs (2)
  • visit_registry (5-7)
  • registry (6-6)
crates/biome_service/src/file_handlers/html.rs (4)
packages/@biomejs/backend-jsonrpc/src/workspace.ts (9)
  • DocumentFileSource (9403-9411)
  • CodeAction (9626-9630)
  • FixAction (9750-9759)
  • FixFileMode (9728-9731)
  • FixFileResult (9732-9749)
  • PullActionsResult (9623-9625)
  • CssFileSource (9427-9429)
  • Applicability (9677-9677)
  • BiomePath (9-9)
crates/biome_service/src/file_handlers/mod.rs (12)
  • is_diagnostic_error (811-830)
  • new (542-556)
  • new (771-785)
  • new (1059-1077)
  • new (1391-1405)
  • new (1560-1570)
  • filter (1231-1231)
  • filter (1231-1231)
  • filter (1248-1248)
  • filter (1248-1248)
  • filter (1424-1424)
  • filter (1442-1442)
crates/biome_service/src/file_handlers/css.rs (14)
  • settings (386-386)
  • settings (390-390)
  • settings (394-394)
  • settings (459-459)
  • settings (481-481)
  • settings (499-499)
  • settings (513-513)
  • settings (547-547)
  • settings (616-616)
  • params (659-659)
  • params (762-762)
  • code_actions (589-651)
  • parse (401-442)
  • fix_all (654-782)
crates/biome_service/src/settings.rs (2)
  • analyzer_options (1100-1120)
  • matches (1026-1037)
crates/biome_service/src/file_handlers/mod.rs (4)
xtask/codegen/src/generate_configuration.rs (20)
  • record_category (29-33)
  • record_category (54-58)
  • record_category (73-77)
  • record_category (92-96)
  • record_category (111-115)
  • record_category (136-140)
  • record_category (154-158)
  • record_category (173-177)
  • record_category (192-196)
  • record_category (211-215)
  • record_rule (35-50)
  • record_rule (60-69)
  • record_rule (79-88)
  • record_rule (98-107)
  • record_rule (117-126)
  • record_rule (142-150)
  • record_rule (160-169)
  • record_rule (179-188)
  • record_rule (198-207)
  • record_rule (217-226)
crates/biome_analyze/src/registry.rs (7)
  • record_category (41-43)
  • record_category (149-153)
  • record_rule (51-53)
  • record_rule (84-89)
  • record_rule (162-224)
  • record_group (46-48)
  • record_group (155-159)
crates/biome_service/src/file_handlers/html.rs (3)
  • from (58-62)
  • from (81-94)
  • lint (669-706)
crates/biome_html_analyze/src/registry.rs (1)
  • visit_registry (5-7)
crates/biome_cli/tests/cases/html.rs (2)
crates/biome_cli/tests/main.rs (1)
  • run_cli (332-347)
crates/biome_cli/tests/snap_test.rs (1)
  • assert_cli_snapshot (407-409)
crates/biome_html_analyze/src/suppression_action.rs (1)
crates/biome_rowan/src/syntax/token.rs (1)
  • prev_token (179-181)
crates/biome_html_analyze/tests/spec_tests.rs (3)
crates/biome_html_parser/src/lib.rs (1)
  • parse_html (37-40)
crates/biome_test_utils/src/lib.rs (9)
  • assert_diagnostics_expectation_comment (545-609)
  • assert_errors_are_absent (404-436)
  • code_fix_to_string (347-358)
  • diagnostic_to_string (273-278)
  • has_bogus_nodes_or_empty_slots (384-399)
  • parse_test_path (365-379)
  • register_leak_checker (332-336)
  • scripts_from_json (34-42)
  • write_analyzer_snapshot (438-470)
crates/biome_html_analyze/src/lib.rs (1)
  • analyze (33-44)
xtask/codegen/src/generate_configuration.rs (2)
crates/biome_service/src/file_handlers/mod.rs (30)
  • record_category (950-954)
  • record_category (968-972)
  • record_category (987-991)
  • record_category (1006-1010)
  • record_category (1025-1029)
  • record_category (1264-1268)
  • record_category (1286-1290)
  • record_category (1310-1314)
  • record_category (1334-1338)
  • record_category (1358-1362)
  • record_category (1471-1475)
  • record_category (1486-1490)
  • record_category (1502-1506)
  • record_category (1518-1522)
  • record_category (1534-1538)
  • record_rule (956-964)
  • record_rule (974-983)
  • record_rule (993-1002)
  • record_rule (1012-1021)
  • record_rule (1031-1040)
  • record_rule (1274-1283)
  • record_rule (1296-1306)
  • record_rule (1320-1330)
  • record_rule (1344-1354)
  • record_rule (1368-1378)
  • record_rule (1477-1482)
  • record_rule (1492-1498)
  • record_rule (1508-1514)
  • record_rule (1524-1530)
  • record_rule (1540-1546)
crates/biome_html_analyze/src/registry.rs (1)
  • visit_registry (5-7)
crates/biome_html_analyze/src/lib.rs (3)
crates/biome_html_analyze/src/registry.rs (2)
  • registry (6-6)
  • visit_registry (5-7)
crates/biome_analyze/src/lib.rs (1)
  • to_analyzer_suppressions (714-773)
crates/biome_html_parser/src/lib.rs (1)
  • parse_html (37-40)
⏰ 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). (2)
  • GitHub Check: Lint project (depot-windows-2022)
  • GitHub Check: Bench (biome_js_formatter)
🔇 Additional comments (5)
crates/biome_html_analyze/src/registry.rs (1)

3-7: Registry hook looks solid. Registers the HTML lint category cleanly and matches the other languages.

crates/biome_service/src/documentation/mod.rs (1)

9-134: Nice docs integration. Adding HtmlLanguage here keeps the docs command in step with the new rules.

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

13-313: Codegen pipeline looks tidy. HTML slots into the existing analyser generation without upsetting the balance.

crates/biome_html_analyze/src/lint/a11y.rs (1)

1-7: A11y group wired up neatly. Group and rule export follow the usual pattern—no surprises.

crates/biome_html_analyze/src/lib.rs (1)

1-185: Analyzer entrypoints look shipshape. The suppression plumbing and metadata setup mirror the proven patterns from the other languages, so I’m happy.

ematipico and others added 4 commits October 5, 2025 21:36
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
@github-actions github-actions bot added the A-Parser Area: parser label Oct 5, 2025
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: 1

📜 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 4a90fd5 and e52be08.

📒 Files selected for processing (3)
  • crates/biome_html_analyze/src/suppression_action.rs (1 hunks)
  • crates/biome_service/src/file_handlers/html.rs (3 hunks)
  • crates/biome_service/src/file_handlers/mod.rs (7 hunks)
🧰 Additional context used
📓 Path-based instructions (4)
crates/biome_*_{syntax,parser,formatter,analyze,factory,semantic}/**

📄 CodeRabbit inference engine (CLAUDE.md)

Maintain the per-language crate structure: biome_{lang}_{syntax,parser,formatter,analyze,factory,semantic}

Files:

  • crates/biome_html_analyze/src/suppression_action.rs
crates/biome_*/**

📄 CodeRabbit inference engine (CLAUDE.md)

Place core crates under /crates/biome_*/

Files:

  • crates/biome_html_analyze/src/suppression_action.rs
  • crates/biome_service/src/file_handlers/html.rs
  • crates/biome_service/src/file_handlers/mod.rs
**/*.{rs,toml}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Before committing, format Rust and TOML files (e.g., via just f/just format)

Files:

  • crates/biome_html_analyze/src/suppression_action.rs
  • crates/biome_service/src/file_handlers/html.rs
  • crates/biome_service/src/file_handlers/mod.rs
**/*.rs

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Document rules, assists, and options via inline rustdoc in Rust source

Files:

  • crates/biome_html_analyze/src/suppression_action.rs
  • crates/biome_service/src/file_handlers/html.rs
  • crates/biome_service/src/file_handlers/mod.rs
🧠 Learnings (3)
📚 Learning: 2025-10-02T12:58:46.820Z
Learnt from: CR
PR: biomejs/biome#0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-10-02T12:58:46.820Z
Learning: Applies to crates/biome_formatter/biome_html_formatter/src/lib.rs : Implement `FormatLanguage` for `HtmlFormatLanguage` with associated types: `SyntaxLanguage = HtmlLanguage`, `Context = HtmlFormatContext`, `FormatRule = FormatHtmlSyntaxNode`

Applied to files:

  • crates/biome_service/src/file_handlers/mod.rs
📚 Learning: 2025-10-02T13:00:04.816Z
Learnt from: CR
PR: biomejs/biome#0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-10-02T13:00:04.816Z
Learning: Applies to crates/biome_parser/**/language_kind.rs : Add a new LanguageKind variant (e.g., Html) in language_kind.rs and implement/cover all methods for it

Applied to files:

  • crates/biome_service/src/file_handlers/mod.rs
📚 Learning: 2025-10-02T13:00:04.816Z
Learnt from: CR
PR: biomejs/biome#0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-10-02T13:00:04.816Z
Learning: Applies to crates/biome_parser/**/language_kind.rs : Add the new language prefix (e.g., html_) to LANGUAGE_PREFIXES in language_kind.rs

Applied to files:

  • crates/biome_service/src/file_handlers/mod.rs
🧬 Code graph analysis (3)
crates/biome_html_analyze/src/suppression_action.rs (1)
crates/biome_rowan/src/syntax/token.rs (1)
  • prev_token (179-181)
crates/biome_service/src/file_handlers/html.rs (7)
packages/@biomejs/backend-jsonrpc/src/workspace.ts (9)
  • DocumentFileSource (9403-9411)
  • CodeAction (9626-9630)
  • FixAction (9750-9759)
  • FixFileMode (9728-9731)
  • FixFileResult (9732-9749)
  • PullActionsResult (9623-9625)
  • CssFileSource (9427-9429)
  • Applicability (9677-9677)
  • BiomePath (9-9)
crates/biome_service/src/file_handlers/mod.rs (12)
  • is_diagnostic_error (811-830)
  • new (542-556)
  • new (771-785)
  • new (1059-1077)
  • new (1391-1405)
  • new (1560-1570)
  • filter (1231-1231)
  • filter (1231-1231)
  • filter (1248-1248)
  • filter (1248-1248)
  • filter (1424-1424)
  • filter (1442-1442)
crates/biome_service/src/file_handlers/graphql.rs (12)
  • settings (305-305)
  • settings (309-309)
  • settings (313-313)
  • settings (350-350)
  • settings (366-366)
  • settings (384-384)
  • settings (398-398)
  • settings (496-496)
  • params (543-543)
  • params (640-640)
  • code_actions (470-535)
  • parse (320-333)
crates/biome_service/src/file_handlers/css.rs (12)
  • settings (386-386)
  • settings (390-390)
  • settings (394-394)
  • settings (459-459)
  • settings (481-481)
  • settings (499-499)
  • settings (513-513)
  • settings (547-547)
  • params (659-659)
  • params (762-762)
  • code_actions (589-651)
  • parse (401-442)
crates/biome_service/src/settings.rs (1)
  • analyzer_options (1100-1120)
crates/biome_service/src/file_handlers/json.rs (6)
  • workspace (580-580)
  • params (511-511)
  • params (630-630)
  • params (735-735)
  • code_actions (561-622)
  • parse (385-400)
crates/biome_html_parser/src/lib.rs (1)
  • tree (99-101)
crates/biome_service/src/file_handlers/mod.rs (2)
crates/biome_service/src/file_handlers/html.rs (1)
  • lint (669-706)
crates/biome_html_analyze/src/registry.rs (1)
  • visit_registry (5-7)
⏰ 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). (14)
  • GitHub Check: Bench (biome_configuration)
  • GitHub Check: Bench (biome_js_analyze)
  • GitHub Check: Bench (biome_json_formatter)
  • GitHub Check: Bench (biome_js_parser)
  • GitHub Check: Bench (biome_js_formatter)
  • GitHub Check: Bench (biome_css_formatter)
  • GitHub Check: autofix
  • GitHub Check: Bench (biome_json_analyze)
  • GitHub Check: Bench (biome_css_analyze)
  • GitHub Check: Bench (biome_graphql_parser)
  • GitHub Check: Bench (biome_css_parser)
  • GitHub Check: Bench (biome_json_parser)
  • GitHub Check: Bench (biome_graphql_formatter)
  • GitHub Check: Bench (biome_module_graph)
🔇 Additional comments (6)
crates/biome_html_analyze/src/suppression_action.rs (1)

1-110: LGTM! Suppression action properly preserves existing trivia.

The implementation correctly addresses the previous concern about clobbering trailing trivia. Lines 61–75 now collect existing trivia, append the suppression comment, and reapply everything together. The logic for locating the line-start token and handling the three cases (trailing comments, leading whitespace, neither) is sound.

crates/biome_service/src/file_handlers/html.rs (3)

727-732: File source check now correct.

Previously used to_graphql_file_source() which would bail out for all HTML documents. Now properly checks to_html_file_source() so the visitor actually runs.


668-706: LGTM! Lint implementation follows established patterns.

The function correctly builds analyzer options, constructs the filter, runs analyze, and processes signals through ProcessLint. Implementation is consistent with GraphQL, JSON, and CSS handlers.


770-894: LGTM! Comprehensive fix_all with proper error handling.

The iterative fix application loop correctly handles all FixFileMode variants, tracks errors/skipped fixes, commits mutations, and formats the final output. Solid implementation that mirrors the patterns from other language handlers.

crates/biome_service/src/file_handlers/mod.rs (2)

1373-1377: Metadata lookup now correct.

Previously looked up rules in graphql_metadata which caused HTML rule lookups to fail. Now properly uses biome_html_analyze::METADATA so selectors, overrides, and severity adjustments apply correctly.


1024-1041: LGTM! Registry visitor implementations are consistent.

The three RegistryVisitor<HtmlLanguage> implementations for SyntaxVisitor, LintVisitor, and AssistsVisitor follow the exact pattern used for JS, JSON, CSS, and GraphQL. Properly integrated into the builder at lines 1626, 1647, and 1658.

Also applies to: 1357-1379, 1533-1547

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: 1

♻️ Duplicate comments (2)
xtask/codegen/src/generate_configuration.rs (1)

242-243: Previous concern resolved.

The HTML registry is now properly visited in generate_rule_options, ensuring that HTML rule options are generated and kept in sync. This addresses the issue flagged in the previous review.

crates/biome_service/src/file_handlers/html.rs (1)

836-838: Wire up HTML suppression actions

Apply‑suppressions mode still bubbles out with the old GraphQL TODO, so biome fix --apply-suppressions does nothing for HTML. Please thread this branch through HtmlSuppressionAction (mirroring the GraphQL handler) so the new analyser can actually insert suppression comments.

📜 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 e52be08 and 15deeb8.

📒 Files selected for processing (5)
  • crates/biome_html_analyze/src/lint/a11y/no_header_scope.rs (1 hunks)
  • crates/biome_html_syntax/src/element_ext.rs (1 hunks)
  • crates/biome_service/src/file_handlers/grit.rs (0 hunks)
  • crates/biome_service/src/file_handlers/html.rs (3 hunks)
  • xtask/codegen/src/generate_configuration.rs (5 hunks)
💤 Files with no reviewable changes (1)
  • crates/biome_service/src/file_handlers/grit.rs
🚧 Files skipped from review as they are similar to previous changes (1)
  • crates/biome_html_analyze/src/lint/a11y/no_header_scope.rs
🧰 Additional context used
📓 Path-based instructions (4)
crates/biome_*_{syntax,parser,formatter,analyze,factory,semantic}/**

📄 CodeRabbit inference engine (CLAUDE.md)

Maintain the per-language crate structure: biome_{lang}_{syntax,parser,formatter,analyze,factory,semantic}

Files:

  • crates/biome_html_syntax/src/element_ext.rs
crates/biome_*/**

📄 CodeRabbit inference engine (CLAUDE.md)

Place core crates under /crates/biome_*/

Files:

  • crates/biome_html_syntax/src/element_ext.rs
  • crates/biome_service/src/file_handlers/html.rs
**/*.{rs,toml}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Before committing, format Rust and TOML files (e.g., via just f/just format)

Files:

  • crates/biome_html_syntax/src/element_ext.rs
  • xtask/codegen/src/generate_configuration.rs
  • crates/biome_service/src/file_handlers/html.rs
**/*.rs

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Document rules, assists, and options via inline rustdoc in Rust source

Files:

  • crates/biome_html_syntax/src/element_ext.rs
  • xtask/codegen/src/generate_configuration.rs
  • crates/biome_service/src/file_handlers/html.rs
🧠 Learnings (4)
📚 Learning: 2025-10-02T12:58:46.820Z
Learnt from: CR
PR: biomejs/biome#0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-10-02T12:58:46.820Z
Learning: Applies to crates/biome_formatter/biome_html_formatter/src/lib.rs : Implement `FormatLanguage` for `HtmlFormatLanguage` with associated types: `SyntaxLanguage = HtmlLanguage`, `Context = HtmlFormatContext`, `FormatRule = FormatHtmlSyntaxNode`

Applied to files:

  • xtask/codegen/src/generate_configuration.rs
📚 Learning: 2025-10-02T12:58:46.820Z
Learnt from: CR
PR: biomejs/biome#0
File: crates/biome_formatter/CONTRIBUTING.md:0-0
Timestamp: 2025-10-02T12:58:46.820Z
Learning: Applies to crates/biome_formatter/biome_html_formatter/tests/language.rs : Create `HtmlTestFormatLanguage` and implement the `TestFormatLanguage` trait

Applied to files:

  • xtask/codegen/src/generate_configuration.rs
📚 Learning: 2025-10-02T13:00:04.816Z
Learnt from: CR
PR: biomejs/biome#0
File: crates/biome_parser/CONTRIBUTING.md:0-0
Timestamp: 2025-10-02T13:00:04.816Z
Learning: Applies to crates/biome_parser/**/language_kind.rs : Add a new LanguageKind variant (e.g., Html) in language_kind.rs and implement/cover all methods for it

Applied to files:

  • xtask/codegen/src/generate_configuration.rs
📚 Learning: 2025-08-17T08:55:30.118Z
Learnt from: CR
PR: biomejs/biome#0
File: CLAUDE.md:0-0
Timestamp: 2025-08-17T08:55:30.118Z
Learning: Applies to crates/biome_*_{syntax,parser,formatter,analyze,factory,semantic}/** : Maintain the per-language crate structure: biome_{lang}_{syntax,parser,formatter,analyze,factory,semantic}

Applied to files:

  • xtask/codegen/src/generate_configuration.rs
🧬 Code graph analysis (3)
crates/biome_html_syntax/src/element_ext.rs (1)
crates/biome_html_syntax/src/generated/nodes.rs (4)
  • name (87-89)
  • name (255-257)
  • name (532-534)
  • name (638-640)
xtask/codegen/src/generate_configuration.rs (2)
crates/biome_service/src/file_handlers/mod.rs (30)
  • record_category (950-954)
  • record_category (968-972)
  • record_category (987-991)
  • record_category (1006-1010)
  • record_category (1025-1029)
  • record_category (1264-1268)
  • record_category (1286-1290)
  • record_category (1310-1314)
  • record_category (1334-1338)
  • record_category (1358-1362)
  • record_category (1471-1475)
  • record_category (1486-1490)
  • record_category (1502-1506)
  • record_category (1518-1522)
  • record_category (1534-1538)
  • record_rule (956-964)
  • record_rule (974-983)
  • record_rule (993-1002)
  • record_rule (1012-1021)
  • record_rule (1031-1040)
  • record_rule (1274-1283)
  • record_rule (1296-1306)
  • record_rule (1320-1330)
  • record_rule (1344-1354)
  • record_rule (1368-1378)
  • record_rule (1477-1482)
  • record_rule (1492-1498)
  • record_rule (1508-1514)
  • record_rule (1524-1530)
  • record_rule (1540-1546)
crates/biome_analyze/src/rule.rs (1)
  • record_groups (958-958)
crates/biome_service/src/file_handlers/html.rs (4)
packages/@biomejs/backend-jsonrpc/src/workspace.ts (9)
  • DocumentFileSource (9403-9411)
  • CodeAction (9626-9630)
  • FixAction (9750-9759)
  • FixFileMode (9728-9731)
  • FixFileResult (9732-9749)
  • PullActionsResult (9623-9625)
  • CssFileSource (9427-9429)
  • Applicability (9677-9677)
  • BiomePath (9-9)
crates/biome_service/src/file_handlers/mod.rs (12)
  • is_diagnostic_error (811-830)
  • new (542-556)
  • new (771-785)
  • new (1059-1077)
  • new (1391-1405)
  • new (1560-1570)
  • filter (1231-1231)
  • filter (1231-1231)
  • filter (1248-1248)
  • filter (1248-1248)
  • filter (1424-1424)
  • filter (1442-1442)
crates/biome_service/src/file_handlers/css.rs (14)
  • settings (386-386)
  • settings (390-390)
  • settings (394-394)
  • settings (459-459)
  • settings (481-481)
  • settings (499-499)
  • settings (513-513)
  • settings (547-547)
  • settings (616-616)
  • params (659-659)
  • params (762-762)
  • code_actions (589-651)
  • parse (401-442)
  • fix_all (654-782)
crates/biome_service/src/settings.rs (1)
  • analyzer_options (1100-1120)
🪛 GitHub Actions: autofix.ci
crates/biome_html_syntax/src/element_ext.rs

[error] 61-66: cannot return value referencing local variable name_token (E0515). This occurs in element_ext.rs lines 61-66 during cargo codegen-configuration.

🪛 GitHub Actions: Benchmarks Configuration
crates/biome_html_syntax/src/element_ext.rs

[error] 61-61: cannot return value referencing local variable name_token


[error] 66-66: cannot return value referencing local variable name_token

🪛 GitHub Actions: Benchmarks CSS
crates/biome_html_syntax/src/element_ext.rs

[error] 61-61: E0515: cannot return value referencing local variable name_token. The value is borrowed from name_token which is owned by the current function.


[error] 66-66: E0515: cannot return value referencing local variable name_token. The value is borrowed from name_token which is owned by the current function.

🪛 GitHub Actions: Benchmarks GraphQL
crates/biome_html_syntax/src/element_ext.rs

[error] 61-61: cannot return value referencing local variable name_token (E0515)


[error] 66-66: cannot return value referencing local variable name_token (E0515)

🪛 GitHub Actions: Benchmarks JS
crates/biome_html_syntax/src/element_ext.rs

[error] 61-66: cannot return value referencing local variable name_token


[error] 61-61: cannot return value referencing local variable name_token


[error] 66-66: cannot return value referencing local variable name_token

🪛 GitHub Actions: Benchmarks JSON
crates/biome_html_syntax/src/element_ext.rs

[error] 61-66: cannot return value referencing local variable name_token (E0515) in element_ext.rs: returns a value referencing data owned by the current function. This likely indicates a lifetime issue where name_token is borrowed and a trimmed value is returned beyond the token's scope.

🪛 GitHub Actions: Benchmarks Module Graph
crates/biome_html_syntax/src/element_ext.rs

[error] 61-61: Rust compile error (E0515): cannot return value referencing local variable name_token in biome_html_syntax/src/element_ext.rs.


[error] 66-66: Rust compile error (E0515): cannot return value referencing local variable name_token in biome_html_syntax/src/element_ext.rs.

🪛 GitHub Actions: Pull request
crates/biome_html_syntax/src/element_ext.rs

[error] 61-66: Rust compile error E0515: cannot return value referencing local variable 'name_token' (lines 61-66).

🔇 Additional comments (4)
xtask/codegen/src/generate_configuration.rs (4)

6-6: LGTM!

The import is correctly added to support HTML language in the configuration generation.


110-127: LGTM!

The RegistryVisitor<HtmlLanguage> implementation for LintRulesVisitor follows the established pattern used by other non-JS languages (CSS, GraphQL). Note that it correctly omits domain tracking, which is consistent with the approach for languages other than JavaScript.


210-227: LGTM!

The RegistryVisitor<HtmlLanguage> implementation for AssistActionsVisitor is consistent with the patterns used for other languages.


301-302: LGTM!

The HTML registry visits in generate_rules_configuration complete the integration, ensuring HTML rules are included in the generated configuration.

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: 1

Caution

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

⚠️ Outside diff range comments (3)
crates/biome_service/src/file_handlers/json.rs (1)

675-704: Critical logic error: suppression handling is unreachable.

The outer guard at lines 675-677 filters out all suppression actions before they reach the mode-specific handling. This means:

  • Lines 681-683 (SafeFixes guard) are dead code—suppressions are already filtered.
  • Lines 702-704 (ApplySuppressions handler) will never execute—suppressions cannot reach this branch.

As a result, FixFileMode::ApplySuppressions cannot function as intended.

Apply this diff to fix the logic:

             for action in signal.actions() {
-                // suppression actions should not be part of the fixes (safe or suggested)
-                if action.is_suppression() {
-                    continue;
-                }
-
                 match params.fix_file_mode {
                     FixFileMode::SafeFixes => {
                         if action.is_suppression() {
                             continue;
                         }
                         if action.applicability == Applicability::MaybeIncorrect {
                             skipped_suggested_fixes += 1;
                         }
                         if action.applicability == Applicability::Always {
                             errors = errors.saturating_sub(1);
                             return ControlFlow::Break(action);
                         }
                     }
                     FixFileMode::SafeAndUnsafeFixes => {
+                        if action.is_suppression() {
+                            continue;
+                        }
                         if matches!(
                             action.applicability,
                             Applicability::Always | Applicability::MaybeIncorrect
                         ) {
                             errors = errors.saturating_sub(1);
                             return ControlFlow::Break(action);
                         }
                     }
                     FixFileMode::ApplySuppressions => {
                         if action.is_suppression() {
                             return ControlFlow::Break(action);
                         }
                     }
                 }
             }
crates/biome_service/src/file_handlers/graphql.rs (1)

578-610: Critical logic error: suppression handling is unreachable.

Identical issue to json.rs: the outer guard at lines 580-582 filters out all suppression actions before mode-specific handling, making lines 586-588 and 607-609 unreachable. FixFileMode::ApplySuppressions cannot function.

Apply the same fix as in json.rs:

             for action in signal.actions() {
-                // suppression actions should not be part of the fixes (safe or suggested)
-                if action.is_suppression() {
-                    continue;
-                }
-
                 match params.fix_file_mode {
                     FixFileMode::SafeFixes => {
                         if action.is_suppression() {
                             continue;
                         }
                         if action.applicability == Applicability::MaybeIncorrect {
                             skipped_suggested_fixes += 1;
                         }
                         if action.applicability == Applicability::Always {
                             errors = errors.saturating_sub(1);
                             return ControlFlow::Break(action);
                         }
                     }
                     FixFileMode::SafeAndUnsafeFixes => {
+                        if action.is_suppression() {
+                            continue;
+                        }
                         if matches!(
                             action.applicability,
                             Applicability::Always | Applicability::MaybeIncorrect
                         ) {
                             errors = errors.saturating_sub(1);
                             return ControlFlow::Break(action);
                         }
                     }
                     FixFileMode::ApplySuppressions => {
                         if action.is_suppression() {
                             return ControlFlow::Break(action);
                         }
                     }
                 }
             }
crates/biome_service/src/file_handlers/css.rs (1)

699-732: Critical logic error: suppression handling is unreachable.

Identical issue to json.rs and graphql.rs: the outer guard at lines 700-703 prevents lines 707-709 and 728-730 from ever executing. FixFileMode::ApplySuppressions cannot function.

Apply the same fix as in the other file handlers:

                 for action in signal.actions() {
-                    // suppression actions should not be part of the fixes (safe or suggested)
-                    if action.is_suppression() {
-                        continue;
-                    }
-
                     match params.fix_file_mode {
                         FixFileMode::SafeFixes => {
                             if action.is_suppression() {
                                 continue;
                             }
                             if action.applicability == Applicability::MaybeIncorrect {
                                 skipped_suggested_fixes += 1;
                             }
                             if action.applicability == Applicability::Always {
                                 errors = errors.saturating_sub(1);
                                 return ControlFlow::Break(action);
                             }
                         }
                         FixFileMode::SafeAndUnsafeFixes => {
+                            if action.is_suppression() {
+                                continue;
+                            }
                             if matches!(
                                 action.applicability,
                                 Applicability::Always | Applicability::MaybeIncorrect
                             ) {
                                 errors = errors.saturating_sub(1);
                                 return ControlFlow::Break(action);
                             }
                         }
                         FixFileMode::ApplySuppressions => {
                             if action.is_suppression() {
                                 return ControlFlow::Break(action);
                             }
                         }
                     }
                 }
📜 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 15deeb8 and b87a6ef.

📒 Files selected for processing (5)
  • crates/biome_html_syntax/src/element_ext.rs (2 hunks)
  • crates/biome_service/src/file_handlers/css.rs (2 hunks)
  • crates/biome_service/src/file_handlers/graphql.rs (2 hunks)
  • crates/biome_service/src/file_handlers/html.rs (3 hunks)
  • crates/biome_service/src/file_handlers/json.rs (2 hunks)
🧰 Additional context used
📓 Path-based instructions (4)
crates/biome_*/**

📄 CodeRabbit inference engine (CLAUDE.md)

Place core crates under /crates/biome_*/

Files:

  • crates/biome_service/src/file_handlers/graphql.rs
  • crates/biome_service/src/file_handlers/css.rs
  • crates/biome_service/src/file_handlers/json.rs
  • crates/biome_service/src/file_handlers/html.rs
  • crates/biome_html_syntax/src/element_ext.rs
**/*.{rs,toml}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Before committing, format Rust and TOML files (e.g., via just f/just format)

Files:

  • crates/biome_service/src/file_handlers/graphql.rs
  • crates/biome_service/src/file_handlers/css.rs
  • crates/biome_service/src/file_handlers/json.rs
  • crates/biome_service/src/file_handlers/html.rs
  • crates/biome_html_syntax/src/element_ext.rs
**/*.rs

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Document rules, assists, and options via inline rustdoc in Rust source

Files:

  • crates/biome_service/src/file_handlers/graphql.rs
  • crates/biome_service/src/file_handlers/css.rs
  • crates/biome_service/src/file_handlers/json.rs
  • crates/biome_service/src/file_handlers/html.rs
  • crates/biome_html_syntax/src/element_ext.rs
crates/biome_*_{syntax,parser,formatter,analyze,factory,semantic}/**

📄 CodeRabbit inference engine (CLAUDE.md)

Maintain the per-language crate structure: biome_{lang}_{syntax,parser,formatter,analyze,factory,semantic}

Files:

  • crates/biome_html_syntax/src/element_ext.rs
🧬 Code graph analysis (2)
crates/biome_service/src/file_handlers/html.rs (3)
packages/@biomejs/backend-jsonrpc/src/workspace.ts (8)
  • DocumentFileSource (9403-9411)
  • CodeAction (9626-9630)
  • FixAction (9750-9759)
  • FixFileMode (9728-9731)
  • FixFileResult (9732-9749)
  • PullActionsResult (9623-9625)
  • CssFileSource (9427-9429)
  • BiomePath (9-9)
crates/biome_service/src/file_handlers/mod.rs (12)
  • is_diagnostic_error (811-830)
  • new (542-556)
  • new (771-785)
  • new (1059-1077)
  • new (1391-1405)
  • new (1560-1570)
  • filter (1231-1231)
  • filter (1231-1231)
  • filter (1248-1248)
  • filter (1248-1248)
  • filter (1424-1424)
  • filter (1442-1442)
crates/biome_service/src/settings.rs (1)
  • analyzer_options (1100-1120)
crates/biome_html_syntax/src/element_ext.rs (1)
crates/biome_html_syntax/src/generated/nodes.rs (5)
  • name (87-89)
  • name (255-257)
  • name (532-534)
  • name (638-640)
  • opening_element (448-450)
⏰ 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). (21)
  • GitHub Check: Test (depot-windows-2022-16)
  • GitHub Check: Documentation
  • GitHub Check: Test (depot-ubuntu-24.04-arm-16)
  • GitHub Check: End-to-end tests
  • GitHub Check: Lint project (depot-ubuntu-24.04-arm-16)
  • GitHub Check: Check Dependencies
  • GitHub Check: Lint project (depot-windows-2022)
  • GitHub Check: Bench (biome_configuration)
  • GitHub Check: Bench (biome_css_analyze)
  • GitHub Check: Bench (biome_module_graph)
  • GitHub Check: Bench (biome_css_formatter)
  • GitHub Check: Bench (biome_css_parser)
  • GitHub Check: Bench (biome_js_formatter)
  • GitHub Check: Bench (biome_js_parser)
  • GitHub Check: Bench (biome_js_analyze)
  • GitHub Check: autofix
  • GitHub Check: Bench (biome_json_formatter)
  • GitHub Check: Bench (biome_json_analyze)
  • GitHub Check: Bench (biome_json_parser)
  • GitHub Check: Bench (biome_graphql_formatter)
  • GitHub Check: Bench (biome_graphql_parser)
🔇 Additional comments (4)
crates/biome_html_syntax/src/element_ext.rs (1)

55-70: Lifetime issue resolved—implementation looks correct.

The change from Option<&str> to Option<TokenText> resolves the E0515 compilation errors flagged in previous reviews. TokenText is an owned/reference-counted type from biome_rowan that avoids borrowing from local variables.

The implementation correctly extracts the tag name for both HtmlElement and HtmlSelfClosingElement variants, returning None for unsupported variants.

crates/biome_service/src/file_handlers/html.rs (3)

669-706: LGTM!

The lint function is well-structured. Properly builds analyzer options from settings, uses AnalyzerVisitorBuilder to derive enabled/disabled rules, creates an AnalysisFilter, and processes signals through ProcessLint. Clean integration with the new HTML analyzer.


708-767: LGTM—past issue resolved!

The code actions flow is now fully wired. The HTML file source guard at line 727 correctly uses to_html_file_source() (previous review flagged incorrect GraphQL check). Signal-to-action transformation properly maps categories, rule names (as Cow::Borrowed pairs), and suggestions.


770-898: Well-structured fix_all loop.

The iterative fix logic is solid: computes final rules with overrides, builds a comprehensive AnalysisFilter, handles the three FixFileMode variants correctly (safe, safe+unsafe, suppressions), applies mutations, validates root type after each mutation, and optionally formats. Error tracking and action accumulation look correct. Aside from the redundant check flagged separately, this is a thorough implementation.

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: 2

Caution

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

⚠️ Outside diff range comments (1)
crates/biome_service/src/file_handlers/graphql.rs (1)

580-606: Unreachable code: suppressions are filtered before the mode check.

The early continue at line 581 skips all suppression actions before reaching line 604. When ApplySuppressions mode checks if action.is_suppression(), the condition can never be true.

Move the suppression filtering inside the mode branches:

             for action in signal.actions() {
-                // suppression actions should not be part of the fixes (safe or suggested)
-                if action.is_suppression() {
-                    continue;
-                }
-
                 match params.fix_file_mode {
                     FixFileMode::SafeFixes => {
+                        if action.is_suppression() {
+                            continue;
+                        }
                         if action.applicability == Applicability::MaybeIncorrect {
                             skipped_suggested_fixes += 1;
                         }
                         if action.applicability == Applicability::Always {
                             errors = errors.saturating_sub(1);
                             return ControlFlow::Break(action);
                         }
                     }
                     FixFileMode::SafeAndUnsafeFixes => {
+                        if action.is_suppression() {
+                            continue;
+                        }
                         if matches!(
                             action.applicability,
                             Applicability::Always | Applicability::MaybeIncorrect
                         ) {
                             errors = errors.saturating_sub(1);
                             return ControlFlow::Break(action);
                         }
                     }
                     FixFileMode::ApplySuppressions => {
                         if action.is_suppression() {
                             return ControlFlow::Break(action);
                         }
                     }
                 }
             }
📜 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 5d28fa5 and 43bbc25.

📒 Files selected for processing (5)
  • crates/biome_service/src/file_handlers/css.rs (1 hunks)
  • crates/biome_service/src/file_handlers/graphql.rs (1 hunks)
  • crates/biome_service/src/file_handlers/html.rs (3 hunks)
  • crates/biome_service/src/file_handlers/javascript.rs (0 hunks)
  • crates/biome_service/src/file_handlers/json.rs (1 hunks)
💤 Files with no reviewable changes (1)
  • crates/biome_service/src/file_handlers/javascript.rs
🚧 Files skipped from review as they are similar to previous changes (1)
  • crates/biome_service/src/file_handlers/css.rs
🧰 Additional context used
📓 Path-based instructions (3)
crates/biome_*/**

📄 CodeRabbit inference engine (CLAUDE.md)

Place core crates under /crates/biome_*/

Files:

  • crates/biome_service/src/file_handlers/graphql.rs
  • crates/biome_service/src/file_handlers/json.rs
  • crates/biome_service/src/file_handlers/html.rs
**/*.{rs,toml}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Before committing, format Rust and TOML files (e.g., via just f/just format)

Files:

  • crates/biome_service/src/file_handlers/graphql.rs
  • crates/biome_service/src/file_handlers/json.rs
  • crates/biome_service/src/file_handlers/html.rs
**/*.rs

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Document rules, assists, and options via inline rustdoc in Rust source

Files:

  • crates/biome_service/src/file_handlers/graphql.rs
  • crates/biome_service/src/file_handlers/json.rs
  • crates/biome_service/src/file_handlers/html.rs
🧬 Code graph analysis (1)
crates/biome_service/src/file_handlers/html.rs (3)
packages/@biomejs/backend-jsonrpc/src/workspace.ts (8)
  • DocumentFileSource (9403-9411)
  • CodeAction (9626-9630)
  • FixAction (9750-9759)
  • FixFileMode (9728-9731)
  • FixFileResult (9732-9749)
  • PullActionsResult (9623-9625)
  • CssFileSource (9427-9429)
  • Applicability (9677-9677)
crates/biome_service/src/file_handlers/mod.rs (12)
  • is_diagnostic_error (811-830)
  • new (542-556)
  • new (771-785)
  • new (1059-1077)
  • new (1391-1405)
  • new (1560-1570)
  • filter (1231-1231)
  • filter (1231-1231)
  • filter (1248-1248)
  • filter (1248-1248)
  • filter (1424-1424)
  • filter (1442-1442)
crates/biome_service/src/file_handlers/css.rs (14)
  • settings (386-386)
  • settings (390-390)
  • settings (394-394)
  • settings (459-459)
  • settings (481-481)
  • settings (499-499)
  • settings (513-513)
  • settings (547-547)
  • settings (616-616)
  • params (659-659)
  • params (764-764)
  • code_actions (589-651)
  • parse (401-442)
  • fix_all (654-784)
⏰ 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). (22)
  • GitHub Check: Documentation
  • GitHub Check: End-to-end tests
  • GitHub Check: Lint project (depot-ubuntu-24.04-arm-16)
  • GitHub Check: Test (depot-windows-2022-16)
  • GitHub Check: Check Dependencies
  • GitHub Check: Test (depot-ubuntu-24.04-arm-16)
  • GitHub Check: Lint project (depot-windows-2022)
  • GitHub Check: Bench (biome_css_analyze)
  • GitHub Check: Bench (biome_module_graph)
  • GitHub Check: Bench (biome_css_formatter)
  • GitHub Check: Bench (biome_css_parser)
  • GitHub Check: Bench (biome_js_formatter)
  • GitHub Check: Bench (biome_configuration)
  • GitHub Check: Bench (biome_json_parser)
  • GitHub Check: Bench (biome_json_analyze)
  • GitHub Check: autofix
  • GitHub Check: Bench (biome_js_analyze)
  • GitHub Check: Bench (biome_js_parser)
  • GitHub Check: Bench (biome_json_formatter)
  • GitHub Check: Bench (biome_package)
  • GitHub Check: Bench (biome_graphql_formatter)
  • GitHub Check: Bench (biome_graphql_parser)
🔇 Additional comments (4)
crates/biome_service/src/file_handlers/html.rs (4)

1-49: Imports look solid.

All the new imports (analyzer types, code actions, fix actions, diagnostics) are properly used in the updated functions below. Clean plumbing work.


669-706: Lint implementation is spot on.

Properly wired up the HTML analyzer with enabled/disabled rules, filter construction, and signal processing. Follows the established pattern from other language handlers.


708-767: Code actions properly hooked up.

Good work addressing the previous review feedback—now correctly checks for HTML file source. The analyzer integration and action collection follow the right pattern.


846-895: Mutation application and error handling look good.

Proper validation when replacing the root (lines 851–862), and sensible exit logic with optional formatting. Once the suppression bug is fixed, this should work well.

ematipico and others added 2 commits October 6, 2025 07:02
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
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 (1)
crates/biome_service/src/file_handlers/html.rs (1)

727-732: Minor: File source check result unused.

The check at line 727 guards against non-HTML files, but the result is bound to _. If you're only validating the file type (not using the source downstream), consider adding a comment explaining this is a defensive check since analyze doesn't require file_source as an argument.

📜 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 43bbc25 and 344a69d.

📒 Files selected for processing (2)
  • crates/biome_service/src/file_handlers/html.rs (3 hunks)
  • crates/biome_service/src/file_handlers/json.rs (1 hunks)
🧰 Additional context used
📓 Path-based instructions (3)
crates/biome_*/**

📄 CodeRabbit inference engine (CLAUDE.md)

Place core crates under /crates/biome_*/

Files:

  • crates/biome_service/src/file_handlers/json.rs
  • crates/biome_service/src/file_handlers/html.rs
**/*.{rs,toml}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Before committing, format Rust and TOML files (e.g., via just f/just format)

Files:

  • crates/biome_service/src/file_handlers/json.rs
  • crates/biome_service/src/file_handlers/html.rs
**/*.rs

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Document rules, assists, and options via inline rustdoc in Rust source

Files:

  • crates/biome_service/src/file_handlers/json.rs
  • crates/biome_service/src/file_handlers/html.rs
🧬 Code graph analysis (1)
crates/biome_service/src/file_handlers/html.rs (4)
packages/@biomejs/backend-jsonrpc/src/workspace.ts (9)
  • DocumentFileSource (9403-9411)
  • CodeAction (9626-9630)
  • FixAction (9750-9759)
  • FixFileMode (9728-9731)
  • FixFileResult (9732-9749)
  • PullActionsResult (9623-9625)
  • CssFileSource (9427-9429)
  • Applicability (9677-9677)
  • BiomePath (9-9)
crates/biome_service/src/file_handlers/mod.rs (12)
  • is_diagnostic_error (811-830)
  • new (542-556)
  • new (771-785)
  • new (1059-1077)
  • new (1391-1405)
  • new (1560-1570)
  • filter (1231-1231)
  • filter (1231-1231)
  • filter (1248-1248)
  • filter (1248-1248)
  • filter (1424-1424)
  • filter (1442-1442)
crates/biome_service/src/file_handlers/json.rs (15)
  • settings (370-370)
  • settings (374-374)
  • settings (378-378)
  • settings (392-392)
  • settings (417-417)
  • settings (433-433)
  • settings (451-451)
  • settings (465-465)
  • workspace (580-580)
  • params (511-511)
  • params (630-630)
  • params (737-737)
  • code_actions (561-622)
  • parse (385-400)
  • fix_all (625-757)
crates/biome_service/src/settings.rs (2)
  • analyzer_options (1100-1120)
  • matches (1026-1037)
⏰ 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). (15)
  • GitHub Check: Bench (biome_module_graph)
  • GitHub Check: Bench (biome_css_formatter)
  • GitHub Check: Bench (biome_css_analyze)
  • GitHub Check: Bench (biome_css_parser)
  • GitHub Check: Bench (biome_configuration)
  • GitHub Check: Bench (biome_graphql_parser)
  • GitHub Check: Bench (biome_graphql_formatter)
  • GitHub Check: Bench (biome_json_analyze)
  • GitHub Check: Bench (biome_json_formatter)
  • GitHub Check: Bench (biome_json_parser)
  • GitHub Check: Bench (biome_package)
  • GitHub Check: autofix
  • GitHub Check: Bench (biome_js_analyze)
  • GitHub Check: Bench (biome_js_parser)
  • GitHub Check: Bench (biome_js_formatter)
🔇 Additional comments (4)
crates/biome_service/src/file_handlers/json.rs (1)

699-738: Critical structural error: duplicated nested loop inside ApplySuppressions arm.

Lines 699-738 create a second for action in signal.actions() loop and a second match params.fix_file_mode whilst already inside the ApplySuppressions arm (line 698) of the first match. This nested duplication makes no sense and will break the logic entirely.

Additionally, lines 700-703 skip suppression actions even though we're in ApplySuppressions mode, which contradicts the mode's purpose.

The correct fix, as suggested in the past review comment, is to conditionally skip suppression actions only in SafeFixes and SafeAndUnsafeFixes modes. Remove the duplicated structure and apply this diff:

             for action in signal.actions() {
-                // suppression actions should not be part of the fixes (safe or suggested)
-                if action.is_suppression() {
-                    continue;
-                }
-
                 match params.fix_file_mode {
                     FixFileMode::SafeFixes => {
+                        // suppression actions should not be part of safe fixes
+                        if action.is_suppression() {
+                            continue;
+                        }
                         if action.applicability == Applicability::MaybeIncorrect {
                             skipped_suggested_fixes += 1;
                         }
                         if action.applicability == Applicability::Always {
                             errors = errors.saturating_sub(1);
                             return ControlFlow::Break(action);
                         }
                     }
                     FixFileMode::SafeAndUnsafeFixes => {
+                        // suppression actions should not be part of safe and unsafe fixes
+                        if action.is_suppression() {
+                            continue;
+                        }
                         if matches!(
                             action.applicability,
                             Applicability::Always | Applicability::MaybeIncorrect
                         ) {
                             errors = errors.saturating_sub(1);
                             return ControlFlow::Break(action);
                         }
                     }
                     FixFileMode::ApplySuppressions => {
-             for action in signal.actions() {
-                // suppression actions should not be part of the fixes (safe or suggested)
-                if action.is_suppression() {
-                    continue;
-                }
-
-                 match params.fix_file_mode {
-                     FixFileMode::SafeFixes => {
-                        // suppression actions should not be part of safe fixes
-                        if action.is_suppression() {
-                            continue;
-                        }
-                         if action.applicability == Applicability::MaybeIncorrect {
-                             skipped_suggested_fixes += 1;
-                         }
-                         if action.applicability == Applicability::Always {
-                             errors = errors.saturating_sub(1);
-                             return ControlFlow::Break(action);
-                         }
-                     }
-                     FixFileMode::SafeAndUnsafeFixes => {
-                        // suppression actions should not be part of safe and unsafe fixes
-                        if action.is_suppression() {
-                            continue;
-                        }
-                         if matches!(
-                             action.applicability,
-                             Applicability::Always | Applicability::MaybeIncorrect
-                         ) {
-                             errors = errors.saturating_sub(1);
-                             return ControlFlow::Break(action);
-                         }
-                     }
-                     FixFileMode::ApplySuppressions => {
-                         if action.is_suppression() {
-                             return ControlFlow::Break(action);
-                         }
-                     }
-                 }
-             }
+                        if action.is_suppression() {
+                            return ControlFlow::Break(action);
+                        }
                     }
                 }
             }

Likely an incorrect or invalid review comment.

crates/biome_service/src/file_handlers/html.rs (3)

668-706: Solid lint integration.

The implementation properly wires up the HTML analyzer with visitor building, filter construction, and signal processing. Follows the JSON handler pattern correctly.


708-767: Code actions implementation looks good.

The function now properly extracts analyzer options, builds the visitor with selectors and project layout, and collects actions from analysis signals. The HTML file source check at line 727 prevents non-HTML files from proceeding—nice guard.


769-899: Fix-all workflow implemented correctly.

The iterative mutation loop with proper FixFileMode handling addresses the previous review concerns:

  • Suppression checks are now inside SafeFixes/SafeAndUnsafeFixes branches (not filtered out early)
  • ApplySuppressions branch can see suppression actions
  • Root type validation prevents broken AST
  • Optional formatting at the end

Well done!

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: 1

♻️ Duplicate comments (1)
crates/biome_service/src/file_handlers/json.rs (1)

674-677: Early suppression filter makes ApplySuppressions mode unreachable.

This early filter prevents all suppression actions from reaching the match statement below, including the ApplySuppressions branch that needs to process them.

Remove this early filter—move suppression checks into the appropriate branches:

             for action in signal.actions() {
-                // suppression actions should not be part of the fixes (safe or suggested)
-                if action.is_suppression() {
-                    continue;
-                }
-
                 match params.fix_file_mode {
📜 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 344a69d and c5eb3e2.

📒 Files selected for processing (2)
  • crates/biome_service/src/file_handlers/html.rs (3 hunks)
  • crates/biome_service/src/file_handlers/json.rs (1 hunks)
🧰 Additional context used
📓 Path-based instructions (3)
crates/biome_*/**

📄 CodeRabbit inference engine (CLAUDE.md)

Place core crates under /crates/biome_*/

Files:

  • crates/biome_service/src/file_handlers/html.rs
  • crates/biome_service/src/file_handlers/json.rs
**/*.{rs,toml}

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Before committing, format Rust and TOML files (e.g., via just f/just format)

Files:

  • crates/biome_service/src/file_handlers/html.rs
  • crates/biome_service/src/file_handlers/json.rs
**/*.rs

📄 CodeRabbit inference engine (CONTRIBUTING.md)

Document rules, assists, and options via inline rustdoc in Rust source

Files:

  • crates/biome_service/src/file_handlers/html.rs
  • crates/biome_service/src/file_handlers/json.rs
🧬 Code graph analysis (2)
crates/biome_service/src/file_handlers/html.rs (3)
packages/@biomejs/backend-jsonrpc/src/workspace.ts (8)
  • DocumentFileSource (9403-9411)
  • CodeAction (9626-9630)
  • FixAction (9750-9759)
  • FixFileMode (9728-9731)
  • FixFileResult (9732-9749)
  • PullActionsResult (9623-9625)
  • CssFileSource (9427-9429)
  • Applicability (9677-9677)
crates/biome_service/src/file_handlers/mod.rs (12)
  • is_diagnostic_error (811-830)
  • new (542-556)
  • new (771-785)
  • new (1059-1077)
  • new (1391-1405)
  • new (1560-1570)
  • filter (1231-1231)
  • filter (1231-1231)
  • filter (1248-1248)
  • filter (1248-1248)
  • filter (1424-1424)
  • filter (1442-1442)
crates/biome_service/src/file_handlers/json.rs (15)
  • settings (370-370)
  • settings (374-374)
  • settings (378-378)
  • settings (392-392)
  • settings (417-417)
  • settings (433-433)
  • settings (451-451)
  • settings (465-465)
  • workspace (580-580)
  • params (511-511)
  • params (630-630)
  • params (774-774)
  • code_actions (561-622)
  • parse (385-400)
  • fix_all (625-794)
crates/biome_service/src/file_handlers/json.rs (2)
crates/biome_analyze/src/rule.rs (2)
  • applicability (630-634)
  • applicability (1513-1515)
packages/@biomejs/backend-jsonrpc/src/workspace.ts (2)
  • FixFileMode (9728-9731)
  • Applicability (9677-9677)
⏰ 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). (21)
  • GitHub Check: Test (depot-ubuntu-24.04-arm-16)
  • GitHub Check: Documentation
  • GitHub Check: Test (depot-windows-2022-16)
  • GitHub Check: Lint project (depot-ubuntu-24.04-arm-16)
  • GitHub Check: Lint project (depot-windows-2022)
  • GitHub Check: autofix
  • GitHub Check: Check Dependencies
  • GitHub Check: Bench (biome_graphql_parser)
  • GitHub Check: Bench (biome_graphql_formatter)
  • GitHub Check: Bench (biome_css_parser)
  • GitHub Check: Bench (biome_css_analyze)
  • GitHub Check: Bench (biome_package)
  • GitHub Check: Bench (biome_css_formatter)
  • GitHub Check: Bench (biome_js_analyze)
  • GitHub Check: Bench (biome_json_formatter)
  • GitHub Check: Bench (biome_json_analyze)
  • GitHub Check: Bench (biome_js_formatter)
  • GitHub Check: Bench (biome_js_parser)
  • GitHub Check: Bench (biome_json_parser)
  • GitHub Check: Bench (biome_configuration)
  • GitHub Check: Bench (biome_module_graph)
🔇 Additional comments (3)
crates/biome_service/src/file_handlers/html.rs (3)

668-706: Well done on the lint implementation!

The implementation follows the established pattern from the JSON handler and correctly integrates HTML analysis. The flow from building analyzer options through visitor configuration to signal processing is sound.


708-767: Solid code_actions implementation!

The implementation correctly integrates HTML analysis and follows the established pattern. Past review issues (GraphQL checks) have been properly addressed—the HTML file source check and debug span are now correct.


769-898: Excellent fix_all implementation—past critical issue resolved!

The fix_all logic is now correct. Unlike earlier versions, suppressions are no longer pre-filtered before the mode dispatch, which means ApplySuppressions can actually see and process suppression actions. Each mode properly handles its intended action types:

  • SafeFixes and SafeAndUnsafeFixes skip suppressions
  • ApplySuppressions only processes suppressions

The implementation follows the established pattern and correctly handles mutation application, error tracking, and optional formatting.

@ematipico ematipico merged commit 461c478 into next Oct 6, 2025
24 of 26 checks passed
@ematipico ematipico deleted the feat/html-analyzer branch October 6, 2025 07:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-CLI Area: CLI A-Linter Area: linter A-Parser Area: parser A-Project Area: project A-Tooling Area: internal tools L-HTML Language: HTML L-JavaScript Language: JavaScript and super languages L-JSON Language: JSON and super languages

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

点击 这是indexloc提供的php浏览器服务,不要输入任何密码和下载