Skip to content

Commit b7f2990

Browse files
committed
Refactor checkSpreadElementExpression to get the element type internally
1 parent 3497e27 commit b7f2990

File tree

3 files changed

+55
-60
lines changed

3 files changed

+55
-60
lines changed

src/compiler/checker.ts

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5911,31 +5911,31 @@ module ts {
59115911
}
59125912

59135913
function checkSpreadElementExpression(node: SpreadElementExpression, contextualMapper?: TypeMapper): Type {
5914-
let type = checkExpressionCached(node.expression, contextualMapper);
5915-
if (!isArrayLikeType(type)) {
5916-
error(node.expression, Diagnostics.Type_0_is_not_an_array_type, typeToString(type));
5917-
return unknownType;
5914+
let arrayOrIterableType = checkExpressionCached(node.expression, contextualMapper);
5915+
if (languageVersion >= ScriptTarget.ES6) {
5916+
// Check for iterable, not yet implemented
59185917
}
5919-
return type;
5918+
5919+
if (isArrayLikeType(arrayOrIterableType)) {
5920+
return getIndexTypeOfType(arrayOrIterableType, IndexKind.Number);
5921+
}
5922+
5923+
error(node.expression, Diagnostics.Type_0_is_not_an_array_type, typeToString(arrayOrIterableType));
5924+
return unknownType;
59205925
}
59215926

59225927
function checkArrayLiteral(node: ArrayLiteralExpression, contextualMapper?: TypeMapper): Type {
59235928
let elements = node.elements;
59245929
if (!elements.length) {
59255930
return createArrayType(undefinedType);
59265931
}
5927-
let hasSpreadElement: boolean = false;
5932+
let hasSpreadElement = false;
59285933
let elementTypes: Type[] = [];
5929-
forEach(elements, e => {
5934+
for (let e of elements) {
59305935
let type = checkExpression(e, contextualMapper);
5931-
if (e.kind === SyntaxKind.SpreadElementExpression) {
5932-
elementTypes.push(getIndexTypeOfType(type, IndexKind.Number) || anyType);
5933-
hasSpreadElement = true;
5934-
}
5935-
else {
5936-
elementTypes.push(type);
5937-
}
5938-
});
5936+
elementTypes.push(type);
5937+
hasSpreadElement = hasSpreadElement || e.kind === SyntaxKind.SpreadElementExpression;
5938+
}
59395939
if (!hasSpreadElement) {
59405940
let contextualType = getContextualType(node);
59415941
if (contextualType && contextualTypeIsTupleLikeType(contextualType) || isAssignmentTarget(node)) {
@@ -6558,7 +6558,7 @@ module ts {
65586558
for (let i = 0; i < args.length; i++) {
65596559
let arg = args[i];
65606560
if (arg.kind !== SyntaxKind.OmittedExpression) {
6561-
let paramType = getTypeAtPosition(signature, arg.kind === SyntaxKind.SpreadElementExpression ? -1 : i);
6561+
let paramType = getTypeAtPosition(signature, i);
65626562
let argType: Type;
65636563
if (i === 0 && args[i].parent.kind === SyntaxKind.TaggedTemplateExpression) {
65646564
argType = globalTemplateStringsArrayType;
@@ -6581,7 +6581,7 @@ module ts {
65816581
// No need to check for omitted args and template expressions, their exlusion value is always undefined
65826582
if (excludeArgument[i] === false) {
65836583
let arg = args[i];
6584-
let paramType = getTypeAtPosition(signature, arg.kind === SyntaxKind.SpreadElementExpression ? -1 : i);
6584+
let paramType = getTypeAtPosition(signature, i);
65856585
inferTypes(context, checkExpressionWithContextualType(arg, paramType, inferenceMapper), paramType);
65866586
}
65876587
}
@@ -6614,7 +6614,7 @@ module ts {
66146614
let arg = args[i];
66156615
if (arg.kind !== SyntaxKind.OmittedExpression) {
66166616
// Check spread elements against rest type (from arity check we know spread argument corresponds to a rest parameter)
6617-
let paramType = getTypeAtPosition(signature, arg.kind === SyntaxKind.SpreadElementExpression ? -1 : i);
6617+
let paramType = getTypeAtPosition(signature, i);
66186618
// A tagged template expression provides a special first argument, and string literals get string literal types
66196619
// unless we're reporting errors
66206620
let argType = i === 0 && node.kind === SyntaxKind.TaggedTemplateExpression ? globalTemplateStringsArrayType :
@@ -7088,14 +7088,9 @@ module ts {
70887088
}
70897089

70907090
function getTypeAtPosition(signature: Signature, pos: number): Type {
7091-
if (pos >= 0) {
7092-
return signature.hasRestParameter ?
7093-
pos < signature.parameters.length - 1 ? getTypeOfSymbol(signature.parameters[pos]) : getRestTypeOfSignature(signature) :
7094-
pos < signature.parameters.length ? getTypeOfSymbol(signature.parameters[pos]) : anyType;
7095-
}
70967091
return signature.hasRestParameter ?
7097-
getTypeOfSymbol(signature.parameters[signature.parameters.length - 1]) :
7098-
anyArrayType;
7092+
pos < signature.parameters.length - 1 ? getTypeOfSymbol(signature.parameters[pos]) : getRestTypeOfSignature(signature) :
7093+
pos < signature.parameters.length ? getTypeOfSymbol(signature.parameters[pos]) : anyType;
70997094
}
71007095

71017096
function assignContextualParameterTypes(signature: Signature, context: Signature, mapper: TypeMapper) {

tests/baselines/reference/arrayLiteralSpread.types

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,55 +9,55 @@ function f0() {
99
var a1 = [...a];
1010
>a1 : number[]
1111
>[...a] : number[]
12-
>...a : number[]
12+
>...a : number
1313
>a : number[]
1414

1515
var a2 = [1, ...a];
1616
>a2 : number[]
1717
>[1, ...a] : number[]
18-
>...a : number[]
18+
>...a : number
1919
>a : number[]
2020

2121
var a3 = [1, 2, ...a];
2222
>a3 : number[]
2323
>[1, 2, ...a] : number[]
24-
>...a : number[]
24+
>...a : number
2525
>a : number[]
2626

2727
var a4 = [...a, 1];
2828
>a4 : number[]
2929
>[...a, 1] : number[]
30-
>...a : number[]
30+
>...a : number
3131
>a : number[]
3232

3333
var a5 = [...a, 1, 2];
3434
>a5 : number[]
3535
>[...a, 1, 2] : number[]
36-
>...a : number[]
36+
>...a : number
3737
>a : number[]
3838

3939
var a6 = [1, 2, ...a, 1, 2];
4040
>a6 : number[]
4141
>[1, 2, ...a, 1, 2] : number[]
42-
>...a : number[]
42+
>...a : number
4343
>a : number[]
4444

4545
var a7 = [1, ...a, 2, ...a];
4646
>a7 : number[]
4747
>[1, ...a, 2, ...a] : number[]
48-
>...a : number[]
48+
>...a : number
4949
>a : number[]
50-
>...a : number[]
50+
>...a : number
5151
>a : number[]
5252

5353
var a8 = [...a, ...a, ...a];
5454
>a8 : number[]
5555
>[...a, ...a, ...a] : number[]
56-
>...a : number[]
56+
>...a : number
5757
>a : number[]
58-
>...a : number[]
58+
>...a : number
5959
>a : number[]
60-
>...a : number[]
60+
>...a : number
6161
>a : number[]
6262
}
6363

@@ -71,7 +71,7 @@ function f1() {
7171
var b = ["hello", ...a, true];
7272
>b : (string | number | boolean)[]
7373
>["hello", ...a, true] : (string | number | boolean)[]
74-
>...a : number[]
74+
>...a : number
7575
>a : number[]
7676

7777
var b: (string | number | boolean)[];
@@ -84,29 +84,29 @@ function f2() {
8484
var a = [...[...[...[...[...[]]]]]];
8585
>a : any[]
8686
>[...[...[...[...[...[]]]]]] : undefined[]
87-
>...[...[...[...[...[]]]]] : undefined[]
87+
>...[...[...[...[...[]]]]] : undefined
8888
>[...[...[...[...[]]]]] : undefined[]
89-
>...[...[...[...[]]]] : undefined[]
89+
>...[...[...[...[]]]] : undefined
9090
>[...[...[...[]]]] : undefined[]
91-
>...[...[...[]]] : undefined[]
91+
>...[...[...[]]] : undefined
9292
>[...[...[]]] : undefined[]
93-
>...[...[]] : undefined[]
93+
>...[...[]] : undefined
9494
>[...[]] : undefined[]
95-
>...[] : undefined[]
95+
>...[] : undefined
9696
>[] : undefined[]
9797

9898
var b = [...[...[...[...[...[5]]]]]];
9999
>b : number[]
100100
>[...[...[...[...[...[5]]]]]] : number[]
101-
>...[...[...[...[...[5]]]]] : number[]
101+
>...[...[...[...[...[5]]]]] : number
102102
>[...[...[...[...[5]]]]] : number[]
103-
>...[...[...[...[5]]]] : number[]
103+
>...[...[...[...[5]]]] : number
104104
>[...[...[...[5]]]] : number[]
105-
>...[...[...[5]]] : number[]
105+
>...[...[...[5]]] : number
106106
>[...[...[5]]] : number[]
107-
>...[...[5]] : number[]
107+
>...[...[5]] : number
108108
>[...[5]] : number[]
109-
>...[5] : number[]
109+
>...[5] : number
110110
>[5] : number[]
111111
}
112112

tests/baselines/reference/callWithSpreadES6.types

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,13 @@ foo(1, 2, "abc");
3838
foo(1, 2, ...a);
3939
>foo(1, 2, ...a) : void
4040
>foo : (x: number, y: number, ...z: string[]) => void
41-
>...a : string[]
41+
>...a : string
4242
>a : string[]
4343

4444
foo(1, 2, ...a, "abc");
4545
>foo(1, 2, ...a, "abc") : void
4646
>foo : (x: number, y: number, ...z: string[]) => void
47-
>...a : string[]
47+
>...a : string
4848
>a : string[]
4949

5050
obj.foo(1, 2, "abc");
@@ -58,15 +58,15 @@ obj.foo(1, 2, ...a);
5858
>obj.foo : (x: number, y: number, ...z: string[]) => any
5959
>obj : X
6060
>foo : (x: number, y: number, ...z: string[]) => any
61-
>...a : string[]
61+
>...a : string
6262
>a : string[]
6363

6464
obj.foo(1, 2, ...a, "abc");
6565
>obj.foo(1, 2, ...a, "abc") : any
6666
>obj.foo : (x: number, y: number, ...z: string[]) => any
6767
>obj : X
6868
>foo : (x: number, y: number, ...z: string[]) => any
69-
>...a : string[]
69+
>...a : string
7070
>a : string[]
7171

7272
(obj.foo)(1, 2, "abc");
@@ -82,7 +82,7 @@ obj.foo(1, 2, ...a, "abc");
8282
>obj.foo : (x: number, y: number, ...z: string[]) => any
8383
>obj : X
8484
>foo : (x: number, y: number, ...z: string[]) => any
85-
>...a : string[]
85+
>...a : string
8686
>a : string[]
8787

8888
(obj.foo)(1, 2, ...a, "abc");
@@ -91,7 +91,7 @@ obj.foo(1, 2, ...a, "abc");
9191
>obj.foo : (x: number, y: number, ...z: string[]) => any
9292
>obj : X
9393
>foo : (x: number, y: number, ...z: string[]) => any
94-
>...a : string[]
94+
>...a : string
9595
>a : string[]
9696

9797
xa[1].foo(1, 2, "abc");
@@ -107,7 +107,7 @@ xa[1].foo(1, 2, ...a);
107107
>xa[1] : X
108108
>xa : X[]
109109
>foo : (x: number, y: number, ...z: string[]) => any
110-
>...a : string[]
110+
>...a : string
111111
>a : string[]
112112

113113
xa[1].foo(1, 2, ...a, "abc");
@@ -116,7 +116,7 @@ xa[1].foo(1, 2, ...a, "abc");
116116
>xa[1] : X
117117
>xa : X[]
118118
>foo : (x: number, y: number, ...z: string[]) => any
119-
>...a : string[]
119+
>...a : string
120120
>a : string[]
121121

122122
(<Function>xa[1].foo)(...[1, 2, "abc"]);
@@ -128,7 +128,7 @@ xa[1].foo(1, 2, ...a, "abc");
128128
>xa[1] : X
129129
>xa : X[]
130130
>foo : (x: number, y: number, ...z: string[]) => any
131-
>...[1, 2, "abc"] : (string | number)[]
131+
>...[1, 2, "abc"] : string | number
132132
>[1, 2, "abc"] : (string | number)[]
133133

134134
class C {
@@ -154,7 +154,7 @@ class C {
154154
>foo : (x: number, y: number, ...z: string[]) => void
155155
>x : number
156156
>y : number
157-
>...z : string[]
157+
>...z : string
158158
>z : string[]
159159
}
160160
foo(x: number, y: number, ...z: string[]) {
@@ -177,7 +177,7 @@ class D extends C {
177177
super(1, 2, ...a);
178178
>super(1, 2, ...a) : void
179179
>super : typeof C
180-
>...a : string[]
180+
>...a : string
181181
>a : string[]
182182
}
183183
foo() {
@@ -194,7 +194,7 @@ class D extends C {
194194
>super.foo : (x: number, y: number, ...z: string[]) => void
195195
>super : C
196196
>foo : (x: number, y: number, ...z: string[]) => void
197-
>...a : string[]
197+
>...a : string
198198
>a : string[]
199199
}
200200
}
@@ -204,6 +204,6 @@ var c = new C(1, 2, ...a);
204204
>c : C
205205
>new C(1, 2, ...a) : C
206206
>C : typeof C
207-
>...a : string[]
207+
>...a : string
208208
>a : string[]
209209

0 commit comments

Comments
 (0)