@@ -6134,9 +6134,6 @@ impl<'a> Parser<'a> {
6134
6134
6135
6135
fn consume_block ( & mut self , delim : token:: DelimToken ) {
6136
6136
let mut brace_depth = 0 ;
6137
- if !self . eat ( & token:: OpenDelim ( delim) ) {
6138
- return ;
6139
- }
6140
6137
loop {
6141
6138
if self . eat ( & token:: OpenDelim ( delim) ) {
6142
6139
brace_depth += 1 ;
@@ -6147,7 +6144,7 @@ impl<'a> Parser<'a> {
6147
6144
brace_depth -= 1 ;
6148
6145
continue ;
6149
6146
}
6150
- } else if self . eat ( & token:: Eof ) || self . eat ( & token:: CloseDelim ( token:: NoDelim ) ) {
6147
+ } else if self . token == token :: Eof || self . eat ( & token:: CloseDelim ( token:: NoDelim ) ) {
6151
6148
return ;
6152
6149
} else {
6153
6150
self . bump ( ) ;
@@ -7397,17 +7394,27 @@ impl<'a> Parser<'a> {
7397
7394
return Err ( err) ;
7398
7395
} else if self . look_ahead ( 1 , |t| * t == token:: OpenDelim ( token:: Paren ) ) {
7399
7396
let ident = self . parse_ident ( ) . unwrap ( ) ;
7397
+ self . bump ( ) ; // `(`
7398
+ let kw_name = if let Ok ( Some ( _) ) = self . parse_self_arg ( ) {
7399
+ "method"
7400
+ } else {
7401
+ "function"
7402
+ } ;
7400
7403
self . consume_block ( token:: Paren ) ;
7401
- let ( kw, kw_name, ambiguous) = if self . check ( & token:: RArrow ) ||
7402
- self . check ( & token:: OpenDelim ( token:: Brace ) )
7403
- {
7404
- ( "fn" , "method" , false )
7404
+ let ( kw, kw_name, ambiguous) = if self . check ( & token:: RArrow ) {
7405
+ self . eat_to_tokens ( & [ & token:: OpenDelim ( token:: Brace ) ] ) ;
7406
+ self . bump ( ) ; // `{`
7407
+ ( "fn" , kw_name, false )
7408
+ } else if self . check ( & token:: OpenDelim ( token:: Brace ) ) {
7409
+ self . bump ( ) ; // `{`
7410
+ ( "fn" , kw_name, false )
7405
7411
} else if self . check ( & token:: Colon ) {
7406
7412
let kw = "struct" ;
7407
7413
( kw, kw, false )
7408
7414
} else {
7409
- ( "fn` or `struct" , "method or struct" , true )
7415
+ ( "fn` or `struct" , "function or struct" , true )
7410
7416
} ;
7417
+ self . consume_block ( token:: Brace ) ;
7411
7418
7412
7419
let msg = format ! ( "missing `{}` for {} definition" , kw, kw_name) ;
7413
7420
let mut err = self . diagnostic ( ) . struct_span_err ( sp, & msg) ;
@@ -7437,13 +7444,17 @@ impl<'a> Parser<'a> {
7437
7444
} else if self . look_ahead ( 1 , |t| * t == token:: Lt ) {
7438
7445
let ident = self . parse_ident ( ) . unwrap ( ) ;
7439
7446
self . eat_to_tokens ( & [ & token:: Gt ] ) ;
7440
- self . bump ( ) ;
7441
- let ( kw, kw_name, ambiguous) = if self . check ( & token:: OpenDelim ( token:: Paren ) ) {
7442
- ( "fn" , "method" , false )
7447
+ self . bump ( ) ; // `>`
7448
+ let ( kw, kw_name, ambiguous) = if self . eat ( & token:: OpenDelim ( token:: Paren ) ) {
7449
+ if let Ok ( Some ( _) ) = self . parse_self_arg ( ) {
7450
+ ( "fn" , "method" , false )
7451
+ } else {
7452
+ ( "fn" , "function" , false )
7453
+ }
7443
7454
} else if self . check ( & token:: OpenDelim ( token:: Brace ) ) {
7444
7455
( "struct" , "struct" , false )
7445
7456
} else {
7446
- ( "fn` or `struct" , "method or struct" , true )
7457
+ ( "fn` or `struct" , "function or struct" , true )
7447
7458
} ;
7448
7459
let msg = format ! ( "missing `{}` for {} definition" , kw, kw_name) ;
7449
7460
let mut err = self . diagnostic ( ) . struct_span_err ( sp, & msg) ;
0 commit comments