Skip to content

Commit 562a046

Browse files
authored
Merge pull request #19111 from Microsoft/useCaseSensitiveProjectRootToSearchConfigFile
Handle case sensitivity when looking up config file for Script info
2 parents b949245 + deed981 commit 562a046

File tree

2 files changed

+47
-1
lines changed

2 files changed

+47
-1
lines changed

src/harness/unittests/tsserverProjectSystem.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2917,6 +2917,52 @@ namespace ts.projectSystem {
29172917
function checkSnapLength(snap: IScriptSnapshot, expectedLength: number) {
29182918
assert.equal(snap.getLength(), expectedLength, "Incorrect snapshot size");
29192919
}
2920+
2921+
function verifyOpenFileWorks(useCaseSensitiveFileNames: boolean) {
2922+
const file1: FileOrFolder = {
2923+
path: "/a/b/src/app.ts",
2924+
content: "let x = 10;"
2925+
};
2926+
const file2: FileOrFolder = {
2927+
path: "/a/B/lib/module2.ts",
2928+
content: "let z = 10;"
2929+
};
2930+
const configFile: FileOrFolder = {
2931+
path: "/a/b/tsconfig.json",
2932+
content: ""
2933+
};
2934+
const configFile2: FileOrFolder = {
2935+
path: "/a/tsconfig.json",
2936+
content: ""
2937+
};
2938+
const host = createServerHost([file1, file2, configFile, configFile2], {
2939+
useCaseSensitiveFileNames
2940+
});
2941+
const service = createProjectService(host);
2942+
2943+
// Open file1 -> configFile
2944+
verifyConfigFileName(file1, "/a", configFile);
2945+
verifyConfigFileName(file1, "/a/b", configFile);
2946+
verifyConfigFileName(file1, "/a/B", useCaseSensitiveFileNames ? undefined : configFile);
2947+
2948+
// Open file2 use root "/a/b"
2949+
verifyConfigFileName(file2, "/a", useCaseSensitiveFileNames ? configFile2 : configFile);
2950+
verifyConfigFileName(file2, "/a/b", useCaseSensitiveFileNames ? undefined : configFile);
2951+
verifyConfigFileName(file2, "/a/B", useCaseSensitiveFileNames ? undefined : configFile);
2952+
2953+
function verifyConfigFileName(file: FileOrFolder, projectRoot: string, expectedConfigFile: FileOrFolder | undefined) {
2954+
const { configFileName } = service.openClientFile(file.path, /*fileContent*/ undefined, /*scriptKind*/ undefined, projectRoot);
2955+
assert.equal(configFileName, expectedConfigFile && expectedConfigFile.path);
2956+
service.closeClientFile(file.path);
2957+
}
2958+
}
2959+
it("works when project root is used with case-sensitive system", () => {
2960+
verifyOpenFileWorks(/*useCaseSensitiveFileNames*/ true);
2961+
});
2962+
2963+
it("works when project root is used with case-insensitive system", () => {
2964+
verifyOpenFileWorks(/*useCaseSensitiveFileNames*/ false);
2965+
});
29202966
});
29212967

29222968
describe("Language service", () => {

src/server/editorServices.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1218,7 +1218,7 @@ namespace ts.server {
12181218
projectRootPath?: NormalizedPath) {
12191219
let searchPath = asNormalizedPath(getDirectoryPath(info.fileName));
12201220

1221-
while (!projectRootPath || stringContains(searchPath, projectRootPath)) {
1221+
while (!projectRootPath || containsPath(projectRootPath, searchPath, this.currentDirectory, !this.host.useCaseSensitiveFileNames)) {
12221222
const canonicalSearchPath = normalizedPathToPath(searchPath, this.currentDirectory, this.toCanonicalFileName);
12231223
const tsconfigFileName = asNormalizedPath(combinePaths(searchPath, "tsconfig.json"));
12241224
let result = action(tsconfigFileName, combinePaths(canonicalSearchPath, "tsconfig.json"));

0 commit comments

Comments
 (0)