mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-03-16 06:28:12 -05:00
replace whole path if directory separator appears for import completion. (#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.
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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[] {
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
});
|
||||
|
||||
@@ -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
|
||||
});
|
||||
Reference in New Issue
Block a user