Fixed default-like export info lookup with export= that have default export (#60035)

This commit is contained in:
Mateusz Burzyński 2024-10-15 18:00:54 +02:00 committed by GitHub
parent 40caf34319
commit d61938d8a3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 96 additions and 1 deletions

View File

@ -604,7 +604,11 @@ export function getDefaultLikeExportInfo(moduleSymbol: Symbol, checker: TypeChec
exportKind: ExportKind;
} | undefined {
const exportEquals = checker.resolveExternalModuleSymbol(moduleSymbol);
if (exportEquals !== moduleSymbol) return { symbol: exportEquals, exportKind: ExportKind.ExportEquals };
if (exportEquals !== moduleSymbol) {
const defaultExport = checker.tryGetMemberInModuleExports(InternalSymbolName.Default, exportEquals);
if (defaultExport) return { symbol: defaultExport, exportKind: ExportKind.Default };
return { symbol: exportEquals, exportKind: ExportKind.ExportEquals };
}
const defaultExport = checker.tryGetMemberInModuleExports(InternalSymbolName.Default, moduleSymbol);
if (defaultExport) return { symbol: defaultExport, exportKind: ExportKind.Default };
}

View File

@ -0,0 +1,91 @@
/// <reference path="fourslash.ts" />
// @strict: true
// @module: commonjs
// @filename: node.ts
//// import Container from "./container.js";
//// import Document from "./document.js";
////
//// declare namespace Node {
//// class Node extends Node_ {}
////
//// export { Node as default };
//// }
////
//// declare abstract class Node_ {
//// parent: Container | Document | undefined;
//// }
////
//// declare class Node extends Node_ {}
////
//// export = Node;
// @filename: document.ts
//// import Container from "./container.js";
////
//// declare namespace Document {
//// export { Document_ as default };
//// }
////
//// declare class Document_ extends Container {}
////
//// declare class Document extends Document_ {}
////
//// export = Document;
// @filename: container.ts
//// import Node from "./node.js";
////
//// declare namespace Container {
//// export { Container_ as default };
//// }
////
//// declare abstract class Container_ extends Node {
//// p/*1*/
//// }
////
//// declare class Container extends Container_ {}
////
//// export = Container;
const preferences = {
includeCompletionsWithInsertText: true,
includeCompletionsWithClassMemberSnippets: true,
};
verify.completions({
marker: "1",
includes: [
{
name: "parent",
insertText: "parent: Container_ | Document_ | undefined;",
filterText: "parent",
hasAction: true,
source: "ClassMemberSnippet/",
},
],
preferences,
isNewIdentifierLocation: true,
});
verify.applyCodeActionFromCompletion("1", {
name: "parent",
source: "ClassMemberSnippet/",
description: `Includes imports of types referenced by 'parent'`,
newFileContent: `import Document_ from "./document.js";
import Node from "./node.js";
declare namespace Container {
export { Container_ as default };
}
declare abstract class Container_ extends Node {
p
}
declare class Container extends Container_ {}
export = Container;`,
preferences,
});