@@ -551,6 +551,7 @@ namespace ts {
551
551
case SyntaxKind . JSDocPrivateTag :
552
552
case SyntaxKind . JSDocProtectedTag :
553
553
case SyntaxKind . JSDocReadonlyTag :
554
+ case SyntaxKind . JSDocDeprecatedTag :
554
555
return visitNode ( cbNode , ( node as JSDocTag ) . tagName )
555
556
|| ( typeof ( node as JSDoc ) . comment === "string" ? undefined : visitNodes ( cbNode , cbNodes , ( node as JSDoc ) . comment as NodeArray < JSDocText | JSDocLink > | undefined ) ) ;
556
557
case SyntaxKind . PartiallyEmittedExpression :
@@ -1335,24 +1336,27 @@ namespace ts {
1335
1336
return inContext ( NodeFlags . AwaitContext ) ;
1336
1337
}
1337
1338
1338
- function parseErrorAtCurrentToken ( message : DiagnosticMessage , arg0 ?: any ) : void {
1339
- parseErrorAt ( scanner . getTokenPos ( ) , scanner . getTextPos ( ) , message , arg0 ) ;
1339
+ function parseErrorAtCurrentToken ( message : DiagnosticMessage , arg0 ?: any ) : DiagnosticWithDetachedLocation | undefined {
1340
+ return parseErrorAt ( scanner . getTokenPos ( ) , scanner . getTextPos ( ) , message , arg0 ) ;
1340
1341
}
1341
1342
1342
- function parseErrorAtPosition ( start : number , length : number , message : DiagnosticMessage , arg0 ?: any ) : void {
1343
+ function parseErrorAtPosition ( start : number , length : number , message : DiagnosticMessage , arg0 ?: any ) : DiagnosticWithDetachedLocation | undefined {
1343
1344
// Don't report another error if it would just be at the same position as the last error.
1344
1345
const lastError = lastOrUndefined ( parseDiagnostics ) ;
1346
+ let result : DiagnosticWithDetachedLocation | undefined ;
1345
1347
if ( ! lastError || start !== lastError . start ) {
1346
- parseDiagnostics . push ( createDetachedDiagnostic ( fileName , start , length , message , arg0 ) ) ;
1348
+ result = createDetachedDiagnostic ( fileName , start , length , message , arg0 ) ;
1349
+ parseDiagnostics . push ( result ) ;
1347
1350
}
1348
1351
1349
1352
// Mark that we've encountered an error. We'll set an appropriate bit on the next
1350
1353
// node we finish so that it can't be reused incrementally.
1351
1354
parseErrorBeforeNextFinishedNode = true ;
1355
+ return result ;
1352
1356
}
1353
1357
1354
- function parseErrorAt ( start : number , end : number , message : DiagnosticMessage , arg0 ?: any ) : void {
1355
- parseErrorAtPosition ( start , end - start , message , arg0 ) ;
1358
+ function parseErrorAt ( start : number , end : number , message : DiagnosticMessage , arg0 ?: any ) : DiagnosticWithDetachedLocation | undefined {
1359
+ return parseErrorAtPosition ( start , end - start , message , arg0 ) ;
1356
1360
}
1357
1361
1358
1362
function parseErrorAtRange ( range : TextRange , message : DiagnosticMessage , arg0 ?: any ) : void {
@@ -1542,6 +1546,20 @@ namespace ts {
1542
1546
return false ;
1543
1547
}
1544
1548
1549
+ function parseExpectedMatchingBrackets ( openKind : SyntaxKind , closeKind : SyntaxKind , openPosition : number ) {
1550
+ if ( token ( ) === closeKind ) {
1551
+ nextToken ( ) ;
1552
+ return ;
1553
+ }
1554
+ const lastError = parseErrorAtCurrentToken ( Diagnostics . _0_expected , tokenToString ( closeKind ) ) ;
1555
+ if ( lastError ) {
1556
+ addRelatedInfo (
1557
+ lastError ,
1558
+ createDetachedDiagnostic ( fileName , openPosition , 1 , Diagnostics . The_parser_expected_to_find_a_1_to_match_the_0_token_here , tokenToString ( openKind ) , tokenToString ( closeKind ) )
1559
+ ) ;
1560
+ }
1561
+ }
1562
+
1545
1563
function parseOptional ( t : SyntaxKind ) : boolean {
1546
1564
if ( token ( ) === t ) {
1547
1565
nextToken ( ) ;
@@ -2092,8 +2110,7 @@ namespace ts {
2092
2110
2093
2111
while ( ! isListTerminator ( kind ) ) {
2094
2112
if ( isListElement ( kind , /*inErrorRecovery*/ false ) ) {
2095
- const element = parseListElement ( kind , parseElement ) ;
2096
- list . push ( element ) ;
2113
+ list . push ( parseListElement ( kind , parseElement ) ) ;
2097
2114
2098
2115
continue ;
2099
2116
}
@@ -5426,10 +5443,11 @@ namespace ts {
5426
5443
5427
5444
function parseArrayLiteralExpression ( ) : ArrayLiteralExpression {
5428
5445
const pos = getNodePos ( ) ;
5446
+ const openBracketPosition = scanner . getTokenPos ( ) ;
5429
5447
parseExpected ( SyntaxKind . OpenBracketToken ) ;
5430
5448
const multiLine = scanner . hasPrecedingLineBreak ( ) ;
5431
5449
const elements = parseDelimitedList ( ParsingContext . ArrayLiteralMembers , parseArgumentOrArrayLiteralElement ) ;
5432
- parseExpected ( SyntaxKind . CloseBracketToken ) ;
5450
+ parseExpectedMatchingBrackets ( SyntaxKind . OpenBracketToken , SyntaxKind . CloseBracketToken , openBracketPosition ) ;
5433
5451
return finishNode ( factory . createArrayLiteralExpression ( elements , multiLine ) , pos ) ;
5434
5452
}
5435
5453
@@ -5498,15 +5516,7 @@ namespace ts {
5498
5516
parseExpected ( SyntaxKind . OpenBraceToken ) ;
5499
5517
const multiLine = scanner . hasPrecedingLineBreak ( ) ;
5500
5518
const properties = parseDelimitedList ( ParsingContext . ObjectLiteralMembers , parseObjectLiteralElement , /*considerSemicolonAsDelimiter*/ true ) ;
5501
- if ( ! parseExpected ( SyntaxKind . CloseBraceToken ) ) {
5502
- const lastError = lastOrUndefined ( parseDiagnostics ) ;
5503
- if ( lastError && lastError . code === Diagnostics . _0_expected . code ) {
5504
- addRelatedInfo (
5505
- lastError ,
5506
- createDetachedDiagnostic ( fileName , openBracePosition , 1 , Diagnostics . The_parser_expected_to_find_a_to_match_the_token_here )
5507
- ) ;
5508
- }
5509
- }
5519
+ parseExpectedMatchingBrackets ( SyntaxKind . OpenBraceToken , SyntaxKind . CloseBraceToken , openBracePosition ) ;
5510
5520
return finishNode ( factory . createObjectLiteralExpression ( properties , multiLine ) , pos ) ;
5511
5521
}
5512
5522
@@ -5591,16 +5601,14 @@ namespace ts {
5591
5601
if ( parseExpected ( SyntaxKind . OpenBraceToken , diagnosticMessage ) || ignoreMissingOpenBrace ) {
5592
5602
const multiLine = scanner . hasPrecedingLineBreak ( ) ;
5593
5603
const statements = parseList ( ParsingContext . BlockStatements , parseStatement ) ;
5594
- if ( ! parseExpected ( SyntaxKind . CloseBraceToken ) ) {
5595
- const lastError = lastOrUndefined ( parseDiagnostics ) ;
5596
- if ( lastError && lastError . code === Diagnostics . _0_expected . code ) {
5597
- addRelatedInfo (
5598
- lastError ,
5599
- createDetachedDiagnostic ( fileName , openBracePosition , 1 , Diagnostics . The_parser_expected_to_find_a_to_match_the_token_here )
5600
- ) ;
5601
- }
5604
+ parseExpectedMatchingBrackets ( SyntaxKind . OpenBraceToken , SyntaxKind . CloseBraceToken , openBracePosition ) ;
5605
+ const result = finishNode ( factory . createBlock ( statements , multiLine ) , pos ) ;
5606
+ if ( token ( ) === SyntaxKind . EqualsToken ) {
5607
+ parseErrorAtCurrentToken ( Diagnostics . Declaration_or_statement_expected_This_follows_a_block_of_statements_so_if_you_intended_to_write_a_destructuring_assignment_you_might_need_to_wrap_the_the_whole_assignment_in_parentheses ) ;
5608
+ nextToken ( ) ;
5602
5609
}
5603
- return finishNode ( factory . createBlock ( statements , multiLine ) , pos ) ;
5610
+
5611
+ return result ;
5604
5612
}
5605
5613
else {
5606
5614
const statements = createMissingList < Statement > ( ) ;
@@ -5647,9 +5655,10 @@ namespace ts {
5647
5655
function parseIfStatement ( ) : IfStatement {
5648
5656
const pos = getNodePos ( ) ;
5649
5657
parseExpected ( SyntaxKind . IfKeyword ) ;
5658
+ const openParenPosition = scanner . getTokenPos ( ) ;
5650
5659
parseExpected ( SyntaxKind . OpenParenToken ) ;
5651
5660
const expression = allowInAnd ( parseExpression ) ;
5652
- parseExpected ( SyntaxKind . CloseParenToken ) ;
5661
+ parseExpectedMatchingBrackets ( SyntaxKind . OpenParenToken , SyntaxKind . CloseParenToken , openParenPosition ) ;
5653
5662
const thenStatement = parseStatement ( ) ;
5654
5663
const elseStatement = parseOptional ( SyntaxKind . ElseKeyword ) ? parseStatement ( ) : undefined ;
5655
5664
return finishNode ( factory . createIfStatement ( expression , thenStatement , elseStatement ) , pos ) ;
@@ -5660,9 +5669,10 @@ namespace ts {
5660
5669
parseExpected ( SyntaxKind . DoKeyword ) ;
5661
5670
const statement = parseStatement ( ) ;
5662
5671
parseExpected ( SyntaxKind . WhileKeyword ) ;
5672
+ const openParenPosition = scanner . getTokenPos ( ) ;
5663
5673
parseExpected ( SyntaxKind . OpenParenToken ) ;
5664
5674
const expression = allowInAnd ( parseExpression ) ;
5665
- parseExpected ( SyntaxKind . CloseParenToken ) ;
5675
+ parseExpectedMatchingBrackets ( SyntaxKind . OpenParenToken , SyntaxKind . CloseParenToken , openParenPosition ) ;
5666
5676
5667
5677
// From: https://mail.mozilla.org/pipermail/es-discuss/2011-August/016188.html
5668
5678
// 157 min --- All allen at wirfs-brock.com CONF --- "do{;}while(false)false" prohibited in
@@ -5675,9 +5685,10 @@ namespace ts {
5675
5685
function parseWhileStatement ( ) : WhileStatement {
5676
5686
const pos = getNodePos ( ) ;
5677
5687
parseExpected ( SyntaxKind . WhileKeyword ) ;
5688
+ const openParenPosition = scanner . getTokenPos ( ) ;
5678
5689
parseExpected ( SyntaxKind . OpenParenToken ) ;
5679
5690
const expression = allowInAnd ( parseExpression ) ;
5680
- parseExpected ( SyntaxKind . CloseParenToken ) ;
5691
+ parseExpectedMatchingBrackets ( SyntaxKind . OpenParenToken , SyntaxKind . CloseParenToken , openParenPosition ) ;
5681
5692
const statement = parseStatement ( ) ;
5682
5693
return finishNode ( factory . createWhileStatement ( expression , statement ) , pos ) ;
5683
5694
}
@@ -5749,9 +5760,10 @@ namespace ts {
5749
5760
function parseWithStatement ( ) : WithStatement {
5750
5761
const pos = getNodePos ( ) ;
5751
5762
parseExpected ( SyntaxKind . WithKeyword ) ;
5763
+ const openParenPosition = scanner . getTokenPos ( ) ;
5752
5764
parseExpected ( SyntaxKind . OpenParenToken ) ;
5753
5765
const expression = allowInAnd ( parseExpression ) ;
5754
- parseExpected ( SyntaxKind . CloseParenToken ) ;
5766
+ parseExpectedMatchingBrackets ( SyntaxKind . OpenParenToken , SyntaxKind . CloseParenToken , openParenPosition ) ;
5755
5767
const statement = doInsideOfContext ( NodeFlags . InWithStatement , parseStatement ) ;
5756
5768
return finishNode ( factory . createWithStatement ( expression , statement ) , pos ) ;
5757
5769
}
@@ -7973,13 +7985,9 @@ namespace ts {
7973
7985
hasChildren = true ;
7974
7986
if ( child . kind === SyntaxKind . JSDocTypeTag ) {
7975
7987
if ( childTypeTag ) {
7976
- parseErrorAtCurrentToken ( Diagnostics . A_JSDoc_typedef_comment_may_not_contain_multiple_type_tags ) ;
7977
- const lastError = lastOrUndefined ( parseDiagnostics ) ;
7988
+ const lastError = parseErrorAtCurrentToken ( Diagnostics . A_JSDoc_typedef_comment_may_not_contain_multiple_type_tags ) ;
7978
7989
if ( lastError ) {
7979
- addRelatedInfo (
7980
- lastError ,
7981
- createDetachedDiagnostic ( fileName , 0 , 0 , Diagnostics . The_tag_was_first_specified_here )
7982
- ) ;
7990
+ addRelatedInfo ( lastError , createDetachedDiagnostic ( fileName , 0 , 0 , Diagnostics . The_tag_was_first_specified_here ) ) ;
7983
7991
}
7984
7992
break ;
7985
7993
}
@@ -8011,7 +8019,7 @@ namespace ts {
8011
8019
}
8012
8020
8013
8021
const typedefTag = factory . createJSDocTypedefTag ( tagName , typeExpression , fullName , comment ) ;
8014
- return finishNode ( typedefTag , start ) ;
8022
+ return finishNode ( typedefTag , start , end ) ;
8015
8023
}
8016
8024
8017
8025
function parseJSDocTypeNameWithNamespace ( nested ?: boolean ) {
0 commit comments