@@ -1341,24 +1341,27 @@ namespace ts {
1341
1341
return inContext ( NodeFlags . AwaitContext ) ;
1342
1342
}
1343
1343
1344
- function parseErrorAtCurrentToken ( message : DiagnosticMessage , arg0 ?: any ) : void {
1345
- parseErrorAt ( scanner . getTokenPos ( ) , scanner . getTextPos ( ) , message , arg0 ) ;
1344
+ function parseErrorAtCurrentToken ( message : DiagnosticMessage , arg0 ?: any ) : DiagnosticWithDetachedLocation | undefined {
1345
+ return parseErrorAt ( scanner . getTokenPos ( ) , scanner . getTextPos ( ) , message , arg0 ) ;
1346
1346
}
1347
1347
1348
- function parseErrorAtPosition ( start : number , length : number , message : DiagnosticMessage , arg0 ?: any ) : void {
1348
+ function parseErrorAtPosition ( start : number , length : number , message : DiagnosticMessage , arg0 ?: any ) : DiagnosticWithDetachedLocation | undefined {
1349
1349
// Don't report another error if it would just be at the same position as the last error.
1350
1350
const lastError = lastOrUndefined ( parseDiagnostics ) ;
1351
+ let result : DiagnosticWithDetachedLocation | undefined ;
1351
1352
if ( ! lastError || start !== lastError . start ) {
1352
- parseDiagnostics . push ( createDetachedDiagnostic ( fileName , start , length , message , arg0 ) ) ;
1353
+ result = createDetachedDiagnostic ( fileName , start , length , message , arg0 ) ;
1354
+ parseDiagnostics . push ( result ) ;
1353
1355
}
1354
1356
1355
1357
// Mark that we've encountered an error. We'll set an appropriate bit on the next
1356
1358
// node we finish so that it can't be reused incrementally.
1357
1359
parseErrorBeforeNextFinishedNode = true ;
1360
+ return result ;
1358
1361
}
1359
1362
1360
- function parseErrorAt ( start : number , end : number , message : DiagnosticMessage , arg0 ?: any ) : void {
1361
- parseErrorAtPosition ( start , end - start , message , arg0 ) ;
1363
+ function parseErrorAt ( start : number , end : number , message : DiagnosticMessage , arg0 ?: any ) : DiagnosticWithDetachedLocation | undefined {
1364
+ return parseErrorAtPosition ( start , end - start , message , arg0 ) ;
1362
1365
}
1363
1366
1364
1367
function parseErrorAtRange ( range : TextRange , message : DiagnosticMessage , arg0 ?: any ) : void {
@@ -1552,6 +1555,20 @@ namespace ts {
1552
1555
return false ;
1553
1556
}
1554
1557
1558
+ function parseExpectedMatchingBrackets ( openKind : SyntaxKind , closeKind : SyntaxKind , openPosition : number ) {
1559
+ if ( token ( ) === closeKind ) {
1560
+ nextToken ( ) ;
1561
+ return ;
1562
+ }
1563
+ const lastError = parseErrorAtCurrentToken ( Diagnostics . _0_expected , tokenToString ( closeKind ) ) ;
1564
+ if ( lastError ) {
1565
+ addRelatedInfo (
1566
+ lastError ,
1567
+ createDetachedDiagnostic ( fileName , openPosition , 1 , Diagnostics . The_parser_expected_to_find_a_1_to_match_the_0_token_here , tokenToString ( openKind ) , tokenToString ( closeKind ) )
1568
+ ) ;
1569
+ }
1570
+ }
1571
+
1555
1572
function parseOptional ( t : SyntaxKind ) : boolean {
1556
1573
if ( token ( ) === t ) {
1557
1574
nextToken ( ) ;
@@ -5481,10 +5498,11 @@ namespace ts {
5481
5498
5482
5499
function parseArrayLiteralExpression ( ) : ArrayLiteralExpression {
5483
5500
const pos = getNodePos ( ) ;
5501
+ const openBracketPosition = scanner . getTokenPos ( ) ;
5484
5502
parseExpected ( SyntaxKind . OpenBracketToken ) ;
5485
5503
const multiLine = scanner . hasPrecedingLineBreak ( ) ;
5486
5504
const elements = parseDelimitedList ( ParsingContext . ArrayLiteralMembers , parseArgumentOrArrayLiteralElement ) ;
5487
- parseExpected ( SyntaxKind . CloseBracketToken ) ;
5505
+ parseExpectedMatchingBrackets ( SyntaxKind . OpenBracketToken , SyntaxKind . CloseBracketToken , openBracketPosition ) ;
5488
5506
return finishNode ( factory . createArrayLiteralExpression ( elements , multiLine ) , pos ) ;
5489
5507
}
5490
5508
@@ -5553,15 +5571,7 @@ namespace ts {
5553
5571
parseExpected ( SyntaxKind . OpenBraceToken ) ;
5554
5572
const multiLine = scanner . hasPrecedingLineBreak ( ) ;
5555
5573
const properties = parseDelimitedList ( ParsingContext . ObjectLiteralMembers , parseObjectLiteralElement , /*considerSemicolonAsDelimiter*/ true ) ;
5556
- if ( ! parseExpected ( SyntaxKind . CloseBraceToken ) ) {
5557
- const lastError = lastOrUndefined ( parseDiagnostics ) ;
5558
- if ( lastError && lastError . code === Diagnostics . _0_expected . code ) {
5559
- addRelatedInfo (
5560
- lastError ,
5561
- createDetachedDiagnostic ( fileName , openBracePosition , 1 , Diagnostics . The_parser_expected_to_find_a_to_match_the_token_here )
5562
- ) ;
5563
- }
5564
- }
5574
+ parseExpectedMatchingBrackets ( SyntaxKind . OpenBraceToken , SyntaxKind . CloseBraceToken , openBracePosition ) ;
5565
5575
return finishNode ( factory . createObjectLiteralExpression ( properties , multiLine ) , pos ) ;
5566
5576
}
5567
5577
@@ -5647,15 +5657,7 @@ namespace ts {
5647
5657
if ( parseExpected ( SyntaxKind . OpenBraceToken , diagnosticMessage ) || ignoreMissingOpenBrace ) {
5648
5658
const multiLine = scanner . hasPrecedingLineBreak ( ) ;
5649
5659
const statements = parseList ( ParsingContext . BlockStatements , parseStatement ) ;
5650
- if ( ! parseExpected ( SyntaxKind . CloseBraceToken ) ) {
5651
- const lastError = lastOrUndefined ( parseDiagnostics ) ;
5652
- if ( lastError && lastError . code === Diagnostics . _0_expected . code ) {
5653
- addRelatedInfo (
5654
- lastError ,
5655
- createDetachedDiagnostic ( fileName , openBracePosition , 1 , Diagnostics . The_parser_expected_to_find_a_to_match_the_token_here )
5656
- ) ;
5657
- }
5658
- }
5660
+ parseExpectedMatchingBrackets ( SyntaxKind . OpenBraceToken , SyntaxKind . CloseBraceToken , openBracePosition ) ;
5659
5661
const result = withJSDoc ( finishNode ( factory . createBlock ( statements , multiLine ) , pos ) , hasJSDoc ) ;
5660
5662
if ( token ( ) === SyntaxKind . EqualsToken ) {
5661
5663
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 ) ;
@@ -5711,9 +5713,10 @@ namespace ts {
5711
5713
const pos = getNodePos ( ) ;
5712
5714
const hasJSDoc = hasPrecedingJSDocComment ( ) ;
5713
5715
parseExpected ( SyntaxKind . IfKeyword ) ;
5716
+ const openParenPosition = scanner . getTokenPos ( ) ;
5714
5717
parseExpected ( SyntaxKind . OpenParenToken ) ;
5715
5718
const expression = allowInAnd ( parseExpression ) ;
5716
- parseExpected ( SyntaxKind . CloseParenToken ) ;
5719
+ parseExpectedMatchingBrackets ( SyntaxKind . OpenParenToken , SyntaxKind . CloseParenToken , openParenPosition ) ;
5717
5720
const thenStatement = parseStatement ( ) ;
5718
5721
const elseStatement = parseOptional ( SyntaxKind . ElseKeyword ) ? parseStatement ( ) : undefined ;
5719
5722
return withJSDoc ( finishNode ( factory . createIfStatement ( expression , thenStatement , elseStatement ) , pos ) , hasJSDoc ) ;
@@ -5725,9 +5728,10 @@ namespace ts {
5725
5728
parseExpected ( SyntaxKind . DoKeyword ) ;
5726
5729
const statement = parseStatement ( ) ;
5727
5730
parseExpected ( SyntaxKind . WhileKeyword ) ;
5731
+ const openParenPosition = scanner . getTokenPos ( ) ;
5728
5732
parseExpected ( SyntaxKind . OpenParenToken ) ;
5729
5733
const expression = allowInAnd ( parseExpression ) ;
5730
- parseExpected ( SyntaxKind . CloseParenToken ) ;
5734
+ parseExpectedMatchingBrackets ( SyntaxKind . OpenParenToken , SyntaxKind . CloseParenToken , openParenPosition ) ;
5731
5735
5732
5736
// From: https://mail.mozilla.org/pipermail/es-discuss/2011-August/016188.html
5733
5737
// 157 min --- All allen at wirfs-brock.com CONF --- "do{;}while(false)false" prohibited in
@@ -5741,9 +5745,10 @@ namespace ts {
5741
5745
const pos = getNodePos ( ) ;
5742
5746
const hasJSDoc = hasPrecedingJSDocComment ( ) ;
5743
5747
parseExpected ( SyntaxKind . WhileKeyword ) ;
5748
+ const openParenPosition = scanner . getTokenPos ( ) ;
5744
5749
parseExpected ( SyntaxKind . OpenParenToken ) ;
5745
5750
const expression = allowInAnd ( parseExpression ) ;
5746
- parseExpected ( SyntaxKind . CloseParenToken ) ;
5751
+ parseExpectedMatchingBrackets ( SyntaxKind . OpenParenToken , SyntaxKind . CloseParenToken , openParenPosition ) ;
5747
5752
const statement = parseStatement ( ) ;
5748
5753
return withJSDoc ( finishNode ( factory . createWhileStatement ( expression , statement ) , pos ) , hasJSDoc ) ;
5749
5754
}
@@ -5819,9 +5824,10 @@ namespace ts {
5819
5824
const pos = getNodePos ( ) ;
5820
5825
const hasJSDoc = hasPrecedingJSDocComment ( ) ;
5821
5826
parseExpected ( SyntaxKind . WithKeyword ) ;
5827
+ const openParenPosition = scanner . getTokenPos ( ) ;
5822
5828
parseExpected ( SyntaxKind . OpenParenToken ) ;
5823
5829
const expression = allowInAnd ( parseExpression ) ;
5824
- parseExpected ( SyntaxKind . CloseParenToken ) ;
5830
+ parseExpectedMatchingBrackets ( SyntaxKind . OpenParenToken , SyntaxKind . CloseParenToken , openParenPosition ) ;
5825
5831
const statement = doInsideOfContext ( NodeFlags . InWithStatement , parseStatement ) ;
5826
5832
return withJSDoc ( finishNode ( factory . createWithStatement ( expression , statement ) , pos ) , hasJSDoc ) ;
5827
5833
}
@@ -8074,13 +8080,9 @@ namespace ts {
8074
8080
hasChildren = true ;
8075
8081
if ( child . kind === SyntaxKind . JSDocTypeTag ) {
8076
8082
if ( childTypeTag ) {
8077
- parseErrorAtCurrentToken ( Diagnostics . A_JSDoc_typedef_comment_may_not_contain_multiple_type_tags ) ;
8078
- const lastError = lastOrUndefined ( parseDiagnostics ) ;
8083
+ const lastError = parseErrorAtCurrentToken ( Diagnostics . A_JSDoc_typedef_comment_may_not_contain_multiple_type_tags ) ;
8079
8084
if ( lastError ) {
8080
- addRelatedInfo (
8081
- lastError ,
8082
- createDetachedDiagnostic ( fileName , 0 , 0 , Diagnostics . The_tag_was_first_specified_here )
8083
- ) ;
8085
+ addRelatedInfo ( lastError , createDetachedDiagnostic ( fileName , 0 , 0 , Diagnostics . The_tag_was_first_specified_here ) ) ;
8084
8086
}
8085
8087
break ;
8086
8088
}
0 commit comments