@@ -41906,7 +41906,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
41906
41906
}
41907
41907
41908
41908
function checkFunctionOrConstructorSymbolWorker(symbol: Symbol): void {
41909
- function getCanonicalOverload(overloads: Declaration[], implementation: FunctionLikeDeclaration | undefined): Declaration {
41909
+ function getCanonicalOverload(overloads: readonly Declaration[], implementation: FunctionLikeDeclaration | undefined): Declaration {
41910
41910
// Consider the canonical set of flags to be the flags of the bodyDeclaration or the first declaration
41911
41911
// Error on all deviations from this canonical set of flags
41912
41912
// 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 {
41922
41922
const someButNotAllOverloadFlags = someOverloadFlags ^ allOverloadFlags;
41923
41923
if (someButNotAllOverloadFlags !== 0) {
41924
41924
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
+ }
41938
41954
}
41939
41955
});
41940
41956
}
0 commit comments