Skip to content

Commit fd228a9

Browse files
committed
Remove partial inference
1 parent a2be5e2 commit fd228a9

File tree

9 files changed

+112
-87
lines changed

9 files changed

+112
-87
lines changed

src/compiler/checker.ts

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9155,15 +9155,8 @@ namespace ts {
91559155
return constraint && maybeTypeOfKind(constraint, TypeFlags.Primitive | TypeFlags.Index);
91569156
}
91579157

9158-
function getSuppliedType(context: InferenceContext, index: number): Type | undefined {
9159-
if (context.suppliedTypes && index < context.suppliedTypes.length) {
9160-
return context.inferredTypes[index] = context.suppliedTypes[index];
9161-
}
9162-
return undefined;
9163-
}
9164-
91659158
function getInferredType(context: InferenceContext, index: number): Type {
9166-
let inferredType = context.inferredTypes[index] || getSuppliedType(context, index);
9159+
let inferredType = context.inferredTypes[index];
91679160
let inferenceSucceeded: boolean;
91689161
if (!inferredType) {
91699162
const inferences = getInferenceCandidates(context, index);
@@ -13417,7 +13410,6 @@ namespace ts {
1341713410
}
1341813411
}
1341913412

13420-
const numTypeArguments = typeArguments ? typeArguments.length : 0;
1342113413
const candidates = candidatesOutArray || [];
1342213414
// reorderCandidates fills up the candidates array directly
1342313415
reorderCandidates(signatures, candidates);
@@ -13593,16 +13585,13 @@ namespace ts {
1359313585
if (candidate.typeParameters) {
1359413586
let typeArgumentTypes: Type[] | undefined;
1359513587
if (typeArguments) {
13596-
// Check any supplied type arguments against the candidate.
13597-
typeArgumentTypes = map(typeArguments, getTypeFromTypeNode)
13588+
typeArgumentTypes = fillMissingTypeArguments(map(typeArguments, getTypeFromTypeNode), candidate.typeParameters, candidate.minTypeArgumentCount);
1359813589
typeArgumentsAreValid = checkTypeArguments(candidate, typeArguments, typeArgumentTypes, /*reportErrors*/ false);
1359913590
}
13600-
if ((!typeArguments || typeArgumentsAreValid) && numTypeArguments < candidate.typeParameters.length) {
13601-
// Infer any unsupplied type arguments for the candidate.
13602-
inferenceContext.suppliedTypes = typeArgumentTypes;
13591+
else {
1360313592
inferTypeArguments(node, candidate, args, excludeArgument, inferenceContext);
13604-
typeArgumentsAreValid = inferenceContext.failedTypeParameterIndex === undefined;
1360513593
typeArgumentTypes = inferenceContext.inferredTypes;
13594+
typeArgumentsAreValid = inferenceContext.failedTypeParameterIndex === undefined;
1360613595
}
1360713596
if (!typeArgumentsAreValid) {
1360813597
break;

src/compiler/types.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3095,7 +3095,6 @@ namespace ts {
30953095
inferUnionTypes: boolean; // Infer union types for disjoint candidates (otherwise undefinedType)
30963096
inferences: TypeInferences[]; // Inferences made for each type parameter
30973097
inferredTypes: Type[]; // Inferred type for each type parameter
3098-
suppliedTypes?: Type[]; // Supplied types for non-default type parameters
30993098
mapper?: TypeMapper; // Type mapper for this inference context
31003099
failedTypeParameterIndex?: number; // Index of type parameter for which inference failed
31013100
// It is optional because in contextual signature instantiation, nothing fails

tests/baselines/reference/genericDefaults.js

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ const f01c01 = f01(1);
1515
const f01c02 = f01(1, "a");
1616
const f01c03 = f01<number>();
1717
const f01c04 = f01<number>(1);
18-
const f01c05 = f01<number>(1, "a");
18+
const f01c05 = f01<number>(1, 2);
1919
const f01c06 = f01<number, string>();
2020
const f01c07 = f01<number, string>(1);
2121
const f01c08 = f01<number, string>(1, "a");
@@ -26,7 +26,7 @@ const f02c01 = f02(1);
2626
const f02c02 = f02(1, "a");
2727
const f02c03 = f02<number>();
2828
const f02c04 = f02<number>(1);
29-
const f02c05 = f02<number>(1, "a");
29+
const f02c05 = f02<number>(1, 2);
3030
const f02c06 = f02<number, string>();
3131
const f02c07 = f02<number, string>(1);
3232
const f02c08 = f02<number, string>(1, "a");
@@ -53,13 +53,13 @@ const f04c06 = f04<number, number>();
5353
const f04c07 = f04<number, number>(1);
5454
const f04c08 = f04<number, number>(1, 2);
5555

56-
declare function f05<T, U = T & { a: number }>(a?: T, b?: U): [T, U];
56+
declare function f05<T, U = T & { b: number }>(a?: T, b?: U): [T, U];
5757
const f05c00 = f05();
5858
const f05c01 = f05(1);
5959
const f05c02 = f05(1, 1);
6060
const f05c03 = f05<number>();
6161
const f05c04 = f05<number>(1);
62-
const f05c05 = f05<number>(1, 2);
62+
const f05c05 = f05<{ a: number }>({ a: 1 }, { a: 2, b: 3});
6363
const f05c06 = f05<number, number>();
6464
const f05c07 = f05<number, number>(1);
6565
const f05c08 = f05<number, number>(1, 2);
@@ -125,7 +125,7 @@ var f01c01 = f01(1);
125125
var f01c02 = f01(1, "a");
126126
var f01c03 = f01();
127127
var f01c04 = f01(1);
128-
var f01c05 = f01(1, "a");
128+
var f01c05 = f01(1, 2);
129129
var f01c06 = f01();
130130
var f01c07 = f01(1);
131131
var f01c08 = f01(1, "a");
@@ -134,7 +134,7 @@ var f02c01 = f02(1);
134134
var f02c02 = f02(1, "a");
135135
var f02c03 = f02();
136136
var f02c04 = f02(1);
137-
var f02c05 = f02(1, "a");
137+
var f02c05 = f02(1, 2);
138138
var f02c06 = f02();
139139
var f02c07 = f02(1);
140140
var f02c08 = f02(1, "a");
@@ -161,7 +161,7 @@ var f05c01 = f05(1);
161161
var f05c02 = f05(1, 1);
162162
var f05c03 = f05();
163163
var f05c04 = f05(1);
164-
var f05c05 = f05(1, 2);
164+
var f05c05 = f05({ a: 1 }, { a: 2, b: 3 });
165165
var f05c06 = f05();
166166
var f05c07 = f05(1);
167167
var f05c08 = f05(1, 2);
@@ -208,7 +208,7 @@ declare const f01c01: [number, number];
208208
declare const f01c02: [number, string];
209209
declare const f01c03: [number, number];
210210
declare const f01c04: [number, number];
211-
declare const f01c05: [number, string];
211+
declare const f01c05: [number, number];
212212
declare const f01c06: [number, string];
213213
declare const f01c07: [number, string];
214214
declare const f01c08: [number, string];
@@ -218,7 +218,7 @@ declare const f02c01: [1, 1];
218218
declare const f02c02: [1, string];
219219
declare const f02c03: [number, number];
220220
declare const f02c04: [number, number];
221-
declare const f02c05: [number, string];
221+
declare const f02c05: [number, number];
222222
declare const f02c06: [number, string];
223223
declare const f02c07: [number, string];
224224
declare const f02c08: [number, string];
@@ -248,27 +248,35 @@ declare const f04c03: [number, number | {
248248
declare const f04c04: [number, number | {
249249
a: number;
250250
}];
251-
declare const f04c05: [number, number];
251+
declare const f04c05: [number, number | {
252+
a: number;
253+
}];
252254
declare const f04c06: [number, number];
253255
declare const f04c07: [number, number];
254256
declare const f04c08: [number, number];
255257
declare function f05<T, U = T & {
256-
a: number;
258+
b: number;
257259
}>(a?: T, b?: U): [T, U];
258260
declare const f05c00: [{}, {} & {
259-
a: number;
261+
b: number;
260262
}];
261263
declare const f05c01: [number, number & {
262-
a: number;
264+
b: number;
263265
}];
264266
declare const f05c02: [number, number];
265267
declare const f05c03: [number, number & {
266-
a: number;
268+
b: number;
267269
}];
268270
declare const f05c04: [number, number & {
271+
b: number;
272+
}];
273+
declare const f05c05: [{
274+
a: number;
275+
}, {
269276
a: number;
277+
} & {
278+
b: number;
270279
}];
271-
declare const f05c05: [number, number];
272280
declare const f05c06: [number, number];
273281
declare const f05c07: [number, number];
274282
declare const f05c08: [number, number];

tests/baselines/reference/genericDefaults.symbols

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ const f01c04 = f01<number>(1);
6565
>f01c04 : Symbol(f01c04, Decl(genericDefaults.ts, 15, 5))
6666
>f01 : Symbol(f01, Decl(genericDefaults.ts, 8, 32))
6767

68-
const f01c05 = f01<number>(1, "a");
68+
const f01c05 = f01<number>(1, 2);
6969
>f01c05 : Symbol(f01c05, Decl(genericDefaults.ts, 16, 5))
7070
>f01 : Symbol(f01, Decl(genericDefaults.ts, 8, 32))
7171

@@ -113,7 +113,7 @@ const f02c04 = f02<number>(1);
113113
>f02c04 : Symbol(f02c04, Decl(genericDefaults.ts, 26, 5))
114114
>f02 : Symbol(f02, Decl(genericDefaults.ts, 19, 43))
115115

116-
const f02c05 = f02<number>(1, "a");
116+
const f02c05 = f02<number>(1, 2);
117117
>f02c05 : Symbol(f02c05, Decl(genericDefaults.ts, 27, 5))
118118
>f02 : Symbol(f02, Decl(genericDefaults.ts, 19, 43))
119119

@@ -227,12 +227,12 @@ const f04c08 = f04<number, number>(1, 2);
227227
>f04c08 : Symbol(f04c08, Decl(genericDefaults.ts, 52, 5))
228228
>f04 : Symbol(f04, Decl(genericDefaults.ts, 41, 41))
229229

230-
declare function f05<T, U = T & { a: number }>(a?: T, b?: U): [T, U];
230+
declare function f05<T, U = T & { b: number }>(a?: T, b?: U): [T, U];
231231
>f05 : Symbol(f05, Decl(genericDefaults.ts, 52, 41))
232232
>T : Symbol(T, Decl(genericDefaults.ts, 54, 21))
233233
>U : Symbol(U, Decl(genericDefaults.ts, 54, 23))
234234
>T : Symbol(T, Decl(genericDefaults.ts, 54, 21))
235-
>a : Symbol(a, Decl(genericDefaults.ts, 54, 33))
235+
>b : Symbol(b, Decl(genericDefaults.ts, 54, 33))
236236
>a : Symbol(a, Decl(genericDefaults.ts, 54, 47))
237237
>T : Symbol(T, Decl(genericDefaults.ts, 54, 21))
238238
>b : Symbol(b, Decl(genericDefaults.ts, 54, 53))
@@ -260,9 +260,13 @@ const f05c04 = f05<number>(1);
260260
>f05c04 : Symbol(f05c04, Decl(genericDefaults.ts, 59, 5))
261261
>f05 : Symbol(f05, Decl(genericDefaults.ts, 52, 41))
262262

263-
const f05c05 = f05<number>(1, 2);
263+
const f05c05 = f05<{ a: number }>({ a: 1 }, { a: 2, b: 3});
264264
>f05c05 : Symbol(f05c05, Decl(genericDefaults.ts, 60, 5))
265265
>f05 : Symbol(f05, Decl(genericDefaults.ts, 52, 41))
266+
>a : Symbol(a, Decl(genericDefaults.ts, 60, 20))
267+
>a : Symbol(a, Decl(genericDefaults.ts, 60, 35))
268+
>a : Symbol(a, Decl(genericDefaults.ts, 60, 45))
269+
>b : Symbol(b, Decl(genericDefaults.ts, 60, 51))
266270

267271
const f05c06 = f05<number, number>();
268272
>f05c06 : Symbol(f05c06, Decl(genericDefaults.ts, 61, 5))

tests/baselines/reference/genericDefaults.types

Lines changed: 40 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,12 @@ const f01c04 = f01<number>(1);
8484
>f01 : <T, U = T>(a?: T, b?: U) => [T, U]
8585
>1 : 1
8686

87-
const f01c05 = f01<number>(1, "a");
88-
>f01c05 : [number, string]
89-
>f01<number>(1, "a") : [number, string]
87+
const f01c05 = f01<number>(1, 2);
88+
>f01c05 : [number, number]
89+
>f01<number>(1, 2) : [number, number]
9090
>f01 : <T, U = T>(a?: T, b?: U) => [T, U]
9191
>1 : 1
92-
>"a" : "a"
92+
>2 : 2
9393

9494
const f01c06 = f01<number, string>();
9595
>f01c06 : [number, string]
@@ -150,12 +150,12 @@ const f02c04 = f02<number>(1);
150150
>f02 : <T extends number, U = T>(a?: T, b?: U) => [T, U]
151151
>1 : 1
152152

153-
const f02c05 = f02<number>(1, "a");
154-
>f02c05 : [number, string]
155-
>f02<number>(1, "a") : [number, string]
153+
const f02c05 = f02<number>(1, 2);
154+
>f02c05 : [number, number]
155+
>f02<number>(1, 2) : [number, number]
156156
>f02 : <T extends number, U = T>(a?: T, b?: U) => [T, U]
157157
>1 : 1
158-
>"a" : "a"
158+
>2 : 2
159159

160160
const f02c06 = f02<number, string>();
161161
>f02c06 : [number, string]
@@ -285,8 +285,8 @@ const f04c04 = f04<number>(1);
285285
>1 : 1
286286

287287
const f04c05 = f04<number>(1, 2);
288-
>f04c05 : [number, number]
289-
>f04<number>(1, 2) : [number, number]
288+
>f04c05 : [number, number | { a: number; }]
289+
>f04<number>(1, 2) : [number, number | { a: number; }]
290290
>f04 : <T, U = T | { a: number; }>(a?: T, b?: U) => [T, U]
291291
>1 : 1
292292
>2 : 2
@@ -309,12 +309,12 @@ const f04c08 = f04<number, number>(1, 2);
309309
>1 : 1
310310
>2 : 2
311311

312-
declare function f05<T, U = T & { a: number }>(a?: T, b?: U): [T, U];
313-
>f05 : <T, U = T & { a: number; }>(a?: T, b?: U) => [T, U]
312+
declare function f05<T, U = T & { b: number }>(a?: T, b?: U): [T, U];
313+
>f05 : <T, U = T & { b: number; }>(a?: T, b?: U) => [T, U]
314314
>T : T
315315
>U : U
316316
>T : T
317-
>a : number
317+
>b : number
318318
>a : T
319319
>T : T
320320
>b : U
@@ -323,56 +323,63 @@ declare function f05<T, U = T & { a: number }>(a?: T, b?: U): [T, U];
323323
>U : U
324324

325325
const f05c00 = f05();
326-
>f05c00 : [{}, {} & { a: number; }]
327-
>f05() : [{}, {} & { a: number; }]
328-
>f05 : <T, U = T & { a: number; }>(a?: T, b?: U) => [T, U]
326+
>f05c00 : [{}, {} & { b: number; }]
327+
>f05() : [{}, {} & { b: number; }]
328+
>f05 : <T, U = T & { b: number; }>(a?: T, b?: U) => [T, U]
329329

330330
const f05c01 = f05(1);
331-
>f05c01 : [number, number & { a: number; }]
332-
>f05(1) : [number, number & { a: number; }]
333-
>f05 : <T, U = T & { a: number; }>(a?: T, b?: U) => [T, U]
331+
>f05c01 : [number, number & { b: number; }]
332+
>f05(1) : [number, number & { b: number; }]
333+
>f05 : <T, U = T & { b: number; }>(a?: T, b?: U) => [T, U]
334334
>1 : 1
335335

336336
const f05c02 = f05(1, 1);
337337
>f05c02 : [number, number]
338338
>f05(1, 1) : [number, number]
339-
>f05 : <T, U = T & { a: number; }>(a?: T, b?: U) => [T, U]
339+
>f05 : <T, U = T & { b: number; }>(a?: T, b?: U) => [T, U]
340340
>1 : 1
341341
>1 : 1
342342

343343
const f05c03 = f05<number>();
344-
>f05c03 : [number, number & { a: number; }]
345-
>f05<number>() : [number, number & { a: number; }]
346-
>f05 : <T, U = T & { a: number; }>(a?: T, b?: U) => [T, U]
344+
>f05c03 : [number, number & { b: number; }]
345+
>f05<number>() : [number, number & { b: number; }]
346+
>f05 : <T, U = T & { b: number; }>(a?: T, b?: U) => [T, U]
347347

348348
const f05c04 = f05<number>(1);
349-
>f05c04 : [number, number & { a: number; }]
350-
>f05<number>(1) : [number, number & { a: number; }]
351-
>f05 : <T, U = T & { a: number; }>(a?: T, b?: U) => [T, U]
349+
>f05c04 : [number, number & { b: number; }]
350+
>f05<number>(1) : [number, number & { b: number; }]
351+
>f05 : <T, U = T & { b: number; }>(a?: T, b?: U) => [T, U]
352352
>1 : 1
353353

354-
const f05c05 = f05<number>(1, 2);
355-
>f05c05 : [number, number]
356-
>f05<number>(1, 2) : [number, number]
357-
>f05 : <T, U = T & { a: number; }>(a?: T, b?: U) => [T, U]
354+
const f05c05 = f05<{ a: number }>({ a: 1 }, { a: 2, b: 3});
355+
>f05c05 : [{ a: number; }, { a: number; } & { b: number; }]
356+
>f05<{ a: number }>({ a: 1 }, { a: 2, b: 3}) : [{ a: number; }, { a: number; } & { b: number; }]
357+
>f05 : <T, U = T & { b: number; }>(a?: T, b?: U) => [T, U]
358+
>a : number
359+
>{ a: 1 } : { a: number; }
360+
>a : number
358361
>1 : 1
362+
>{ a: 2, b: 3} : { a: number; b: number; }
363+
>a : number
359364
>2 : 2
365+
>b : number
366+
>3 : 3
360367

361368
const f05c06 = f05<number, number>();
362369
>f05c06 : [number, number]
363370
>f05<number, number>() : [number, number]
364-
>f05 : <T, U = T & { a: number; }>(a?: T, b?: U) => [T, U]
371+
>f05 : <T, U = T & { b: number; }>(a?: T, b?: U) => [T, U]
365372

366373
const f05c07 = f05<number, number>(1);
367374
>f05c07 : [number, number]
368375
>f05<number, number>(1) : [number, number]
369-
>f05 : <T, U = T & { a: number; }>(a?: T, b?: U) => [T, U]
376+
>f05 : <T, U = T & { b: number; }>(a?: T, b?: U) => [T, U]
370377
>1 : 1
371378

372379
const f05c08 = f05<number, number>(1, 2);
373380
>f05c08 : [number, number]
374381
>f05<number, number>(1, 2) : [number, number]
375-
>f05 : <T, U = T & { a: number; }>(a?: T, b?: U) => [T, U]
382+
>f05 : <T, U = T & { b: number; }>(a?: T, b?: U) => [T, U]
376383
>1 : 1
377384
>2 : 2
378385

0 commit comments

Comments
 (0)