@@ -1298,6 +1298,23 @@ impl Parser {
12981298        Ok ( ( handle,  self . pop_rule_span ( lexer) ) ) 
12991299    } 
13001300
1301+     fn  optionally_typed_ident < ' a > ( 
1302+         & mut  self , 
1303+         lexer :  & mut  Lexer < ' a > , 
1304+         ctx :  & mut  ExpressionContext < ' a ,  ' _ ,  ' _ > , 
1305+     )  -> Result < ' a ,  ( ast:: Ident < ' a > ,  Option < Handle < ast:: Type < ' a > > > ) >  { 
1306+         let  name = lexer. next_ident ( ) ?; 
1307+ 
1308+         let  ty = if  lexer. skip ( Token :: Separator ( ':' ) )  { 
1309+             Some ( self . type_decl ( lexer,  ctx) ?) 
1310+         }  else  { 
1311+             None 
1312+         } ; 
1313+ 
1314+         Ok ( ( name,  ty) ) 
1315+     } 
1316+ 
1317+     /// 'var' _disambiguate_template template_list? optionally_typed_ident 
13011318fn  variable_decl < ' a > ( 
13021319        & mut  self , 
13031320        lexer :  & mut  Lexer < ' a > , 
@@ -1322,13 +1339,7 @@ impl Parser {
13221339            } ; 
13231340            lexer. expect ( Token :: Paren ( '>' ) ) ?; 
13241341        } 
1325-         let  name = lexer. next_ident ( ) ?; 
1326- 
1327-         let  ty = if  lexer. skip ( Token :: Separator ( ':' ) )  { 
1328-             Some ( self . type_decl ( lexer,  ctx) ?) 
1329-         }  else  { 
1330-             None 
1331-         } ; 
1342+         let  ( name,  ty)  = self . optionally_typed_ident ( lexer,  ctx) ?; 
13321343
13331344        let  init = if  lexer. skip ( Token :: Operation ( '=' ) )  { 
13341345            let  handle = self . general_expression ( lexer,  ctx) ?; 
@@ -2141,14 +2152,8 @@ impl Parser {
21412152                        } 
21422153                        "let"  => { 
21432154                            let  _ = lexer. next ( ) ; 
2144-                             let  name = lexer . next_ident ( ) ?; 
2155+                             let  ( name,  given_ty )  = this . optionally_typed_ident ( lexer ,  ctx ) ?; 
21452156
2146-                             let  given_ty = if  lexer. skip ( Token :: Separator ( ':' ) )  { 
2147-                                 let  ty = this. type_decl ( lexer,  ctx) ?; 
2148-                                 Some ( ty) 
2149-                             }  else  { 
2150-                                 None 
2151-                             } ; 
21522157                            lexer. expect ( Token :: Operation ( '=' ) ) ?; 
21532158                            let  expr_id = this. general_expression ( lexer,  ctx) ?; 
21542159                            lexer. expect ( Token :: Separator ( ';' ) ) ?; 
@@ -2163,14 +2168,8 @@ impl Parser {
21632168                        } 
21642169                        "const"  => { 
21652170                            let  _ = lexer. next ( ) ; 
2166-                             let  name = lexer . next_ident ( ) ?; 
2171+                             let  ( name,  given_ty )  = this . optionally_typed_ident ( lexer ,  ctx ) ?; 
21672172
2168-                             let  given_ty = if  lexer. skip ( Token :: Separator ( ':' ) )  { 
2169-                                 let  ty = this. type_decl ( lexer,  ctx) ?; 
2170-                                 Some ( ty) 
2171-                             }  else  { 
2172-                                 None 
2173-                             } ; 
21742173                            lexer. expect ( Token :: Operation ( '=' ) ) ?; 
21752174                            let  expr_id = this. general_expression ( lexer,  ctx) ?; 
21762175                            lexer. expect ( Token :: Separator ( ';' ) ) ?; 
@@ -2185,14 +2184,7 @@ impl Parser {
21852184                        } 
21862185                        "var"  => { 
21872186                            let  _ = lexer. next ( ) ; 
2188- 
2189-                             let  name = lexer. next_ident ( ) ?; 
2190-                             let  ty = if  lexer. skip ( Token :: Separator ( ':' ) )  { 
2191-                                 let  ty = this. type_decl ( lexer,  ctx) ?; 
2192-                                 Some ( ty) 
2193-                             }  else  { 
2194-                                 None 
2195-                             } ; 
2187+                             let  ( name,  ty)  = this. optionally_typed_ident ( lexer,  ctx) ?; 
21962188
21972189                            let  init = if  lexer. skip ( Token :: Operation ( '=' ) )  { 
21982190                                let  init = this. general_expression ( lexer,  ctx) ?; 
@@ -2950,14 +2942,7 @@ impl Parser {
29502942            ( Token :: Word ( "const" ) ,  _)  => { 
29512943                ensure_no_diag_attrs ( "`const`s" . into ( ) ,  diagnostic_filters) ?; 
29522944
2953-                 let  name = lexer. next_ident ( ) ?; 
2954- 
2955-                 let  ty = if  lexer. skip ( Token :: Separator ( ':' ) )  { 
2956-                     let  ty = self . type_decl ( lexer,  & mut  ctx) ?; 
2957-                     Some ( ty) 
2958-                 }  else  { 
2959-                     None 
2960-                 } ; 
2945+                 let  ( name,  ty)  = self . optionally_typed_ident ( lexer,  & mut  ctx) ?; 
29612946
29622947                lexer. expect ( Token :: Operation ( '=' ) ) ?; 
29632948                let  init = self . general_expression ( lexer,  & mut  ctx) ?; 
@@ -2973,13 +2958,7 @@ impl Parser {
29732958            ( Token :: Word ( "override" ) ,  _)  => { 
29742959                ensure_no_diag_attrs ( "`override`s" . into ( ) ,  diagnostic_filters) ?; 
29752960
2976-                 let  name = lexer. next_ident ( ) ?; 
2977- 
2978-                 let  ty = if  lexer. skip ( Token :: Separator ( ':' ) )  { 
2979-                     Some ( self . type_decl ( lexer,  & mut  ctx) ?) 
2980-                 }  else  { 
2981-                     None 
2982-                 } ; 
2961+                 let  ( name,  ty)  = self . optionally_typed_ident ( lexer,  & mut  ctx) ?; 
29832962
29842963                let  init = if  lexer. skip ( Token :: Operation ( '=' ) )  { 
29852964                    Some ( self . general_expression ( lexer,  & mut  ctx) ?) 
0 commit comments