diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 95103c1518e56..325a13b9576c3 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -16434,16 +16434,7 @@ namespace ts { * Returns true iff React would emit this tag name as a string rather than an identifier or qualified name */ function isJsxIntrinsicIdentifier(tagName: JsxTagNameExpression): boolean { - // TODO (yuisu): comment - switch (tagName.kind) { - case SyntaxKind.PropertyAccessExpression: - case SyntaxKind.ThisKeyword: - return false; - case SyntaxKind.Identifier: - return isIntrinsicJsxName((tagName).escapedText); - default: - return Debug.fail(); - } + return tagName.kind === SyntaxKind.Identifier && isIntrinsicJsxName(tagName.escapedText); } function checkJsxAttribute(node: JsxAttribute, checkMode?: CheckMode) { diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 6e9e747d19f87..b79c46f38dd6f 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -2451,7 +2451,7 @@ namespace ts { function emitJsxTagName(node: JsxTagNameExpression) { if (node.kind === SyntaxKind.Identifier) { - emitExpression(node); + emitExpression(node); } else { emit(node); diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index d71edf64fed12..bfc502ce2da1e 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -4314,9 +4314,9 @@ namespace ts { // We can't just simply use parseLeftHandSideExpressionOrHigher because then we will start consider class,function etc as a keyword // We only want to consider "this" as a primaryExpression let expression: JsxTagNameExpression = token() === SyntaxKind.ThisKeyword ? - parseTokenNode() : parseIdentifierName(); + parseTokenNode() : parseIdentifierName(); while (parseOptional(SyntaxKind.DotToken)) { - const propertyAccess: PropertyAccessExpression = createNode(SyntaxKind.PropertyAccessExpression, expression.pos); + const propertyAccess: JsxTagNamePropertyAccess = createNode(SyntaxKind.PropertyAccessExpression, expression.pos); propertyAccess.expression = expression; propertyAccess.name = parseRightSideOfDot(/*allowIdentifierNames*/ true); expression = finishNode(propertyAccess); @@ -7886,7 +7886,7 @@ namespace ts { } if (lhs.kind === SyntaxKind.Identifier) { - return (lhs).escapedText === (rhs).escapedText; + return lhs.escapedText === (rhs).escapedText; } if (lhs.kind === SyntaxKind.ThisKeyword) { diff --git a/src/compiler/types.ts b/src/compiler/types.ts index d12761b4821e1..ee9ebc09c56fb 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -1761,7 +1761,11 @@ namespace ts { export type JsxAttributeLike = JsxAttribute | JsxSpreadAttribute; - export type JsxTagNameExpression = PrimaryExpression | PropertyAccessExpression; + export type JsxTagNameExpression = Identifier | ThisExpression | JsxTagNamePropertyAccess; + + export interface JsxTagNamePropertyAccess extends PropertyAccessExpression { + expression: JsxTagNameExpression; + } export interface JsxAttributes extends ObjectLiteralExpressionBase { parent: JsxOpeningLikeElement; diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index 1783064f309b3..5b2f7b1b8aeb2 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -1713,7 +1713,10 @@ declare namespace ts { } type JsxOpeningLikeElement = JsxSelfClosingElement | JsxOpeningElement; type JsxAttributeLike = JsxAttribute | JsxSpreadAttribute; - type JsxTagNameExpression = PrimaryExpression | PropertyAccessExpression; + type JsxTagNameExpression = Identifier | ThisExpression | JsxTagNamePropertyAccess; + interface JsxTagNamePropertyAccess extends PropertyAccessExpression { + expression: JsxTagNameExpression; + } interface JsxAttributes extends ObjectLiteralExpressionBase { parent: JsxOpeningLikeElement; } diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index deb36f6ab757d..fb2d636059dc7 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -1105,7 +1105,10 @@ declare namespace ts { } type JsxOpeningLikeElement = JsxSelfClosingElement | JsxOpeningElement; type JsxAttributeLike = JsxAttribute | JsxSpreadAttribute; - type JsxTagNameExpression = PrimaryExpression | PropertyAccessExpression; + type JsxTagNameExpression = Identifier | ThisExpression | JsxTagNamePropertyAccess; + interface JsxTagNamePropertyAccess extends PropertyAccessExpression { + expression: JsxTagNameExpression; + } interface JsxAttributes extends ObjectLiteralExpressionBase { parent: JsxOpeningLikeElement; }