Skip to content

Commit

Permalink
Fix parsing of parenthesized functions in conditional expressions (#4…
Browse files Browse the repository at this point in the history
  • Loading branch information
jakebailey authored Nov 30, 2021
1 parent 0f3d0e0 commit cdf12f9
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 1 deletion.
3 changes: 2 additions & 1 deletion src/compiler/parser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4539,9 +4539,10 @@ namespace ts {
// - "(x,y)" is a comma expression parsed as a signature with two parameters.
// - "a ? (b): c" will have "(b):" parsed as a signature with a return type annotation.
// - "a ? (b): function() {}" will too, since function() is a valid JSDoc function type.
// - "a ? (b): (function() {})" as well, but inside of a parenthesized type.
//
// So we need just a bit of lookahead to ensure that it can only be a signature.
const hasJSDocFunctionType = type && isJSDocFunctionType(type);
const hasJSDocFunctionType = type && (isJSDocFunctionType(type) || isParenthesizedTypeNode(type) && isJSDocFunctionType(type.type));
if (!allowAmbiguity && token() !== SyntaxKind.EqualsGreaterThanToken && (hasJSDocFunctionType || token() !== SyntaxKind.OpenBraceToken)) {
// Returning undefined here will cause our caller to rewind to where we started from.
return undefined;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
//// [parserParenthesizedVariableAndParenthesizedFunctionInTernary.ts]
let a: any;
const c = true ? (a) : (function() {});


//// [parserParenthesizedVariableAndParenthesizedFunctionInTernary.js]
var a;
var c = true ? (a) : (function () { });
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
=== tests/cases/conformance/parser/ecmascript5/parserParenthesizedVariableAndParenthesizedFunctionInTernary.ts ===
let a: any;
>a : Symbol(a, Decl(parserParenthesizedVariableAndParenthesizedFunctionInTernary.ts, 0, 3))

const c = true ? (a) : (function() {});
>c : Symbol(c, Decl(parserParenthesizedVariableAndParenthesizedFunctionInTernary.ts, 1, 5))
>a : Symbol(a, Decl(parserParenthesizedVariableAndParenthesizedFunctionInTernary.ts, 0, 3))

Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
=== tests/cases/conformance/parser/ecmascript5/parserParenthesizedVariableAndParenthesizedFunctionInTernary.ts ===
let a: any;
>a : any

const c = true ? (a) : (function() {});
>c : any
>true ? (a) : (function() {}) : any
>true : true
>(a) : any
>a : any
>(function() {}) : () => void
>function() {} : () => void

Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
let a: any;
const c = true ? (a) : (function() {});

0 comments on commit cdf12f9

Please sign in to comment.