Skip to content

Commit db15051

Browse files
committed
Ignore drive letters when comparing casings of the files with forceConsistentCasingInFileNames
Fixes #31327
1 parent 9052804 commit db15051

File tree

3 files changed

+29
-2
lines changed

3 files changed

+29
-2
lines changed

src/compiler/program.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2232,7 +2232,10 @@ namespace ts {
22322232
if (isRedirect) {
22332233
inputName = getProjectReferenceRedirect(fileName) || fileName;
22342234
}
2235-
if (getNormalizedAbsolutePath(checkedName, currentDirectory) !== getNormalizedAbsolutePath(inputName, currentDirectory)) {
2235+
// Check if it differs only in drive letters its ok to ignore that error:
2236+
const checkedAbsolutePath = getNormalizedAbsolutePathWithoutRoot(checkedName, currentDirectory);
2237+
const inputAbsolutePath = getNormalizedAbsolutePathWithoutRoot(inputName, currentDirectory);
2238+
if (checkedAbsolutePath !== inputAbsolutePath) {
22362239
reportFileNamesDifferOnlyInCasingError(inputName, checkedName, refFile, refPos, refEnd);
22372240
}
22382241
}

src/compiler/utilities.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7646,6 +7646,14 @@ namespace ts {
76467646
return root + pathComponents.slice(1).join(directorySeparator);
76477647
}
76487648

7649+
export function getNormalizedAbsolutePathWithoutRoot(fileName: string, currentDirectory: string | undefined) {
7650+
return getPathWithoutRoot(getNormalizedPathComponents(fileName, currentDirectory));
7651+
}
7652+
7653+
function getPathWithoutRoot(pathComponents: ReadonlyArray<string>) {
7654+
if (pathComponents.length === 0) return "";
7655+
return pathComponents.slice(1).join(directorySeparator);
7656+
}
76497657
}
76507658

76517659
/* @internal */

src/testRunner/unittests/moduleResolution.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,7 @@ export = C;
530530
});
531531
});
532532

533-
describe("unittests:: moduleResolution:: Files with different casing", () => {
533+
describe("unittests:: moduleResolution:: Files with different casing with forceConsistentCasingInFileNames", () => {
534534
let library: SourceFile;
535535
function test(files: Map<string>, options: CompilerOptions, currentDirectory: string, useCaseSensitiveFileNames: boolean, rootFiles: string[], diagnosticCodes: number[]): void {
536536
const getCanonicalFileName = createGetCanonicalFileName(useCaseSensitiveFileNames);
@@ -649,6 +649,22 @@ import b = require("./moduleB");
649649
});
650650
test(files, { module: ModuleKind.CommonJS, forceConsistentCasingInFileNames: true }, "/a/B/c", /*useCaseSensitiveFileNames*/ false, ["moduleD.ts"], []);
651651
});
652+
653+
it("should succeed when the two files in program differ only in drive letter in their names", () => {
654+
const files = createMapFromTemplate({
655+
"d:/someFolder/moduleA.ts": `import a = require("D:/someFolder/moduleC")`,
656+
"d:/someFolder/moduleB.ts": `import a = require("./moduleC")`,
657+
"D:/someFolder/moduleC.ts": "export const x = 10",
658+
});
659+
test(
660+
files,
661+
{ module: ModuleKind.CommonJS, forceConsistentCasingInFileNames: true },
662+
"d:/someFolder",
663+
/*useCaseSensitiveFileNames*/ false,
664+
["d:/someFolder/moduleA.ts", "d:/someFolder/moduleB.ts"],
665+
[]
666+
);
667+
});
652668
});
653669

654670
describe("unittests:: moduleResolution:: baseUrl augmented module resolution", () => {

0 commit comments

Comments
 (0)