@@ -6486,54 +6486,42 @@ namespace ts {
6486
6486
6487
6487
const tagName = parseJSDocIdentifierName ( ) ;
6488
6488
skipWhitespace ( ) ;
6489
- if ( ! tagName ) {
6490
- return ;
6491
- }
6492
6489
6493
6490
let tag : JSDocTag | undefined ;
6494
- if ( tagName ) {
6495
- switch ( tagName . escapedText ) {
6496
- case "augments" :
6497
- case "extends" :
6498
- tag = parseAugmentsTag ( atToken , tagName ) ;
6499
- break ;
6500
- case "class" :
6501
- case "constructor" :
6502
- tag = parseClassTag ( atToken , tagName ) ;
6503
- break ;
6504
- case "arg" :
6505
- case "argument" :
6506
- case "param" :
6507
- return parseParameterOrPropertyTag ( atToken , tagName , PropertyLikeParse . Parameter , indent ) ;
6508
- case "return" :
6509
- case "returns" :
6510
- tag = parseReturnTag ( atToken , tagName ) ;
6511
- break ;
6512
- case "template" :
6513
- tag = parseTemplateTag ( atToken , tagName ) ;
6514
- break ;
6515
- case "type" :
6516
- tag = parseTypeTag ( atToken , tagName ) ;
6517
- break ;
6518
- case "typedef" :
6519
- tag = parseTypedefTag ( atToken , tagName , indent ) ;
6520
- break ;
6521
- case "callback" :
6522
- tag = parseCallbackTag ( atToken , tagName , indent ) ;
6523
- break ;
6524
- default :
6525
- tag = parseUnknownTag ( atToken , tagName ) ;
6526
- break ;
6527
- }
6528
- }
6529
- else {
6530
- tag = parseUnknownTag ( atToken , tagName ) ;
6491
+ switch ( tagName . escapedText ) {
6492
+ case "augments" :
6493
+ case "extends" :
6494
+ tag = parseAugmentsTag ( atToken , tagName ) ;
6495
+ break ;
6496
+ case "class" :
6497
+ case "constructor" :
6498
+ tag = parseClassTag ( atToken , tagName ) ;
6499
+ break ;
6500
+ case "arg" :
6501
+ case "argument" :
6502
+ case "param" :
6503
+ return parseParameterOrPropertyTag ( atToken , tagName , PropertyLikeParse . Parameter , indent ) ;
6504
+ case "return" :
6505
+ case "returns" :
6506
+ tag = parseReturnTag ( atToken , tagName ) ;
6507
+ break ;
6508
+ case "template" :
6509
+ tag = parseTemplateTag ( atToken , tagName ) ;
6510
+ break ;
6511
+ case "type" :
6512
+ tag = parseTypeTag ( atToken , tagName ) ;
6513
+ break ;
6514
+ case "typedef" :
6515
+ tag = parseTypedefTag ( atToken , tagName , indent ) ;
6516
+ break ;
6517
+ case "callback" :
6518
+ tag = parseCallbackTag ( atToken , tagName , indent ) ;
6519
+ break ;
6520
+ default :
6521
+ tag = parseUnknownTag ( atToken , tagName ) ;
6522
+ break ;
6531
6523
}
6532
6524
6533
- if ( ! tag ) {
6534
- // a badly malformed tag should not be added to the list of tags
6535
- return ;
6536
- }
6537
6525
if ( ! tag . comment ) {
6538
6526
// some tags, like typedef and callback, have already parsed their comments earlier
6539
6527
tag . comment = parseTagComments ( indent + tag . end - tag . pos ) ;
@@ -6763,11 +6751,11 @@ namespace ts {
6763
6751
}
6764
6752
6765
6753
function parsePropertyAccessEntityNameExpression ( ) {
6766
- let node : Identifier | PropertyAccessEntityNameExpression = parseJSDocIdentifierName ( /*createIfMissing*/ true ) ;
6754
+ let node : Identifier | PropertyAccessEntityNameExpression = parseJSDocIdentifierName ( ) ;
6767
6755
while ( parseOptional ( SyntaxKind . DotToken ) ) {
6768
6756
const prop : PropertyAccessEntityNameExpression = createNode ( SyntaxKind . PropertyAccessExpression , node . pos ) as PropertyAccessEntityNameExpression ;
6769
6757
prop . expression = node ;
6770
- prop . name = parseJSDocIdentifierName ( ) ! ; // TODO: GH#18217
6758
+ prop . name = parseJSDocIdentifierName ( ) ;
6771
6759
node = finishNode ( prop ) ;
6772
6760
}
6773
6761
return node ;
@@ -6832,9 +6820,11 @@ namespace ts {
6832
6820
6833
6821
function parseJSDocTypeNameWithNamespace ( nested ?: boolean ) {
6834
6822
const pos = scanner . getTokenPos ( ) ;
6823
+ if ( ! tokenIsIdentifierOrKeyword ( token ( ) ) ) {
6824
+ return undefined ;
6825
+ }
6835
6826
const typeNameOrNamespaceName = parseJSDocIdentifierName ( ) ;
6836
-
6837
- if ( typeNameOrNamespaceName && parseOptional ( SyntaxKind . DotToken ) ) {
6827
+ if ( parseOptional ( SyntaxKind . DotToken ) ) {
6838
6828
const jsDocNamespaceNode = < JSDocNamespaceDeclaration > createNode ( SyntaxKind . ModuleDeclaration , pos ) ;
6839
6829
if ( nested ) {
6840
6830
jsDocNamespaceNode . flags |= NodeFlags . NestedNamespace ;
@@ -6844,7 +6834,7 @@ namespace ts {
6844
6834
return finishNode ( jsDocNamespaceNode ) ;
6845
6835
}
6846
6836
6847
- if ( typeNameOrNamespaceName && nested ) {
6837
+ if ( nested ) {
6848
6838
typeNameOrNamespaceName . isInJSDocNamespace = true ;
6849
6839
}
6850
6840
return typeNameOrNamespaceName ;
@@ -6954,9 +6944,6 @@ namespace ts {
6954
6944
6955
6945
const tagName = parseJSDocIdentifierName ( ) ;
6956
6946
skipWhitespace ( ) ;
6957
- if ( ! tagName ) {
6958
- return false ;
6959
- }
6960
6947
let t : PropertyLikeParse ;
6961
6948
switch ( tagName . escapedText ) {
6962
6949
case "type" :
@@ -6981,7 +6968,7 @@ namespace ts {
6981
6968
return tag ;
6982
6969
}
6983
6970
6984
- function parseTemplateTag ( atToken : AtToken , tagName : Identifier ) : JSDocTemplateTag | undefined {
6971
+ function parseTemplateTag ( atToken : AtToken , tagName : Identifier ) : JSDocTemplateTag {
6985
6972
// the template tag looks like '@template {Constraint} T,U,V'
6986
6973
let constraint : JSDocTypeExpression | undefined ;
6987
6974
if ( token ( ) === SyntaxKind . OpenBraceToken ) {
@@ -6993,11 +6980,7 @@ namespace ts {
6993
6980
do {
6994
6981
skipWhitespace ( ) ;
6995
6982
const typeParameter = < TypeParameterDeclaration > createNode ( SyntaxKind . TypeParameter ) ;
6996
- if ( ! tokenIsIdentifierOrKeyword ( token ( ) ) ) {
6997
- parseErrorAtCurrentToken ( Diagnostics . Unexpected_token_A_type_parameter_name_was_expected_without_curly_braces ) ;
6998
- return undefined ;
6999
- }
7000
- typeParameter . name = parseJSDocIdentifierName ( ) ! ;
6983
+ typeParameter . name = parseJSDocIdentifierName ( Diagnostics . Unexpected_token_A_type_parameter_name_was_expected_without_curly_braces ) ;
7001
6984
skipWhitespace ( ) ;
7002
6985
finishNode ( typeParameter ) ;
7003
6986
typeParameters . push ( typeParameter ) ;
@@ -7028,15 +7011,15 @@ namespace ts {
7028
7011
}
7029
7012
7030
7013
function parseJSDocEntityName ( ) : EntityName {
7031
- let entity : EntityName = parseJSDocIdentifierName ( /*createIfMissing*/ true ) ;
7014
+ let entity : EntityName = parseJSDocIdentifierName ( ) ;
7032
7015
if ( parseOptional ( SyntaxKind . OpenBracketToken ) ) {
7033
7016
parseExpected ( SyntaxKind . CloseBracketToken ) ;
7034
7017
// Note that y[] is accepted as an entity name, but the postfix brackets are not saved for checking.
7035
7018
// Technically usejsdoc.org requires them for specifying a property of a type equivalent to Array<{ x: ...}>
7036
7019
// but it's not worth it to enforce that restriction.
7037
7020
}
7038
7021
while ( parseOptional ( SyntaxKind . DotToken ) ) {
7039
- const name = parseJSDocIdentifierName ( /*createIfMissing*/ true ) ;
7022
+ const name = parseJSDocIdentifierName ( ) ;
7040
7023
if ( parseOptional ( SyntaxKind . OpenBracketToken ) ) {
7041
7024
parseExpected ( SyntaxKind . CloseBracketToken ) ;
7042
7025
}
@@ -7045,17 +7028,9 @@ namespace ts {
7045
7028
return entity ;
7046
7029
}
7047
7030
7048
- function parseJSDocIdentifierName ( ) : Identifier | undefined ;
7049
- function parseJSDocIdentifierName ( createIfMissing : true ) : Identifier ;
7050
- function parseJSDocIdentifierName ( createIfMissing = false ) : Identifier | undefined {
7031
+ function parseJSDocIdentifierName ( message ?: DiagnosticMessage ) : Identifier {
7051
7032
if ( ! tokenIsIdentifierOrKeyword ( token ( ) ) ) {
7052
- if ( createIfMissing ) {
7053
- return createMissingNode < Identifier > ( SyntaxKind . Identifier , /*reportAtCurrentPosition*/ true , Diagnostics . Identifier_expected ) ;
7054
- }
7055
- else {
7056
- parseErrorAtCurrentToken ( Diagnostics . Identifier_expected ) ;
7057
- return undefined ;
7058
- }
7033
+ return createMissingNode < Identifier > ( SyntaxKind . Identifier , /*reportAtCurrentPosition*/ ! message , message || Diagnostics . Identifier_expected ) ;
7059
7034
}
7060
7035
7061
7036
const pos = scanner . getTokenPos ( ) ;
0 commit comments