From a010f16e09a9d82eb21a959cbd4908f6b75c64ee Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Thu, 1 Feb 2018 14:50:21 -0800 Subject: [PATCH 1/3] JsxTagNameExpression can only be Identifier | ThisExpression, not any PrimaryExpression --- src/compiler/parser.ts | 2 +- src/compiler/types.ts | 2 +- tests/baselines/reference/api/tsserverlibrary.d.ts | 2 +- tests/baselines/reference/api/typescript.d.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index ff89c55fc1e1a..f621b6d7c38e8 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -4167,7 +4167,7 @@ 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); propertyAccess.expression = expression; diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 30eb518961176..29d9eb44c0ed2 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -1732,7 +1732,7 @@ namespace ts { export type JsxAttributeLike = JsxAttribute | JsxSpreadAttribute; - export type JsxTagNameExpression = PrimaryExpression | PropertyAccessExpression; + export type JsxTagNameExpression = Identifier | ThisExpression | PropertyAccessExpression; 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 921cff852d4b1..290493115bc21 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -1051,7 +1051,7 @@ declare namespace ts { } type JsxOpeningLikeElement = JsxSelfClosingElement | JsxOpeningElement; type JsxAttributeLike = JsxAttribute | JsxSpreadAttribute; - type JsxTagNameExpression = PrimaryExpression | PropertyAccessExpression; + type JsxTagNameExpression = Identifier | ThisExpression | PropertyAccessExpression; 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 36094eeaa9e3a..627a5f8d969ee 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -1051,7 +1051,7 @@ declare namespace ts { } type JsxOpeningLikeElement = JsxSelfClosingElement | JsxOpeningElement; type JsxAttributeLike = JsxAttribute | JsxSpreadAttribute; - type JsxTagNameExpression = PrimaryExpression | PropertyAccessExpression; + type JsxTagNameExpression = Identifier | ThisExpression | PropertyAccessExpression; interface JsxAttributes extends ObjectLiteralExpressionBase { parent?: JsxOpeningLikeElement; } From a441800ef69ffb9371806b90ec581ec115d75977 Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Mon, 5 Feb 2018 14:27:49 -0800 Subject: [PATCH 2/3] Use a type similar to PropertyAccessEntityNameExpression --- src/compiler/parser.ts | 2 +- src/compiler/types.ts | 6 +++++- tests/baselines/reference/api/tsserverlibrary.d.ts | 5 ++++- tests/baselines/reference/api/typescript.d.ts | 5 ++++- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index eb46804239ad0..62c34c73fb3e2 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -4209,7 +4209,7 @@ namespace ts { let expression: JsxTagNameExpression = token() === SyntaxKind.ThisKeyword ? 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); diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 37e02e61eb469..3c9d38c4d38bd 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -1748,7 +1748,11 @@ namespace ts { export type JsxAttributeLike = JsxAttribute | JsxSpreadAttribute; - export type JsxTagNameExpression = Identifier | ThisExpression | 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 b013c32b0d664..15c3deaf800b6 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -1065,7 +1065,10 @@ declare namespace ts { } type JsxOpeningLikeElement = JsxSelfClosingElement | JsxOpeningElement; type JsxAttributeLike = JsxAttribute | JsxSpreadAttribute; - type JsxTagNameExpression = Identifier | ThisExpression | 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 01518d036c27a..2895d74aa37b0 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -1065,7 +1065,10 @@ declare namespace ts { } type JsxOpeningLikeElement = JsxSelfClosingElement | JsxOpeningElement; type JsxAttributeLike = JsxAttribute | JsxSpreadAttribute; - type JsxTagNameExpression = Identifier | ThisExpression | PropertyAccessExpression; + type JsxTagNameExpression = Identifier | ThisExpression | JsxTagNamePropertyAccess; + interface JsxTagNamePropertyAccess extends PropertyAccessExpression { + expression: JsxTagNameExpression; + } interface JsxAttributes extends ObjectLiteralExpressionBase { parent?: JsxOpeningLikeElement; } From f53745dc4ed87af440d9310c6c1acedd39e7d6f7 Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Fri, 29 Jun 2018 16:31:37 -0700 Subject: [PATCH 3/3] Fix lint errors --- src/compiler/checker.ts | 11 +---------- src/compiler/emitter.ts | 2 +- src/compiler/parser.ts | 2 +- 3 files changed, 3 insertions(+), 12 deletions(-) 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 baf37ed1bd07e..bfc502ce2da1e 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -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) {