From 03074557802abdb6277c7b0893691affddbfb852 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Fri, 6 May 2022 10:16:21 -0700 Subject: [PATCH 1/3] Add test cases --- tests/cases/compiler/parserUnparsedTokenCrash1.ts | 3 +++ tests/cases/compiler/parserUnparsedTokenCrash2.ts | 1 + 2 files changed, 4 insertions(+) create mode 100644 tests/cases/compiler/parserUnparsedTokenCrash1.ts create mode 100644 tests/cases/compiler/parserUnparsedTokenCrash2.ts diff --git a/tests/cases/compiler/parserUnparsedTokenCrash1.ts b/tests/cases/compiler/parserUnparsedTokenCrash1.ts new file mode 100644 index 0000000000000..ec1457b4e7482 --- /dev/null +++ b/tests/cases/compiler/parserUnparsedTokenCrash1.ts @@ -0,0 +1,3 @@ +// @allowJs: true +// @filename: a.js +( y = 1 ; 2 ) diff --git a/tests/cases/compiler/parserUnparsedTokenCrash2.ts b/tests/cases/compiler/parserUnparsedTokenCrash2.ts new file mode 100644 index 0000000000000..d470175462b2c --- /dev/null +++ b/tests/cases/compiler/parserUnparsedTokenCrash2.ts @@ -0,0 +1 @@ +export = } x = ( y = z ==== 'function') { From c7ea79cd1985096ae7ffaa76486acf82b647b4d5 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Fri, 6 May 2022 13:01:54 -0700 Subject: [PATCH 2/3] Fix missing parsingContext restore at return in parseDelimitedList --- src/compiler/parser.ts | 1 + .../parserUnparsedTokenCrash1.errors.txt | 15 ++++++++++ .../parserUnparsedTokenCrash1.symbols | 4 +++ .../reference/parserUnparsedTokenCrash1.types | 8 +++++ .../parserUnparsedTokenCrash2.errors.txt | 30 +++++++++++++++++++ .../reference/parserUnparsedTokenCrash2.js | 10 +++++++ .../parserUnparsedTokenCrash2.symbols | 4 +++ .../reference/parserUnparsedTokenCrash2.types | 14 +++++++++ 8 files changed, 86 insertions(+) create mode 100644 tests/baselines/reference/parserUnparsedTokenCrash1.errors.txt create mode 100644 tests/baselines/reference/parserUnparsedTokenCrash1.symbols create mode 100644 tests/baselines/reference/parserUnparsedTokenCrash1.types create mode 100644 tests/baselines/reference/parserUnparsedTokenCrash2.errors.txt create mode 100644 tests/baselines/reference/parserUnparsedTokenCrash2.js create mode 100644 tests/baselines/reference/parserUnparsedTokenCrash2.symbols create mode 100644 tests/baselines/reference/parserUnparsedTokenCrash2.types diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 240385df8dfcf..dd1e7f6431a7e 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -2745,6 +2745,7 @@ namespace ts { const startPos = scanner.getStartPos(); const result = parseListElement(kind, parseElement); if (!result) { + parsingContext = saveParsingContext; return undefined; } list.push(result as NonNullable); diff --git a/tests/baselines/reference/parserUnparsedTokenCrash1.errors.txt b/tests/baselines/reference/parserUnparsedTokenCrash1.errors.txt new file mode 100644 index 0000000000000..b9058bf140f65 --- /dev/null +++ b/tests/baselines/reference/parserUnparsedTokenCrash1.errors.txt @@ -0,0 +1,15 @@ +error TS5055: Cannot write file 'tests/cases/compiler/a.js' because it would overwrite input file. + Adding a tsconfig.json file will help organize projects that contain both TypeScript and JavaScript files. Learn more at https://aka.ms/tsconfig. +tests/cases/compiler/a.js(1,9): error TS1005: ')' expected. +tests/cases/compiler/a.js(1,13): error TS1005: ';' expected. + + +!!! error TS5055: Cannot write file 'tests/cases/compiler/a.js' because it would overwrite input file. +!!! error TS5055: Adding a tsconfig.json file will help organize projects that contain both TypeScript and JavaScript files. Learn more at https://aka.ms/tsconfig. +==== tests/cases/compiler/a.js (2 errors) ==== + ( y = 1 ; 2 ) + ~ +!!! error TS1005: ')' expected. + ~ +!!! error TS1005: ';' expected. + \ No newline at end of file diff --git a/tests/baselines/reference/parserUnparsedTokenCrash1.symbols b/tests/baselines/reference/parserUnparsedTokenCrash1.symbols new file mode 100644 index 0000000000000..a07da336f8147 --- /dev/null +++ b/tests/baselines/reference/parserUnparsedTokenCrash1.symbols @@ -0,0 +1,4 @@ +=== tests/cases/compiler/a.js === +( y = 1 ; 2 ) +No type information for this code. +No type information for this code. \ No newline at end of file diff --git a/tests/baselines/reference/parserUnparsedTokenCrash1.types b/tests/baselines/reference/parserUnparsedTokenCrash1.types new file mode 100644 index 0000000000000..836ba475b5d0f --- /dev/null +++ b/tests/baselines/reference/parserUnparsedTokenCrash1.types @@ -0,0 +1,8 @@ +=== tests/cases/compiler/a.js === +( y = 1 ; 2 ) +>( y = 1 : 1 +>y = 1 : 1 +>y : any +>1 : 1 +>2 : 2 + diff --git a/tests/baselines/reference/parserUnparsedTokenCrash2.errors.txt b/tests/baselines/reference/parserUnparsedTokenCrash2.errors.txt new file mode 100644 index 0000000000000..4f23134ef9f9f --- /dev/null +++ b/tests/baselines/reference/parserUnparsedTokenCrash2.errors.txt @@ -0,0 +1,30 @@ +tests/cases/compiler/parserUnparsedTokenCrash2.ts(1,10): error TS1109: Expression expected. +tests/cases/compiler/parserUnparsedTokenCrash2.ts(1,12): error TS2304: Cannot find name 'x'. +tests/cases/compiler/parserUnparsedTokenCrash2.ts(1,16): error TS2364: The left-hand side of an assignment expression must be a variable or a property access. +tests/cases/compiler/parserUnparsedTokenCrash2.ts(1,18): error TS2304: Cannot find name 'y'. +tests/cases/compiler/parserUnparsedTokenCrash2.ts(1,22): error TS2304: Cannot find name 'z'. +tests/cases/compiler/parserUnparsedTokenCrash2.ts(1,27): error TS1109: Expression expected. +tests/cases/compiler/parserUnparsedTokenCrash2.ts(1,39): error TS1005: ';' expected. +tests/cases/compiler/parserUnparsedTokenCrash2.ts(2,1): error TS1005: '}' expected. + + +==== tests/cases/compiler/parserUnparsedTokenCrash2.ts (8 errors) ==== + export = } x = ( y = z ==== 'function') { + ~ +!!! error TS1109: Expression expected. + ~ +!!! error TS2304: Cannot find name 'x'. + ~~~~~~~~~~~ +!!! error TS2364: The left-hand side of an assignment expression must be a variable or a property access. + ~ +!!! error TS2304: Cannot find name 'y'. + ~ +!!! error TS2304: Cannot find name 'z'. + ~ +!!! error TS1109: Expression expected. + ~ +!!! error TS1005: ';' expected. + + +!!! error TS1005: '}' expected. +!!! related TS1007 tests/cases/compiler/parserUnparsedTokenCrash2.ts:1:41: The parser expected to find a '}' to match the '{' token here. \ No newline at end of file diff --git a/tests/baselines/reference/parserUnparsedTokenCrash2.js b/tests/baselines/reference/parserUnparsedTokenCrash2.js new file mode 100644 index 0000000000000..e7ff31800ebf2 --- /dev/null +++ b/tests/baselines/reference/parserUnparsedTokenCrash2.js @@ -0,0 +1,10 @@ +//// [parserUnparsedTokenCrash2.ts] +export = } x = ( y = z ==== 'function') { + + +//// [parserUnparsedTokenCrash2.js] +"use strict"; +x = (y = z === ) = 'function'; +{ +} +module.exports = ; diff --git a/tests/baselines/reference/parserUnparsedTokenCrash2.symbols b/tests/baselines/reference/parserUnparsedTokenCrash2.symbols new file mode 100644 index 0000000000000..a027cd161a7db --- /dev/null +++ b/tests/baselines/reference/parserUnparsedTokenCrash2.symbols @@ -0,0 +1,4 @@ +=== tests/cases/compiler/parserUnparsedTokenCrash2.ts === +export = } x = ( y = z ==== 'function') { +No type information for this code. +No type information for this code. \ No newline at end of file diff --git a/tests/baselines/reference/parserUnparsedTokenCrash2.types b/tests/baselines/reference/parserUnparsedTokenCrash2.types new file mode 100644 index 0000000000000..62e37ed344323 --- /dev/null +++ b/tests/baselines/reference/parserUnparsedTokenCrash2.types @@ -0,0 +1,14 @@ +=== tests/cases/compiler/parserUnparsedTokenCrash2.ts === +export = } x = ( y = z ==== 'function') { +> : any +>x = ( y = z ==== 'function' : "function" +>x : any +>( y = z ==== 'function' : "function" +>( y = z === : boolean +>y = z === : boolean +>y : any +>z === : boolean +>z : any +> : any +>'function' : "function" + From 3a8ce703b70aabc79c741fc1a837b4171c77f31b Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Fri, 6 May 2022 13:05:12 -0700 Subject: [PATCH 3/3] Fix baseline --- .../reference/parserUnparsedTokenCrash1.errors.txt | 4 ---- tests/baselines/reference/parserUnparsedTokenCrash1.js | 7 +++++++ tests/cases/compiler/parserUnparsedTokenCrash1.ts | 1 + 3 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 tests/baselines/reference/parserUnparsedTokenCrash1.js diff --git a/tests/baselines/reference/parserUnparsedTokenCrash1.errors.txt b/tests/baselines/reference/parserUnparsedTokenCrash1.errors.txt index b9058bf140f65..133be2968a22d 100644 --- a/tests/baselines/reference/parserUnparsedTokenCrash1.errors.txt +++ b/tests/baselines/reference/parserUnparsedTokenCrash1.errors.txt @@ -1,11 +1,7 @@ -error TS5055: Cannot write file 'tests/cases/compiler/a.js' because it would overwrite input file. - Adding a tsconfig.json file will help organize projects that contain both TypeScript and JavaScript files. Learn more at https://aka.ms/tsconfig. tests/cases/compiler/a.js(1,9): error TS1005: ')' expected. tests/cases/compiler/a.js(1,13): error TS1005: ';' expected. -!!! error TS5055: Cannot write file 'tests/cases/compiler/a.js' because it would overwrite input file. -!!! error TS5055: Adding a tsconfig.json file will help organize projects that contain both TypeScript and JavaScript files. Learn more at https://aka.ms/tsconfig. ==== tests/cases/compiler/a.js (2 errors) ==== ( y = 1 ; 2 ) ~ diff --git a/tests/baselines/reference/parserUnparsedTokenCrash1.js b/tests/baselines/reference/parserUnparsedTokenCrash1.js new file mode 100644 index 0000000000000..feffea8688a38 --- /dev/null +++ b/tests/baselines/reference/parserUnparsedTokenCrash1.js @@ -0,0 +1,7 @@ +//// [a.js] +( y = 1 ; 2 ) + + +//// [a.js] +(y = 1); +2; diff --git a/tests/cases/compiler/parserUnparsedTokenCrash1.ts b/tests/cases/compiler/parserUnparsedTokenCrash1.ts index ec1457b4e7482..303c455825bc9 100644 --- a/tests/cases/compiler/parserUnparsedTokenCrash1.ts +++ b/tests/cases/compiler/parserUnparsedTokenCrash1.ts @@ -1,3 +1,4 @@ // @allowJs: true +// @outDir: ./out // @filename: a.js ( y = 1 ; 2 )