Skip to content

Commit b059135

Browse files
author
Andy
authored
When adding relative completions with rootDirs, still add completions for regular relative imports (#28561)
1 parent b90d291 commit b059135

File tree

2 files changed

+30
-24
lines changed

2 files changed

+30
-24
lines changed

Diff for: src/services/stringCompletions.ts

+6-13
Original file line numberDiff line numberDiff line change
@@ -281,33 +281,26 @@ namespace ts.Completions.StringCompletions {
281281
* Takes a script path and returns paths for all potential folders that could be merged with its
282282
* containing folder via the "rootDirs" compiler option
283283
*/
284-
function getBaseDirectoriesFromRootDirs(rootDirs: string[], basePath: string, scriptPath: string, ignoreCase: boolean): string[] {
284+
function getBaseDirectoriesFromRootDirs(rootDirs: string[], basePath: string, scriptDirectory: string, ignoreCase: boolean): ReadonlyArray<string> {
285285
// Make all paths absolute/normalized if they are not already
286286
rootDirs = rootDirs.map(rootDirectory => normalizePath(isRootedDiskPath(rootDirectory) ? rootDirectory : combinePaths(basePath, rootDirectory)));
287287

288288
// Determine the path to the directory containing the script relative to the root directory it is contained within
289289
const relativeDirectory = firstDefined(rootDirs, rootDirectory =>
290-
containsPath(rootDirectory, scriptPath, basePath, ignoreCase) ? scriptPath.substr(rootDirectory.length) : undefined)!; // TODO: GH#18217
290+
containsPath(rootDirectory, scriptDirectory, basePath, ignoreCase) ? scriptDirectory.substr(rootDirectory.length) : undefined)!; // TODO: GH#18217
291291

292292
// Now find a path for each potential directory that is to be merged with the one containing the script
293293
return deduplicate<string>(
294-
rootDirs.map(rootDirectory => combinePaths(rootDirectory, relativeDirectory)),
294+
[...rootDirs.map(rootDirectory => combinePaths(rootDirectory, relativeDirectory)), scriptDirectory],
295295
equateStringsCaseSensitive,
296296
compareStringsCaseSensitive);
297297
}
298298

299-
function getCompletionEntriesForDirectoryFragmentWithRootDirs(rootDirs: string[], fragment: string, scriptPath: string, extensionOptions: ExtensionOptions, compilerOptions: CompilerOptions, host: LanguageServiceHost, exclude?: string): NameAndKind[] {
299+
function getCompletionEntriesForDirectoryFragmentWithRootDirs(rootDirs: string[], fragment: string, scriptDirectory: string, extensionOptions: ExtensionOptions, compilerOptions: CompilerOptions, host: LanguageServiceHost, exclude: string): ReadonlyArray<NameAndKind> {
300300
const basePath = compilerOptions.project || host.getCurrentDirectory();
301301
const ignoreCase = !(host.useCaseSensitiveFileNames && host.useCaseSensitiveFileNames());
302-
const baseDirectories = getBaseDirectoriesFromRootDirs(rootDirs, basePath, scriptPath, ignoreCase);
303-
304-
const result: NameAndKind[] = [];
305-
306-
for (const baseDirectory of baseDirectories) {
307-
getCompletionEntriesForDirectoryFragment(fragment, baseDirectory, extensionOptions, host, exclude, result);
308-
}
309-
310-
return result;
302+
const baseDirectories = getBaseDirectoriesFromRootDirs(rootDirs, basePath, scriptDirectory, ignoreCase);
303+
return flatMap(baseDirectories, baseDirectory => getCompletionEntriesForDirectoryFragment(fragment, baseDirectory, extensionOptions, host, exclude));
311304
}
312305

313306
/**

Diff for: tests/cases/fourslash/completionForStringLiteralRelativeImport4.ts

+24-11
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,29 @@
22

33
// Should give completions for directories that are merged via the rootDirs compiler option
44

5-
// @rootDirs: tests/cases/fourslash/sub/src1,tests/cases/fourslash/src2
5+
// @rootDirs: /sub/src1,/src2
66

7-
// @Filename: src2/test0.ts
7+
// @Filename: /src2/test0.ts
88
//// import * as foo1 from "./mo/*import_as0*/
99
//// import foo2 = require("./mo/*import_equals0*/
1010
//// var foo3 = require("./mo/*require0*/
1111

12-
// @Filename: src2/module0.ts
12+
// @Filename: /src2/inner/inner0.ts
13+
////import * as s from ".//*inner*/";
14+
15+
// @Filename: /src2/inner/inner1.ts
16+
////export const x = 0;
17+
18+
// @Filename: /src2/module0.ts
1319
//// export var w = 0;
1420

15-
// @Filename: sub/src1/module1.ts
21+
// @Filename: /sub/src1/module1.ts
1622
//// export var x = 0;
1723

18-
// @Filename: sub/src1/module2.ts
24+
// @Filename: /sub/src1/module2.ts
1925
//// export var y = 0;
2026

21-
// @Filename: sub/src1/more/module3.ts
27+
// @Filename: /sub/src1/more/module3.ts
2228
//// export var z = 0;
2329

2430

@@ -37,8 +43,15 @@
3743
// @Filename: e2.js
3844
////
3945

40-
verify.completions({
41-
marker: test.markers(),
42-
exact: ["module1", "module2", "more", "module0"],
43-
isNewIdentifierLocation: true,
44-
});
46+
verify.completions(
47+
{
48+
marker: ["import_as0", "import_equals0", "require0"],
49+
exact: ["module1", "module2", "more", "module0", "inner"],
50+
isNewIdentifierLocation: true,
51+
},
52+
{
53+
marker: "inner",
54+
exact: "inner1",
55+
isNewIdentifierLocation: true,
56+
}
57+
);

0 commit comments

Comments
 (0)