From d201a1ff4755dc49e9a74084850b436b0960231e Mon Sep 17 00:00:00 2001 From: Simar Bassi Date: Sat, 23 Jan 2021 18:19:07 -0500 Subject: [PATCH 1/4] Pass preferences down to getCompletionEntriesForRelativeModules --- src/services/completions.ts | 2 +- src/services/stringCompletions.ts | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/services/completions.ts b/src/services/completions.ts index f0ad156956d82..89b15e9065a2f 100644 --- a/src/services/completions.ts +++ b/src/services/completions.ts @@ -652,7 +652,7 @@ namespace ts.Completions { const contextToken = findPrecedingToken(position, sourceFile); if (isInString(sourceFile, position, contextToken)) { - return StringCompletions.getStringLiteralCompletionDetails(name, sourceFile, position, contextToken, typeChecker, compilerOptions, host, cancellationToken); + return StringCompletions.getStringLiteralCompletionDetails(name, sourceFile, position, contextToken, typeChecker, compilerOptions, host, cancellationToken, preferences); } // Compute all the completion symbols again. diff --git a/src/services/stringCompletions.ts b/src/services/stringCompletions.ts index de823ad951d0e..108a02c618528 100644 --- a/src/services/stringCompletions.ts +++ b/src/services/stringCompletions.ts @@ -7,7 +7,7 @@ namespace ts.Completions.StringCompletions { } if (isInString(sourceFile, position, contextToken)) { if (!contextToken || !isStringLiteralLike(contextToken)) return undefined; - const entries = getStringLiteralCompletionEntries(sourceFile, contextToken, position, checker, options, host); + const entries = getStringLiteralCompletionEntries(sourceFile, contextToken, position, checker, options, host, preferences); return convertStringLiteralCompletions(entries, contextToken, sourceFile, checker, log, preferences); } } @@ -52,9 +52,9 @@ namespace ts.Completions.StringCompletions { } } - export function getStringLiteralCompletionDetails(name: string, sourceFile: SourceFile, position: number, contextToken: Node | undefined, checker: TypeChecker, options: CompilerOptions, host: LanguageServiceHost, cancellationToken: CancellationToken) { + export function getStringLiteralCompletionDetails(name: string, sourceFile: SourceFile, position: number, contextToken: Node | undefined, checker: TypeChecker, options: CompilerOptions, host: LanguageServiceHost, cancellationToken: CancellationToken, preferences: UserPreferences) { if (!contextToken || !isStringLiteralLike(contextToken)) return undefined; - const completions = getStringLiteralCompletionEntries(sourceFile, contextToken, position, checker, options, host); + const completions = getStringLiteralCompletionEntries(sourceFile, contextToken, position, checker, options, host, preferences); return completions && stringLiteralCompletionDetails(name, contextToken, completions, sourceFile, checker, cancellationToken); } @@ -109,7 +109,7 @@ namespace ts.Completions.StringCompletions { readonly isNewIdentifier: boolean; } type StringLiteralCompletion = { readonly kind: StringLiteralCompletionKind.Paths, readonly paths: readonly PathCompletion[] } | StringLiteralCompletionsFromProperties | StringLiteralCompletionsFromTypes; - function getStringLiteralCompletionEntries(sourceFile: SourceFile, node: StringLiteralLike, position: number, typeChecker: TypeChecker, compilerOptions: CompilerOptions, host: LanguageServiceHost): StringLiteralCompletion | undefined { + function getStringLiteralCompletionEntries(sourceFile: SourceFile, node: StringLiteralLike, position: number, typeChecker: TypeChecker, compilerOptions: CompilerOptions, host: LanguageServiceHost, preferences: UserPreferences): StringLiteralCompletion | undefined { const parent = walkUpParentheses(node.parent); switch (parent.kind) { case SyntaxKind.LiteralType: { @@ -136,7 +136,7 @@ namespace ts.Completions.StringCompletions { } return stringLiteralCompletionsFromProperties(typeChecker.getTypeFromTypeNode(objectType)); case SyntaxKind.ImportType: - return { kind: StringLiteralCompletionKind.Paths, paths: getStringLiteralCompletionsFromModuleNames(sourceFile, node, compilerOptions, host, typeChecker) }; + return { kind: StringLiteralCompletionKind.Paths, paths: getStringLiteralCompletionsFromModuleNames(sourceFile, node, compilerOptions, host, typeChecker, preferences) }; case SyntaxKind.UnionType: { if (!isTypeReferenceNode(grandParent.parent)) { return undefined; @@ -201,7 +201,7 @@ namespace ts.Completions.StringCompletions { // import x = require("/*completion position*/"); // var y = require("/*completion position*/"); // export * from "/*completion position*/"; - return { kind: StringLiteralCompletionKind.Paths, paths: getStringLiteralCompletionsFromModuleNames(sourceFile, node, compilerOptions, host, typeChecker) }; + return { kind: StringLiteralCompletionKind.Paths, paths: getStringLiteralCompletionsFromModuleNames(sourceFile, node, compilerOptions, host, typeChecker, preferences) }; default: return fromContextualType(); @@ -303,18 +303,18 @@ namespace ts.Completions.StringCompletions { 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[] { - return addReplacementSpans(node.text, node.getStart(sourceFile) + 1, getStringLiteralCompletionsFromModuleNamesWorker(sourceFile, node, compilerOptions, host, typeChecker)); + function getStringLiteralCompletionsFromModuleNames(sourceFile: SourceFile, node: LiteralExpression, compilerOptions: CompilerOptions, host: LanguageServiceHost, typeChecker: TypeChecker, preferences: UserPreferences): readonly PathCompletion[] { + return addReplacementSpans(node.text, node.getStart(sourceFile) + 1, getStringLiteralCompletionsFromModuleNamesWorker(sourceFile, node, compilerOptions, host, typeChecker, preferences)); } - function getStringLiteralCompletionsFromModuleNamesWorker(sourceFile: SourceFile, node: LiteralExpression, compilerOptions: CompilerOptions, host: LanguageServiceHost, typeChecker: TypeChecker): readonly NameAndKind[] { + function getStringLiteralCompletionsFromModuleNamesWorker(sourceFile: SourceFile, node: LiteralExpression, compilerOptions: CompilerOptions, host: LanguageServiceHost, typeChecker: TypeChecker, preferences: UserPreferences): readonly NameAndKind[] { const literalValue = normalizeSlashes(node.text); const scriptPath = sourceFile.path; const scriptDirectory = getDirectoryPath(scriptPath); return isPathRelativeToScript(literalValue) || !compilerOptions.baseUrl && (isRootedDiskPath(literalValue) || isUrl(literalValue)) - ? getCompletionEntriesForRelativeModules(literalValue, scriptDirectory, compilerOptions, host, scriptPath) + ? getCompletionEntriesForRelativeModules(literalValue, scriptDirectory, compilerOptions, host, scriptPath, preferences) : getCompletionEntriesForNonRelativeModules(literalValue, scriptDirectory, compilerOptions, host, typeChecker); } @@ -325,7 +325,7 @@ namespace ts.Completions.StringCompletions { function getExtensionOptions(compilerOptions: CompilerOptions, includeExtensions = false): ExtensionOptions { return { extensions: getSupportedExtensionsForModuleResolution(compilerOptions), includeExtensions }; } - function getCompletionEntriesForRelativeModules(literalValue: string, scriptDirectory: string, compilerOptions: CompilerOptions, host: LanguageServiceHost, scriptPath: Path) { + function getCompletionEntriesForRelativeModules(literalValue: string, scriptDirectory: string, compilerOptions: CompilerOptions, host: LanguageServiceHost, scriptPath: Path, preferences: UserPreferences) { const extensionOptions = getExtensionOptions(compilerOptions); if (compilerOptions.rootDirs) { return getCompletionEntriesForDirectoryFragmentWithRootDirs( From d419d5b5a4d18f85ec2224d7745469e93c639485 Mon Sep 17 00:00:00 2001 From: Simar Bassi Date: Tue, 26 Jan 2021 20:30:28 -0500 Subject: [PATCH 2/4] Add preferences to getExtensionsOptions call --- src/services/stringCompletions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/stringCompletions.ts b/src/services/stringCompletions.ts index 108a02c618528..12a3d724e7b82 100644 --- a/src/services/stringCompletions.ts +++ b/src/services/stringCompletions.ts @@ -326,7 +326,7 @@ namespace ts.Completions.StringCompletions { return { extensions: getSupportedExtensionsForModuleResolution(compilerOptions), includeExtensions }; } function getCompletionEntriesForRelativeModules(literalValue: string, scriptDirectory: string, compilerOptions: CompilerOptions, host: LanguageServiceHost, scriptPath: Path, preferences: UserPreferences) { - const extensionOptions = getExtensionOptions(compilerOptions); + const extensionOptions = getExtensionOptions(compilerOptions, preferences.importModuleSpecifierEnding === "js"); if (compilerOptions.rootDirs) { return getCompletionEntriesForDirectoryFragmentWithRootDirs( compilerOptions.rootDirs, literalValue, scriptDirectory, extensionOptions, compilerOptions, host, scriptPath); From a92549a27c50a1c098301a9f530ba62bed70e4b9 Mon Sep 17 00:00:00 2001 From: Simar Bassi Date: Sat, 30 Jan 2021 00:46:54 -0500 Subject: [PATCH 3/4] Add test case --- .../completionImportModuleSpecifierEnding.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 tests/cases/fourslash/completionImportModuleSpecifierEnding.ts diff --git a/tests/cases/fourslash/completionImportModuleSpecifierEnding.ts b/tests/cases/fourslash/completionImportModuleSpecifierEnding.ts new file mode 100644 index 0000000000000..0b934caf7d67e --- /dev/null +++ b/tests/cases/fourslash/completionImportModuleSpecifierEnding.ts @@ -0,0 +1,12 @@ +/// +//@allowJs: true +//@Filename:test.js +////export function f(){ +//// return 1 +////} + +//@Filename:module.js +////import { f } from "/**/" + + +verify.completions({ marker: "", includes:{name:"false"}, preferences: {importModuleSpecifierEnding: "js" }, isNewIdentifierLocation: true}) \ No newline at end of file From 30f64941bc51f28901fe3548f258ed0139e8c2b9 Mon Sep 17 00:00:00 2001 From: Simar Bassi Date: Sat, 30 Jan 2021 01:22:47 -0500 Subject: [PATCH 4/4] Fix test case typos --- .../cases/fourslash/completionImportModuleSpecifierEnding.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/cases/fourslash/completionImportModuleSpecifierEnding.ts b/tests/cases/fourslash/completionImportModuleSpecifierEnding.ts index 0b934caf7d67e..7771a9ac781d3 100644 --- a/tests/cases/fourslash/completionImportModuleSpecifierEnding.ts +++ b/tests/cases/fourslash/completionImportModuleSpecifierEnding.ts @@ -6,7 +6,7 @@ ////} //@Filename:module.js -////import { f } from "/**/" +////import { f } from ".//**/" -verify.completions({ marker: "", includes:{name:"false"}, preferences: {importModuleSpecifierEnding: "js" }, isNewIdentifierLocation: true}) \ No newline at end of file +verify.completions({ marker: "", includes:{name:"test.js"}, preferences: {importModuleSpecifierEnding: "js" }, isNewIdentifierLocation: true}) \ No newline at end of file