@@ -519,7 +519,9 @@ namespace ts {
519519 visitNode(cbNode, (node as JsxExpression).expression);
520520 case SyntaxKind.JsxClosingElement:
521521 return visitNode(cbNode, (node as JsxClosingElement).tagName);
522-
522+ case SyntaxKind.JsxNamespacedName:
523+ return visitNode(cbNode, (node as JsxNamespacedName).namespace) ||
524+ visitNode(cbNode, (node as JsxNamespacedName).name);
523525 case SyntaxKind.OptionalType:
524526 case SyntaxKind.RestType:
525527 case SyntaxKind.JSDocTypeExpression:
@@ -5418,20 +5420,31 @@ namespace ts {
54185420
54195421 function parseJsxElementName(): JsxTagNameExpression {
54205422 const pos = getNodePos();
5421- scanJsxIdentifier();
54225423 // JsxElement can have name in the form of
54235424 // propertyAccessExpression
54245425 // primaryExpression in the form of an identifier and "this" keyword
54255426 // We can't just simply use parseLeftHandSideExpressionOrHigher because then we will start consider class,function etc as a keyword
54265427 // We only want to consider "this" as a primaryExpression
5427- let expression: JsxTagNameExpression = token() === SyntaxKind.ThisKeyword ?
5428- parseTokenNode<ThisExpression>() : parseIdentifierName();
5428+ let expression: JsxTagNameExpression = parseJsxTagName();
54295429 while (parseOptional(SyntaxKind.DotToken)) {
54305430 expression = finishNode(factory.createPropertyAccessExpression(expression, parseRightSideOfDot(/*allowIdentifierNames*/ true, /*allowPrivateIdentifiers*/ false)), pos) as JsxTagNamePropertyAccess;
54315431 }
54325432 return expression;
54335433 }
54345434
5435+ function parseJsxTagName(): Identifier | JsxNamespacedName | ThisExpression {
5436+ const pos = getNodePos();
5437+ scanJsxIdentifier();
5438+
5439+ const isThis = token() === SyntaxKind.ThisKeyword;
5440+ const tagName = parseIdentifierName();
5441+ if (parseOptional(SyntaxKind.ColonToken)) {
5442+ scanJsxIdentifier();
5443+ return finishNode(factory.createJsxNamespacedName(tagName, parseIdentifierName()), pos);
5444+ }
5445+ return isThis ? finishNode(factory.createToken(SyntaxKind.ThisKeyword), pos) : tagName;
5446+ }
5447+
54355448 function parseJsxExpression(inExpressionContext: boolean): JsxExpression | undefined {
54365449 const pos = getNodePos();
54375450 if (!parseExpected(SyntaxKind.OpenBraceToken)) {
@@ -5464,11 +5477,10 @@ namespace ts {
54645477 return parseJsxSpreadAttribute();
54655478 }
54665479
5467- scanJsxIdentifier();
54685480 const pos = getNodePos();
54695481 return finishNode(
54705482 factory.createJsxAttribute(
5471- parseIdentifierName (),
5483+ parseJsxAttributeName (),
54725484 token() !== SyntaxKind.EqualsToken ? undefined :
54735485 scanJsxAttributeValue() === SyntaxKind.StringLiteral ? parseLiteralNode() as StringLiteral :
54745486 parseJsxExpression(/*inExpressionContext*/ true)
@@ -5477,6 +5489,18 @@ namespace ts {
54775489 );
54785490 }
54795491
5492+ function parseJsxAttributeName() {
5493+ const pos = getNodePos();
5494+ scanJsxIdentifier();
5495+
5496+ const attrName = parseIdentifierName();
5497+ if (parseOptional(SyntaxKind.ColonToken)) {
5498+ scanJsxIdentifier();
5499+ return finishNode(factory.createJsxNamespacedName(attrName, parseIdentifierName()), pos);
5500+ }
5501+ return attrName;
5502+ }
5503+
54805504 function parseJsxSpreadAttribute(): JsxSpreadAttribute {
54815505 const pos = getNodePos();
54825506 parseExpected(SyntaxKind.OpenBraceToken);
@@ -9664,6 +9688,11 @@ namespace ts {
96649688 return true;
96659689 }
96669690
9691+ if (lhs.kind === SyntaxKind.JsxNamespacedName) {
9692+ return lhs.namespace.escapedText === (rhs as JsxNamespacedName).namespace.escapedText &&
9693+ lhs.name.escapedText === (rhs as JsxNamespacedName).name.escapedText;
9694+ }
9695+
96679696 // If we are at this statement then we must have PropertyAccessExpression and because tag name in Jsx element can only
96689697 // take forms of JsxTagNameExpression which includes an identifier, "this" expression, or another propertyAccessExpression
96699698 // it is safe to case the expression property as such. See parseJsxElementName for how we parse tag name in Jsx element
0 commit comments