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