@@ -446,19 +446,16 @@ namespace ts {
446446 case SyntaxKind . JsxClosingElement :
447447 return visitNode ( cbNode , ( < JsxClosingElement > node ) . tagName ) ;
448448
449+ case SyntaxKind . OptionalType :
449450 case SyntaxKind . JSDocTypeExpression :
450- return visitNode ( cbNode , ( < JSDocTypeExpression > node ) . type ) ;
451451 case SyntaxKind . JSDocNonNullableType :
452- return visitNode ( cbNode , ( < JSDocNonNullableType > node ) . type ) ;
453452 case SyntaxKind . JSDocNullableType :
454- return visitNode ( cbNode , ( < JSDocNullableType > node ) . type ) ;
455453 case SyntaxKind . JSDocOptionalType :
456- return visitNode ( cbNode , ( < JSDocOptionalType > node ) . type ) ;
454+ case SyntaxKind . JSDocVariadicType :
455+ return visitNode ( cbNode , ( < OptionalTypeNode | JSDocTypeExpression | JSDocTypeReferencingNode > node ) . type ) ;
457456 case SyntaxKind . JSDocFunctionType :
458457 return visitNodes ( cbNode , cbNodes , ( < JSDocFunctionType > node ) . parameters ) ||
459458 visitNode ( cbNode , ( < JSDocFunctionType > node ) . type ) ;
460- case SyntaxKind . JSDocVariadicType :
461- return visitNode ( cbNode , ( < JSDocVariadicType > node ) . type ) ;
462459 case SyntaxKind . JSDocComment :
463460 return visitNodes ( cbNode , cbNodes , ( < JSDoc > node ) . tags ) ;
464461 case SyntaxKind . JSDocParameterTag :
@@ -2274,7 +2271,7 @@ namespace ts {
22742271 function parseJSDocAllType ( postFixEquals : boolean ) : JSDocAllType | JSDocOptionalType {
22752272 const result = createNode ( SyntaxKind . JSDocAllType ) as JSDocAllType ;
22762273 if ( postFixEquals ) {
2277- return createJSDocPostfixType ( SyntaxKind . JSDocOptionalType , result ) as JSDocOptionalType ;
2274+ return createPostfixType ( SyntaxKind . JSDocOptionalType , result ) as JSDocOptionalType ;
22782275 }
22792276 else {
22802277 nextToken ( ) ;
@@ -2352,7 +2349,7 @@ namespace ts {
23522349 type = finishNode ( variadic ) ;
23532350 }
23542351 if ( token ( ) === SyntaxKind . EqualsToken ) {
2355- return createJSDocPostfixType ( SyntaxKind . JSDocOptionalType , type ) ;
2352+ return createPostfixType ( SyntaxKind . JSDocOptionalType , type ) ;
23562353 }
23572354 return type ;
23582355 }
@@ -2766,9 +2763,17 @@ namespace ts {
27662763 return finishNode ( node ) ;
27672764 }
27682765
2766+ function parseTupleElementType ( ) {
2767+ const type = parseType ( ) ;
2768+ if ( ! ( contextFlags & NodeFlags . JSDoc ) && type . kind === SyntaxKind . JSDocNullableType && type . pos === ( < JSDocNullableType > type ) . type . pos ) {
2769+ type . kind = SyntaxKind . OptionalType ;
2770+ }
2771+ return type ;
2772+ }
2773+
27692774 function parseTupleType ( ) : TupleTypeNode {
27702775 const node = < TupleTypeNode > createNode ( SyntaxKind . TupleType ) ;
2771- node . elementTypes = parseBracketedList ( ParsingContext . TupleElementTypes , parseType , SyntaxKind . OpenBracketToken , SyntaxKind . CloseBracketToken ) ;
2776+ node . elementTypes = parseBracketedList ( ParsingContext . TupleElementTypes , parseTupleElementType , SyntaxKind . OpenBracketToken , SyntaxKind . CloseBracketToken ) ;
27722777 return finishNode ( node ) ;
27732778 }
27742779
@@ -2960,14 +2965,14 @@ namespace ts {
29602965 while ( ! scanner . hasPrecedingLineBreak ( ) ) {
29612966 switch ( token ( ) ) {
29622967 case SyntaxKind . ExclamationToken :
2963- type = createJSDocPostfixType ( SyntaxKind . JSDocNonNullableType , type ) ;
2968+ type = createPostfixType ( SyntaxKind . JSDocNonNullableType , type ) ;
29642969 break ;
29652970 case SyntaxKind . QuestionToken :
29662971 // If not in JSDoc and next token is start of a type we have a conditional type
29672972 if ( ! ( contextFlags & NodeFlags . JSDoc ) && lookAhead ( nextTokenIsStartOfType ) ) {
29682973 return type ;
29692974 }
2970- type = createJSDocPostfixType ( SyntaxKind . JSDocNullableType , type ) ;
2975+ type = createPostfixType ( SyntaxKind . JSDocNullableType , type ) ;
29712976 break ;
29722977 case SyntaxKind . OpenBracketToken :
29732978 parseExpected ( SyntaxKind . OpenBracketToken ) ;
@@ -2992,9 +2997,9 @@ namespace ts {
29922997 return type ;
29932998 }
29942999
2995- function createJSDocPostfixType ( kind : SyntaxKind , type : TypeNode ) {
3000+ function createPostfixType ( kind : SyntaxKind , type : TypeNode ) {
29963001 nextToken ( ) ;
2997- const postfix = createNode ( kind , type . pos ) as JSDocOptionalType | JSDocNonNullableType | JSDocNullableType ;
3002+ const postfix = createNode ( kind , type . pos ) as OptionalTypeNode | JSDocOptionalType | JSDocNonNullableType | JSDocNullableType ;
29983003 postfix . type = type ;
29993004 return finishNode ( postfix ) ;
30003005 }
0 commit comments