From 009dd487a6543d16c8e403ea055ac0683c6bc5d3 Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Tue, 16 Nov 2021 16:39:10 -0800 Subject: [PATCH] Update symlink cache from AutoImportProvider resolution even if host project already contains the file via its realpath (#46830) --- src/server/project.ts | 6 +- .../fourslash/server/autoImportProvider7.ts | 68 +++++++++++++++++++ 2 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 tests/cases/fourslash/server/autoImportProvider7.ts diff --git a/src/server/project.ts b/src/server/project.ts index dc04d4a5a4..e6170d086c 100644 --- a/src/server/project.ts +++ b/src/server/project.ts @@ -1944,15 +1944,15 @@ namespace ts.server { for (const resolution of resolutions) { if (!resolution.resolvedFileName) continue; const { resolvedFileName, originalPath } = resolution; + if (originalPath) { + symlinkCache.setSymlinkedDirectoryFromSymlinkedFile(originalPath, resolvedFileName); + } if (!program.getSourceFile(resolvedFileName) && (!originalPath || !program.getSourceFile(originalPath))) { rootNames = append(rootNames, resolvedFileName); // Avoid creating a large project that would significantly slow down time to editor interactivity if (dependencySelection === PackageJsonAutoImportPreference.Auto && rootNames.length > this.maxDependencies) { return ts.emptyArray; } - if (originalPath) { - symlinkCache.setSymlinkedDirectoryFromSymlinkedFile(originalPath, resolvedFileName); - } } } } diff --git a/tests/cases/fourslash/server/autoImportProvider7.ts b/tests/cases/fourslash/server/autoImportProvider7.ts new file mode 100644 index 0000000000..d84e2b8bb1 --- /dev/null +++ b/tests/cases/fourslash/server/autoImportProvider7.ts @@ -0,0 +1,68 @@ +/// + +// @Filename: /tsconfig.json +//// { "compilerOptions": { "module": "commonjs" } } + +// @Filename: /package.json +//// { "dependencies": { "mylib": "file:packages/mylib" } } + +// @Filename: /packages/mylib/package.json +//// { "name": "mylib", "version": "1.0.0", "main": "index.js", "types": "index" } + +// @Filename: /packages/mylib/index.ts +//// export * from "./mySubDir"; + +// @Filename: /packages/mylib/mySubDir/index.ts +//// export * from "./myClass"; +//// export * from "./myClass2"; + +// @Filename: /packages/mylib/mySubDir/myClass.ts +//// export class MyClass {} + +// @Filename: /packages/mylib/mySubDir/myClass2.ts +//// export class MyClass2 {} + +// @link: /packages/mylib -> /node_modules/mylib + +// @Filename: /src/index.ts +//// +//// const a = new MyClass/*1*/(); +//// const b = new MyClass2/*2*/(); + +goTo.marker("1"); +format.setOption("newLineCharacter", "\n"); + +verify.completions({ + marker: "1", + includes: [{ + name: "MyClass", + source: "mylib", + sourceDisplay: "mylib", + hasAction: true, + sortText: completion.SortText.AutoImportSuggestions, + }], + preferences: { + includeCompletionsForModuleExports: true, + includeInsertTextCompletions: true, + allowIncompleteCompletions: true, + } +}); + +verify.applyCodeActionFromCompletion("1", { + name: "MyClass", + source: "mylib", + description: `Import 'MyClass' from module "mylib"`, + data: { + exportName: "MyClass", + fileName: "/packages/mylib/index.ts", + }, + preferences: { + includeCompletionsForModuleExports: true, + includeCompletionsWithInsertText: true, + allowIncompleteCompletions: true, + }, + newFileContent: `import { MyClass } from "mylib"; + +const a = new MyClass(); +const b = new MyClass2();`, +});