1
1
/// <reference path="moduleNameResolver.ts"/>
2
2
/// <reference path="binder.ts"/>
3
- /// <reference types="node" />
4
-
5
- declare var console: Console;
6
3
7
4
/* @internal */
8
5
namespace ts {
@@ -240,7 +237,6 @@ namespace ts {
240
237
const intersectionTypes = createMap<IntersectionType>();
241
238
const literalTypes = createMap<LiteralType>();
242
239
const indexedAccessTypes = createMap<IndexedAccessType>();
243
- const spreadTypes = createMap<TypeSpreadType>();
244
240
const evolvingArrayTypes: EvolvingArrayType[] = [];
245
241
246
242
const unknownSymbol = createSymbol(SymbolFlags.Property, "unknown" as __String);
@@ -2529,9 +2525,9 @@ namespace ts {
2529
2525
const indexTypeNode = typeToTypeNodeHelper((<IndexedAccessType>type).indexType, context);
2530
2526
return createIndexedAccessTypeNode(objectTypeNode, indexTypeNode);
2531
2527
}
2532
- if (type.flags & TypeFlags.TypeSpread ) {
2533
- const typeNode = typeToTypeNodeHelper ((<TypeSpreadType >type).type, context);
2534
- return createTypeSpread(typeNode );
2528
+ if (type.flags & TypeFlags.SpreadTuple ) {
2529
+ const typeNodes = map ((<SpreadTupleType >type).elements, (tp: Type) => typeToTypeNodeHelper(tp, context) );
2530
+ return createTupleTypeNode(typeNodes, (<SpreadTupleType>type).idxIsSpread );
2535
2531
}
2536
2532
2537
2533
Debug.fail("Should be unreachable.");
@@ -3296,9 +3292,11 @@ namespace ts {
3296
3292
writeType((<IndexedAccessType>type).indexType, TypeFormatFlags.None);
3297
3293
writePunctuation(writer, SyntaxKind.CloseBracketToken);
3298
3294
}
3299
- else if (type.flags & TypeFlags.TypeSpread) {
3295
+ else if (type.flags & TypeFlags.SpreadTuple) {
3296
+ writePunctuation(writer, SyntaxKind.OpenBracketToken);
3300
3297
writePunctuation(writer, SyntaxKind.DotDotDotToken);
3301
- writeType((<TypeSpreadType>type).type, TypeFormatFlags.None);
3298
+ writeTypeList((<SpreadTupleType>type).elements, SyntaxKind.CommaToken, (<SpreadTupleType>type).idxIsSpread);
3299
+ writePunctuation(writer, SyntaxKind.CloseBracketToken);
3302
3300
}
3303
3301
else {
3304
3302
// Should never get here
@@ -3312,7 +3310,7 @@ namespace ts {
3312
3310
}
3313
3311
3314
3312
3315
- function writeTypeList(types: Type[], delimiter: SyntaxKind) {
3313
+ function writeTypeList(types: Type[], delimiter: SyntaxKind, idxIsSpread: boolean[] = [] ) {
3316
3314
for (let i = 0; i < types.length; i++) {
3317
3315
if (i > 0) {
3318
3316
if (delimiter !== SyntaxKind.CommaToken) {
@@ -3321,6 +3319,9 @@ namespace ts {
3321
3319
writePunctuation(writer, delimiter);
3322
3320
writeSpace(writer);
3323
3321
}
3322
+ if (idxIsSpread[i]) {
3323
+ writePunctuation(writer, SyntaxKind.DotDotDotToken);
3324
+ }
3324
3325
writeType(types[i], delimiter === SyntaxKind.CommaToken ? TypeFormatFlags.None : TypeFormatFlags.InElementType);
3325
3326
}
3326
3327
}
@@ -5392,7 +5393,6 @@ namespace ts {
5392
5393
}
5393
5394
5394
5395
function resolveObjectTypeMembers(type: ObjectType, source: InterfaceTypeWithDeclaredMembers, typeParameters: TypeParameter[], typeArguments: Type[]) {
5395
- if (allowSyntheticDefaultImports) console.log("resolveObjectTypeMembers", typeToString(type));
5396
5396
let mapper: TypeMapper;
5397
5397
let members: SymbolTable;
5398
5398
let callSignatures: Signature[];
@@ -7215,36 +7215,22 @@ namespace ts {
7215
7215
function getTypeFromTupleTypeNode(node: TupleTypeNode): Type {
7216
7216
const links = getNodeLinks(node);
7217
7217
if (!links.resolvedType) {
7218
- links.resolvedType = createTupleType(flatMap( node.elementTypes, getTypeFromTupleElement) );
7218
+ links.resolvedType = getTypeForTupleNode( node);
7219
7219
}
7220
7220
return links.resolvedType;
7221
7221
}
7222
7222
7223
+ function getSpreadTupleTypes(elements: Type[], idxIsSpread: boolean[]): Type {
7224
+ return createTupleType(flatMap(elements, (tp: Type, i: number) => idxIsSpread[i] ? getTypeSpreadTypes(tp) : tp));
7225
+ }
7226
+
7223
7227
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];
7228
+ if (isTupleLikeType(tuple)) {
7229
+ return getTupleTypeElementTypes(tuple);
7232
7230
}
7233
7231
else {
7234
- // const type = getApparentType(nodeType);
7235
- if (allowSyntheticDefaultImports) {
7236
- console.log("type", typeToString(tuple));
7237
- console.log("isTupleLikeType(type)", isTupleLikeType(tuple));
7238
- }
7239
- if (isTupleLikeType(tuple)) {
7240
- // return map(getPropertiesOfType(tuple), getTypeOfSymbol);
7241
- return getTupleTypeElementTypes(tuple);
7242
- }
7243
- else {
7244
- // error(typeNode, Diagnostics.Tuple_type_spreads_may_only_be_created_from_tuple_types);
7245
- console.log("not a tuple, don't resolve?");
7246
- return [];
7247
- }
7232
+ // console.error("not a tuple, don't resolve?");
7233
+ return [];
7248
7234
}
7249
7235
}
7250
7236
@@ -7254,6 +7240,18 @@ namespace ts {
7254
7240
false;
7255
7241
}
7256
7242
7243
+ function getTypeForTupleNode(node: TupleTypeNode): Type {
7244
+ if (some(node.elementTypes, (n: TypeNode) => n.kind === SyntaxKind.TypeSpread &&
7245
+ isGenericTupleType(getTypeFromTypeNode((n as TypeSpreadTypeNode).type)))) {
7246
+ const elements = map(node.elementTypes, (n: TypeNode) => getTypeFromTypeNode(n.kind === SyntaxKind.TypeSpread ? (n as TypeSpreadTypeNode).type : n));
7247
+ const idxIsSpread = map(node.elementTypes, (n: TypeNode) => n.kind === SyntaxKind.TypeSpread);
7248
+ return createTupleSpreadType(elements, idxIsSpread);
7249
+ }
7250
+ else {
7251
+ return createTupleType(flatMap(node.elementTypes, getTypeFromTupleElement));
7252
+ }
7253
+ }
7254
+
7257
7255
function getTupleTypeElementTypes(type: Type): Type[] {
7258
7256
Debug.assert(isTupleLikeType(type));
7259
7257
const types = [];
@@ -7615,10 +7613,10 @@ namespace ts {
7615
7613
return type;
7616
7614
}
7617
7615
7618
- function createTypeSpreadType(tuple : Type) {
7619
- console.log("createTypeSpreadType" );
7620
- const type = <TypeSpreadType>createType(TypeFlags.TypeSpread) ;
7621
- type.type = tuple ;
7616
+ function createTupleSpreadType(elements : Type[], idxIsSpread: boolean[] ) {
7617
+ const type = <SpreadTupleType>createType(TypeFlags.SpreadTuple );
7618
+ type.elements = elements ;
7619
+ type.idxIsSpread = idxIsSpread ;
7622
7620
return type;
7623
7621
}
7624
7622
@@ -8437,9 +8435,9 @@ namespace ts {
8437
8435
if (type.flags & TypeFlags.IndexedAccess) {
8438
8436
return getIndexedAccessType(instantiateType((<IndexedAccessType>type).objectType, mapper), instantiateType((<IndexedAccessType>type).indexType, mapper));
8439
8437
}
8440
- // if (type.flags & TypeFlags.TypeSpread ) {
8441
- // return getTypeSpreadTypes(instantiateType ((<TypeSpreadType >type).type , mapper));
8442
- // }
8438
+ if (type.flags & TypeFlags.SpreadTuple ) {
8439
+ return getSpreadTupleTypes(instantiateTypes ((<SpreadTupleType >type).elements , mapper), (<SpreadTupleType>type).idxIsSpread );
8440
+ }
8443
8441
return type;
8444
8442
}
8445
8443
@@ -18841,20 +18839,12 @@ namespace ts {
18841
18839
18842
18840
function checkTypeSpreadTypeNode(node: TypeSpreadTypeNode) {
18843
18841
checkSourceElement(node.type);
18844
- // checkTypeSpreadType(<TypeSpreadType> getTypeFromTypeNode(node.type), node);
18845
18842
const type = getApparentType(getTypeFromTypeNode(node.type));
18846
18843
if (!isArrayLikeType(type)) { // isTupleLikeType
18847
18844
grammarErrorOnNode(node, Diagnostics.Tuple_type_spreads_may_only_be_created_from_tuple_types);
18848
18845
}
18849
18846
}
18850
18847
18851
- // function checkTypeSpreadType(spread: TypeSpreadType, node: TypeSpreadTypeNode) {
18852
- // const type = getApparentType(spread.type);
18853
- // if (!isArrayLikeType(type)) { // isTupleLikeType
18854
- // grammarErrorOnNode(node, Diagnostics.Tuple_type_spreads_may_only_be_created_from_tuple_types);
18855
- // }
18856
- // }
18857
-
18858
18848
function checkUnionOrIntersectionType(node: UnionOrIntersectionTypeNode) {
18859
18849
forEach(node.types, checkSourceElement);
18860
18850
}
0 commit comments