mirror of
https://github.com/microsoft/TypeScript.git
synced 2025-11-18 17:21:48 +00:00
Fix module specifier case handling for declaration emit (#25110)
This commit is contained in:
@@ -150,10 +150,11 @@ namespace ts.moduleSpecifiers {
|
||||
const result = createMap<string>();
|
||||
if (symlinks) {
|
||||
const currentDirectory = host.getCurrentDirectory ? host.getCurrentDirectory() : "";
|
||||
const compareStrings = (!host.useCaseSensitiveFileNames || host.useCaseSensitiveFileNames()) ? compareStringsCaseSensitive : compareStringsCaseInsensitive;
|
||||
for (const [resolvedPath, originalPath] of symlinks) {
|
||||
const resolvedParts = getPathComponents(toPath(resolvedPath, currentDirectory, getCanonicalFileName));
|
||||
const originalParts = getPathComponents(toPath(originalPath, currentDirectory, getCanonicalFileName));
|
||||
while (resolvedParts[resolvedParts.length - 1] === originalParts[originalParts.length - 1]) {
|
||||
while (compareStrings(resolvedParts[resolvedParts.length - 1], originalParts[originalParts.length - 1]) === Comparison.EqualTo) {
|
||||
resolvedParts.pop();
|
||||
originalParts.pop();
|
||||
}
|
||||
|
||||
@@ -1248,6 +1248,7 @@ namespace ts {
|
||||
return host.fileExists(f);
|
||||
},
|
||||
...(host.directoryExists ? { directoryExists: f => host.directoryExists!(f) } : {}),
|
||||
useCaseSensitiveFileNames: () => host.useCaseSensitiveFileNames(),
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -5045,6 +5045,7 @@ namespace ts {
|
||||
/* @internal */
|
||||
export interface EmitHost extends ScriptReferenceHost, ModuleSpecifierResolutionHost {
|
||||
getSourceFiles(): ReadonlyArray<SourceFile>;
|
||||
useCaseSensitiveFileNames(): boolean;
|
||||
getCurrentDirectory(): string;
|
||||
|
||||
/* @internal */
|
||||
|
||||
@@ -4278,6 +4278,7 @@ declare namespace ts {
|
||||
}
|
||||
interface EmitHost extends ScriptReferenceHost, ModuleSpecifierResolutionHost {
|
||||
getSourceFiles(): ReadonlyArray<SourceFile>;
|
||||
useCaseSensitiveFileNames(): boolean;
|
||||
getCurrentDirectory(): string;
|
||||
isSourceFileFromExternalLibrary(file: SourceFile): boolean;
|
||||
getCommonSourceDirectory(): string;
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
//// [tests/cases/compiler/caseInsensitiveFileSystemWithCapsImportTypeDeclarations.ts] ////
|
||||
|
||||
//// [index.ts]
|
||||
import { TypeB } from './type-b';
|
||||
|
||||
export class Broken {
|
||||
method () {
|
||||
return { } as TypeB;
|
||||
}
|
||||
}
|
||||
//// [type-b.ts]
|
||||
import { Merge } from './types';
|
||||
import { TypeA } from './type-a';
|
||||
|
||||
export type TypeB = Merge<TypeA, {
|
||||
b: string;
|
||||
}>;
|
||||
//// [type-a.ts]
|
||||
export type TypeA = {
|
||||
a: string;
|
||||
}
|
||||
//// [types.ts]
|
||||
export type Merge<T, U> = T & U;
|
||||
|
||||
|
||||
//// [types.js]
|
||||
"use strict";
|
||||
exports.__esModule = true;
|
||||
//// [type-a.js]
|
||||
"use strict";
|
||||
exports.__esModule = true;
|
||||
//// [type-b.js]
|
||||
"use strict";
|
||||
exports.__esModule = true;
|
||||
//// [index.js]
|
||||
"use strict";
|
||||
exports.__esModule = true;
|
||||
var Broken = /** @class */ (function () {
|
||||
function Broken() {
|
||||
}
|
||||
Broken.prototype.method = function () {
|
||||
return {};
|
||||
};
|
||||
return Broken;
|
||||
}());
|
||||
exports.Broken = Broken;
|
||||
|
||||
|
||||
//// [types.d.ts]
|
||||
export declare type Merge<T, U> = T & U;
|
||||
//// [type-a.d.ts]
|
||||
export declare type TypeA = {
|
||||
a: string;
|
||||
};
|
||||
//// [type-b.d.ts]
|
||||
import { Merge } from './types';
|
||||
import { TypeA } from './type-a';
|
||||
export declare type TypeB = Merge<TypeA, {
|
||||
b: string;
|
||||
}>;
|
||||
//// [index.d.ts]
|
||||
export declare class Broken {
|
||||
method(): import("./types").Merge<import("./type-a").TypeA, {
|
||||
b: string;
|
||||
}>;
|
||||
}
|
||||
+45
@@ -0,0 +1,45 @@
|
||||
=== tests/cases/compiler/Uppercased_Dir/src/index.ts ===
|
||||
import { TypeB } from './type-b';
|
||||
>TypeB : Symbol(TypeB, Decl(index.ts, 0, 8))
|
||||
|
||||
export class Broken {
|
||||
>Broken : Symbol(Broken, Decl(index.ts, 0, 33))
|
||||
|
||||
method () {
|
||||
>method : Symbol(Broken.method, Decl(index.ts, 2, 21))
|
||||
|
||||
return { } as TypeB;
|
||||
>TypeB : Symbol(TypeB, Decl(index.ts, 0, 8))
|
||||
}
|
||||
}
|
||||
=== tests/cases/compiler/Uppercased_Dir/src/type-b.ts ===
|
||||
import { Merge } from './types';
|
||||
>Merge : Symbol(Merge, Decl(type-b.ts, 0, 8))
|
||||
|
||||
import { TypeA } from './type-a';
|
||||
>TypeA : Symbol(TypeA, Decl(type-b.ts, 1, 8))
|
||||
|
||||
export type TypeB = Merge<TypeA, {
|
||||
>TypeB : Symbol(TypeB, Decl(type-b.ts, 1, 33))
|
||||
>Merge : Symbol(Merge, Decl(type-b.ts, 0, 8))
|
||||
>TypeA : Symbol(TypeA, Decl(type-b.ts, 1, 8))
|
||||
|
||||
b: string;
|
||||
>b : Symbol(b, Decl(type-b.ts, 3, 34))
|
||||
|
||||
}>;
|
||||
=== tests/cases/compiler/Uppercased_Dir/src/type-a.ts ===
|
||||
export type TypeA = {
|
||||
>TypeA : Symbol(TypeA, Decl(type-a.ts, 0, 0))
|
||||
|
||||
a: string;
|
||||
>a : Symbol(a, Decl(type-a.ts, 0, 21))
|
||||
}
|
||||
=== tests/cases/compiler/Uppercased_Dir/src/types.ts ===
|
||||
export type Merge<T, U> = T & U;
|
||||
>Merge : Symbol(Merge, Decl(types.ts, 0, 0))
|
||||
>T : Symbol(T, Decl(types.ts, 0, 18))
|
||||
>U : Symbol(U, Decl(types.ts, 0, 20))
|
||||
>T : Symbol(T, Decl(types.ts, 0, 18))
|
||||
>U : Symbol(U, Decl(types.ts, 0, 20))
|
||||
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
=== tests/cases/compiler/Uppercased_Dir/src/index.ts ===
|
||||
import { TypeB } from './type-b';
|
||||
>TypeB : any
|
||||
|
||||
export class Broken {
|
||||
>Broken : Broken
|
||||
|
||||
method () {
|
||||
>method : () => import("tests/cases/compiler/Uppercased_Dir/src/types").Merge<import("tests/cases/compiler/Uppercased_Dir/src/type-a").TypeA, { b: string; }>
|
||||
|
||||
return { } as TypeB;
|
||||
>{ } as TypeB : import("tests/cases/compiler/Uppercased_Dir/src/types").Merge<import("tests/cases/compiler/Uppercased_Dir/src/type-a").TypeA, { b: string; }>
|
||||
>{ } : {}
|
||||
>TypeB : import("tests/cases/compiler/Uppercased_Dir/src/types").Merge<import("tests/cases/compiler/Uppercased_Dir/src/type-a").TypeA, { b: string; }>
|
||||
}
|
||||
}
|
||||
=== tests/cases/compiler/Uppercased_Dir/src/type-b.ts ===
|
||||
import { Merge } from './types';
|
||||
>Merge : any
|
||||
|
||||
import { TypeA } from './type-a';
|
||||
>TypeA : any
|
||||
|
||||
export type TypeB = Merge<TypeA, {
|
||||
>TypeB : Merge<TypeA, { b: string; }>
|
||||
>Merge : Merge<T, U>
|
||||
>TypeA : TypeA
|
||||
|
||||
b: string;
|
||||
>b : string
|
||||
|
||||
}>;
|
||||
=== tests/cases/compiler/Uppercased_Dir/src/type-a.ts ===
|
||||
export type TypeA = {
|
||||
>TypeA : TypeA
|
||||
|
||||
a: string;
|
||||
>a : string
|
||||
}
|
||||
=== tests/cases/compiler/Uppercased_Dir/src/types.ts ===
|
||||
export type Merge<T, U> = T & U;
|
||||
>Merge : Merge<T, U>
|
||||
>T : T
|
||||
>U : U
|
||||
>T : T
|
||||
>U : U
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
// @declaration: true
|
||||
// @useCaseSensitiveFileNames: false
|
||||
// @filename: Uppercased_Dir/src/index.ts
|
||||
import { TypeB } from './type-b';
|
||||
|
||||
export class Broken {
|
||||
method () {
|
||||
return { } as TypeB;
|
||||
}
|
||||
}
|
||||
// @filename: Uppercased_Dir/src/type-b.ts
|
||||
import { Merge } from './types';
|
||||
import { TypeA } from './type-a';
|
||||
|
||||
export type TypeB = Merge<TypeA, {
|
||||
b: string;
|
||||
}>;
|
||||
// @filename: Uppercased_Dir/src/type-a.ts
|
||||
export type TypeA = {
|
||||
a: string;
|
||||
}
|
||||
// @filename: Uppercased_Dir/src/types.ts
|
||||
export type Merge<T, U> = T & U;
|
||||
Reference in New Issue
Block a user