Repository navigation
Commit 141a320
authored
fix(es/parser): Retry ambiguous Program parsing (#12142)
**Description:**
`parse_program` could classify a source as a Module too early when a
top-level `await` token also had a valid Script interpretation.
For example, in the following code, `await` should be parsed as an
identifier and the second import argument should remain a normal call
expression:
```js
function await() {}
import("./fixture.js", await(undefined));
```
This PR updates unambiguous Program parsing to:
- initially parse using the Module `Await` grammar;
- retry as Script when `await` has a distinct valid Script
interpretation and no definitive module syntax was found;
- retain the Module result when imports, exports, or unambiguous
module-only syntax determine the parse goal;
- restore lexer diagnostics and token state when retrying;
- defer publishing comments until a parse result is selected, preventing
duplicated comments;
- preserve the grammar boundaries of functions, parameters, class
fields, and static blocks.
The regular lexer/parser checkpoint remains unchanged. Non-ambiguous
valid programs still use a single parsing pass; reparsing is limited to
ambiguous or failed probes.
Regression coverage includes:
- ambiguous `await` unary, binary, call, member, assignment, arrow, and
`for...of` forms;
- TypeScript `as` and `satisfies` expressions;
- nested function and class-field grammar contexts;
- comment preservation across retries;
- parser fixtures and resolver output for the dynamic-import case.
**Related issue (if exists):**
N/A1 parent ed74223 commit 141a320
24 files changed
Lines changed: 855 additions & 73 deletions
File tree
- .changeset
- crates
- swc_ecma_minifier/tests
- fixture/simple/await-arrow/1
- terser/compress
- arrow/async_identifiers
- async/async_identifiers
- swc_ecma_parser
- src
- lexer
- parser
- tests/js
- explicit-resource-management/valid-using-as-identifier-for-await-of
- parse-unambiguous/await-call
- swc_ecma_transforms_base/tests/resolver/parse-unambiguous-await-call
- swc_ecma_transforms_proposal/tests/explicit-resource-management/transform-sync/for-await-head
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | | - | |
| 1 | + | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | | - | |
2 | | - | |
3 | | - | |
4 | | - | |
5 | | - | |
6 | | - | |
7 | | - | |
8 | | - | |
| 1 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
4 | | - | |
| 4 | + | |
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
8 | | - | |
| 8 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | | - | |
2 | | - | |
3 | | - | |
4 | | - | |
5 | | - | |
6 | | - | |
7 | | - | |
8 | | - | |
| 1 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
4 | | - | |
| 4 | + | |
5 | 5 | | |
6 | 6 | | |
7 | 7 | | |
8 | | - | |
| 8 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
133 | 133 | | |
134 | 134 | | |
135 | 135 | | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
136 | 148 | | |
137 | 149 | | |
138 | 150 | | |
139 | 151 | | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
140 | 160 | | |
141 | 161 | | |
142 | 162 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
208 | 208 | | |
209 | 209 | | |
210 | 210 | | |
| 211 | + | |
| 212 | + | |
211 | 213 | | |
212 | 214 | | |
213 | 215 | | |
| |||
312 | 314 | | |
313 | 315 | | |
314 | 316 | | |
| 317 | + | |
315 | 318 | | |
316 | 319 | | |
317 | 320 | | |
| |||
1337 | 1340 | | |
1338 | 1341 | | |
1339 | 1342 | | |
| 1343 | + | |
1340 | 1344 | | |
1341 | 1345 | | |
1342 | 1346 | | |
| |||
1350 | 1354 | | |
1351 | 1355 | | |
1352 | 1356 | | |
| 1357 | + | |
| 1358 | + | |
| 1359 | + | |
| 1360 | + | |
1353 | 1361 | | |
1354 | 1362 | | |
1355 | 1363 | | |
| |||
1364 | 1372 | | |
1365 | 1373 | | |
1366 | 1374 | | |
| 1375 | + | |
| 1376 | + | |
| 1377 | + | |
| 1378 | + | |
| 1379 | + | |
| 1380 | + | |
| 1381 | + | |
| 1382 | + | |
| 1383 | + | |
| 1384 | + | |
| 1385 | + | |
| 1386 | + | |
| 1387 | + | |
| 1388 | + | |
| 1389 | + | |
| 1390 | + | |
| 1391 | + | |
| 1392 | + | |
| 1393 | + | |
| 1394 | + | |
| 1395 | + | |
| 1396 | + | |
1367 | 1397 | | |
1368 | 1398 | | |
1369 | 1399 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
144 | 144 | | |
145 | 145 | | |
146 | 146 | | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
147 | 163 | | |
148 | 164 | | |
149 | 165 | | |
150 | 166 | | |
151 | 167 | | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
152 | 178 | | |
153 | 179 | | |
154 | 180 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
375 | 375 | | |
376 | 376 | | |
377 | 377 | | |
378 | | - | |
379 | | - | |
380 | | - | |
381 | | - | |
382 | | - | |
383 | | - | |
384 | | - | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
385 | 387 | | |
386 | 388 | | |
387 | 389 | | |
| |||
888 | 890 | | |
889 | 891 | | |
890 | 892 | | |
891 | | - | |
892 | | - | |
893 | | - | |
894 | | - | |
895 | | - | |
896 | | - | |
| 893 | + | |
| 894 | + | |
| 895 | + | |
| 896 | + | |
| 897 | + | |
| 898 | + | |
| 899 | + | |
| 900 | + | |
| 901 | + | |
| 902 | + | |
| 903 | + | |
| 904 | + | |
897 | 905 | | |
898 | 906 | | |
899 | 907 | | |
| |||
0 commit comments