@@ -6134,9 +6134,6 @@ impl<'a> Parser<'a> {
61346134
61356135 fn consume_block ( & mut self , delim : token:: DelimToken ) {
61366136 let mut brace_depth = 0 ;
6137- if !self . eat ( & token:: OpenDelim ( delim) ) {
6138- return ;
6139- }
61406137 loop {
61416138 if self . eat ( & token:: OpenDelim ( delim) ) {
61426139 brace_depth += 1 ;
@@ -6147,7 +6144,7 @@ impl<'a> Parser<'a> {
61476144 brace_depth -= 1 ;
61486145 continue ;
61496146 }
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 ) ) {
61516148 return ;
61526149 } else {
61536150 self . bump ( ) ;
@@ -7397,17 +7394,27 @@ impl<'a> Parser<'a> {
73977394 return Err ( err) ;
73987395 } else if self . look_ahead ( 1 , |t| * t == token:: OpenDelim ( token:: Paren ) ) {
73997396 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+ } ;
74007403 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 )
74057411 } else if self . check ( & token:: Colon ) {
74067412 let kw = "struct" ;
74077413 ( kw, kw, false )
74087414 } else {
7409- ( "fn` or `struct" , "method or struct" , true )
7415+ ( "fn` or `struct" , "function or struct" , true )
74107416 } ;
7417+ self . consume_block ( token:: Brace ) ;
74117418
74127419 let msg = format ! ( "missing `{}` for {} definition" , kw, kw_name) ;
74137420 let mut err = self . diagnostic ( ) . struct_span_err ( sp, & msg) ;
@@ -7437,13 +7444,17 @@ impl<'a> Parser<'a> {
74377444 } else if self . look_ahead ( 1 , |t| * t == token:: Lt ) {
74387445 let ident = self . parse_ident ( ) . unwrap ( ) ;
74397446 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+ }
74437454 } else if self . check ( & token:: OpenDelim ( token:: Brace ) ) {
74447455 ( "struct" , "struct" , false )
74457456 } else {
7446- ( "fn` or `struct" , "method or struct" , true )
7457+ ( "fn` or `struct" , "function or struct" , true )
74477458 } ;
74487459 let msg = format ! ( "missing `{}` for {} definition" , kw, kw_name) ;
74497460 let mut err = self . diagnostic ( ) . struct_span_err ( sp, & msg) ;
0 commit comments