Skip to content

Commit ad9559e

Browse files
authored
Reorder TypeFlags to improve sort order (#1226)
1 parent 86d2109 commit ad9559e

File tree

44 files changed

+329
-132
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

44 files changed

+329
-132
lines changed

internal/checker/types.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -427,18 +427,18 @@ const (
427427
TypeFlagsUniqueESSymbol TypeFlags = 1 << 14 // unique symbol
428428
TypeFlagsEnumLiteral TypeFlags = 1 << 15 // Always combined with StringLiteral, NumberLiteral, or Union
429429
TypeFlagsEnum TypeFlags = 1 << 16 // Numeric computed enum member value (must be right after EnumLiteral, see getSortOrderFlags)
430-
TypeFlagsNever TypeFlags = 1 << 17 // Never type
431-
TypeFlagsTypeParameter TypeFlags = 1 << 18 // Type parameter
432-
TypeFlagsObject TypeFlags = 1 << 19 // Object type
433-
TypeFlagsUnion TypeFlags = 1 << 20 // Union (T | U)
434-
TypeFlagsIntersection TypeFlags = 1 << 21 // Intersection (T & U)
435-
TypeFlagsIndex TypeFlags = 1 << 22 // keyof T
436-
TypeFlagsIndexedAccess TypeFlags = 1 << 23 // T[K]
437-
TypeFlagsConditional TypeFlags = 1 << 24 // T extends U ? X : Y
438-
TypeFlagsSubstitution TypeFlags = 1 << 25 // Type parameter substitution
439-
TypeFlagsNonPrimitive TypeFlags = 1 << 26 // intrinsic object type
440-
TypeFlagsTemplateLiteral TypeFlags = 1 << 27 // Template literal type
441-
TypeFlagsStringMapping TypeFlags = 1 << 28 // Uppercase/Lowercase type
430+
TypeFlagsNonPrimitive TypeFlags = 1 << 17 // intrinsic object type
431+
TypeFlagsNever TypeFlags = 1 << 18 // Never type
432+
TypeFlagsTypeParameter TypeFlags = 1 << 19 // Type parameter
433+
TypeFlagsObject TypeFlags = 1 << 20 // Object type
434+
TypeFlagsIndex TypeFlags = 1 << 21 // keyof T
435+
TypeFlagsIndexedAccess TypeFlags = 1 << 22 // T[K]
436+
TypeFlagsConditional TypeFlags = 1 << 23 // T extends U ? X : Y
437+
TypeFlagsSubstitution TypeFlags = 1 << 24 // Type parameter substitution
438+
TypeFlagsTemplateLiteral TypeFlags = 1 << 25 // Template literal type
439+
TypeFlagsStringMapping TypeFlags = 1 << 26 // Uppercase/Lowercase type
440+
TypeFlagsUnion TypeFlags = 1 << 27 // Union (T | U)
441+
TypeFlagsIntersection TypeFlags = 1 << 28 // Intersection (T & U)
442442
TypeFlagsReserved1 TypeFlags = 1 << 29 // Used by union/intersection type construction
443443
TypeFlagsReserved2 TypeFlags = 1 << 30 // Used by union/intersection type construction
444444
TypeFlagsReserved3 TypeFlags = 1 << 31
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
//// [tests/cases/compiler/objectSubtypeReduction.ts] ////
2+
3+
=== objectSubtypeReduction.ts ===
4+
// https://github.com/microsoft/typescript-go/issues/1164
5+
6+
function foo(x?: object) {
7+
>foo : Symbol(foo, Decl(objectSubtypeReduction.ts, 0, 0))
8+
>x : Symbol(x, Decl(objectSubtypeReduction.ts, 2, 13))
9+
10+
return Object.entries(x || {})
11+
>Object.entries(x || {}) .sort : Symbol(sort, Decl(lib.es5.d.ts, --, --))
12+
>Object.entries : Symbol(entries, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
13+
>Object : Symbol(Object, Decl(lib.es5.d.ts, --, --), Decl(lib.es5.d.ts, --, --))
14+
>entries : Symbol(entries, Decl(lib.es2017.object.d.ts, --, --), Decl(lib.es2017.object.d.ts, --, --))
15+
>x : Symbol(x, Decl(objectSubtypeReduction.ts, 2, 13))
16+
17+
.sort(([k1, v1], [k2, v2]) => v1.name.localeCompare(v2.name));
18+
>sort : Symbol(sort, Decl(lib.es5.d.ts, --, --))
19+
>k1 : Symbol(k1, Decl(objectSubtypeReduction.ts, 4, 16))
20+
>v1 : Symbol(v1, Decl(objectSubtypeReduction.ts, 4, 19))
21+
>k2 : Symbol(k2, Decl(objectSubtypeReduction.ts, 4, 26))
22+
>v2 : Symbol(v2, Decl(objectSubtypeReduction.ts, 4, 29))
23+
>v1 : Symbol(v1, Decl(objectSubtypeReduction.ts, 4, 19))
24+
>v2 : Symbol(v2, Decl(objectSubtypeReduction.ts, 4, 29))
25+
}
26+
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
//// [tests/cases/compiler/objectSubtypeReduction.ts] ////
2+
3+
=== objectSubtypeReduction.ts ===
4+
// https://github.com/microsoft/typescript-go/issues/1164
5+
6+
function foo(x?: object) {
7+
>foo : (x?: object | undefined) => [string, any][]
8+
>x : object | undefined
9+
10+
return Object.entries(x || {})
11+
>Object.entries(x || {}) .sort(([k1, v1], [k2, v2]) => v1.name.localeCompare(v2.name)) : [string, any][]
12+
>Object.entries(x || {}) .sort : (compareFn?: ((a: [string, any], b: [string, any]) => number) | undefined) => [string, any][]
13+
>Object.entries(x || {}) : [string, any][]
14+
>Object.entries : { <T>(o: ArrayLike<T> | { [s: string]: T; }): [string, T][]; (o: {}): [string, any][]; }
15+
>Object : ObjectConstructor
16+
>entries : { <T>(o: ArrayLike<T> | { [s: string]: T; }): [string, T][]; (o: {}): [string, any][]; }
17+
>x || {} : object
18+
>x : object | undefined
19+
>{} : {}
20+
21+
.sort(([k1, v1], [k2, v2]) => v1.name.localeCompare(v2.name));
22+
>sort : (compareFn?: ((a: [string, any], b: [string, any]) => number) | undefined) => [string, any][]
23+
>([k1, v1], [k2, v2]) => v1.name.localeCompare(v2.name) : ([k1, v1]: [string, any], [k2, v2]: [string, any]) => any
24+
>k1 : string
25+
>v1 : any
26+
>k2 : string
27+
>v2 : any
28+
>v1.name.localeCompare(v2.name) : any
29+
>v1.name.localeCompare : any
30+
>v1.name : any
31+
>v1 : any
32+
>name : any
33+
>localeCompare : any
34+
>v2.name : any
35+
>v2 : any
36+
>name : any
37+
}
38+

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,19 @@
55

66
Object.freeze({
77
>Object.freeze({ foo() { return Object.freeze('a'); },}) : Readonly<{ foo(): string; }>
8-
>Object.freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: U | object | null | undefined; }, U extends string | number | bigint | symbol | boolean>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
8+
>Object.freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: object | U | null | undefined; }, U extends string | number | bigint | symbol | boolean>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
99
>Object : ObjectConstructor
10-
>freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: U | object | null | undefined; }, U extends string | number | bigint | symbol | boolean>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
10+
>freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: object | U | null | undefined; }, U extends string | number | bigint | symbol | boolean>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
1111
>{ foo() { return Object.freeze('a'); },} : { foo(): string; }
1212

1313
foo() {
1414
>foo : () => string
1515

1616
return Object.freeze('a');
1717
>Object.freeze('a') : string
18-
>Object.freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: U | object | null | undefined; }, U extends string | number | bigint | symbol | boolean>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
18+
>Object.freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: object | U | null | undefined; }, U extends string | number | bigint | symbol | boolean>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
1919
>Object : ObjectConstructor
20-
>freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: U | object | null | undefined; }, U extends string | number | bigint | symbol | boolean>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
20+
>freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: object | U | null | undefined; }, U extends string | number | bigint | symbol | boolean>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
2121
>'a' : "a"
2222

