@@ -303,11 +303,12 @@ impl<'a> ParserImpl<'a> {
303303 false
304304 } ;
305305
306+ let parenthesis_opening_span = self . cur_token ( ) . span ( ) ;
306307 self . expect ( Kind :: LParen ) ;
307308
308309 // for (;..
309310 if self . at ( Kind :: Semicolon ) {
310- return self . parse_for_loop ( span, None , r#await) ;
311+ return self . parse_for_loop ( span, parenthesis_opening_span , None , r#await) ;
311312 }
312313
313314 // `for (const` | `for (var`
@@ -318,6 +319,7 @@ impl<'a> ParserImpl<'a> {
318319 return self . parse_variable_declaration_for_statement (
319320 span,
320321 start_span,
322+ parenthesis_opening_span,
321323 VariableDeclarationKind :: Const ,
322324 r#await,
323325 ) ;
@@ -328,6 +330,7 @@ impl<'a> ParserImpl<'a> {
328330 return self . parse_variable_declaration_for_statement (
329331 span,
330332 start_span,
333+ parenthesis_opening_span,
331334 VariableDeclarationKind :: Var ,
332335 r#await,
333336 ) ;
@@ -342,6 +345,7 @@ impl<'a> ParserImpl<'a> {
342345 return self . parse_variable_declaration_for_statement (
343346 span,
344347 start_span,
348+ parenthesis_opening_span,
345349 VariableDeclarationKind :: Let ,
346350 r#await,
347351 ) ;
@@ -363,7 +367,11 @@ impl<'a> ParserImpl<'a> {
363367 !p. cur_token ( ) . is_on_new_line ( )
364368 } )
365369 {
366- return self . parse_using_declaration_for_statement ( span, r#await) ;
370+ return self . parse_using_declaration_for_statement (
371+ span,
372+ parenthesis_opening_span,
373+ r#await,
374+ ) ;
367375 }
368376
369377 // [+Using] using [no LineTerminator here] ForBinding[?Yield, ?Await, ~Pattern]
@@ -372,11 +380,15 @@ impl<'a> ParserImpl<'a> {
372380 let kind = token. kind ( ) ;
373381 !token. is_on_new_line ( ) && kind != Kind :: Of && kind. is_binding_identifier ( )
374382 } {
375- return self . parse_using_declaration_for_statement ( span, r#await) ;
383+ return self . parse_using_declaration_for_statement (
384+ span,
385+ parenthesis_opening_span,
386+ r#await,
387+ ) ;
376388 }
377389
378390 if self . at ( Kind :: RParen ) {
379- return self . parse_for_loop ( span, None , r#await) ;
391+ return self . parse_for_loop ( span, parenthesis_opening_span , None , r#await) ;
380392 }
381393
382394 let is_let = self . at ( Kind :: Let ) ;
@@ -390,7 +402,7 @@ impl<'a> ParserImpl<'a> {
390402 Kind :: In => {
391403 let target = AssignmentTarget :: cover ( init_expression, self ) ;
392404 let for_stmt_left = ForStatementLeft :: from ( target) ;
393- self . parse_for_in_loop ( span, r#await, for_stmt_left)
405+ self . parse_for_in_loop ( span, parenthesis_opening_span , r#await, for_stmt_left)
394406 }
395407 Kind :: Of => {
396408 if !r#await && is_async && init_expression. is_identifier_reference ( ) {
@@ -403,16 +415,22 @@ impl<'a> ParserImpl<'a> {
403415 }
404416 let target = AssignmentTarget :: cover ( init_expression, self ) ;
405417 let for_stmt_left = ForStatementLeft :: from ( target) ;
406- self . parse_for_of_loop ( span, r#await, for_stmt_left)
418+ self . parse_for_of_loop ( span, parenthesis_opening_span , r#await, for_stmt_left)
407419 }
408- _ => self . parse_for_loop ( span, Some ( ForStatementInit :: from ( init_expression) ) , r#await) ,
420+ _ => self . parse_for_loop (
421+ span,
422+ parenthesis_opening_span,
423+ Some ( ForStatementInit :: from ( init_expression) ) ,
424+ r#await,
425+ ) ,
409426 }
410427 }
411428
412429 fn parse_variable_declaration_for_statement (
413430 & mut self ,
414431 span : u32 ,
415432 start_span : u32 ,
433+ parenthesis_opening_span : Span ,
416434 decl_kind : VariableDeclarationKind ,
417435 r#await : bool ,
418436 ) -> Statement < ' a > {
@@ -425,7 +443,7 @@ impl<'a> ParserImpl<'a> {
425443 )
426444 } ) ;
427445
428- self . parse_any_for_loop ( span, init_declaration, r#await)
446+ self . parse_any_for_loop ( span, parenthesis_opening_span , init_declaration, r#await)
429447 }
430448
431449 pub ( crate ) fn is_using_declaration ( & mut self ) -> bool {
@@ -434,7 +452,12 @@ impl<'a> ParserImpl<'a> {
434452 ( kind. is_binding_identifier ( ) || kind == Kind :: LCurly ) && !token. is_on_new_line ( )
435453 }
436454
437- fn parse_using_declaration_for_statement ( & mut self , span : u32 , r#await : bool ) -> Statement < ' a > {
455+ fn parse_using_declaration_for_statement (
456+ & mut self ,
457+ span : u32 ,
458+ parenthesis_opening_span : Span ,
459+ r#await : bool ,
460+ ) -> Statement < ' a > {
438461 let using_decl = self . parse_using_declaration ( StatementContext :: For ) ;
439462
440463 if matches ! ( self . cur_kind( ) , Kind :: In ) {
@@ -450,28 +473,32 @@ impl<'a> ParserImpl<'a> {
450473 }
451474
452475 let init_declaration = self . alloc ( using_decl) ;
453- self . parse_any_for_loop ( span, init_declaration, r#await)
476+ self . parse_any_for_loop ( span, parenthesis_opening_span , init_declaration, r#await)
454477 }
455478
456479 fn parse_any_for_loop (
457480 & mut self ,
458481 span : u32 ,
482+ parenthesis_opening_span : Span ,
459483 init_declaration : Box < ' a , VariableDeclaration < ' a > > ,
460484 r#await : bool ,
461485 ) -> Statement < ' a > {
462486 match self . cur_kind ( ) {
463487 Kind :: In => self . parse_for_in_loop (
464488 span,
489+ parenthesis_opening_span,
465490 r#await,
466491 ForStatementLeft :: VariableDeclaration ( init_declaration) ,
467492 ) ,
468493 Kind :: Of => self . parse_for_of_loop (
469494 span,
495+ parenthesis_opening_span,
470496 r#await,
471497 ForStatementLeft :: VariableDeclaration ( init_declaration) ,
472498 ) ,
473499 _ => self . parse_for_loop (
474500 span,
501+ parenthesis_opening_span,
475502 Some ( ForStatementInit :: VariableDeclaration ( init_declaration) ) ,
476503 r#await,
477504 ) ,
@@ -481,6 +508,7 @@ impl<'a> ParserImpl<'a> {
481508 fn parse_for_loop (
482509 & mut self ,
483510 span : u32 ,
511+ parenthesis_opening_span : Span ,
484512 init : Option < ForStatementInit < ' a > > ,
485513 r#await : bool ,
486514 ) -> Statement < ' a > {
@@ -501,7 +529,7 @@ impl<'a> ParserImpl<'a> {
501529 } else {
502530 Some ( self . context_add ( Context :: In , ParserImpl :: parse_expr) )
503531 } ;
504- self . expect ( Kind :: RParen ) ;
532+ self . expect_closing ( Kind :: RParen , parenthesis_opening_span ) ;
505533 if r#await {
506534 self . error ( diagnostics:: for_await ( self . end_span ( span) ) ) ;
507535 }
@@ -512,12 +540,13 @@ impl<'a> ParserImpl<'a> {
512540 fn parse_for_in_loop (
513541 & mut self ,
514542 span : u32 ,
543+ parenthesis_opening_span : Span ,
515544 r#await : bool ,
516545 left : ForStatementLeft < ' a > ,
517546 ) -> Statement < ' a > {
518547 self . bump_any ( ) ; // bump `in`
519548 let right = self . parse_expr ( ) ;
520- self . expect ( Kind :: RParen ) ;
549+ self . expect_closing ( Kind :: RParen , parenthesis_opening_span ) ;
521550
522551 if r#await {
523552 self . error ( diagnostics:: for_await ( self . end_span ( span) ) ) ;
@@ -531,12 +560,13 @@ impl<'a> ParserImpl<'a> {
531560 fn parse_for_of_loop (
532561 & mut self ,
533562 span : u32 ,
563+ parenthesis_opening_span : Span ,
534564 r#await : bool ,
535565 left : ForStatementLeft < ' a > ,
536566 ) -> Statement < ' a > {
537567 self . bump_any ( ) ; // bump `of`
538568 let right = self . parse_assignment_expression_or_higher ( ) ;
539- self . expect ( Kind :: RParen ) ;
569+ self . expect_closing ( Kind :: RParen , parenthesis_opening_span ) ;
540570
541571 let body = self . parse_statement_list_item ( StatementContext :: For ) ;
542572 let span = self . end_span ( span) ;
0 commit comments