@@ -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:
@@ -5371,20 +5373,31 @@ namespace ts {
53715373
53725374 function parseJsxElementName(): JsxTagNameExpression {
53735375 const pos = getNodePos();
5374- scanJsxIdentifier();
53755376 // JsxElement can have name in the form of
53765377 // propertyAccessExpression
53775378 // primaryExpression in the form of an identifier and "this" keyword
53785379 // We can't just simply use parseLeftHandSideExpressionOrHigher because then we will start consider class,function etc as a keyword
53795380 // We only want to consider "this" as a primaryExpression
5380- let expression: JsxTagNameExpression = token() === SyntaxKind.ThisKeyword ?
5381- parseTokenNode<ThisExpression>() : parseIdentifierName();
5381+ let expression: JsxTagNameExpression = parseJsxTagName();
53825382 while (parseOptional(SyntaxKind.DotToken)) {
53835383 expression = finishNode(factory.createPropertyAccessExpression(expression, parseRightSideOfDot(/*allowIdentifierNames*/ true, /*allowPrivateIdentifiers*/ false)), pos) as JsxTagNamePropertyAccess;
53845384 }
53855385 return expression;
53865386 }
53875387
5388+ function parseJsxTagName(): Identifier | JsxNamespacedName | ThisExpression {
5389+ const pos = getNodePos();
5390+ scanJsxIdentifier();
5391+
5392+ const isThis = token() === SyntaxKind.ThisKeyword;
5393+ const tagName = parseIdentifierName();
5394+ if (parseOptional(SyntaxKind.ColonToken)) {
5395+ scanJsxIdentifier();
5396+ return finishNode(factory.createJsxNamespacedName(tagName, parseIdentifierName()), pos);
5397+ }
5398+ return isThis ? finishNode(factory.createToken(SyntaxKind.ThisKeyword), pos) : tagName;
5399+ }
5400+
53885401 function parseJsxExpression(inExpressionContext: boolean): JsxExpression | undefined {
53895402 const pos = getNodePos();
53905403 if (!parseExpected(SyntaxKind.OpenBraceToken)) {
@@ -5417,11 +5430,10 @@ namespace ts {
54175430 return parseJsxSpreadAttribute();
54185431 }
54195432
5420- scanJsxIdentifier();
54215433 const pos = getNodePos();
54225434 return finishNode(
54235435 factory.createJsxAttribute(
5424- parseIdentifierName (),
5436+ parseJsxAttributeName (),
54255437 token() !== SyntaxKind.EqualsToken ? undefined :
54265438 scanJsxAttributeValue() === SyntaxKind.StringLiteral ? parseLiteralNode() as StringLiteral :
54275439 parseJsxExpression(/*inExpressionContext*/ true)
@@ -5430,6 +5442,18 @@ namespace ts {
54305442 );
54315443 }
54325444
5445+ function parseJsxAttributeName() {
5446+ const pos = getNodePos();
5447+ scanJsxIdentifier();
5448+
5449+ const attrName = parseIdentifierName();
5450+ if (parseOptional(SyntaxKind.ColonToken)) {
5451+ scanJsxIdentifier();
5452+ return finishNode(factory.createJsxNamespacedName(attrName, parseIdentifierName()), pos);
5453+ }
5454+ return attrName;
5455+ }
5456+
54335457 function parseJsxSpreadAttribute(): JsxSpreadAttribute {
54345458 const pos = getNodePos();
54355459 parseExpected(SyntaxKind.OpenBraceToken);
@@ -9617,6 +9641,11 @@ namespace ts {
96179641 return true;
96189642 }
96199643
9644+ if (lhs.kind === SyntaxKind.JsxNamespacedName) {
9645+ return lhs.namespace.escapedText === (rhs as JsxNamespacedName).namespace.escapedText &&
9646+ lhs.name.escapedText === (rhs as JsxNamespacedName).name.escapedText;
9647+ }
9648+
96209649 // If we are at this statement then we must have PropertyAccessExpression and because tag name in Jsx element can only
96219650 // take forms of JsxTagNameExpression which includes an identifier, "this" expression, or another propertyAccessExpression
96229651 // it is safe to case the expression property as such. See parseJsxElementName for how we parse tag name in Jsx element
0 commit comments