@@ -1449,10 +1449,16 @@ namespace ts {
1449
1449
} , tags => tags ) ;
1450
1450
}
1451
1451
1452
- function getJSDocs < T > ( node : Node , checkParentVariableStatement : boolean , getDocs : ( docs : JSDoc [ ] ) => T [ ] , getTags : ( tags : JSDocTag [ ] ) => T [ ] ) : T [ ] {
1452
+ function getJSDocs < T > ( node : Node ,
1453
+ checkParentVariableStatement : boolean ,
1454
+ getDocContent : ( docs : JSDoc [ ] ) => T [ ] ,
1455
+ getTagContent : ( tags : JSDocTag [ ] ) => T [ ] ) : T [ ] {
1453
1456
// TODO: A lot of this work should be cached, maybe. I guess it's only used in services right now...
1457
+ // This will be hard because it may need to cache parentvariable versions and nonparent versions
1458
+ // maybe I should eliminate checkParent first ...
1454
1459
let result : T [ ] = undefined ;
1455
1460
// prepend documentation from parent sources
1461
+ // TODO: Probably always want checkParent=true, right?
1456
1462
if ( checkParentVariableStatement ) {
1457
1463
// Try to recognize this pattern when node is initializer of variable declaration and JSDoc comments are on containing variable statement.
1458
1464
// /**
@@ -1472,11 +1478,11 @@ namespace ts {
1472
1478
isVariableOfVariableDeclarationStatement ? node . parent . parent :
1473
1479
undefined ;
1474
1480
if ( variableStatementNode ) {
1475
- result = concatenate ( result , getJSDocs ( variableStatementNode , checkParentVariableStatement , getDocs , getTags ) ) ;
1481
+ result = concatenate ( result , getJSDocs ( variableStatementNode , checkParentVariableStatement , getDocContent , getTagContent ) ) ;
1476
1482
}
1477
1483
if ( node . kind === SyntaxKind . ModuleDeclaration &&
1478
1484
node . parent && node . parent . kind === SyntaxKind . ModuleDeclaration ) {
1479
- result = concatenate ( result , getJSDocs ( node . parent , checkParentVariableStatement , getDocs , getTags ) ) ;
1485
+ result = concatenate ( result , getJSDocs ( node . parent , checkParentVariableStatement , getDocContent , getTagContent ) ) ;
1480
1486
}
1481
1487
1482
1488
// Also recognize when the node is the RHS of an assignment expression
@@ -1487,40 +1493,42 @@ namespace ts {
1487
1493
( parent as BinaryExpression ) . operatorToken . kind === SyntaxKind . EqualsToken &&
1488
1494
parent . parent . kind === SyntaxKind . ExpressionStatement ;
1489
1495
if ( isSourceOfAssignmentExpressionStatement ) {
1490
- result = concatenate ( result , getJSDocs ( parent . parent , checkParentVariableStatement , getDocs , getTags ) ) ;
1496
+ result = concatenate ( result , getJSDocs ( parent . parent , checkParentVariableStatement , getDocContent , getTagContent ) ) ;
1491
1497
}
1492
1498
1493
1499
const isPropertyAssignmentExpression = parent && parent . kind === SyntaxKind . PropertyAssignment ;
1494
1500
if ( isPropertyAssignmentExpression ) {
1495
- result = concatenate ( result , getJSDocs ( parent , checkParentVariableStatement , getDocs , getTags ) ) ;
1501
+ result = concatenate ( result , getJSDocs ( parent , checkParentVariableStatement , getDocContent , getTagContent ) ) ;
1496
1502
}
1497
1503
1498
1504
// Pull parameter comments from declaring function as well
1499
1505
if ( node . kind === SyntaxKind . Parameter ) {
1500
1506
const paramTags = getJSDocParameterTag ( node as ParameterDeclaration , checkParentVariableStatement ) ;
1501
1507
if ( paramTags ) {
1502
- result = concatenate ( result , getTags ( paramTags ) ) ;
1508
+ result = concatenate ( result , getTagContent ( paramTags ) ) ;
1503
1509
}
1504
1510
}
1505
1511
}
1506
1512
1507
1513
if ( isVariableLike ( node ) && node . initializer ) {
1508
- result = concatenate ( result , getJSDocs ( node . initializer , /*checkParentVariableStatement*/ false , getDocs , getTags ) ) ;
1514
+ // TODO: Does this really need to be called for everything?
1515
+ result = concatenate ( result , getJSDocs ( node . initializer , /*checkParentVariableStatement*/ false , getDocContent , getTagContent ) ) ;
1509
1516
}
1510
1517
1511
1518
if ( node . jsDocComments ) {
1512
1519
if ( result ) {
1513
- result = concatenate ( result , getDocs ( node . jsDocComments ) ) ;
1520
+ result = concatenate ( result , getDocContent ( node . jsDocComments ) ) ;
1514
1521
}
1515
1522
else {
1516
- return getDocs ( node . jsDocComments ) ;
1523
+ return getDocContent ( node . jsDocComments ) ;
1517
1524
}
1518
1525
}
1519
1526
1520
1527
return result ;
1521
1528
}
1522
1529
1523
1530
function getJSDocParameterTag ( param : ParameterDeclaration , checkParentVariableStatement : boolean ) : JSDocTag [ ] {
1531
+ // TODO: getCorrespondingJSDocParameterTag is basically the same as this, except worse. (and typed, singleton return)
1524
1532
const func = param . parent as FunctionLikeDeclaration ;
1525
1533
const tags = getJSDocTags ( func , checkParentVariableStatement ) ;
1526
1534
if ( ! param . name ) {
@@ -1545,16 +1553,19 @@ namespace ts {
1545
1553
}
1546
1554
}
1547
1555
1548
- export function getJSDocTypeTag ( node : Node ) : JSDocTypeTag {
1549
- return < JSDocTypeTag > getJSDocTag ( node , SyntaxKind . JSDocTypeTag , /*checkParentVariableStatement*/ false ) ;
1556
+ export function getJSDocTypeTag ( node : Node , checkParentVariableStatement ?: boolean ) : JSDocTypeTag | JSDocParameterTag {
1557
+ // TODO: Get rid of the second parameter again
1558
+ // TODO: Don't call getJSDocTag twice. Call a version that allows you to retrieve either kind.
1559
+ return getJSDocTag ( node , SyntaxKind . JSDocTypeTag , checkParentVariableStatement ) as JSDocTypeTag ||
1560
+ node . kind === SyntaxKind . Parameter && firstOrUndefined ( getJSDocParameterTag ( node as ParameterDeclaration , checkParentVariableStatement ) ) as JSDocParameterTag ;
1550
1561
}
1551
1562
1552
1563
export function getJSDocReturnTag ( node : Node ) : JSDocReturnTag {
1553
- return < JSDocReturnTag > getJSDocTag ( node , SyntaxKind . JSDocReturnTag , /*checkParentVariableStatement*/ true ) ;
1564
+ return getJSDocTag ( node , SyntaxKind . JSDocReturnTag , /*checkParentVariableStatement*/ true ) as JSDocReturnTag ;
1554
1565
}
1555
1566
1556
1567
export function getJSDocTemplateTag ( node : Node ) : JSDocTemplateTag {
1557
- return < JSDocTemplateTag > getJSDocTag ( node , SyntaxKind . JSDocTemplateTag , /*checkParentVariableStatement*/ false ) ;
1568
+ return getJSDocTag ( node , SyntaxKind . JSDocTemplateTag , /*checkParentVariableStatement*/ false ) as JSDocTemplateTag ;
1558
1569
}
1559
1570
1560
1571
export function getCorrespondingJSDocParameterTag ( parameter : ParameterDeclaration ) : JSDocParameterTag {
0 commit comments