Skip to content

Commit 38132e0

Browse files
authored
fix(es/parser): Allow non-prop operand in delete (#10733)
Expressions like `delete 1` and `delete []` should not trigger errors in a JavaScript/TypeScript parser, as these represent semantic errors rather than syntax errors.
1 parent 04ef20a commit 38132e0

33 files changed

+164
-2176
lines changed

.changeset/friendly-tigers-pull.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
swc_core: patch
3+
swc_ecma_lexer: patch
4+
swc_ecma_parser: patch
5+
---
6+
7+
fix(es/parser): allow non-prop operand in delete
Lines changed: 15 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,16 @@
11
//// [await_unaryExpression_es2017_1.ts]
2-
//! x The operand of a delete operator must be a property reference.
3-
//! ,-[7:1]
4-
//! 4 | }
5-
//! 5 |
6-
//! 6 | async function bar1() {
7-
//! 7 | delete await 42; // OK
8-
//! : ^^^^^^^^
9-
//! 8 | }
10-
//! 9 |
11-
//! 10 | async function bar2() {
12-
//! `----
13-
//! x The operand of a delete operator must be a property reference.
14-
//! ,-[11:1]
15-
//! 8 | }
16-
//! 9 |
17-
//! 10 | async function bar2() {
18-
//! 11 | delete await 42; // OK
19-
//! : ^^^^^^^^
20-
//! 12 | }
21-
//! 13 |
22-
//! 14 | async function bar3() {
23-
//! `----
2+
async function bar() {
3+
!await 42; // OK
4+
}
5+
async function bar1() {
6+
delete await 42; // OK
7+
}
8+
async function bar2() {
9+
delete await 42; // OK
10+
}
11+
async function bar3() {
12+
void await 42;
13+
}
14+
async function bar4() {
15+
+await 42;
16+
}
Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1 @@
11
//// [await_unaryExpression_es2017_1.ts]
2-
//! x The operand of a delete operator must be a property reference.
3-
//! ,-[7:1]
4-
//! 4 | }
5-
//! 5 |
6-
//! 6 | async function bar1() {
7-
//! 7 | delete await 42; // OK
8-
//! : ^^^^^^^^
9-
//! 8 | }
10-
//! 9 |
11-
//! 10 | async function bar2() {
12-
//! `----
13-
//! x The operand of a delete operator must be a property reference.
14-
//! ,-[11:1]
15-
//! 8 | }
16-
//! 9 |
17-
//! 10 | async function bar2() {
18-
//! 11 | delete await 42; // OK
19-
//! : ^^^^^^^^
20-
//! 12 | }
21-
//! 13 |
22-
//! 14 | async function bar3() {
23-
//! `----
Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,10 @@
11
//// [await_unaryExpression_es2017_2.ts]
2-
//! x The operand of a delete operator must be a property reference.
3-
//! ,-[3:1]
4-
//! 1 |
5-
//! 2 | async function bar1() {
6-
//! 3 | delete await 42;
7-
//! : ^^^^^^^^
8-
//! 4 | }
9-
//! 5 |
10-
//! 6 | async function bar2() {
11-
//! `----
12-
//! x The operand of a delete operator must be a property reference.
13-
//! ,-[7:1]
14-
//! 4 | }
15-
//! 5 |
16-
//! 6 | async function bar2() {
17-
//! 7 | delete await 42;
18-
//! : ^^^^^^^^
19-
//! 8 | }
20-
//! 9 |
21-
//! 10 | async function bar3() {
22-
//! `----
2+
async function bar1() {
3+
delete await 42;
4+
}
5+
async function bar2() {
6+
delete await 42;
7+
}
8+
async function bar3() {
9+
void await 42;
10+
}
Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1 @@
11
//// [await_unaryExpression_es2017_2.ts]
2-
//! x The operand of a delete operator must be a property reference.
3-
//! ,-[3:1]
4-
//! 1 |
5-
//! 2 | async function bar1() {
6-
//! 3 | delete await 42;
7-
//! : ^^^^^^^^
8-
//! 4 | }
9-
//! 5 |
10-
//! 6 | async function bar2() {
11-
//! `----
12-
//! x The operand of a delete operator must be a property reference.
13-
//! ,-[7:1]
14-
//! 4 | }
15-
//! 5 |
16-
//! 6 | async function bar2() {
17-
//! 7 | delete await 42;
18-
//! : ^^^^^^^^
19-
//! 8 | }
20-
//! 9 |
21-
//! 10 | async function bar3() {
22-
//! `----
Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,27 @@
11
//// [await_unaryExpression_es6_1.ts]
2-
//! x The operand of a delete operator must be a property reference.
3-
//! ,-[7:1]
4-
//! 4 | }
5-
//! 5 |
6-
//! 6 | async function bar1() {
7-
//! 7 | delete await 42; // OK
8-
//! : ^^^^^^^^
9-
//! 8 | }
10-
//! 9 |
11-
//! 10 | async function bar2() {
12-
//! `----
13-
//! x The operand of a delete operator must be a property reference.
14-
//! ,-[11:1]
15-
//! 8 | }
16-
//! 9 |
17-
//! 10 | async function bar2() {
18-
//! 11 | delete await 42; // OK
19-
//! : ^^^^^^^^
20-
//! 12 | }
21-
//! 13 |
22-
//! 14 | async function bar3() {
23-
//! `----
2+
import { _ as _async_to_generator } from "@swc/helpers/_/_async_to_generator";
3+
function bar() {
4+
return _async_to_generator(function*() {
5+
!(yield 42); // OK
6+
})();
7+
}
8+
function bar1() {
9+
return _async_to_generator(function*() {
10+
delete (yield 42); // OK
11+
})();
12+
}
13+
function bar2() {
14+
return _async_to_generator(function*() {
15+
delete (yield 42); // OK
16+
})();
17+
}
18+
function bar3() {
19+
return _async_to_generator(function*() {
20+
void (yield 42);
21+
})();
22+
}
23+
function bar4() {
24+
return _async_to_generator(function*() {
25+
+(yield 42);
26+
})();
27+
}
Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,2 @@
11
//// [await_unaryExpression_es6_1.ts]
2-
//! x The operand of a delete operator must be a property reference.
3-
//! ,-[7:1]
4-
//! 4 | }
5-
//! 5 |
6-
//! 6 | async function bar1() {
7-
//! 7 | delete await 42; // OK
8-
//! : ^^^^^^^^
9-
//! 8 | }
10-
//! 9 |
11-
//! 10 | async function bar2() {
12-
//! `----
13-
//! x The operand of a delete operator must be a property reference.
14-
//! ,-[11:1]
15-
//! 8 | }
16-
//! 9 |
17-
//! 10 | async function bar2() {
18-
//! 11 | delete await 42; // OK
19-
//! : ^^^^^^^^
20-
//! 12 | }
21-
//! 13 |
22-
//! 14 | async function bar3() {
23-
//! `----
2+
import "@swc/helpers/_/_async_to_generator";
Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,17 @@
11
//// [await_unaryExpression_es6_2.ts]
2-
//! x The operand of a delete operator must be a property reference.
3-
//! ,-[3:1]
4-
//! 1 |
5-
//! 2 | async function bar1() {
6-
//! 3 | delete await 42;
7-
//! : ^^^^^^^^
8-
//! 4 | }
9-
//! 5 |
10-
//! 6 | async function bar2() {
11-
//! `----
12-
//! x The operand of a delete operator must be a property reference.
13-
//! ,-[7:1]
14-
//! 4 | }
15-
//! 5 |
16-
//! 6 | async function bar2() {
17-
//! 7 | delete await 42;
18-
//! : ^^^^^^^^
19-
//! 8 | }
20-
//! 9 |
21-
//! 10 | async function bar3() {
22-
//! `----
2+
import { _ as _async_to_generator } from "@swc/helpers/_/_async_to_generator";
3+
function bar1() {
4+
return _async_to_generator(function*() {
5+
delete (yield 42);
6+
})();
7+
}
8+
function bar2() {
9+
return _async_to_generator(function*() {
10+
delete (yield 42);
11+
})();
12+
}
13+
function bar3() {
14+
return _async_to_generator(function*() {
15+
void (yield 42);
16+
})();
17+
}
Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,2 @@
11
//// [await_unaryExpression_es6_2.ts]
2-
//! x The operand of a delete operator must be a property reference.
3-
//! ,-[3:1]
4-
//! 1 |
5-
//! 2 | async function bar1() {
6-
//! 3 | delete await 42;
7-
//! : ^^^^^^^^
8-
//! 4 | }
9-
//! 5 |
10-
//! 6 | async function bar2() {
11-
//! `----
12-
//! x The operand of a delete operator must be a property reference.
13-
//! ,-[7:1]
14-
//! 4 | }
15-
//! 5 |
16-
//! 6 | async function bar2() {
17-
//! 7 | delete await 42;
18-
//! : ^^^^^^^^
19-
//! 8 | }
20-
//! 9 |
21-
//! 10 | async function bar3() {
22-
//! `----
2+
import "@swc/helpers/_/_async_to_generator";

crates/swc/tests/tsc-references/controlFlowDeleteOperator.1.normal.js

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,3 @@
99
//! 16 | x;
1010
//! 17 | }
1111
//! `----
12-
//! x The operand of a delete operator must be a property reference.
13-
//! ,-[15:1]
14-
//! 12 | x.a;
15-
//! 13 | x.b;
16-
//! 14 | x;
17-
//! 15 | delete x; // No effect
18-
//! : ^
19-
//! 16 | x;
20-
//! 17 | }
21-
//! `----

0 commit comments

Comments
 (0)