@@ -41906,7 +41906,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4190641906 }
4190741907
4190841908 function checkFunctionOrConstructorSymbolWorker(symbol: Symbol): void {
41909- function getCanonicalOverload(overloads: Declaration[], implementation: FunctionLikeDeclaration | undefined): Declaration {
41909+ function getCanonicalOverload(overloads: readonly Declaration[], implementation: FunctionLikeDeclaration | undefined): Declaration {
4191041910 // Consider the canonical set of flags to be the flags of the bodyDeclaration or the first declaration
4191141911 // Error on all deviations from this canonical set of flags
4191241912 // The caveat is that if some overloads are defined in lib.d.ts, we don't want to
@@ -41922,19 +41922,35 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
4192241922 const someButNotAllOverloadFlags = someOverloadFlags ^ allOverloadFlags;
4192341923 if (someButNotAllOverloadFlags !== 0) {
4192441924 const canonicalFlags = getEffectiveDeclarationFlags(getCanonicalOverload(overloads, implementation), flagsToCheck);
41925- forEach(overloads, o => {
41926- const deviation = getEffectiveDeclarationFlags(o, flagsToCheck) ^ canonicalFlags;
41927- if (deviation & ModifierFlags.Export) {
41928- error(getNameOfDeclaration(o), Diagnostics.Overload_signatures_must_all_be_exported_or_non_exported);
41929- }
41930- else if (deviation & ModifierFlags.Ambient) {
41931- error(getNameOfDeclaration(o), Diagnostics.Overload_signatures_must_all_be_ambient_or_non_ambient);
41932- }
41933- else if (deviation & (ModifierFlags.Private | ModifierFlags.Protected)) {
41934- error(getNameOfDeclaration(o) || o, Diagnostics.Overload_signatures_must_all_be_public_private_or_protected);
41935- }
41936- else if (deviation & ModifierFlags.Abstract) {
41937- error(getNameOfDeclaration(o), Diagnostics.Overload_signatures_must_all_be_abstract_or_non_abstract);
41925+ group(overloads, o => getSourceFileOfNode(o).fileName).forEach(overloadsInFile => {
41926+ const canonicalFlagsForFile = getEffectiveDeclarationFlags(getCanonicalOverload(overloadsInFile, implementation), flagsToCheck);
41927+ for (const o of overloadsInFile) {
41928+ const deviation = getEffectiveDeclarationFlags(o, flagsToCheck) ^ canonicalFlags;
41929+ const deviationInFile = getEffectiveDeclarationFlags(o, flagsToCheck) ^ canonicalFlagsForFile;
41930+ if (deviationInFile & ModifierFlags.Export) {
41931+ // Overloads in different files need not all have export modifiers. This is ok:
41932+ // // lib.d.ts
41933+ // declare function foo(s: number): string;
41934+ // declare function foo(s: string): number;
41935+ // export { foo };
41936+ //
41937+ // // app.ts
41938+ // declare module "lib" {
41939+ // export function foo(s: boolean): boolean;
41940+ // }
41941+ error(getNameOfDeclaration(o), Diagnostics.Overload_signatures_must_all_be_exported_or_non_exported);
41942+ }
41943+ else if (deviationInFile & ModifierFlags.Ambient) {
41944+ // Though rare, a module augmentation (necessarily ambient) is allowed to add overloads
41945+ // to a non-ambient function in an implementation file.
41946+ error(getNameOfDeclaration(o), Diagnostics.Overload_signatures_must_all_be_ambient_or_non_ambient);
41947+ }
41948+ else if (deviation & (ModifierFlags.Private | ModifierFlags.Protected)) {
41949+ error(getNameOfDeclaration(o) || o, Diagnostics.Overload_signatures_must_all_be_public_private_or_protected);
41950+ }
41951+ else if (deviation & ModifierFlags.Abstract) {
41952+ error(getNameOfDeclaration(o), Diagnostics.Overload_signatures_must_all_be_abstract_or_non_abstract);
41953+ }
4193841954 }
4193941955 });
4194041956 }
0 commit comments