@@ -483,7 +483,9 @@ namespace ts {
483
483
visitNode ( cbNode , ( node as JsxExpression ) . expression ) ;
484
484
case SyntaxKind . JsxClosingElement :
485
485
return visitNode ( cbNode , ( node as JsxClosingElement ) . tagName ) ;
486
-
486
+ case SyntaxKind . JsxNamespacedName :
487
+ return visitNode ( cbNode , ( node as JsxNamespacedName ) . namespace ) ||
488
+ visitNode ( cbNode , ( node as JsxNamespacedName ) . name ) ;
487
489
case SyntaxKind . OptionalType :
488
490
case SyntaxKind . RestType :
489
491
case SyntaxKind . JSDocTypeExpression :
@@ -5270,20 +5272,31 @@ namespace ts {
5270
5272
5271
5273
function parseJsxElementName ( ) : JsxTagNameExpression {
5272
5274
const pos = getNodePos ( ) ;
5273
- scanJsxIdentifier ( ) ;
5274
5275
// JsxElement can have name in the form of
5275
5276
// propertyAccessExpression
5276
5277
// primaryExpression in the form of an identifier and "this" keyword
5277
5278
// We can't just simply use parseLeftHandSideExpressionOrHigher because then we will start consider class,function etc as a keyword
5278
5279
// We only want to consider "this" as a primaryExpression
5279
- let expression : JsxTagNameExpression = token ( ) === SyntaxKind . ThisKeyword ?
5280
- parseTokenNode < ThisExpression > ( ) : parseIdentifierName ( ) ;
5280
+ let expression : JsxTagNameExpression = parseJsxTagName ( ) ;
5281
5281
while ( parseOptional ( SyntaxKind . DotToken ) ) {
5282
5282
expression = finishNode ( factory . createPropertyAccessExpression ( expression , parseRightSideOfDot ( /*allowIdentifierNames*/ true , /*allowPrivateIdentifiers*/ false ) ) , pos ) as JsxTagNamePropertyAccess ;
5283
5283
}
5284
5284
return expression ;
5285
5285
}
5286
5286
5287
+ function parseJsxTagName ( ) : Identifier | JsxNamespacedName | ThisExpression {
5288
+ const pos = getNodePos ( ) ;
5289
+ scanJsxIdentifier ( ) ;
5290
+
5291
+ const isThis = token ( ) === SyntaxKind . ThisKeyword ;
5292
+ const tagName = parseIdentifierName ( ) ;
5293
+ if ( parseOptional ( SyntaxKind . ColonToken ) ) {
5294
+ scanJsxIdentifier ( ) ;
5295
+ return finishNode ( factory . createJsxNamespacedName ( tagName , parseIdentifierName ( ) ) , pos ) ;
5296
+ }
5297
+ return isThis ? finishNode ( factory . createToken ( SyntaxKind . ThisKeyword ) , pos ) : tagName ;
5298
+ }
5299
+
5287
5300
function parseJsxExpression ( inExpressionContext : boolean ) : JsxExpression | undefined {
5288
5301
const pos = getNodePos ( ) ;
5289
5302
if ( ! parseExpected ( SyntaxKind . OpenBraceToken ) ) {
@@ -5316,11 +5329,10 @@ namespace ts {
5316
5329
return parseJsxSpreadAttribute ( ) ;
5317
5330
}
5318
5331
5319
- scanJsxIdentifier ( ) ;
5320
5332
const pos = getNodePos ( ) ;
5321
5333
return finishNode (
5322
5334
factory . createJsxAttribute (
5323
- parseIdentifierName ( ) ,
5335
+ parseJsxAttributeName ( ) ,
5324
5336
token ( ) !== SyntaxKind . EqualsToken ? undefined :
5325
5337
scanJsxAttributeValue ( ) === SyntaxKind . StringLiteral ? parseLiteralNode ( ) as StringLiteral :
5326
5338
parseJsxExpression ( /*inExpressionContext*/ true )
@@ -5329,6 +5341,18 @@ namespace ts {
5329
5341
) ;
5330
5342
}
5331
5343
5344
+ function parseJsxAttributeName ( ) {
5345
+ const pos = getNodePos ( ) ;
5346
+ scanJsxIdentifier ( ) ;
5347
+
5348
+ const attrName = parseIdentifierName ( ) ;
5349
+ if ( parseOptional ( SyntaxKind . ColonToken ) ) {
5350
+ scanJsxIdentifier ( ) ;
5351
+ return finishNode ( factory . createJsxNamespacedName ( attrName , parseIdentifierName ( ) ) , pos ) ;
5352
+ }
5353
+ return attrName ;
5354
+ }
5355
+
5332
5356
function parseJsxSpreadAttribute ( ) : JsxSpreadAttribute {
5333
5357
const pos = getNodePos ( ) ;
5334
5358
parseExpected ( SyntaxKind . OpenBraceToken ) ;
@@ -9565,6 +9589,11 @@ namespace ts {
9565
9589
return true ;
9566
9590
}
9567
9591
9592
+ if ( lhs . kind === SyntaxKind . JsxNamespacedName ) {
9593
+ return lhs . namespace . escapedText === ( rhs as JsxNamespacedName ) . namespace . escapedText &&
9594
+ lhs . name . escapedText === ( rhs as JsxNamespacedName ) . name . escapedText ;
9595
+ }
9596
+
9568
9597
// If we are at this statement then we must have PropertyAccessExpression and because tag name in Jsx element can only
9569
9598
// take forms of JsxTagNameExpression which includes an identifier, "this" expression, or another propertyAccessExpression
9570
9599
// it is safe to case the expression property as such. See parseJsxElementName for how we parse tag name in Jsx element
0 commit comments