Skip to content

Commit e6c9c46

Browse files
committed
feat(core): infer sequence operator and update operators
1 parent 0840021 commit e6c9c46

6 files changed

Lines changed: 81 additions & 0 deletions

File tree

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
---
2+
"@biomejs/biome": minor
3+
---
4+
5+
Type inference is now able to handle the sequence operator (`,`), as well as
6+
post- and pre-update operators: `++`.
7+
8+
9+
## Examples
10+
11+
```ts
12+
let x = 5;
13+
14+
// We now infer that `x++` resolves to a number, while the expression as a whole
15+
// becomes a Promise:
16+
x++, new Promise((resolve) => resolve('comma'));
17+
```
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
// Promise in comma operator
2+
function pattern19() {
3+
let _x = 5;
4+
_x++, new Promise((resolve) => resolve('comma'));
5+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
---
2+
source: crates/biome_js_analyze/tests/spec_tests.rs
3+
expression: 19_invalid.ts
4+
---
5+
# Input
6+
```ts
7+
// Promise in comma operator
8+
function pattern19() {
9+
let _x = 5;
10+
_x++, new Promise((resolve) => resolve('comma'));
11+
}
12+
13+
```
14+
15+
# Diagnostics
16+
```
17+
19_invalid.ts:4:2 lint/nursery/noFloatingPromises ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
18+
19+
i A "floating" Promise was found, meaning it is not properly handled and could lead to ignored errors or unexpected behavior.
20+
21+
2 │ function pattern19() {
22+
3let _x = 5;
23+
> 4_x++, new Promise((resolve) => resolve('comma'));
24+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
25+
5}
26+
6 │
27+
28+
i This happens when a Promise is not awaited, lacks a `.catch` or `.then` rejection handler, or is not explicitly ignored using the `void` operator.
29+
30+
31+
```
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
/* should not generate diagnostics */
2+
3+
// Promise in comma operator
4+
function pattern19() {
5+
let _x = 5;
6+
_x++ ?? new Promise((resolve) => resolve('comma'));
7+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
---
2+
source: crates/biome_js_analyze/tests/spec_tests.rs
3+
expression: 19_valid.ts
4+
---
5+
# Input
6+
```ts
7+
/* should not generate diagnostics */
8+
9+
// Promise in comma operator
10+
function pattern19() {
11+
let _x = 5;
12+
_x++ ?? new Promise((resolve) => resolve('comma'));
13+
}
14+
15+
```

crates/biome_js_type_info/src/local_inference.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -543,6 +543,12 @@ impl TypeData {
543543
.expression()
544544
.map(|expr| resolver.resolve_expression(scope_id, &expr).into_owned())
545545
.unwrap_or_default(),
546+
AnyJsExpression::JsPostUpdateExpression(_)
547+
| AnyJsExpression::JsPreUpdateExpression(_) => Self::number(),
548+
AnyJsExpression::JsSequenceExpression(expr) => expr
549+
.right()
550+
.map(|expr| resolver.resolve_expression(scope_id, &expr).into_owned())
551+
.unwrap_or_default(),
546552
AnyJsExpression::JsStaticMemberExpression(expr) => match (expr.object(), expr.member())
547553
{
548554
(Ok(object), Ok(member)) => text_from_any_js_name(member)

0 commit comments

Comments
 (0)