From a3a49939377263b70e2bfe2a27337ff21ec38dd3 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Fri, 17 Feb 2023 10:55:56 -0800 Subject: [PATCH] Don't parse out a name for JSX fragments (#52818) --- src/compiler/parser.ts | 5 +---- tests/baselines/reference/tsxFragmentErrors.errors.txt | 8 +++----- tests/baselines/reference/tsxFragmentErrors.js | 6 +++--- tests/baselines/reference/tsxFragmentErrors.types | 5 +++-- .../cases/fourslash/jsxElementMissingOpeningTagNoCrash.ts | 7 +++++++ 5 files changed, 17 insertions(+), 14 deletions(-) create mode 100644 tests/cases/fourslash/jsxElementMissingOpeningTagNoCrash.ts diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 0da6a52d519..679c9e9a65f 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -6151,10 +6151,7 @@ namespace Parser { function parseJsxClosingFragment(inExpressionContext: boolean): JsxClosingFragment { const pos = getNodePos(); parseExpected(SyntaxKind.LessThanSlashToken); - if (tokenIsIdentifierOrKeyword(token())) { - parseErrorAtRange(parseJsxElementName(), Diagnostics.Expected_corresponding_closing_tag_for_JSX_fragment); - } - if (parseExpected(SyntaxKind.GreaterThanToken, /*diagnostic*/ undefined, /*shouldAdvance*/ false)) { + if (parseExpected(SyntaxKind.GreaterThanToken, Diagnostics.Expected_corresponding_closing_tag_for_JSX_fragment, /*shouldAdvance*/ false)) { // manually advance the scanner in order to look for jsx text inside jsx if (inExpressionContext) { nextToken(); diff --git a/tests/baselines/reference/tsxFragmentErrors.errors.txt b/tests/baselines/reference/tsxFragmentErrors.errors.txt index 46d8a0c09b7..16d15931335 100644 --- a/tests/baselines/reference/tsxFragmentErrors.errors.txt +++ b/tests/baselines/reference/tsxFragmentErrors.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/jsx/file.tsx(9,1): error TS2657: JSX expressions must have one parent element. +tests/cases/conformance/jsx/file.tsx(9,7): error TS2304: Cannot find name 'div'. tests/cases/conformance/jsx/file.tsx(9,7): error TS17015: Expected corresponding closing tag for JSX fragment. tests/cases/conformance/jsx/file.tsx(9,11): error TS17014: JSX fragment has no corresponding closing tag. tests/cases/conformance/jsx/file.tsx(11,17): error TS1005: 'hi // Error - ~~~~~~~~~~~~~~~~~~~ + ~~~ +!!! error TS2304: Cannot find name 'div'. ~~~ !!! error TS17015: Expected corresponding closing tag for JSX fragment. ~~~~~~~~~ - <>eof // Error - ~~~~~~~~~~~~~~~~ -!!! error TS2657: JSX expressions must have one parent element. ~~ !!! error TS17014: JSX fragment has no corresponding closing tag. diff --git a/tests/baselines/reference/tsxFragmentErrors.js b/tests/baselines/reference/tsxFragmentErrors.js index b0b5a622ea7..f1637925c07 100644 --- a/tests/baselines/reference/tsxFragmentErrors.js +++ b/tests/baselines/reference/tsxFragmentErrors.js @@ -12,6 +12,6 @@ declare var React: any; <>eof // Error //// [file.js] -React.createElement(React.Fragment, null, "hi") // Error - , // Error - React.createElement(React.Fragment, null, "eof // Error"); +React.createElement(React.Fragment, null, "hi"); +div > // Error + React.createElement(React.Fragment, null, "eof // Error"); diff --git a/tests/baselines/reference/tsxFragmentErrors.types b/tests/baselines/reference/tsxFragmentErrors.types index efcfebfc997..9c66968c10c 100644 --- a/tests/baselines/reference/tsxFragmentErrors.types +++ b/tests/baselines/reference/tsxFragmentErrors.types @@ -10,8 +10,9 @@ declare var React: any; >React : any <>hi // Error -><>hi // Error<>eof // Error : JSX.Element -><>hi : JSX.Element +><>hidiv> // Error<>eof // Error : boolean +>div : any <>eof // Error ><>eof // Error : JSX.Element diff --git a/tests/cases/fourslash/jsxElementMissingOpeningTagNoCrash.ts b/tests/cases/fourslash/jsxElementMissingOpeningTagNoCrash.ts new file mode 100644 index 00000000000..9960496a279 --- /dev/null +++ b/tests/cases/fourslash/jsxElementMissingOpeningTagNoCrash.ts @@ -0,0 +1,7 @@ +/// + +//@Filename: file.tsx +//// declare function Foo(): any; +//// let x = <>; + +verify.quickInfoAt("$", "let Foo: any");