@@ -1542,6 +1542,20 @@ namespace ts {
1542
1542
return false ;
1543
1543
}
1544
1544
1545
+ function parseExpectedMatchingBrackets ( openKind : SyntaxKind , closeKind : SyntaxKind , openPosition : number ) {
1546
+ if ( ! parseExpected ( closeKind ) ) {
1547
+ const lastError = lastOrUndefined ( parseDiagnostics ) ;
1548
+ if ( lastError && lastError . code === Diagnostics . _0_expected . code ) {
1549
+ addRelatedInfo (
1550
+ lastError ,
1551
+ createDetachedDiagnostic ( fileName , openPosition , 1 , Diagnostics . The_parser_expected_to_find_a_1_to_match_the_0_token_here , tokenToString ( openKind ) , tokenToString ( closeKind ) )
1552
+ ) ;
1553
+ }
1554
+ return false ;
1555
+ }
1556
+ return true ;
1557
+ }
1558
+
1545
1559
function parseOptional ( t : SyntaxKind ) : boolean {
1546
1560
if ( token ( ) === t ) {
1547
1561
nextToken ( ) ;
@@ -5426,10 +5440,11 @@ namespace ts {
5426
5440
5427
5441
function parseArrayLiteralExpression ( ) : ArrayLiteralExpression {
5428
5442
const pos = getNodePos ( ) ;
5443
+ const openBracketPosition = scanner . getTokenPos ( ) ;
5429
5444
parseExpected ( SyntaxKind . OpenBracketToken ) ;
5430
5445
const multiLine = scanner . hasPrecedingLineBreak ( ) ;
5431
5446
const elements = parseDelimitedList ( ParsingContext . ArrayLiteralMembers , parseArgumentOrArrayLiteralElement ) ;
5432
- parseExpected ( SyntaxKind . CloseBracketToken ) ;
5447
+ parseExpectedMatchingBrackets ( SyntaxKind . OpenBracketToken , SyntaxKind . CloseBracketToken , openBracketPosition ) ;
5433
5448
return finishNode ( factory . createArrayLiteralExpression ( elements , multiLine ) , pos ) ;
5434
5449
}
5435
5450
@@ -5503,7 +5518,7 @@ namespace ts {
5503
5518
if ( lastError && lastError . code === Diagnostics . _0_expected . code ) {
5504
5519
addRelatedInfo (
5505
5520
lastError ,
5506
- createDetachedDiagnostic ( fileName , openBracePosition , 1 , Diagnostics . The_parser_expected_to_find_a_to_match_the_token_here )
5521
+ createDetachedDiagnostic ( fileName , openBracePosition , 1 , Diagnostics . The_parser_expected_to_find_a_1_to_match_the_0_token_here , tokenToString ( SyntaxKind . OpenBraceToken ) , tokenToString ( SyntaxKind . CloseBraceToken ) )
5507
5522
) ;
5508
5523
}
5509
5524
}
@@ -5591,15 +5606,7 @@ namespace ts {
5591
5606
if ( parseExpected ( SyntaxKind . OpenBraceToken , diagnosticMessage ) || ignoreMissingOpenBrace ) {
5592
5607
const multiLine = scanner . hasPrecedingLineBreak ( ) ;
5593
5608
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
- }
5602
- }
5609
+ parseExpectedMatchingBrackets ( SyntaxKind . OpenBraceToken , SyntaxKind . CloseBraceToken , openBracePosition ) ;
5603
5610
return finishNode ( factory . createBlock ( statements , multiLine ) , pos ) ;
5604
5611
}
5605
5612
else {
@@ -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
}
0 commit comments