@@ -207,6 +207,8 @@ namespace ts {
207
207
visitNode ( cbNode , ( < AsExpression > node ) . type ) ;
208
208
case SyntaxKind . NonNullExpression :
209
209
return visitNode ( cbNode , ( < NonNullExpression > node ) . expression ) ;
210
+ case SyntaxKind . NonNullTypeNode :
211
+ return visitNode ( cbNode , ( < NonNullTypeNode > node ) . type ) ;
210
212
case SyntaxKind . MetaProperty :
211
213
return visitNode ( cbNode , ( < MetaProperty > node ) . name ) ;
212
214
case SyntaxKind . ConditionalExpression :
@@ -1959,6 +1961,7 @@ namespace ts {
1959
1961
while ( parseOptional ( SyntaxKind . DotToken ) ) {
1960
1962
if ( token ( ) === SyntaxKind . LessThanToken ) {
1961
1963
// the entity is part of a JSDoc-style generic, so record the trailing dot for later error reporting
1964
+ console . trace ( "parseEntityName:jsdocDotPos" ) ;
1962
1965
entity . jsdocDotPos = dotPos ;
1963
1966
break ;
1964
1967
}
@@ -2122,6 +2125,7 @@ namespace ts {
2122
2125
}
2123
2126
2124
2127
function parseJSDocUnknownOrNullableType ( ) : JSDocUnknownType | JSDocNullableType {
2128
+ console . trace ( "parseJSDocUnknownOrNullableType" ) ;
2125
2129
const pos = scanner . getStartPos ( ) ;
2126
2130
// skip the ?
2127
2131
nextToken ( ) ;
@@ -2657,6 +2661,7 @@ namespace ts {
2657
2661
case SyntaxKind . AsteriskToken :
2658
2662
return parseJSDocAllType ( ) ;
2659
2663
case SyntaxKind . QuestionToken :
2664
+ console . trace ( "parseNonArrayType:QuestionToken" ) ;
2660
2665
return parseJSDocUnknownOrNullableType ( ) ;
2661
2666
case SyntaxKind . FunctionKeyword :
2662
2667
return parseJSDocFunctionType ( ) ;
@@ -2794,7 +2799,31 @@ namespace ts {
2794
2799
case SyntaxKind . KeyOfKeyword :
2795
2800
return parseTypeOperator ( SyntaxKind . KeyOfKeyword ) ;
2796
2801
}
2797
- return parseArrayTypeOrHigher ( ) ;
2802
+ const type = parseArrayTypeOrHigher ( ) ;
2803
+ return parsePostfixTypeOperatorOrHigher ( type ) ;
2804
+ }
2805
+
2806
+ function parsePostfixTypeOperator ( type : TypeNode ) { // , operator: SyntaxKind.NonNullTypeNode
2807
+ // const node = <TypeOperatorNode>createNode(SyntaxKind.TypeOperator);
2808
+ const node = < NonNullTypeNode > createNode ( SyntaxKind . NonNullTypeNode ) ;
2809
+ // parseExpected(operator);
2810
+ parseExpected ( SyntaxKind . ExclamationToken ) ;
2811
+ // node.operator = operator;
2812
+ node . type = type ;
2813
+ return finishNode ( node ) ;
2814
+ }
2815
+
2816
+ function parsePostfixTypeOperatorOrHigher ( type : TypeNode ) : TypeNode {
2817
+ let postfixed : TypeNode ;
2818
+ switch ( token ( ) ) {
2819
+ case SyntaxKind . NonNullTypeNode :
2820
+ return parsePostfixTypeOperator ( type ) ; // , SyntaxKind.NonNullTypeNode
2821
+ }
2822
+ if ( postfixed ) {
2823
+ return parsePostfixTypeOperatorOrHigher ( postfixed ) ;
2824
+ } else {
2825
+ return type ;
2826
+ }
2798
2827
}
2799
2828
2800
2829
function parseUnionOrIntersectionType ( kind : SyntaxKind . UnionType | SyntaxKind . IntersectionType , parseConstituentType : ( ) => TypeNode , operator : SyntaxKind . BarToken | SyntaxKind . AmpersandToken ) : TypeNode {
0 commit comments