@@ -276,6 +276,7 @@ import {
276
276
getErrorSpanForNode,
277
277
getEscapedTextOfIdentifierOrLiteral,
278
278
getEscapedTextOfJsxAttributeName,
279
+ getEscapedTextOfJsxNamespacedName,
279
280
getESModuleInterop,
280
281
getExpandoInitializer,
281
282
getExportAssignmentExpression,
@@ -429,6 +430,7 @@ import {
429
430
InternalSymbolName,
430
431
IntersectionType,
431
432
IntersectionTypeNode,
433
+ intrinsicTagNameToString,
432
434
IntrinsicType,
433
435
introducesArgumentsExoticObject,
434
436
isAccessExpression,
@@ -782,6 +784,7 @@ import {
782
784
JsxExpression,
783
785
JsxFlags,
784
786
JsxFragment,
787
+ JsxNamespacedName,
785
788
JsxOpeningElement,
786
789
JsxOpeningFragment,
787
790
JsxOpeningLikeElement,
@@ -29595,7 +29598,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
29595
29598
}
29596
29599
29597
29600
function getStaticTypeOfReferencedJsxConstructor(context: JsxOpeningLikeElement) {
29598
- if (isJsxIntrinsicIdentifier (context.tagName)) {
29601
+ if (isJsxIntrinsicTagName (context.tagName)) {
29599
29602
const result = getIntrinsicAttributesTypeFromJsxOpeningLikeElement(context);
29600
29603
const fakeSignature = createSignatureForJSXIntrinsic(context, result);
29601
29604
return getOrCreateTypeFromSignature(fakeSignature);
@@ -30315,7 +30318,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
30315
30318
checkJsxOpeningLikeElementOrOpeningFragment(node.openingElement);
30316
30319
30317
30320
// Perform resolution on the closing tag so that rename/go to definition/etc work
30318
- if (isJsxIntrinsicIdentifier (node.closingElement.tagName)) {
30321
+ if (isJsxIntrinsicTagName (node.closingElement.tagName)) {
30319
30322
getIntrinsicTagSymbol(node.closingElement);
30320
30323
}
30321
30324
else {
@@ -30355,8 +30358,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
30355
30358
/**
30356
30359
* Returns true iff React would emit this tag name as a string rather than an identifier or qualified name
30357
30360
*/
30358
- function isJsxIntrinsicIdentifier (tagName: JsxTagNameExpression ): tagName is Identifier {
30359
- return tagName.kind === SyntaxKind.Identifier && isIntrinsicJsxName(tagName.escapedText);
30361
+ function isJsxIntrinsicTagName (tagName: Node ): tagName is Identifier | JsxNamespacedName {
30362
+ return isIdentifier( tagName) && isIntrinsicJsxName(tagName.escapedText) || isJsxNamespacedName(tagName );
30360
30363
}
30361
30364
30362
30365
function checkJsxAttribute(node: JsxAttribute, checkMode?: CheckMode) {
@@ -30561,8 +30564,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
30561
30564
const intrinsicElementsType = getJsxType(JsxNames.IntrinsicElements, node);
30562
30565
if (!isErrorType(intrinsicElementsType)) {
30563
30566
// Property case
30564
- if (!isIdentifier(node.tagName)) return Debug.fail();
30565
- const intrinsicProp = getPropertyOfType(intrinsicElementsType, node.tagName.escapedText);
30567
+ if (!isIdentifier(node.tagName) && !isJsxNamespacedName(node.tagName) ) return Debug.fail();
30568
+ const intrinsicProp = getPropertyOfType(intrinsicElementsType, isJsxNamespacedName(node.tagName) ? getEscapedTextOfJsxNamespacedName(node.tagName) : node.tagName.escapedText);
30566
30569
if (intrinsicProp) {
30567
30570
links.jsxFlags |= JsxFlags.IntrinsicNamedElement;
30568
30571
return links.resolvedSymbol = intrinsicProp;
@@ -30576,7 +30579,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
30576
30579
}
30577
30580
30578
30581
// Wasn't found
30579
- error(node, Diagnostics.Property_0_does_not_exist_on_type_1, idText (node.tagName), "JSX." + JsxNames.IntrinsicElements);
30582
+ error(node, Diagnostics.Property_0_does_not_exist_on_type_1, intrinsicTagNameToString (node.tagName), "JSX." + JsxNames.IntrinsicElements);
30580
30583
return links.resolvedSymbol = unknownSymbol;
30581
30584
}
30582
30585
else {
@@ -30785,7 +30788,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
30785
30788
* @param node an intrinsic JSX opening-like element
30786
30789
*/
30787
30790
function getIntrinsicAttributesTypeFromJsxOpeningLikeElement(node: JsxOpeningLikeElement): Type {
30788
- Debug.assert(isJsxIntrinsicIdentifier (node.tagName));
30791
+ Debug.assert(isJsxIntrinsicTagName (node.tagName));
30789
30792
const links = getNodeLinks(node);
30790
30793
if (!links.resolvedJsxElementAttributesType) {
30791
30794
const symbol = getIntrinsicTagSymbol(node);
@@ -30898,8 +30901,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
30898
30901
const elementTypeConstraint = getJsxElementTypeTypeAt(jsxOpeningLikeNode);
30899
30902
if (elementTypeConstraint !== undefined) {
30900
30903
const tagName = jsxOpeningLikeNode.tagName;
30901
- const tagType = isJsxIntrinsicIdentifier (tagName)
30902
- ? getStringLiteralType(unescapeLeadingUnderscores (tagName.escapedText ))
30904
+ const tagType = isJsxIntrinsicTagName (tagName)
30905
+ ? getStringLiteralType(intrinsicTagNameToString (tagName))
30903
30906
: checkExpression(tagName);
30904
30907
checkTypeRelatedTo(tagType, elementTypeConstraint, assignableRelation, tagName, Diagnostics.Its_type_0_is_not_a_valid_JSX_element_type, () => {
30905
30908
const componentName = getTextOfNode(tagName);
@@ -32519,7 +32522,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
32519
32522
}
32520
32523
32521
32524
function getJsxReferenceKind(node: JsxOpeningLikeElement): JsxReferenceKind {
32522
- if (isJsxIntrinsicIdentifier (node.tagName)) {
32525
+ if (isJsxIntrinsicTagName (node.tagName)) {
32523
32526
return JsxReferenceKind.Mixed;
32524
32527
}
32525
32528
const tagType = getApparentType(checkExpression(node.tagName));
@@ -32566,7 +32569,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
32566
32569
if (getJsxNamespaceContainerForImplicitImport(node)) {
32567
32570
return true; // factory is implicitly jsx/jsxdev - assume it fits the bill, since we don't strongly look for the jsx/jsxs/jsxDEV factory APIs anywhere else (at least not yet)
32568
32571
}
32569
- const tagType = isJsxOpeningElement(node) || isJsxSelfClosingElement(node) && !isJsxIntrinsicIdentifier (node.tagName) ? checkExpression(node.tagName) : undefined;
32572
+ const tagType = isJsxOpeningElement(node) || isJsxSelfClosingElement(node) && !isJsxIntrinsicTagName (node.tagName) ? checkExpression(node.tagName) : undefined;
32570
32573
if (!tagType) {
32571
32574
return true;
32572
32575
}
@@ -33970,7 +33973,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
33970
33973
}
33971
33974
33972
33975
function resolveJsxOpeningLikeElement(node: JsxOpeningLikeElement, candidatesOutArray: Signature[] | undefined, checkMode: CheckMode): Signature {
33973
- if (isJsxIntrinsicIdentifier (node.tagName)) {
33976
+ if (isJsxIntrinsicTagName (node.tagName)) {
33974
33977
const result = getIntrinsicAttributesTypeFromJsxOpeningLikeElement(node);
33975
33978
const fakeSignature = createSignatureForJSXIntrinsic(node, result);
33976
33979
checkTypeAssignableToAndOptionallyElaborate(checkExpressionWithContextualType(node.attributes, getEffectiveFirstArgumentForJsxSignature(fakeSignature, node), /*inferenceContext*/ undefined, CheckMode.Normal), result, node.tagName, node.attributes);
@@ -45435,7 +45438,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
45435
45438
const isJSDoc = findAncestor(name, or(isJSDocLinkLike, isJSDocNameReference, isJSDocMemberName));
45436
45439
const meaning = isJSDoc ? SymbolFlags.Type | SymbolFlags.Namespace | SymbolFlags.Value : SymbolFlags.Value;
45437
45440
if (name.kind === SyntaxKind.Identifier) {
45438
- if (isJSXTagName(name) && isJsxIntrinsicIdentifier (name)) {
45441
+ if (isJSXTagName(name) && isJsxIntrinsicTagName (name)) {
45439
45442
const symbol = getIntrinsicTagSymbol(name.parent as JsxOpeningLikeElement);
45440
45443
return symbol === unknownSymbol ? undefined : symbol;
45441
45444
}
@@ -45682,6 +45685,12 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
45682
45685
return isMetaProperty(node.parent) ? checkMetaPropertyKeyword(node.parent).symbol : undefined;
45683
45686
case SyntaxKind.MetaProperty:
45684
45687
return checkExpression(node as Expression).symbol;
45688
+ case SyntaxKind.JsxNamespacedName:
45689
+ if (isJSXTagName(node) && isJsxIntrinsicTagName(node)) {
45690
+ const symbol = getIntrinsicTagSymbol(node.parent as JsxOpeningLikeElement);
45691
+ return symbol === unknownSymbol ? undefined : symbol;
45692
+ }
45693
+ // falls through
45685
45694
45686
45695
default:
45687
45696
return undefined;
0 commit comments