@@ -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,
@@ -29597,7 +29600,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
29597
29600
}
29598
29601
29599
29602
function getStaticTypeOfReferencedJsxConstructor(context: JsxOpeningLikeElement) {
29600
- if (isJsxIntrinsicIdentifier (context.tagName)) {
29603
+ if (isJsxIntrinsicTagName (context.tagName)) {
29601
29604
const result = getIntrinsicAttributesTypeFromJsxOpeningLikeElement(context);
29602
29605
const fakeSignature = createSignatureForJSXIntrinsic(context, result);
29603
29606
return getOrCreateTypeFromSignature(fakeSignature);
@@ -30317,7 +30320,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
30317
30320
checkJsxOpeningLikeElementOrOpeningFragment(node.openingElement);
30318
30321
30319
30322
// Perform resolution on the closing tag so that rename/go to definition/etc work
30320
- if (isJsxIntrinsicIdentifier (node.closingElement.tagName)) {
30323
+ if (isJsxIntrinsicTagName (node.closingElement.tagName)) {
30321
30324
getIntrinsicTagSymbol(node.closingElement);
30322
30325
}
30323
30326
else {
@@ -30357,8 +30360,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
30357
30360
/**
30358
30361
* Returns true iff React would emit this tag name as a string rather than an identifier or qualified name
30359
30362
*/
30360
- function isJsxIntrinsicIdentifier (tagName: JsxTagNameExpression ): tagName is Identifier {
30361
- return tagName.kind === SyntaxKind.Identifier && isIntrinsicJsxName(tagName.escapedText);
30363
+ function isJsxIntrinsicTagName (tagName: Node ): tagName is Identifier | JsxNamespacedName {
30364
+ return isIdentifier( tagName) && isIntrinsicJsxName(tagName.escapedText) || isJsxNamespacedName(tagName );
30362
30365
}
30363
30366
30364
30367
function checkJsxAttribute(node: JsxAttribute, checkMode?: CheckMode) {
@@ -30563,8 +30566,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
30563
30566
const intrinsicElementsType = getJsxType(JsxNames.IntrinsicElements, node);
30564
30567
if (!isErrorType(intrinsicElementsType)) {
30565
30568
// Property case
30566
- if (!isIdentifier(node.tagName)) return Debug.fail();
30567
- const intrinsicProp = getPropertyOfType(intrinsicElementsType, node.tagName.escapedText);
30569
+ if (!isIdentifier(node.tagName) && !isJsxNamespacedName(node.tagName) ) return Debug.fail();
30570
+ const intrinsicProp = getPropertyOfType(intrinsicElementsType, isJsxNamespacedName(node.tagName) ? getEscapedTextOfJsxNamespacedName(node.tagName) : node.tagName.escapedText);
30568
30571
if (intrinsicProp) {
30569
30572
links.jsxFlags |= JsxFlags.IntrinsicNamedElement;
30570
30573
return links.resolvedSymbol = intrinsicProp;
@@ -30578,7 +30581,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
30578
30581
}
30579
30582
30580
30583
// Wasn't found
30581
- error(node, Diagnostics.Property_0_does_not_exist_on_type_1, idText (node.tagName), "JSX." + JsxNames.IntrinsicElements);
30584
+ error(node, Diagnostics.Property_0_does_not_exist_on_type_1, intrinsicTagNameToString (node.tagName), "JSX." + JsxNames.IntrinsicElements);
30582
30585
return links.resolvedSymbol = unknownSymbol;
30583
30586
}
30584
30587
else {
@@ -30787,7 +30790,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
30787
30790
* @param node an intrinsic JSX opening-like element
30788
30791
*/
30789
30792
function getIntrinsicAttributesTypeFromJsxOpeningLikeElement(node: JsxOpeningLikeElement): Type {
30790
- Debug.assert(isJsxIntrinsicIdentifier (node.tagName));
30793
+ Debug.assert(isJsxIntrinsicTagName (node.tagName));
30791
30794
const links = getNodeLinks(node);
30792
30795
if (!links.resolvedJsxElementAttributesType) {
30793
30796
const symbol = getIntrinsicTagSymbol(node);
@@ -30900,8 +30903,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
30900
30903
const elementTypeConstraint = getJsxElementTypeTypeAt(jsxOpeningLikeNode);
30901
30904
if (elementTypeConstraint !== undefined) {
30902
30905
const tagName = jsxOpeningLikeNode.tagName;
30903
- const tagType = isJsxIntrinsicIdentifier (tagName)
30904
- ? getStringLiteralType(unescapeLeadingUnderscores (tagName.escapedText ))
30906
+ const tagType = isJsxIntrinsicTagName (tagName)
30907
+ ? getStringLiteralType(intrinsicTagNameToString (tagName))
30905
30908
: checkExpression(tagName);
30906
30909
checkTypeRelatedTo(tagType, elementTypeConstraint, assignableRelation, tagName, Diagnostics.Its_type_0_is_not_a_valid_JSX_element_type, () => {
30907
30910
const componentName = getTextOfNode(tagName);
@@ -32521,7 +32524,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
32521
32524
}
32522
32525
32523
32526
function getJsxReferenceKind(node: JsxOpeningLikeElement): JsxReferenceKind {
32524
- if (isJsxIntrinsicIdentifier (node.tagName)) {
32527
+ if (isJsxIntrinsicTagName (node.tagName)) {
32525
32528
return JsxReferenceKind.Mixed;
32526
32529
}
32527
32530
const tagType = getApparentType(checkExpression(node.tagName));
@@ -32568,7 +32571,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
32568
32571
if (getJsxNamespaceContainerForImplicitImport(node)) {
32569
32572
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)
32570
32573
}
32571
- const tagType = isJsxOpeningElement(node) || isJsxSelfClosingElement(node) && !isJsxIntrinsicIdentifier (node.tagName) ? checkExpression(node.tagName) : undefined;
32574
+ const tagType = isJsxOpeningElement(node) || isJsxSelfClosingElement(node) && !isJsxIntrinsicTagName (node.tagName) ? checkExpression(node.tagName) : undefined;
32572
32575
if (!tagType) {
32573
32576
return true;
32574
32577
}
@@ -33972,7 +33975,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
33972
33975
}
33973
33976
33974
33977
function resolveJsxOpeningLikeElement(node: JsxOpeningLikeElement, candidatesOutArray: Signature[] | undefined, checkMode: CheckMode): Signature {
33975
- if (isJsxIntrinsicIdentifier (node.tagName)) {
33978
+ if (isJsxIntrinsicTagName (node.tagName)) {
33976
33979
const result = getIntrinsicAttributesTypeFromJsxOpeningLikeElement(node);
33977
33980
const fakeSignature = createSignatureForJSXIntrinsic(node, result);
33978
33981
checkTypeAssignableToAndOptionallyElaborate(checkExpressionWithContextualType(node.attributes, getEffectiveFirstArgumentForJsxSignature(fakeSignature, node), /*inferenceContext*/ undefined, CheckMode.Normal), result, node.tagName, node.attributes);
@@ -45438,7 +45441,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
45438
45441
const isJSDoc = findAncestor(name, or(isJSDocLinkLike, isJSDocNameReference, isJSDocMemberName));
45439
45442
const meaning = isJSDoc ? SymbolFlags.Type | SymbolFlags.Namespace | SymbolFlags.Value : SymbolFlags.Value;
45440
45443
if (name.kind === SyntaxKind.Identifier) {
45441
- if (isJSXTagName(name) && isJsxIntrinsicIdentifier (name)) {
45444
+ if (isJSXTagName(name) && isJsxIntrinsicTagName (name)) {
45442
45445
const symbol = getIntrinsicTagSymbol(name.parent as JsxOpeningLikeElement);
45443
45446
return symbol === unknownSymbol ? undefined : symbol;
45444
45447
}
@@ -45685,6 +45688,12 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
45685
45688
return isMetaProperty(node.parent) ? checkMetaPropertyKeyword(node.parent).symbol : undefined;
45686
45689
case SyntaxKind.MetaProperty:
45687
45690
return checkExpression(node as Expression).symbol;
45691
+ case SyntaxKind.JsxNamespacedName:
45692
+ if (isJSXTagName(node) && isJsxIntrinsicTagName(node)) {
45693
+ const symbol = getIntrinsicTagSymbol(node.parent as JsxOpeningLikeElement);
45694
+ return symbol === unknownSymbol ? undefined : symbol;
45695
+ }
45696
+ // falls through
45688
45697
45689
45698
default:
45690
45699
return undefined;
0 commit comments