@@ -1400,10 +1400,10 @@ namespace ts {
14001400 return resolveExternalModuleSymbol(node.parent.symbol, dontResolveAlias);
14011401 }
14021402
1403- function getTargetOfExportSpecifier(node: ExportSpecifier, dontResolveAlias?: boolean): Symbol {
1404- return (<ExportDeclaration> node.parent.parent) .moduleSpecifier ?
1405- getExternalModuleMember(<ExportDeclaration> node.parent.parent, node, dontResolveAlias) :
1406- resolveEntityName(node.propertyName || node.name, SymbolFlags.Value | SymbolFlags.Type | SymbolFlags.Namespace , /*ignoreErrors*/ false, dontResolveAlias);
1403+ function getTargetOfExportSpecifier(node: ExportSpecifier, meaning: SymbolFlags, dontResolveAlias?: boolean) {
1404+ return node.parent.parent.moduleSpecifier ?
1405+ getExternalModuleMember(node.parent.parent, node, dontResolveAlias) :
1406+ resolveEntityName(node.propertyName || node.name, meaning , /*ignoreErrors*/ false, dontResolveAlias);
14071407 }
14081408
14091409 function getTargetOfExportAssignment(node: ExportAssignment, dontResolveAlias: boolean): Symbol {
@@ -1421,7 +1421,7 @@ namespace ts {
14211421 case SyntaxKind.ImportSpecifier:
14221422 return getTargetOfImportSpecifier(<ImportSpecifier>node, dontRecursivelyResolve);
14231423 case SyntaxKind.ExportSpecifier:
1424- return getTargetOfExportSpecifier(<ExportSpecifier>node, dontRecursivelyResolve);
1424+ return getTargetOfExportSpecifier(<ExportSpecifier>node, SymbolFlags.Value | SymbolFlags.Type | SymbolFlags.Namespace, dontRecursivelyResolve);
14251425 case SyntaxKind.ExportAssignment:
14261426 return getTargetOfExportAssignment(<ExportAssignment>node, dontRecursivelyResolve);
14271427 case SyntaxKind.NamespaceExportDeclaration:
@@ -3721,10 +3721,7 @@ namespace ts {
37213721 exportSymbol = resolveName(node.parent, node.text, SymbolFlags.Value | SymbolFlags.Type | SymbolFlags.Namespace | SymbolFlags.Alias, Diagnostics.Cannot_find_name_0, node);
37223722 }
37233723 else if (node.parent.kind === SyntaxKind.ExportSpecifier) {
3724- const exportSpecifier = <ExportSpecifier>node.parent;
3725- exportSymbol = (<ExportDeclaration>exportSpecifier.parent.parent).moduleSpecifier ?
3726- getExternalModuleMember(<ExportDeclaration>exportSpecifier.parent.parent, exportSpecifier) :
3727- resolveEntityName(exportSpecifier.propertyName || exportSpecifier.name, SymbolFlags.Value | SymbolFlags.Type | SymbolFlags.Namespace | SymbolFlags.Alias);
3724+ exportSymbol = getTargetOfExportSpecifier(<ExportSpecifier>node.parent, SymbolFlags.Value | SymbolFlags.Type | SymbolFlags.Namespace | SymbolFlags.Alias);
37283725 }
37293726 const result: Node[] = [];
37303727 if (exportSymbol) {
@@ -9228,25 +9225,39 @@ namespace ts {
92289225 let result = Ternary.True;
92299226 const saveErrorInfo = errorInfo;
92309227
9231- outer: for (const t of targetSignatures) {
9232- // Only elaborate errors from the first failure
9233- let shouldElaborateErrors = reportErrors;
9234- for (const s of sourceSignatures) {
9235- const related = signatureRelatedTo(s, t, shouldElaborateErrors);
9236- if (related) {
9237- result &= related;
9238- errorInfo = saveErrorInfo;
9239- continue outer;
9228+ if (getObjectFlags(source) & ObjectFlags.Instantiated && getObjectFlags(target) & ObjectFlags.Instantiated && source.symbol === target.symbol) {
9229+ // We instantiations of the same anonymous type (which typically will be the type of a method).
9230+ // Simply do a pairwise comparison of the signatures in the two signature lists instead of the
9231+ // much more expensive N * M comparison matrix we explore below.
9232+ for (let i = 0; i < targetSignatures.length; i++) {
9233+ const related = signatureRelatedTo(sourceSignatures[i], targetSignatures[i], reportErrors);
9234+ if (!related) {
9235+ return Ternary.False;
92409236 }
9241- shouldElaborateErrors = false ;
9237+ result &= related ;
92429238 }
9239+ }
9240+ else {
9241+ outer: for (const t of targetSignatures) {
9242+ // Only elaborate errors from the first failure
9243+ let shouldElaborateErrors = reportErrors;
9244+ for (const s of sourceSignatures) {
9245+ const related = signatureRelatedTo(s, t, shouldElaborateErrors);
9246+ if (related) {
9247+ result &= related;
9248+ errorInfo = saveErrorInfo;
9249+ continue outer;
9250+ }
9251+ shouldElaborateErrors = false;
9252+ }
92439253
9244- if (shouldElaborateErrors) {
9245- reportError(Diagnostics.Type_0_provides_no_match_for_the_signature_1,
9246- typeToString(source),
9247- signatureToString(t, /*enclosingDeclaration*/ undefined, /*flags*/ undefined, kind));
9254+ if (shouldElaborateErrors) {
9255+ reportError(Diagnostics.Type_0_provides_no_match_for_the_signature_1,
9256+ typeToString(source),
9257+ signatureToString(t, /*enclosingDeclaration*/ undefined, /*flags*/ undefined, kind));
9258+ }
9259+ return Ternary.False;
92489260 }
9249- return Ternary.False;
92509261 }
92519262 return result;
92529263 }
0 commit comments