Skip to content

Commit b97b1a8

Browse files
Kingwlweswigham
authored andcommitted
add jsx factory and hold text in jsxtext node (#29439)
* add jsx factory and hold text in jsxtext node * update jsxtext prop name and factory
1 parent 3ba5aa9 commit b97b1a8

File tree

10 files changed

+45
-13
lines changed

10 files changed

+45
-13
lines changed

src/compiler/checker.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11576,7 +11576,7 @@ namespace ts {
1157611576
// child is of the type of the expression
1157711577
return { errorNode: child, innerExpression: child.expression, nameType };
1157811578
case SyntaxKind.JsxText:
11579-
if (child.containsOnlyWhiteSpaces) {
11579+
if (child.containsOnlyTriviaWhiteSpaces) {
1158011580
break; // Whitespace only jsx text isn't real jsx text
1158111581
}
1158211582
// child is a string
@@ -11600,7 +11600,7 @@ namespace ts {
1160011600
const childrenPropName = childPropName === undefined ? "children" : unescapeLeadingUnderscores(childPropName);
1160111601
const childrenNameType = getLiteralType(childrenPropName);
1160211602
const childrenTargetType = getIndexedAccessType(target, childrenNameType);
11603-
const validChildren = filter(containingElement.children, i => !isJsxText(i) || !i.containsOnlyWhiteSpaces);
11603+
const validChildren = filter(containingElement.children, i => !isJsxText(i) || !i.containsOnlyTriviaWhiteSpaces);
1160411604
if (!length(validChildren)) {
1160511605
return result;
1160611606
}
@@ -18923,7 +18923,7 @@ namespace ts {
1892318923
// In React, JSX text that contains only whitespaces will be ignored so we don't want to type-check that
1892418924
// because then type of children property will have constituent of string type.
1892518925
if (child.kind === SyntaxKind.JsxText) {
18926-
if (!child.containsOnlyWhiteSpaces) {
18926+
if (!child.containsOnlyTriviaWhiteSpaces) {
1892718927
childrenTypes.push(stringType);
1892818928
}
1892918929
}

src/compiler/emitter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2979,7 +2979,7 @@ namespace ts {
29792979
}
29802980

29812981
function emitJsxText(node: JsxText) {
2982-
writer.writeLiteral(getTextOfNode(node, /*includeTrivia*/ true));
2982+
writer.writeLiteral(node.text);
29832983
}
29842984

29852985
function emitJsxClosingElementOrFragment(node: JsxClosingElement | JsxClosingFragment) {

src/compiler/factory.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2299,6 +2299,28 @@ namespace ts {
22992299
return node;
23002300
}
23012301

2302+
export function createJsxText(text: string, containsOnlyTriviaWhiteSpaces?: boolean) {
2303+
const node = <JsxText>createSynthesizedNode(SyntaxKind.JsxText);
2304+
node.text = text;
2305+
node.containsOnlyTriviaWhiteSpaces = !!containsOnlyTriviaWhiteSpaces;
2306+
return node;
2307+
}
2308+
2309+
export function updateJsxText(node: JsxText, text: string, containsOnlyTriviaWhiteSpaces?: boolean) {
2310+
return node.text !== text
2311+
|| node.containsOnlyTriviaWhiteSpaces !== containsOnlyTriviaWhiteSpaces
2312+
? updateNode(createJsxText(text, containsOnlyTriviaWhiteSpaces), node)
2313+
: node;
2314+
}
2315+
2316+
export function createJsxOpeningFragment() {
2317+
return <JsxOpeningFragment>createSynthesizedNode(SyntaxKind.JsxOpeningFragment);
2318+
}
2319+
2320+
export function createJsxJsxClosingFragment() {
2321+
return <JsxClosingFragment>createSynthesizedNode(SyntaxKind.JsxClosingFragment);
2322+
}
2323+
23022324
export function updateJsxFragment(node: JsxFragment, openingFragment: JsxOpeningFragment, children: ReadonlyArray<JsxChild>, closingFragment: JsxClosingFragment) {
23032325
return node.openingFragment !== openingFragment
23042326
|| node.children !== children

src/compiler/parser.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4256,7 +4256,8 @@ namespace ts {
42564256

42574257
function parseJsxText(): JsxText {
42584258
const node = <JsxText>createNode(SyntaxKind.JsxText);
4259-
node.containsOnlyWhiteSpaces = currentToken === SyntaxKind.JsxTextAllWhiteSpaces;
4259+
node.text = scanner.getTokenValue();
4260+
node.containsOnlyTriviaWhiteSpaces = currentToken === SyntaxKind.JsxTextAllWhiteSpaces;
42604261
currentToken = scanner.scanJsxToken();
42614262
return finishNode(node);
42624263
}

src/compiler/scanner.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2013,6 +2013,7 @@ namespace ts {
20132013
pos++;
20142014
}
20152015

2016+
tokenValue = text.substring(startPos, pos);
20162017
return firstNonWhitespace === -1 ? SyntaxKind.JsxTextAllWhiteSpaces : SyntaxKind.JsxText;
20172018
}
20182019

src/compiler/transformers/jsx.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ namespace ts {
182182
}
183183

184184
function visitJsxText(node: JsxText): StringLiteral | undefined {
185-
const fixed = fixupWhitespaceAndDecodeEntities(getTextOfNode(node, /*includeTrivia*/ true));
185+
const fixed = fixupWhitespaceAndDecodeEntities(node.text);
186186
return fixed === undefined ? undefined : createLiteral(fixed);
187187
}
188188

src/compiler/types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1945,9 +1945,9 @@ namespace ts {
19451945
expression?: Expression;
19461946
}
19471947

1948-
export interface JsxText extends Node {
1948+
export interface JsxText extends LiteralLikeNode {
19491949
kind: SyntaxKind.JsxText;
1950-
containsOnlyWhiteSpaces: boolean;
1950+
containsOnlyTriviaWhiteSpaces: boolean;
19511951
parent: JsxElement;
19521952
}
19531953

src/services/utilities.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -905,7 +905,7 @@ namespace ts {
905905
}
906906

907907
function isWhiteSpaceOnlyJsxText(node: Node): boolean {
908-
return isJsxText(node) && node.containsOnlyWhiteSpaces;
908+
return isJsxText(node) && node.containsOnlyTriviaWhiteSpaces;
909909
}
910910

911911
export function isInTemplateString(sourceFile: SourceFile, position: number) {

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1203,9 +1203,9 @@ declare namespace ts {
12031203
dotDotDotToken?: Token<SyntaxKind.DotDotDotToken>;
12041204
expression?: Expression;
12051205
}
1206-
interface JsxText extends Node {
1206+
interface JsxText extends LiteralLikeNode {
12071207
kind: SyntaxKind.JsxText;
1208-
containsOnlyWhiteSpaces: boolean;
1208+
containsOnlyTriviaWhiteSpaces: boolean;
12091209
parent: JsxElement;
12101210
}
12111211
type JsxChild = JsxText | JsxExpression | JsxElement | JsxSelfClosingElement | JsxFragment;
@@ -3992,6 +3992,10 @@ declare namespace ts {
39923992
function createJsxClosingElement(tagName: JsxTagNameExpression): JsxClosingElement;
39933993
function updateJsxClosingElement(node: JsxClosingElement, tagName: JsxTagNameExpression): JsxClosingElement;
39943994
function createJsxFragment(openingFragment: JsxOpeningFragment, children: ReadonlyArray<JsxChild>, closingFragment: JsxClosingFragment): JsxFragment;
3995+
function createJsxText(text: string, containsOnlyTriviaWhiteSpaces?: boolean): JsxText;
3996+
function updateJsxText(node: JsxText, text: string, containsOnlyTriviaWhiteSpaces?: boolean): JsxText;
3997+
function createJsxOpeningFragment(): JsxOpeningFragment;
3998+
function createJsxJsxClosingFragment(): JsxClosingFragment;
39953999
function updateJsxFragment(node: JsxFragment, openingFragment: JsxOpeningFragment, children: ReadonlyArray<JsxChild>, closingFragment: JsxClosingFragment): JsxFragment;
39964000
function createJsxAttribute(name: Identifier, initializer: StringLiteral | JsxExpression): JsxAttribute;
39974001
function updateJsxAttribute(node: JsxAttribute, name: Identifier, initializer: StringLiteral | JsxExpression): JsxAttribute;

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1203,9 +1203,9 @@ declare namespace ts {
12031203
dotDotDotToken?: Token<SyntaxKind.DotDotDotToken>;
12041204
expression?: Expression;
12051205
}
1206-
interface JsxText extends Node {
1206+
interface JsxText extends LiteralLikeNode {
12071207
kind: SyntaxKind.JsxText;
1208-
containsOnlyWhiteSpaces: boolean;
1208+
containsOnlyTriviaWhiteSpaces: boolean;
12091209
parent: JsxElement;
12101210
}
12111211
type JsxChild = JsxText | JsxExpression | JsxElement | JsxSelfClosingElement | JsxFragment;
@@ -3992,6 +3992,10 @@ declare namespace ts {
39923992
function createJsxClosingElement(tagName: JsxTagNameExpression): JsxClosingElement;
39933993
function updateJsxClosingElement(node: JsxClosingElement, tagName: JsxTagNameExpression): JsxClosingElement;
39943994
function createJsxFragment(openingFragment: JsxOpeningFragment, children: ReadonlyArray<JsxChild>, closingFragment: JsxClosingFragment): JsxFragment;
3995+
function createJsxText(text: string, containsOnlyTriviaWhiteSpaces?: boolean): JsxText;
3996+
function updateJsxText(node: JsxText, text: string, containsOnlyTriviaWhiteSpaces?: boolean): JsxText;
3997+
function createJsxOpeningFragment(): JsxOpeningFragment;
3998+
function createJsxJsxClosingFragment(): JsxClosingFragment;
39953999
function updateJsxFragment(node: JsxFragment, openingFragment: JsxOpeningFragment, children: ReadonlyArray<JsxChild>, closingFragment: JsxClosingFragment): JsxFragment;
39964000
function createJsxAttribute(name: Identifier, initializer: StringLiteral | JsxExpression): JsxAttribute;
39974001
function updateJsxAttribute(node: JsxAttribute, name: Identifier, initializer: StringLiteral | JsxExpression): JsxAttribute;

0 commit comments

Comments
 (0)