fix(lint/noFloatingPromises): select the matching overload#10586
Conversation
🦋 Changeset detectedLatest commit: 5629f4d 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 |
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 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_js_type_info/src/flattening/expressions.rs`:
- Around line 516-540: The matcher currently only handles direct
TypeData::Function in resolve_function, so callable shapes like interfaces/type
aliases with a call signature (e.g. interface AsyncCb { (): Promise<void> })
fall through to the `_ => true` branch; update resolve_function to, after
resolving ty and checking for TypeData::Function, also inspect the resolved type
for a callable/call-signature shape and return its Function representation
(i.e., extract the call signature from the resolved type when present) so
function_returns_promise, which calls resolve_function, will correctly detect
promise-returning callables rather than treating them as unmatched.
- Around line 440-443: The code currently treats a failed select_overload the
same as a non-overloaded callee and falls back to resolve_callee_to_function,
which reuses the first signature; instead, detect whether the callee actually
has multiple call signatures (i.e., is an overloaded symbol) and, when
select_overload(&callee, &expr.arguments, resolver) returns None for an
overloaded callee, do not call resolve_callee_to_function but return/propagate
an unknown/unsupported result (or an error) so we don't silently pick the first
signature; only call resolve_callee_to_function when the callee is not
overloaded. Use the existing identifiers select_overload,
resolve_callee_to_function, callee, expr.arguments, and resolver to locate and
change the branch 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: e4cfaeeb-8ef0-40e4-8740-d91aabb6be29
⛔ Files ignored due to path filters (4)
crates/biome_js_analyze/tests/specs/nursery/noFloatingPromises/issue9568_generic.ts.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/nursery/noFloatingPromises/issue9568_invalid.ts.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/nursery/noFloatingPromises/issue9568_valid.ts.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/nursery/noFloatingPromises/overloadSelectedByArity.ts.snapis excluded by!**/*.snapand included by**
📒 Files selected for processing (10)
.changeset/fix-no-floating-promises-overloads.mdcrates/biome_js_analyze/tests/specs/nursery/noFloatingPromises/issue9568_generic.tscrates/biome_js_analyze/tests/specs/nursery/noFloatingPromises/issue9568_invalid.tscrates/biome_js_analyze/tests/specs/nursery/noFloatingPromises/issue9568_valid.tscrates/biome_js_analyze/tests/specs/nursery/noFloatingPromises/overloadSelectedByArity.tscrates/biome_js_type_info/src/flattening/expressions.rscrates/biome_js_type_info/src/type_data.rscrates/biome_module_graph/src/js_module_info/binding.rscrates/biome_module_graph/src/js_module_info/collector.rscrates/biome_module_graph/src/js_module_info/scope.rs
ab75c20 to
0e56104
Compare
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
WalkthroughThis PR makes the analyzer overload-aware: it adds JsDeclarationKind::Function and FunctionValue/Overloaded binding references, adjusts semantic event handling and scope APIs, collects overload groups into callable object types during type finalisation, and implements call-site overload selection (arity + promise-return shape) in flattened_call. Multiple new TypeScript fixtures exercise non-Promise and Promise overloads; a changeset documents the fix. Possibly related PRs
Suggested reviewers
Suggested labels
Suggested reviewers:
🚥 Pre-merge checks | ✅ 4✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
crates/biome_js_type_info/src/flattening/expressions.rs (1)
403-429:⚠️ Potential issue | 🟠 Major | ⚡ Quick winUnion-typed overloaded callees still skip overload selection.
The union branch only calls
resolve_callee_to_function(). Fortypeof overloaded | undefinedand optional-call shapes, that still picks the first call signature for the overloaded variant instead of running the matcher, sonoFloatingPromisescan keep inferring the wrong return type.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: c97a6a72-5013-4af4-be2a-705ac2add101
⛔ Files ignored due to path filters (6)
crates/biome_js_analyze/tests/specs/nursery/noFloatingPromises/issue9568_generic.ts.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/nursery/noFloatingPromises/issue9568_invalid.ts.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/nursery/noFloatingPromises/issue9568_valid.ts.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/nursery/noFloatingPromises/overloadSelectedByArity.ts.snapis excluded by!**/*.snapand included by**crates/biome_js_semantic/src/snapshots/format_js.snapis excluded by!**/*.snapand included by**crates/biome_js_semantic/src/snapshots/format_ts.snapis excluded by!**/*.snapand included by**
📒 Files selected for processing (13)
.changeset/fix-no-floating-promises-overloads.mdcrates/biome_js_analyze/tests/specs/nursery/noFloatingPromises/issue9568_generic.tscrates/biome_js_analyze/tests/specs/nursery/noFloatingPromises/issue9568_invalid.tscrates/biome_js_analyze/tests/specs/nursery/noFloatingPromises/issue9568_valid.tscrates/biome_js_analyze/tests/specs/nursery/noFloatingPromises/overloadSelectedByArity.tscrates/biome_js_semantic/src/events.rscrates/biome_js_semantic/src/semantic_model/binding.rscrates/biome_js_semantic/src/semantic_model/builder.rscrates/biome_js_semantic/src/semantic_model/scope.rscrates/biome_js_type_info/src/flattening/expressions.rscrates/biome_js_type_info/src/type_data.rscrates/biome_module_graph/src/js_module_info/collector.rscrates/biome_module_graph/src/js_module_info/scope.rs
0e56104 to
bbe496d
Compare
Merging this PR will not alter performance
Comparing Footnotes
|
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 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_js_semantic/src/semantic_model/binding.rs`:
- Around line 281-318: The doc comment on pub fn union_with(self, other: Self)
overstates the invariant by saying “other is always a single,
freshly-constructed reference”; update the comment to clarify intended usage:
state that callers (e.g., builder code that calls
existing.clone().union_with(binding_reference.clone())) should pass a
non-composite `other` (FunctionValue/Type/ValueType/etc.), that the function
defensively handles composite `self` and composite `other` only for robustness,
and that composite `other` is not produced by
TsBindingReference::from_binding_and_declaration_kind in normal flows; keep the
implementation but make the comment reflect this intended, not absolute,
invariant so callers/readers understand the defensive arms.
🪄 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: 818bc956-9f35-4bf2-80d8-08b3a2d7b6bb
⛔ Files ignored due to path filters (7)
crates/biome_js_analyze/tests/specs/nursery/noFloatingPromises/issue9568_generic.ts.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/nursery/noFloatingPromises/issue9568_invalid.ts.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/nursery/noFloatingPromises/issue9568_valid.ts.snapis excluded by!**/*.snapand included by**crates/biome_js_analyze/tests/specs/nursery/noFloatingPromises/overloadSelectedByArity.ts.snapis excluded by!**/*.snapand included by**crates/biome_js_semantic/src/snapshots/format_js.snapis excluded by!**/*.snapand included by**crates/biome_js_semantic/src/snapshots/format_ts.snapis excluded by!**/*.snapand included by**crates/biome_service/src/snapshots/biome_service__workspace__tests__debug_semantic_model.snapis excluded by!**/*.snapand included by**
📒 Files selected for processing (13)
.changeset/fix-no-floating-promises-overloads.mdcrates/biome_js_analyze/tests/specs/nursery/noFloatingPromises/issue9568_generic.tscrates/biome_js_analyze/tests/specs/nursery/noFloatingPromises/issue9568_invalid.tscrates/biome_js_analyze/tests/specs/nursery/noFloatingPromises/issue9568_valid.tscrates/biome_js_analyze/tests/specs/nursery/noFloatingPromises/overloadSelectedByArity.tscrates/biome_js_semantic/src/events.rscrates/biome_js_semantic/src/semantic_model/binding.rscrates/biome_js_semantic/src/semantic_model/builder.rscrates/biome_js_semantic/src/semantic_model/scope.rscrates/biome_js_type_info/src/flattening/expressions.rscrates/biome_js_type_info/src/type_data.rscrates/biome_module_graph/src/js_module_info/collector.rscrates/biome_module_graph/src/js_module_info/scope.rs
✅ Files skipped from review due to trivial changes (1)
- .changeset/fix-no-floating-promises-overloads.md
🚧 Files skipped from review as they are similar to previous changes (10)
- crates/biome_js_type_info/src/type_data.rs
- crates/biome_js_analyze/tests/specs/nursery/noFloatingPromises/issue9568_invalid.ts
- crates/biome_js_semantic/src/events.rs
- crates/biome_module_graph/src/js_module_info/scope.rs
- crates/biome_js_analyze/tests/specs/nursery/noFloatingPromises/overloadSelectedByArity.ts
- crates/biome_js_semantic/src/semantic_model/scope.rs
- crates/biome_module_graph/src/js_module_info/collector.rs
- crates/biome_js_analyze/tests/specs/nursery/noFloatingPromises/issue9568_generic.ts
- crates/biome_js_type_info/src/flattening/expressions.rs
- crates/biome_js_semantic/src/semantic_model/builder.rs
9e4766d to
ce212fa
Compare
|
@IxxyDev I leave to you to rebase this PR |
…ng-promise checks Mirror TypeScript's overload resolution: when a callee carries multiple call signatures, pick the first one whose parameters accept the arguments instead of always using the last declaration. A call that matches no signature resolves to unknown rather than falling back to the first signature.
…load selection Extend resolve_function to also inspect Interface and Object types for a call signature member, so overloads that differ only by whether a callable-interface callback returns a Promise are correctly matched.
8ca6ff3 to
5629f4d
Compare
|
@ematipico rebased, done |
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.1` -> `2.5.2`](https://renovatebot.com/diffs/npm/@biomejs%2fbiome/2.5.1/2.5.2) | --- ### Release Notes <details> <summary>biomejs/biome (@​biomejs/biome)</summary> ### [`v2.5.2`](https://github.com/biomejs/biome/blob/HEAD/packages/@​biomejs/biome/CHANGELOG.md#252) [Compare Source](https://github.com/biomejs/biome/compare/@biomejs/biome@2.5.1...@biomejs/biome@2.5.2) ##### Patch Changes - [#​10595](biomejs/biome#10595) [`f458028`](biomejs/biome@f458028) Thanks [@​pkallos](https://github.com/pkallos)! - Added the option `ignoreBooleanCoercion` to [useNullishCoalescing](https://biomejs.dev/linter/rules/use-nullish-coalescing/). When enabled, Biome ignores `||` and `||=` used inside a `Boolean()` call, where coalescing on falsy values is intentional. - [#​10798](biomejs/biome#10798) [`4a32b63`](biomejs/biome@4a32b63) Thanks [@​pkallos](https://github.com/pkallos)! - Added the option `ignorePrimitives` to [useNullishCoalescing](https://biomejs.dev/linter/rules/use-nullish-coalescing/). When enabled, Biome ignores `||`, `||=`, and ternary expressions whose non-nullish operands are all primitives the option opts out of. Use `true` to ignore all primitives, or an object selecting `string`, `number`, `boolean`, or `bigint`. - [#​10545](biomejs/biome#10545) [`f3d4c00`](biomejs/biome@f3d4c00) Thanks [@​Mokto](https://github.com/Mokto)! - Added the new nursery rule [`noSvelteUnnecessaryStateWrap`](https://biomejs.dev/linter/rules/no-svelte-unnecessary-state-wrap/), which reports unnecessary `$state()` wrapping of classes from `svelte/reactivity` that are already reactive. ```svelte <script> import { SvelteMap } from "svelte/reactivity"; const map = $state(new SvelteMap()); // redundant </script> ``` - [#​10752](biomejs/biome#10752) [`f62fb8b`](biomejs/biome@f62fb8b) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed [#​10739](biomejs/biome#10739). Now the rule [`useValidAutocomplete`](https://biomejs.dev/linter/rules/use-valid-autocomplete/) correctly flags the `autoComplete` attribute. - [#​10796](biomejs/biome#10796) [`f1b3ab2`](biomejs/biome@f1b3ab2) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed [#​10768](biomejs/biome#10768). Improved the performance of the Biome Language Server by cancelling certain in-flight operations when there are fast updates. - [#​10719](biomejs/biome#10719) [`aa649b5`](biomejs/biome@aa649b5) Thanks [@​minseong0324](https://github.com/minseong0324)! - Fixed [`noMisleadingReturnType`](https://biomejs.dev/linter/rules/no-misleading-return-type/) false positive on returns that use a widening type assertion: `"a" as string` is no longer reported as misleading. The rule now also reports a literal-pinning assertion such as `false as false`, matching the existing `as const` behavior. ```ts // No longer flagged (returns are `string`): function getValue(b: boolean): string { if (b) return "a" as string; return "b" as string; } // Now also reported, like `as const` (returns `false`): function isReady(): boolean { return false as false; } ``` - [#​10678](biomejs/biome#10678) [`8f073a7`](biomejs/biome@8f073a7) Thanks [@​PranavAchar01](https://github.com/PranavAchar01)! - Fixed [#​7718](biomejs/biome#7718): Biome now correctly parses CSS nesting selectors when `&` appears as a trailing sub-selector after a type selector, e.g. `h1& { color: red; }`. - [#​10756](biomejs/biome#10756) [`5ec965a`](biomejs/biome@5ec965a) Thanks [@​denbezrukov](https://github.com/denbezrukov)! - Fixed CSS formatter output for selector lists with `allowWrongLineComments` and `//` comments after a selector comma. Biome now keeps the selector before the line comment inline instead of breaking it across descendant combinators. ```diff -.powerPathNavigator - .helm - button.pressedButton, // pressed +.powerPathNavigator .helm button.pressedButton, // pressed .powerPathNavigator .helm button:active:not(.disabledButton) { } ``` - [#​10757](biomejs/biome#10757) [`6232fcd`](biomejs/biome@6232fcd) Thanks [@​PranavAchar01](https://github.com/PranavAchar01)! - Fixed [#​8269](biomejs/biome#8269): the CSS parser now accepts Tailwind `@variant` and `@utility` names that start with a digit, such as the `2xl` breakpoint. ```css @​utility container { @​variant 2xl { max-width: 1400px; } } ``` - [#​10777](biomejs/biome#10777) [`575ced6`](biomejs/biome@575ced6) Thanks [@​WaterWhisperer](https://github.com/WaterWhisperer)! - Fixed an issue reported in [#​10708](biomejs/biome#10708): the GitLab reporter now handles `--verbose` diagnostics filtering correctly. - [#​10281](biomejs/biome#10281) [`0efe244`](biomejs/biome@0efe244) Thanks [@​Zelys-DFKH](https://github.com/Zelys-DFKH)! - Fixed a bug where GritQL patterns rejected positional (unkeyed) arguments. - [#​10758](biomejs/biome#10758) [`e36fd8a`](biomejs/biome@e36fd8a) Thanks [@​henrybrewer00-dotcom](https://github.com/henrybrewer00-dotcom)! - Fixed [#​10697](biomejs/biome#10697): The formatter no longer removes the parentheses around an `await` or `yield` expression used as the target of a TypeScript instantiation expression. For example, `(await makeFactory)<Value>` is no longer reformatted to `await makeFactory<Value>`, which would change the meaning of the code. - [#​10586](biomejs/biome#10586) [`3617094`](biomejs/biome@3617094) Thanks [@​IxxyDev](https://github.com/IxxyDev)! - Fixed [#​9568](biomejs/biome#9568): [`noFloatingPromises`](https://biomejs.dev/linter/rules/no-floating-promises/) no longer reports a false positive when calling an overloaded function and the selected overload does not return a promise. ```ts function bestEffort(cb: () => Promise<number>): Promise<number>; function bestEffort(cb: () => number): number; function bestEffort( cb: () => number | Promise<number>, ): Promise<number> | number { return cb() as Promise<number> | number; } // This resolves to the second overload, which returns `number`, so it is no // longer flagged as a floating promise. bestEffort(() => 42); ``` - [#​10766](biomejs/biome#10766) [`7aff4c1`](biomejs/biome@7aff4c1) Thanks [@​JamBalaya56562](https://github.com/JamBalaya56562)! - Fixed [#​2862](biomejs/biome#2862): [`noInteractiveElementToNoninteractiveRole`](https://biomejs.dev/linter/rules/no-interactive-element-to-noninteractive-role/) no longer reports custom elements (a tag name containing a dash, e.g. `<my-button role="img" />`). Per the [W3C HTML-ARIA specification](https://www.w3.org/TR/html-aria/#el-autonomous-custom-element), a custom element may be given any role or none. - [#​10680](biomejs/biome#10680) [`771daa4`](biomejs/biome@771daa4) Thanks [@​WaterWhisperer](https://github.com/WaterWhisperer)! - Fixed [#​10635](biomejs/biome#10635): Biome now recognizes chained table tests such as `test.concurrent.each()` and `it.concurrent.each()` as test calls, fixing `noMisplacedAssertion` false positives and improving formatting for those test declarations. - [#​10759](biomejs/biome#10759) [`34570b5`](biomejs/biome@34570b5) Thanks [@​henrybrewer00-dotcom](https://github.com/henrybrewer00-dotcom)! - Fixed [#​10636](biomejs/biome#10636): [noStaticElementInteractions](https://biomejs.dev/linter/rules/no-static-element-interactions/) no longer reports a false positive for event handlers on Svelte special elements such as `<svelte:window>`, `<svelte:document>`, and `<svelte:body>`. These are not real DOM elements, so they are now ignored by the rule. - [#​10741](biomejs/biome#10741) [`bd2364e`](biomejs/biome@bd2364e) Thanks [@​JamBalaya56562](https://github.com/JamBalaya56562)! - Fixed [#​6686](biomejs/biome#6686): the `rage` command now respects the `--config-path` option and the `BIOME_CONFIG_PATH` environment variable when loading the Biome configuration. Previously it always used the default configuration resolution and reported the configuration as `Not set` when no `biome.json` existed in the working directory. - [#​10763](biomejs/biome#10763) [`2c3e82d`](biomejs/biome@2c3e82d) Thanks [@​Aqu1bp](https://github.com/Aqu1bp)! - Fixed [#​10742](biomejs/biome#10742): [`noSolidDestructuredProps`](https://biomejs.dev/linter/rules/no-solid-destructured-props) now reports destructured props in Solid function components and JSX children. - [#​10606](biomejs/biome#10606) [`a4cc4ab`](biomejs/biome@a4cc4ab) Thanks [@​Mokto](https://github.com/Mokto)! - Fixed false positives in `noUnusedImports`, `noUnusedVariables`, and `useImportType` for Svelte components that use both a `<script module>` and a `<script>` block. The two blocks compile to a single module and share a top-level scope, so a binding (import, function, or variable) declared in one block and used only in the other is no longer reported as unused. - [#​10767](biomejs/biome#10767) [`36d5aa7`](biomejs/biome@36d5aa7) Thanks [@​otkrickey](https://github.com/otkrickey)! - Fixed [#​10754](biomejs/biome#10754): [`useVueValidVBind`](https://biomejs.dev/linter/rules/use-vue-valid-v-bind/) no longer reports the Vue 3.4+ same-name shorthand as missing a value. `:foo` and `v-bind:foo` are now accepted as equivalent to `:foo="foo"`, while `v-bind`, `v-bind:[dynamicArg]`, and `:[dynamicArg]` without a value continue to be reported. - [#​10775](biomejs/biome#10775) [`a918af0`](biomejs/biome@a918af0) Thanks [@​WaterWhisperer](https://github.com/WaterWhisperer)! - Fixed an issue reported in [#​10708](biomejs/biome#10708): `biome rage` didn't detect running Biome daemon pipes on Windows. - [#​10730](biomejs/biome#10730) [`5a2e65b`](biomejs/biome@5a2e65b) Thanks [@​dinocosta](https://github.com/dinocosta)! - Fixed an issue where Biome was resolving [the well-known Zed settings file](https://biomejs.dev/guides/configure-biome/#well-known-files) from the wrong location on macOS and Windows. - [#​10807](biomejs/biome#10807) [`d97fffe`](biomejs/biome@d97fffe) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed an issue where `.scss` files were incorrectly analyzed when running `biome check`. - [#​10672](biomejs/biome#10672) [`53c6efc`](biomejs/biome@53c6efc) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed a bug where Biome incorrectly formatted snippets that have parsing errors. - [#​10719](biomejs/biome#10719) [`aa649b5`](biomejs/biome@aa649b5) Thanks [@​minseong0324](https://github.com/minseong0324)! - Fixed [`useAwaitThenable`](https://biomejs.dev/linter/rules/use-await-thenable/) false positive when awaiting a custom thenable that is not the global `Promise`. A value with a callable `then` member is now recognized as awaitable. ```ts interface Thenable<T> { then(onfulfilled: (value: T) => void): void; } declare const t: Thenable<number>; async function f() { await t; } ``` - [#​10734](biomejs/biome#10734) [`4396496`](biomejs/biome@4396496) Thanks [@​BangDori](https://github.com/BangDori)! - Fixed [#​10708](biomejs/biome#10708): `biome migrate` now preserves trivia when migrating the deprecated `recommended` option to `preset`. - [#​10683](biomejs/biome#10683) [`ae31a00`](biomejs/biome@ae31a00) Thanks [@​Netail](https://github.com/Netail)! - Fixed [#​10657](biomejs/biome#10657) [#​10671](biomejs/biome#10671) [#​10661](biomejs/biome#10661) [#​10637](biomejs/biome#10637) [#​10718](biomejs/biome#10718): HTML rules now correctly handle dynamic attributes. - [#​10746](biomejs/biome#10746) [`54e8239`](biomejs/biome@54e8239) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed an issue where [`noUndeclaredClasses`](https://biomejs.dev/linter/rules/no-undeclared-classes) didn't correctly detect styles defined inside the Astro directive `is:global`. - [#​10770](biomejs/biome#10770) [`dd1429c`](biomejs/biome@dd1429c) Thanks [@​ematipico](https://github.com/ematipico)! - Improved the Biome Language Server DX by orchestrating certain operations, so that they won't block the editor during typing. This improvement is more visible in large documents. - [#​10473](biomejs/biome#10473) [`d9b5133`](biomejs/biome@d9b5133) Thanks [@​Mokto](https://github.com/Mokto)! - Improved [`noUnusedImports`](https://biomejs.dev/linter/rules/no-unused-imports/), [`noUnusedVariables`](https://biomejs.dev/linter/rules/no-unused-variables/), [`noUnusedFunctionParameters`](https://biomejs.dev/linter/rules/no-unused-function-parameters/), and [`useImportType`](https://biomejs.dev/linter/rules/use-import-type/) for Svelte, Vue, and Astro files (with `html.experimentalFullSupportEnabled`). Bindings used only in the template — including component tags, attribute interpolations, directives, `bind:` shorthand, and snippet parameters — are no longer reported as unused, while genuinely unused ones still are. - [#​10796](biomejs/biome#10796) [`f1b3ab2`](biomejs/biome@f1b3ab2) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed an issue where the Biome Language Server didn't enable project or type-aware lint rules, even when they were explicitly enabled. - [#​10746](biomejs/biome#10746) [`54e8239`](biomejs/biome@54e8239) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed an issue where [`noUndeclaredClasses`](https://biomejs.dev/linter/rules/no-undeclared-classes) didn't detect styles declared inside HTML documents. - [#​10774](biomejs/biome#10774) [`bde945b`](biomejs/biome@bde945b) Thanks [@​pattrickrice](https://github.com/pattrickrice)! - Fixed [#​10268](biomejs/biome#10268) where a race condition resulted in internal errors such as: `The file biome.json does not exist in the workspace`. </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:eyJjcmVhdGVkSW5WZXIiOiI0My4yMzQuMCIsInVwZGF0ZWRJblZlciI6IjQzLjIzNC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119--> Reviewed-on: https://git.oirnoir.dev/OIRNOIR/YouTube-Helper-Client/pulls/9
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.1` -> `2.5.2`](https://renovatebot.com/diffs/npm/@biomejs%2fbiome/2.5.1/2.5.2) | `2.5.3` | --- ### Release Notes <details> <summary>biomejs/biome (@​biomejs/biome)</summary> ### [`v2.5.2`](https://github.com/biomejs/biome/blob/HEAD/packages/@​biomejs/biome/CHANGELOG.md#252) [Compare Source](https://github.com/biomejs/biome/compare/@biomejs/biome@2.5.1...@biomejs/biome@2.5.2) ##### Patch Changes - [#​10595](biomejs/biome#10595) [`f458028`](biomejs/biome@f458028) Thanks [@​pkallos](https://github.com/pkallos)! - Added the option `ignoreBooleanCoercion` to [useNullishCoalescing](https://biomejs.dev/linter/rules/use-nullish-coalescing/). When enabled, Biome ignores `||` and `||=` used inside a `Boolean()` call, where coalescing on falsy values is intentional. - [#​10798](biomejs/biome#10798) [`4a32b63`](biomejs/biome@4a32b63) Thanks [@​pkallos](https://github.com/pkallos)! - Added the option `ignorePrimitives` to [useNullishCoalescing](https://biomejs.dev/linter/rules/use-nullish-coalescing/). When enabled, Biome ignores `||`, `||=`, and ternary expressions whose non-nullish operands are all primitives the option opts out of. Use `true` to ignore all primitives, or an object selecting `string`, `number`, `boolean`, or `bigint`. - [#​10545](biomejs/biome#10545) [`f3d4c00`](biomejs/biome@f3d4c00) Thanks [@​Mokto](https://github.com/Mokto)! - Added the new nursery rule [`noSvelteUnnecessaryStateWrap`](https://biomejs.dev/linter/rules/no-svelte-unnecessary-state-wrap/), which reports unnecessary `$state()` wrapping of classes from `svelte/reactivity` that are already reactive. ```svelte <script> import { SvelteMap } from "svelte/reactivity"; const map = $state(new SvelteMap()); // redundant </script> ``` - [#​10752](biomejs/biome#10752) [`f62fb8b`](biomejs/biome@f62fb8b) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed [#​10739](biomejs/biome#10739). Now the rule [`useValidAutocomplete`](https://biomejs.dev/linter/rules/use-valid-autocomplete/) correctly flags the `autoComplete` attribute. - [#​10796](biomejs/biome#10796) [`f1b3ab2`](biomejs/biome@f1b3ab2) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed [#​10768](biomejs/biome#10768). Improved the performance of the Biome Language Server by cancelling certain in-flight operations when there are fast updates. - [#​10719](biomejs/biome#10719) [`aa649b5`](biomejs/biome@aa649b5) Thanks [@​minseong0324](https://github.com/minseong0324)! - Fixed [`noMisleadingReturnType`](https://biomejs.dev/linter/rules/no-misleading-return-type/) false positive on returns that use a widening type assertion: `"a" as string` is no longer reported as misleading. The rule now also reports a literal-pinning assertion such as `false as false`, matching the existing `as const` behavior. ```ts // No longer flagged (returns are `string`): function getValue(b: boolean): string { if (b) return "a" as string; return "b" as string; } // Now also reported, like `as const` (returns `false`): function isReady(): boolean { return false as false; } ``` - [#​10678](biomejs/biome#10678) [`8f073a7`](biomejs/biome@8f073a7) Thanks [@​PranavAchar01](https://github.com/PranavAchar01)! - Fixed [#​7718](biomejs/biome#7718): Biome now correctly parses CSS nesting selectors when `&` appears as a trailing sub-selector after a type selector, e.g. `h1& { color: red; }`. - [#​10756](biomejs/biome#10756) [`5ec965a`](biomejs/biome@5ec965a) Thanks [@​denbezrukov](https://github.com/denbezrukov)! - Fixed CSS formatter output for selector lists with `allowWrongLineComments` and `//` comments after a selector comma. Biome now keeps the selector before the line comment inline instead of breaking it across descendant combinators. ```diff -.powerPathNavigator - .helm - button.pressedButton, // pressed +.powerPathNavigator .helm button.pressedButton, // pressed .powerPathNavigator .helm button:active:not(.disabledButton) { } ``` - [#​10757](biomejs/biome#10757) [`6232fcd`](biomejs/biome@6232fcd) Thanks [@​PranavAchar01](https://github.com/PranavAchar01)! - Fixed [#​8269](biomejs/biome#8269): the CSS parser now accepts Tailwind `@variant` and `@utility` names that start with a digit, such as the `2xl` breakpoint. ```css @​utility container { @​variant 2xl { max-width: 1400px; } } ``` - [#​10777](biomejs/biome#10777) [`575ced6`](biomejs/biome@575ced6) Thanks [@​WaterWhisperer](https://github.com/WaterWhisperer)! - Fixed an issue reported in [#​10708](biomejs/biome#10708): the GitLab reporter now handles `--verbose` diagnostics filtering correctly. - [#​10281](biomejs/biome#10281) [`0efe244`](biomejs/biome@0efe244) Thanks [@​Zelys-DFKH](https://github.com/Zelys-DFKH)! - Fixed a bug where GritQL patterns rejected positional (unkeyed) arguments. - [#​10758](biomejs/biome#10758) [`e36fd8a`](biomejs/biome@e36fd8a) Thanks [@​henrybrewer00-dotcom](https://github.com/henrybrewer00-dotcom)! - Fixed [#​10697](biomejs/biome#10697): The formatter no longer removes the parentheses around an `await` or `yield` expression used as the target of a TypeScript instantiation expression. For example, `(await makeFactory)<Value>` is no longer reformatted to `await makeFactory<Value>`, which would change the meaning of the code. - [#​10586](biomejs/biome#10586) [`3617094`](biomejs/biome@3617094) Thanks [@​IxxyDev](https://github.com/IxxyDev)! - Fixed [#​9568](biomejs/biome#9568): [`noFloatingPromises`](https://biomejs.dev/linter/rules/no-floating-promises/) no longer reports a false positive when calling an overloaded function and the selected overload does not return a promise. ```ts function bestEffort(cb: () => Promise<number>): Promise<number>; function bestEffort(cb: () => number): number; function bestEffort( cb: () => number | Promise<number>, ): Promise<number> | number { return cb() as Promise<number> | number; } // This resolves to the second overload, which returns `number`, so it is no // longer flagged as a floating promise. bestEffort(() => 42); ``` - [#​10766](biomejs/biome#10766) [`7aff4c1`](biomejs/biome@7aff4c1) Thanks [@​JamBalaya56562](https://github.com/JamBalaya56562)! - Fixed [#​2862](biomejs/biome#2862): [`noInteractiveElementToNoninteractiveRole`](https://biomejs.dev/linter/rules/no-interactive-element-to-noninteractive-role/) no longer reports custom elements (a tag name containing a dash, e.g. `<my-button role="img" />`). Per the [W3C HTML-ARIA specification](https://www.w3.org/TR/html-aria/#el-autonomous-custom-element), a custom element may be given any role or none. - [#​10680](biomejs/biome#10680) [`771daa4`](biomejs/biome@771daa4) Thanks [@​WaterWhisperer](https://github.com/WaterWhisperer)! - Fixed [#​10635](biomejs/biome#10635): Biome now recognizes chained table tests such as `test.concurrent.each()` and `it.concurrent.each()` as test calls, fixing `noMisplacedAssertion` false positives and improving formatting for those test declarations. - [#​10759](biomejs/biome#10759) [`34570b5`](biomejs/biome@34570b5) Thanks [@​henrybrewer00-dotcom](https://github.com/henrybrewer00-dotcom)! - Fixed [#​10636](biomejs/biome#10636): [noStaticElementInteractions](https://biomejs.dev/linter/rules/no-static-element-interactions/) no longer reports a false positive for event handlers on Svelte special elements such as `<svelte:window>`, `<svelte:document>`, and `<svelte:body>`. These are not real DOM elements, so they are now ignored by the rule. - [#​10741](biomejs/biome#10741) [`bd2364e`](biomejs/biome@bd2364e) Thanks [@​JamBalaya56562](https://github.com/JamBalaya56562)! - Fixed [#​6686](biomejs/biome#6686): the `rage` command now respects the `--config-path` option and the `BIOME_CONFIG_PATH` environment variable when loading the Biome configuration. Previously it always used the default configuration resolution and reported the configuration as `Not set` when no `biome.json` existed in the working directory. - [#​10763](biomejs/biome#10763) [`2c3e82d`](biomejs/biome@2c3e82d) Thanks [@​Aqu1bp](https://github.com/Aqu1bp)! - Fixed [#​10742](biomejs/biome#10742): [`noSolidDestructuredProps`](https://biomejs.dev/linter/rules/no-solid-destructured-props) now reports destructured props in Solid function components and JSX children. - [#​10606](biomejs/biome#10606) [`a4cc4ab`](biomejs/biome@a4cc4ab) Thanks [@​Mokto](https://github.com/Mokto)! - Fixed false positives in `noUnusedImports`, `noUnusedVariables`, and `useImportType` for Svelte components that use both a `<script module>` and a `<script>` block. The two blocks compile to a single module and share a top-level scope, so a binding (import, function, or variable) declared in one block and used only in the other is no longer reported as unused. - [#​10767](biomejs/biome#10767) [`36d5aa7`](biomejs/biome@36d5aa7) Thanks [@​otkrickey](https://github.com/otkrickey)! - Fixed [#​10754](biomejs/biome#10754): [`useVueValidVBind`](https://biomejs.dev/linter/rules/use-vue-valid-v-bind/) no longer reports the Vue 3.4+ same-name shorthand as missing a value. `:foo` and `v-bind:foo` are now accepted as equivalent to `:foo="foo"`, while `v-bind`, `v-bind:[dynamicArg]`, and `:[dynamicArg]` without a value continue to be reported. - [#​10775](biomejs/biome#10775) [`a918af0`](biomejs/biome@a918af0) Thanks [@​WaterWhisperer](https://github.com/WaterWhisperer)! - Fixed an issue reported in [#​10708](biomejs/biome#10708): `biome rage` didn't detect running Biome daemon pipes on Windows. - [#​10730](biomejs/biome#10730) [`5a2e65b`](biomejs/biome@5a2e65b) Thanks [@​dinocosta](https://github.com/dinocosta)! - Fixed an issue where Biome was resolving [the well-known Zed settings file](https://biomejs.dev/guides/configure-biome/#well-known-files) from the wrong location on macOS and Windows. - [#​10807](biomejs/biome#10807) [`d97fffe`](biomejs/biome@d97fffe) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed an issue where `.scss` files were incorrectly analyzed when running `biome check`. - [#​10672](biomejs/biome#10672) [`53c6efc`](biomejs/biome@53c6efc) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed a bug where Biome incorrectly formatted snippets that have parsing errors. - [#​10719](biomejs/biome#10719) [`aa649b5`](biomejs/biome@aa649b5) Thanks [@​minseong0324](https://github.com/minseong0324)! - Fixed [`useAwaitThenable`](https://biomejs.dev/linter/rules/use-await-thenable/) false positive when awaiting a custom thenable that is not the global `Promise`. A value with a callable `then` member is now recognized as awaitable. ```ts interface Thenable<T> { then(onfulfilled: (value: T) => void): void; } declare const t: Thenable<number>; async function f() { await t; } ``` - [#​10734](biomejs/biome#10734) [`4396496`](biomejs/biome@4396496) Thanks [@​BangDori](https://github.com/BangDori)! - Fixed [#​10708](biomejs/biome#10708): `biome migrate` now preserves trivia when migrating the deprecated `recommended` option to `preset`. - [#​10683](biomejs/biome#10683) [`ae31a00`](biomejs/biome@ae31a00) Thanks [@​Netail](https://github.com/Netail)! - Fixed [#​10657](biomejs/biome#10657) [#​10671](biomejs/biome#10671) [#​10661](biomejs/biome#10661) [#​10637](biomejs/biome#10637) [#​10718](biomejs/biome#10718): HTML rules now correctly handle dynamic attributes. - [#​10746](biomejs/biome#10746) [`54e8239`](biomejs/biome@54e8239) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed an issue where [`noUndeclaredClasses`](https://biomejs.dev/linter/rules/no-undeclared-classes) didn't correctly detect styles defined inside the Astro directive `is:global`. - [#​10770](biomejs/biome#10770) [`dd1429c`](biomejs/biome@dd1429c) Thanks [@​ematipico](https://github.com/ematipico)! - Improved the Biome Language Server DX by orchestrating certain operations, so that they won't block the editor during typing. This improvement is more visible in large documents. - [#​10473](biomejs/biome#10473) [`d9b5133`](biomejs/biome@d9b5133) Thanks [@​Mokto](https://github.com/Mokto)! - Improved [`noUnusedImports`](https://biomejs.dev/linter/rules/no-unused-imports/), [`noUnusedVariables`](https://biomejs.dev/linter/rules/no-unused-variables/), [`noUnusedFunctionParameters`](https://biomejs.dev/linter/rules/no-unused-function-parameters/), and [`useImportType`](https://biomejs.dev/linter/rules/use-import-type/) for Svelte, Vue, and Astro files (with `html.experimentalFullSupportEnabled`). Bindings used only in the template — including component tags, attribute interpolations, directives, `bind:` shorthand, and snippet parameters — are no longer reported as unused, while genuinely unused ones still are. - [#​10796](biomejs/biome#10796) [`f1b3ab2`](biomejs/biome@f1b3ab2) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed an issue where the Biome Language Server didn't enable project or type-aware lint rules, even when they were explicitly enabled. - [#​10746](biomejs/biome#10746) [`54e8239`](biomejs/biome@54e8239) Thanks [@​ematipico](https://github.com/ematipico)! - Fixed an issue where [`noUndeclaredClasses`](https://biomejs.dev/linter/rules/no-undeclared-classes) didn't detect styles declared inside HTML documents. - [#​10774](biomejs/biome#10774) [`bde945b`](biomejs/biome@bde945b) Thanks [@​pattrickrice](https://github.com/pattrickrice)! - Fixed [#​10268](biomejs/biome#10268) where a race condition resulted in internal errors such as: `The file biome.json does not exist in the workspace`. </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:eyJjcmVhdGVkSW5WZXIiOiI0My4yNDYuMSIsInVwZGF0ZWRJblZlciI6IjQzLjI0Ni4xIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119--> Reviewed-on: https://git.oirnoir.dev/OIRNOIR/YouTube-Helper-Server/pulls/22
Summary
Fixes #9568 (part 2 of 2). Stacked on #10585 — that should be reviewed and merged first.
Calling an overloaded function resolved to a single, arbitrary signature, so
noFloatingPromisesjudged the call by the first overload's return type. When that overload returned a promise but the selected one did not, the call was flagged incorrectly.A set of same-name function declarations (preserved by #10585) now resolves to an object carrying one call signature per declaration — the way TypeScript models an overloaded function internally. At a call site, the first signature whose parameters accept the arguments wins, in declaration order, using a narrow promise-aware check plus an arity check (no general assignability). The call's return type is then taken from the selected signature, so a non-promise overload is no longer flagged while a promise-returning one still is.
How to review
fix(noFloatingPromises): ...commit.collector.rs— overload sets become an object of call signatures (the carrier surfaced to name resolution).expressions.rs—select_overloadand the narrow applicability check, wired intoflattened_call.type_data.rs— two smallFunctionParameteraccessors (is_optional/is_rest) for the arity check.Test Plan
issue9568_valid/issue9568_generic— the sync overload (including the exact generic case from the report) is no longer flagged.issue9568_invalid— the async overload is still flagged (guards against a false negative).overloadSelectedByArity— an overload distinguished only by arity selects the non-promise signature.Scope and future work
The selection here is deliberately narrow: it disambiguates by whether a callback argument returns a promise (plus arity), which is what this rule needs — not general overload resolution.
A fuller direction would give the type system first-class overload support: keep all signatures and a selection step (arity + structural parameter matching) usable by any type-aware rule, which would also let this rule drop the promise-specific check. Happy to open a separate design discussion if the team wants to pursue that.
Docs
Changeset included (patch).