Improve parser recovery for unclosed/mismatched JSX elements (#43780)

* First draft

Everything works, the error messages for unmatched opening elements
could still use improvement, plus there is tonnes of unused and ugly
code.

1. Make sure the parser can recover from all kinds of unclosed tags.
2. Improve the parse tree for unmatched opening tags.
3. Better errors at some point.

* Lots of cleanup

* Improve readability of construction/fix lint

* improve line-length formatting
This commit is contained in:
Nathan Shively-Sanders
2021-05-20 07:20:57 -07:00
committed by GitHub
parent 7901f351eb
commit 89a737c871
14 changed files with 1634 additions and 58 deletions
+66 -27
View File
@@ -4865,18 +4865,45 @@ namespace ts {
return finishNode(factory.createPropertyAccessExpression(expression, parseRightSideOfDot(/*allowIdentifierNames*/ true, /*allowPrivateIdentifiers*/ true)), pos);
}
function parseJsxElementOrSelfClosingElementOrFragment(inExpressionContext: boolean, topInvalidNodePosition?: number): JsxElement | JsxSelfClosingElement | JsxFragment {
function parseJsxElementOrSelfClosingElementOrFragment(inExpressionContext: boolean, topInvalidNodePosition?: number, openingTag?: JsxOpeningElement | JsxOpeningFragment): JsxElement | JsxSelfClosingElement | JsxFragment {
const pos = getNodePos();
const opening = parseJsxOpeningOrSelfClosingElementOrOpeningFragment(inExpressionContext);
let result: JsxElement | JsxSelfClosingElement | JsxFragment;
if (opening.kind === SyntaxKind.JsxOpeningElement) {
const children = parseJsxChildren(opening);
const closingElement = parseJsxClosingElement(inExpressionContext);
let children = parseJsxChildren(opening);
let closingElement: JsxClosingElement;
if (!tagNamesAreEquivalent(opening.tagName, closingElement.tagName)) {
parseErrorAtRange(closingElement, Diagnostics.Expected_corresponding_JSX_closing_tag_for_0, getTextOfNodeFromSourceText(sourceText, opening.tagName));
const lastChild: JsxChild | undefined = children[children.length - 1];
if (lastChild?.kind === SyntaxKind.JsxElement
&& !tagNamesAreEquivalent(lastChild.openingElement.tagName, lastChild.closingElement.tagName)
&& tagNamesAreEquivalent(opening.tagName, lastChild.closingElement.tagName)) {
// when an unclosed JsxOpeningElement incorrectly parses its parent's JsxClosingElement,
// restructure (<div>(...<span></div>)) --> (<div>(...<span></span>)</div>)
// (no need to error; the parent will error)
const end = lastChild.openingElement.end; // newly-created children and closing are both zero-width end/end
const newLast = finishNode(factory.createJsxElement(
lastChild.openingElement,
createNodeArray([], end, end),
finishNode(factory.createJsxClosingElement(finishNode(factory.createIdentifier(""), end, end)), end, end)),
lastChild.openingElement.pos,
end);
children = createNodeArray([...children.slice(0, children.length - 1), newLast], children.pos, end);
closingElement = lastChild.closingElement;
}
else {
closingElement = parseJsxClosingElement(opening, inExpressionContext);
if (!tagNamesAreEquivalent(opening.tagName, closingElement.tagName)) {
if (openingTag && isJsxOpeningElement(openingTag) && tagNamesAreEquivalent(closingElement.tagName, openingTag.tagName)) {
// opening incorrectly matched with its parent's closing -- put error on opening
parseErrorAtRange(opening.tagName, Diagnostics.JSX_element_0_has_no_corresponding_closing_tag, getTextOfNodeFromSourceText(sourceText, opening.tagName));
}
else {
// other opening/closing mismatches -- put error on closing
parseErrorAtRange(closingElement.tagName, Diagnostics.Expected_corresponding_JSX_closing_tag_for_0, getTextOfNodeFromSourceText(sourceText, opening.tagName));
}
}
}
result = finishNode(factory.createJsxElement(opening, children, closingElement), pos);
}
else if (opening.kind === SyntaxKind.JsxOpeningFragment) {
@@ -4941,7 +4968,7 @@ namespace ts {
case SyntaxKind.OpenBraceToken:
return parseJsxExpression(/*inExpressionContext*/ false);
case SyntaxKind.LessThanToken:
return parseJsxElementOrSelfClosingElementOrFragment(/*inExpressionContext*/ false);
return parseJsxElementOrSelfClosingElementOrFragment(/*inExpressionContext*/ false, /*topInvalidNodePosition*/ undefined, openingTag);
default:
return Debug.assertNever(token);
}
@@ -4957,6 +4984,13 @@ namespace ts {
const child = parseJsxChild(openingTag, currentToken = scanner.reScanJsxToken());
if (!child) break;
list.push(child);
if (isJsxOpeningElement(openingTag)
&& child?.kind === SyntaxKind.JsxElement
&& !tagNamesAreEquivalent(child.openingElement.tagName, child.closingElement.tagName)
&& tagNamesAreEquivalent(openingTag.tagName, child.closingElement.tagName)) {
// stop after parsing a mismatched child like <div>...(<span></div>) in order to reattach the </div> higher
break;
}
}
parsingContext = saveParsingContext;
@@ -4978,7 +5012,6 @@ namespace ts {
scanJsxText();
return finishNode(factory.createJsxOpeningFragment(), pos);
}
const tagName = parseJsxElementName();
const typeArguments = (contextFlags & NodeFlags.JavaScriptFile) === 0 ? tryParseTypeArguments() : undefined;
const attributes = parseJsxAttributes();
@@ -4994,12 +5027,14 @@ namespace ts {
}
else {
parseExpected(SyntaxKind.SlashToken);
if (inExpressionContext) {
parseExpected(SyntaxKind.GreaterThanToken);
}
else {
parseExpected(SyntaxKind.GreaterThanToken, /*diagnostic*/ undefined, /*shouldAdvance*/ false);
scanJsxText();
if (parseExpected(SyntaxKind.GreaterThanToken, /*diagnostic*/ undefined, /*shouldAdvance*/ false)) {
// manually advance the scanner in order to look for jsx text inside jsx
if (inExpressionContext) {
nextToken();
}
else {
scanJsxText();
}
}
node = factory.createJsxSelfClosingElement(tagName, typeArguments, attributes);
}
@@ -5077,16 +5112,18 @@ namespace ts {
return finishNode(factory.createJsxSpreadAttribute(expression), pos);
}
function parseJsxClosingElement(inExpressionContext: boolean): JsxClosingElement {
function parseJsxClosingElement(open: JsxOpeningElement, inExpressionContext: boolean): JsxClosingElement {
const pos = getNodePos();
parseExpected(SyntaxKind.LessThanSlashToken);
const tagName = parseJsxElementName();
if (inExpressionContext) {
parseExpected(SyntaxKind.GreaterThanToken);
}
else {
parseExpected(SyntaxKind.GreaterThanToken, /*diagnostic*/ undefined, /*shouldAdvance*/ false);
scanJsxText();
if (parseExpected(SyntaxKind.GreaterThanToken, /*diagnostic*/ undefined, /*shouldAdvance*/ false)) {
// manually advance the scanner in order to look for jsx text inside jsx
if (inExpressionContext || !tagNamesAreEquivalent(open.tagName, tagName)) {
nextToken();
}
else {
scanJsxText();
}
}
return finishNode(factory.createJsxClosingElement(tagName), pos);
}
@@ -5097,12 +5134,14 @@ namespace ts {
if (tokenIsIdentifierOrKeyword(token())) {
parseErrorAtRange(parseJsxElementName(), Diagnostics.Expected_corresponding_closing_tag_for_JSX_fragment);
}
if (inExpressionContext) {
parseExpected(SyntaxKind.GreaterThanToken);
}
else {
parseExpected(SyntaxKind.GreaterThanToken, /*diagnostic*/ undefined, /*shouldAdvance*/ false);
scanJsxText();
if (parseExpected(SyntaxKind.GreaterThanToken, /*diagnostic*/ undefined, /*shouldAdvance*/ false)) {
// manually advance the scanner in order to look for jsx text inside jsx
if (inExpressionContext) {
nextToken();
}
else {
scanJsxText();
}
}
return finishNode(factory.createJsxJsxClosingFragment(), pos);
}
+1 -1
View File
@@ -3177,7 +3177,7 @@ namespace FourSlash {
for (const markerName in map) {
this.goToMarker(markerName);
const actual = this.languageService.getJsxClosingTagAtPosition(this.activeFile.fileName, this.currentCaretPosition);
assert.deepEqual(actual, map[markerName]);
assert.deepEqual(actual, map[markerName], markerName);
}
}
@@ -2,7 +2,7 @@ tests/cases/compiler/a.jsx(1,13): error TS1109: Expression expected.
tests/cases/compiler/a.jsx(4,1): error TS2657: JSX expressions must have one parent element.
tests/cases/compiler/a.jsx(4,5): error TS1003: Identifier expected.
tests/cases/compiler/a.jsx(4,13): error TS1382: Unexpected token. Did you mean `{'>'}` or `&gt;`?
tests/cases/compiler/a.jsx(4,14): error TS17002: Expected corresponding JSX closing tag for 'number'.
tests/cases/compiler/a.jsx(4,16): error TS17002: Expected corresponding JSX closing tag for 'number'.
tests/cases/compiler/a.jsx(5,1): error TS2657: JSX expressions must have one parent element.
tests/cases/compiler/a.jsx(5,5): error TS1003: Identifier expected.
tests/cases/compiler/a.jsx(5,6): error TS17008: JSX element 'number' has no corresponding closing tag.
@@ -23,7 +23,7 @@ tests/cases/compiler/a.jsx(6,1): error TS1005: '</' expected.
!!! error TS1003: Identifier expected.
~
!!! error TS1382: Unexpected token. Did you mean `{'>'}` or `&gt;`?
~~~~~~
~~~
!!! error TS17002: Expected corresponding JSX closing tag for 'number'.
<Foo<number>/>;
~~~~~~~~~~~~~~~
@@ -34,7 +34,7 @@ x = <any><any></any>;
x = <foo>hello {<foo>} </foo>};
x = <foo test={<foo>}>hello</foo>}/>
x = <foo test={<foo>}>hello</foo>}/>;
x = <foo test={<foo>}>hello{<foo>}</foo>};
@@ -33,7 +33,7 @@ x = <foo>hello {<foo>{}} </foo>;
>foo : typeof foo
x = <foo test={<foo>{}}>hello</foo>;
><foo test={<foo>{}}>hello</foo>; : any
><foo test={<foo>{}}>hello</foo> : any
>foo : typeof foo
>test : any
><foo>{}}>hello</foo> : any
@@ -8,7 +8,7 @@ tests/cases/conformance/jsx/10.tsx(1,13): error TS1005: '>' expected.
tests/cases/conformance/jsx/10.tsx(1,14): error TS2304: Cannot find name 'c'.
tests/cases/conformance/jsx/10.tsx(1,16): error TS1109: Expression expected.
tests/cases/conformance/jsx/11.tsx(1,2): error TS2304: Cannot find name 'a'.
tests/cases/conformance/jsx/11.tsx(1,8): error TS17002: Expected corresponding JSX closing tag for 'a.b.c'.
tests/cases/conformance/jsx/11.tsx(1,10): error TS17002: Expected corresponding JSX closing tag for 'a.b.c'.
tests/cases/conformance/jsx/12.tsx(1,1): error TS1109: Expression expected.
tests/cases/conformance/jsx/12.tsx(1,2): error TS1109: Expression expected.
tests/cases/conformance/jsx/12.tsx(1,5): error TS1109: Expression expected.
@@ -73,9 +73,9 @@ tests/cases/conformance/jsx/31.tsx(1,4): error TS1003: Identifier expected.
tests/cases/conformance/jsx/4.tsx(1,6): error TS1005: '{' expected.
tests/cases/conformance/jsx/5.tsx(1,2): error TS17008: JSX element 'a' has no corresponding closing tag.
tests/cases/conformance/jsx/5.tsx(1,5): error TS1005: '</' expected.
tests/cases/conformance/jsx/6.tsx(1,4): error TS17002: Expected corresponding JSX closing tag for 'a'.
tests/cases/conformance/jsx/6.tsx(1,6): error TS17002: Expected corresponding JSX closing tag for 'a'.
tests/cases/conformance/jsx/7.tsx(1,13): error TS1002: Unterminated string literal.
tests/cases/conformance/jsx/8.tsx(1,6): error TS17002: Expected corresponding JSX closing tag for 'a:b'.
tests/cases/conformance/jsx/8.tsx(1,8): error TS17002: Expected corresponding JSX closing tag for 'a:b'.
tests/cases/conformance/jsx/9.tsx(1,2): error TS2304: Cannot find name 'a:b'.
tests/cases/conformance/jsx/9.tsx(1,2): error TS2633: JSX property access expressions cannot include JSX namespace names
tests/cases/conformance/jsx/9.tsx(1,10): error TS2304: Cannot find name 'a:b'.
@@ -119,7 +119,7 @@ tests/cases/conformance/jsx/9.tsx(1,10): error TS2304: Cannot find name 'a:b'.
!!! error TS1005: '</' expected.
==== tests/cases/conformance/jsx/6.tsx (1 errors) ====
<a></b>;
~~~~
~
!!! error TS17002: Expected corresponding JSX closing tag for 'a'.
==== tests/cases/conformance/jsx/7.tsx (1 errors) ====
<a foo="bar;
@@ -127,7 +127,7 @@ tests/cases/conformance/jsx/9.tsx(1,10): error TS2304: Cannot find name 'a:b'.
!!! error TS1002: Unterminated string literal.
==== tests/cases/conformance/jsx/8.tsx (1 errors) ====
<a:b></b>;
~~~~
~
!!! error TS17002: Expected corresponding JSX closing tag for 'a:b'.
==== tests/cases/conformance/jsx/9.tsx (3 errors) ====
<a:b.c></a:b.c>;
@@ -155,7 +155,7 @@ tests/cases/conformance/jsx/9.tsx(1,10): error TS2304: Cannot find name 'a:b'.
<a.b.c></a>;
~
!!! error TS2304: Cannot find name 'a'.
~~~~
~
!!! error TS17002: Expected corresponding JSX closing tag for 'a.b.c'.
==== tests/cases/conformance/jsx/12.tsx (6 errors) ====
<.a></.a>;
@@ -1,11 +1,9 @@
tests/cases/conformance/jsx/Error1.tsx(2,11): error TS17008: JSX element 'div' has no corresponding closing tag.
tests/cases/conformance/jsx/Error1.tsx(2,21): error TS17002: Expected corresponding JSX closing tag for 'span'.
tests/cases/conformance/jsx/Error1.tsx(3,1): error TS1005: '</' expected.
tests/cases/conformance/jsx/Error2.tsx(1,15): error TS17002: Expected corresponding JSX closing tag for 'div'.
tests/cases/conformance/jsx/Error1.tsx(2,16): error TS17008: JSX element 'span' has no corresponding closing tag.
tests/cases/conformance/jsx/Error2.tsx(1,17): error TS17002: Expected corresponding JSX closing tag for 'div'.
tests/cases/conformance/jsx/Error3.tsx(1,11): error TS17008: JSX element 'div' has no corresponding closing tag.
tests/cases/conformance/jsx/Error3.tsx(3,1): error TS1005: '</' expected.
tests/cases/conformance/jsx/Error4.tsx(1,11): error TS17008: JSX element 'div' has no corresponding closing tag.
tests/cases/conformance/jsx/Error4.tsx(1,20): error TS17002: Expected corresponding JSX closing tag for 'div'.
tests/cases/conformance/jsx/Error4.tsx(1,22): error TS17002: Expected corresponding JSX closing tag for 'div'.
tests/cases/conformance/jsx/Error4.tsx(2,1): error TS1005: '</' expected.
tests/cases/conformance/jsx/Error5.tsx(1,11): error TS17008: JSX element 'div' has no corresponding closing tag.
tests/cases/conformance/jsx/Error5.tsx(1,16): error TS17008: JSX element 'span' has no corresponding closing tag.
@@ -20,19 +18,15 @@ tests/cases/conformance/jsx/Error5.tsx(3,1): error TS1005: '</' expected.
}
}
==== tests/cases/conformance/jsx/Error1.tsx (3 errors) ====
==== tests/cases/conformance/jsx/Error1.tsx (1 errors) ====
// Issue error about missing span closing tag, not missing div closing tag
let x1 = <div><span></div>;
~~~
!!! error TS17008: JSX element 'div' has no corresponding closing tag.
~~~~~~
!!! error TS17002: Expected corresponding JSX closing tag for 'span'.
~~~~
!!! error TS17008: JSX element 'span' has no corresponding closing tag.
!!! error TS1005: '</' expected.
==== tests/cases/conformance/jsx/Error2.tsx (1 errors) ====
let x2 = <div></span>;
~~~~~~~
~~~~
!!! error TS17002: Expected corresponding JSX closing tag for 'div'.
@@ -48,7 +42,7 @@ tests/cases/conformance/jsx/Error5.tsx(3,1): error TS1005: '</' expected.
let x4 = <div><div></span>;
~~~
!!! error TS17008: JSX element 'div' has no corresponding closing tag.
~~~~~~~
~~~~
!!! error TS17002: Expected corresponding JSX closing tag for 'div'.
@@ -31,8 +31,7 @@ let x5 = <div><span>
//// [file.jsx]
//// [Error1.jsx]
// Issue error about missing span closing tag, not missing div closing tag
var x1 = <div><span></div>;
</>;
var x1 = <div><span></></div>;
//// [Error2.jsx]
var x2 = <div></span>;
//// [Error3.jsx]
@@ -11,13 +11,12 @@ declare module JSX {
// Issue error about missing span closing tag, not missing div closing tag
let x1 = <div><span></div>;
>x1 : JSX.Element
><div><span></div>; : JSX.Element
><div><span></div> : JSX.Element
>div : any
><span></div> : JSX.Element
><span> : JSX.Element
>span : any
>div : any
> : any
>div : any
=== tests/cases/conformance/jsx/Error2.tsx ===
let x2 = <div></span>;
@@ -0,0 +1,273 @@
tests/cases/conformance/jsx/jsxParserRecovery.tsx(12,1): error TS1003: Identifier expected.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(16,1): error TS1003: Identifier expected.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(19,12): error TS2558: Expected 0 type arguments, but got 1.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(20,1): error TS1003: Identifier expected.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(24,1): error TS1003: Identifier expected.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(27,12): error TS2558: Expected 0 type arguments, but got 1.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(28,1): error TS1003: Identifier expected.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(32,1): error TS1005: '>' expected.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(35,12): error TS2558: Expected 0 type arguments, but got 1.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(36,1): error TS1005: '>' expected.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(39,6): error TS17008: JSX element 'diddy' has no corresponding closing tag.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(43,6): error TS17008: JSX element 'diddy' has no corresponding closing tag.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(43,12): error TS2558: Expected 0 type arguments, but got 1.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(49,5): error TS1003: Identifier expected.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(49,6): error TS2749: 'diddy' refers to a value, but is being used as a type here. Did you mean 'typeof diddy'?
tests/cases/conformance/jsx/jsxParserRecovery.tsx(49,11): error TS1005: '>' expected.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(54,6): error TS2558: Expected 0 type arguments, but got 1.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(54,6): error TS2749: 'diddy' refers to a value, but is being used as a type here. Did you mean 'typeof diddy'?
tests/cases/conformance/jsx/jsxParserRecovery.tsx(54,11): error TS1005: '>' expected.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(58,12): error TS2558: Expected 0 type arguments, but got 1.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(59,5): error TS1003: Identifier expected.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(64,5): error TS1003: Identifier expected.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(68,12): error TS2558: Expected 0 type arguments, but got 1.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(69,5): error TS1003: Identifier expected.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(74,5): error TS1005: '>' expected.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(78,12): error TS2558: Expected 0 type arguments, but got 1.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(79,5): error TS1005: '>' expected.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(83,6): error TS17008: JSX element 'diddy' has no corresponding closing tag.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(88,6): error TS17008: JSX element 'diddy' has no corresponding closing tag.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(88,12): error TS2558: Expected 0 type arguments, but got 1.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(95,5): error TS2304: Cannot find name 'Cranky'.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(96,1): error TS1003: Identifier expected.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(101,1): error TS1003: Identifier expected.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(104,12): error TS2558: Expected 0 type arguments, but got 1.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(106,1): error TS1003: Identifier expected.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(111,1): error TS1003: Identifier expected.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(114,12): error TS2558: Expected 0 type arguments, but got 1.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(116,1): error TS1003: Identifier expected.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(120,5): error TS1005: '>' expected.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(124,12): error TS2558: Expected 0 type arguments, but got 1.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(125,5): error TS1005: '>' expected.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(129,6): error TS17008: JSX element 'diddy' has no corresponding closing tag.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(134,6): error TS17008: JSX element 'diddy' has no corresponding closing tag.
tests/cases/conformance/jsx/jsxParserRecovery.tsx(134,12): error TS2558: Expected 0 type arguments, but got 1.
==== tests/cases/conformance/jsx/jsxParserRecovery.tsx (44 errors) ====
// should have no errors here; all these functions should parse and resolve
noName(); noClose(); noCloseTypeArg(); noCloseAttrs(); noCloseTypeArgAttrs(); noCloseBracket(); noCloseBracketTypeArgAttrs(); noSelfclose(); noSelfcloseTypeArgAttrs();
noNameTrailingTag(); noCloseTrailingTag(); noCloseTypeArgTrailingTag(); noCloseAttrsTrailingTag(); noCloseTypeArgAttrsTrailingTag(); noCloseBracketTrailingTag(); noCloseBracketTypeArgAttrsTrailingTag(); // noSelfcloseTrailingTag(); noSelfcloseTypeArgAttrsTrailingTag();
noNameTrailingText(); noCloseTrailingText(); noCloseTypeArgTrailingText(); noCloseAttrsTrailingText(); noCloseTypeArgAttrsTrailingText(); noCloseBracketTrailingText(); noCloseBracketTypeArgAttrsTrailingText(); // noSelfcloseTrailingText(); noSelfcloseTypeArgAttrsTrailingText();
function diddy() {
return null;
}
var donkey = <div>
<
</div>;
~~
!!! error TS1003: Identifier expected.
function noName() { }
var donkey = <div>
<diddy
</div>;
~~
!!! error TS1003: Identifier expected.
function noClose() { }
var donkey = <div>
<diddy<boolean>
~~~~~~~
!!! error TS2558: Expected 0 type arguments, but got 1.
</div>;
~~
!!! error TS1003: Identifier expected.
function noCloseTypeArg() { }
var donkey = <div>
<diddy bananas="please"
</div>;
~~
!!! error TS1003: Identifier expected.
function noCloseAttrs() { }
var donkey = <div>
<diddy<boolean> bananas="please"
~~~~~~~
!!! error TS2558: Expected 0 type arguments, but got 1.
</div>;
~~
!!! error TS1003: Identifier expected.
function noCloseTypeArgAttrs() { }
var donkey = <div>
<diddy/
</div>;
~~
!!! error TS1005: '>' expected.
function noCloseBracket() { }
var donkey = <div>
<diddy<boolean> bananas="please"/
~~~~~~~
!!! error TS2558: Expected 0 type arguments, but got 1.
</div>;
~~
!!! error TS1005: '>' expected.
function noCloseBracketTypeArgAttrs() { }
var donkey = <div>
<diddy>
~~~~~
!!! error TS17008: JSX element 'diddy' has no corresponding closing tag.
</div>;
function noSelfclose() { }
var donkey = <div>
<diddy<boolean> bananas="please">
~~~~~
!!! error TS17008: JSX element 'diddy' has no corresponding closing tag.
~~~~~~~
!!! error TS2558: Expected 0 type arguments, but got 1.
</div>;
function noSelfcloseTypeArgAttrs() { }
var donkey = <div>
<
<diddy/>
~
!!! error TS1003: Identifier expected.
~~~~~
!!! error TS2749: 'diddy' refers to a value, but is being used as a type here. Did you mean 'typeof diddy'?
~
!!! error TS1005: '>' expected.
</div>;
function noNameTrailingTag() { }
var donkey = <div>
<diddy
<diddy/>
~~~~~
!!! error TS2558: Expected 0 type arguments, but got 1.
~~~~~
!!! error TS2749: 'diddy' refers to a value, but is being used as a type here. Did you mean 'typeof diddy'?
~
!!! error TS1005: '>' expected.
</div>;
function noCloseTrailingTag() { }
var donkey = <div>
<diddy<boolean>
~~~~~~~
!!! error TS2558: Expected 0 type arguments, but got 1.
<diddy/>
~
!!! error TS1003: Identifier expected.
</div>;
function noCloseTypeArgTrailingTag() { }
var donkey = <div>
<diddy bananas="please"
<diddy/>
~
!!! error TS1003: Identifier expected.
</div>;
function noCloseAttrsTrailingTag() { }
var donkey = <div>
<diddy<boolean> bananas="please"
~~~~~~~
!!! error TS2558: Expected 0 type arguments, but got 1.
<diddy/>
~
!!! error TS1003: Identifier expected.
</div>;
function noCloseTypeArgAttrsTrailingTag() { }
var donkey = <div>
<diddy/
<diddy/>
~
!!! error TS1005: '>' expected.
</div>;
function noCloseBracketTrailingTag() { }
var donkey = <div>
<diddy<boolean> bananas="please"/
~~~~~~~
!!! error TS2558: Expected 0 type arguments, but got 1.
<diddy/>
~
!!! error TS1005: '>' expected.
</div>;
function noCloseBracketTypeArgAttrsTrailingTag() { }
var donkey = <div>
<diddy>
~~~~~
!!! error TS17008: JSX element 'diddy' has no corresponding closing tag.
<diddy/>
</div>;
function noSelfcloseTrailingTag() { }
var donkey = <div>
<diddy<boolean> bananas="please">
~~~~~
!!! error TS17008: JSX element 'diddy' has no corresponding closing tag.
~~~~~~~
!!! error TS2558: Expected 0 type arguments, but got 1.
<diddy/>
</div>;
function noSelfcloseTypeArgAttrsTrailingTag() { }
var donkey = <div>
<
Cranky Wrinkly Funky
~~~~~~
!!! error TS2304: Cannot find name 'Cranky'.
</div>;
~~
!!! error TS1003: Identifier expected.
function noNameTrailingText() { }
var donkey = <div>
<diddy
Cranky Wrinkly Funky
</div>;
~~
!!! error TS1003: Identifier expected.
function noCloseTrailingText() { }
var donkey = <div>
<diddy<boolean>
~~~~~~~
!!! error TS2558: Expected 0 type arguments, but got 1.
Cranky Wrinkly Funky
</div>;
~~
!!! error TS1003: Identifier expected.
function noCloseTypeArgTrailingText() { }
var donkey = <div>
<diddy bananas="please"
Cranky Wrinkly Funky
</div>;
~~
!!! error TS1003: Identifier expected.
function noCloseAttrsTrailingText() { }
var donkey = <div>
<diddy<boolean> bananas="please"
~~~~~~~
!!! error TS2558: Expected 0 type arguments, but got 1.
Cranky Wrinkly Funky
</div>;
~~
!!! error TS1003: Identifier expected.
function noCloseTypeArgAttrsTrailingText() { }
var donkey = <div>
<diddy/
Cranky Wrinkly Funky
~~~~~~
!!! error TS1005: '>' expected.
</div>;
function noCloseBracketTrailingText() { }
var donkey = <div>
<diddy<boolean> bananas="please"/
~~~~~~~
!!! error TS2558: Expected 0 type arguments, but got 1.
Cranky Wrinkly Funky
~~~~~~
!!! error TS1005: '>' expected.
</div>;
function noCloseBracketTypeArgAttrsTrailingText() { }
var donkey = <div>
<diddy>
~~~~~
!!! error TS17008: JSX element 'diddy' has no corresponding closing tag.
Cranky Wrinkly Funky
</div>;
function noSelfcloseTrailingText() { }
var donkey = <div>
<diddy<boolean> bananas="please">
~~~~~
!!! error TS17008: JSX element 'diddy' has no corresponding closing tag.
~~~~~~~
!!! error TS2558: Expected 0 type arguments, but got 1.
Cranky Wrinkly Funky
</div>;
function noSelfcloseTypeArgAttrsTrailingText() { }
@@ -0,0 +1,277 @@
//// [jsxParserRecovery.tsx]
// should have no errors here; all these functions should parse and resolve
noName(); noClose(); noCloseTypeArg(); noCloseAttrs(); noCloseTypeArgAttrs(); noCloseBracket(); noCloseBracketTypeArgAttrs(); noSelfclose(); noSelfcloseTypeArgAttrs();
noNameTrailingTag(); noCloseTrailingTag(); noCloseTypeArgTrailingTag(); noCloseAttrsTrailingTag(); noCloseTypeArgAttrsTrailingTag(); noCloseBracketTrailingTag(); noCloseBracketTypeArgAttrsTrailingTag(); // noSelfcloseTrailingTag(); noSelfcloseTypeArgAttrsTrailingTag();
noNameTrailingText(); noCloseTrailingText(); noCloseTypeArgTrailingText(); noCloseAttrsTrailingText(); noCloseTypeArgAttrsTrailingText(); noCloseBracketTrailingText(); noCloseBracketTypeArgAttrsTrailingText(); // noSelfcloseTrailingText(); noSelfcloseTypeArgAttrsTrailingText();
function diddy() {
return null;
}
var donkey = <div>
<
</div>;
function noName() { }
var donkey = <div>
<diddy
</div>;
function noClose() { }
var donkey = <div>
<diddy<boolean>
</div>;
function noCloseTypeArg() { }
var donkey = <div>
<diddy bananas="please"
</div>;
function noCloseAttrs() { }
var donkey = <div>
<diddy<boolean> bananas="please"
</div>;
function noCloseTypeArgAttrs() { }
var donkey = <div>
<diddy/
</div>;
function noCloseBracket() { }
var donkey = <div>
<diddy<boolean> bananas="please"/
</div>;
function noCloseBracketTypeArgAttrs() { }
var donkey = <div>
<diddy>
</div>;
function noSelfclose() { }
var donkey = <div>
<diddy<boolean> bananas="please">
</div>;
function noSelfcloseTypeArgAttrs() { }
var donkey = <div>
<
<diddy/>
</div>;
function noNameTrailingTag() { }
var donkey = <div>
<diddy
<diddy/>
</div>;
function noCloseTrailingTag() { }
var donkey = <div>
<diddy<boolean>
<diddy/>
</div>;
function noCloseTypeArgTrailingTag() { }
var donkey = <div>
<diddy bananas="please"
<diddy/>
</div>;
function noCloseAttrsTrailingTag() { }
var donkey = <div>
<diddy<boolean> bananas="please"
<diddy/>
</div>;
function noCloseTypeArgAttrsTrailingTag() { }
var donkey = <div>
<diddy/
<diddy/>
</div>;
function noCloseBracketTrailingTag() { }
var donkey = <div>
<diddy<boolean> bananas="please"/
<diddy/>
</div>;
function noCloseBracketTypeArgAttrsTrailingTag() { }
var donkey = <div>
<diddy>
<diddy/>
</div>;
function noSelfcloseTrailingTag() { }
var donkey = <div>
<diddy<boolean> bananas="please">
<diddy/>
</div>;
function noSelfcloseTypeArgAttrsTrailingTag() { }
var donkey = <div>
<
Cranky Wrinkly Funky
</div>;
function noNameTrailingText() { }
var donkey = <div>
<diddy
Cranky Wrinkly Funky
</div>;
function noCloseTrailingText() { }
var donkey = <div>
<diddy<boolean>
Cranky Wrinkly Funky
</div>;
function noCloseTypeArgTrailingText() { }
var donkey = <div>
<diddy bananas="please"
Cranky Wrinkly Funky
</div>;
function noCloseAttrsTrailingText() { }
var donkey = <div>
<diddy<boolean> bananas="please"
Cranky Wrinkly Funky
</div>;
function noCloseTypeArgAttrsTrailingText() { }
var donkey = <div>
<diddy/
Cranky Wrinkly Funky
</div>;
function noCloseBracketTrailingText() { }
var donkey = <div>
<diddy<boolean> bananas="please"/
Cranky Wrinkly Funky
</div>;
function noCloseBracketTypeArgAttrsTrailingText() { }
var donkey = <div>
<diddy>
Cranky Wrinkly Funky
</div>;
function noSelfcloseTrailingText() { }
var donkey = <div>
<diddy<boolean> bananas="please">
Cranky Wrinkly Funky
</div>;
function noSelfcloseTypeArgAttrsTrailingText() { }
//// [jsxParserRecovery.jsx]
// should have no errors here; all these functions should parse and resolve
noName();
noClose();
noCloseTypeArg();
noCloseAttrs();
noCloseTypeArgAttrs();
noCloseBracket();
noCloseBracketTypeArgAttrs();
noSelfclose();
noSelfcloseTypeArgAttrs();
noNameTrailingTag();
noCloseTrailingTag();
noCloseTypeArgTrailingTag();
noCloseAttrsTrailingTag();
noCloseTypeArgAttrsTrailingTag();
noCloseBracketTrailingTag();
noCloseBracketTypeArgAttrsTrailingTag(); // noSelfcloseTrailingTag(); noSelfcloseTypeArgAttrsTrailingTag();
noNameTrailingText();
noCloseTrailingText();
noCloseTypeArgTrailingText();
noCloseAttrsTrailingText();
noCloseTypeArgAttrsTrailingText();
noCloseBracketTrailingText();
noCloseBracketTypeArgAttrsTrailingText(); // noSelfcloseTrailingText(); noSelfcloseTypeArgAttrsTrailingText();
function diddy() {
return null;
}
var donkey = <div>
< />
</div>;
function noName() { }
var donkey = <div>
<diddy />
</div>;
function noClose() { }
var donkey = <div>
<diddy />
</div>;
function noCloseTypeArg() { }
var donkey = <div>
<diddy bananas="please"/>
</div>;
function noCloseAttrs() { }
var donkey = <div>
<diddy bananas="please"/>
</div>;
function noCloseTypeArgAttrs() { }
var donkey = <div>
<diddy />
</div>;
function noCloseBracket() { }
var donkey = <div>
<diddy bananas="please"/>
</div>;
function noCloseBracketTypeArgAttrs() { }
var donkey = <div>
<diddy></></div>;
function noSelfclose() { }
var donkey = <div>
<diddy bananas="please"></></div>;
function noSelfcloseTypeArgAttrs() { }
var donkey = <div>
< />
</div>;
function noNameTrailingTag() { }
var donkey = <div>
<diddy />
</div>;
function noCloseTrailingTag() { }
var donkey = <div>
<diddy />
<diddy />
</div>;
function noCloseTypeArgTrailingTag() { }
var donkey = <div>
<diddy bananas="please"/>
<diddy />
</div>;
function noCloseAttrsTrailingTag() { }
var donkey = <div>
<diddy bananas="please"/>
<diddy />
</div>;
function noCloseTypeArgAttrsTrailingTag() { }
var donkey = <div>
<diddy />
<diddy />
</div>;
function noCloseBracketTrailingTag() { }
var donkey = <div>
<diddy bananas="please"/>
<diddy />
</div>;
function noCloseBracketTypeArgAttrsTrailingTag() { }
var donkey = <div>
<diddy></></div>;
function noSelfcloseTrailingTag() { }
var donkey = <div>
<diddy bananas="please"></></div>;
function noSelfcloseTypeArgAttrsTrailingTag() { }
var donkey = <div>
<Cranky Wrinkly Funky/>
</div>;
function noNameTrailingText() { }
var donkey = <div>
<diddy Cranky Wrinkly Funky/>
</div>;
function noCloseTrailingText() { }
var donkey = <div>
<diddy Cranky Wrinkly Funky/>
</div>;
function noCloseTypeArgTrailingText() { }
var donkey = <div>
<diddy bananas="please" Cranky Wrinkly Funky/>
</div>;
function noCloseAttrsTrailingText() { }
var donkey = <div>
<diddy bananas="please" Cranky Wrinkly Funky/>
</div>;
function noCloseTypeArgAttrsTrailingText() { }
var donkey = <div>
<diddy />
Cranky Wrinkly Funky
</div>;
function noCloseBracketTrailingText() { }
var donkey = <div>
<diddy bananas="please"/>
Cranky Wrinkly Funky
</div>;
function noCloseBracketTypeArgAttrsTrailingText() { }
var donkey = <div>
<diddy></></div>;
function noSelfcloseTrailingText() { }
var donkey = <div>
<diddy bananas="please"></></div>;
function noSelfcloseTypeArgAttrsTrailingText() { }
@@ -0,0 +1,314 @@
=== tests/cases/conformance/jsx/jsxParserRecovery.tsx ===
// should have no errors here; all these functions should parse and resolve
noName(); noClose(); noCloseTypeArg(); noCloseAttrs(); noCloseTypeArgAttrs(); noCloseBracket(); noCloseBracketTypeArgAttrs(); noSelfclose(); noSelfcloseTypeArgAttrs();
>noName : Symbol(noName, Decl(jsxParserRecovery.tsx, 11, 7))
>noClose : Symbol(noClose, Decl(jsxParserRecovery.tsx, 15, 7))
>noCloseTypeArg : Symbol(noCloseTypeArg, Decl(jsxParserRecovery.tsx, 19, 7))
>noCloseAttrs : Symbol(noCloseAttrs, Decl(jsxParserRecovery.tsx, 23, 7))
>noCloseTypeArgAttrs : Symbol(noCloseTypeArgAttrs, Decl(jsxParserRecovery.tsx, 27, 7))
>noCloseBracket : Symbol(noCloseBracket, Decl(jsxParserRecovery.tsx, 31, 7))
>noCloseBracketTypeArgAttrs : Symbol(noCloseBracketTypeArgAttrs, Decl(jsxParserRecovery.tsx, 35, 7))
>noSelfclose : Symbol(noSelfclose, Decl(jsxParserRecovery.tsx, 39, 7))
>noSelfcloseTypeArgAttrs : Symbol(noSelfcloseTypeArgAttrs, Decl(jsxParserRecovery.tsx, 43, 7))
noNameTrailingTag(); noCloseTrailingTag(); noCloseTypeArgTrailingTag(); noCloseAttrsTrailingTag(); noCloseTypeArgAttrsTrailingTag(); noCloseBracketTrailingTag(); noCloseBracketTypeArgAttrsTrailingTag(); // noSelfcloseTrailingTag(); noSelfcloseTypeArgAttrsTrailingTag();
>noNameTrailingTag : Symbol(noNameTrailingTag, Decl(jsxParserRecovery.tsx, 49, 7))
>noCloseTrailingTag : Symbol(noCloseTrailingTag, Decl(jsxParserRecovery.tsx, 54, 7))
>noCloseTypeArgTrailingTag : Symbol(noCloseTypeArgTrailingTag, Decl(jsxParserRecovery.tsx, 59, 7))
>noCloseAttrsTrailingTag : Symbol(noCloseAttrsTrailingTag, Decl(jsxParserRecovery.tsx, 64, 7))
>noCloseTypeArgAttrsTrailingTag : Symbol(noCloseTypeArgAttrsTrailingTag, Decl(jsxParserRecovery.tsx, 69, 7))
>noCloseBracketTrailingTag : Symbol(noCloseBracketTrailingTag, Decl(jsxParserRecovery.tsx, 74, 7))
>noCloseBracketTypeArgAttrsTrailingTag : Symbol(noCloseBracketTypeArgAttrsTrailingTag, Decl(jsxParserRecovery.tsx, 79, 7))
noNameTrailingText(); noCloseTrailingText(); noCloseTypeArgTrailingText(); noCloseAttrsTrailingText(); noCloseTypeArgAttrsTrailingText(); noCloseBracketTrailingText(); noCloseBracketTypeArgAttrsTrailingText(); // noSelfcloseTrailingText(); noSelfcloseTypeArgAttrsTrailingText();
>noNameTrailingText : Symbol(noNameTrailingText, Decl(jsxParserRecovery.tsx, 95, 7))
>noCloseTrailingText : Symbol(noCloseTrailingText, Decl(jsxParserRecovery.tsx, 100, 7))
>noCloseTypeArgTrailingText : Symbol(noCloseTypeArgTrailingText, Decl(jsxParserRecovery.tsx, 105, 7))
>noCloseAttrsTrailingText : Symbol(noCloseAttrsTrailingText, Decl(jsxParserRecovery.tsx, 110, 7))
>noCloseTypeArgAttrsTrailingText : Symbol(noCloseTypeArgAttrsTrailingText, Decl(jsxParserRecovery.tsx, 115, 7))
>noCloseBracketTrailingText : Symbol(noCloseBracketTrailingText, Decl(jsxParserRecovery.tsx, 120, 7))
>noCloseBracketTypeArgAttrsTrailingText : Symbol(noCloseBracketTypeArgAttrsTrailingText, Decl(jsxParserRecovery.tsx, 125, 7))
function diddy() {
>diddy : Symbol(diddy, Decl(jsxParserRecovery.tsx, 3, 209))
return null;
}
var donkey = <div>
>donkey : Symbol(donkey, Decl(jsxParserRecovery.tsx, 9, 3), Decl(jsxParserRecovery.tsx, 13, 3), Decl(jsxParserRecovery.tsx, 17, 3), Decl(jsxParserRecovery.tsx, 21, 3), Decl(jsxParserRecovery.tsx, 25, 3) ... and 22 more)
<
</div>;
function noName() { }
>noName : Symbol(noName, Decl(jsxParserRecovery.tsx, 11, 7))
var donkey = <div>
>donkey : Symbol(donkey, Decl(jsxParserRecovery.tsx, 9, 3), Decl(jsxParserRecovery.tsx, 13, 3), Decl(jsxParserRecovery.tsx, 17, 3), Decl(jsxParserRecovery.tsx, 21, 3), Decl(jsxParserRecovery.tsx, 25, 3) ... and 22 more)
<diddy
</div>;
function noClose() { }
>noClose : Symbol(noClose, Decl(jsxParserRecovery.tsx, 15, 7))
var donkey = <div>
>donkey : Symbol(donkey, Decl(jsxParserRecovery.tsx, 9, 3), Decl(jsxParserRecovery.tsx, 13, 3), Decl(jsxParserRecovery.tsx, 17, 3), Decl(jsxParserRecovery.tsx, 21, 3), Decl(jsxParserRecovery.tsx, 25, 3) ... and 22 more)
<diddy<boolean>
</div>;
function noCloseTypeArg() { }
>noCloseTypeArg : Symbol(noCloseTypeArg, Decl(jsxParserRecovery.tsx, 19, 7))
var donkey = <div>
>donkey : Symbol(donkey, Decl(jsxParserRecovery.tsx, 9, 3), Decl(jsxParserRecovery.tsx, 13, 3), Decl(jsxParserRecovery.tsx, 17, 3), Decl(jsxParserRecovery.tsx, 21, 3), Decl(jsxParserRecovery.tsx, 25, 3) ... and 22 more)
<diddy bananas="please"
>bananas : Symbol(bananas, Decl(jsxParserRecovery.tsx, 22, 10))
</div>;
function noCloseAttrs() { }
>noCloseAttrs : Symbol(noCloseAttrs, Decl(jsxParserRecovery.tsx, 23, 7))
var donkey = <div>
>donkey : Symbol(donkey, Decl(jsxParserRecovery.tsx, 9, 3), Decl(jsxParserRecovery.tsx, 13, 3), Decl(jsxParserRecovery.tsx, 17, 3), Decl(jsxParserRecovery.tsx, 21, 3), Decl(jsxParserRecovery.tsx, 25, 3) ... and 22 more)
<diddy<boolean> bananas="please"
>bananas : Symbol(bananas, Decl(jsxParserRecovery.tsx, 26, 19))
</div>;
function noCloseTypeArgAttrs() { }
>noCloseTypeArgAttrs : Symbol(noCloseTypeArgAttrs, Decl(jsxParserRecovery.tsx, 27, 7))
var donkey = <div>
>donkey : Symbol(donkey, Decl(jsxParserRecovery.tsx, 9, 3), Decl(jsxParserRecovery.tsx, 13, 3), Decl(jsxParserRecovery.tsx, 17, 3), Decl(jsxParserRecovery.tsx, 21, 3), Decl(jsxParserRecovery.tsx, 25, 3) ... and 22 more)
<diddy/
</div>;
function noCloseBracket() { }
>noCloseBracket : Symbol(noCloseBracket, Decl(jsxParserRecovery.tsx, 31, 7))
var donkey = <div>
>donkey : Symbol(donkey, Decl(jsxParserRecovery.tsx, 9, 3), Decl(jsxParserRecovery.tsx, 13, 3), Decl(jsxParserRecovery.tsx, 17, 3), Decl(jsxParserRecovery.tsx, 21, 3), Decl(jsxParserRecovery.tsx, 25, 3) ... and 22 more)
<diddy<boolean> bananas="please"/
>bananas : Symbol(bananas, Decl(jsxParserRecovery.tsx, 34, 19))
</div>;
function noCloseBracketTypeArgAttrs() { }
>noCloseBracketTypeArgAttrs : Symbol(noCloseBracketTypeArgAttrs, Decl(jsxParserRecovery.tsx, 35, 7))
var donkey = <div>
>donkey : Symbol(donkey, Decl(jsxParserRecovery.tsx, 9, 3), Decl(jsxParserRecovery.tsx, 13, 3), Decl(jsxParserRecovery.tsx, 17, 3), Decl(jsxParserRecovery.tsx, 21, 3), Decl(jsxParserRecovery.tsx, 25, 3) ... and 22 more)
<diddy>
</div>;
function noSelfclose() { }
>noSelfclose : Symbol(noSelfclose, Decl(jsxParserRecovery.tsx, 39, 7))
var donkey = <div>
>donkey : Symbol(donkey, Decl(jsxParserRecovery.tsx, 9, 3), Decl(jsxParserRecovery.tsx, 13, 3), Decl(jsxParserRecovery.tsx, 17, 3), Decl(jsxParserRecovery.tsx, 21, 3), Decl(jsxParserRecovery.tsx, 25, 3) ... and 22 more)
<diddy<boolean> bananas="please">
>bananas : Symbol(bananas, Decl(jsxParserRecovery.tsx, 42, 19))
</div>;
function noSelfcloseTypeArgAttrs() { }
>noSelfcloseTypeArgAttrs : Symbol(noSelfcloseTypeArgAttrs, Decl(jsxParserRecovery.tsx, 43, 7))
var donkey = <div>
>donkey : Symbol(donkey, Decl(jsxParserRecovery.tsx, 9, 3), Decl(jsxParserRecovery.tsx, 13, 3), Decl(jsxParserRecovery.tsx, 17, 3), Decl(jsxParserRecovery.tsx, 21, 3), Decl(jsxParserRecovery.tsx, 25, 3) ... and 22 more)
<
<diddy/>
</div>;
function noNameTrailingTag() { }
>noNameTrailingTag : Symbol(noNameTrailingTag, Decl(jsxParserRecovery.tsx, 49, 7))
var donkey = <div>
>donkey : Symbol(donkey, Decl(jsxParserRecovery.tsx, 9, 3), Decl(jsxParserRecovery.tsx, 13, 3), Decl(jsxParserRecovery.tsx, 17, 3), Decl(jsxParserRecovery.tsx, 21, 3), Decl(jsxParserRecovery.tsx, 25, 3) ... and 22 more)
<diddy
<diddy/>
</div>;
function noCloseTrailingTag() { }
>noCloseTrailingTag : Symbol(noCloseTrailingTag, Decl(jsxParserRecovery.tsx, 54, 7))
var donkey = <div>
>donkey : Symbol(donkey, Decl(jsxParserRecovery.tsx, 9, 3), Decl(jsxParserRecovery.tsx, 13, 3), Decl(jsxParserRecovery.tsx, 17, 3), Decl(jsxParserRecovery.tsx, 21, 3), Decl(jsxParserRecovery.tsx, 25, 3) ... and 22 more)
<diddy<boolean>
<diddy/>
</div>;
function noCloseTypeArgTrailingTag() { }
>noCloseTypeArgTrailingTag : Symbol(noCloseTypeArgTrailingTag, Decl(jsxParserRecovery.tsx, 59, 7))
var donkey = <div>
>donkey : Symbol(donkey, Decl(jsxParserRecovery.tsx, 9, 3), Decl(jsxParserRecovery.tsx, 13, 3), Decl(jsxParserRecovery.tsx, 17, 3), Decl(jsxParserRecovery.tsx, 21, 3), Decl(jsxParserRecovery.tsx, 25, 3) ... and 22 more)
<diddy bananas="please"
>bananas : Symbol(bananas, Decl(jsxParserRecovery.tsx, 62, 10))
<diddy/>
</div>;
function noCloseAttrsTrailingTag() { }
>noCloseAttrsTrailingTag : Symbol(noCloseAttrsTrailingTag, Decl(jsxParserRecovery.tsx, 64, 7))
var donkey = <div>
>donkey : Symbol(donkey, Decl(jsxParserRecovery.tsx, 9, 3), Decl(jsxParserRecovery.tsx, 13, 3), Decl(jsxParserRecovery.tsx, 17, 3), Decl(jsxParserRecovery.tsx, 21, 3), Decl(jsxParserRecovery.tsx, 25, 3) ... and 22 more)
<diddy<boolean> bananas="please"
>bananas : Symbol(bananas, Decl(jsxParserRecovery.tsx, 67, 19))
<diddy/>
</div>;
function noCloseTypeArgAttrsTrailingTag() { }
>noCloseTypeArgAttrsTrailingTag : Symbol(noCloseTypeArgAttrsTrailingTag, Decl(jsxParserRecovery.tsx, 69, 7))
var donkey = <div>
>donkey : Symbol(donkey, Decl(jsxParserRecovery.tsx, 9, 3), Decl(jsxParserRecovery.tsx, 13, 3), Decl(jsxParserRecovery.tsx, 17, 3), Decl(jsxParserRecovery.tsx, 21, 3), Decl(jsxParserRecovery.tsx, 25, 3) ... and 22 more)
<diddy/
<diddy/>
</div>;
function noCloseBracketTrailingTag() { }
>noCloseBracketTrailingTag : Symbol(noCloseBracketTrailingTag, Decl(jsxParserRecovery.tsx, 74, 7))
var donkey = <div>
>donkey : Symbol(donkey, Decl(jsxParserRecovery.tsx, 9, 3), Decl(jsxParserRecovery.tsx, 13, 3), Decl(jsxParserRecovery.tsx, 17, 3), Decl(jsxParserRecovery.tsx, 21, 3), Decl(jsxParserRecovery.tsx, 25, 3) ... and 22 more)
<diddy<boolean> bananas="please"/
>bananas : Symbol(bananas, Decl(jsxParserRecovery.tsx, 77, 19))
<diddy/>
</div>;
function noCloseBracketTypeArgAttrsTrailingTag() { }
>noCloseBracketTypeArgAttrsTrailingTag : Symbol(noCloseBracketTypeArgAttrsTrailingTag, Decl(jsxParserRecovery.tsx, 79, 7))
var donkey = <div>
>donkey : Symbol(donkey, Decl(jsxParserRecovery.tsx, 9, 3), Decl(jsxParserRecovery.tsx, 13, 3), Decl(jsxParserRecovery.tsx, 17, 3), Decl(jsxParserRecovery.tsx, 21, 3), Decl(jsxParserRecovery.tsx, 25, 3) ... and 22 more)
<diddy>
<diddy/>
</div>;
function noSelfcloseTrailingTag() { }
>noSelfcloseTrailingTag : Symbol(noSelfcloseTrailingTag, Decl(jsxParserRecovery.tsx, 84, 7))
var donkey = <div>
>donkey : Symbol(donkey, Decl(jsxParserRecovery.tsx, 9, 3), Decl(jsxParserRecovery.tsx, 13, 3), Decl(jsxParserRecovery.tsx, 17, 3), Decl(jsxParserRecovery.tsx, 21, 3), Decl(jsxParserRecovery.tsx, 25, 3) ... and 22 more)
<diddy<boolean> bananas="please">
>bananas : Symbol(bananas, Decl(jsxParserRecovery.tsx, 87, 19))
<diddy/>
</div>;
function noSelfcloseTypeArgAttrsTrailingTag() { }
>noSelfcloseTypeArgAttrsTrailingTag : Symbol(noSelfcloseTypeArgAttrsTrailingTag, Decl(jsxParserRecovery.tsx, 89, 7))
var donkey = <div>
>donkey : Symbol(donkey, Decl(jsxParserRecovery.tsx, 9, 3), Decl(jsxParserRecovery.tsx, 13, 3), Decl(jsxParserRecovery.tsx, 17, 3), Decl(jsxParserRecovery.tsx, 21, 3), Decl(jsxParserRecovery.tsx, 25, 3) ... and 22 more)
<
Cranky Wrinkly Funky
>Wrinkly : Symbol(Wrinkly, Decl(jsxParserRecovery.tsx, 94, 10))
>Funky : Symbol(Funky, Decl(jsxParserRecovery.tsx, 94, 18))
</div>;
function noNameTrailingText() { }
>noNameTrailingText : Symbol(noNameTrailingText, Decl(jsxParserRecovery.tsx, 95, 7))
var donkey = <div>
>donkey : Symbol(donkey, Decl(jsxParserRecovery.tsx, 9, 3), Decl(jsxParserRecovery.tsx, 13, 3), Decl(jsxParserRecovery.tsx, 17, 3), Decl(jsxParserRecovery.tsx, 21, 3), Decl(jsxParserRecovery.tsx, 25, 3) ... and 22 more)
<diddy
Cranky Wrinkly Funky
>Cranky : Symbol(Cranky, Decl(jsxParserRecovery.tsx, 98, 10))
>Wrinkly : Symbol(Wrinkly, Decl(jsxParserRecovery.tsx, 99, 10))
>Funky : Symbol(Funky, Decl(jsxParserRecovery.tsx, 99, 18))
</div>;
function noCloseTrailingText() { }
>noCloseTrailingText : Symbol(noCloseTrailingText, Decl(jsxParserRecovery.tsx, 100, 7))
var donkey = <div>
>donkey : Symbol(donkey, Decl(jsxParserRecovery.tsx, 9, 3), Decl(jsxParserRecovery.tsx, 13, 3), Decl(jsxParserRecovery.tsx, 17, 3), Decl(jsxParserRecovery.tsx, 21, 3), Decl(jsxParserRecovery.tsx, 25, 3) ... and 22 more)
<diddy<boolean>
Cranky Wrinkly Funky
>Cranky : Symbol(Cranky, Decl(jsxParserRecovery.tsx, 103, 19))
>Wrinkly : Symbol(Wrinkly, Decl(jsxParserRecovery.tsx, 104, 10))
>Funky : Symbol(Funky, Decl(jsxParserRecovery.tsx, 104, 18))
</div>;
function noCloseTypeArgTrailingText() { }
>noCloseTypeArgTrailingText : Symbol(noCloseTypeArgTrailingText, Decl(jsxParserRecovery.tsx, 105, 7))
var donkey = <div>
>donkey : Symbol(donkey, Decl(jsxParserRecovery.tsx, 9, 3), Decl(jsxParserRecovery.tsx, 13, 3), Decl(jsxParserRecovery.tsx, 17, 3), Decl(jsxParserRecovery.tsx, 21, 3), Decl(jsxParserRecovery.tsx, 25, 3) ... and 22 more)
<diddy bananas="please"
>bananas : Symbol(bananas, Decl(jsxParserRecovery.tsx, 108, 10))
Cranky Wrinkly Funky
>Cranky : Symbol(Cranky, Decl(jsxParserRecovery.tsx, 108, 27))
>Wrinkly : Symbol(Wrinkly, Decl(jsxParserRecovery.tsx, 109, 10))
>Funky : Symbol(Funky, Decl(jsxParserRecovery.tsx, 109, 18))
</div>;
function noCloseAttrsTrailingText() { }
>noCloseAttrsTrailingText : Symbol(noCloseAttrsTrailingText, Decl(jsxParserRecovery.tsx, 110, 7))
var donkey = <div>
>donkey : Symbol(donkey, Decl(jsxParserRecovery.tsx, 9, 3), Decl(jsxParserRecovery.tsx, 13, 3), Decl(jsxParserRecovery.tsx, 17, 3), Decl(jsxParserRecovery.tsx, 21, 3), Decl(jsxParserRecovery.tsx, 25, 3) ... and 22 more)
<diddy<boolean> bananas="please"
>bananas : Symbol(bananas, Decl(jsxParserRecovery.tsx, 113, 19))
Cranky Wrinkly Funky
>Cranky : Symbol(Cranky, Decl(jsxParserRecovery.tsx, 113, 36))
>Wrinkly : Symbol(Wrinkly, Decl(jsxParserRecovery.tsx, 114, 10))
>Funky : Symbol(Funky, Decl(jsxParserRecovery.tsx, 114, 18))
</div>;
function noCloseTypeArgAttrsTrailingText() { }
>noCloseTypeArgAttrsTrailingText : Symbol(noCloseTypeArgAttrsTrailingText, Decl(jsxParserRecovery.tsx, 115, 7))
var donkey = <div>
>donkey : Symbol(donkey, Decl(jsxParserRecovery.tsx, 9, 3), Decl(jsxParserRecovery.tsx, 13, 3), Decl(jsxParserRecovery.tsx, 17, 3), Decl(jsxParserRecovery.tsx, 21, 3), Decl(jsxParserRecovery.tsx, 25, 3) ... and 22 more)
<diddy/
Cranky Wrinkly Funky
</div>;
function noCloseBracketTrailingText() { }
>noCloseBracketTrailingText : Symbol(noCloseBracketTrailingText, Decl(jsxParserRecovery.tsx, 120, 7))
var donkey = <div>
>donkey : Symbol(donkey, Decl(jsxParserRecovery.tsx, 9, 3), Decl(jsxParserRecovery.tsx, 13, 3), Decl(jsxParserRecovery.tsx, 17, 3), Decl(jsxParserRecovery.tsx, 21, 3), Decl(jsxParserRecovery.tsx, 25, 3) ... and 22 more)
<diddy<boolean> bananas="please"/
>bananas : Symbol(bananas, Decl(jsxParserRecovery.tsx, 123, 19))
Cranky Wrinkly Funky
</div>;
function noCloseBracketTypeArgAttrsTrailingText() { }
>noCloseBracketTypeArgAttrsTrailingText : Symbol(noCloseBracketTypeArgAttrsTrailingText, Decl(jsxParserRecovery.tsx, 125, 7))
var donkey = <div>
>donkey : Symbol(donkey, Decl(jsxParserRecovery.tsx, 9, 3), Decl(jsxParserRecovery.tsx, 13, 3), Decl(jsxParserRecovery.tsx, 17, 3), Decl(jsxParserRecovery.tsx, 21, 3), Decl(jsxParserRecovery.tsx, 25, 3) ... and 22 more)
<diddy>
Cranky Wrinkly Funky
</div>;
function noSelfcloseTrailingText() { }
>noSelfcloseTrailingText : Symbol(noSelfcloseTrailingText, Decl(jsxParserRecovery.tsx, 130, 7))
var donkey = <div>
>donkey : Symbol(donkey, Decl(jsxParserRecovery.tsx, 9, 3), Decl(jsxParserRecovery.tsx, 13, 3), Decl(jsxParserRecovery.tsx, 17, 3), Decl(jsxParserRecovery.tsx, 21, 3), Decl(jsxParserRecovery.tsx, 25, 3) ... and 22 more)
<diddy<boolean> bananas="please">
>bananas : Symbol(bananas, Decl(jsxParserRecovery.tsx, 133, 19))
Cranky Wrinkly Funky
</div>;
function noSelfcloseTypeArgAttrsTrailingText() { }
>noSelfcloseTypeArgAttrsTrailingText : Symbol(noSelfcloseTypeArgAttrsTrailingText, Decl(jsxParserRecovery.tsx, 135, 7))
@@ -0,0 +1,541 @@
=== tests/cases/conformance/jsx/jsxParserRecovery.tsx ===
// should have no errors here; all these functions should parse and resolve
noName(); noClose(); noCloseTypeArg(); noCloseAttrs(); noCloseTypeArgAttrs(); noCloseBracket(); noCloseBracketTypeArgAttrs(); noSelfclose(); noSelfcloseTypeArgAttrs();
>noName() : void
>noName : () => void
>noClose() : void
>noClose : () => void
>noCloseTypeArg() : void
>noCloseTypeArg : () => void
>noCloseAttrs() : void
>noCloseAttrs : () => void
>noCloseTypeArgAttrs() : void
>noCloseTypeArgAttrs : () => void
>noCloseBracket() : void
>noCloseBracket : () => void
>noCloseBracketTypeArgAttrs() : void
>noCloseBracketTypeArgAttrs : () => void
>noSelfclose() : void
>noSelfclose : () => void
>noSelfcloseTypeArgAttrs() : void
>noSelfcloseTypeArgAttrs : () => void
noNameTrailingTag(); noCloseTrailingTag(); noCloseTypeArgTrailingTag(); noCloseAttrsTrailingTag(); noCloseTypeArgAttrsTrailingTag(); noCloseBracketTrailingTag(); noCloseBracketTypeArgAttrsTrailingTag(); // noSelfcloseTrailingTag(); noSelfcloseTypeArgAttrsTrailingTag();
>noNameTrailingTag() : void
>noNameTrailingTag : () => void
>noCloseTrailingTag() : void
>noCloseTrailingTag : () => void
>noCloseTypeArgTrailingTag() : void
>noCloseTypeArgTrailingTag : () => void
>noCloseAttrsTrailingTag() : void
>noCloseAttrsTrailingTag : () => void
>noCloseTypeArgAttrsTrailingTag() : void
>noCloseTypeArgAttrsTrailingTag : () => void
>noCloseBracketTrailingTag() : void
>noCloseBracketTrailingTag : () => void
>noCloseBracketTypeArgAttrsTrailingTag() : void
>noCloseBracketTypeArgAttrsTrailingTag : () => void
noNameTrailingText(); noCloseTrailingText(); noCloseTypeArgTrailingText(); noCloseAttrsTrailingText(); noCloseTypeArgAttrsTrailingText(); noCloseBracketTrailingText(); noCloseBracketTypeArgAttrsTrailingText(); // noSelfcloseTrailingText(); noSelfcloseTypeArgAttrsTrailingText();
>noNameTrailingText() : void
>noNameTrailingText : () => void
>noCloseTrailingText() : void
>noCloseTrailingText : () => void
>noCloseTypeArgTrailingText() : void
>noCloseTypeArgTrailingText : () => void
>noCloseAttrsTrailingText() : void
>noCloseAttrsTrailingText : () => void
>noCloseTypeArgAttrsTrailingText() : void
>noCloseTypeArgAttrsTrailingText : () => void
>noCloseBracketTrailingText() : void
>noCloseBracketTrailingText : () => void
>noCloseBracketTypeArgAttrsTrailingText() : void
>noCloseBracketTypeArgAttrsTrailingText : () => void
function diddy() {
>diddy : () => any
return null;
>null : null
}
var donkey = <div>
>donkey : any
><div> <</div> : any
>div : any
<
>< : any
</div>;
> : any
>div : any
function noName() { }
>noName : () => void
var donkey = <div>
>donkey : any
><div> <diddy</div> : any
>div : any
<diddy
><diddy : any
>diddy : () => any
</div>;
>div : any
function noClose() { }
>noClose : () => void
var donkey = <div>
>donkey : any
><div> <diddy<boolean></div> : any
>div : any
<diddy<boolean>
><diddy<boolean> : any
>diddy : () => any
</div>;
>div : any
function noCloseTypeArg() { }
>noCloseTypeArg : () => void
var donkey = <div>
>donkey : any
><div> <diddy bananas="please"</div> : any
>div : any
<diddy bananas="please"
><diddy bananas="please" : any
>diddy : () => any
>bananas : string
</div>;
>div : any
function noCloseAttrs() { }
>noCloseAttrs : () => void
var donkey = <div>
>donkey : any
><div> <diddy<boolean> bananas="please"</div> : any
>div : any
<diddy<boolean> bananas="please"
><diddy<boolean> bananas="please" : any
>diddy : () => any
>bananas : string
</div>;
>div : any
function noCloseTypeArgAttrs() { }
>noCloseTypeArgAttrs : () => void
var donkey = <div>
>donkey : any
><div> <diddy/</div> : any
>div : any
<diddy/
><diddy/ : any
>diddy : () => any
</div>;
>div : any
function noCloseBracket() { }
>noCloseBracket : () => void
var donkey = <div>
>donkey : any
><div> <diddy<boolean> bananas="please"/</div> : any
>div : any
<diddy<boolean> bananas="please"/
><diddy<boolean> bananas="please"/ : any
>diddy : () => any
>bananas : string
</div>;
>div : any
function noCloseBracketTypeArgAttrs() { }
>noCloseBracketTypeArgAttrs : () => void
var donkey = <div>
>donkey : any
><div> <diddy></div> : any
>div : any
<diddy>
><diddy> : any
>diddy : () => any
</div>;
> : any
>div : any
function noSelfclose() { }
>noSelfclose : () => void
var donkey = <div>
>donkey : any
><div> <diddy<boolean> bananas="please"></div> : any
>div : any
<diddy<boolean> bananas="please">
><diddy<boolean> bananas="please"> : any
>diddy : () => any
>bananas : string
</div>;
> : any
>div : any
function noSelfcloseTypeArgAttrs() { }
>noSelfcloseTypeArgAttrs : () => void
var donkey = <div>
>donkey : any
><div> < <diddy/></div> : any
>div : any
<
>< <diddy/> : any
<diddy/>
> : any
</div>;
>div : any
function noNameTrailingTag() { }
>noNameTrailingTag : () => void
var donkey = <div>
>donkey : any
><div> <diddy <diddy/></div> : any
>div : any
<diddy
><diddy <diddy/> : any
>diddy : () => any
<diddy/>
</div>;
>div : any
function noCloseTrailingTag() { }
>noCloseTrailingTag : () => void
var donkey = <div>
>donkey : any
><div> <diddy<boolean> <diddy/></div> : any
>div : any
<diddy<boolean>
><diddy<boolean> : any
>diddy : () => any
<diddy/>
><diddy/> : any
>diddy : () => any
</div>;
>div : any
function noCloseTypeArgTrailingTag() { }
>noCloseTypeArgTrailingTag : () => void
var donkey = <div>
>donkey : any
><div> <diddy bananas="please" <diddy/></div> : any
>div : any
<diddy bananas="please"
><diddy bananas="please" : any
>diddy : () => any
>bananas : string
<diddy/>
><diddy/> : any
>diddy : () => any
</div>;
>div : any
function noCloseAttrsTrailingTag() { }
>noCloseAttrsTrailingTag : () => void
var donkey = <div>
>donkey : any
><div> <diddy<boolean> bananas="please" <diddy/></div> : any
>div : any
<diddy<boolean> bananas="please"
><diddy<boolean> bananas="please" : any
>diddy : () => any
>bananas : string
<diddy/>
><diddy/> : any
>diddy : () => any
</div>;
>div : any
function noCloseTypeArgAttrsTrailingTag() { }
>noCloseTypeArgAttrsTrailingTag : () => void
var donkey = <div>
>donkey : any
><div> <diddy/ <diddy/></div> : any
>div : any
<diddy/
><diddy/ : any
>diddy : () => any
<diddy/>
><diddy/> : any
>diddy : () => any
</div>;
>div : any
function noCloseBracketTrailingTag() { }
>noCloseBracketTrailingTag : () => void
var donkey = <div>
>donkey : any
><div> <diddy<boolean> bananas="please"/ <diddy/></div> : any
>div : any
<diddy<boolean> bananas="please"/
><diddy<boolean> bananas="please"/ : any
>diddy : () => any
>bananas : string
<diddy/>
><diddy/> : any
>diddy : () => any
</div>;
>div : any
function noCloseBracketTypeArgAttrsTrailingTag() { }
>noCloseBracketTypeArgAttrsTrailingTag : () => void
var donkey = <div>
>donkey : any
><div> <diddy> <diddy/></div> : any
>div : any
<diddy>
><diddy> : any
>diddy : () => any
<diddy/>
> : any
</div>;
>div : any
function noSelfcloseTrailingTag() { }
>noSelfcloseTrailingTag : () => void
var donkey = <div>
>donkey : any
><div> <diddy<boolean> bananas="please"> <diddy/></div> : any
>div : any
<diddy<boolean> bananas="please">
><diddy<boolean> bananas="please"> : any
>diddy : () => any
>bananas : string
<diddy/>
> : any
</div>;
>div : any
function noSelfcloseTypeArgAttrsTrailingTag() { }
>noSelfcloseTypeArgAttrsTrailingTag : () => void
var donkey = <div>
>donkey : any
><div> < Cranky Wrinkly Funky</div> : any
>div : any
<
>< Cranky Wrinkly Funky : any
Cranky Wrinkly Funky
>Cranky : any
>Wrinkly : true
>Funky : true
</div>;
>div : any
function noNameTrailingText() { }
>noNameTrailingText : () => void
var donkey = <div>
>donkey : any
><div> <diddy Cranky Wrinkly Funky</div> : any
>div : any
<diddy
><diddy Cranky Wrinkly Funky : any
>diddy : () => any
Cranky Wrinkly Funky
>Cranky : true
>Wrinkly : true
>Funky : true
</div>;
>div : any
function noCloseTrailingText() { }
>noCloseTrailingText : () => void
var donkey = <div>
>donkey : any
><div> <diddy<boolean> Cranky Wrinkly Funky</div> : any
>div : any
<diddy<boolean>
><diddy<boolean> Cranky Wrinkly Funky : any
>diddy : () => any
Cranky Wrinkly Funky
>Cranky : true
>Wrinkly : true
>Funky : true
</div>;
>div : any
function noCloseTypeArgTrailingText() { }
>noCloseTypeArgTrailingText : () => void
var donkey = <div>
>donkey : any
><div> <diddy bananas="please" Cranky Wrinkly Funky</div> : any
>div : any
<diddy bananas="please"
><diddy bananas="please" Cranky Wrinkly Funky : any
>diddy : () => any
>bananas : string
Cranky Wrinkly Funky
>Cranky : true
>Wrinkly : true
>Funky : true
</div>;
>div : any
function noCloseAttrsTrailingText() { }
>noCloseAttrsTrailingText : () => void
var donkey = <div>
>donkey : any
><div> <diddy<boolean> bananas="please" Cranky Wrinkly Funky</div> : any
>div : any
<diddy<boolean> bananas="please"
><diddy<boolean> bananas="please" Cranky Wrinkly Funky : any
>diddy : () => any
>bananas : string
Cranky Wrinkly Funky
>Cranky : true
>Wrinkly : true
>Funky : true
</div>;
>div : any
function noCloseTypeArgAttrsTrailingText() { }
>noCloseTypeArgAttrsTrailingText : () => void
var donkey = <div>
>donkey : any
><div> <diddy/ Cranky Wrinkly Funky</div> : any
>div : any
<diddy/
><diddy/ : any
>diddy : () => any
Cranky Wrinkly Funky
</div>;
>div : any
function noCloseBracketTrailingText() { }
>noCloseBracketTrailingText : () => void
var donkey = <div>
>donkey : any
><div> <diddy<boolean> bananas="please"/ Cranky Wrinkly Funky</div> : any
>div : any
<diddy<boolean> bananas="please"/
><diddy<boolean> bananas="please"/ : any
>diddy : () => any
>bananas : string
Cranky Wrinkly Funky
</div>;
>div : any
function noCloseBracketTypeArgAttrsTrailingText() { }
>noCloseBracketTypeArgAttrsTrailingText : () => void
var donkey = <div>
>donkey : any
><div> <diddy> Cranky Wrinkly Funky</div> : any
>div : any
<diddy>
><diddy> : any
>diddy : () => any
Cranky Wrinkly Funky
> : any
</div>;
>div : any
function noSelfcloseTrailingText() { }
>noSelfcloseTrailingText : () => void
var donkey = <div>
>donkey : any
><div> <diddy<boolean> bananas="please"> Cranky Wrinkly Funky</div> : any
>div : any
<diddy<boolean> bananas="please">
><diddy<boolean> bananas="please"> : any
>diddy : () => any
>bananas : string
Cranky Wrinkly Funky
> : any
</div>;
>div : any
function noSelfcloseTypeArgAttrsTrailingText() { }
>noSelfcloseTypeArgAttrsTrailingText : () => void
@@ -0,0 +1,140 @@
// @Filename: jsxParserRecovery.tsx
// @jsx: preserve
// should have no errors here; all these functions should parse and resolve
noName(); noClose(); noCloseTypeArg(); noCloseAttrs(); noCloseTypeArgAttrs(); noCloseBracket(); noCloseBracketTypeArgAttrs(); noSelfclose(); noSelfcloseTypeArgAttrs();
noNameTrailingTag(); noCloseTrailingTag(); noCloseTypeArgTrailingTag(); noCloseAttrsTrailingTag(); noCloseTypeArgAttrsTrailingTag(); noCloseBracketTrailingTag(); noCloseBracketTypeArgAttrsTrailingTag(); // noSelfcloseTrailingTag(); noSelfcloseTypeArgAttrsTrailingTag();
noNameTrailingText(); noCloseTrailingText(); noCloseTypeArgTrailingText(); noCloseAttrsTrailingText(); noCloseTypeArgAttrsTrailingText(); noCloseBracketTrailingText(); noCloseBracketTypeArgAttrsTrailingText(); // noSelfcloseTrailingText(); noSelfcloseTypeArgAttrsTrailingText();
function diddy() {
return null;
}
var donkey = <div>
<
</div>;
function noName() { }
var donkey = <div>
<diddy
</div>;
function noClose() { }
var donkey = <div>
<diddy<boolean>
</div>;
function noCloseTypeArg() { }
var donkey = <div>
<diddy bananas="please"
</div>;
function noCloseAttrs() { }
var donkey = <div>
<diddy<boolean> bananas="please"
</div>;
function noCloseTypeArgAttrs() { }
var donkey = <div>
<diddy/
</div>;
function noCloseBracket() { }
var donkey = <div>
<diddy<boolean> bananas="please"/
</div>;
function noCloseBracketTypeArgAttrs() { }
var donkey = <div>
<diddy>
</div>;
function noSelfclose() { }
var donkey = <div>
<diddy<boolean> bananas="please">
</div>;
function noSelfcloseTypeArgAttrs() { }
var donkey = <div>
<
<diddy/>
</div>;
function noNameTrailingTag() { }
var donkey = <div>
<diddy
<diddy/>
</div>;
function noCloseTrailingTag() { }
var donkey = <div>
<diddy<boolean>
<diddy/>
</div>;
function noCloseTypeArgTrailingTag() { }
var donkey = <div>
<diddy bananas="please"
<diddy/>
</div>;
function noCloseAttrsTrailingTag() { }
var donkey = <div>
<diddy<boolean> bananas="please"
<diddy/>
</div>;
function noCloseTypeArgAttrsTrailingTag() { }
var donkey = <div>
<diddy/
<diddy/>
</div>;
function noCloseBracketTrailingTag() { }
var donkey = <div>
<diddy<boolean> bananas="please"/
<diddy/>
</div>;
function noCloseBracketTypeArgAttrsTrailingTag() { }
var donkey = <div>
<diddy>
<diddy/>
</div>;
function noSelfcloseTrailingTag() { }
var donkey = <div>
<diddy<boolean> bananas="please">
<diddy/>
</div>;
function noSelfcloseTypeArgAttrsTrailingTag() { }
var donkey = <div>
<
Cranky Wrinkly Funky
</div>;
function noNameTrailingText() { }
var donkey = <div>
<diddy
Cranky Wrinkly Funky
</div>;
function noCloseTrailingText() { }
var donkey = <div>
<diddy<boolean>
Cranky Wrinkly Funky
</div>;
function noCloseTypeArgTrailingText() { }
var donkey = <div>
<diddy bananas="please"
Cranky Wrinkly Funky
</div>;
function noCloseAttrsTrailingText() { }
var donkey = <div>
<diddy<boolean> bananas="please"
Cranky Wrinkly Funky
</div>;
function noCloseTypeArgAttrsTrailingText() { }
var donkey = <div>
<diddy/
Cranky Wrinkly Funky
</div>;
function noCloseBracketTrailingText() { }
var donkey = <div>
<diddy<boolean> bananas="please"/
Cranky Wrinkly Funky
</div>;
function noCloseBracketTypeArgAttrsTrailingText() { }
var donkey = <div>
<diddy>
Cranky Wrinkly Funky
</div>;
function noSelfcloseTrailingText() { }
var donkey = <div>
<diddy<boolean> bananas="please">
Cranky Wrinkly Funky
</div>;
function noSelfcloseTypeArgAttrsTrailingText() { }