Skip to content

Commit c5bd040

Browse files
author
Andy
authored
JsxTagNameExpression can only be Identifier | ThisExpression, not any PrimaryExpression (microsoft#21555)
* JsxTagNameExpression can only be Identifier | ThisExpression, not any PrimaryExpression * Use a type similar to PropertyAccessEntityNameExpression * Fix lint errors
1 parent 48d31ed commit c5bd040

File tree

6 files changed

+18
-17
lines changed

6 files changed

+18
-17
lines changed

src/compiler/checker.ts

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16434,16 +16434,7 @@ namespace ts {
1643416434
* Returns true iff React would emit this tag name as a string rather than an identifier or qualified name
1643516435
*/
1643616436
function isJsxIntrinsicIdentifier(tagName: JsxTagNameExpression): boolean {
16437-
// TODO (yuisu): comment
16438-
switch (tagName.kind) {
16439-
case SyntaxKind.PropertyAccessExpression:
16440-
case SyntaxKind.ThisKeyword:
16441-
return false;
16442-
case SyntaxKind.Identifier:
16443-
return isIntrinsicJsxName((<Identifier>tagName).escapedText);
16444-
default:
16445-
return Debug.fail();
16446-
}
16437+
return tagName.kind === SyntaxKind.Identifier && isIntrinsicJsxName(tagName.escapedText);
1644716438
}
1644816439

1644916440
function checkJsxAttribute(node: JsxAttribute, checkMode?: CheckMode) {

src/compiler/emitter.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2451,7 +2451,7 @@ namespace ts {
24512451

24522452
function emitJsxTagName(node: JsxTagNameExpression) {
24532453
if (node.kind === SyntaxKind.Identifier) {
2454-
emitExpression(<Identifier>node);
2454+
emitExpression(node);
24552455
}
24562456
else {
24572457
emit(node);

src/compiler/parser.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4314,9 +4314,9 @@ namespace ts {
43144314
// We can't just simply use parseLeftHandSideExpressionOrHigher because then we will start consider class,function etc as a keyword
43154315
// We only want to consider "this" as a primaryExpression
43164316
let expression: JsxTagNameExpression = token() === SyntaxKind.ThisKeyword ?
4317-
parseTokenNode<PrimaryExpression>() : parseIdentifierName();
4317+
parseTokenNode<ThisExpression>() : parseIdentifierName();
43184318
while (parseOptional(SyntaxKind.DotToken)) {
4319-
const propertyAccess: PropertyAccessExpression = <PropertyAccessExpression>createNode(SyntaxKind.PropertyAccessExpression, expression.pos);
4319+
const propertyAccess: JsxTagNamePropertyAccess = <JsxTagNamePropertyAccess>createNode(SyntaxKind.PropertyAccessExpression, expression.pos);
43204320
propertyAccess.expression = expression;
43214321
propertyAccess.name = parseRightSideOfDot(/*allowIdentifierNames*/ true);
43224322
expression = finishNode(propertyAccess);
@@ -7886,7 +7886,7 @@ namespace ts {
78867886
}
78877887

78887888
if (lhs.kind === SyntaxKind.Identifier) {
7889-
return (<Identifier>lhs).escapedText === (<Identifier>rhs).escapedText;
7889+
return lhs.escapedText === (<Identifier>rhs).escapedText;
78907890
}
78917891

78927892
if (lhs.kind === SyntaxKind.ThisKeyword) {

src/compiler/types.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1761,7 +1761,11 @@ namespace ts {
17611761

17621762
export type JsxAttributeLike = JsxAttribute | JsxSpreadAttribute;
17631763

1764-
export type JsxTagNameExpression = PrimaryExpression | PropertyAccessExpression;
1764+
export type JsxTagNameExpression = Identifier | ThisExpression | JsxTagNamePropertyAccess;
1765+
1766+
export interface JsxTagNamePropertyAccess extends PropertyAccessExpression {
1767+
expression: JsxTagNameExpression;
1768+
}
17651769

17661770
export interface JsxAttributes extends ObjectLiteralExpressionBase<JsxAttributeLike> {
17671771
parent: JsxOpeningLikeElement;

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1713,7 +1713,10 @@ declare namespace ts {
17131713
}
17141714
type JsxOpeningLikeElement = JsxSelfClosingElement | JsxOpeningElement;
17151715
type JsxAttributeLike = JsxAttribute | JsxSpreadAttribute;
1716-
type JsxTagNameExpression = PrimaryExpression | PropertyAccessExpression;
1716+
type JsxTagNameExpression = Identifier | ThisExpression | JsxTagNamePropertyAccess;
1717+
interface JsxTagNamePropertyAccess extends PropertyAccessExpression {
1718+
expression: JsxTagNameExpression;
1719+
}
17171720
interface JsxAttributes extends ObjectLiteralExpressionBase<JsxAttributeLike> {
17181721
parent: JsxOpeningLikeElement;
17191722
}

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1105,7 +1105,10 @@ declare namespace ts {
11051105
}
11061106
type JsxOpeningLikeElement = JsxSelfClosingElement | JsxOpeningElement;
11071107
type JsxAttributeLike = JsxAttribute | JsxSpreadAttribute;
1108-
type JsxTagNameExpression = PrimaryExpression | PropertyAccessExpression;
1108+
type JsxTagNameExpression = Identifier | ThisExpression | JsxTagNamePropertyAccess;
1109+
interface JsxTagNamePropertyAccess extends PropertyAccessExpression {
1110+
expression: JsxTagNameExpression;
1111+
}
11091112
interface JsxAttributes extends ObjectLiteralExpressionBase<JsxAttributeLike> {
11101113
parent: JsxOpeningLikeElement;
11111114
}

0 commit comments

Comments
 (0)