@@ -939,6 +939,7 @@ namespace ts {
939939 if (jsxPragma) {
940940 const chosenpragma = isArray(jsxPragma) ? jsxPragma[0] : jsxPragma;
941941 file.localJsxFactory = parseIsolatedEntityName(chosenpragma.arguments.factory, languageVersion);
942+ visitNode(file.localJsxFactory, markAsSynthetic);
942943 if (file.localJsxFactory) {
943944 return file.localJsxNamespace = getFirstIdentifier(file.localJsxFactory).escapedText;
944945 }
@@ -949,6 +950,7 @@ namespace ts {
949950 _jsxNamespace = "React" as __String;
950951 if (compilerOptions.jsxFactory) {
951952 _jsxFactoryEntity = parseIsolatedEntityName(compilerOptions.jsxFactory, languageVersion);
953+ visitNode(_jsxFactoryEntity, markAsSynthetic);
952954 if (_jsxFactoryEntity) {
953955 _jsxNamespace = getFirstIdentifier(_jsxFactoryEntity).escapedText;
954956 }
@@ -957,7 +959,16 @@ namespace ts {
957959 _jsxNamespace = escapeLeadingUnderscores(compilerOptions.reactNamespace);
958960 }
959961 }
962+ if (!_jsxFactoryEntity) {
963+ _jsxFactoryEntity = createQualifiedName(createIdentifier(unescapeLeadingUnderscores(_jsxNamespace)), "createElement");
964+ }
960965 return _jsxNamespace;
966+
967+ function markAsSynthetic(node: Node): VisitResult<Node> {
968+ node.pos = -1;
969+ node.end = -1;
970+ return visitEachChild(node, markAsSynthetic, nullTransformationContext);
971+ }
961972 }
962973
963974 function getEmitResolver(sourceFile: SourceFile, cancellationToken: CancellationToken) {
@@ -2801,8 +2812,8 @@ namespace ts {
28012812 const namespaceMeaning = SymbolFlags.Namespace | (isInJSFile(name) ? meaning & SymbolFlags.Value : 0);
28022813 let symbol: Symbol | undefined;
28032814 if (name.kind === SyntaxKind.Identifier) {
2804- const message = meaning === namespaceMeaning ? Diagnostics.Cannot_find_namespace_0 : getCannotFindNameDiagnosticForName(getFirstIdentifier(name));
2805- const symbolFromJSPrototype = isInJSFile(name) ? resolveEntityNameFromAssignmentDeclaration(name, meaning) : undefined;
2815+ const message = meaning === namespaceMeaning || nodeIsSynthesized(name) ? Diagnostics.Cannot_find_namespace_0 : getCannotFindNameDiagnosticForName(getFirstIdentifier(name));
2816+ const symbolFromJSPrototype = isInJSFile(name) && !nodeIsSynthesized(name) ? resolveEntityNameFromAssignmentDeclaration(name, meaning) : undefined;
28062817 symbol = resolveName(location || name, name.escapedText, meaning, ignoreErrors || symbolFromJSPrototype ? undefined : message, name, /*isUse*/ true);
28072818 if (!symbol) {
28082819 return symbolFromJSPrototype;
@@ -2845,7 +2856,7 @@ namespace ts {
28452856 throw Debug.assertNever(name, "Unknown entity name kind.");
28462857 }
28472858 Debug.assert((getCheckFlags(symbol) & CheckFlags.Instantiated) === 0, "Should never get an instantiated symbol here.");
2848- if (isEntityName(name) && (symbol.flags & SymbolFlags.Alias || name.parent.kind === SyntaxKind.ExportAssignment)) {
2859+ if (!nodeIsSynthesized(name) && isEntityName(name) && (symbol.flags & SymbolFlags.Alias || name.parent.kind === SyntaxKind.ExportAssignment)) {
28492860 markSymbolOfAliasDeclarationIfTypeOnly(getAliasDeclarationFromName(name), symbol, /*finalTarget*/ undefined, /*overwriteEmpty*/ true);
28502861 }
28512862 return (symbol.flags & meaning) || dontResolveAlias ? symbol : resolveAlias(symbol);
@@ -24298,6 +24309,9 @@ namespace ts {
2429824309 // can be specified by users through attributes property.
2429924310 const paramType = getEffectiveFirstArgumentForJsxSignature(signature, node);
2430024311 const attributesType = checkExpressionWithContextualType(node.attributes, paramType, /*inferenceContext*/ undefined, checkMode);
24312+ if (!checkTagNameDoesNotExpectTooManyArguments()) {
24313+ return false;
24314+ }
2430124315 return checkTypeRelatedToAndOptionallyElaborate(
2430224316 attributesType,
2430324317 paramType,
@@ -24307,6 +24321,68 @@ namespace ts {
2430724321 /*headMessage*/ undefined,
2430824322 containingMessageChain,
2430924323 errorOutputContainer);
24324+
24325+ function checkTagNameDoesNotExpectTooManyArguments(): boolean {
24326+ const tagType = isJsxOpeningElement(node) || isJsxSelfClosingElement(node) && !isJsxIntrinsicIdentifier(node.tagName) ? checkExpression(node.tagName) : undefined;
24327+ if (!tagType) {
24328+ return true;
24329+ }
24330+ const tagCallSignatures = getSignaturesOfType(tagType, SignatureKind.Call);
24331+ if (!length(tagCallSignatures)) {
24332+ return true;
24333+ }
24334+ const factory = getJsxFactoryEntity(node);
24335+ if (!factory) {
24336+ return true;
24337+ }
24338+ const factorySymbol = resolveEntityName(factory, SymbolFlags.Value, /*ignoreErrors*/ true, /*dontResolveAlias*/ false, node);
24339+ if (!factorySymbol) {
24340+ return true;
24341+ }
24342+
24343+ const factoryType = getTypeOfSymbol(factorySymbol);
24344+ const callSignatures = getSignaturesOfType(factoryType, SignatureKind.Call);
24345+ if (!length(callSignatures)) {
24346+ return true;
24347+ }
24348+
24349+ let hasFirstparamSignatures = false;
24350+ // Check that _some_
24351+ for (const sig of callSignatures) {
24352+ const firstparam = getTypeAtPosition(sig, 0);
24353+ const signaturesOfParam = getSignaturesOfType(firstparam, SignatureKind.Call);
24354+ if (!length(signaturesOfParam)) continue;
24355+ for (const paramSig of signaturesOfParam) {
24356+ hasFirstparamSignatures = true;
24357+ if (hasEffectiveRestParameter(paramSig)) {
24358+ return true; // some signature has a rest param, so function components can have an aritrary number of arguments
24359+ }
24360+ const paramCount = getParameterCount(paramSig);
24361+ for (const tagSig of tagCallSignatures) {
24362+ const tagParamCount = getParameterCount(tagSig);
24363+ if (tagParamCount <= paramCount) {
24364+ return true; // some signature accepts the number of arguments the function component provides
24365+ }
24366+ }
24367+ }
24368+ }
24369+ if (!hasFirstparamSignatures) {
24370+ // Not a single signature had a first parameter which expected a signature - for back compat, and
24371+ // to guard against generic factories which won't have signatures directly, return true
24372+ return true;
24373+ }
24374+
24375+ if (reportErrors) {
24376+ const diag = createDiagnosticForNode(node.tagName, Diagnostics.Function_like_tag_expects_more_arguments_than_the_JSX_factory_can_provide);
24377+ if (errorOutputContainer && errorOutputContainer.skipLogging) {
24378+ (errorOutputContainer.errors || (errorOutputContainer.errors = [])).push(diag);
24379+ }
24380+ if (!errorOutputContainer.skipLogging) {
24381+ diagnostics.add(diag);
24382+ }
24383+ }
24384+ return false;
24385+ }
2431024386 }
2431124387
2431224388 function getSignatureApplicabilityError(
@@ -35175,6 +35251,10 @@ namespace ts {
3517535251 return literalTypeToNode(<FreshableType>type, node, tracker);
3517635252 }
3517735253
35254+ function getJsxFactoryEntity(location: Node) {
35255+ return location ? (getJsxNamespace(location), (getSourceFileOfNode(location).localJsxFactory || _jsxFactoryEntity)) : _jsxFactoryEntity;
35256+ }
35257+
3517835258 function createResolver(): EmitResolver {
3517935259 // this variable and functions that use it are deliberately moved here from the outer scope
3518035260 // to avoid scope pollution
@@ -35246,7 +35326,7 @@ namespace ts {
3524635326 const symbol = node && getSymbolOfNode(node);
3524735327 return !!(symbol && getCheckFlags(symbol) & CheckFlags.Late);
3524835328 },
35249- getJsxFactoryEntity: location => location ? (getJsxNamespace(location), (getSourceFileOfNode(location).localJsxFactory || _jsxFactoryEntity)) : _jsxFactoryEntity ,
35329+ getJsxFactoryEntity,
3525035330 getAllAccessorDeclarations(accessor: AccessorDeclaration): AllAccessorDeclarations {
3525135331 accessor = getParseTreeNode(accessor, isGetOrSetAccessorDeclaration)!; // TODO: GH#18217
3525235332 const otherKind = accessor.kind === SyntaxKind.SetAccessor ? SyntaxKind.GetAccessor : SyntaxKind.SetAccessor;
0 commit comments