Skip to content

Commit

Permalink
replace whole path if directory separator appears for import completi…
Browse files Browse the repository at this point in the history
…on. (#41412)

* replace whole path if directory separator appears.

* Fix.

* revert change.

* Fix test case.

* add test.

* fix as suggested.

* revert useless change

* adapt to code change.

* fix baseline for test file.
  • Loading branch information
ShuiRuTian authored Nov 25, 2020
1 parent 242e020 commit d5779c7
Show file tree
Hide file tree
Showing 4 changed files with 111 additions and 4 deletions.
2 changes: 1 addition & 1 deletion src/compiler/path.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ namespace ts {
* we expect the host to correctly handle paths in our specified format.
*/
export const directorySeparator = "/";
const altDirectorySeparator = "\\";
export const altDirectorySeparator = "\\";
const urlSchemeSeparator = "://";
const backslashRegExp = /\\/g;

Expand Down
6 changes: 4 additions & 2 deletions src/services/stringCompletions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,9 @@ namespace ts.Completions.StringCompletions {

function addReplacementSpans(text: string, textStart: number, names: readonly NameAndKind[]): readonly PathCompletion[] {
const span = getDirectoryFragmentTextSpan(text, textStart);
return names.map(({ name, kind, extension }): PathCompletion => ({ name, kind, extension, span }));
const wholeSpan = text.length === 0 ? undefined : createTextSpan(textStart, text.length);
return names.map(({ name, kind, extension }): PathCompletion =>
Math.max(name.indexOf(directorySeparator), name.indexOf(altDirectorySeparator)) !== -1 ? { name, kind, extension, span: wholeSpan } : { name, kind, extension, span });
}

function getStringLiteralCompletionsFromModuleNames(sourceFile: SourceFile, node: LiteralExpression, compilerOptions: CompilerOptions, host: LanguageServiceHost, typeChecker: TypeChecker): readonly PathCompletion[] {
Expand Down Expand Up @@ -683,7 +685,7 @@ namespace ts.Completions.StringCompletions {

// Replace everything after the last directory separator that appears
function getDirectoryFragmentTextSpan(text: string, textStart: number): TextSpan | undefined {
const index = Math.max(text.lastIndexOf(directorySeparator), text.lastIndexOf("\\"));
const index = Math.max(text.lastIndexOf(directorySeparator), text.lastIndexOf(altDirectorySeparator));
const offset = index !== -1 ? index + 1 : 0;
// If the range is an identifier, span is unnecessary.
const length = text.length - offset;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,69 @@
// @Filename: some/other/path.ts
//// export var y = 10;

verify.completions({ marker: test.markerNames(), exact: ["lib", "tests", "/module1", "/module2"], isNewIdentifierLocation: true });
verify.completions({
marker: ["import_as0",],
exact: ["lib", "tests",
{
name: "/module1",
replacementSpan: {
fileName: "foo",
pos: 23,
end: 24
}
},
{
name: "/module2",
replacementSpan: {
fileName: "foo",
pos: 23,
end: 24
}
}],
isNewIdentifierLocation: true
});


verify.completions({
marker: ["import_equals0",],
exact: ["lib", "tests",
{
name: "/module1",
replacementSpan: {
fileName: "foo",
pos: 48,
end: 49
}
},
{
name: "/module2",
replacementSpan: {
fileName: "foo",
pos: 48,
end: 49
}
}],
isNewIdentifierLocation: true
});

verify.completions({
marker: ["require0",],
exact: ["lib", "tests",
{
name: "/module1",
replacementSpan: {
fileName: "foo",
pos: 70,
end: 71
}
},
{
name: "/module2",
replacementSpan: {
fileName: "foo",
pos: 70,
end: 71
}
}],
isNewIdentifierLocation: true
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/// <reference path='fourslash.ts' />

// Should give completions for modules referenced via baseUrl and paths compiler options with explicit name mappings

// @Filename: tsconfig.json
//// {
//// "compilerOptions": {
//// "baseUrl": "./",
//// "paths": {
//// "module1/path1": ["some/path/whatever.ts"],
//// }
//// }
//// }

// @Filename: test0.ts
//// import * as foo1 from "m/*first*/
//// import * as foo1 from "module1/pa/*second*/

// @Filename: some/path/whatever.ts
//// export var x = 9;

verify.completions({ marker: ["first"], exact: ["test0", "some", {
name: "module1/path1",
replacementSpan: {
fileName: "foo",
pos: 23,
end: 24
}
}], isNewIdentifierLocation: true });

verify.completions({
marker: ["second"], exact: [{
name: "module1/path1",
replacementSpan: {
fileName: "foo",
pos: 48,
end: 58
}
}], isNewIdentifierLocation: true
});

0 comments on commit d5779c7

Please sign in to comment.