Skip to content

Commit ec7a962

Browse files
committed
Merge remote-tracking branch 'origin/main' into fix/type-param-renaming
2 parents 11c2d14 + 054871a commit ec7a962

21 files changed

+98
-162
lines changed

internal/checker/nodebuilderimpl.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1440,7 +1440,7 @@ func (b *nodeBuilderImpl) createMappedTypeNodeFromType(t *Type) *ast.TypeNode {
14401440
originalConstraint := b.ch.instantiateType(rawConstraintTypeFromDeclaration, mapped.mapper)
14411441

14421442
var originalConstraintNode *ast.Node
1443-
if originalConstraint.flags&TypeFlagsUnknown != 0 {
1443+
if originalConstraint.flags&TypeFlagsUnknown == 0 {
14441444
originalConstraintNode = b.typeToTypeNode(originalConstraint)
14451445
}
14461446

internal/project/snapshot_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,4 +101,23 @@ func TestSnapshot(t *testing.T) {
101101
assert.Check(t, snapshotAfter.fs.diskFiles["/home/projects/ts/p1/a.ts"] == nil)
102102
assert.Check(t, snapshotAfter.fs.diskFiles["/home/projects/ts/p2/b.ts"] != nil)
103103
})
104+
105+
t.Run("GetFile returns nil for non-existent files", func(t *testing.T) {
106+
t.Parallel()
107+
files := map[string]any{
108+
"/home/projects/TS/p1/tsconfig.json": "{}",
109+
"/home/projects/TS/p1/index.ts": "console.log('Hello, world!');",
110+
}
111+
session := setup(files)
112+
session.DidOpenFile(context.Background(), "file:///home/projects/TS/p1/index.ts", 1, files["/home/projects/TS/p1/index.ts"].(string), lsproto.LanguageKindTypeScript)
113+
snapshot, release := session.Snapshot()
114+
defer release()
115+
116+
handle := snapshot.GetFile("/home/projects/TS/p1/nonexistent.ts")
117+
assert.Check(t, handle == nil, "GetFile should return nil for non-existent file")
118+
119+
// Test that ReadFile returns false for non-existent file
120+
_, ok := snapshot.ReadFile("/home/projects/TS/p1/nonexistent.ts")
121+
assert.Check(t, !ok, "ReadFile should return false for non-existent file")
122+
})
104123
}

internal/project/snapshotfs.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ type snapshotFS struct {
3030
readFiles collections.SyncMap[tspath.Path, memoizedDiskFile]
3131
}
3232

33-
type memoizedDiskFile func() *diskFile
33+
type memoizedDiskFile func() FileHandle
3434

