Skip to content

Commit 0c6ef34

Browse files
author
Andy
authored
Simplify parseJsxChildren (microsoft#22511)
1 parent 85df31c commit 0c6ef34

File tree

5 files changed

+41
-37
lines changed

5 files changed

+41
-37
lines changed

src/compiler/parser.ts

Lines changed: 22 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -4119,17 +4119,32 @@ namespace ts {
41194119
return finishNode(node);
41204120
}
41214121

4122-
function parseJsxChild(): JsxChild {
4123-
switch (token()) {
4122+
function parseJsxChild(openingTag: JsxOpeningElement | JsxOpeningFragment, token: JsxTokenSyntaxKind): JsxChild | undefined {
4123+
switch (token) {
4124+
case SyntaxKind.EndOfFileToken:
4125+
// If we hit EOF, issue the error at the tag that lacks the closing element
4126+
// rather than at the end of the file (which is useless)
4127+
if (isJsxOpeningFragment(openingTag)) {
4128+
parseErrorAtPosition(openingTag.pos, openingTag.end - openingTag.pos, Diagnostics.JSX_fragment_has_no_corresponding_closing_tag);
4129+
}
4130+
else {
4131+
const openingTagName = openingTag.tagName;
4132+
parseErrorAtPosition(openingTagName.pos, openingTagName.end - openingTagName.pos, Diagnostics.JSX_element_0_has_no_corresponding_closing_tag, getTextOfNodeFromSourceText(sourceText, openingTagName));
4133+
}
4134+
return undefined;
4135+
case SyntaxKind.LessThanSlashToken:
4136+
case SyntaxKind.ConflictMarkerTrivia:
4137+
return undefined;
41244138
case SyntaxKind.JsxText:
41254139
case SyntaxKind.JsxTextAllWhiteSpaces:
41264140
return parseJsxText();
41274141
case SyntaxKind.OpenBraceToken:
4128-
return parseJsxExpression(/*inExpressionContext*/ false)!;
4142+
return parseJsxExpression(/*inExpressionContext*/ false);
41294143
case SyntaxKind.LessThanToken:
41304144
return parseJsxElementOrSelfClosingElementOrFragment(/*inExpressionContext*/ false);
4145+
default:
4146+
return Debug.assertNever(token);
41314147
}
4132-
Debug.fail("Unknown JSX child kind " + token());
41334148
}
41344149

41354150
function parseJsxChildren(openingTag: JsxOpeningElement | JsxOpeningFragment): NodeArray<JsxChild> {
@@ -4139,34 +4154,12 @@ namespace ts {
41394154
parsingContext |= 1 << ParsingContext.JsxChildren;
41404155

41414156
while (true) {
4142-
currentToken = scanner.reScanJsxToken();
4143-
if (token() === SyntaxKind.LessThanSlashToken) {
4144-
// Closing tag
4145-
break;
4146-
}
4147-
else if (token() === SyntaxKind.EndOfFileToken) {
4148-
// If we hit EOF, issue the error at the tag that lacks the closing element
4149-
// rather than at the end of the file (which is useless)
4150-
if (isJsxOpeningFragment(openingTag)) {
4151-
parseErrorAtPosition(openingTag.pos, openingTag.end - openingTag.pos, Diagnostics.JSX_fragment_has_no_corresponding_closing_tag);
4152-
}
4153-
else {
4154-
const openingTagName = openingTag.tagName;
4155-
parseErrorAtPosition(openingTagName.pos, openingTagName.end - openingTagName.pos, Diagnostics.JSX_element_0_has_no_corresponding_closing_tag, getTextOfNodeFromSourceText(sourceText, openingTagName));
4156-
}
4157-
break;
4158-
}
4159-
else if (token() === SyntaxKind.ConflictMarkerTrivia) {
4160-
break;
4161-
}
4162-
const child = parseJsxChild();
4163-
if (child) {
4164-
list.push(child);
4165-
}
4157+
const child = parseJsxChild(openingTag, currentToken = scanner.reScanJsxToken());
4158+
if (!child) break;
4159+
list.push(child);
41664160
}
41674161

41684162
parsingContext = saveParsingContext;
4169-
41704163
return createNodeArray(list, listPos);
41714164
}
41724165

src/compiler/scanner.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ namespace ts {
3333
reScanTemplateToken(): SyntaxKind;
3434
scanJsxIdentifier(): SyntaxKind;
3535
scanJsxAttributeValue(): SyntaxKind;
36-
reScanJsxToken(): SyntaxKind;
37-
scanJsxToken(): SyntaxKind;
36+
reScanJsxToken(): JsxTokenSyntaxKind;
37+
scanJsxToken(): JsxTokenSyntaxKind;
3838
scanJSDocToken(): JsDocSyntaxKind;
3939
scan(): SyntaxKind;
4040
getText(): string;
@@ -1836,12 +1836,12 @@ namespace ts {
18361836
return token = scanTemplateAndSetTokenValue();
18371837
}
18381838

1839-
function reScanJsxToken(): SyntaxKind {
1839+
function reScanJsxToken(): JsxTokenSyntaxKind {
18401840
pos = tokenPos = startPos;
18411841
return token = scanJsxToken();
18421842
}
18431843

1844-
function scanJsxToken(): SyntaxKind {
1844+
function scanJsxToken(): JsxTokenSyntaxKind {
18451845
startPos = tokenPos = pos;
18461846

18471847
if (pos >= end) {

src/compiler/types.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,15 @@ namespace ts {
7575
| SyntaxKind.Identifier
7676
| SyntaxKind.Unknown;
7777

78+
export type JsxTokenSyntaxKind =
79+
| SyntaxKind.LessThanSlashToken
80+
| SyntaxKind.EndOfFileToken
81+
| SyntaxKind.ConflictMarkerTrivia
82+
| SyntaxKind.JsxText
83+
| SyntaxKind.JsxTextAllWhiteSpaces
84+
| SyntaxKind.OpenBraceToken
85+
| SyntaxKind.LessThanToken;
86+
7887
// token > SyntaxKind.Identifer => token is a keyword
7988
// Also, If you add a new SyntaxKind be sure to keep the `Markers` section at the bottom in sync
8089
export const enum SyntaxKind {

tests/baselines/reference/api/tsserverlibrary.d.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ declare namespace ts {
6060
end: number;
6161
}
6262
type JsDocSyntaxKind = SyntaxKind.EndOfFileToken | SyntaxKind.WhitespaceTrivia | SyntaxKind.AtToken | SyntaxKind.NewLineTrivia | SyntaxKind.AsteriskToken | SyntaxKind.OpenBraceToken | SyntaxKind.CloseBraceToken | SyntaxKind.LessThanToken | SyntaxKind.OpenBracketToken | SyntaxKind.CloseBracketToken | SyntaxKind.EqualsToken | SyntaxKind.CommaToken | SyntaxKind.DotToken | SyntaxKind.Identifier | SyntaxKind.Unknown;
63+
type JsxTokenSyntaxKind = SyntaxKind.LessThanSlashToken | SyntaxKind.EndOfFileToken | SyntaxKind.ConflictMarkerTrivia | SyntaxKind.JsxText | SyntaxKind.JsxTextAllWhiteSpaces | SyntaxKind.OpenBraceToken | SyntaxKind.LessThanToken;
6364
enum SyntaxKind {
6465
Unknown = 0,
6566
EndOfFileToken = 1,
@@ -3260,8 +3261,8 @@ declare namespace ts {
32603261
reScanTemplateToken(): SyntaxKind;
32613262
scanJsxIdentifier(): SyntaxKind;
32623263
scanJsxAttributeValue(): SyntaxKind;
3263-
reScanJsxToken(): SyntaxKind;
3264-
scanJsxToken(): SyntaxKind;
3264+
reScanJsxToken(): JsxTokenSyntaxKind;
3265+
scanJsxToken(): JsxTokenSyntaxKind;
32653266
scanJSDocToken(): JsDocSyntaxKind;
32663267
scan(): SyntaxKind;
32673268
getText(): string;

tests/baselines/reference/api/typescript.d.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ declare namespace ts {
6060
end: number;
6161
}
6262
type JsDocSyntaxKind = SyntaxKind.EndOfFileToken | SyntaxKind.WhitespaceTrivia | SyntaxKind.AtToken | SyntaxKind.NewLineTrivia | SyntaxKind.AsteriskToken | SyntaxKind.OpenBraceToken | SyntaxKind.CloseBraceToken | SyntaxKind.LessThanToken | SyntaxKind.OpenBracketToken | SyntaxKind.CloseBracketToken | SyntaxKind.EqualsToken | SyntaxKind.CommaToken | SyntaxKind.DotToken | SyntaxKind.Identifier | SyntaxKind.Unknown;
63+
type JsxTokenSyntaxKind = SyntaxKind.LessThanSlashToken | SyntaxKind.EndOfFileToken | SyntaxKind.ConflictMarkerTrivia | SyntaxKind.JsxText | SyntaxKind.JsxTextAllWhiteSpaces | SyntaxKind.OpenBraceToken | SyntaxKind.LessThanToken;
6364
enum SyntaxKind {
6465
Unknown = 0,
6566
EndOfFileToken = 1,
@@ -2916,8 +2917,8 @@ declare namespace ts {
29162917
reScanTemplateToken(): SyntaxKind;
29172918
scanJsxIdentifier(): SyntaxKind;
29182919
scanJsxAttributeValue(): SyntaxKind;
2919-
reScanJsxToken(): SyntaxKind;
2920-
scanJsxToken(): SyntaxKind;
2920+
reScanJsxToken(): JsxTokenSyntaxKind;
2921+
scanJsxToken(): JsxTokenSyntaxKind;
29212922
scanJSDocToken(): JsDocSyntaxKind;
29222923
scan(): SyntaxKind;
29232924
getText(): string;

0 commit comments

Comments
 (0)