Skip to content

Commit

Permalink
Suggest json files in completion when resolveJsonModule is set and mo…
Browse files Browse the repository at this point in the history
…dule resolution is node

Fixes microsoft#23899
  • Loading branch information
sheetalkamat authored and Kingwl committed May 10, 2018
1 parent 004a558 commit b4de840
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 3 deletions.
13 changes: 10 additions & 3 deletions src/services/pathCompletions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ namespace ts.Completions.PathCompletions {
const scriptDirectory = getDirectoryPath(scriptPath);

if (isPathRelativeToScript(literalValue) || isRootedDiskPath(literalValue)) {
const extensions = getSupportedExtensions(compilerOptions);
const extensions = getSupportExtensionsForModuleResolution(compilerOptions);
if (compilerOptions.rootDirs) {
return getCompletionEntriesForDirectoryFragmentWithRootDirs(
compilerOptions.rootDirs, literalValue, scriptDirectory, extensions, /*includeExtensions*/ false, compilerOptions, host, scriptPath);
Expand All @@ -42,6 +42,13 @@ namespace ts.Completions.PathCompletions {
}
}

function getSupportExtensionsForModuleResolution(compilerOptions: CompilerOptions) {
const extensions = getSupportedExtensions(compilerOptions);
return compilerOptions.resolveJsonModule && getEmitModuleResolutionKind(compilerOptions) === ModuleResolutionKind.NodeJs ?
extensions.concat(Extension.Json) :
extensions;
}

/**
* Takes a script path and returns paths for all potential folders that could be merged with its
* containing folder via the "rootDirs" compiler option
Expand Down Expand Up @@ -122,7 +129,7 @@ namespace ts.Completions.PathCompletions {
continue;
}

const foundFileName = includeExtensions ? getBaseFileName(filePath) : removeFileExtension(getBaseFileName(filePath));
const foundFileName = includeExtensions || fileExtensionIs(filePath, Extension.Json) ? getBaseFileName(filePath) : removeFileExtension(getBaseFileName(filePath));

if (!foundFiles.has(foundFileName)) {
foundFiles.set(foundFileName, true);
Expand Down Expand Up @@ -162,7 +169,7 @@ namespace ts.Completions.PathCompletions {

const result: NameAndKind[] = [];

const fileExtensions = getSupportedExtensions(compilerOptions);
const fileExtensions = getSupportExtensionsForModuleResolution(compilerOptions);
if (baseUrl) {
const projectDir = compilerOptions.project || host.getCurrentDirectory();
const absolute = isRootedDiskPath(baseUrl) ? baseUrl : combinePaths(projectDir, baseUrl);
Expand Down
12 changes: 12 additions & 0 deletions tests/cases/fourslash/completionsPathsJsonModule.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/// <reference path="fourslash.ts" />

// @moduleResolution: node
// @resolveJsonModule: true

// @Filename: /project/node_modules/test.json
////not read

// @Filename: /project/index.ts
////import { } from "/**/";

verify.completionsAt("", ["test.json"], { isNewIdentifierLocation: true });
12 changes: 12 additions & 0 deletions tests/cases/fourslash/completionsPathsJsonModuleWithAmd.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/// <reference path="fourslash.ts" />

// @module: amd
// @resolveJsonModule: true

// @Filename: /project/test.json
////not read

// @Filename: /project/index.ts
////import { } from ".//**/";

verify.completionsAt("", [], { isNewIdentifierLocation: true });
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
/// <reference path="fourslash.ts" />

// @moduleResolution: node

// @Filename: /project/test.json
////not read

// @Filename: /project/index.ts
////import { } from ".//**/";

verify.completionsAt("", [], { isNewIdentifierLocation: true });
12 changes: 12 additions & 0 deletions tests/cases/fourslash/completionsPathsRelativeJsonModule.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/// <reference path="fourslash.ts" />

// @moduleResolution: node
// @resolveJsonModule: true

// @Filename: /project/test.json
////not read

// @Filename: /project/index.ts
////import { } from ".//**/";

verify.completionsAt("", ["test.json"], { isNewIdentifierLocation: true });

0 comments on commit b4de840

Please sign in to comment.