@@ -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,
@@ -29597,7 +29600,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
2959729600 }
2959829601
2959929602 function getStaticTypeOfReferencedJsxConstructor(context: JsxOpeningLikeElement) {
29600- if (isJsxIntrinsicIdentifier (context.tagName)) {
29603+ if (isJsxIntrinsicTagName (context.tagName)) {
2960129604 const result = getIntrinsicAttributesTypeFromJsxOpeningLikeElement(context);
2960229605 const fakeSignature = createSignatureForJSXIntrinsic(context, result);
2960329606 return getOrCreateTypeFromSignature(fakeSignature);
@@ -30317,7 +30320,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3031730320 checkJsxOpeningLikeElementOrOpeningFragment(node.openingElement);
3031830321
3031930322 // 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)) {
3032130324 getIntrinsicTagSymbol(node.closingElement);
3032230325 }
3032330326 else {
@@ -30357,8 +30360,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3035730360 /**
3035830361 * Returns true iff React would emit this tag name as a string rather than an identifier or qualified name
3035930362 */
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 );
3036230365 }
3036330366
3036430367 function checkJsxAttribute(node: JsxAttribute, checkMode?: CheckMode) {
@@ -30563,8 +30566,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3056330566 const intrinsicElementsType = getJsxType(JsxNames.IntrinsicElements, node);
3056430567 if (!isErrorType(intrinsicElementsType)) {
3056530568 // 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);
3056830571 if (intrinsicProp) {
3056930572 links.jsxFlags |= JsxFlags.IntrinsicNamedElement;
3057030573 return links.resolvedSymbol = intrinsicProp;
@@ -30578,7 +30581,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3057830581 }
3057930582
3058030583 // 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);
3058230585 return links.resolvedSymbol = unknownSymbol;
3058330586 }
3058430587 else {
@@ -30787,7 +30790,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3078730790 * @param node an intrinsic JSX opening-like element
3078830791 */
3078930792 function getIntrinsicAttributesTypeFromJsxOpeningLikeElement(node: JsxOpeningLikeElement): Type {
30790- Debug.assert(isJsxIntrinsicIdentifier (node.tagName));
30793+ Debug.assert(isJsxIntrinsicTagName (node.tagName));
3079130794 const links = getNodeLinks(node);
3079230795 if (!links.resolvedJsxElementAttributesType) {
3079330796 const symbol = getIntrinsicTagSymbol(node);
@@ -30900,8 +30903,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3090030903 const elementTypeConstraint = getJsxElementTypeTypeAt(jsxOpeningLikeNode);
3090130904 if (elementTypeConstraint !== undefined) {
3090230905 const tagName = jsxOpeningLikeNode.tagName;
30903- const tagType = isJsxIntrinsicIdentifier (tagName)
30904- ? getStringLiteralType(unescapeLeadingUnderscores (tagName.escapedText ))
30906+ const tagType = isJsxIntrinsicTagName (tagName)
30907+ ? getStringLiteralType(intrinsicTagNameToString (tagName))
3090530908 : checkExpression(tagName);
3090630909 checkTypeRelatedTo(tagType, elementTypeConstraint, assignableRelation, tagName, Diagnostics.Its_type_0_is_not_a_valid_JSX_element_type, () => {
3090730910 const componentName = getTextOfNode(tagName);
@@ -32521,7 +32524,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3252132524 }
3252232525
3252332526 function getJsxReferenceKind(node: JsxOpeningLikeElement): JsxReferenceKind {
32524- if (isJsxIntrinsicIdentifier (node.tagName)) {
32527+ if (isJsxIntrinsicTagName (node.tagName)) {
3252532528 return JsxReferenceKind.Mixed;
3252632529 }
3252732530 const tagType = getApparentType(checkExpression(node.tagName));
@@ -32568,7 +32571,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3256832571 if (getJsxNamespaceContainerForImplicitImport(node)) {
3256932572 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)
3257032573 }
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;
3257232575 if (!tagType) {
3257332576 return true;
3257432577 }
@@ -33972,7 +33975,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
3397233975 }
3397333976
3397433977 function resolveJsxOpeningLikeElement(node: JsxOpeningLikeElement, candidatesOutArray: Signature[] | undefined, checkMode: CheckMode): Signature {
33975- if (isJsxIntrinsicIdentifier (node.tagName)) {
33978+ if (isJsxIntrinsicTagName (node.tagName)) {
3397633979 const result = getIntrinsicAttributesTypeFromJsxOpeningLikeElement(node);
3397733980 const fakeSignature = createSignatureForJSXIntrinsic(node, result);
3397833981 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 {
4543845441 const isJSDoc = findAncestor(name, or(isJSDocLinkLike, isJSDocNameReference, isJSDocMemberName));
4543945442 const meaning = isJSDoc ? SymbolFlags.Type | SymbolFlags.Namespace | SymbolFlags.Value : SymbolFlags.Value;
4544045443 if (name.kind === SyntaxKind.Identifier) {
45441- if (isJSXTagName(name) && isJsxIntrinsicIdentifier (name)) {
45444+ if (isJSXTagName(name) && isJsxIntrinsicTagName (name)) {
4544245445 const symbol = getIntrinsicTagSymbol(name.parent as JsxOpeningLikeElement);
4544345446 return symbol === unknownSymbol ? undefined : symbol;
4544445447 }
@@ -45685,6 +45688,12 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4568545688 return isMetaProperty(node.parent) ? checkMetaPropertyKeyword(node.parent).symbol : undefined;
4568645689 case SyntaxKind.MetaProperty:
4568745690 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
4568845697
4568945698 default:
4569045699 return undefined;
0 commit comments