@@ -185,6 +185,212 @@ namespace ts {
185
185
return < BooleanLiteral > createSynthesizedNode ( SyntaxKind . FalseKeyword ) ;
186
186
}
187
187
188
+ // Types
189
+
190
+ export function createTypePredicateNode ( parameterName : Identifier | ThisTypeNode , type : TypeNode ) : TypePredicateNode {
191
+ const node = < TypePredicateNode > createSynthesizedNode ( SyntaxKind . TypePredicate ) ;
192
+ node . parameterName = parameterName ;
193
+ node . type = type ;
194
+ return node ;
195
+ }
196
+
197
+ export function updateTypePredicate ( node : TypePredicateNode , parameterName : Identifier | ThisTypeNode , type : TypeNode ) : TypePredicateNode {
198
+ return node . parameterName !== parameterName
199
+ || node . type !== type
200
+ ? updateNode ( createTypePredicateNode ( parameterName , type ) , node )
201
+ : node ;
202
+ }
203
+
204
+ export function createTypeReferenceNode ( typeName : EntityName , typeArguments ?: TypeNode [ ] ) : TypeReferenceNode {
205
+ const node = < TypeReferenceNode > createSynthesizedNode ( SyntaxKind . TypeReference ) ;
206
+ node . typeName = typeName ;
207
+ node . typeArguments = asNodeArray ( typeArguments ) ;
208
+ return node ;
209
+ }
210
+
211
+ export function updateTypeReferenceNode ( node : TypeReferenceNode , typeName : EntityName , typeArguments ?: TypeNode [ ] ) {
212
+ return node . typeName !== typeName
213
+ || node . typeArguments !== typeArguments
214
+ ? updateNode ( createTypeReferenceNode ( typeName , typeArguments ) , node )
215
+ : node ;
216
+ }
217
+
218
+ export function createFunctionTypeNode ( name ?: PropertyName , typeParameters ?: TypeParameterDeclaration [ ] , parameters ?: ParameterDeclaration [ ] , type ?: TypeNode ) {
219
+ const node = < FunctionTypeNode > createSynthesizedNode ( SyntaxKind . FunctionType ) ;
220
+ node . name = asName ( name ) ;
221
+ node . typeParameters = asNodeArray ( typeParameters ) ;
222
+ node . parameters = asNodeArray ( parameters ) ;
223
+ node . type = type ;
224
+ return node ;
225
+ }
226
+
227
+ export function updateFunctionTypeNode ( node : FunctionTypeNode , name ?: PropertyName , typeParameters ?: TypeParameterDeclaration [ ] , parameters ?: ParameterDeclaration [ ] , type ?: TypeNode ) : FunctionTypeNode {
228
+ return node . name !== name
229
+ || node . typeParameters !== typeParameters
230
+ || node . parameters !== parameters
231
+ || node . type == type
232
+ ? updateNode ( createFunctionTypeNode ( name , typeParameters , parameters , type ) , node )
233
+ : node ;
234
+ }
235
+
236
+ export function createConstructorTypeNode ( name ?: PropertyName , typeParameters ?: TypeParameterDeclaration [ ] , parameters ?: ParameterDeclaration [ ] , type ?: TypeNode ) {
237
+ const node = < ConstructorTypeNode > createSynthesizedNode ( SyntaxKind . ConstructorType ) ;
238
+ node . name = asName ( name ) ;
239
+ node . typeParameters = asNodeArray ( typeParameters ) ;
240
+ node . parameters = asNodeArray ( parameters ) ;
241
+ node . type = type ;
242
+ return node ;
243
+ }
244
+
245
+ export function updateConstructorTypeNode ( node : ConstructorTypeNode , name ?: PropertyName , typeParameters ?: TypeParameterDeclaration [ ] , parameters ?: ParameterDeclaration [ ] , type ?: TypeNode ) : ConstructorTypeNode {
246
+ return node . name !== name
247
+ || node . typeParameters !== typeParameters
248
+ || node . parameters !== parameters
249
+ || node . type == type
250
+ ? updateNode ( createConstructorTypeNode ( name , typeParameters , parameters , type ) , node )
251
+ : node ;
252
+ }
253
+
254
+ export function createTypeQueryNode ( exprName : EntityName ) : TypeQueryNode {
255
+ const node = < TypeQueryNode > createSynthesizedNode ( SyntaxKind . TypeQuery ) ;
256
+ node . exprName = exprName ;
257
+ return node ;
258
+ }
259
+
260
+ export function updateTypeQueryNode ( node : TypeQueryNode , exprName : EntityName ) : TypeQueryNode {
261
+ return node . exprName !== exprName
262
+ ? updateNode ( createTypeQueryNode ( exprName ) , node )
263
+ : node ;
264
+ }
265
+
266
+ export function createTypeLiteralNode ( members : TypeElement [ ] ) : TypeLiteralNode {
267
+ const node = < TypeLiteralNode > createSynthesizedNode ( SyntaxKind . TypeLiteral ) ;
268
+ node . members = asNodeArray ( members ) ;
269
+ return node ;
270
+ }
271
+
272
+ export function updateTypeLiteralNode ( node : TypeLiteralNode , members : TypeElement [ ] ) : TypeLiteralNode {
273
+ return node . members !== members
274
+ ? updateNode ( createTypeLiteralNode ( members ) , node )
275
+ : node ;
276
+ }
277
+
278
+ export function createArrayTypeNode ( elementType : TypeNode ) : ArrayTypeNode {
279
+ const node = < ArrayTypeNode > createSynthesizedNode ( SyntaxKind . ArrayType ) ;
280
+ node . elementType = elementType ;
281
+ return node ;
282
+ }
283
+
284
+ export function updateArrayTypeNode ( node : ArrayTypeNode , elementType : TypeNode ) : ArrayTypeNode {
285
+ return node . elementType !== elementType
286
+ ? updateNode ( createArrayTypeNode ( elementType ) , node )
287
+ : node ;
288
+ }
289
+
290
+ export function createTupleTypeNode ( elementTypes : TypeNode [ ] ) : TupleTypeNode {
291
+ const node = < TupleTypeNode > createSynthesizedNode ( SyntaxKind . TupleType ) ;
292
+ node . elementTypes = asNodeArray ( elementTypes ) ;
293
+ return node ;
294
+ }
295
+
296
+ export function updateTupleTypeNode ( node : TupleTypeNode , elementTypes : TypeNode [ ] ) : TupleTypeNode {
297
+ return node . elementTypes !== elementTypes
298
+ ? updateNode ( createTupleTypeNode ( elementTypes ) , node )
299
+ : node ;
300
+ }
301
+
302
+ export function createUnionOrIntersectionTypeNode ( kind : UnionOrIntersectionTypeNode [ "kind" ] , types : TypeNode [ ] ) : UnionOrIntersectionTypeNode {
303
+ const node = < UnionOrIntersectionTypeNode > createSynthesizedNode ( kind ) ;
304
+ node . types = asNodeArray ( types ) ;
305
+ return node ;
306
+ }
307
+
308
+ export function updateUnionOrIntersectionTypeNode ( node : UnionOrIntersectionTypeNode , types : TypeNode [ ] ) : UnionOrIntersectionTypeNode {
309
+ return node . types !== types
310
+ ? updateNode ( createUnionOrIntersectionTypeNode ( node . kind , types ) , node )
311
+ : node ;
312
+ }
313
+
314
+ export function createUnionTypeNode ( types : TypeNode [ ] ) : UnionOrIntersectionTypeNode {
315
+ return createUnionOrIntersectionTypeNode ( SyntaxKind . UnionType , types ) ;
316
+ }
317
+
318
+ export function createIntersectionTypeNode ( types : TypeNode [ ] ) : UnionOrIntersectionTypeNode {
319
+ return createUnionOrIntersectionTypeNode ( SyntaxKind . IntersectionType , types ) ;
320
+ }
321
+
322
+ export function createParenthesizedTypeNode ( type : TypeNode ) : ParenthesizedTypeNode {
323
+ const node = < ParenthesizedTypeNode > createSynthesizedNode ( SyntaxKind . ParenthesizedType ) ;
324
+ node . type = type ;
325
+ return node ;
326
+ }
327
+
328
+ export function updateParenthesizedTypeNode ( node : ParenthesizedTypeNode , type : TypeNode ) : ParenthesizedTypeNode {
329
+ return node . type !== type
330
+ ? updateNode ( createParenthesizedTypeNode ( type ) , node )
331
+ : node ;
332
+ }
333
+
334
+ export function createThisTypeNode ( ) : ThisTypeNode {
335
+ return < ThisTypeNode > createSynthesizedNode ( SyntaxKind . ThisType ) ;
336
+ }
337
+
338
+ export function createTypeOperatorNode ( type : TypeNode ) : TypeOperatorNode {
339
+ const node = < TypeOperatorNode > createSynthesizedNode ( SyntaxKind . TypeOperator ) ;
340
+ node . type = type ;
341
+ return node ;
342
+ }
343
+
344
+ export function updateTypeOperatorNode ( node : TypeOperatorNode , type : TypeNode ) : TypeOperatorNode {
345
+ return node . type !== type
346
+ ? updateNode ( createTypeOperatorNode ( type ) , node )
347
+ : node ;
348
+ }
349
+
350
+ export function createIndexedAccessTypeNode ( objectType : TypeNode , indexType : TypeNode ) : IndexedAccessTypeNode {
351
+ const node = < IndexedAccessTypeNode > createSynthesizedNode ( SyntaxKind . IndexedAccessType ) ;
352
+ node . objectType = objectType ;
353
+ node . indexType = indexType ;
354
+ return node ;
355
+ }
356
+
357
+ export function updateIndexedAccessTypeNode ( node : IndexedAccessTypeNode , objectType : TypeNode , indexType : TypeNode ) : IndexedAccessTypeNode {
358
+ return node . objectType !== objectType
359
+ || node . indexType !== indexType
360
+ ? updateNode ( createIndexedAccessTypeNode ( objectType , indexType ) , node )
361
+ : node ;
362
+ }
363
+
364
+ export function createMappedTypeNode ( readonlyToken ?: ReadonlyToken , typeParameter ?: TypeParameterDeclaration , questionToken ?: QuestionToken , type ?: TypeNode ) : MappedTypeNode {
365
+ const node = < MappedTypeNode > createSynthesizedNode ( SyntaxKind . MappedType ) ;
366
+ node . readonlyToken = readonlyToken ;
367
+ node . typeParameter = typeParameter ;
368
+ node . questionToken = questionToken ;
369
+ node . type = type ;
370
+ return node ;
371
+ }
372
+
373
+ export function updateMappedTypeNode ( node : MappedTypeNode , readonlyToken ?: ReadonlyToken , typeParameter ?: TypeParameterDeclaration , questionToken ?: QuestionToken , type ?: TypeNode ) : MappedTypeNode {
374
+ return node . readonlyToken !== readonlyToken
375
+ || node . typeParameter !== typeParameter
376
+ || node . questionToken !== questionToken
377
+ || node . type !== type
378
+ ? updateNode ( createMappedTypeNode ( readonlyToken , typeParameter , questionToken , type ) , node )
379
+ : node ;
380
+ }
381
+
382
+ export function createLiteralTypeNode ( literal : Expression ) : LiteralTypeNode {
383
+ const node = < LiteralTypeNode > createSynthesizedNode ( SyntaxKind . LiteralType ) ;
384
+ node . literal = literal ;
385
+ return node ;
386
+ }
387
+
388
+ export function updateLiteralTypeNode ( node : LiteralTypeNode , literal : Expression ) : LiteralTypeNode {
389
+ return node . literal !== literal
390
+ ? updateNode ( createLiteralTypeNode ( literal ) , node )
391
+ : node ;
392
+ }
393
+
188
394
// Names
189
395
190
396
export function createQualifiedName ( left : EntityName , right : string | Identifier ) {
0 commit comments