@@ -468,6 +468,8 @@ namespace ts {
468468 visitNode ( cbNode , ( < JSDocPropertyLikeTag > node ) . typeExpression )
469469 : visitNode ( cbNode , ( < JSDocPropertyLikeTag > node ) . typeExpression ) ||
470470 visitNode ( cbNode , ( < JSDocPropertyLikeTag > node ) . name ) ) ;
471+ case SyntaxKind . JSDocAuthorTag :
472+ return visitNode ( cbNode , ( node as JSDocTag ) . tagName ) ;
471473 case SyntaxKind . JSDocAugmentsTag :
472474 return visitNode ( cbNode , ( node as JSDocTag ) . tagName ) ||
473475 visitNode ( cbNode , ( < JSDocAugmentsTag > node ) . class ) ;
@@ -6621,6 +6623,9 @@ namespace ts {
66216623
66226624 let tag : JSDocTag | undefined ;
66236625 switch ( tagName . escapedText ) {
6626+ case "author" :
6627+ tag = parseAuthorTag ( start , tagName , margin ) ;
6628+ break ;
66246629 case "augments" :
66256630 case "extends" :
66266631 tag = parseAugmentsTag ( start , tagName ) ;
@@ -6900,6 +6905,69 @@ namespace ts {
69006905 return finishNode ( result ) ;
69016906 }
69026907
6908+ function parseAuthorTag ( start : number , tagName : Identifier , indent : number ) : JSDocAuthorTag {
6909+ const result = < JSDocAuthorTag > createNode ( SyntaxKind . JSDocAuthorTag , start ) ;
6910+ result . tagName = tagName ;
6911+
6912+ const authorInfoWithEmail = tryParse ( ( ) => tryParseAuthorNameAndEmail ( ) ) ;
6913+ if ( ! authorInfoWithEmail ) {
6914+ return finishNode ( result ) ;
6915+ }
6916+
6917+ result . comment = authorInfoWithEmail ;
6918+
6919+ if ( lookAhead ( ( ) => nextToken ( ) !== SyntaxKind . NewLineTrivia ) ) {
6920+ const comment = parseTagComments ( indent ) ;
6921+ if ( comment ) {
6922+ result . comment += comment ;
6923+ }
6924+ }
6925+
6926+ return finishNode ( result ) ;
6927+ }
6928+
6929+ function tryParseAuthorNameAndEmail ( ) : string | undefined {
6930+ const comments : string [ ] = [ ] ;
6931+ let seenLessThan = false ;
6932+ let seenGreaterThan = false ;
6933+ let token = scanner . getToken ( ) ;
6934+
6935+ loop: while ( true ) {
6936+ switch ( token ) {
6937+ case SyntaxKind . Identifier :
6938+ case SyntaxKind . WhitespaceTrivia :
6939+ case SyntaxKind . DotToken :
6940+ case SyntaxKind . AtToken :
6941+ comments . push ( scanner . getTokenText ( ) ) ;
6942+ break ;
6943+ case SyntaxKind . LessThanToken :
6944+ if ( seenLessThan || seenGreaterThan ) {
6945+ return ;
6946+ }
6947+ seenLessThan = true ;
6948+ comments . push ( scanner . getTokenText ( ) ) ;
6949+ break ;
6950+ case SyntaxKind . GreaterThanToken :
6951+ if ( ! seenLessThan || seenGreaterThan ) {
6952+ return ;
6953+ }
6954+ seenGreaterThan = true ;
6955+ comments . push ( scanner . getTokenText ( ) ) ;
6956+ scanner . setTextPos ( scanner . getTokenPos ( ) + 1 ) ;
6957+ break loop;
6958+ case SyntaxKind . NewLineTrivia :
6959+ case SyntaxKind . EndOfFileToken :
6960+ break loop;
6961+ }
6962+
6963+ token = nextTokenJSDoc ( ) ;
6964+ }
6965+
6966+ if ( seenLessThan && seenGreaterThan ) {
6967+ return comments . length === 0 ? undefined : comments . join ( "" ) ;
6968+ }
6969+ }
6970+
69036971 function parseAugmentsTag ( start : number , tagName : Identifier ) : JSDocAugmentsTag {
69046972 const result = < JSDocAugmentsTag > createNode ( SyntaxKind . JSDocAugmentsTag , start ) ;
69056973 result . tagName = tagName ;
0 commit comments