@@ -142,6 +142,8 @@ export class Resolver extends DiagnosticEmitter {
142
142
resolveType (
143
143
/** The type to resolve. */
144
144
node : TypeNode ,
145
+ /** The flow */
146
+ flow : Flow | null ,
145
147
/** Contextual element. */
146
148
ctxElement : Element ,
147
149
/** Contextual types, i.e. `T`. */
@@ -160,21 +162,11 @@ export class Resolver extends DiagnosticEmitter {
160
162
let resolved : Type | null = null ;
161
163
switch ( node . kind ) {
162
164
case NodeKind . NamedType : {
163
- resolved = this . resolveNamedType (
164
- < NamedTypeNode > node ,
165
- ctxElement ,
166
- ctxTypes ,
167
- reportMode
168
- ) ;
165
+ resolved = this . resolveNamedType ( < NamedTypeNode > node , flow , ctxElement , ctxTypes , reportMode ) ;
169
166
break ;
170
167
}
171
168
case NodeKind . FunctionType : {
172
- resolved = this . resolveFunctionType (
173
- < FunctionTypeNode > node ,
174
- ctxElement ,
175
- ctxTypes ,
176
- reportMode
177
- ) ;
169
+ resolved = this . resolveFunctionType ( < FunctionTypeNode > node , flow , ctxElement , ctxTypes , reportMode ) ;
178
170
break ;
179
171
}
180
172
default : assert ( false ) ;
@@ -187,6 +179,8 @@ export class Resolver extends DiagnosticEmitter {
187
179
private resolveNamedType (
188
180
/** The type to resolve. */
189
181
node : NamedTypeNode ,
182
+ /** The flow */
183
+ flow : Flow | null ,
190
184
/** Contextual element. */
191
185
ctxElement : Element ,
192
186
/** Contextual types, i.e. `T`. */
@@ -225,7 +219,7 @@ export class Resolver extends DiagnosticEmitter {
225
219
}
226
220
227
221
// Look up in context
228
- let element = this . resolveTypeName ( nameNode , ctxElement , reportMode ) ;
222
+ let element = this . resolveTypeName ( nameNode , flow , ctxElement , reportMode ) ;
229
223
if ( ! element ) return null ;
230
224
231
225
// Use shadow type if present (i.e. namespace sharing a type)
@@ -264,6 +258,7 @@ export class Resolver extends DiagnosticEmitter {
264
258
let instance = this . resolveClassInclTypeArguments (
265
259
< ClassPrototype > element ,
266
260
typeArgumentNodes ,
261
+ flow ,
267
262
ctxElement ,
268
263
cloneMap ( ctxTypes ) , // don't inherit
269
264
node ,
@@ -318,6 +313,7 @@ export class Resolver extends DiagnosticEmitter {
318
313
typeArguments = this . resolveTypeArguments (
319
314
typeParameterNodes ,
320
315
typeArgumentNodes ,
316
+ flow ,
321
317
ctxElement ,
322
318
ctxTypes = cloneMap ( ctxTypes ) , // update
323
319
node ,
@@ -332,6 +328,7 @@ export class Resolver extends DiagnosticEmitter {
332
328
}
333
329
let type = this . resolveType (
334
330
typeDefinition . typeNode ,
331
+ flow ,
335
332
element ,
336
333
ctxTypes ,
337
334
reportMode
@@ -361,6 +358,8 @@ export class Resolver extends DiagnosticEmitter {
361
358
private resolveFunctionType (
362
359
/** The type to resolve. */
363
360
node : FunctionTypeNode ,
361
+ /** The flow */
362
+ flow : Flow | null ,
364
363
/** Contextual element. */
365
364
ctxElement : Element ,
366
365
/** Contextual types, i.e. `T`. */
@@ -373,6 +372,7 @@ export class Resolver extends DiagnosticEmitter {
373
372
if ( explicitThisType ) {
374
373
thisType = this . resolveType (
375
374
explicitThisType ,
375
+ flow ,
376
376
ctxElement ,
377
377
ctxTypes ,
378
378
reportMode
@@ -409,6 +409,7 @@ export class Resolver extends DiagnosticEmitter {
409
409
}
410
410
let parameterType = this . resolveType (
411
411
parameterTypeNode ,
412
+ flow ,
412
413
ctxElement ,
413
414
ctxTypes ,
414
415
reportMode
@@ -429,6 +430,7 @@ export class Resolver extends DiagnosticEmitter {
429
430
} else {
430
431
returnType = this . resolveType (
431
432
returnTypeNode ,
433
+ flow ,
432
434
ctxElement ,
433
435
ctxTypes ,
434
436
reportMode
@@ -451,7 +453,7 @@ export class Resolver extends DiagnosticEmitter {
451
453
) : Type | null {
452
454
const typeArgumentNode = this . ensureOneTypeArgument ( node , reportMode ) ;
453
455
if ( ! typeArgumentNode ) return null ;
454
- let typeArgument = this . resolveType ( typeArgumentNode , ctxElement , ctxTypes , reportMode ) ;
456
+ let typeArgument = this . resolveType ( typeArgumentNode , null , ctxElement , ctxTypes , reportMode ) ;
455
457
if ( ! typeArgument ) return null ;
456
458
switch ( typeArgument . kind ) {
457
459
case TypeKind . I8 :
@@ -486,7 +488,7 @@ export class Resolver extends DiagnosticEmitter {
486
488
) : Type | null {
487
489
const typeArgumentNode = this . ensureOneTypeArgument ( node , reportMode ) ;
488
490
if ( ! typeArgumentNode ) return null ;
489
- let typeArgument = this . resolveType ( typeArgumentNode , ctxElement , ctxTypes , reportMode ) ;
491
+ let typeArgument = this . resolveType ( typeArgumentNode , null , ctxElement , ctxTypes , reportMode ) ;
490
492
if ( ! typeArgument ) return null ;
491
493
let classReference = typeArgument . classReference ;
492
494
if ( ! classReference ) {
@@ -530,7 +532,7 @@ export class Resolver extends DiagnosticEmitter {
530
532
) : Type | null {
531
533
const typeArgumentNode = this . ensureOneTypeArgument ( node , reportMode ) ;
532
534
if ( ! typeArgumentNode ) return null ;
533
- let typeArgument = this . resolveType ( typeArgumentNode , ctxElement , ctxTypes , reportMode ) ;
535
+ let typeArgument = this . resolveType ( typeArgumentNode , null , ctxElement , ctxTypes , reportMode ) ;
534
536
if ( ! typeArgument ) return null ;
535
537
let classReference = typeArgument . getClassOrWrapper ( this . program ) ;
536
538
if ( classReference ) {
@@ -558,7 +560,7 @@ export class Resolver extends DiagnosticEmitter {
558
560
) : Type | null {
559
561
const typeArgumentNode = this . ensureOneTypeArgument ( node , reportMode ) ;
560
562
if ( ! typeArgumentNode ) return null ;
561
- let typeArgument = this . resolveType ( typeArgumentNode , ctxElement , ctxTypes , reportMode ) ;
563
+ let typeArgument = this . resolveType ( typeArgumentNode , null , ctxElement , ctxTypes , reportMode ) ;
562
564
if ( ! typeArgument ) return null ;
563
565
let signatureReference = typeArgument . getSignature ( ) ;
564
566
if ( signatureReference ) return signatureReference . returnType ;
@@ -583,7 +585,7 @@ export class Resolver extends DiagnosticEmitter {
583
585
) : Type | null {
584
586
const typeArgumentNode = this . ensureOneTypeArgument ( node , reportMode ) ;
585
587
if ( ! typeArgumentNode ) return null ;
586
- let typeArgument = this . resolveType ( typeArgumentNode , ctxElement , ctxTypes , reportMode ) ;
588
+ let typeArgument = this . resolveType ( typeArgumentNode , null , ctxElement , ctxTypes , reportMode ) ;
587
589
if ( ! typeArgument ) return null ;
588
590
if ( ! typeArgument . isNullableReference ) return typeArgument ;
589
591
return typeArgument . nonNullableType ;
@@ -593,12 +595,16 @@ export class Resolver extends DiagnosticEmitter {
593
595
resolveTypeName (
594
596
/** The type name to resolve. */
595
597
node : TypeName ,
598
+ /** The flow */
599
+ flow : Flow | null ,
596
600
/** Contextual element. */
597
601
ctxElement : Element ,
598
602
/** How to proceed with eventual diagnostics. */
599
603
reportMode : ReportMode = ReportMode . Report
600
604
) : Element | null {
601
- let element = ctxElement . lookup ( node . identifier . text , true ) ;
605
+ let element : Element | null = null ;
606
+ if ( flow ) element = flow . lookupTypeAlias ( node . identifier . text ) ;
607
+ if ( ! element ) element = ctxElement . lookup ( node . identifier . text , true ) ;
602
608
if ( ! element ) {
603
609
if ( reportMode == ReportMode . Report ) {
604
610
this . error (
@@ -632,6 +638,8 @@ export class Resolver extends DiagnosticEmitter {
632
638
typeParameters : TypeParameterNode [ ] ,
633
639
/** Type argument nodes provided. */
634
640
typeArgumentNodes : TypeNode [ ] | null ,
641
+ /** Flow */
642
+ flow : Flow | null ,
635
643
/** Contextual element. */
636
644
ctxElement : Element ,
637
645
/** Contextual types, i.e. `T`. Updated in place with the new set of contextual types. */
@@ -641,9 +649,8 @@ export class Resolver extends DiagnosticEmitter {
641
649
/** How to proceed with eventual diagnostics. */
642
650
reportMode : ReportMode = ReportMode . Report
643
651
) : Type [ ] | null {
644
- var
645
- minParameterCount = 0 ,
646
- maxParameterCount = 0 ;
652
+ let minParameterCount = 0 ;
653
+ let maxParameterCount = 0 ;
647
654
for ( let i = 0 , k = typeParameters . length ; i < k ; ++ i ) {
648
655
if ( ! typeParameters [ i ] . defaultType ) ++ minParameterCount ;
649
656
++ maxParameterCount ;
@@ -672,12 +679,14 @@ export class Resolver extends DiagnosticEmitter {
672
679
let type = i < argumentCount
673
680
? this . resolveType ( // reports
674
681
typeArgumentNodes ! [ i ] ,
682
+ flow ,
675
683
ctxElement ,
676
684
oldCtxTypes , // update
677
685
reportMode
678
686
)
679
687
: this . resolveType ( // reports
680
688
assert ( typeParameters [ i ] . defaultType ) ,
689
+ flow ,
681
690
ctxElement ,
682
691
cloneMap ( ctxTypes ) , // don't update
683
692
reportMode
@@ -796,6 +805,7 @@ export class Resolver extends DiagnosticEmitter {
796
805
}
797
806
let resolvedDefaultType = this . resolveType (
798
807
defaultType ,
808
+ null ,
799
809
prototype ,
800
810
defaultTypeContextualTypeArguments ,
801
811
reportMode
@@ -846,7 +856,7 @@ export class Resolver extends DiagnosticEmitter {
846
856
if ( typeArgumentNodes && typeArgumentNodes . length > 0 ) { // foo<T>(bar: Array<T>)
847
857
let classReference = type . classReference ;
848
858
if ( classReference ) {
849
- let classPrototype = this . resolveTypeName ( namedTypeNode . name , ctxElement ) ;
859
+ let classPrototype = this . resolveTypeName ( namedTypeNode . name , null , ctxElement ) ;
850
860
if ( ! classPrototype || classPrototype . kind != ElementKind . ClassPrototype ) return ;
851
861
if ( classReference . prototype == < ClassPrototype > classPrototype ) {
852
862
let typeArguments = classReference . typeArguments ;
@@ -1306,7 +1316,7 @@ export class Resolver extends DiagnosticEmitter {
1306
1316
if ( global . is ( CommonFlags . Resolved ) ) return true ;
1307
1317
let typeNode = global . typeNode ;
1308
1318
let type = typeNode
1309
- ? this . resolveType ( typeNode , global . parent , null , reportMode )
1319
+ ? this . resolveType ( typeNode , null , global . parent , null , reportMode )
1310
1320
: this . resolveExpression (
1311
1321
assert ( global . initializerNode ) ,
1312
1322
global . file . startFunction . flow ,
@@ -1424,7 +1434,7 @@ export class Resolver extends DiagnosticEmitter {
1424
1434
let shadowType = target . shadowType ;
1425
1435
if ( shadowType ) {
1426
1436
if ( ! shadowType . is ( CommonFlags . Resolved ) ) {
1427
- let resolvedType = this . resolveType ( shadowType . typeNode , shadowType . parent , null , reportMode ) ;
1437
+ let resolvedType = this . resolveType ( shadowType . typeNode , null , shadowType . parent , null , reportMode ) ;
1428
1438
if ( resolvedType ) shadowType . setType ( resolvedType ) ;
1429
1439
}
1430
1440
let classReference = shadowType . type . classReference ;
@@ -1708,6 +1718,7 @@ export class Resolver extends DiagnosticEmitter {
1708
1718
case AssertionKind . Prefix : {
1709
1719
let type = this . resolveType (
1710
1720
assert ( node . toType ) , // must be set if not NONNULL
1721
+ null ,
1711
1722
ctxFlow . sourceFunction ,
1712
1723
ctxFlow . contextualTypeArguments ,
1713
1724
reportMode
@@ -1764,6 +1775,7 @@ export class Resolver extends DiagnosticEmitter {
1764
1775
case AssertionKind . Prefix : {
1765
1776
return this . resolveType (
1766
1777
assert ( node . toType ) ,
1778
+ null ,
1767
1779
ctxFlow . sourceFunction ,
1768
1780
ctxFlow . contextualTypeArguments ,
1769
1781
reportMode
@@ -2659,12 +2671,13 @@ export class Resolver extends DiagnosticEmitter {
2659
2671
/** How to proceed with eventual diagnostics. */
2660
2672
reportMode : ReportMode = ReportMode . Report
2661
2673
) : Element | null {
2662
- let element = this . resolveTypeName ( node . typeName , ctxFlow . sourceFunction , reportMode ) ;
2674
+ let element = this . resolveTypeName ( node . typeName , ctxFlow , ctxFlow . sourceFunction , reportMode ) ;
2663
2675
if ( ! element ) return null ;
2664
2676
if ( element . kind == ElementKind . ClassPrototype ) {
2665
2677
return this . resolveClassInclTypeArguments (
2666
2678
< ClassPrototype > element ,
2667
2679
node . typeArguments ,
2680
+ ctxFlow ,
2668
2681
ctxFlow . sourceFunction ,
2669
2682
cloneMap ( ctxFlow . contextualTypeArguments ) ,
2670
2683
node ,
@@ -2744,7 +2757,7 @@ export class Resolver extends DiagnosticEmitter {
2744
2757
const declaration = node . declaration ;
2745
2758
const signature = declaration . signature ;
2746
2759
const body = declaration . body ;
2747
- let functionType = this . resolveType ( signature , ctxFlow . sourceFunction , ctxFlow . contextualTypeArguments , reportMode ) ;
2760
+ let functionType = this . resolveType ( signature , null , ctxFlow . sourceFunction , ctxFlow . contextualTypeArguments , reportMode ) ;
2748
2761
if (
2749
2762
functionType &&
2750
2763
declaration . arrowKind != ArrowKind . None &&
@@ -2843,6 +2856,7 @@ export class Resolver extends DiagnosticEmitter {
2843
2856
if ( explicitThisType ) {
2844
2857
thisType = this . resolveType (
2845
2858
explicitThisType ,
2859
+ null ,
2846
2860
prototype . parent , // relative to function
2847
2861
ctxTypes ,
2848
2862
reportMode
@@ -2876,6 +2890,7 @@ export class Resolver extends DiagnosticEmitter {
2876
2890
}
2877
2891
let parameterType = this . resolveType (
2878
2892
typeNode ,
2893
+ null ,
2879
2894
prototype . parent , // relative to function
2880
2895
ctxTypes ,
2881
2896
reportMode
@@ -2912,6 +2927,7 @@ export class Resolver extends DiagnosticEmitter {
2912
2927
}
2913
2928
let type = this . resolveType (
2914
2929
typeNode ,
2930
+ null ,
2915
2931
prototype . parent , // relative to function
2916
2932
ctxTypes ,
2917
2933
reportMode
@@ -3026,6 +3042,7 @@ export class Resolver extends DiagnosticEmitter {
3026
3042
resolvedTypeArguments = this . resolveTypeArguments ( // reports
3027
3043
assert ( prototype . typeParameterNodes ) ,
3028
3044
typeArgumentNodes ,
3045
+ null ,
3029
3046
ctxElement ,
3030
3047
ctxTypes , // update
3031
3048
reportNode ,
@@ -3174,6 +3191,7 @@ export class Resolver extends DiagnosticEmitter {
3174
3191
let base = this . resolveClassInclTypeArguments (
3175
3192
basePrototype ,
3176
3193
extendsNode . typeArguments ,
3194
+ null ,
3177
3195
prototype . parent , // relative to derived class
3178
3196
cloneMap ( ctxTypes ) , // don't inherit
3179
3197
extendsNode ,
@@ -3214,6 +3232,7 @@ export class Resolver extends DiagnosticEmitter {
3214
3232
let iface = this . resolveClassInclTypeArguments (
3215
3233
interfacePrototype ,
3216
3234
implementsNode . typeArguments ,
3235
+ null ,
3217
3236
prototype . parent ,
3218
3237
cloneMap ( ctxTypes ) ,
3219
3238
implementsNode ,
@@ -3610,6 +3629,8 @@ export class Resolver extends DiagnosticEmitter {
3610
3629
prototype : ClassPrototype ,
3611
3630
/** Type arguments provided to be resolved. */
3612
3631
typeArgumentNodes : TypeNode [ ] | null ,
3632
+ /** Flow of {@link typeArgumentNodes} */
3633
+ flow : Flow | null ,
3613
3634
/** Contextual element. */
3614
3635
ctxElement : Element ,
3615
3636
/** Contextual types, i.e. `T`. */
@@ -3626,6 +3647,7 @@ export class Resolver extends DiagnosticEmitter {
3626
3647
resolvedTypeArguments = this . resolveTypeArguments ( // reports
3627
3648
assert ( prototype . typeParameterNodes ) , // must be present if generic
3628
3649
typeArgumentNodes ,
3650
+ flow ,
3629
3651
ctxElement ,
3630
3652
ctxTypes , // update
3631
3653
reportNode ,
0 commit comments