@@ -275,6 +275,7 @@ import {
275
275
getEntityNameFromTypeNode,
276
276
getErrorSpanForNode,
277
277
getEscapedTextOfIdentifierOrLiteral,
278
+ getEscapedTextOfJsxAttributeName,
278
279
getESModuleInterop,
279
280
getExpandoInitializer,
280
281
getExportAssignmentExpression,
@@ -350,6 +351,7 @@ import {
350
351
getSymbolNameForPrivateIdentifier,
351
352
getTextOfIdentifierOrLiteral,
352
353
getTextOfJSDocComment,
354
+ getTextOfJsxAttributeName,
353
355
getTextOfNode,
354
356
getTextOfPropertyName,
355
357
getThisContainer,
@@ -593,6 +595,7 @@ import {
593
595
isJsxAttributeLike,
594
596
isJsxAttributes,
595
597
isJsxElement,
598
+ isJsxNamespacedName,
596
599
isJsxOpeningElement,
597
600
isJsxOpeningFragment,
598
601
isJsxOpeningLikeElement,
@@ -807,7 +810,6 @@ import {
807
810
MappedTypeNode,
808
811
MatchingKeys,
809
812
maybeBind,
810
- MemberName,
811
813
MemberOverrideStatus,
812
814
memoize,
813
815
MetaProperty,
@@ -13517,7 +13519,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
13517
13519
function isTypeInvalidDueToUnionDiscriminant(contextualType: Type, obj: ObjectLiteralExpression | JsxAttributes): boolean {
13518
13520
const list = obj.properties as NodeArray<ObjectLiteralElementLike | JsxAttributeLike>;
13519
13521
return list.some(property => {
13520
- const nameType = property.name && getLiteralTypeFromPropertyName(property.name);
13522
+ const nameType = property.name && (isJsxNamespacedName(property.name) ? getStringLiteralType(getTextOfJsxAttributeName(property.name)) : getLiteralTypeFromPropertyName(property.name) );
13521
13523
const name = nameType && isTypeUsableAsPropertyName(nameType) ? getPropertyNameFromType(nameType) : undefined;
13522
13524
const expected = name === undefined ? undefined : getTypeOfPropertyOfType(contextualType, name);
13523
13525
return !!expected && isLiteralType(expected) && !isTypeAssignableTo(getTypeOfNode(property), expected);
@@ -19590,8 +19592,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
19590
19592
function *generateJsxAttributes(node: JsxAttributes): ElaborationIterator {
19591
19593
if (!length(node.properties)) return;
19592
19594
for (const prop of node.properties) {
19593
- if (isJsxSpreadAttribute(prop) || isHyphenatedJsxName(idText (prop.name))) continue;
19594
- yield { errorNode: prop.name, innerExpression: prop.initializer, nameType: getStringLiteralType(idText (prop.name)) };
19595
+ if (isJsxSpreadAttribute(prop) || isHyphenatedJsxName(getTextOfJsxAttributeName (prop.name))) continue;
19596
+ yield { errorNode: prop.name, innerExpression: prop.initializer, nameType: getStringLiteralType(getTextOfJsxAttributeName (prop.name)) };
19595
19597
}
19596
19598
}
19597
19599
@@ -29266,7 +29268,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
29266
29268
if (!attributesType || isTypeAny(attributesType)) {
29267
29269
return undefined;
29268
29270
}
29269
- return getTypeOfPropertyOfContextualType(attributesType, attribute.name.escapedText );
29271
+ return getTypeOfPropertyOfContextualType(attributesType, getEscapedTextOfJsxAttributeName( attribute.name) );
29270
29272
}
29271
29273
else {
29272
29274
return getContextualType(attribute.parent, contextFlags);
@@ -30400,12 +30402,12 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
30400
30402
attributeSymbol.links.target = member;
30401
30403
attributesTable.set(attributeSymbol.escapedName, attributeSymbol);
30402
30404
allAttributesTable?.set(attributeSymbol.escapedName, attributeSymbol);
30403
- if (attributeDecl.name.escapedText === jsxChildrenPropertyName) {
30405
+ if (getEscapedTextOfJsxAttributeName( attributeDecl.name) === jsxChildrenPropertyName) {
30404
30406
explicitlySpecifyChildrenAttribute = true;
30405
30407
}
30406
30408
if (contextualType) {
30407
30409
const prop = getPropertyOfType(contextualType, member.escapedName);
30408
- if (prop && prop.declarations && isDeprecatedSymbol(prop)) {
30410
+ if (prop && prop.declarations && isDeprecatedSymbol(prop) && isIdentifier(attributeDecl.name) ) {
30409
30411
addDeprecatedSuggestion(attributeDecl.name, prop.declarations, attributeDecl.name.escapedText as string);
30410
30412
}
30411
30413
}
@@ -47852,8 +47854,9 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
47852
47854
}
47853
47855
47854
47856
const { name, initializer } = attr;
47855
- if (!seen.get(name.escapedText)) {
47856
- seen.set(name.escapedText, true);
47857
+ const escapedText = getEscapedTextOfJsxAttributeName(name);
47858
+ if (!seen.get(escapedText)) {
47859
+ seen.set(escapedText, true);
47857
47860
}
47858
47861
else {
47859
47862
return grammarErrorOnNode(name, Diagnostics.JSX_elements_cannot_have_multiple_attributes_with_the_same_name);
@@ -47866,25 +47869,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
47866
47869
}
47867
47870
47868
47871
function checkGrammarJsxName(node: JsxTagNameExpression) {
47869
- if (isPropertyAccessExpression(node)) {
47870
- let propName: JsxTagNameExpression = node;
47871
- do {
47872
- const check = checkGrammarJsxNestedIdentifier(propName.name);
47873
- if (check) {
47874
- return check;
47875
- }
47876
- propName = propName.expression;
47877
- } while (isPropertyAccessExpression(propName));
47878
- const check = checkGrammarJsxNestedIdentifier(propName);
47879
- if (check) {
47880
- return check;
47881
- }
47872
+ if (isPropertyAccessExpression(node) && isJsxNamespacedName(node.expression)) {
47873
+ return grammarErrorOnNode(node.expression, Diagnostics.JSX_property_access_expressions_cannot_include_JSX_namespace_names);
47882
47874
}
47883
-
47884
- function checkGrammarJsxNestedIdentifier(name: MemberName | ThisExpression) {
47885
- if (isIdentifier(name) && idText(name).indexOf(":") !== -1) {
47886
- return grammarErrorOnNode(name, Diagnostics.JSX_property_access_expressions_cannot_include_JSX_namespace_names);
47887
- }
47875
+ if (isJsxNamespacedName(node) && getJSXTransformEnabled(compilerOptions) && !isIntrinsicJsxName(node.namespace.escapedText)) {
47876
+ return grammarErrorOnNode(node, Diagnostics.React_components_cannot_include_JSX_namespace_names);
47888
47877
}
47889
47878
}
47890
47879
0 commit comments