Skip to content

Commit 1663184

Browse files
committed
fix(parser): allow conditional types in function type parameters (#18886)
## Summary - Allow conditional types inside function type parameter annotations, even when the function type itself is being parsed in a `DisallowConditionalTypes` context - Wrap `parse_formal_parameters` in `parse_function_or_constructor_type` with `context_remove(DisallowConditionalTypes, ...)` This fixes parsing of nested conditional types like: ```typescript type Equals = A extends (x: B extends C ? D : E) => 0 ? F : G; ``` 🤖 Generated with [Claude Code](https://claude.com/claude-code)
1 parent a7b360a commit 1663184

File tree

3 files changed

+8
-15
lines changed

3 files changed

+8
-15
lines changed

crates/oxc_parser/src/ts/types.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,9 @@ impl<'a> ParserImpl<'a> {
4747
let r#abstract = self.eat(Kind::Abstract);
4848
let is_constructor_type = self.eat(Kind::New);
4949
let type_parameters = self.parse_ts_type_parameters();
50-
let (this_param, params) =
51-
self.parse_formal_parameters(FunctionKind::Declaration, FormalParameterKind::Signature);
50+
let (this_param, params) = self.context_remove(Context::DisallowConditionalTypes, |p| {
51+
p.parse_formal_parameters(FunctionKind::Declaration, FormalParameterKind::Signature)
52+
});
5253
let return_type = {
5354
let return_type_span = self.start_span();
5455
let return_type = self.parse_return_type();

tasks/coverage/snapshots/parser_babel.snap

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
commit: 92c052dc
22

33
parser_babel Summary:
4-
AST Parsed : 2223/2224 (99.96%)
5-
Positive Passed: 2210/2224 (99.37%)
4+
AST Parsed : 2224/2224 (100.00%)
5+
Positive Passed: 2211/2224 (99.42%)
66
Negative Passed: 1656/1689 (98.05%)
77
Expect Syntax Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/es2026/explicit-resource-management/invalid-for-using-of-no-initializer/input.js
88

@@ -304,16 +304,6 @@ Expect to Parse: tasks/coverage/babel/packages/babel-parser/test/fixtures/typesc
304304
· ──
305305
╰────
306306

307-
Panicked: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/regression/nested-extends-in-arrow-type-param/input.ts
308-
309-
× Expected `,` or `)` but found `extends`
310-
╭─[babel/packages/babel-parser/test/fixtures/typescript/regression/nested-extends-in-arrow-type-param/input.ts:1:31]
311-
1 │ type Equals = A extends (x: B extends C ? D : E) => 0 ? F : G;
312-
· ┬ ───┬───
313-
· │ ╰── `,` or `)` expected
314-
· ╰── Opened here
315-
╰────
316-
317307
Expect to Parse: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/types/const-type-parameters/input.ts
318308

319309
× Identifier `method` has already been declared

tasks/coverage/snapshots/semantic_babel.snap

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -739,7 +739,9 @@ after transform: SymbolId(1): SymbolFlags(RegularEnum)
739739
rebuilt : SymbolId(0): SymbolFlags(BlockScopedVariable)
740740

741741
semantic Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/regression/nested-extends-in-arrow-type-param/input.ts
742-
Expected `,` or `)` but found `extends`
742+
Unresolved references mismatch:
743+
after transform: ["A", "B", "C", "D", "E", "F", "G"]
744+
rebuilt : []
743745

744746
semantic Error: tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/regression/nested-extends-in-arrow-type-return/input.ts
745747
Unresolved references mismatch:

0 commit comments

Comments
 (0)