From 562eb0ae15b24f5f88d785d865df30f1da39afb1 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Wed, 20 Apr 2022 11:03:42 -0700 Subject: [PATCH 1/5] Add test case --- .../parserArrowFunctionExpression15.errors.txt | 14 ++++++++++++++ .../reference/parserArrowFunctionExpression15.js | 7 +++++++ .../parserArrowFunctionExpression15.symbols | 4 ++++ .../parserArrowFunctionExpression15.types | 11 +++++++++++ .../parserArrowFunctionExpression16.errors.txt | 14 ++++++++++++++ .../reference/parserArrowFunctionExpression16.js | 7 +++++++ .../parserArrowFunctionExpression16.symbols | 4 ++++ .../parserArrowFunctionExpression16.types | 14 ++++++++++++++ .../parserArrowFunctionExpression15.ts | 1 + .../parserArrowFunctionExpression16.ts | 1 + 10 files changed, 77 insertions(+) create mode 100644 tests/baselines/reference/parserArrowFunctionExpression15.errors.txt create mode 100644 tests/baselines/reference/parserArrowFunctionExpression15.js create mode 100644 tests/baselines/reference/parserArrowFunctionExpression15.symbols create mode 100644 tests/baselines/reference/parserArrowFunctionExpression15.types create mode 100644 tests/baselines/reference/parserArrowFunctionExpression16.errors.txt create mode 100644 tests/baselines/reference/parserArrowFunctionExpression16.js create mode 100644 tests/baselines/reference/parserArrowFunctionExpression16.symbols create mode 100644 tests/baselines/reference/parserArrowFunctionExpression16.types create mode 100644 tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression15.ts create mode 100644 tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression16.ts diff --git a/tests/baselines/reference/parserArrowFunctionExpression15.errors.txt b/tests/baselines/reference/parserArrowFunctionExpression15.errors.txt new file mode 100644 index 0000000000000..60def8ca15fa6 --- /dev/null +++ b/tests/baselines/reference/parserArrowFunctionExpression15.errors.txt @@ -0,0 +1,14 @@ +tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression15.ts(1,10): error TS2304: Cannot find name 'param'. +tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression15.ts(1,28): error TS2304: Cannot find name 'param'. +tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression15.ts(1,34): error TS1005: ';' expected. + + +==== tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression15.ts (3 errors) ==== + false ? (param): string => param : null + ~~~~~ +!!! error TS2304: Cannot find name 'param'. + ~~~~~ +!!! error TS2304: Cannot find name 'param'. + ~ +!!! error TS1005: ';' expected. + \ No newline at end of file diff --git a/tests/baselines/reference/parserArrowFunctionExpression15.js b/tests/baselines/reference/parserArrowFunctionExpression15.js new file mode 100644 index 0000000000000..047b09c6ddec0 --- /dev/null +++ b/tests/baselines/reference/parserArrowFunctionExpression15.js @@ -0,0 +1,7 @@ +//// [parserArrowFunctionExpression15.ts] +false ? (param): string => param : null + + +//// [parserArrowFunctionExpression15.js] +false ? (param) : function (string) { return param; }; +null; diff --git a/tests/baselines/reference/parserArrowFunctionExpression15.symbols b/tests/baselines/reference/parserArrowFunctionExpression15.symbols new file mode 100644 index 0000000000000..7750b8d43be97 --- /dev/null +++ b/tests/baselines/reference/parserArrowFunctionExpression15.symbols @@ -0,0 +1,4 @@ +=== tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression15.ts === +false ? (param): string => param : null +>string : Symbol(string, Decl(parserArrowFunctionExpression15.ts, 0, 16)) + diff --git a/tests/baselines/reference/parserArrowFunctionExpression15.types b/tests/baselines/reference/parserArrowFunctionExpression15.types new file mode 100644 index 0000000000000..ec808c729eece --- /dev/null +++ b/tests/baselines/reference/parserArrowFunctionExpression15.types @@ -0,0 +1,11 @@ +=== tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression15.ts === +false ? (param): string => param : null +>false ? (param): string => param : any +>false : false +>(param) : any +>param : any +>string => param : (string: any) => any +>string : any +>param : any +>null : null + diff --git a/tests/baselines/reference/parserArrowFunctionExpression16.errors.txt b/tests/baselines/reference/parserArrowFunctionExpression16.errors.txt new file mode 100644 index 0000000000000..740144391e298 --- /dev/null +++ b/tests/baselines/reference/parserArrowFunctionExpression16.errors.txt @@ -0,0 +1,14 @@ +tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression16.ts(1,17): error TS2304: Cannot find name 'param'. +tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression16.ts(1,35): error TS2304: Cannot find name 'param'. +tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression16.ts(1,48): error TS1005: ';' expected. + + +==== tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression16.ts (3 errors) ==== + true ? false ? (param): string => param : null : null + ~~~~~ +!!! error TS2304: Cannot find name 'param'. + ~~~~~ +!!! error TS2304: Cannot find name 'param'. + ~ +!!! error TS1005: ';' expected. + \ No newline at end of file diff --git a/tests/baselines/reference/parserArrowFunctionExpression16.js b/tests/baselines/reference/parserArrowFunctionExpression16.js new file mode 100644 index 0000000000000..a2b2fff3aad85 --- /dev/null +++ b/tests/baselines/reference/parserArrowFunctionExpression16.js @@ -0,0 +1,7 @@ +//// [parserArrowFunctionExpression16.ts] +true ? false ? (param): string => param : null : null + + +//// [parserArrowFunctionExpression16.js] +true ? false ? (param) : function (string) { return param; } : null; +null; diff --git a/tests/baselines/reference/parserArrowFunctionExpression16.symbols b/tests/baselines/reference/parserArrowFunctionExpression16.symbols new file mode 100644 index 0000000000000..684b74408ccd5 --- /dev/null +++ b/tests/baselines/reference/parserArrowFunctionExpression16.symbols @@ -0,0 +1,4 @@ +=== tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression16.ts === +true ? false ? (param): string => param : null : null +>string : Symbol(string, Decl(parserArrowFunctionExpression16.ts, 0, 23)) + diff --git a/tests/baselines/reference/parserArrowFunctionExpression16.types b/tests/baselines/reference/parserArrowFunctionExpression16.types new file mode 100644 index 0000000000000..dbe5cc2e81733 --- /dev/null +++ b/tests/baselines/reference/parserArrowFunctionExpression16.types @@ -0,0 +1,14 @@ +=== tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression16.ts === +true ? false ? (param): string => param : null : null +>true ? false ? (param): string => param : null : any +>true : true +>false ? (param): string => param : any +>false : false +>(param) : any +>param : any +>string => param : (string: any) => any +>string : any +>param : any +>null : null +>null : null + diff --git a/tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression15.ts b/tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression15.ts new file mode 100644 index 0000000000000..3348d24bfebe4 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression15.ts @@ -0,0 +1 @@ +false ? (param): string => param : null diff --git a/tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression16.ts b/tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression16.ts new file mode 100644 index 0000000000000..9a19bfdb6cfc1 --- /dev/null +++ b/tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression16.ts @@ -0,0 +1 @@ +true ? false ? (param): string => param : null : null From d4d606d8e554a4546e0a6836e84408c3705937ac Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Wed, 20 Apr 2022 13:57:09 -0700 Subject: [PATCH 2/5] Allow return type in conditional if body is followed by a colon --- src/compiler/parser.ts | 16 +++++++++++++--- .../parserArrowFunctionExpression10.errors.txt | 11 ++++------- .../reference/parserArrowFunctionExpression10.js | 3 +-- .../parserArrowFunctionExpression10.symbols | 3 ++- .../parserArrowFunctionExpression10.types | 6 ++---- .../parserArrowFunctionExpression12.errors.txt | 11 ++++++++++- .../reference/parserArrowFunctionExpression12.js | 4 +++- .../parserArrowFunctionExpression12.symbols | 1 - .../parserArrowFunctionExpression12.types | 5 +++-- .../parserArrowFunctionExpression15.errors.txt | 14 -------------- .../reference/parserArrowFunctionExpression15.js | 3 +-- .../parserArrowFunctionExpression15.symbols | 3 ++- .../parserArrowFunctionExpression15.types | 6 ++---- .../parserArrowFunctionExpression16.errors.txt | 14 -------------- .../reference/parserArrowFunctionExpression16.js | 3 +-- .../parserArrowFunctionExpression16.symbols | 3 ++- .../parserArrowFunctionExpression16.types | 8 +++----- 17 files changed, 49 insertions(+), 65 deletions(-) delete mode 100644 tests/baselines/reference/parserArrowFunctionExpression15.errors.txt delete mode 100644 tests/baselines/reference/parserArrowFunctionExpression16.errors.txt diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index e57a3fa98f390..baaef1c654f9d 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -4709,9 +4709,9 @@ namespace ts { // a() ? (b: number, c?: string): void => d() : e // is determined by isParenthesizedArrowFunctionExpression to unambiguously // be an arrow expression, so we allow a return type. - if (disallowReturnTypeInArrowFunction && token() === SyntaxKind.ColonToken) { - return undefined; - } + // if (disallowReturnTypeInArrowFunction && token() === SyntaxKind.ColonToken) { + // return undefined; + // } const type = parseReturnType(SyntaxKind.ColonToken, /*isType*/ false); if (type && !allowAmbiguity && typeHasArrowFunctionBlockingParseError(type)) { @@ -4748,6 +4748,16 @@ namespace ts { ? parseArrowFunctionExpressionBody(some(modifiers, isAsyncModifier), disallowReturnTypeInArrowFunction) : parseIdentifier(); + if (disallowReturnTypeInArrowFunction) { + // If we are currently parsing a conditional expression, and were able to parse + // a return type before the body, and there's another colon after the body, allow + // parsing of this arrow function so that the following colon terminates the + // true side of the conditional. + if (!(type && token() === SyntaxKind.ColonToken)) { + return undefined; + } + } + const node = factory.createArrowFunction(modifiers, typeParameters, parameters, type, equalsGreaterThanToken, body); return withJSDoc(finishNode(node, pos), hasJSDoc); } diff --git a/tests/baselines/reference/parserArrowFunctionExpression10.errors.txt b/tests/baselines/reference/parserArrowFunctionExpression10.errors.txt index 43cf9de267b85..0ee29b021a1ef 100644 --- a/tests/baselines/reference/parserArrowFunctionExpression10.errors.txt +++ b/tests/baselines/reference/parserArrowFunctionExpression10.errors.txt @@ -1,20 +1,17 @@ tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression10.ts(1,1): error TS2304: Cannot find name 'a'. -tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression10.ts(1,6): error TS2304: Cannot find name 'b'. +tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression10.ts(1,11): error TS2304: Cannot find name 'c'. tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression10.ts(1,17): error TS2304: Cannot find name 'd'. -tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression10.ts(1,20): error TS1005: ';' expected. tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression10.ts(1,27): error TS2304: Cannot find name 'f'. -==== tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression10.ts (5 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression10.ts (4 errors) ==== a ? (b) : c => (d) : e => f ~ !!! error TS2304: Cannot find name 'a'. - ~ -!!! error TS2304: Cannot find name 'b'. + ~ +!!! error TS2304: Cannot find name 'c'. ~ !!! error TS2304: Cannot find name 'd'. - ~ -!!! error TS1005: ';' expected. ~ !!! error TS2304: Cannot find name 'f'. \ No newline at end of file diff --git a/tests/baselines/reference/parserArrowFunctionExpression10.js b/tests/baselines/reference/parserArrowFunctionExpression10.js index 86e1e61bb0716..7681332637b4e 100644 --- a/tests/baselines/reference/parserArrowFunctionExpression10.js +++ b/tests/baselines/reference/parserArrowFunctionExpression10.js @@ -3,5 +3,4 @@ a ? (b) : c => (d) : e => f //// [parserArrowFunctionExpression10.js] -a ? (b) : function (c) { return (d); }; -(function (e) { return f; }); +a ? function (b) { return (d); } : function (e) { return f; }; diff --git a/tests/baselines/reference/parserArrowFunctionExpression10.symbols b/tests/baselines/reference/parserArrowFunctionExpression10.symbols index f30f0b3e3ca49..df391a0be345d 100644 --- a/tests/baselines/reference/parserArrowFunctionExpression10.symbols +++ b/tests/baselines/reference/parserArrowFunctionExpression10.symbols @@ -1,5 +1,6 @@ === tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression10.ts === a ? (b) : c => (d) : e => f ->c : Symbol(c, Decl(parserArrowFunctionExpression10.ts, 0, 9)) +>b : Symbol(b, Decl(parserArrowFunctionExpression10.ts, 0, 5)) +>c : Symbol(c) >e : Symbol(e, Decl(parserArrowFunctionExpression10.ts, 0, 20)) diff --git a/tests/baselines/reference/parserArrowFunctionExpression10.types b/tests/baselines/reference/parserArrowFunctionExpression10.types index 8ec7d69c29559..e4149fe4cbb5c 100644 --- a/tests/baselines/reference/parserArrowFunctionExpression10.types +++ b/tests/baselines/reference/parserArrowFunctionExpression10.types @@ -1,11 +1,9 @@ === tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression10.ts === a ? (b) : c => (d) : e => f ->a ? (b) : c => (d) : any +>a ? (b) : c => (d) : e => f : (b: any) => c >a : any ->(b) : any +>(b) : c => (d) : (b: any) => c >b : any ->c => (d) : (c: any) => any ->c : any >(d) : any >d : any >e => f : (e: any) => any diff --git a/tests/baselines/reference/parserArrowFunctionExpression12.errors.txt b/tests/baselines/reference/parserArrowFunctionExpression12.errors.txt index c6cfd8f9ce855..bc6625a0e5a99 100644 --- a/tests/baselines/reference/parserArrowFunctionExpression12.errors.txt +++ b/tests/baselines/reference/parserArrowFunctionExpression12.errors.txt @@ -1,14 +1,23 @@ tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression12.ts(1,1): error TS2304: Cannot find name 'a'. +tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression12.ts(1,6): error TS2304: Cannot find name 'b'. +tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression12.ts(1,9): error TS1005: ':' expected. tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression12.ts(1,13): error TS2304: Cannot find name 'c'. +tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression12.ts(1,15): error TS1005: ';' expected. tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression12.ts(1,22): error TS2304: Cannot find name 'e'. -==== tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression12.ts (3 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression12.ts (6 errors) ==== a ? (b) => (c): d => e ~ !!! error TS2304: Cannot find name 'a'. + ~ +!!! error TS2304: Cannot find name 'b'. + ~~ +!!! error TS1005: ':' expected. ~ !!! error TS2304: Cannot find name 'c'. + ~ +!!! error TS1005: ';' expected. ~ !!! error TS2304: Cannot find name 'e'. \ No newline at end of file diff --git a/tests/baselines/reference/parserArrowFunctionExpression12.js b/tests/baselines/reference/parserArrowFunctionExpression12.js index dbee37a2660cb..416b1aa1a6270 100644 --- a/tests/baselines/reference/parserArrowFunctionExpression12.js +++ b/tests/baselines/reference/parserArrowFunctionExpression12.js @@ -3,4 +3,6 @@ a ? (b) => (c): d => e //// [parserArrowFunctionExpression12.js] -a ? function (b) { return (c); } : function (d) { return e; }; +a ? (b) : ; +(c); +(function (d) { return e; }); diff --git a/tests/baselines/reference/parserArrowFunctionExpression12.symbols b/tests/baselines/reference/parserArrowFunctionExpression12.symbols index 3a67717232041..c72b2d870c8e5 100644 --- a/tests/baselines/reference/parserArrowFunctionExpression12.symbols +++ b/tests/baselines/reference/parserArrowFunctionExpression12.symbols @@ -1,5 +1,4 @@ === tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression12.ts === a ? (b) => (c): d => e ->b : Symbol(b, Decl(parserArrowFunctionExpression12.ts, 0, 5)) >d : Symbol(d, Decl(parserArrowFunctionExpression12.ts, 0, 15)) diff --git a/tests/baselines/reference/parserArrowFunctionExpression12.types b/tests/baselines/reference/parserArrowFunctionExpression12.types index b833ae305a8b1..8ebbf59b7a0a5 100644 --- a/tests/baselines/reference/parserArrowFunctionExpression12.types +++ b/tests/baselines/reference/parserArrowFunctionExpression12.types @@ -1,9 +1,10 @@ === tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression12.ts === a ? (b) => (c): d => e ->a ? (b) => (c): d => e : (b: any) => any +>a ? (b) : any >a : any ->(b) => (c) : (b: any) => any +>(b) : any >b : any +> : any >(c) : any >c : any >d => e : (d: any) => any diff --git a/tests/baselines/reference/parserArrowFunctionExpression15.errors.txt b/tests/baselines/reference/parserArrowFunctionExpression15.errors.txt deleted file mode 100644 index 60def8ca15fa6..0000000000000 --- a/tests/baselines/reference/parserArrowFunctionExpression15.errors.txt +++ /dev/null @@ -1,14 +0,0 @@ -tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression15.ts(1,10): error TS2304: Cannot find name 'param'. -tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression15.ts(1,28): error TS2304: Cannot find name 'param'. -tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression15.ts(1,34): error TS1005: ';' expected. - - -==== tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression15.ts (3 errors) ==== - false ? (param): string => param : null - ~~~~~ -!!! error TS2304: Cannot find name 'param'. - ~~~~~ -!!! error TS2304: Cannot find name 'param'. - ~ -!!! error TS1005: ';' expected. - \ No newline at end of file diff --git a/tests/baselines/reference/parserArrowFunctionExpression15.js b/tests/baselines/reference/parserArrowFunctionExpression15.js index 047b09c6ddec0..a18efc84f0975 100644 --- a/tests/baselines/reference/parserArrowFunctionExpression15.js +++ b/tests/baselines/reference/parserArrowFunctionExpression15.js @@ -3,5 +3,4 @@ false ? (param): string => param : null //// [parserArrowFunctionExpression15.js] -false ? (param) : function (string) { return param; }; -null; +false ? function (param) { return param; } : null; diff --git a/tests/baselines/reference/parserArrowFunctionExpression15.symbols b/tests/baselines/reference/parserArrowFunctionExpression15.symbols index 7750b8d43be97..7cb354c7dc912 100644 --- a/tests/baselines/reference/parserArrowFunctionExpression15.symbols +++ b/tests/baselines/reference/parserArrowFunctionExpression15.symbols @@ -1,4 +1,5 @@ === tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression15.ts === false ? (param): string => param : null ->string : Symbol(string, Decl(parserArrowFunctionExpression15.ts, 0, 16)) +>param : Symbol(param, Decl(parserArrowFunctionExpression15.ts, 0, 9)) +>param : Symbol(param, Decl(parserArrowFunctionExpression15.ts, 0, 9)) diff --git a/tests/baselines/reference/parserArrowFunctionExpression15.types b/tests/baselines/reference/parserArrowFunctionExpression15.types index ec808c729eece..4640763862112 100644 --- a/tests/baselines/reference/parserArrowFunctionExpression15.types +++ b/tests/baselines/reference/parserArrowFunctionExpression15.types @@ -1,11 +1,9 @@ === tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression15.ts === false ? (param): string => param : null ->false ? (param): string => param : any +>false ? (param): string => param : null : (param: any) => string >false : false ->(param) : any +>(param): string => param : (param: any) => string >param : any ->string => param : (string: any) => any ->string : any >param : any >null : null diff --git a/tests/baselines/reference/parserArrowFunctionExpression16.errors.txt b/tests/baselines/reference/parserArrowFunctionExpression16.errors.txt deleted file mode 100644 index 740144391e298..0000000000000 --- a/tests/baselines/reference/parserArrowFunctionExpression16.errors.txt +++ /dev/null @@ -1,14 +0,0 @@ -tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression16.ts(1,17): error TS2304: Cannot find name 'param'. -tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression16.ts(1,35): error TS2304: Cannot find name 'param'. -tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression16.ts(1,48): error TS1005: ';' expected. - - -==== tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression16.ts (3 errors) ==== - true ? false ? (param): string => param : null : null - ~~~~~ -!!! error TS2304: Cannot find name 'param'. - ~~~~~ -!!! error TS2304: Cannot find name 'param'. - ~ -!!! error TS1005: ';' expected. - \ No newline at end of file diff --git a/tests/baselines/reference/parserArrowFunctionExpression16.js b/tests/baselines/reference/parserArrowFunctionExpression16.js index a2b2fff3aad85..8d0404c91c853 100644 --- a/tests/baselines/reference/parserArrowFunctionExpression16.js +++ b/tests/baselines/reference/parserArrowFunctionExpression16.js @@ -3,5 +3,4 @@ true ? false ? (param): string => param : null : null //// [parserArrowFunctionExpression16.js] -true ? false ? (param) : function (string) { return param; } : null; -null; +true ? false ? function (param) { return param; } : null : null; diff --git a/tests/baselines/reference/parserArrowFunctionExpression16.symbols b/tests/baselines/reference/parserArrowFunctionExpression16.symbols index 684b74408ccd5..f2a4ff04df134 100644 --- a/tests/baselines/reference/parserArrowFunctionExpression16.symbols +++ b/tests/baselines/reference/parserArrowFunctionExpression16.symbols @@ -1,4 +1,5 @@ === tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression16.ts === true ? false ? (param): string => param : null : null ->string : Symbol(string, Decl(parserArrowFunctionExpression16.ts, 0, 23)) +>param : Symbol(param, Decl(parserArrowFunctionExpression16.ts, 0, 16)) +>param : Symbol(param, Decl(parserArrowFunctionExpression16.ts, 0, 16)) diff --git a/tests/baselines/reference/parserArrowFunctionExpression16.types b/tests/baselines/reference/parserArrowFunctionExpression16.types index dbe5cc2e81733..fffd623adac0d 100644 --- a/tests/baselines/reference/parserArrowFunctionExpression16.types +++ b/tests/baselines/reference/parserArrowFunctionExpression16.types @@ -1,13 +1,11 @@ === tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression16.ts === true ? false ? (param): string => param : null : null ->true ? false ? (param): string => param : null : any +>true ? false ? (param): string => param : null : null : (param: any) => string >true : true ->false ? (param): string => param : any +>false ? (param): string => param : null : (param: any) => string >false : false ->(param) : any +>(param): string => param : (param: any) => string >param : any ->string => param : (string: any) => any ->string : any >param : any >null : null >null : null From 61e987b41404a7f7179f70c79ef688d98069e997 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Wed, 20 Apr 2022 14:00:42 -0700 Subject: [PATCH 3/5] Move comment --- src/compiler/parser.ts | 41 +++++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index baaef1c654f9d..7e69904f0a49a 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -4695,24 +4695,6 @@ namespace ts { } } - // Given: - // x ? y => ({ y }) : z => ({ z }) - // We try to parse the body of the first arrow function by looking at: - // ({ y }) : z => ({ z }) - // This is a valid arrow function with "z" as the return type. - // - // But, if we're in the true side of a conditional expression, this colon - // terminates the expression, so we cannot allow a return type if we aren't - // certain whether or not the preceding text was parsed as a parameter list. - // - // For example, - // a() ? (b: number, c?: string): void => d() : e - // is determined by isParenthesizedArrowFunctionExpression to unambiguously - // be an arrow expression, so we allow a return type. - // if (disallowReturnTypeInArrowFunction && token() === SyntaxKind.ColonToken) { - // return undefined; - // } - const type = parseReturnType(SyntaxKind.ColonToken, /*isType*/ false); if (type && !allowAmbiguity && typeHasArrowFunctionBlockingParseError(type)) { return undefined; @@ -4748,11 +4730,26 @@ namespace ts { ? parseArrowFunctionExpressionBody(some(modifiers, isAsyncModifier), disallowReturnTypeInArrowFunction) : parseIdentifier(); + // Given: + // x ? y => ({ y }) : z => ({ z }) + // We try to parse the body of the first arrow function by looking at: + // ({ y }) : z => ({ z }) + // This is a valid arrow function with "z" as the return type. + // + // But, if we're in the true side of a conditional expression, this colon + // terminates the expression, so we cannot allow a return type if we aren't + // certain whether or not the preceding text was parsed as a parameter list. + // + // For example, + // a() ? (b: number, c?: string): void => d() : e + // is determined by isParenthesizedArrowFunctionExpression to unambiguously + // be an arrow expression, so we allow a return type. if (disallowReturnTypeInArrowFunction) { - // If we are currently parsing a conditional expression, and were able to parse - // a return type before the body, and there's another colon after the body, allow - // parsing of this arrow function so that the following colon terminates the - // true side of the conditional. + // However, if the arrow function we were able to parse is followed by another colon + // as in: + // a ? (x): string => x : null + // Then allow the arrow function, and treat the second colon as terminating + // the conditional expression. if (!(type && token() === SyntaxKind.ColonToken)) { return undefined; } From 3b2ec35bb637c4bac630e46534498275423989b0 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Wed, 20 Apr 2022 14:31:47 -0700 Subject: [PATCH 4/5] Remember colon from earlier --- src/compiler/parser.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 7e69904f0a49a..f055c326b0a33 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -4695,6 +4695,7 @@ namespace ts { } } + const hasReturnColon = token() === SyntaxKind.ColonToken; const type = parseReturnType(SyntaxKind.ColonToken, /*isType*/ false); if (type && !allowAmbiguity && typeHasArrowFunctionBlockingParseError(type)) { return undefined; @@ -4744,13 +4745,13 @@ namespace ts { // a() ? (b: number, c?: string): void => d() : e // is determined by isParenthesizedArrowFunctionExpression to unambiguously // be an arrow expression, so we allow a return type. - if (disallowReturnTypeInArrowFunction) { + if (disallowReturnTypeInArrowFunction && hasReturnColon) { // However, if the arrow function we were able to parse is followed by another colon // as in: // a ? (x): string => x : null // Then allow the arrow function, and treat the second colon as terminating // the conditional expression. - if (!(type && token() === SyntaxKind.ColonToken)) { + if (token() !== SyntaxKind.ColonToken) { return undefined; } } From 23987628a368823bfe958f8ab09451320b088872 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Wed, 20 Apr 2022 14:32:23 -0700 Subject: [PATCH 5/5] Revert 12 --- .../parserArrowFunctionExpression12.errors.txt | 11 +---------- .../reference/parserArrowFunctionExpression12.js | 4 +--- .../reference/parserArrowFunctionExpression12.symbols | 1 + .../reference/parserArrowFunctionExpression12.types | 5 ++--- 4 files changed, 5 insertions(+), 16 deletions(-) diff --git a/tests/baselines/reference/parserArrowFunctionExpression12.errors.txt b/tests/baselines/reference/parserArrowFunctionExpression12.errors.txt index bc6625a0e5a99..c6cfd8f9ce855 100644 --- a/tests/baselines/reference/parserArrowFunctionExpression12.errors.txt +++ b/tests/baselines/reference/parserArrowFunctionExpression12.errors.txt @@ -1,23 +1,14 @@ tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression12.ts(1,1): error TS2304: Cannot find name 'a'. -tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression12.ts(1,6): error TS2304: Cannot find name 'b'. -tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression12.ts(1,9): error TS1005: ':' expected. tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression12.ts(1,13): error TS2304: Cannot find name 'c'. -tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression12.ts(1,15): error TS1005: ';' expected. tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression12.ts(1,22): error TS2304: Cannot find name 'e'. -==== tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression12.ts (6 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression12.ts (3 errors) ==== a ? (b) => (c): d => e ~ !!! error TS2304: Cannot find name 'a'. - ~ -!!! error TS2304: Cannot find name 'b'. - ~~ -!!! error TS1005: ':' expected. ~ !!! error TS2304: Cannot find name 'c'. - ~ -!!! error TS1005: ';' expected. ~ !!! error TS2304: Cannot find name 'e'. \ No newline at end of file diff --git a/tests/baselines/reference/parserArrowFunctionExpression12.js b/tests/baselines/reference/parserArrowFunctionExpression12.js index 416b1aa1a6270..dbee37a2660cb 100644 --- a/tests/baselines/reference/parserArrowFunctionExpression12.js +++ b/tests/baselines/reference/parserArrowFunctionExpression12.js @@ -3,6 +3,4 @@ a ? (b) => (c): d => e //// [parserArrowFunctionExpression12.js] -a ? (b) : ; -(c); -(function (d) { return e; }); +a ? function (b) { return (c); } : function (d) { return e; }; diff --git a/tests/baselines/reference/parserArrowFunctionExpression12.symbols b/tests/baselines/reference/parserArrowFunctionExpression12.symbols index c72b2d870c8e5..3a67717232041 100644 --- a/tests/baselines/reference/parserArrowFunctionExpression12.symbols +++ b/tests/baselines/reference/parserArrowFunctionExpression12.symbols @@ -1,4 +1,5 @@ === tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression12.ts === a ? (b) => (c): d => e +>b : Symbol(b, Decl(parserArrowFunctionExpression12.ts, 0, 5)) >d : Symbol(d, Decl(parserArrowFunctionExpression12.ts, 0, 15)) diff --git a/tests/baselines/reference/parserArrowFunctionExpression12.types b/tests/baselines/reference/parserArrowFunctionExpression12.types index 8ebbf59b7a0a5..b833ae305a8b1 100644 --- a/tests/baselines/reference/parserArrowFunctionExpression12.types +++ b/tests/baselines/reference/parserArrowFunctionExpression12.types @@ -1,10 +1,9 @@ === tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression12.ts === a ? (b) => (c): d => e ->a ? (b) : any +>a ? (b) => (c): d => e : (b: any) => any >a : any ->(b) : any +>(b) => (c) : (b: any) => any >b : any -> : any >(c) : any >c : any >d => e : (d: any) => any