@@ -954,106 +954,6 @@ impl<'a> Parser<'a> {
954
954
}
955
955
}
956
956
957
- fn is_named_param ( & self ) -> bool {
958
- let offset = match self . token . kind {
959
- token:: Interpolated ( ref nt) => match * * nt {
960
- token:: NtPat ( ..) => return self . look_ahead ( 1 , |t| t == & token:: Colon ) ,
961
- _ => 0 ,
962
- }
963
- token:: BinOp ( token:: And ) | token:: AndAnd => 1 ,
964
- _ if self . token . is_keyword ( kw:: Mut ) => 1 ,
965
- _ => 0 ,
966
- } ;
967
-
968
- self . look_ahead ( offset, |t| t. is_ident ( ) ) &&
969
- self . look_ahead ( offset + 1 , |t| t == & token:: Colon )
970
- }
971
-
972
- /// Skips unexpected attributes and doc comments in this position and emits an appropriate
973
- /// error.
974
- /// This version of parse param doesn't necessarily require identifier names.
975
- fn parse_param_general (
976
- & mut self ,
977
- is_self_allowed : bool ,
978
- is_trait_item : bool ,
979
- allow_c_variadic : bool ,
980
- is_name_required : impl Fn ( & token:: Token ) -> bool ,
981
- ) -> PResult < ' a , Param > {
982
- let lo = self . token . span ;
983
- let attrs = self . parse_outer_attributes ( ) ?;
984
-
985
- // Possibly parse `self`. Recover if we parsed it and it wasn't allowed here.
986
- if let Some ( mut param) = self . parse_self_param ( ) ? {
987
- param. attrs = attrs. into ( ) ;
988
- return if is_self_allowed {
989
- Ok ( param)
990
- } else {
991
- self . recover_bad_self_param ( param, is_trait_item)
992
- } ;
993
- }
994
-
995
- let is_name_required = is_name_required ( & self . token ) ;
996
- let ( pat, ty) = if is_name_required || self . is_named_param ( ) {
997
- debug ! ( "parse_param_general parse_pat (is_name_required:{})" , is_name_required) ;
998
-
999
- let pat = self . parse_fn_param_pat ( ) ?;
1000
- if let Err ( mut err) = self . expect ( & token:: Colon ) {
1001
- if let Some ( ident) = self . parameter_without_type (
1002
- & mut err,
1003
- pat,
1004
- is_name_required,
1005
- is_trait_item,
1006
- ) {
1007
- err. emit ( ) ;
1008
- return Ok ( dummy_arg ( ident) ) ;
1009
- } else {
1010
- return Err ( err) ;
1011
- }
1012
- }
1013
-
1014
- self . eat_incorrect_doc_comment_for_param_type ( ) ;
1015
- ( pat, self . parse_ty_common ( true , true , allow_c_variadic) ?)
1016
- } else {
1017
- debug ! ( "parse_param_general ident_to_pat" ) ;
1018
- let parser_snapshot_before_ty = self . clone ( ) ;
1019
- self . eat_incorrect_doc_comment_for_param_type ( ) ;
1020
- let mut ty = self . parse_ty_common ( true , true , allow_c_variadic) ;
1021
- if ty. is_ok ( ) && self . token != token:: Comma &&
1022
- self . token != token:: CloseDelim ( token:: Paren ) {
1023
- // This wasn't actually a type, but a pattern looking like a type,
1024
- // so we are going to rollback and re-parse for recovery.
1025
- ty = self . unexpected ( ) ;
1026
- }
1027
- match ty {
1028
- Ok ( ty) => {
1029
- let ident = Ident :: new ( kw:: Invalid , self . prev_span ) ;
1030
- let bm = BindingMode :: ByValue ( Mutability :: Immutable ) ;
1031
- let pat = self . mk_pat_ident ( ty. span , bm, ident) ;
1032
- ( pat, ty)
1033
- }
1034
- // If this is a C-variadic argument and we hit an error, return the error.
1035
- Err ( err) if self . token == token:: DotDotDot => return Err ( err) ,
1036
- // Recover from attempting to parse the argument as a type without pattern.
1037
- Err ( mut err) => {
1038
- err. cancel ( ) ;
1039
- mem:: replace ( self , parser_snapshot_before_ty) ;
1040
- self . recover_arg_parse ( ) ?
1041
- }
1042
- }
1043
- } ;
1044
-
1045
- let span = lo. to ( self . token . span ) ;
1046
-
1047
- Ok ( Param {
1048
- attrs : attrs. into ( ) ,
1049
- id : ast:: DUMMY_NODE_ID ,
1050
- is_placeholder : false ,
1051
- pat,
1052
- span,
1053
- ty,
1054
- } )
1055
- }
1056
-
1057
957
/// Parses mutability (`mut` or nothing).
1058
958
fn parse_mutability ( & mut self ) -> Mutability {
1059
959
if self . eat_keyword ( kw:: Mut ) {
@@ -1267,49 +1167,112 @@ impl<'a> Parser<'a> {
1267
1167
Ok ( params)
1268
1168
}
1269
1169
1270
- fn is_isolated_self ( & self , n : usize ) -> bool {
1271
- self . is_keyword_ahead ( n, & [ kw:: SelfLower ] )
1272
- && self . look_ahead ( n + 1 , |t| t != & token:: ModSep )
1273
- }
1170
+ /// Parses the parameter list and result type of a function that may have a `self` parameter.
1171
+ fn parse_fn_decl_with_self (
1172
+ & mut self ,
1173
+ is_name_required : impl Copy + Fn ( & token:: Token ) -> bool ,
1174
+ ) -> PResult < ' a , P < FnDecl > > {
1175
+ // Parse the arguments, starting out with `self` being allowed...
1176
+ let mut is_self_allowed = true ;
1177
+ let ( mut inputs, _) : ( Vec < _ > , _ ) = self . parse_paren_comma_seq ( |p| {
1178
+ let res = p. parse_param_general ( is_self_allowed, true , false , is_name_required) ;
1179
+ // ...but now that we've parsed the first argument, `self` is no longer allowed.
1180
+ is_self_allowed = false ;
1181
+ res
1182
+ } ) ?;
1274
1183
1275
- fn is_isolated_mut_self ( & self , n : usize ) -> bool {
1276
- self . is_keyword_ahead ( n, & [ kw:: Mut ] )
1277
- && self . is_isolated_self ( n + 1 )
1184
+ // Replace duplicated recovered params with `_` pattern to avoid unecessary errors.
1185
+ self . deduplicate_recovered_params_names ( & mut inputs) ;
1186
+
1187
+ Ok ( P ( FnDecl {
1188
+ inputs,
1189
+ output : self . parse_ret_ty ( true ) ?,
1190
+ } ) )
1278
1191
}
1279
1192
1280
- fn expect_self_ident ( & mut self ) -> Ident {
1281
- match self . token . kind {
1282
- // Preserve hygienic context.
1283
- token:: Ident ( name, _) => {
1284
- let span = self . token . span ;
1285
- self . bump ( ) ;
1286
- Ident :: new ( name, span)
1287
- }
1288
- _ => unreachable ! ( ) ,
1193
+ /// Skips unexpected attributes and doc comments in this position and emits an appropriate
1194
+ /// error.
1195
+ /// This version of parse param doesn't necessarily require identifier names.
1196
+ fn parse_param_general (
1197
+ & mut self ,
1198
+ is_self_allowed : bool ,
1199
+ is_trait_item : bool ,
1200
+ allow_c_variadic : bool ,
1201
+ is_name_required : impl Fn ( & token:: Token ) -> bool ,
1202
+ ) -> PResult < ' a , Param > {
1203
+ let lo = self . token . span ;
1204
+ let attrs = self . parse_outer_attributes ( ) ?;
1205
+
1206
+ // Possibly parse `self`. Recover if we parsed it and it wasn't allowed here.
1207
+ if let Some ( mut param) = self . parse_self_param ( ) ? {
1208
+ param. attrs = attrs. into ( ) ;
1209
+ return if is_self_allowed {
1210
+ Ok ( param)
1211
+ } else {
1212
+ self . recover_bad_self_param ( param, is_trait_item)
1213
+ } ;
1289
1214
}
1290
- }
1291
1215
1292
- /// Recover for the grammar `*self`, `*const self`, and `*mut self`.
1293
- fn recover_self_ptr ( & mut self ) -> PResult < ' a , ( ast:: SelfKind , Ident , Span ) > {
1294
- let msg = "cannot pass `self` by raw pointer" ;
1295
- let span = self . token . span ;
1296
- self . struct_span_err ( span, msg)
1297
- . span_label ( span, msg)
1298
- . emit ( ) ;
1216
+ let is_name_required = is_name_required ( & self . token ) ;
1217
+ let ( pat, ty) = if is_name_required || self . is_named_param ( ) {
1218
+ debug ! ( "parse_param_general parse_pat (is_name_required:{})" , is_name_required) ;
1299
1219
1300
- Ok ( ( SelfKind :: Value ( Mutability :: Immutable ) , self . expect_self_ident ( ) , self . prev_span ) )
1301
- }
1220
+ let pat = self . parse_fn_param_pat ( ) ?;
1221
+ if let Err ( mut err) = self . expect ( & token:: Colon ) {
1222
+ if let Some ( ident) = self . parameter_without_type (
1223
+ & mut err,
1224
+ pat,
1225
+ is_name_required,
1226
+ is_trait_item,
1227
+ ) {
1228
+ err. emit ( ) ;
1229
+ return Ok ( dummy_arg ( ident) ) ;
1230
+ } else {
1231
+ return Err ( err) ;
1232
+ }
1233
+ }
1302
1234
1303
- /// Parse `self` or `self: TYPE`. We already know the current token is `self`.
1304
- fn parse_self_possibly_typed ( & mut self , m : Mutability ) -> PResult < ' a , ( SelfKind , Ident , Span ) > {
1305
- let eself_ident = self . expect_self_ident ( ) ;
1306
- let eself_hi = self . prev_span ;
1307
- let eself = if self . eat ( & token:: Colon ) {
1308
- SelfKind :: Explicit ( self . parse_ty ( ) ?, m)
1235
+ self . eat_incorrect_doc_comment_for_param_type ( ) ;
1236
+ ( pat, self . parse_ty_common ( true , true , allow_c_variadic) ?)
1309
1237
} else {
1310
- SelfKind :: Value ( m)
1238
+ debug ! ( "parse_param_general ident_to_pat" ) ;
1239
+ let parser_snapshot_before_ty = self . clone ( ) ;
1240
+ self . eat_incorrect_doc_comment_for_param_type ( ) ;
1241
+ let mut ty = self . parse_ty_common ( true , true , allow_c_variadic) ;
1242
+ if ty. is_ok ( ) && self . token != token:: Comma &&
1243
+ self . token != token:: CloseDelim ( token:: Paren ) {
1244
+ // This wasn't actually a type, but a pattern looking like a type,
1245
+ // so we are going to rollback and re-parse for recovery.
1246
+ ty = self . unexpected ( ) ;
1247
+ }
1248
+ match ty {
1249
+ Ok ( ty) => {
1250
+ let ident = Ident :: new ( kw:: Invalid , self . prev_span ) ;
1251
+ let bm = BindingMode :: ByValue ( Mutability :: Immutable ) ;
1252
+ let pat = self . mk_pat_ident ( ty. span , bm, ident) ;
1253
+ ( pat, ty)
1254
+ }
1255
+ // If this is a C-variadic argument and we hit an error, return the error.
1256
+ Err ( err) if self . token == token:: DotDotDot => return Err ( err) ,
1257
+ // Recover from attempting to parse the argument as a type without pattern.
1258
+ Err ( mut err) => {
1259
+ err. cancel ( ) ;
1260
+ mem:: replace ( self , parser_snapshot_before_ty) ;
1261
+ self . recover_arg_parse ( ) ?
1262
+ }
1263
+ }
1311
1264
} ;
1312
- Ok ( ( eself, eself_ident, eself_hi) )
1265
+
1266
+ let span = lo. to ( self . token . span ) ;
1267
+
1268
+ Ok ( Param {
1269
+ attrs : attrs. into ( ) ,
1270
+ id : ast:: DUMMY_NODE_ID ,
1271
+ is_placeholder : false ,
1272
+ pat,
1273
+ span,
1274
+ ty,
1275
+ } )
1313
1276
}
1314
1277
1315
1278
/// Returns the parsed optional self parameter and whether a self shortcut was used.
@@ -1378,27 +1341,64 @@ impl<'a> Parser<'a> {
1378
1341
Ok ( Some ( Param :: from_self ( ThinVec :: default ( ) , eself, eself_ident) ) )
1379
1342
}
1380
1343
1381
- /// Parses the parameter list and result type of a function that may have a `self` parameter.
1382
- fn parse_fn_decl_with_self (
1383
- & mut self ,
1384
- is_name_required : impl Copy + Fn ( & token:: Token ) -> bool ,
1385
- ) -> PResult < ' a , P < FnDecl > > {
1386
- // Parse the arguments, starting out with `self` being allowed...
1387
- let mut is_self_allowed = true ;
1388
- let ( mut inputs, _) : ( Vec < _ > , _ ) = self . parse_paren_comma_seq ( |p| {
1389
- let res = p. parse_param_general ( is_self_allowed, true , false , is_name_required) ;
1390
- // ...but now that we've parsed the first argument, `self` is no longer allowed.
1391
- is_self_allowed = false ;
1392
- res
1393
- } ) ?;
1344
+ fn is_named_param ( & self ) -> bool {
1345
+ let offset = match self . token . kind {
1346
+ token:: Interpolated ( ref nt) => match * * nt {
1347
+ token:: NtPat ( ..) => return self . look_ahead ( 1 , |t| t == & token:: Colon ) ,
1348
+ _ => 0 ,
1349
+ }
1350
+ token:: BinOp ( token:: And ) | token:: AndAnd => 1 ,
1351
+ _ if self . token . is_keyword ( kw:: Mut ) => 1 ,
1352
+ _ => 0 ,
1353
+ } ;
1394
1354
1395
- // Replace duplicated recovered params with `_` pattern to avoid unecessary errors.
1396
- self . deduplicate_recovered_params_names ( & mut inputs) ;
1355
+ self . look_ahead ( offset, |t| t. is_ident ( ) ) &&
1356
+ self . look_ahead ( offset + 1 , |t| t == & token:: Colon )
1357
+ }
1397
1358
1398
- Ok ( P ( FnDecl {
1399
- inputs,
1400
- output : self . parse_ret_ty ( true ) ?,
1401
- } ) )
1359
+ fn is_isolated_self ( & self , n : usize ) -> bool {
1360
+ self . is_keyword_ahead ( n, & [ kw:: SelfLower ] )
1361
+ && self . look_ahead ( n + 1 , |t| t != & token:: ModSep )
1362
+ }
1363
+
1364
+ fn is_isolated_mut_self ( & self , n : usize ) -> bool {
1365
+ self . is_keyword_ahead ( n, & [ kw:: Mut ] )
1366
+ && self . is_isolated_self ( n + 1 )
1367
+ }
1368
+
1369
+ fn expect_self_ident ( & mut self ) -> Ident {
1370
+ match self . token . kind {
1371
+ // Preserve hygienic context.
1372
+ token:: Ident ( name, _) => {
1373
+ let span = self . token . span ;
1374
+ self . bump ( ) ;
1375
+ Ident :: new ( name, span)
1376
+ }
1377
+ _ => unreachable ! ( ) ,
1378
+ }
1379
+ }
1380
+
1381
+ /// Recover for the grammar `*self`, `*const self`, and `*mut self`.
1382
+ fn recover_self_ptr ( & mut self ) -> PResult < ' a , ( ast:: SelfKind , Ident , Span ) > {
1383
+ let msg = "cannot pass `self` by raw pointer" ;
1384
+ let span = self . token . span ;
1385
+ self . struct_span_err ( span, msg)
1386
+ . span_label ( span, msg)
1387
+ . emit ( ) ;
1388
+
1389
+ Ok ( ( SelfKind :: Value ( Mutability :: Immutable ) , self . expect_self_ident ( ) , self . prev_span ) )
1390
+ }
1391
+
1392
+ /// Parse `self` or `self: TYPE`. We already know the current token is `self`.
1393
+ fn parse_self_possibly_typed ( & mut self , m : Mutability ) -> PResult < ' a , ( SelfKind , Ident , Span ) > {
1394
+ let eself_ident = self . expect_self_ident ( ) ;
1395
+ let eself_hi = self . prev_span ;
1396
+ let eself = if self . eat ( & token:: Colon ) {
1397
+ SelfKind :: Explicit ( self . parse_ty ( ) ?, m)
1398
+ } else {
1399
+ SelfKind :: Value ( m)
1400
+ } ;
1401
+ Ok ( ( eself, eself_ident, eself_hi) )
1402
1402
}
1403
1403
1404
1404
fn is_crate_vis ( & self ) -> bool {
0 commit comments