@@ -1434,24 +1434,27 @@ namespace ts {
1434
1434
return inContext ( NodeFlags . AwaitContext ) ;
1435
1435
}
1436
1436
1437
- function parseErrorAtCurrentToken ( message : DiagnosticMessage , arg0 ?: any ) : void {
1438
- parseErrorAt ( scanner . getTokenPos ( ) , scanner . getTextPos ( ) , message , arg0 ) ;
1437
+ function parseErrorAtCurrentToken ( message : DiagnosticMessage , arg0 ?: any ) : DiagnosticWithDetachedLocation | undefined {
1438
+ return parseErrorAt ( scanner . getTokenPos ( ) , scanner . getTextPos ( ) , message , arg0 ) ;
1439
1439
}
1440
1440
1441
- function parseErrorAtPosition ( start : number , length : number , message : DiagnosticMessage , arg0 ?: any ) : void {
1441
+ function parseErrorAtPosition ( start : number , length : number , message : DiagnosticMessage , arg0 ?: any ) : DiagnosticWithDetachedLocation | undefined {
1442
1442
// Don't report another error if it would just be at the same position as the last error.
1443
1443
const lastError = lastOrUndefined ( parseDiagnostics ) ;
1444
+ let result : DiagnosticWithDetachedLocation | undefined ;
1444
1445
if ( ! lastError || start !== lastError . start ) {
1445
- parseDiagnostics . push ( createDetachedDiagnostic ( fileName , start , length , message , arg0 ) ) ;
1446
+ result = createDetachedDiagnostic ( fileName , start , length , message , arg0 ) ;
1447
+ parseDiagnostics . push ( result ) ;
1446
1448
}
1447
1449
1448
1450
// Mark that we've encountered an error. We'll set an appropriate bit on the next
1449
1451
// node we finish so that it can't be reused incrementally.
1450
1452
parseErrorBeforeNextFinishedNode = true ;
1453
+ return result ;
1451
1454
}
1452
1455
1453
- function parseErrorAt ( start : number , end : number , message : DiagnosticMessage , arg0 ?: any ) : void {
1454
- parseErrorAtPosition ( start , end - start , message , arg0 ) ;
1456
+ function parseErrorAt ( start : number , end : number , message : DiagnosticMessage , arg0 ?: any ) : DiagnosticWithDetachedLocation | undefined {
1457
+ return parseErrorAtPosition ( start , end - start , message , arg0 ) ;
1455
1458
}
1456
1459
1457
1460
function parseErrorAtRange ( range : TextRange , message : DiagnosticMessage , arg0 ?: any ) : void {
@@ -1779,6 +1782,23 @@ namespace ts {
1779
1782
return false ;
1780
1783
}
1781
1784
1785
+ function parseExpectedMatchingBrackets ( openKind : SyntaxKind , closeKind : SyntaxKind , openParsed : boolean , openPosition : number ) {
1786
+ if ( token ( ) === closeKind ) {
1787
+ nextToken ( ) ;
1788
+ return ;
1789
+ }
1790
+ const lastError = parseErrorAtCurrentToken ( Diagnostics . _0_expected , tokenToString ( closeKind ) ) ;
1791
+ if ( ! openParsed ) {
1792
+ return ;
1793
+ }
1794
+ if ( lastError ) {
1795
+ addRelatedInfo (
1796
+ lastError ,
1797
+ createDetachedDiagnostic ( fileName , openPosition , 1 , Diagnostics . The_parser_expected_to_find_a_1_to_match_the_0_token_here , tokenToString ( openKind ) , tokenToString ( closeKind ) )
1798
+ ) ;
1799
+ }
1800
+ }
1801
+
1782
1802
function parseOptional ( t : SyntaxKind ) : boolean {
1783
1803
if ( token ( ) === t ) {
1784
1804
nextToken ( ) ;
@@ -3739,7 +3759,7 @@ namespace ts {
3739
3759
if ( lastError && lastError . code === Diagnostics . _0_expected . code ) {
3740
3760
addRelatedInfo (
3741
3761
lastError ,
3742
- createDetachedDiagnostic ( fileName , openBracePosition , 1 , Diagnostics . The_parser_expected_to_find_a_to_match_the_token_here )
3762
+ createDetachedDiagnostic ( fileName , openBracePosition , 1 , Diagnostics . The_parser_expected_to_find_a_1_to_match_the_0_token_here , "{" , "}" )
3743
3763
) ;
3744
3764
}
3745
3765
}
@@ -5772,10 +5792,11 @@ namespace ts {
5772
5792
5773
5793
function parseArrayLiteralExpression ( ) : ArrayLiteralExpression {
5774
5794
const pos = getNodePos ( ) ;
5775
- parseExpected ( SyntaxKind . OpenBracketToken ) ;
5795
+ const openBracketPosition = scanner . getTokenPos ( ) ;
5796
+ const openBracketParsed = parseExpected ( SyntaxKind . OpenBracketToken ) ;
5776
5797
const multiLine = scanner . hasPrecedingLineBreak ( ) ;
5777
5798
const elements = parseDelimitedList ( ParsingContext . ArrayLiteralMembers , parseArgumentOrArrayLiteralElement ) ;
5778
- parseExpected ( SyntaxKind . CloseBracketToken ) ;
5799
+ parseExpectedMatchingBrackets ( SyntaxKind . OpenBracketToken , SyntaxKind . CloseBracketToken , openBracketParsed , openBracketPosition ) ;
5779
5800
return finishNode ( factory . createArrayLiteralExpression ( elements , multiLine ) , pos ) ;
5780
5801
}
5781
5802
@@ -5841,18 +5862,10 @@ namespace ts {
5841
5862
function parseObjectLiteralExpression ( ) : ObjectLiteralExpression {
5842
5863
const pos = getNodePos ( ) ;
5843
5864
const openBracePosition = scanner . getTokenPos ( ) ;
5844
- parseExpected ( SyntaxKind . OpenBraceToken ) ;
5865
+ const openBraceParsed = parseExpected ( SyntaxKind . OpenBraceToken ) ;
5845
5866
const multiLine = scanner . hasPrecedingLineBreak ( ) ;
5846
5867
const properties = parseDelimitedList ( ParsingContext . ObjectLiteralMembers , parseObjectLiteralElement , /*considerSemicolonAsDelimiter*/ true ) ;
5847
- if ( ! parseExpected ( SyntaxKind . CloseBraceToken ) ) {
5848
- const lastError = lastOrUndefined ( parseDiagnostics ) ;
5849
- if ( lastError && lastError . code === Diagnostics . _0_expected . code ) {
5850
- addRelatedInfo (
5851
- lastError ,
5852
- createDetachedDiagnostic ( fileName , openBracePosition , 1 , Diagnostics . The_parser_expected_to_find_a_to_match_the_token_here )
5853
- ) ;
5854
- }
5855
- }
5868
+ parseExpectedMatchingBrackets ( SyntaxKind . OpenBraceToken , SyntaxKind . CloseBraceToken , openBraceParsed , openBracePosition ) ;
5856
5869
return finishNode ( factory . createObjectLiteralExpression ( properties , multiLine ) , pos ) ;
5857
5870
}
5858
5871
@@ -5916,18 +5929,11 @@ namespace ts {
5916
5929
const pos = getNodePos ( ) ;
5917
5930
const hasJSDoc = hasPrecedingJSDocComment ( ) ;
5918
5931
const openBracePosition = scanner . getTokenPos ( ) ;
5919
- if ( parseExpected ( SyntaxKind . OpenBraceToken , diagnosticMessage ) || ignoreMissingOpenBrace ) {
5932
+ const openBraceParsed = parseExpected ( SyntaxKind . OpenBraceToken , diagnosticMessage ) ;
5933
+ if ( openBraceParsed || ignoreMissingOpenBrace ) {
5920
5934
const multiLine = scanner . hasPrecedingLineBreak ( ) ;
5921
5935
const statements = parseList ( ParsingContext . BlockStatements , parseStatement ) ;
5922
- if ( ! parseExpected ( SyntaxKind . CloseBraceToken ) ) {
5923
- const lastError = lastOrUndefined ( parseDiagnostics ) ;
5924
- if ( lastError && lastError . code === Diagnostics . _0_expected . code ) {
5925
- addRelatedInfo (
5926
- lastError ,
5927
- createDetachedDiagnostic ( fileName , openBracePosition , 1 , Diagnostics . The_parser_expected_to_find_a_to_match_the_token_here )
5928
- ) ;
5929
- }
5930
- }
5936
+ parseExpectedMatchingBrackets ( SyntaxKind . OpenBraceToken , SyntaxKind . CloseBraceToken , openBraceParsed , openBracePosition ) ;
5931
5937
const result = withJSDoc ( finishNode ( factory . createBlock ( statements , multiLine ) , pos ) , hasJSDoc ) ;
5932
5938
if ( token ( ) === SyntaxKind . EqualsToken ) {
5933
5939
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 ) ;
@@ -5983,9 +5989,10 @@ namespace ts {
5983
5989
const pos = getNodePos ( ) ;
5984
5990
const hasJSDoc = hasPrecedingJSDocComment ( ) ;
5985
5991
parseExpected ( SyntaxKind . IfKeyword ) ;
5986
- parseExpected ( SyntaxKind . OpenParenToken ) ;
5992
+ const openParenPosition = scanner . getTokenPos ( ) ;
5993
+ const openParenParsed = parseExpected ( SyntaxKind . OpenParenToken ) ;
5987
5994
const expression = allowInAnd ( parseExpression ) ;
5988
- parseExpected ( SyntaxKind . CloseParenToken ) ;
5995
+ parseExpectedMatchingBrackets ( SyntaxKind . OpenParenToken , SyntaxKind . CloseParenToken , openParenParsed , openParenPosition ) ;
5989
5996
const thenStatement = parseStatement ( ) ;
5990
5997
const elseStatement = parseOptional ( SyntaxKind . ElseKeyword ) ? parseStatement ( ) : undefined ;
5991
5998
return withJSDoc ( finishNode ( factory . createIfStatement ( expression , thenStatement , elseStatement ) , pos ) , hasJSDoc ) ;
@@ -5997,9 +6004,10 @@ namespace ts {
5997
6004
parseExpected ( SyntaxKind . DoKeyword ) ;
5998
6005
const statement = parseStatement ( ) ;
5999
6006
parseExpected ( SyntaxKind . WhileKeyword ) ;
6000
- parseExpected ( SyntaxKind . OpenParenToken ) ;
6007
+ const openParenPosition = scanner . getTokenPos ( ) ;
6008
+ const openParenParsed = parseExpected ( SyntaxKind . OpenParenToken ) ;
6001
6009
const expression = allowInAnd ( parseExpression ) ;
6002
- parseExpected ( SyntaxKind . CloseParenToken ) ;
6010
+ parseExpectedMatchingBrackets ( SyntaxKind . OpenParenToken , SyntaxKind . CloseParenToken , openParenParsed , openParenPosition ) ;
6003
6011
6004
6012
// From: https://mail.mozilla.org/pipermail/es-discuss/2011-August/016188.html
6005
6013
// 157 min --- All allen at wirfs-brock.com CONF --- "do{;}while(false)false" prohibited in
@@ -6013,9 +6021,10 @@ namespace ts {
6013
6021
const pos = getNodePos ( ) ;
6014
6022
const hasJSDoc = hasPrecedingJSDocComment ( ) ;
6015
6023
parseExpected ( SyntaxKind . WhileKeyword ) ;
6016
- parseExpected ( SyntaxKind . OpenParenToken ) ;
6024
+ const openParenPosition = scanner . getTokenPos ( ) ;
6025
+ const openParenParsed = parseExpected ( SyntaxKind . OpenParenToken ) ;
6017
6026
const expression = allowInAnd ( parseExpression ) ;
6018
- parseExpected ( SyntaxKind . CloseParenToken ) ;
6027
+ parseExpectedMatchingBrackets ( SyntaxKind . OpenParenToken , SyntaxKind . CloseParenToken , openParenParsed , openParenPosition ) ;
6019
6028
const statement = parseStatement ( ) ;
6020
6029
return withJSDoc ( finishNode ( factory . createWhileStatement ( expression , statement ) , pos ) , hasJSDoc ) ;
6021
6030
}
@@ -6091,9 +6100,10 @@ namespace ts {
6091
6100
const pos = getNodePos ( ) ;
6092
6101
const hasJSDoc = hasPrecedingJSDocComment ( ) ;
6093
6102
parseExpected ( SyntaxKind . WithKeyword ) ;
6094
- parseExpected ( SyntaxKind . OpenParenToken ) ;
6103
+ const openParenPosition = scanner . getTokenPos ( ) ;
6104
+ const openParenParsed = parseExpected ( SyntaxKind . OpenParenToken ) ;
6095
6105
const expression = allowInAnd ( parseExpression ) ;
6096
- parseExpected ( SyntaxKind . CloseParenToken ) ;
6106
+ parseExpectedMatchingBrackets ( SyntaxKind . OpenParenToken , SyntaxKind . CloseParenToken , openParenParsed , openParenPosition ) ;
6097
6107
const statement = doInsideOfContext ( NodeFlags . InWithStatement , parseStatement ) ;
6098
6108
return withJSDoc ( finishNode ( factory . createWithStatement ( expression , statement ) , pos ) , hasJSDoc ) ;
6099
6109
}
@@ -7398,7 +7408,7 @@ namespace ts {
7398
7408
if ( lastError && lastError . code === Diagnostics . _0_expected . code ) {
7399
7409
addRelatedInfo (
7400
7410
lastError ,
7401
- createDetachedDiagnostic ( fileName , openBracePosition , 1 , Diagnostics . The_parser_expected_to_find_a_to_match_the_token_here )
7411
+ createDetachedDiagnostic ( fileName , openBracePosition , 1 , Diagnostics . The_parser_expected_to_find_a_1_to_match_the_0_token_here , "{" , "}" )
7402
7412
) ;
7403
7413
}
7404
7414
}
@@ -8453,13 +8463,9 @@ namespace ts {
8453
8463
hasChildren = true ;
8454
8464
if ( child . kind === SyntaxKind . JSDocTypeTag ) {
8455
8465
if ( childTypeTag ) {
8456
- parseErrorAtCurrentToken ( Diagnostics . A_JSDoc_typedef_comment_may_not_contain_multiple_type_tags ) ;
8457
- const lastError = lastOrUndefined ( parseDiagnostics ) ;
8466
+ const lastError = parseErrorAtCurrentToken ( Diagnostics . A_JSDoc_typedef_comment_may_not_contain_multiple_type_tags ) ;
8458
8467
if ( lastError ) {
8459
- addRelatedInfo (
8460
- lastError ,
8461
- createDetachedDiagnostic ( fileName , 0 , 0 , Diagnostics . The_tag_was_first_specified_here )
8462
- ) ;
8468
+ addRelatedInfo ( lastError , createDetachedDiagnostic ( fileName , 0 , 0 , Diagnostics . The_tag_was_first_specified_here ) ) ;
8463
8469
}
8464
8470
break ;
8465
8471
}
0 commit comments