2323
},

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
Object.freeze({
66
>Object.freeze({ foo() { return Object.freeze('a'); },}) : Readonly<{ foo(): string; }>
77
->Object.freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: U | null | undefined | object; }, U extends string | bigint | number | boolean | symbol>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
8-
+>Object.freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: U | object | null | undefined; }, U extends string | number | bigint | symbol | boolean>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
8+
+>Object.freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: object | U | null | undefined; }, U extends string | number | bigint | symbol | boolean>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
99
>Object : ObjectConstructor
1010
->freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: U | null | undefined | object; }, U extends string | bigint | number | boolean | symbol>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
11-
+>freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: U | object | null | undefined; }, U extends string | number | bigint | symbol | boolean>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
11+
+>freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: object | U | null | undefined; }, U extends string | number | bigint | symbol | boolean>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
1212
>{ foo() { return Object.freeze('a'); },} : { foo(): string; }
1313

1414
foo() {
@@ -17,10 +17,10 @@
1717
return Object.freeze('a');
1818
>Object.freeze('a') : string
1919
->Object.freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: U | null | undefined | object; }, U extends string | bigint | number | boolean | symbol>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
20-
+>Object.freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: U | object | null | undefined; }, U extends string | number | bigint | symbol | boolean>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
20+
+>Object.freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: object | U | null | undefined; }, U extends string | number | bigint | symbol | boolean>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
2121
>Object : ObjectConstructor
2222
->freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: U | null | undefined | object; }, U extends string | bigint | number | boolean | symbol>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
23-
+>freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: U | object | null | undefined; }, U extends string | number | bigint | symbol | boolean>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
23+
+>freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: object | U | null | undefined; }, U extends string | number | bigint | symbol | boolean>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
2424
>'a' : "a"
2525

