1
1
/// <reference path="moduleNameResolver.ts"/>
2
2
/// <reference path="binder.ts"/>
3
- // // / <reference types="node" />
3
+ /// <reference types="node" />
4
4
5
- // declare var console: Console;
5
+ declare var console: Console;
6
6
7
7
/* @internal */
8
8
namespace ts {
@@ -240,6 +240,7 @@ namespace ts {
240
240
const intersectionTypes = createMap<IntersectionType>();
241
241
const literalTypes = createMap<LiteralType>();
242
242
const indexedAccessTypes = createMap<IndexedAccessType>();
243
+ const spreadTypes = createMap<TypeSpreadType>();
243
244
const evolvingArrayTypes: EvolvingArrayType[] = [];
244
245
245
246
const unknownSymbol = createSymbol(SymbolFlags.Property, "unknown" as __String);
@@ -2528,6 +2529,10 @@ namespace ts {
2528
2529
const indexTypeNode = typeToTypeNodeHelper((<IndexedAccessType>type).indexType, context);
2529
2530
return createIndexedAccessTypeNode(objectTypeNode, indexTypeNode);
2530
2531
}
2532
+ if (type.flags & TypeFlags.TypeSpread) {
2533
+ const typeNode = typeToTypeNodeHelper((<TypeSpreadType>type).type, context);
2534
+ return createTypeSpread(typeNode);
2535
+ }
2531
2536
2532
2537
Debug.fail("Should be unreachable.");
2533
2538
@@ -3291,6 +3296,10 @@ namespace ts {
3291
3296
writeType((<IndexedAccessType>type).indexType, TypeFormatFlags.None);
3292
3297
writePunctuation(writer, SyntaxKind.CloseBracketToken);
3293
3298
}
3299
+ else if (type.flags & TypeFlags.TypeSpread) {
3300
+ writePunctuation(writer, SyntaxKind.DotDotDotToken);
3301
+ writeType((<TypeSpreadType>type).type, TypeFormatFlags.None);
3302
+ }
3294
3303
else {
3295
3304
// Should never get here
3296
3305
// { ... }
@@ -5383,7 +5392,7 @@ namespace ts {
5383
5392
}
5384
5393
5385
5394
function resolveObjectTypeMembers(type: ObjectType, source: InterfaceTypeWithDeclaredMembers, typeParameters: TypeParameter[], typeArguments: Type[]) {
5386
- // if (allowSyntheticDefaultImports) console.log("resolveObjectTypeMembers", typeToString(type));
5395
+ if (allowSyntheticDefaultImports) console.log("resolveObjectTypeMembers", typeToString(type));
5387
5396
let mapper: TypeMapper;
5388
5397
let members: SymbolTable;
5389
5398
let callSignatures: Signature[];
@@ -7211,6 +7220,39 @@ namespace ts {
7211
7220
return links.resolvedType;
7212
7221
}
7213
7222
7223
+ function getTypeSpreadTypes(tuple: Type): Type[] {
7224
+ if (isGenericTupleType(tuple)) {
7225
+ // Defer the operation by creating a spread type.
7226
+ const id = "" + tuple.id;
7227
+ let type = spreadTypes.get(id);
7228
+ if (!type) {
7229
+ spreadTypes.set(id, type = createTypeSpreadType(tuple));
7230
+ }
7231
+ return [type];
7232
+ } else {
7233
+ // const type = getApparentType(nodeType);
7234
+ if (allowSyntheticDefaultImports) {
7235
+ console.log("type", typeToString(tuple));
7236
+ console.log("isTupleLikeType(type)", isTupleLikeType(tuple));
7237
+ }
7238
+ if (isTupleLikeType(tuple)) {
7239
+ // return map(getPropertiesOfType(tuple), getTypeOfSymbol);
7240
+ return getTupleTypeElementTypes(tuple);
7241
+ }
7242
+ else {
7243
+ // error(typeNode, Diagnostics.Tuple_type_spreads_may_only_be_created_from_tuple_types);
7244
+ console.log("not a tuple, don't resolve?");
7245
+ return [];
7246
+ }
7247
+ }
7248
+ }
7249
+
7250
+ function isGenericTupleType(type: Type): boolean {
7251
+ return type.flags & TypeFlags.TypeVariable ? true :
7252
+ type.flags & TypeFlags.UnionOrIntersection ? forEach((<UnionOrIntersectionType>type).types, isGenericTupleType) :
7253
+ false;
7254
+ }
7255
+
7214
7256
function getTupleTypeElementTypes(type: Type): Type[] {
7215
7257
Debug.assert(isTupleLikeType(type));
7216
7258
const types = [];
@@ -7224,24 +7266,11 @@ namespace ts {
7224
7266
7225
7267
function getTypeFromTupleElement(node: TypeNode | TypeSpreadTypeNode): Type | Type[] {
7226
7268
if (node.kind === SyntaxKind.TypeSpread) {
7227
- const typeNode: TypeNode = (node as TypeSpreadTypeNode).type;
7228
- const type = getApparentType(getTypeFromTypeNode(typeNode as TypeNode));
7229
- // const nodeType = getTypeFromTypeNode(typeNode as TypeNode);
7230
- // const type = getApparentType(nodeType);
7231
- if (allowSyntheticDefaultImports) {
7232
- // console.log("nodeType", typeToString(nodeType));
7233
- // console.log("type", typeToString(type));
7234
- // console.log("isTupleLikeType(nodeType)", isTupleLikeType(nodeType));
7235
- // console.log("isTupleLikeType(type)", isTupleLikeType(type));
7236
- }
7237
- if (isTupleLikeType(type)) {
7238
- // return map(getPropertiesOfType(type), getTypeOfSymbol);
7239
- return getTupleTypeElementTypes(type);
7240
- }
7241
- else {
7242
- error(typeNode, Diagnostics.Tuple_type_spreads_may_only_be_created_from_tuple_types);
7243
- return [];
7269
+ const links = getNodeLinks(node);
7270
+ if (!links.resolvedType) {
7271
+ links.resolvedType = getTypeFromTypeNode((node as TypeSpreadTypeNode).type)
7244
7272
}
7273
+ return getTypeSpreadTypes(links.resolvedType);
7245
7274
}
7246
7275
else {
7247
7276
return getTypeFromTypeNode(node as TypeNode);
@@ -7585,6 +7614,12 @@ namespace ts {
7585
7614
return type;
7586
7615
}
7587
7616
7617
+ function createTypeSpreadType(tuple: Type) {
7618
+ const type = <TypeSpreadType>createType(TypeFlags.TypeSpread);
7619
+ type.type = tuple;
7620
+ return type;
7621
+ }
7622
+
7588
7623
function getPropertyTypeForIndexType(objectType: Type, indexType: Type, accessNode: ElementAccessExpression | IndexedAccessTypeNode, cacheSymbol: boolean) {
7589
7624
const accessExpression = accessNode && accessNode.kind === SyntaxKind.ElementAccessExpression ? <ElementAccessExpression>accessNode : undefined;
7590
7625
const propName = indexType.flags & TypeFlags.StringOrNumberLiteral ?
@@ -8400,6 +8435,9 @@ namespace ts {
8400
8435
if (type.flags & TypeFlags.IndexedAccess) {
8401
8436
return getIndexedAccessType(instantiateType((<IndexedAccessType>type).objectType, mapper), instantiateType((<IndexedAccessType>type).indexType, mapper));
8402
8437
}
8438
+ // if (type.flags & TypeFlags.TypeSpread) {
8439
+ // return getTypeSpreadTypes(instantiateType((<TypeSpreadType>type).type, mapper));
8440
+ // }
8403
8441
return type;
8404
8442
}
8405
8443
@@ -18799,6 +18837,13 @@ namespace ts {
18799
18837
forEach(node.elementTypes, checkSourceElement);
18800
18838
}
18801
18839
18840
+ function checkTypeSpread(node: TypeSpreadTypeNode) {
18841
+ const type = getApparentType(getTypeFromTypeNode(node.type as TypeNode));
18842
+ if (!isArrayLikeType(type)) { // isTupleLikeType
18843
+ grammarErrorOnNode(node, Diagnostics.Tuple_type_spreads_may_only_be_created_from_tuple_types);
18844
+ }
18845
+ }
18846
+
18802
18847
function checkUnionOrIntersectionType(node: UnionOrIntersectionTypeNode) {
18803
18848
forEach(node.types, checkSourceElement);
18804
18849
}
@@ -22334,6 +22379,8 @@ namespace ts {
22334
22379
return checkArrayType(<ArrayTypeNode>node);
22335
22380
case SyntaxKind.TupleType:
22336
22381
return checkTupleType(<TupleTypeNode>node);
22382
+ case SyntaxKind.TypeSpread:
22383
+ return checkTypeSpread(<TypeSpreadTypeNode>node);
22337
22384
case SyntaxKind.UnionType:
22338
22385
case SyntaxKind.IntersectionType:
22339
22386
return checkUnionOrIntersectionType(<UnionOrIntersectionTypeNode>node);
0 commit comments