@@ -276,6 +276,7 @@ import {
276276 getErrorSpanForNode,
277277 getEscapedTextOfIdentifierOrLiteral,
278278 getEscapedTextOfJsxAttributeName,
279+ getEscapedTextOfJsxNamespacedName,
279280 getESModuleInterop,
280281 getExpandoInitializer,
281282 getExportAssignmentExpression,
@@ -429,6 +430,7 @@ import {
429430 InternalSymbolName,
430431 IntersectionType,
431432 IntersectionTypeNode,
433+ intrinsicTagNameToString,
432434 IntrinsicType,
433435 introducesArgumentsExoticObject,
434436 isAccessExpression,
@@ -782,6 +784,7 @@ import {
782784 JsxExpression,
783785 JsxFlags,
784786 JsxFragment,
787+ JsxNamespacedName,
785788 JsxOpeningElement,
786789 JsxOpeningFragment,
787790 JsxOpeningLikeElement,
@@ -29595,7 +29598,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2959529598 }
2959629599
2959729600 function getStaticTypeOfReferencedJsxConstructor(context: JsxOpeningLikeElement) {
29598- if (isJsxIntrinsicIdentifier (context.tagName)) {
29601+ if (isJsxIntrinsicTagName (context.tagName)) {
2959929602 const result = getIntrinsicAttributesTypeFromJsxOpeningLikeElement(context);
2960029603 const fakeSignature = createSignatureForJSXIntrinsic(context, result);
2960129604 return getOrCreateTypeFromSignature(fakeSignature);
@@ -30315,7 +30318,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3031530318 checkJsxOpeningLikeElementOrOpeningFragment(node.openingElement);
3031630319
3031730320 // 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)) {
3031930322 getIntrinsicTagSymbol(node.closingElement);
3032030323 }
3032130324 else {
@@ -30355,8 +30358,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3035530358 /**
3035630359 * Returns true iff React would emit this tag name as a string rather than an identifier or qualified name
3035730360 */
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 );
3036030363 }
3036130364
3036230365 function checkJsxAttribute(node: JsxAttribute, checkMode?: CheckMode) {
@@ -30561,8 +30564,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3056130564 const intrinsicElementsType = getJsxType(JsxNames.IntrinsicElements, node);
3056230565 if (!isErrorType(intrinsicElementsType)) {
3056330566 // 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);
3056630569 if (intrinsicProp) {
3056730570 links.jsxFlags |= JsxFlags.IntrinsicNamedElement;
3056830571 return links.resolvedSymbol = intrinsicProp;
@@ -30576,7 +30579,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3057630579 }
3057730580
3057830581 // 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);
3058030583 return links.resolvedSymbol = unknownSymbol;
3058130584 }
3058230585 else {
@@ -30785,7 +30788,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3078530788 * @param node an intrinsic JSX opening-like element
3078630789 */
3078730790 function getIntrinsicAttributesTypeFromJsxOpeningLikeElement(node: JsxOpeningLikeElement): Type {
30788- Debug.assert(isJsxIntrinsicIdentifier (node.tagName));
30791+ Debug.assert(isJsxIntrinsicTagName (node.tagName));
3078930792 const links = getNodeLinks(node);
3079030793 if (!links.resolvedJsxElementAttributesType) {
3079130794 const symbol = getIntrinsicTagSymbol(node);
@@ -30898,8 +30901,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3089830901 const elementTypeConstraint = getJsxElementTypeTypeAt(jsxOpeningLikeNode);
3089930902 if (elementTypeConstraint !== undefined) {
3090030903 const tagName = jsxOpeningLikeNode.tagName;
30901- const tagType = isJsxIntrinsicIdentifier (tagName)
30902- ? getStringLiteralType(unescapeLeadingUnderscores (tagName.escapedText ))
30904+ const tagType = isJsxIntrinsicTagName (tagName)
30905+ ? getStringLiteralType(intrinsicTagNameToString (tagName))
3090330906 : checkExpression(tagName);
3090430907 checkTypeRelatedTo(tagType, elementTypeConstraint, assignableRelation, tagName, Diagnostics.Its_type_0_is_not_a_valid_JSX_element_type, () => {
3090530908 const componentName = getTextOfNode(tagName);
@@ -32519,7 +32522,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3251932522 }
3252032523
3252132524 function getJsxReferenceKind(node: JsxOpeningLikeElement): JsxReferenceKind {
32522- if (isJsxIntrinsicIdentifier (node.tagName)) {
32525+ if (isJsxIntrinsicTagName (node.tagName)) {
3252332526 return JsxReferenceKind.Mixed;
3252432527 }
3252532528 const tagType = getApparentType(checkExpression(node.tagName));
@@ -32566,7 +32569,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3256632569 if (getJsxNamespaceContainerForImplicitImport(node)) {
3256732570 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)
3256832571 }
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;
3257032573 if (!tagType) {
3257132574 return true;
3257232575 }
@@ -33970,7 +33973,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3397033973 }
3397133974
3397233975 function resolveJsxOpeningLikeElement(node: JsxOpeningLikeElement, candidatesOutArray: Signature[] | undefined, checkMode: CheckMode): Signature {
33973- if (isJsxIntrinsicIdentifier (node.tagName)) {
33976+ if (isJsxIntrinsicTagName (node.tagName)) {
3397433977 const result = getIntrinsicAttributesTypeFromJsxOpeningLikeElement(node);
3397533978 const fakeSignature = createSignatureForJSXIntrinsic(node, result);
3397633979 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 {
4543545438 const isJSDoc = findAncestor(name, or(isJSDocLinkLike, isJSDocNameReference, isJSDocMemberName));
4543645439 const meaning = isJSDoc ? SymbolFlags.Type | SymbolFlags.Namespace | SymbolFlags.Value : SymbolFlags.Value;
4543745440 if (name.kind === SyntaxKind.Identifier) {
45438- if (isJSXTagName(name) && isJsxIntrinsicIdentifier (name)) {
45441+ if (isJSXTagName(name) && isJsxIntrinsicTagName (name)) {
4543945442 const symbol = getIntrinsicTagSymbol(name.parent as JsxOpeningLikeElement);
4544045443 return symbol === unknownSymbol ? undefined : symbol;
4544145444 }
@@ -45682,6 +45685,12 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4568245685 return isMetaProperty(node.parent) ? checkMetaPropertyKeyword(node.parent).symbol : undefined;
4568345686 case SyntaxKind.MetaProperty:
4568445687 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
4568545694
4568645695 default:
4568745696 return undefined;
0 commit comments