@@ -2229,7 +2229,7 @@ namespace ts {
2229
2229
2230
2230
return result;
2231
2231
}
2232
-
2232
+
2233
2233
function typeFormatFlagsToNodeBuilderFlags(flags: TypeFormatFlags): NodeBuilderFlags {
2234
2234
let result = NodeBuilderFlags.None;
2235
2235
if (flags & TypeFormatFlags.WriteArrayAsGenericType) {
@@ -2270,7 +2270,7 @@ namespace ts {
2270
2270
}
2271
2271
2272
2272
function typeToString(type: Type, enclosingDeclaration?: Node, flags?: TypeFormatFlags): string {
2273
- const typeNode = nodeBuilder.typeToTypeNode(type, enclosingDeclaration, typeFormatFlagsToNodeBuilderFlags(flags) | NodeBuilderFlags.ignoreErrors, !!(flags & TypeFormatFlags.InTypeAlias) );
2273
+ const typeNode = nodeBuilder.typeToTypeNode(type, enclosingDeclaration, typeFormatFlagsToNodeBuilderFlags(flags) | NodeBuilderFlags.ignoreErrors);
2274
2274
Debug.assert(typeNode !== undefined, "should always get typenode?");
2275
2275
const newLine = NewLineKind.None;
2276
2276
const options = { newLine, removeComments: true };
@@ -2289,9 +2289,8 @@ namespace ts {
2289
2289
2290
2290
function createNodeBuilder() {
2291
2291
return {
2292
- typeToTypeNode: (type: Type, enclosingDeclaration?: Node, flags?: NodeBuilderFlags, inTypeAlias?: boolean ) => {
2292
+ typeToTypeNode: (type: Type, enclosingDeclaration?: Node, flags?: NodeBuilderFlags) => {
2293
2293
const context = createNodeBuilderContext(enclosingDeclaration, flags);
2294
- context.InTypeAlias = inTypeAlias;
2295
2294
const resultingNode = typeToTypeNodeHelper(type, context);
2296
2295
const result = context.encounteredError ? undefined : resultingNode;
2297
2296
return result;
@@ -2312,14 +2311,10 @@ namespace ts {
2312
2311
2313
2312
interface NodeBuilderContext {
2314
2313
enclosingDeclaration: Node | undefined;
2315
- readonly flags: NodeBuilderFlags | undefined;
2314
+ flags: NodeBuilderFlags | undefined;
2316
2315
2317
2316
// State
2318
2317
encounteredError: boolean;
2319
- inObjectTypeLiteral: boolean;
2320
- InElementType: boolean; // Writing an array or union element type
2321
- InFirstTypeArgument: boolean; // Writing first type argument of the instantiated type
2322
- InTypeAlias: boolean; // Writing type in type alias declaration
2323
2318
symbolStack: Symbol[] | undefined;
2324
2319
}
2325
2320
@@ -2328,21 +2323,15 @@ namespace ts {
2328
2323
enclosingDeclaration,
2329
2324
flags,
2330
2325
encounteredError: false,
2331
- inObjectTypeLiteral: false,
2332
- InElementType: false,
2333
- InFirstTypeArgument: false,
2334
- InTypeAlias: false,
2335
2326
symbolStack: undefined
2336
2327
};
2337
2328
}
2338
2329
2339
2330
function typeToTypeNodeHelper(type: Type, context: NodeBuilderContext): TypeNode {
2340
- const inElementType = context.InElementType;
2341
- context.InElementType = false;
2342
- const inTypeAlias = context.InTypeAlias;
2343
- context.InTypeAlias = false;
2344
- const inFirstTypeArgument = context.InFirstTypeArgument;
2345
- context.InFirstTypeArgument = false;
2331
+ const inElementType = context.flags & NodeBuilderFlags.InElementType;
2332
+ const inFirstTypeArgument = context.flags & NodeBuilderFlags.InFirstTypeArgument;
2333
+ const inTypeAlias = context.flags & NodeBuilderFlags.InTypeAlias;
2334
+ context.flags &= ~(NodeBuilderFlags.StateClearingFlags);
2346
2335
2347
2336
if (!type) {
2348
2337
context.encounteredError = true;
@@ -2400,7 +2389,7 @@ namespace ts {
2400
2389
return createKeywordTypeNode(SyntaxKind.ObjectKeyword);
2401
2390
}
2402
2391
if (type.flags & TypeFlags.TypeParameter && (type as TypeParameter).isThisType) {
2403
- if (context.inObjectTypeLiteral) {
2392
+ if (context.flags & NodeBuilderFlags. inObjectTypeLiteral) {
2404
2393
if (!context.encounteredError && !(context.flags & NodeBuilderFlags.allowThisInObjectLiteral)) {
2405
2394
context.encounteredError = true;
2406
2395
}
@@ -2455,16 +2444,16 @@ namespace ts {
2455
2444
2456
2445
if (type.flags & TypeFlags.Index) {
2457
2446
const indexedType = (<IndexType>type).type;
2458
- context.InElementType = <boolean>true ;
2447
+ context.flags |= NodeBuilderFlags.InElementType ;
2459
2448
const indexTypeNode = typeToTypeNodeHelper(indexedType, context);
2460
- Debug.assert(context.InElementType === false );
2449
+ Debug.assert(!( context.flags & NodeBuilderFlags.InElementType) );
2461
2450
return createTypeOperatorNode(indexTypeNode);
2462
2451
}
2463
2452
2464
2453
if (type.flags & TypeFlags.IndexedAccess) {
2465
- context.InElementType = <boolean>true ;
2454
+ context.flags |= NodeBuilderFlags.InElementType ;
2466
2455
const objectTypeNode = typeToTypeNodeHelper((<IndexedAccessType>type).objectType, context);
2467
- Debug.assert(context.InElementType === false );
2456
+ Debug.assert(!( context.flags & NodeBuilderFlags.InElementType) );
2468
2457
const indexTypeNode = typeToTypeNodeHelper((<IndexedAccessType>type).indexType, context);
2469
2458
return createIndexedAccessTypeNode(objectTypeNode, indexTypeNode);
2470
2459
}
@@ -2567,10 +2556,10 @@ namespace ts {
2567
2556
}
2568
2557
}
2569
2558
2570
- const saveInObjectTypeLiteral = context.inObjectTypeLiteral ;
2571
- context.inObjectTypeLiteral = true ;
2559
+ const savedFlags = context.flags ;
2560
+ context.flags |= NodeBuilderFlags.inObjectTypeLiteral ;
2572
2561
const members = createTypeNodesFromResolvedType(resolved);
2573
- context.inObjectTypeLiteral = saveInObjectTypeLiteral ;
2562
+ context.flags = savedFlags ;
2574
2563
const typeLiteralNode = createTypeLiteralNode(members);
2575
2564
return setEmitFlags(typeLiteralNode, EmitFlags.ToStringFormatting);
2576
2565
}
@@ -2606,9 +2595,11 @@ namespace ts {
2606
2595
const typeArgumentNode = typeToTypeNodeHelper(typeArguments[0], context);
2607
2596
return createTypeReferenceNode("Array", [typeArgumentNode]);
2608
2597
}
2609
- context.InElementType = true;
2598
+
2599
+ context.flags |= NodeBuilderFlags.InElementType;
2610
2600
const elementType = typeToTypeNodeHelper(typeArguments[0], context);
2611
- context.InElementType = false;
2601
+ Debug.assert(!(context.flags & NodeBuilderFlags.InElementType));
2602
+
2612
2603
return createArrayTypeNode(elementType);
2613
2604
}
2614
2605
else if (type.target.objectFlags & ObjectFlags.Tuple) {
@@ -2756,19 +2747,21 @@ namespace ts {
2756
2747
2757
2748
function mapToTypeNodeArray(types: Type[], context: NodeBuilderContext, addInElementTypeFlag: boolean, addInFirstTypeArgumentFlag: boolean): TypeNode[] {
2758
2749
const result = [];
2759
- Debug.assert(context.InElementType === false , "should be unset at the beginning of the helper");
2750
+ Debug.assert(!( context.flags & NodeBuilderFlags.InElementType) , "should be unset at the beginning of the helper");
2760
2751
for (let i = 0; i < types.length; ++i) {
2761
2752
const type = types[i];
2762
- context.InElementType = addInElementTypeFlag;
2763
- if (i === 0) {
2764
- context.InFirstTypeArgument = addInFirstTypeArgumentFlag;
2753
+ if (addInElementTypeFlag) {
2754
+ context.flags |= NodeBuilderFlags.InElementType;
2755
+ }
2756
+ if (i === 0 && addInFirstTypeArgumentFlag) {
2757
+ context.flags |= NodeBuilderFlags.InFirstTypeArgument;
2765
2758
}
2766
2759
const typeNode = typeToTypeNodeHelper(type, context);
2767
2760
if (typeNode) {
2768
2761
result.push(typeNode);
2769
2762
}
2770
2763
}
2771
- Debug.assert(context.InElementType === false , "should be unset at the beginning of the helper");
2764
+ Debug.assert(!( context.flags & NodeBuilderFlags.InElementType) , "should be unset at the end of the helper");
2772
2765
return result;
2773
2766
}
2774
2767
0 commit comments