@@ -6260,7 +6260,6 @@ namespace ts {
6260
6260
scanner . scanRange ( start + 3 , length - 5 , ( ) => {
6261
6261
// Initially we can parse out a tag. We also have seen a starting asterisk.
6262
6262
// This is so that /** * @type */ doesn't parse.
6263
- let advanceToken = true ;
6264
6263
let state = JSDocState . SawAsterisk ;
6265
6264
let margin : number | undefined = undefined ;
6266
6265
// + 4 for leading '/** '
@@ -6292,7 +6291,6 @@ namespace ts {
6292
6291
// Real-world comments may break this rule, so "BeginningOfLine" will not be a real line beginning
6293
6292
// for malformed examples like `/** @param {string } x @returns {number } the length */`
6294
6293
state = JSDocState . BeginningOfLine ;
6295
- advanceToken = false ;
6296
6294
margin = undefined ;
6297
6295
indent ++ ;
6298
6296
}
@@ -6344,13 +6342,7 @@ namespace ts {
6344
6342
pushComment ( scanner . getTokenText ( ) ) ;
6345
6343
break ;
6346
6344
}
6347
- if ( advanceToken ) {
6348
- t = nextJSDocToken ( ) ;
6349
- }
6350
- else {
6351
- advanceToken = true ;
6352
- t = currentToken as JsDocSyntaxKind ;
6353
- }
6345
+ t = nextJSDocToken ( ) ;
6354
6346
}
6355
6347
removeLeadingNewlines ( comments ) ;
6356
6348
removeTrailingNewlines ( comments ) ;
@@ -6446,10 +6438,11 @@ namespace ts {
6446
6438
// a badly malformed tag should not be added to the list of tags
6447
6439
return ;
6448
6440
}
6449
- addTag ( tag , parseTagComments ( indent + tag . end - tag . pos ) ) ;
6441
+ tag . comment = parseTagComments ( indent + tag . end - tag . pos ) ;
6442
+ addTag ( tag ) ;
6450
6443
}
6451
6444
6452
- function parseTagComments ( indent : number ) {
6445
+ function parseTagComments ( indent : number ) : string | undefined {
6453
6446
const comments : string [ ] = [ ] ;
6454
6447
let state = JSDocState . BeginningOfLine ;
6455
6448
let margin : number | undefined ;
@@ -6471,6 +6464,8 @@ namespace ts {
6471
6464
indent = 0 ;
6472
6465
break ;
6473
6466
case SyntaxKind . AtToken :
6467
+ scanner . setTextPos ( scanner . getTextPos ( ) - 1 ) ;
6468
+ // falls through
6474
6469
case SyntaxKind . EndOfFileToken :
6475
6470
// Done
6476
6471
break loop;
@@ -6506,7 +6501,7 @@ namespace ts {
6506
6501
6507
6502
removeLeadingNewlines ( comments ) ;
6508
6503
removeTrailingNewlines ( comments ) ;
6509
- return comments ;
6504
+ return comments . length === 0 ? undefined : comments . join ( "" ) ;
6510
6505
}
6511
6506
6512
6507
function parseUnknownTag ( atToken : AtToken , tagName : Identifier ) {
@@ -6516,9 +6511,7 @@ namespace ts {
6516
6511
return finishNode ( result ) ;
6517
6512
}
6518
6513
6519
- function addTag ( tag : JSDocTag , comments : string [ ] ) : void {
6520
- tag . comment = comments . join ( "" ) ;
6521
-
6514
+ function addTag ( tag : JSDocTag ) : void {
6522
6515
if ( ! tags ) {
6523
6516
tags = [ tag ] ;
6524
6517
tagsPos = tag . pos ;
@@ -6563,9 +6556,7 @@ namespace ts {
6563
6556
}
6564
6557
}
6565
6558
6566
- function parseParameterOrPropertyTag ( atToken : AtToken , tagName : Identifier , target : PropertyLikeParse . Parameter ) : JSDocParameterTag ;
6567
- function parseParameterOrPropertyTag ( atToken : AtToken , tagName : Identifier , target : PropertyLikeParse . Property ) : JSDocPropertyTag ;
6568
- function parseParameterOrPropertyTag ( atToken : AtToken , tagName : Identifier , target : PropertyLikeParse ) : JSDocPropertyLikeTag {
6559
+ function parseParameterOrPropertyTag ( atToken : AtToken , tagName : Identifier , target : PropertyLikeParse ) : JSDocParameterTag | JSDocPropertyTag {
6569
6560
let typeExpression = tryParseTypeExpression ( ) ;
6570
6561
let isNameFirst = ! typeExpression ;
6571
6562
skipWhitespace ( ) ;
@@ -6577,7 +6568,7 @@ namespace ts {
6577
6568
typeExpression = tryParseTypeExpression ( ) ;
6578
6569
}
6579
6570
6580
- const result : JSDocPropertyLikeTag = target === PropertyLikeParse . Parameter ?
6571
+ const result = target === PropertyLikeParse . Parameter ?
6581
6572
< JSDocParameterTag > createNode ( SyntaxKind . JSDocParameterTag , atToken . pos ) :
6582
6573
< JSDocPropertyTag > createNode ( SyntaxKind . JSDocPropertyTag , atToken . pos ) ;
6583
6574
const nestedTypeLiteral = parseNestedTypeLiteral ( typeExpression , name ) ;
@@ -6592,7 +6583,6 @@ namespace ts {
6592
6583
result . isNameFirst = isNameFirst ;
6593
6584
result . isBracketed = isBracketed ;
6594
6585
return finishNode ( result ) ;
6595
-
6596
6586
}
6597
6587
6598
6588
function parseNestedTypeLiteral ( typeExpression : JSDocTypeExpression , name : EntityName ) {
@@ -6815,18 +6805,28 @@ namespace ts {
6815
6805
if ( ! tagName ) {
6816
6806
return false ;
6817
6807
}
6808
+ let t : PropertyLikeParse ;
6818
6809
switch ( tagName . escapedText ) {
6819
6810
case "type" :
6820
6811
return target === PropertyLikeParse . Property && parseTypeTag ( atToken , tagName ) ;
6821
6812
case "prop" :
6822
6813
case "property" :
6823
- return target === PropertyLikeParse . Property && parseParameterOrPropertyTag ( atToken , tagName , target ) ;
6814
+ t = PropertyLikeParse . Property ;
6815
+ break ;
6824
6816
case "arg" :
6825
6817
case "argument" :
6826
6818
case "param" :
6827
- return target === PropertyLikeParse . Parameter && parseParameterOrPropertyTag ( atToken , tagName , target ) ;
6819
+ t = PropertyLikeParse . Parameter ;
6820
+ break ;
6821
+ default :
6822
+ return false ;
6828
6823
}
6829
- return false ;
6824
+ if ( target !== t ) {
6825
+ return false ;
6826
+ }
6827
+ const tag = parseParameterOrPropertyTag ( atToken , tagName , target ) ;
6828
+ tag . comment = parseTagComments ( tag . end - tag . pos ) ;
6829
+ return tag ;
6830
6830
}
6831
6831
6832
6832
function parseTemplateTag ( atToken : AtToken , tagName : Identifier ) : JSDocTemplateTag | undefined {
0 commit comments