diff --git a/src/services/services.ts b/src/services/services.ts index 61d624c29df..66b894bb428 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -4518,7 +4518,7 @@ namespace ts { let result: ImportCompletionEntry[]; // Replace the entire text of the string literal (excluding the quotes) - const span: TextSpan = { start: node.getStart() + 1, length: literalValue.length }; + const span: TextSpan = getDirectoryFragmentTextSpan(literalValue, node.getStart() + 1); const isRelativePath = startsWith(literalValue, "."); const scriptDir = getDirectoryPath(node.getSourceFile().path); @@ -4792,15 +4792,16 @@ namespace ts { const kind = match[2]; const toComplete = match[3]; - const span: TextSpan = { start: range.pos + prefix.length, length: match[0].length - prefix.length }; - const scriptPath = getDirectoryPath(sourceFile.path); if (kind === "path") { // Give completions for a relative path + const span: TextSpan = getDirectoryFragmentTextSpan(toComplete, range.pos + prefix.length); return getCompletionEntriesForDirectoryFragment(toComplete, scriptPath, getSupportedExtensions(program.getCompilerOptions()), /*includeExtensions*/true, span); } else { // Give completions based on the typings available + // Replace the entire string + const span: TextSpan = { start: range.pos + prefix.length, length: match[0].length - prefix.length }; return getCompletionEntriesFromTypings(host, program.getCompilerOptions(), scriptPath, span); } } @@ -4952,6 +4953,14 @@ namespace ts { function createCompletionEntryForModule(name: string, kind: string, span: TextSpan): ImportCompletionEntry { return { name, kind, sortText: name, span }; } + + // Replace everything after the last directory seperator that appears + // FIXME: do we care about the other seperator? + function getDirectoryFragmentTextSpan(text: string, textStart: number): TextSpan { + const index = text.lastIndexOf(directorySeparator); + const offset = index !== -1 ? index + 1 : 0; + return { start: textStart + offset, length: text.length - offset } + } } function getCompletionEntryDetails(fileName: string, position: number, entryName: string): CompletionEntryDetails { diff --git a/tests/cases/fourslash/completionForStringLiteralImport1.ts b/tests/cases/fourslash/completionForStringLiteralImport1.ts index 42c2dbaf3d4..239c3be42fc 100644 --- a/tests/cases/fourslash/completionForStringLiteralImport1.ts +++ b/tests/cases/fourslash/completionForStringLiteralImport1.ts @@ -1,19 +1,31 @@ /// +// @typeRoots: my_typings + // @Filename: test.ts -//// import * as foo0 from "[|./some|]/*0*/ -//// import foo1 = require( "[|./some|]/*1*/ -//// var foo2 = require( "[|./some|]/*2*/ - -//// import * as foo3 from "[|./some|]/*3*/"; -//// import foo4 = require( "[|./some|]/*4*/"; -//// var foo5 = require( "[|./some|]/*5*/"; +//// import * as foo0 from "./[|some|]/*0*/ +//// import * as foo1 from "./sub/[|some|]/*1*/ +//// import * as foo2 from "[|some-|]/*2*/" +//// import * as foo3 from "../[||]/*3*/"; -// @Filename: someFile.ts -//// /*someFile*/ +// @Filename: someFile1.ts +//// /*someFile1*/ -for (let i = 0; i < 6; i++) { - goTo.marker("" + i); - verify.importModuleCompletionListContains("someFile", i); -} \ No newline at end of file +// @Filename: sub/someFile2.ts +//// /*someFile2*/ + +// @Filename: my_typings/some-module/index.d.ts +//// export var x = 9; + +goTo.marker("0"); +verify.importModuleCompletionListContains("someFile1", 0); + +goTo.marker("1"); +verify.importModuleCompletionListContains("someFile2", 1); + +goTo.marker("2"); +verify.importModuleCompletionListContains("some-module", 2); + +goTo.marker("3"); +verify.importModuleCompletionListContains("fourslash/", 3); \ No newline at end of file diff --git a/tests/cases/fourslash/completionForStringLiteralImport2.ts b/tests/cases/fourslash/completionForStringLiteralImport2.ts index a0618c344a7..2910d9e1475 100644 --- a/tests/cases/fourslash/completionForStringLiteralImport2.ts +++ b/tests/cases/fourslash/completionForStringLiteralImport2.ts @@ -3,15 +3,18 @@ // @typeRoots: my_typings // @Filename: test.ts -//// /// +//// /// //// /// // @Filename: someFile.ts //// /*someFile*/ +// @Filename: sub/someOtherFile.ts +//// /*someOtherFile*/ + // @Filename: my_typings/some-module/index.d.ts //// export var x = 9; @@ -22,7 +25,7 @@ goTo.marker("1"); verify.importModuleCompletionListContains("some-module", 1); goTo.marker("2"); -verify.importModuleCompletionListContains("someFile.ts", 2); +verify.importModuleCompletionListContains("someOtherFile.ts", 2); goTo.marker("3"); verify.importModuleCompletionListContains("some-module", 3); \ No newline at end of file