From d61938d8a326563ce8a2b19728ea9ff3edd7a76e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Tue, 15 Oct 2024 18:00:54 +0200 Subject: [PATCH] Fixed default-like export info lookup with `export=` that have `default` export (#60035) --- src/services/exportInfoMap.ts | 6 +- ...mportCompletionExportEqualsWithDefault1.ts | 91 +++++++++++++++++++ 2 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 tests/cases/fourslash/autoImportCompletionExportEqualsWithDefault1.ts diff --git a/src/services/exportInfoMap.ts b/src/services/exportInfoMap.ts index 1bfa8ab0185..acfb3765c7c 100644 --- a/src/services/exportInfoMap.ts +++ b/src/services/exportInfoMap.ts @@ -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 }; } diff --git a/tests/cases/fourslash/autoImportCompletionExportEqualsWithDefault1.ts b/tests/cases/fourslash/autoImportCompletionExportEqualsWithDefault1.ts new file mode 100644 index 00000000000..6e5f3c6614a --- /dev/null +++ b/tests/cases/fourslash/autoImportCompletionExportEqualsWithDefault1.ts @@ -0,0 +1,91 @@ +/// + +// @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, +});