From 22076ecd963ccec1c040875b6a53fa22fb7ffbbc Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Mon, 12 Oct 2020 12:49:23 -0700 Subject: [PATCH] Fix auto imports for export default edge cases --- src/services/codefixes/importFixes.ts | 8 +++++++- .../importNameCodeFixDefaultExport6.ts | 17 +++++++++++++++++ .../importNameCodeFixDefaultExport7.ts | 14 ++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 tests/cases/fourslash/importNameCodeFixDefaultExport6.ts create mode 100644 tests/cases/fourslash/importNameCodeFixDefaultExport7.ts diff --git a/src/services/codefixes/importFixes.ts b/src/services/codefixes/importFixes.ts index 065d4112d7d10..407903390efb9 100644 --- a/src/services/codefixes/importFixes.ts +++ b/src/services/codefixes/importFixes.ts @@ -622,7 +622,13 @@ namespace ts.codefix { if (defaultExport.flags & SymbolFlags.Alias) { const aliased = checker.getImmediateAliasedSymbol(defaultExport); - return aliased && getDefaultExportInfoWorker(aliased, Debug.checkDefined(aliased.parent, "Alias targets of default exports must have a parent"), checker, compilerOptions); + if (aliased && aliased.parent) { + // - `aliased` will be undefined if the module is exporting an unresolvable name, + // but we can still offer completions for it. + // - `aliased.parent` will be undefined if the module is exporting `globalThis.something`, + // or another expression that resolves to a global. + return getDefaultExportInfoWorker(aliased, aliased.parent, checker, compilerOptions); + } } if (defaultExport.escapedName !== InternalSymbolName.Default && diff --git a/tests/cases/fourslash/importNameCodeFixDefaultExport6.ts b/tests/cases/fourslash/importNameCodeFixDefaultExport6.ts new file mode 100644 index 0000000000000..2dcea116f592a --- /dev/null +++ b/tests/cases/fourslash/importNameCodeFixDefaultExport6.ts @@ -0,0 +1,17 @@ +/// + +// @Filename: /a.ts +//// export default Math.foo; + +// @Filename: /index.ts +//// a/**/ + +verify.applyCodeActionFromCompletion("", { + name: "a", + source: "/a", + description: `Import default 'a' from module "./a"`, + newFileContent: `import a from "./a";\n\na`, + preferences: { + includeCompletionsForModuleExports: true + } +}); diff --git a/tests/cases/fourslash/importNameCodeFixDefaultExport7.ts b/tests/cases/fourslash/importNameCodeFixDefaultExport7.ts new file mode 100644 index 0000000000000..05311abba2e2d --- /dev/null +++ b/tests/cases/fourslash/importNameCodeFixDefaultExport7.ts @@ -0,0 +1,14 @@ +/// + +// @lib: dom + +// @Filename: foo.ts +//// export default globalThis.localStorage; + +// @Filename: index.ts +//// foo/**/ + +goTo.marker(""); +verify.importFixAtPosition([`import foo from "./foo"; + +foo`]);