3535
func (s *snapshotFS) FS() vfs.FS {
3636
return s.fs
@@ -43,16 +43,14 @@ func (s *snapshotFS) GetFile(fileName string) FileHandle {
4343
if file, ok := s.diskFiles[s.toPath(fileName)]; ok {
4444
return file
4545
}
46-
newEntry := memoizedDiskFile(sync.OnceValue(func() *diskFile {
46+
newEntry := memoizedDiskFile(sync.OnceValue(func() FileHandle {
4747
if contents, ok := s.fs.ReadFile(fileName); ok {
4848
return newDiskFile(fileName, contents)
4949
}
5050
return nil
5151
}))
52-
if entry, ok := s.readFiles.LoadOrStore(s.toPath(fileName), newEntry); ok {
53-
return entry()
54-
}
55-
return nil
52+
entry, _ := s.readFiles.LoadOrStore(s.toPath(fileName), newEntry)
53+
return entry()
5654
}
5755

5856
type snapshotFSBuilder struct {

testdata/baselines/reference/submodule/compiler/computedTypesKeyofNoIndexSignatureType.types

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
=== computedTypesKeyofNoIndexSignatureType.ts ===
44
type Compute<A> = { [K in keyof A]: Compute<A[K]>; } & {};
5-
>Compute : { [K in keyof A]: A[K] extends infer T extends unknown ? { [K_1 in keyof T]: A[K][K_1] extends infer T_1 extends unknown ? { [K_2 in keyof T_1]: A[K][K_1][K_2] extends infer T_2 extends unknown ? { [K_3 in keyof T_2]: A[K][K_1][K_2][K_3] extends infer T_3 extends unknown ? { [K_4 in keyof T_3]: A[K][K_1][K_2][K_3][K_4] extends infer T_4 extends unknown ? { [K_5 in keyof T_4]: A[K][K_1][K_2][K_3][K_4][K_5] extends infer T_5 extends unknown ? { [K_6 in keyof T_5]: A[K][K_1][K_2][K_3][K_4][K_5][K_6] extends infer T_6 extends unknown ? { [K_7 in keyof T_6]: A[K][K_1][K_2][K_3][K_4][K_5][K_6][K_7] extends infer T_7 extends unknown ? { [K_8 in keyof T_7]: A[K][K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8] extends infer T_8 extends unknown ? { [K_9 in keyof T_8]: A[K][K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8][K_9] extends infer T_9 extends unknown ? { [K_10 in keyof T_9]: any; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; }
5+
>Compute : { [K in keyof A]: A[K] extends infer T ? { [K_1 in keyof T]: A[K][K_1] extends infer T_1 ? { [K_2 in keyof T_1]: A[K][K_1][K_2] extends infer T_2 ? { [K_3 in keyof T_2]: A[K][K_1][K_2][K_3] extends infer T_3 ? { [K_4 in keyof T_3]: A[K][K_1][K_2][K_3][K_4] extends infer T_4 ? { [K_5 in keyof T_4]: A[K][K_1][K_2][K_3][K_4][K_5] extends infer T_5 ? { [K_6 in keyof T_5]: A[K][K_1][K_2][K_3][K_4][K_5][K_6] extends infer T_6 ? { [K_7 in keyof T_6]: A[K][K_1][K_2][K_3][K_4][K_5][K_6][K_7] extends infer T_7 ? { [K_8 in keyof T_7]: A[K][K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8] extends infer T_8 ? { [K_9 in keyof T_8]: A[K][K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8][K_9] extends infer T_9 ? { [K_10 in keyof T_9]: any; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; }
66

77
type EqualsTest<T> = <A>() => A extends T ? 1 : 0;
88
>EqualsTest : EqualsTest<T>

testdata/baselines/reference/submodule/compiler/computedTypesKeyofNoIndexSignatureType.types.diff

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
=== computedTypesKeyofNoIndexSignatureType.ts ===
66
type Compute<A> = { [K in keyof A]: Compute<A[K]>; } & {};
77
->Compute : { [K in keyof A]: A[K] extends infer T ? { [K_1 in keyof T]: T[K_1] extends infer T_1 ? { [K_2 in keyof T_1]: T_1[K_2] extends infer T_2 ? { [K_3 in keyof T_2]: T_2[K_3] extends infer T_3 ? { [K_4 in keyof T_3]: T_3[K_4] extends infer T_4 ? { [K_5 in keyof T_4]: T_4[K_5] extends infer T_5 ? { [K_6 in keyof T_5]: T_5[K_6] extends infer T_6 ? { [K_7 in keyof T_6]: T_6[K_7] extends infer T_7 ? { [K_8 in keyof T_7]: T_7[K_8] extends infer T_8 ? { [K_9 in keyof T_8]: T_8[K_9] extends infer T_9 ? { [K_10 in keyof T_9]: any; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; }
8-
+>Compute : { [K in keyof A]: A[K] extends infer T extends unknown ? { [K_1 in keyof T]: A[K][K_1] extends infer T_1 extends unknown ? { [K_2 in keyof T_1]: A[K][K_1][K_2] extends infer T_2 extends unknown ? { [K_3 in keyof T_2]: A[K][K_1][K_2][K_3] extends infer T_3 extends unknown ? { [K_4 in keyof T_3]: A[K][K_1][K_2][K_3][K_4] extends infer T_4 extends unknown ? { [K_5 in keyof T_4]: A[K][K_1][K_2][K_3][K_4][K_5] extends infer T_5 extends unknown ? { [K_6 in keyof T_5]: A[K][K_1][K_2][K_3][K_4][K_5][K_6] extends infer T_6 extends unknown ? { [K_7 in keyof T_6]: A[K][K_1][K_2][K_3][K_4][K_5][K_6][K_7] extends infer T_7 extends unknown ? { [K_8 in keyof T_7]: A[K][K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8] extends infer T_8 extends unknown ? { [K_9 in keyof T_8]: A[K][K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8][K_9] extends infer T_9 extends unknown ? { [K_10 in keyof T_9]: any; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; }
8+
+>Compute : { [K in keyof A]: A[K] extends infer T ? { [K_1 in keyof T]: A[K][K_1] extends infer T_1 ? { [K_2 in keyof T_1]: A[K][K_1][K_2] extends infer T_2 ? { [K_3 in keyof T_2]: A[K][K_1][K_2][K_3] extends infer T_3 ? { [K_4 in keyof T_3]: A[K][K_1][K_2][K_3][K_4] extends infer T_4 ? { [K_5 in keyof T_4]: A[K][K_1][K_2][K_3][K_4][K_5] extends infer T_5 ? { [K_6 in keyof T_5]: A[K][K_1][K_2][K_3][K_4][K_5][K_6] extends infer T_6 ? { [K_7 in keyof T_6]: A[K][K_1][K_2][K_3][K_4][K_5][K_6][K_7] extends infer T_7 ? { [K_8 in keyof T_7]: A[K][K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8] extends infer T_8 ? { [K_9 in keyof T_8]: A[K][K_1][K_2][K_3][K_4][K_5][K_6][K_7][K_8][K_9] extends infer T_9 ? { [K_10 in keyof T_9]: any; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; } : never; }
99

1010
type EqualsTest<T> = <A>() => A extends T ? 1 : 0;
1111
>EqualsTest : EqualsTest<T>

testdata/baselines/reference/submodule/compiler/declarationEmitMappedTypeDistributivityPreservesConstraints.js

Lines changed: 6 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -50,50 +50,12 @@ export default _default;
5050
declare const _default: {
5151
test: {
5252
fn: <T extends {
53-
x: T["x"] extends infer T_1 ? { [K in keyof T_1]: T["x"][K]; } : never;
54-
}>(sliceIndex: T) => T["x"] extends infer T_1 ? { [K in keyof T_1]: Parameters<T["x"][K]>; } : never;
53+
x: T["x"] extends infer T_1 extends {
54+
[x: string]: (...params: unknown[]) => unknown;
55+
} ? { [K in keyof T_1]: T["x"][K]; } : never;
56+
}>(sliceIndex: T) => T["x"] extends infer T_1 extends {
57+
[x: string]: (...params: unknown[]) => unknown;
58+
} ? { [K in keyof T_1]: Parameters<T["x"][K]>; } : never;
5559
};
5660
};
5761
export default _default;
58-
59-
60-
//// [DtsFileErrors]
61-
62-
63-
reexport.d.ts(5,88): error TS2344: Type 'T["x"][K]' does not satisfy the constraint '(...args: any) => any'.
64-
Type 'T["x"][keyof T_1]' is not assignable to type '(...args: any) => any'.
65-
Type 'T["x"][string] | T["x"][number] | T["x"][symbol]' is not assignable to type '(...args: any) => any'.
66-
Type 'T["x"][string]' is not assignable to type '(...args: any) => any'.
67-
68-
69-
==== types.d.ts (0 errors) ====
70-
type Fns = Record<string, (...params: unknown[]) => unknown>;
71-
type Map<T extends Fns> = {
72-
[K in keyof T]: T[K];
73-
};
74-
type AllArg<T extends Fns> = {
75-
[K in keyof T]: Parameters<T[K]>;
76-
};
77-
declare function fn<T extends {
78-
x: Map<T['x']>;
79-
}>(sliceIndex: T): AllArg<T['x']>;
80-
declare const _default: {
81-
fn: typeof fn;
82-
};
83-
export default _default;
84-
85-
==== reexport.d.ts (1 errors) ====
86-
declare const _default: {
87-
test: {
88-
fn: <T extends {
89-
x: T["x"] extends infer T_1 ? { [K in keyof T_1]: T["x"][K]; } : never;
90-
}>(sliceIndex: T) => T["x"] extends infer T_1 ? { [K in keyof T_1]: Parameters<T["x"][K]>; } : never;
91-
~~~~~~~~~
92-
!!! error TS2344: Type 'T["x"][K]' does not satisfy the constraint '(...args: any) => any'.
93-
!!! error TS2344: Type 'T["x"][keyof T_1]' is not assignable to type '(...args: any) => any'.
94-
!!! error TS2344: Type 'T["x"][string] | T["x"][number] | T["x"][symbol]' is not assignable to type '(...args: any) => any'.
95-
!!! error TS2344: Type 'T["x"][string]' is not assignable to type '(...args: any) => any'.
96-
};
97-
};
98-
export default _default;
99-

testdata/baselines/reference/submodule/compiler/declarationEmitMappedTypeDistributivityPreservesConstraints.js.diff

Lines changed: 8 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -9,60 +9,17 @@
99
exports.default = { test: types_1.default };
1010

1111

12-
@@= skipped -23, +23 lines =@@
13-
declare const _default: {
14-
test: {
12+
@@= skipped -25, +25 lines =@@
1513
fn: <T extends {
16-
- x: T["x"] extends infer T_1 extends {
17-
- [x: string]: (...params: unknown[]) => unknown;
14+
x: T["x"] extends infer T_1 extends {
15+
[x: string]: (...params: unknown[]) => unknown;
1816
- } ? { [K in keyof T_1]: T_1[K]; } : never;
1917
- }>(sliceIndex: T) => T["x"] extends infer T_2 extends {
20-
- [x: string]: (...params: unknown[]) => unknown;
18+
+ } ? { [K in keyof T_1]: T["x"][K]; } : never;
19+
+ }>(sliceIndex: T) => T["x"] extends infer T_1 extends {
20+
[x: string]: (...params: unknown[]) => unknown;
2121
- } ? { [K_1 in keyof T_2]: Parameters<T_2[K_1]>; } : never;
22-
+ x: T["x"] extends infer T_1 ? { [K in keyof T_1]: T["x"][K]; } : never;
23-
+ }>(sliceIndex: T) => T["x"] extends infer T_1 ? { [K in keyof T_1]: Parameters<T["x"][K]>; } : never;
22+
+ } ? { [K in keyof T_1]: Parameters<T["x"][K]>; } : never;
2423
};
2524
};
26-
export default _default;
27-
+
28-
+
29-
+//// [DtsFileErrors]
30-
+
31-
+
32-
+reexport.d.ts(5,88): error TS2344: Type 'T["x"][K]' does not satisfy the constraint '(...args: any) => any'.
33-
+ Type 'T["x"][keyof T_1]' is not assignable to type '(...args: any) => any'.
34-
+ Type 'T["x"][string] | T["x"][number] | T["x"][symbol]' is not assignable to type '(...args: any) => any'.
35-
+ Type 'T["x"][string]' is not assignable to type '(...args: any) => any'.
36-
+
37-
+
38-
+==== types.d.ts (0 errors) ====
39-
+ type Fns = Record<string, (...params: unknown[]) => unknown>;
40-
+ type Map<T extends Fns> = {
41-
+ [K in keyof T]: T[K];
42-
+ };
43-
+ type AllArg<T extends Fns> = {
44-
+ [K in keyof T]: Parameters<T[K]>;
45-
+ };
46-
+ declare function fn<T extends {
47-
+ x: Map<T['x']>;
48-
+ }>(sliceIndex: T): AllArg<T['x']>;
49-
+ declare const _default: {
50-
+ fn: typeof fn;
51-
+ };
52-
+ export default _default;
53-
+
54-
+==== reexport.d.ts (1 errors) ====
55-
+ declare const _default: {
56-
+ test: {
57-
+ fn: <T extends {
58-
+ x: T["x"] extends infer T_1 ? { [K in keyof T_1]: T["x"][K]; } : never;
59-
+ }>(sliceIndex: T) => T["x"] extends infer T_1 ? { [K in keyof T_1]: Parameters<T["x"][K]>; } : never;
60-
+ ~~~~~~~~~
61-
+!!! error TS2344: Type 'T["x"][K]' does not satisfy the constraint '(...args: any) => any'.
62-
+!!! error TS2344: Type 'T["x"][keyof T_1]' is not assignable to type '(...args: any) => any'.
63-
+!!! error TS2344: Type 'T["x"][string] | T["x"][number] | T["x"][symbol]' is not assignable to type '(...args: any) => any'.
64-
+!!! error TS2344: Type 'T["x"][string]' is not assignable to type '(...args: any) => any'.
65-
+ };
66-
+ };
67-
+ export default _default;
68-
+
25+
export default _default;

testdata/baselines/reference/submodule/compiler/declarationEmitMappedTypeDistributivityPreservesConstraints.types

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ export default { fn };
2626

2727
=== reexport.ts ===
2828
import test from "./types";
29-
>test : { fn: <T extends { x: T["x"] extends infer T_1 ? { [K in keyof T_1]: T["x"][K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_1 ? { [K in keyof T_1]: Parameters<T["x"][K]>; } : never; }
29+
>test : { fn: <T extends { x: T["x"] extends infer T_1 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K in keyof T_1]: T["x"][K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_1 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K in keyof T_1]: Parameters<T["x"][K]>; } : never; }
3030

3131
export default { test };
32-
>{ test } : { test: { fn: <T extends { x: T["x"] extends infer T_1 ? { [K in keyof T_1]: T["x"][K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_1 ? { [K in keyof T_1]: Parameters<T["x"][K]>; } : never; }; }
33-
>test : { fn: <T extends { x: T["x"] extends infer T_1 ? { [K in keyof T_1]: T["x"][K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_1 ? { [K in keyof T_1]: Parameters<T["x"][K]>; } : never; }
32+
>{ test } : { test: { fn: <T extends { x: T["x"] extends infer T_1 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K in keyof T_1]: T["x"][K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_1 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K in keyof T_1]: Parameters<T["x"][K]>; } : never; }; }
33+
>test : { fn: <T extends { x: T["x"] extends infer T_1 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K in keyof T_1]: T["x"][K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_1 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K in keyof T_1]: Parameters<T["x"][K]>; } : never; }
3434

testdata/baselines/reference/submodule/compiler/declarationEmitMappedTypeDistributivityPreservesConstraints.types.diff

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
=== reexport.ts ===
66
import test from "./types";
77
->test : { fn: <T extends { x: T["x"] extends infer T_1 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K in keyof T_1]: T_1[K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_2 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K_1 in keyof T_2]: Parameters<T_2[K_1]>; } : never; }
8-
+>test : { fn: <T extends { x: T["x"] extends infer T_1 ? { [K in keyof T_1]: T["x"][K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_1 ? { [K in keyof T_1]: Parameters<T["x"][K]>; } : never; }
8+
+>test : { fn: <T extends { x: T["x"] extends infer T_1 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K in keyof T_1]: T["x"][K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_1 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K in keyof T_1]: Parameters<T["x"][K]>; } : never; }
99

1010
export default { test };
1111
->{ test } : { test: { fn: <T extends { x: T["x"] extends infer T_1 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K in keyof T_1]: T_1[K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_2 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K_1 in keyof T_2]: Parameters<T_2[K_1]>; } : never; }; }
1212
->test : { fn: <T extends { x: T["x"] extends infer T_1 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K in keyof T_1]: T_1[K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_2 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K_1 in keyof T_2]: Parameters<T_2[K_1]>; } : never; }
13-
+>{ test } : { test: { fn: <T extends { x: T["x"] extends infer T_1 ? { [K in keyof T_1]: T["x"][K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_1 ? { [K in keyof T_1]: Parameters<T["x"][K]>; } : never; }; }
14-
+>test : { fn: <T extends { x: T["x"] extends infer T_1 ? { [K in keyof T_1]: T["x"][K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_1 ? { [K in keyof T_1]: Parameters<T["x"][K]>; } : never; }
13+
+>{ test } : { test: { fn: <T extends { x: T["x"] extends infer T_1 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K in keyof T_1]: T["x"][K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_1 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K in keyof T_1]: Parameters<T["x"][K]>; } : never; }; }
14+
+>test : { fn: <T extends { x: T["x"] extends infer T_1 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K in keyof T_1]: T["x"][K]; } : never; }>(sliceIndex: T) => T["x"] extends infer T_1 extends { [x: string]: (...params: unknown[]) => unknown; } ? { [K in keyof T_1]: Parameters<T["x"][K]>; } : never; }

0 commit comments

Comments
 (0)