fix(linter): inference regression - #11035
Conversation
🦋 Changeset detectedLatest commit: 4f46857 The changes in this PR will be included in the next version bump. This PR includes changesets to release 13 packages
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 |
✅ Organic activityNo automation signals detected in the analyzed events. This is an automated analysis by AgentScan |
WalkthroughThe PR caches typed-module inference availability and legacy resolver instances, and updates Possibly related PRs
Suggested labels: Suggested reviewers: 🚥 Pre-merge checks | ✅ 4✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
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 (1)
.changeset/clean-actors-relate.md (1)
1-6: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick winAdd the issue link, and consider naming the actually-reported rules.
This closes
#10961, which reported the regression fornoUnusedVariables/noUnusedFunctionParameters— but the changeset only mentionsnoMisusedPromisesand has no issue link. As per coding guidelines: "Include issue links, rule links, and assist links in changeset descriptions." Based on learnings, bugfix changesets should use the formatFixed [#NUMBER](issue link): ....📝 Suggested rewording
-Fixed a performance regression in [`noMisusedPromises`](https://biomejs.dev/linter/rules/no-misused-promises/) that caused type inference to run repeatedly while linting a file. +Fixed [`#10961`](https://github.com/biomejs/biome/issues/10961): a performance regression that caused type inference to run repeatedly while linting a file, affecting `noUnusedVariables`, `noUnusedFunctionParameters`, and [`noMisusedPromises`](https://biomejs.dev/linter/rules/no-misused-promises/).🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In @.changeset/clean-actors-relate.md around lines 1 - 6, Update the changeset description to use the required “Fixed [`#10961`](issue link): …” format, include the issue link, and identify noUnusedVariables and noUnusedFunctionParameters as the affected rules instead of noMisusedPromises.Sources: Coding guidelines, Learnings
🧹 Nitpick comments (1)
crates/biome_js_analyze/src/lint/nursery/no_misused_promises.rs (1)
115-122: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winConsider a one-line rationale comment here.
Worth a short
//note on why literal/non-argument expressions are filtered before inference — it's the crux of the perf fix and future contributors touching this rule should know not to move inference earlier.✏️ Suggested comment
+ // Skip inference for expressions that can't be a returning-callback + // argument, to avoid re-triggering type inference per candidate. if expression.as_any_js_literal_expression().is_some()🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@crates/biome_js_analyze/src/lint/nursery/no_misused_promises.rs` around lines 115 - 122, Add a concise rationale comment immediately before the early return in the expression filtering condition, explaining that excluding literals and non-call-argument expressions avoids unnecessary inference and preserves the performance optimization. Do not alter the filtering logic.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@crates/biome_service/src/file_handlers/css.rs`:
- Around line 625-630: Add regression tests for semantic-model selection in
crates/biome_service/src/file_handlers/css.rs at lines 625-630, covering both
Workspace and Interned parsed origins. Add corresponding tests in
crates/biome_service/src/file_handlers/javascript.rs at lines 1106-1113 for both
origins, including SemanticModelOptions, and verify each path uses the
appropriate semantic model.
---
Outside diff comments:
In @.changeset/clean-actors-relate.md:
- Around line 1-6: Update the changeset description to use the required “Fixed
[`#10961`](issue link): …” format, include the issue link, and identify
noUnusedVariables and noUnusedFunctionParameters as the affected rules instead
of noMisusedPromises.
---
Nitpick comments:
In `@crates/biome_js_analyze/src/lint/nursery/no_misused_promises.rs`:
- Around line 115-122: Add a concise rationale comment immediately before the
early return in the expression filtering condition, explaining that excluding
literals and non-call-argument expressions avoids unnecessary inference and
preserves the performance optimization. Do not alter the filtering logic.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 00bff3fd-49c2-470e-b23e-7e791fb163a3
📒 Files selected for processing (5)
.changeset/clean-actors-relate.mdcrates/biome_js_analyze/src/lint/nursery/no_misused_promises.rscrates/biome_js_analyze/src/services/typed.rscrates/biome_service/src/file_handlers/css.rscrates/biome_service/src/file_handlers/javascript.rs
| let semantic_model = match ¶ms.parsed_source { | ||
| super::ParsedOrigin::Workspace(source) => { | ||
| css_semantic_model(¶ms.workspace_db, source).clone() | ||
| } | ||
| super::ParsedOrigin::Interned { .. } => semantic_model(&tree), | ||
| }; |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Add origin-specific regression coverage.
The semantic-model selection contract needs tests for both workspace-backed and interned/in-flight parses.
crates/biome_service/src/file_handlers/css.rs#L625-L630: test both CSS origin paths.crates/biome_service/src/file_handlers/javascript.rs#L1106-L1113: test both JavaScript origin paths, includingSemanticModelOptions.
As per coding guidelines, all code changes must include appropriate tests, and bug fixes must include a regression test.
📍 Affects 2 files
crates/biome_service/src/file_handlers/css.rs#L625-L630(this comment)crates/biome_service/src/file_handlers/javascript.rs#L1106-L1113
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@crates/biome_service/src/file_handlers/css.rs` around lines 625 - 630, Add
regression tests for semantic-model selection in
crates/biome_service/src/file_handlers/css.rs at lines 625-630, covering both
Workspace and Interned parsed origins. Add corresponding tests in
crates/biome_service/src/file_handlers/javascript.rs at lines 1106-1113 for both
origins, including SemanticModelOptions, and verify each path uses the
appropriate semantic model.
Source: Coding guidelines
Merging this PR will not alter performance
Comparing Footnotes
|
This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [@biomejs/biome](https://biomejs.dev) ([source](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome)) | imports | patch | [`2.5.5` -> `2.5.6`](https://renovatebot.com/diffs/npm/@biomejs%2fbiome/2.5.5/2.5.6) | --- ### Release Notes <details> <summary>biomejs/biome (@​biomejs/biome)</summary> ### [`v2.5.6`](https://github.com/biomejs/biome/blob/HEAD/packages/@​biomejs/biome/CHANGELOG.md#256) [Compare Source](https://github.com/biomejs/biome/compare/@biomejs/biome@2.5.5...@biomejs/biome@2.5.6) ##### Patch Changes - [#​11035](biomejs/biome#11035) [`0e4b03b`](biomejs/biome@0e4b03b) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed a performance regression in [`noMisusedPromises`](https://biomejs.dev/linter/rules/no-misused-promises/) that caused type inference to run repeatedly while linting a file. - [#​11043](biomejs/biome#11043) [`22ec076`](biomejs/biome@22ec076) Thanks [@​denbezrukov](https://github.com/denbezrukov)! - Fixed CSS formatting for multiline function arguments preceded by comments: ```diff .example { value: outer( 1, /* comment */ nested( - first, - second - ) + first, + second + ) ); } ``` - [#​11007](biomejs/biome#11007) [`c9acb25`](biomejs/biome@c9acb25) Thanks [@​BTF-Kabir-2020](https://github.com/BTF-Kabir-2020)! - Fixed [#​9195](biomejs/biome#9195): [`useHookAtTopLevel`](https://biomejs.dev/linter/rules/use-hook-at-top-level/) no longer reports hooks in named `forwardRef` components that receive a `ref` parameter. - [#​10152](biomejs/biome#10152) [`50a9bd8`](biomejs/biome@50a9bd8) Thanks [@​Zelys-DFKH](https://github.com/Zelys-DFKH)! - Fixed [#​10131](biomejs/biome#10131): Biome now correctly parses curried arrow functions in ternary consequents when the inner arrow's parameters use a destructuring pattern, e.g. `cond ? (x) => ({ a, b }) => body : alt`. - [#​11105](biomejs/biome#11105) [`8ffe2b9`](biomejs/biome@8ffe2b9) Thanks [@​dadavidtseng](https://github.com/dadavidtseng)! - Fixed [#​11092](biomejs/biome#11092): The [`noUselessTernary`](https://biomejs.dev/linter/rules/no-useless-ternary/) quick fix now preserves operator spacing when simplifying or inverting boolean ternary expressions. - [#​10533](biomejs/biome#10533) [`5809875`](biomejs/biome@5809875) Thanks [@​Mokto](https://github.com/Mokto)! - Fixed [#​10515](biomejs/biome#10515): `biome check --write` was not idempotent on Svelte files — multi-line template literals in `<script>` blocks and block comments in `<style>` blocks gained an extra indent level on every run. - [#​11040](biomejs/biome#11040) [`0abb620`](biomejs/biome@0abb620) Thanks [@​Mokto](https://github.com/Mokto)! - Fixed an issue where the HTML formatter would duplicate a comment placed directly before a Svelte `{@​const ...}` or `{@​debug ...}` block. The duplication compounded on every subsequent `--write`, causing the file to grow exponentially. - [#​10858](biomejs/biome#10858) [`6d18204`](biomejs/biome@6d18204) Thanks [@​ruidosujeira](https://github.com/ruidosujeira)! - Fixed [#​10839](biomejs/biome#10839): Svelte `{#each}` array destructuring no longer includes spaces inside square brackets, and multiline bind function expressions now indent their getter, setter, and function body correctly. - [#​11009](biomejs/biome#11009) [`2c36626`](biomejs/biome@2c36626) Thanks [@​ematipico](https://github.com/ematipico)! - Improved the accuracy of type-aware lint rules by resolving more inferred types. For example, [`noFloatingPromises`](https://biomejs.dev/linter/rules/no-floating-promises/) now detects floating Promises returned by aliased callbacks and arrays of Promises created by async mapping callbacks. The following statements are now reported: ```ts type AsyncCallback = () => Promise<void>; declare const callback: AsyncCallback; callback(); [1, 2, 3].map(async (value) => value); ``` - [#​10973](biomejs/biome#10973) [`9cb044c`](biomejs/biome@9cb044c) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed false positives in [`noMisleadingReturnType`](https://biomejs.dev/linter/rules/no-misleading-return-type/) when generic-constraint, normalization, substitution, or structural return-type comparison cannot complete. The rule now suppresses diagnostics rather than suggesting a return type derived from partial information. For example, this unresolved return type is no longer reported: ```ts function unresolvedReturnType(): MissingType { return "value" as const; } ``` - [#​11071](biomejs/biome#11071) [`15047a2`](biomejs/biome@15047a2) Thanks [@​dyc3](https://github.com/dyc3)! - The HTML parser now accepts mixed-case `doctype` declarations. - [#​11030](biomejs/biome#11030) [`cc90e65`](biomejs/biome@cc90e65) Thanks [@​marschattha](https://github.com/marschattha)! - The `rdjson` reporter now populates the [severity](https://github.com/reviewdog/reviewdog/blob/master/proto/rdf/reviewdog.proto) field of each diagnostic (`ERROR`, `WARNING`, or `INFO`), so tools consuming Reviewdog Diagnostic Format output no longer need to assume a default severity. - [#​11009](biomejs/biome#11009) [`2c36626`](biomejs/biome@2c36626) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed a performance regression in type-aware JavaScript lint rules by inferring only requested types and memoizing export resolution. - [#​11056](biomejs/biome#11056) [`903b177`](biomejs/biome@903b177) Thanks [@​dyc3](https://github.com/dyc3)! - Added support for Svelte declaration tags using `let` and `const`. Biome can now parse, format, and lint bindings declared in these tags. - [#​11045](biomejs/biome#11045) [`89c27c6`](biomejs/biome@89c27c6) Thanks [@​ematipico](https://github.com/ematipico)! - Improved the performance of Biome formatter up to \~7% across the board. - [#​9806](biomejs/biome#9806) [`781d68d`](biomejs/biome@781d68d) Thanks [@​dyc3](https://github.com/dyc3)! - Added the nursery rule [`noJsRestrictedProperties`](https://biomejs.dev/linter/rules/no-js-restricted-properties/), which ports ESLint's `no-restricted-properties` rule. Biome now flags restricted member access and object destructuring, and `biome migrate eslint` preserves the rule's options. </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yODQuMCIsInVwZGF0ZWRJblZlciI6IjQzLjI4NC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119--> Reviewed-on: https://git.oirnoir.dev/OIRNOIR/YouTube-Helper-Server/pulls/33
This PR contains the following updates: | Package | Type | Update | Change | Pending | |---|---|---|---|---| | [@biomejs/biome](https://biomejs.dev) ([source](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome)) | imports | patch | [`2.5.5` -> `2.5.6`](https://renovatebot.com/diffs/npm/@biomejs%2fbiome/2.5.5/2.5.6) | `2.5.7` | --- ### Release Notes <details> <summary>biomejs/biome (@​biomejs/biome)</summary> ### [`v2.5.6`](https://github.com/biomejs/biome/blob/HEAD/packages/@​biomejs/biome/CHANGELOG.md#256) [Compare Source](https://github.com/biomejs/biome/compare/@biomejs/biome@2.5.5...@biomejs/biome@2.5.6) ##### Patch Changes - [#​11035](biomejs/biome#11035) [`0e4b03b`](biomejs/biome@0e4b03b) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed a performance regression in [`noMisusedPromises`](https://biomejs.dev/linter/rules/no-misused-promises/) that caused type inference to run repeatedly while linting a file. - [#​11043](biomejs/biome#11043) [`22ec076`](biomejs/biome@22ec076) Thanks [@​denbezrukov](https://github.com/denbezrukov)! - Fixed CSS formatting for multiline function arguments preceded by comments: ```diff .example { value: outer( 1, /* comment */ nested( - first, - second - ) + first, + second + ) ); } ``` - [#​11007](biomejs/biome#11007) [`c9acb25`](biomejs/biome@c9acb25) Thanks [@​BTF-Kabir-2020](https://github.com/BTF-Kabir-2020)! - Fixed [#​9195](biomejs/biome#9195): [`useHookAtTopLevel`](https://biomejs.dev/linter/rules/use-hook-at-top-level/) no longer reports hooks in named `forwardRef` components that receive a `ref` parameter. - [#​10152](biomejs/biome#10152) [`50a9bd8`](biomejs/biome@50a9bd8) Thanks [@​Zelys-DFKH](https://github.com/Zelys-DFKH)! - Fixed [#​10131](biomejs/biome#10131): Biome now correctly parses curried arrow functions in ternary consequents when the inner arrow's parameters use a destructuring pattern, e.g. `cond ? (x) => ({ a, b }) => body : alt`. - [#​11105](biomejs/biome#11105) [`8ffe2b9`](biomejs/biome@8ffe2b9) Thanks [@​dadavidtseng](https://github.com/dadavidtseng)! - Fixed [#​11092](biomejs/biome#11092): The [`noUselessTernary`](https://biomejs.dev/linter/rules/no-useless-ternary/) quick fix now preserves operator spacing when simplifying or inverting boolean ternary expressions. - [#​10533](biomejs/biome#10533) [`5809875`](biomejs/biome@5809875) Thanks [@​Mokto](https://github.com/Mokto)! - Fixed [#​10515](biomejs/biome#10515): `biome check --write` was not idempotent on Svelte files — multi-line template literals in `<script>` blocks and block comments in `<style>` blocks gained an extra indent level on every run. - [#​11040](biomejs/biome#11040) [`0abb620`](biomejs/biome@0abb620) Thanks [@​Mokto](https://github.com/Mokto)! - Fixed an issue where the HTML formatter would duplicate a comment placed directly before a Svelte `{@​const ...}` or `{@​debug ...}` block. The duplication compounded on every subsequent `--write`, causing the file to grow exponentially. - [#​10858](biomejs/biome#10858) [`6d18204`](biomejs/biome@6d18204) Thanks [@​ruidosujeira](https://github.com/ruidosujeira)! - Fixed [#​10839](biomejs/biome#10839): Svelte `{#each}` array destructuring no longer includes spaces inside square brackets, and multiline bind function expressions now indent their getter, setter, and function body correctly. - [#​11009](biomejs/biome#11009) [`2c36626`](biomejs/biome@2c36626) Thanks [@​ematipico](https://github.com/ematipico)! - Improved the accuracy of type-aware lint rules by resolving more inferred types. For example, [`noFloatingPromises`](https://biomejs.dev/linter/rules/no-floating-promises/) now detects floating Promises returned by aliased callbacks and arrays of Promises created by async mapping callbacks. The following statements are now reported: ```ts type AsyncCallback = () => Promise<void>; declare const callback: AsyncCallback; callback(); [1, 2, 3].map(async (value) => value); ``` - [#​10973](biomejs/biome#10973) [`9cb044c`](biomejs/biome@9cb044c) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed false positives in [`noMisleadingReturnType`](https://biomejs.dev/linter/rules/no-misleading-return-type/) when generic-constraint, normalization, substitution, or structural return-type comparison cannot complete. The rule now suppresses diagnostics rather than suggesting a return type derived from partial information. For example, this unresolved return type is no longer reported: ```ts function unresolvedReturnType(): MissingType { return "value" as const; } ``` - [#​11071](biomejs/biome#11071) [`15047a2`](biomejs/biome@15047a2) Thanks [@​dyc3](https://github.com/dyc3)! - The HTML parser now accepts mixed-case `doctype` declarations. - [#​11030](biomejs/biome#11030) [`cc90e65`](biomejs/biome@cc90e65) Thanks [@​marschattha](https://github.com/marschattha)! - The `rdjson` reporter now populates the [severity](https://github.com/reviewdog/reviewdog/blob/master/proto/rdf/reviewdog.proto) field of each diagnostic (`ERROR`, `WARNING`, or `INFO`), so tools consuming Reviewdog Diagnostic Format output no longer need to assume a default severity. - [#​11009](biomejs/biome#11009) [`2c36626`](biomejs/biome@2c36626) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed a performance regression in type-aware JavaScript lint rules by inferring only requested types and memoizing export resolution. - [#​11056](biomejs/biome#11056) [`903b177`](biomejs/biome@903b177) Thanks [@​dyc3](https://github.com/dyc3)! - Added support for Svelte declaration tags using `let` and `const`. Biome can now parse, format, and lint bindings declared in these tags. - [#​11045](biomejs/biome#11045) [`89c27c6`](biomejs/biome@89c27c6) Thanks [@​ematipico](https://github.com/ematipico)! - Improved the performance of Biome formatter up to \~7% across the board. - [#​9806](biomejs/biome#9806) [`781d68d`](biomejs/biome@781d68d) Thanks [@​dyc3](https://github.com/dyc3)! - Added the nursery rule [`noJsRestrictedProperties`](https://biomejs.dev/linter/rules/no-js-restricted-properties/), which ports ESLint's `no-restricted-properties` rule. Biome now flags restricted member access and object destructuring, and `biome migrate eslint` preserves the rule's options. </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yODQuMCIsInVwZGF0ZWRJblZlciI6IjQzLjI4NC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119--> Reviewed-on: https://git.oirnoir.dev/OIRNOIR/YouTube-Helper-Client/pulls/15
Summary
Closes #10961
Helped myself with a coding agent.
Test Plan
I tested locally with a debug build, and confirmed it fixes the issue. I'll trigger a preview release too.
Docs
N/A