mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-05-20 22:51:17 -05:00
Simplify parseJsxChildren (#22511)
This commit is contained in:
@@ -4119,32 +4119,9 @@ namespace ts {
|
||||
return finishNode(node);
|
||||
}
|
||||
|
||||
function parseJsxChild(): JsxChild {
|
||||
switch (token()) {
|
||||
case SyntaxKind.JsxText:
|
||||
case SyntaxKind.JsxTextAllWhiteSpaces:
|
||||
return parseJsxText();
|
||||
case SyntaxKind.OpenBraceToken:
|
||||
return parseJsxExpression(/*inExpressionContext*/ false)!;
|
||||
case SyntaxKind.LessThanToken:
|
||||
return parseJsxElementOrSelfClosingElementOrFragment(/*inExpressionContext*/ false);
|
||||
}
|
||||
Debug.fail("Unknown JSX child kind " + token());
|
||||
}
|
||||
|
||||
function parseJsxChildren(openingTag: JsxOpeningElement | JsxOpeningFragment): NodeArray<JsxChild> {
|
||||
const list = [];
|
||||
const listPos = getNodePos();
|
||||
const saveParsingContext = parsingContext;
|
||||
parsingContext |= 1 << ParsingContext.JsxChildren;
|
||||
|
||||
while (true) {
|
||||
currentToken = scanner.reScanJsxToken();
|
||||
if (token() === SyntaxKind.LessThanSlashToken) {
|
||||
// Closing tag
|
||||
break;
|
||||
}
|
||||
else if (token() === SyntaxKind.EndOfFileToken) {
|
||||
function parseJsxChild(openingTag: JsxOpeningElement | JsxOpeningFragment, token: JsxTokenSyntaxKind): JsxChild | undefined {
|
||||
switch (token) {
|
||||
case SyntaxKind.EndOfFileToken:
|
||||
// If we hit EOF, issue the error at the tag that lacks the closing element
|
||||
// rather than at the end of the file (which is useless)
|
||||
if (isJsxOpeningFragment(openingTag)) {
|
||||
@@ -4154,19 +4131,35 @@ namespace ts {
|
||||
const openingTagName = openingTag.tagName;
|
||||
parseErrorAtPosition(openingTagName.pos, openingTagName.end - openingTagName.pos, Diagnostics.JSX_element_0_has_no_corresponding_closing_tag, getTextOfNodeFromSourceText(sourceText, openingTagName));
|
||||
}
|
||||
break;
|
||||
}
|
||||
else if (token() === SyntaxKind.ConflictMarkerTrivia) {
|
||||
break;
|
||||
}
|
||||
const child = parseJsxChild();
|
||||
if (child) {
|
||||
list.push(child);
|
||||
}
|
||||
return undefined;
|
||||
case SyntaxKind.LessThanSlashToken:
|
||||
case SyntaxKind.ConflictMarkerTrivia:
|
||||
return undefined;
|
||||
case SyntaxKind.JsxText:
|
||||
case SyntaxKind.JsxTextAllWhiteSpaces:
|
||||
return parseJsxText();
|
||||
case SyntaxKind.OpenBraceToken:
|
||||
return parseJsxExpression(/*inExpressionContext*/ false);
|
||||
case SyntaxKind.LessThanToken:
|
||||
return parseJsxElementOrSelfClosingElementOrFragment(/*inExpressionContext*/ false);
|
||||
default:
|
||||
return Debug.assertNever(token);
|
||||
}
|
||||
}
|
||||
|
||||
function parseJsxChildren(openingTag: JsxOpeningElement | JsxOpeningFragment): NodeArray<JsxChild> {
|
||||
const list = [];
|
||||
const listPos = getNodePos();
|
||||
const saveParsingContext = parsingContext;
|
||||
parsingContext |= 1 << ParsingContext.JsxChildren;
|
||||
|
||||
while (true) {
|
||||
const child = parseJsxChild(openingTag, currentToken = scanner.reScanJsxToken());
|
||||
if (!child) break;
|
||||
list.push(child);
|
||||
}
|
||||
|
||||
parsingContext = saveParsingContext;
|
||||
|
||||
return createNodeArray(list, listPos);
|
||||
}
|
||||
|
||||
|
||||
@@ -33,8 +33,8 @@ namespace ts {
|
||||
reScanTemplateToken(): SyntaxKind;
|
||||
scanJsxIdentifier(): SyntaxKind;
|
||||
scanJsxAttributeValue(): SyntaxKind;
|
||||
reScanJsxToken(): SyntaxKind;
|
||||
scanJsxToken(): SyntaxKind;
|
||||
reScanJsxToken(): JsxTokenSyntaxKind;
|
||||
scanJsxToken(): JsxTokenSyntaxKind;
|
||||
scanJSDocToken(): JsDocSyntaxKind;
|
||||
scan(): SyntaxKind;
|
||||
getText(): string;
|
||||
@@ -1836,12 +1836,12 @@ namespace ts {
|
||||
return token = scanTemplateAndSetTokenValue();
|
||||
}
|
||||
|
||||
function reScanJsxToken(): SyntaxKind {
|
||||
function reScanJsxToken(): JsxTokenSyntaxKind {
|
||||
pos = tokenPos = startPos;
|
||||
return token = scanJsxToken();
|
||||
}
|
||||
|
||||
function scanJsxToken(): SyntaxKind {
|
||||
function scanJsxToken(): JsxTokenSyntaxKind {
|
||||
startPos = tokenPos = pos;
|
||||
|
||||
if (pos >= end) {
|
||||
|
||||
@@ -75,6 +75,15 @@ namespace ts {
|
||||
| SyntaxKind.Identifier
|
||||
| SyntaxKind.Unknown;
|
||||
|
||||
export type JsxTokenSyntaxKind =
|
||||
| SyntaxKind.LessThanSlashToken
|
||||
| SyntaxKind.EndOfFileToken
|
||||
| SyntaxKind.ConflictMarkerTrivia
|
||||
| SyntaxKind.JsxText
|
||||
| SyntaxKind.JsxTextAllWhiteSpaces
|
||||
| SyntaxKind.OpenBraceToken
|
||||
| SyntaxKind.LessThanToken;
|
||||
|
||||
// token > SyntaxKind.Identifer => token is a keyword
|
||||
// Also, If you add a new SyntaxKind be sure to keep the `Markers` section at the bottom in sync
|
||||
export const enum SyntaxKind {
|
||||
|
||||
Reference in New Issue
Block a user