diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index e57a3fa98f390..ffe5f079c8c78 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -4463,7 +4463,7 @@ namespace ts { // it out, but don't allow any ambiguity, and return 'undefined' if this could be an // expression instead. return triState === Tristate.True ? - parseParenthesizedArrowFunctionExpression(/*allowAmbiguity*/ true, /*disallowReturnTypeInArrowFunction*/ false) : + parseParenthesizedArrowFunctionExpression(/*allowAmbiguity*/ true, disallowReturnTypeInArrowFunction) : tryParse(() => parsePossibleParenthesizedArrowFunctionExpression(disallowReturnTypeInArrowFunction)); } @@ -4702,13 +4702,8 @@ namespace ts { // 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 + // terminates the expression, so we cannot allow a return type, even 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; } diff --git a/tests/baselines/reference/parserArrowFunctionExpression13.errors.txt b/tests/baselines/reference/parserArrowFunctionExpression13.errors.txt index d0ea1c7d179ab..8e4df9842c146 100644 --- a/tests/baselines/reference/parserArrowFunctionExpression13.errors.txt +++ b/tests/baselines/reference/parserArrowFunctionExpression13.errors.txt @@ -1,11 +1,14 @@ tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression13.ts(1,1): error TS2304: Cannot find name 'a'. tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression13.ts(1,11): error TS2304: Cannot find name 'a'. +tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression13.ts(1,19): error TS1109: Expression expected. -==== tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression13.ts (2 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression13.ts (3 errors) ==== a ? () => a() : (): any => null; ~ !!! error TS2304: Cannot find name 'a'. ~ !!! error TS2304: Cannot find name 'a'. + ~ +!!! error TS1109: Expression expected. \ No newline at end of file diff --git a/tests/baselines/reference/parserArrowFunctionExpression13.js b/tests/baselines/reference/parserArrowFunctionExpression13.js index d208d9ba90a1f..5bc8a18e946c6 100644 --- a/tests/baselines/reference/parserArrowFunctionExpression13.js +++ b/tests/baselines/reference/parserArrowFunctionExpression13.js @@ -3,4 +3,5 @@ a ? () => a() : (): any => null; //// [parserArrowFunctionExpression13.js] -a ? function () { return a(); } : function () { return null; }; +a ? function () { return a(); } : ; +(function (any) { return null; }); diff --git a/tests/baselines/reference/parserArrowFunctionExpression13.symbols b/tests/baselines/reference/parserArrowFunctionExpression13.symbols index 643cfcf1a2b78..81ab28ab8cc51 100644 --- a/tests/baselines/reference/parserArrowFunctionExpression13.symbols +++ b/tests/baselines/reference/parserArrowFunctionExpression13.symbols @@ -1,4 +1,4 @@ === tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression13.ts === a ? () => a() : (): any => null; -No type information for this code. -No type information for this code. \ No newline at end of file +>any : Symbol(any, Decl(parserArrowFunctionExpression13.ts, 0, 19)) + diff --git a/tests/baselines/reference/parserArrowFunctionExpression13.types b/tests/baselines/reference/parserArrowFunctionExpression13.types index 9341e27b0c30d..6eaa57cd45d59 100644 --- a/tests/baselines/reference/parserArrowFunctionExpression13.types +++ b/tests/baselines/reference/parserArrowFunctionExpression13.types @@ -1,10 +1,12 @@ === tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression13.ts === a ? () => a() : (): any => null; ->a ? () => a() : (): any => null : () => any +>a ? () => a() : () : any >a : any >() => a() : () => any >a() : any >a : any ->(): any => null : () => any +> : any +>any => null : (any: any) => any +>any : any >null : null diff --git a/tests/baselines/reference/parserArrowFunctionExpression14.errors.txt b/tests/baselines/reference/parserArrowFunctionExpression14.errors.txt index b37e09d92ff3a..c19776f77a046 100644 --- a/tests/baselines/reference/parserArrowFunctionExpression14.errors.txt +++ b/tests/baselines/reference/parserArrowFunctionExpression14.errors.txt @@ -1,14 +1,23 @@ tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression14.ts(1,1): error TS2304: Cannot find name 'a'. +tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression14.ts(1,30): error TS1109: Expression expected. +tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression14.ts(1,37): error TS1109: Expression expected. tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression14.ts(1,40): error TS2304: Cannot find name 'd'. +tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression14.ts(1,44): error TS1005: ';' expected. tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression14.ts(1,46): error TS2304: Cannot find name 'e'. -==== tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression14.ts (3 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression14.ts (6 errors) ==== a() ? (b: number, c?: string): void => d() : e; ~ !!! error TS2304: Cannot find name 'a'. + ~ +!!! error TS1109: Expression expected. + ~~ +!!! error TS1109: Expression expected. ~ !!! error TS2304: Cannot find name 'd'. + ~ +!!! error TS1005: ';' expected. ~ !!! error TS2304: Cannot find name 'e'. \ No newline at end of file diff --git a/tests/baselines/reference/parserArrowFunctionExpression14.js b/tests/baselines/reference/parserArrowFunctionExpression14.js index 2dcaae91f3506..7941718ae24a8 100644 --- a/tests/baselines/reference/parserArrowFunctionExpression14.js +++ b/tests/baselines/reference/parserArrowFunctionExpression14.js @@ -3,4 +3,6 @@ a() ? (b: number, c?: string): void => d() : e; //// [parserArrowFunctionExpression14.js] -a() ? function (b, c) { return d(); } : e; +a() ? : void ; +d(); +e; diff --git a/tests/baselines/reference/parserArrowFunctionExpression14.symbols b/tests/baselines/reference/parserArrowFunctionExpression14.symbols index 95584e9f223be..75c6d5ff8b7ff 100644 --- a/tests/baselines/reference/parserArrowFunctionExpression14.symbols +++ b/tests/baselines/reference/parserArrowFunctionExpression14.symbols @@ -1,5 +1,4 @@ === tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression14.ts === a() ? (b: number, c?: string): void => d() : e; ->b : Symbol(b, Decl(parserArrowFunctionExpression14.ts, 0, 7)) ->c : Symbol(c, Decl(parserArrowFunctionExpression14.ts, 0, 17)) - +No type information for this code. +No type information for this code. \ No newline at end of file diff --git a/tests/baselines/reference/parserArrowFunctionExpression14.types b/tests/baselines/reference/parserArrowFunctionExpression14.types index 1c6d22bb83dc0..4102193f96787 100644 --- a/tests/baselines/reference/parserArrowFunctionExpression14.types +++ b/tests/baselines/reference/parserArrowFunctionExpression14.types @@ -1,11 +1,11 @@ === tests/cases/conformance/parser/ecmascript5/ArrowFunctionExpressions/parserArrowFunctionExpression14.ts === a() ? (b: number, c?: string): void => d() : e; ->a() ? (b: number, c?: string): void => d() : e : any +>a() ? (b: number, c?: string): void : any >a() : any >a : any ->(b: number, c?: string): void => d() : (b: number, c?: string) => void ->b : number ->c : string +> : any +>void : undefined +> : any >d() : any >d : any >e : any 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