@@ -140,9 +140,7 @@ struct LifetimeCaptureContext {
140
140
captures : FxHashMap <
141
141
LocalDefId , // original parameter id
142
142
(
143
- Span , // Span
144
- NodeId , // synthetized parameter id
145
- ParamName , // parameter name
143
+ Lifetime , // Lifetime parameter
146
144
LifetimeRes , // original resolution
147
145
) ,
148
146
> ,
@@ -1363,20 +1361,20 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
1363
1361
debug ! ( ?collected_lifetimes) ;
1364
1362
1365
1363
let lifetime_defs = lctx. arena . alloc_from_iter ( collected_lifetimes. iter ( ) . map (
1366
- |( _, & ( span , p_id , p_name , _) ) | {
1367
- let hir_id = lctx. lower_node_id ( p_id ) ;
1368
- debug_assert_ne ! ( lctx. opt_local_def_id( p_id ) , None ) ;
1364
+ |( _, & ( lifetime , _) ) | {
1365
+ let hir_id = lctx. lower_node_id ( lifetime . id ) ;
1366
+ debug_assert_ne ! ( lctx. opt_local_def_id( lifetime . id ) , None ) ;
1369
1367
1370
- let kind = if p_name . ident ( ) . name == kw:: UnderscoreLifetime {
1371
- hir:: LifetimeParamKind :: Elided
1368
+ let ( name , kind) = if lifetime . ident . name == kw:: UnderscoreLifetime {
1369
+ ( hir:: ParamName :: Fresh , hir :: LifetimeParamKind :: Elided )
1372
1370
} else {
1373
- hir:: LifetimeParamKind :: Explicit
1371
+ ( hir:: ParamName :: Plain ( lifetime . ident ) , hir :: LifetimeParamKind :: Explicit )
1374
1372
} ;
1375
1373
1376
1374
hir:: GenericParam {
1377
1375
hir_id,
1378
- name : p_name ,
1379
- span,
1376
+ name,
1377
+ span : lifetime . ident . span ,
1380
1378
pure_wrt_drop : false ,
1381
1379
kind : hir:: GenericParamKind :: Lifetime { kind } ,
1382
1380
colon_span : None ,
@@ -1403,9 +1401,16 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
1403
1401
} ) ;
1404
1402
1405
1403
let lifetimes = self . arena . alloc_from_iter ( collected_lifetimes. into_iter ( ) . map (
1406
- |( _, ( span , _ , p_name , res) ) | {
1404
+ |( _, ( lifetime , res) ) | {
1407
1405
let id = self . next_node_id ( ) ;
1408
- let ident = Ident :: new ( p_name. ident ( ) . name , span) ;
1406
+ let span = lifetime. ident . span ;
1407
+
1408
+ let ident = if lifetime. ident . name == kw:: UnderscoreLifetime {
1409
+ Ident :: with_dummy_span ( kw:: UnderscoreLifetime )
1410
+ } else {
1411
+ lifetime. ident
1412
+ } ;
1413
+
1409
1414
let l = self . new_named_lifetime_with_res ( id, span, ident, res) ;
1410
1415
hir:: GenericArg :: Lifetime ( l)
1411
1416
} ,
@@ -1446,9 +1451,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
1446
1451
remapping : & mut FxHashMap < LocalDefId , LocalDefId > ,
1447
1452
) {
1448
1453
for lifetime in lifetimes_in_bounds {
1449
- let ident = lifetime. ident ;
1450
- let span = ident. span ;
1451
-
1452
1454
let res = self . resolver . get_lifetime_res ( lifetime. id ) . unwrap_or ( LifetimeRes :: Error ) ;
1453
1455
debug ! ( ?res) ;
1454
1456
@@ -1457,39 +1459,34 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
1457
1459
LifetimeRes :: Param { param : old_def_id, binder : _ } => {
1458
1460
if remapping. get ( & old_def_id) . is_none ( ) {
1459
1461
let node_id = self . next_node_id ( ) ;
1460
- let name = ParamName :: Plain ( ident) ;
1461
1462
1462
1463
let new_def_id = self . create_def (
1463
1464
parent_def_id,
1464
1465
node_id,
1465
- DefPathData :: LifetimeNs ( name . ident ( ) . name ) ,
1466
+ DefPathData :: LifetimeNs ( lifetime . ident . name ) ,
1466
1467
) ;
1467
-
1468
1468
remapping. insert ( old_def_id, new_def_id) ;
1469
- captured_lifetimes
1470
- . captures
1471
- . insert ( old_def_id, ( span , node_id , name , res) ) ;
1469
+
1470
+ let new_lifetime = Lifetime { id : node_id , ident : lifetime . ident } ;
1471
+ captured_lifetimes . captures . insert ( old_def_id, ( new_lifetime , res) ) ;
1472
1472
}
1473
1473
}
1474
1474
1475
1475
LifetimeRes :: Fresh { param, binder : _ } => {
1476
- debug_assert_eq ! ( ident. name, kw:: UnderscoreLifetime ) ;
1476
+ debug_assert_eq ! ( lifetime . ident. name, kw:: UnderscoreLifetime ) ;
1477
1477
let old_def_id = self . local_def_id ( param) ;
1478
1478
if remapping. get ( & old_def_id) . is_none ( ) {
1479
1479
let node_id = self . next_node_id ( ) ;
1480
1480
1481
- let name = ParamName :: Fresh ;
1482
-
1483
1481
let new_def_id = self . create_def (
1484
1482
parent_def_id,
1485
1483
node_id,
1486
1484
DefPathData :: LifetimeNs ( kw:: UnderscoreLifetime ) ,
1487
1485
) ;
1488
-
1489
1486
remapping. insert ( old_def_id, new_def_id) ;
1490
- captured_lifetimes
1491
- . captures
1492
- . insert ( old_def_id, ( span , node_id , name , res) ) ;
1487
+
1488
+ let new_lifetime = Lifetime { id : node_id , ident : lifetime . ident } ;
1489
+ captured_lifetimes . captures . insert ( old_def_id, ( new_lifetime , res) ) ;
1493
1490
}
1494
1491
}
1495
1492
@@ -1703,31 +1700,37 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
1703
1700
let extra_lifetime_params = self . resolver . take_extra_lifetime_params ( opaque_ty_node_id) ;
1704
1701
debug ! ( ?extra_lifetime_params) ;
1705
1702
for ( ident, outer_node_id, outer_res) in extra_lifetime_params {
1706
- let Ident { name, span } = ident;
1707
1703
let outer_def_id = self . local_def_id ( outer_node_id) ;
1708
1704
let inner_node_id = self . next_node_id ( ) ;
1709
1705
1710
1706
// Add a definition for the in scope lifetime def.
1711
- let inner_def_id =
1712
- self . create_def ( opaque_ty_def_id, inner_node_id, DefPathData :: LifetimeNs ( name) ) ;
1707
+ let inner_def_id = self . create_def (
1708
+ opaque_ty_def_id,
1709
+ inner_node_id,
1710
+ DefPathData :: LifetimeNs ( ident. name ) ,
1711
+ ) ;
1713
1712
new_remapping. insert ( outer_def_id, inner_def_id) ;
1714
1713
1715
- let ( p_name , inner_res) = match outer_res {
1714
+ let inner_res = match outer_res {
1716
1715
// Input lifetime like `'a`:
1717
1716
LifetimeRes :: Param { param, .. } => {
1718
- ( hir :: ParamName :: Plain ( ident ) , LifetimeRes :: Param { param, binder : fn_node_id } )
1717
+ LifetimeRes :: Param { param, binder : fn_node_id }
1719
1718
}
1720
1719
// Input lifetime like `'1`:
1721
1720
LifetimeRes :: Fresh { param, .. } => {
1722
- ( hir :: ParamName :: Fresh , LifetimeRes :: Fresh { param, binder : fn_node_id } )
1721
+ LifetimeRes :: Fresh { param, binder : fn_node_id }
1723
1722
}
1724
1723
LifetimeRes :: Static | LifetimeRes :: Error => continue ,
1725
1724
res => {
1726
- panic ! ( "Unexpected lifetime resolution {:?} for {:?} at {:?}" , res, ident, span)
1725
+ panic ! (
1726
+ "Unexpected lifetime resolution {:?} for {:?} at {:?}" ,
1727
+ res, ident, ident. span
1728
+ )
1727
1729
}
1728
1730
} ;
1729
1731
1730
- captures. insert ( outer_def_id, ( span, inner_node_id, p_name, inner_res) ) ;
1732
+ let new_lifetime = Lifetime { id : inner_node_id, ident } ;
1733
+ captures. insert ( outer_def_id, ( new_lifetime, inner_res) ) ;
1731
1734
}
1732
1735
1733
1736
debug ! ( ?captures) ;
@@ -1765,20 +1768,20 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
1765
1768
let future_bound = ret;
1766
1769
1767
1770
let generic_params =
1768
- this. arena . alloc_from_iter ( captures. iter ( ) . map ( |( _, & ( span , p_id , p_name , _) ) | {
1769
- let hir_id = this. lower_node_id ( p_id ) ;
1770
- debug_assert_ne ! ( this. opt_local_def_id( p_id ) , None ) ;
1771
+ this. arena . alloc_from_iter ( captures. iter ( ) . map ( |( _, & ( lifetime , _) ) | {
1772
+ let hir_id = this. lower_node_id ( lifetime . id ) ;
1773
+ debug_assert_ne ! ( this. opt_local_def_id( lifetime . id ) , None ) ;
1771
1774
1772
- let kind = if p_name . ident ( ) . name == kw:: UnderscoreLifetime {
1773
- hir:: LifetimeParamKind :: Elided
1775
+ let ( name , kind) = if lifetime . ident . name == kw:: UnderscoreLifetime {
1776
+ ( hir:: ParamName :: Fresh , hir :: LifetimeParamKind :: Elided )
1774
1777
} else {
1775
- hir:: LifetimeParamKind :: Explicit
1778
+ ( hir:: ParamName :: Plain ( lifetime . ident ) , hir :: LifetimeParamKind :: Explicit )
1776
1779
} ;
1777
1780
1778
1781
hir:: GenericParam {
1779
1782
hir_id,
1780
- name : p_name ,
1781
- span,
1783
+ name,
1784
+ span : lifetime . ident . span ,
1782
1785
pure_wrt_drop : false ,
1783
1786
kind : hir:: GenericParamKind :: Lifetime { kind } ,
1784
1787
colon_span : None ,
@@ -1818,9 +1821,16 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
1818
1821
// For the "output" lifetime parameters, we just want to
1819
1822
// generate `'_`.
1820
1823
let generic_args =
1821
- self . arena . alloc_from_iter ( captures. into_iter ( ) . map ( |( _, ( span , _ , p_name , res) ) | {
1824
+ self . arena . alloc_from_iter ( captures. into_iter ( ) . map ( |( _, ( lifetime , res) ) | {
1822
1825
let id = self . next_node_id ( ) ;
1823
- let ident = Ident :: new ( p_name. ident ( ) . name , span) ;
1826
+ let span = lifetime. ident . span ;
1827
+
1828
+ let ident = if lifetime. ident . name == kw:: UnderscoreLifetime {
1829
+ Ident :: with_dummy_span ( kw:: UnderscoreLifetime )
1830
+ } else {
1831
+ lifetime. ident
1832
+ } ;
1833
+
1824
1834
let l = self . new_named_lifetime_with_res ( id, span, ident, res) ;
1825
1835
hir:: GenericArg :: Lifetime ( l)
1826
1836
} ) ) ;
@@ -1912,7 +1922,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
1912
1922
let p_name = ParamName :: Plain ( ident) ;
1913
1923
if let Some ( mut captured_lifetimes) = self . captured_lifetimes . take ( ) {
1914
1924
if let Entry :: Occupied ( o) = captured_lifetimes. captures . entry ( param) {
1915
- param = self . local_def_id ( o. get ( ) . 1 ) ;
1925
+ param = self . local_def_id ( o. get ( ) . 0 . id ) ;
1916
1926
}
1917
1927
1918
1928
self . captured_lifetimes = Some ( captured_lifetimes) ;
@@ -1926,7 +1936,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
1926
1936
let mut param = self . local_def_id ( param) ;
1927
1937
if let Some ( mut captured_lifetimes) = self . captured_lifetimes . take ( ) {
1928
1938
if let Entry :: Occupied ( o) = captured_lifetimes. captures . entry ( param) {
1929
- param = self . local_def_id ( o. get ( ) . 1 ) ;
1939
+ param = self . local_def_id ( o. get ( ) . 0 . id ) ;
1930
1940
}
1931
1941
1932
1942
self . captured_lifetimes = Some ( captured_lifetimes) ;
0 commit comments