@@ -296,6 +296,7 @@ export class Resolver extends DiagnosticEmitter {
296
296
if ( text == CommonNames . indexof ) return this . resolveBuiltinIndexofType ( node , ctxElement , ctxTypes , reportMode ) ;
297
297
if ( text == CommonNames . valueof ) return this . resolveBuiltinValueofType ( node , ctxElement , ctxTypes , reportMode ) ;
298
298
if ( text == CommonNames . returnof ) return this . resolveBuiltinReturnTypeType ( node , ctxElement , ctxTypes , reportMode ) ;
299
+ if ( text == CommonNames . nonnull ) return this . resolveBuiltinNotNullableType ( node , ctxElement , ctxTypes , reportMode ) ;
299
300
}
300
301
301
302
// Resolve normally
@@ -438,19 +439,9 @@ export class Resolver extends DiagnosticEmitter {
438
439
/** How to proceed with eventual diagnostics. */
439
440
reportMode : ReportMode = ReportMode . REPORT
440
441
) : Type | null {
441
- var typeArgumentNodes = node . typeArguments ;
442
- if ( ! typeArgumentNodes || typeArgumentNodes . length != 1 ) {
443
- if ( reportMode == ReportMode . REPORT ) {
444
- let numTypeArguments = 0 ;
445
- if ( typeArgumentNodes ) numTypeArguments = typeArgumentNodes . length ;
446
- this . error (
447
- DiagnosticCode . Expected_0_type_arguments_but_got_1 ,
448
- node . range , "1" , numTypeArguments . toString ( )
449
- ) ;
450
- }
451
- return null ;
452
- }
453
- var typeArgument = this . resolveType ( typeArgumentNodes [ 0 ] , ctxElement , ctxTypes , reportMode ) ;
442
+ const typeArgumentNode = this . ensureOneTypeArgument ( node , reportMode ) ;
443
+ if ( ! typeArgumentNode ) return null ;
444
+ var typeArgument = this . resolveType ( typeArgumentNode , ctxElement , ctxTypes , reportMode ) ;
454
445
if ( ! typeArgument ) return null ;
455
446
switch ( typeArgument . kind ) {
456
447
case TypeKind . I8 :
@@ -483,26 +474,16 @@ export class Resolver extends DiagnosticEmitter {
483
474
/** How to proceed with eventual diagnostics. */
484
475
reportMode : ReportMode = ReportMode . REPORT
485
476
) : Type | null {
486
- var typeArgumentNodes = node . typeArguments ;
487
- if ( ! typeArgumentNodes || typeArgumentNodes . length != 1 ) {
488
- if ( reportMode == ReportMode . REPORT ) {
489
- let numTypeArguments = 0 ;
490
- if ( typeArgumentNodes ) numTypeArguments = typeArgumentNodes . length ;
491
- this . error (
492
- DiagnosticCode . Expected_0_type_arguments_but_got_1 ,
493
- node . range , "1" , numTypeArguments . toString ( )
494
- ) ;
495
- }
496
- return null ;
497
- }
498
- var typeArgument = this . resolveType ( typeArgumentNodes [ 0 ] , ctxElement , ctxTypes , reportMode ) ;
477
+ const typeArgumentNode = this . ensureOneTypeArgument ( node , reportMode ) ;
478
+ if ( ! typeArgumentNode ) return null ;
479
+ var typeArgument = this . resolveType ( typeArgumentNode , ctxElement , ctxTypes , reportMode ) ;
499
480
if ( ! typeArgument ) return null ;
500
481
var classReference = typeArgument . classReference ;
501
482
if ( ! classReference ) {
502
483
if ( reportMode == ReportMode . REPORT ) {
503
484
this . error (
504
485
DiagnosticCode . Index_signature_is_missing_in_type_0 ,
505
- typeArgumentNodes [ 0 ] . range , typeArgument . toString ( )
486
+ typeArgumentNode . range , typeArgument . toString ( )
506
487
) ;
507
488
}
508
489
return null ;
@@ -520,7 +501,7 @@ export class Resolver extends DiagnosticEmitter {
520
501
if ( reportMode == ReportMode . REPORT ) {
521
502
this . error (
522
503
DiagnosticCode . Index_signature_is_missing_in_type_0 ,
523
- typeArgumentNodes [ 0 ] . range , typeArgument . toString ( )
504
+ typeArgumentNode . range , typeArgument . toString ( )
524
505
) ;
525
506
}
526
507
return null ;
@@ -536,19 +517,9 @@ export class Resolver extends DiagnosticEmitter {
536
517
/** How to proceed with eventual diagnostics. */
537
518
reportMode : ReportMode = ReportMode . REPORT
538
519
) : Type | null {
539
- var typeArgumentNodes = node . typeArguments ;
540
- if ( ! typeArgumentNodes || typeArgumentNodes . length != 1 ) {
541
- let numTypeArguments = 0 ;
542
- if ( typeArgumentNodes ) numTypeArguments = typeArgumentNodes . length ;
543
- if ( reportMode == ReportMode . REPORT ) {
544
- this . error (
545
- DiagnosticCode . Expected_0_type_arguments_but_got_1 ,
546
- node . range , "1" , numTypeArguments . toString ( )
547
- ) ;
548
- }
549
- return null ;
550
- }
551
- var typeArgument = this . resolveType ( typeArgumentNodes [ 0 ] , ctxElement , ctxTypes , reportMode ) ;
520
+ const typeArgumentNode = this . ensureOneTypeArgument ( node , reportMode ) ;
521
+ if ( ! typeArgumentNode ) return null ;
522
+ var typeArgument = this . resolveType ( typeArgumentNode , ctxElement , ctxTypes , reportMode ) ;
552
523
if ( ! typeArgument ) return null ;
553
524
var classReference = typeArgument . getClassOrWrapper ( this . program ) ;
554
525
if ( classReference ) {
@@ -558,7 +529,7 @@ export class Resolver extends DiagnosticEmitter {
558
529
if ( reportMode == ReportMode . REPORT ) {
559
530
this . error (
560
531
DiagnosticCode . Index_signature_is_missing_in_type_0 ,
561
- typeArgumentNodes [ 0 ] . range , typeArgument . toString ( )
532
+ typeArgumentNode . range , typeArgument . toString ( )
562
533
) ;
563
534
}
564
535
return null ;
@@ -574,31 +545,39 @@ export class Resolver extends DiagnosticEmitter {
574
545
/** How to proceed with eventualy diagnostics. */
575
546
reportMode : ReportMode = ReportMode . REPORT
576
547
) : Type | null {
577
- var typeArgumentNodes = node . typeArguments ;
578
- if ( ! typeArgumentNodes || typeArgumentNodes . length != 1 ) {
579
- if ( reportMode == ReportMode . REPORT ) {
580
- let numTypeArguments = 0 ;
581
- if ( typeArgumentNodes ) numTypeArguments = typeArgumentNodes . length ;
582
- this . error (
583
- DiagnosticCode . Expected_0_type_arguments_but_got_1 ,
584
- node . range , "1" , numTypeArguments . toString ( )
585
- ) ;
586
- }
587
- return null ;
588
- }
589
- var typeArgument = this . resolveType ( typeArgumentNodes [ 0 ] , ctxElement , ctxTypes , reportMode ) ;
548
+ const typeArgumentNode = this . ensureOneTypeArgument ( node , reportMode ) ;
549
+ if ( ! typeArgumentNode ) return null ;
550
+ var typeArgument = this . resolveType ( typeArgumentNode , ctxElement , ctxTypes , reportMode ) ;
590
551
if ( ! typeArgument ) return null ;
591
552
var signatureReference = typeArgument . getSignature ( ) ;
592
553
if ( signatureReference ) return signatureReference . returnType ;
593
554
if ( reportMode == ReportMode . REPORT ) {
594
555
this . error (
595
556
DiagnosticCode . Type_0_has_no_call_signatures ,
596
- typeArgumentNodes [ 0 ] . range , typeArgument . toString ( )
557
+ typeArgumentNode . range , typeArgument . toString ( )
597
558
) ;
598
559
}
599
560
return null ;
600
561
}
601
562
563
+ private resolveBuiltinNotNullableType (
564
+ /** The type to resolve. */
565
+ node : NamedTypeNode ,
566
+ /** Contextual element. */
567
+ ctxElement : Element ,
568
+ /** Contextual types, i.e. `T`. */
569
+ ctxTypes : Map < string , Type > | null = null ,
570
+ /** How to proceed with eventual diagnostics. */
571
+ reportMode : ReportMode = ReportMode . REPORT
572
+ ) : Type | null {
573
+ const typeArgumentNode = this . ensureOneTypeArgument ( node , reportMode ) ;
574
+ if ( ! typeArgumentNode ) return null ;
575
+ var typeArgument = this . resolveType ( typeArgumentNode , ctxElement , ctxTypes , reportMode ) ;
576
+ if ( ! typeArgument ) return null ;
577
+ if ( ! typeArgument . isNullableReference ) return typeArgument ;
578
+ return typeArgument . nonNullableType ;
579
+ }
580
+
602
581
/** Resolves a type name to the program element it refers to. */
603
582
resolveTypeName (
604
583
/** The type name to resolve. */
@@ -3362,4 +3341,24 @@ export class Resolver extends DiagnosticEmitter {
3362
3341
}
3363
3342
return instance ;
3364
3343
}
3344
+
3345
+ private ensureOneTypeArgument (
3346
+ /** The type to resolve. */
3347
+ node : NamedTypeNode ,
3348
+ /** How to proceed with eventual diagnostics. */
3349
+ reportMode : ReportMode = ReportMode . REPORT
3350
+ ) : TypeNode | null {
3351
+ var typeArgumentNodes = node . typeArguments ;
3352
+ let numTypeArguments = 0 ;
3353
+ if ( ! typeArgumentNodes || ( numTypeArguments = typeArgumentNodes . length ) != 1 ) {
3354
+ if ( reportMode == ReportMode . REPORT ) {
3355
+ this . error (
3356
+ DiagnosticCode . Expected_0_type_arguments_but_got_1 ,
3357
+ node . range , "1" , numTypeArguments . toString ( )
3358
+ ) ;
3359
+ }
3360
+ return null ;
3361
+ }
3362
+ return typeArgumentNodes [ 0 ] ;
3363
+ }
3365
3364
}
0 commit comments