From 2b59c9a0d75b1fb6e932636ce96fb3254fce9d84 Mon Sep 17 00:00:00 2001 From: Andy Date: Fri, 6 Apr 2018 10:05:38 -0700 Subject: [PATCH] Don't add import completion for re-export with different name (#23211) --- src/services/codefixes/importFixes.ts | 6 ++--- ...sImport_default_exportDefaultIdentifier.ts | 2 +- .../completionsImport_reExport_wrongName.ts | 27 +++++++++++++++++++ 3 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 tests/cases/fourslash/completionsImport_reExport_wrongName.ts diff --git a/src/services/codefixes/importFixes.ts b/src/services/codefixes/importFixes.ts index 95cd84ee620..6becea1c6d3 100644 --- a/src/services/codefixes/importFixes.ts +++ b/src/services/codefixes/importFixes.ts @@ -98,18 +98,18 @@ namespace ts.codefix { symbolToken: Node | undefined, preferences: UserPreferences, ): { readonly moduleSpecifier: string, readonly codeAction: CodeAction } { - const exportInfos = getAllReExportingModules(exportedSymbol, checker, allSourceFiles); + const exportInfos = getAllReExportingModules(exportedSymbol, symbolName, checker, allSourceFiles); Debug.assert(exportInfos.some(info => info.moduleSymbol === moduleSymbol)); // We sort the best codefixes first, so taking `first` is best for completions. const moduleSpecifier = first(getNewImportInfos(program, sourceFile, exportInfos, compilerOptions, getCanonicalFileName, host, preferences)).moduleSpecifier; const ctx: ImportCodeFixContext = { host, program, checker, compilerOptions, sourceFile, formatContext, symbolName, getCanonicalFileName, symbolToken, preferences }; return { moduleSpecifier, codeAction: first(getCodeActionsForImport(exportInfos, ctx)) }; } - function getAllReExportingModules(exportedSymbol: Symbol, checker: TypeChecker, allSourceFiles: ReadonlyArray): ReadonlyArray { + function getAllReExportingModules(exportedSymbol: Symbol, symbolName: string, checker: TypeChecker, allSourceFiles: ReadonlyArray): ReadonlyArray { const result: SymbolExportInfo[] = []; forEachExternalModule(checker, allSourceFiles, moduleSymbol => { for (const exported of checker.getExportsOfModule(moduleSymbol)) { - if (skipAlias(exported, checker) === exportedSymbol) { + if (exported.escapedName === InternalSymbolName.Default || exported.name === symbolName && skipAlias(exported, checker) === exportedSymbol) { const isDefaultExport = checker.tryGetMemberInModuleExports(InternalSymbolName.Default, moduleSymbol) === exported; result.push({ moduleSymbol, importKind: isDefaultExport ? ImportKind.Default : ImportKind.Named }); } diff --git a/tests/cases/fourslash/completionsImport_default_exportDefaultIdentifier.ts b/tests/cases/fourslash/completionsImport_default_exportDefaultIdentifier.ts index a120c8435f8..9acc2c091ff 100644 --- a/tests/cases/fourslash/completionsImport_default_exportDefaultIdentifier.ts +++ b/tests/cases/fourslash/completionsImport_default_exportDefaultIdentifier.ts @@ -13,7 +13,7 @@ goTo.marker(""); verify.completionListContains({ name: "foo", source: "/a" }, "(alias) const foo: 0\nexport default foo", "", "alias", /*spanIndex*/ undefined, /*hasAction*/ true, { - includeExternalModuleExports: true, + includeCompletionsForModuleExports: true, sourceDisplay: "./a", }); diff --git a/tests/cases/fourslash/completionsImport_reExport_wrongName.ts b/tests/cases/fourslash/completionsImport_reExport_wrongName.ts new file mode 100644 index 00000000000..1fe168b58a0 --- /dev/null +++ b/tests/cases/fourslash/completionsImport_reExport_wrongName.ts @@ -0,0 +1,27 @@ +/// + +// @moduleResolution: node + +// @Filename: /a.ts +////export const x = 0; + +// @Filename: /index.ts +////export { x as y } from "./a"; + +// @Filename: /c.ts +/////**/ + +goTo.marker(""); +verify.completionListContains({ name: "x", source: "/a" }, "const x: 0", "", "const", /*spanIndex*/ undefined, /*hasAction*/ true, { + includeCompletionsForModuleExports: true, + sourceDisplay: "./a", +}); + +verify.applyCodeActionFromCompletion("", { + name: "x", + source: "/a", + description: `Import 'x' from module "./a"`, + newFileContent: `import { x } from "./a"; + +`, +});