2626
},

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55

66
Object.freeze({
77
>Object.freeze({ f: function () { }}) : Readonly<{ f: () => void; }>
8-
>Object.freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: U | object; }, U extends string | number | bigint | symbol | boolean>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
8+
>Object.freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: object | U; }, U extends string | number | bigint | symbol | boolean>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
99
>Object : ObjectConstructor
10-
>freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: U | object; }, U extends string | number | bigint | symbol | boolean>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
10+
>freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: object | U; }, U extends string | number | bigint | symbol | boolean>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
1111
>{ f: function () { }} : { f: () => void; }
1212

1313
f: function () { }

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
Object.freeze({
66
>Object.freeze({ f: function () { }}) : Readonly<{ f: () => void; }>
77
->Object.freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: U | null | undefined | object; }, U extends string | bigint | number | boolean | symbol>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
8-
+>Object.freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: U | object; }, U extends string | number | bigint | symbol | boolean>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
8+
+>Object.freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: object | U; }, U extends string | number | bigint | symbol | boolean>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
99
>Object : ObjectConstructor
1010
->freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: U | null | undefined | object; }, U extends string | bigint | number | boolean | symbol>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
11-
+>freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: U | object; }, U extends string | number | bigint | symbol | boolean>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
11+
+>freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: object | U; }, U extends string | number | bigint | symbol | boolean>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
1212
>{ f: function () { }} : { f: () => void; }
1313

1414
f: function () { }

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -860,15 +860,15 @@ function getConfigOrDefault<T extends keyof Config>(
860860
>key : T
861861

862862
const assertedCheck = userValue ? userValue! : defaultValue;
863-
>assertedCheck : NonNullable<Partial<Config>[T]>
864-
>userValue ? userValue! : defaultValue : NonNullable<Partial<Config>[T]>
863+
>assertedCheck : Config[T]
864+
>userValue ? userValue! : defaultValue : Config[T]
865865
>userValue : Partial<Config>[T]
866866
>userValue! : NonNullable<Partial<Config>[T]>
867867
>userValue : NonNullable<Partial<Config>[T]>
868868
>defaultValue : Config[T]
869869

870870
return assertedCheck;
871-
>assertedCheck : NonNullable<Partial<Config>[T]>
871+
>assertedCheck : Config[T]
872872
}
873873

874874
// repro from #47523

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

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,4 +141,23 @@
141141
+>< K extends KeyOfOriginal, N extends NestedKeyOfOriginalFor<K>>( original: Original, mappedFromOriginal: MappedFromOriginal, key: K, nestedKey: N): [Original[K][N], MappedFromOriginal[K][N]] => { return [original[key][nestedKey], mappedFromOriginal[key][nestedKey]];} : <K extends keyof Original, N extends keyof Original[K]>(original: Original, mappedFromOriginal: SameKeys<Original>, key: K, nestedKey: N) => [Original[K][N], SameKeys<Original>[K][N]]
142142

143143
K extends KeyOfOriginal,
144-
N extends NestedKeyOfOriginalFor<K>
144+
N extends NestedKeyOfOriginalFor<K>
145+
@@= skipped -63, +63 lines =@@
146+
>key : T
147+
148+
const assertedCheck = userValue ? userValue! : defaultValue;
149+
->assertedCheck : NonNullable<Partial<Config>[T]>
150+
->userValue ? userValue! : defaultValue : NonNullable<Partial<Config>[T]>
151+
+>assertedCheck : Config[T]
152+
+>userValue ? userValue! : defaultValue : Config[T]
153+
>userValue : Partial<Config>[T]
154+
>userValue! : NonNullable<Partial<Config>[T]>
155+
>userValue : NonNullable<Partial<Config>[T]>
156+
>defaultValue : Config[T]
157+
158+
return assertedCheck;
159+
->assertedCheck : NonNullable<Partial<Config>[T]>
160+
+>assertedCheck : Config[T]
161+
}
162+
163+
// repro from #47523

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,9 @@ cbThing(type => {
5151
const Thing = Object.freeze({
5252
>Thing : Readonly<{ a: "thing"; b: "chill"; }>
5353
>Object.freeze({ a: "thing", b: "chill"}) : Readonly<{ a: "thing"; b: "chill"; }>
54-
>Object.freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: U | object; }, U extends string | number | bigint | symbol | boolean>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
54+
>Object.freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: object | U; }, U extends string | number | bigint | symbol | boolean>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
5555
>Object : ObjectConstructor
56-
>freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: U | object; }, U extends string | number | bigint | symbol | boolean>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
56+
>freeze : { <T extends Function>(f: T): T; <T extends { [idx: string]: object | U; }, U extends string | number | bigint | symbol | boolean>(o: T): Readonly<T>; <T>(o: T): Readonly<T>; }
5757
>{ a: "thing", b: "chill"} : { a: "thing"; b: "chill"; }
5858

5959
a: "thing",

0 commit comments

Comments
 (0)