@@ -141,7 +141,7 @@ impl<'a, 'd, D: DiagnosticSink> Parser<'a, 'd, D> {
141141
142142 let terminator = self . expect_terminator ( ) ;
143143
144- let span = terminator. map ( |t| t. span . concat ( & let_kw . span ) ) . unwrap_or ( let_kw . span ) ;
144+ let span = let_kw . span . concat ( & terminator. map ( |t| t. span ) . unwrap_or ( value . span ) ) ;
145145
146146 Stmt { kind : StmtKind :: Let { name, value } , span }
147147 }
@@ -150,7 +150,7 @@ impl<'a, 'd, D: DiagnosticSink> Parser<'a, 'd, D> {
150150 let expr = self . parse_expression ( 0 ) ;
151151 let terminator = self . expect_terminator ( ) ;
152152
153- let span = terminator. map ( |t| t. span . concat ( & expr . span ) ) . unwrap_or ( expr. span ) ;
153+ let span = expr . span . concat ( & terminator. map ( |t| t. span ) . unwrap_or ( expr. span ) ) ;
154154
155155 Stmt { kind : StmtKind :: Expr ( expr) , span }
156156 }
@@ -160,14 +160,13 @@ impl<'a, 'd, D: DiagnosticSink> Parser<'a, 'd, D> {
160160 self . skip_newlines ( ) ;
161161 match self . peek_token ( ) {
162162 Token { kind : TokenKind :: Semicolon , .. } => self . stream . next ( ) ,
163- Token { kind : TokenKind :: RBrace | TokenKind :: EOF , .. } => None ,
163+ Token { kind : TokenKind :: RBrace , .. } => None ,
164+ _ if save != self . stream . get_position ( ) => {
165+ self . stream . set_position ( save) ;
166+ self . stream . next ( )
167+ }
168+ Token { kind : TokenKind :: EOF , .. } => self . stream . next ( ) ,
164169 other => {
165- // skipped at least one newline
166- if save != self . stream . get_position ( ) {
167- self . stream . set_position ( save) ;
168- return self . stream . next ( ) ;
169- }
170-
171170 self . diags . emit (
172171 Diagnostic :: error ( "missing statement terminator" )
173172 . with_span ( other. span )
@@ -178,7 +177,6 @@ impl<'a, 'd, D: DiagnosticSink> Parser<'a, 'd, D> {
178177 }
179178 }
180179
181- // FIXME: This might recover beyond a scope termination.
182180 fn recover_to_stmt_start ( & mut self ) {
183181 let mut save = self . stream . get_position ( ) ;
184182 while let Some ( tok) = self . stream . next ( ) {
@@ -319,7 +317,7 @@ impl<'a, 'd, D: DiagnosticSink> Parser<'a, 'd, D> {
319317 }
320318 } ;
321319
322- let span = closing_tok. map ( |t| t. span . concat ( & tok . span ) ) . unwrap_or ( tok . span ) ;
320+ let span = tok . span . concat ( & closing_tok. map ( |t| t. span ) . unwrap_or ( expr . span ) ) ;
323321
324322 Expr { span, ..expr }
325323 }
@@ -348,14 +346,21 @@ impl<'a, 'd, D: DiagnosticSink> Parser<'a, 'd, D> {
348346 }
349347 } ;
350348
351- let span = closing_tok . map ( |t| t . span . concat ( & tok . span ) ) . unwrap_or ( tok . span ) ;
352-
353- let tail_expr = match stmts. pop ( ) {
354- Some ( Stmt { kind : StmtKind :: Expr ( expr ) , span } ) if expr . span == span => Some ( Box :: new ( expr) ) ,
355- Some ( other ) => { stmts . push ( other ) ; None }
349+ let tail_expr = match stmts . last ( ) {
350+ Some ( Stmt { kind : StmtKind :: Expr ( expr ) , span } ) if expr . span == * span => {
351+ let Stmt { kind : StmtKind :: Expr ( expr ) , .. } = stmts. pop ( ) . unwrap ( ) else { unreachable ! ( ) } ;
352+ Some ( Box :: new ( expr) )
353+ }
356354 _ => None ,
357355 } ;
358356
357+ // yes, I know this is a lot but it makes sense. ( "{" -> last stmt -> tail expr -> "}" )
358+ let span = tok. span . concat ( & closing_tok. map ( |t| t. span )
359+ . or ( tail_expr. as_ref ( ) . map ( |e| e. span ) )
360+ . or ( stmts. last ( ) . map ( |s| s. span ) )
361+ . unwrap_or ( tok. span )
362+ ) ;
363+
359364 Expr {
360365 kind : ExprKind :: Block { stmts, tail_expr } ,
361366 span,
@@ -467,10 +472,10 @@ let a = x + 2\r
467472 } ,
468473 span: Span :: new( 40 , 46 )
469474 } ) ,
470- span: Span :: new( 40 , 46 )
475+ span: Span :: new( 40 , 48 )
471476 }
472477 ] ,
473- span : Span :: new ( 2 , 46 ) ,
478+ span : Span :: new ( 2 , 48 ) ,
474479 } ;
475480
476481 assert_eq ! ( parser. parse_program( ) , expected) ;
0 commit comments