1
Fork 0

Capture things as Lifetime object to simplify things

This commit is contained in:
Santiago Pastorino 2022-08-02 18:04:37 -03:00
parent f6b4dd1541
commit 2d826e27c4
No known key found for this signature in database
GPG key ID: 8131A24E0C79EFAF

View file

@ -140,9 +140,7 @@ struct LifetimeCaptureContext {
captures: FxHashMap< captures: FxHashMap<
LocalDefId, // original parameter id LocalDefId, // original parameter id
( (
Span, // Span Lifetime, // Lifetime parameter
NodeId, // synthetized parameter id
ParamName, // parameter name
LifetimeRes, // original resolution LifetimeRes, // original resolution
), ),
>, >,
@ -1363,20 +1361,20 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
debug!(?collected_lifetimes); debug!(?collected_lifetimes);
let lifetime_defs = lctx.arena.alloc_from_iter(collected_lifetimes.iter().map( let lifetime_defs = lctx.arena.alloc_from_iter(collected_lifetimes.iter().map(
|(_, &(span, p_id, p_name, _))| { |(_, &(lifetime, _))| {
let hir_id = lctx.lower_node_id(p_id); let hir_id = lctx.lower_node_id(lifetime.id);
debug_assert_ne!(lctx.opt_local_def_id(p_id), None); debug_assert_ne!(lctx.opt_local_def_id(lifetime.id), None);
let kind = if p_name.ident().name == kw::UnderscoreLifetime { let (name, kind) = if lifetime.ident.name == kw::UnderscoreLifetime {
hir::LifetimeParamKind::Elided (hir::ParamName::Fresh, hir::LifetimeParamKind::Elided)
} else { } else {
hir::LifetimeParamKind::Explicit (hir::ParamName::Plain(lifetime.ident), hir::LifetimeParamKind::Explicit)
}; };
hir::GenericParam { hir::GenericParam {
hir_id, hir_id,
name: p_name, name,
span, span: lifetime.ident.span,
pure_wrt_drop: false, pure_wrt_drop: false,
kind: hir::GenericParamKind::Lifetime { kind }, kind: hir::GenericParamKind::Lifetime { kind },
colon_span: None, colon_span: None,
@ -1403,9 +1401,16 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
}); });
let lifetimes = self.arena.alloc_from_iter(collected_lifetimes.into_iter().map( let lifetimes = self.arena.alloc_from_iter(collected_lifetimes.into_iter().map(
|(_, (span, _, p_name, res))| { |(_, (lifetime, res))| {
let id = self.next_node_id(); let id = self.next_node_id();
let ident = Ident::new(p_name.ident().name, span); let span = lifetime.ident.span;
let ident = if lifetime.ident.name == kw::UnderscoreLifetime {
Ident::with_dummy_span(kw::UnderscoreLifetime)
} else {
lifetime.ident
};
let l = self.new_named_lifetime_with_res(id, span, ident, res); let l = self.new_named_lifetime_with_res(id, span, ident, res);
hir::GenericArg::Lifetime(l) hir::GenericArg::Lifetime(l)
}, },
@ -1446,9 +1451,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
remapping: &mut FxHashMap<LocalDefId, LocalDefId>, remapping: &mut FxHashMap<LocalDefId, LocalDefId>,
) { ) {
for lifetime in lifetimes_in_bounds { for lifetime in lifetimes_in_bounds {
let ident = lifetime.ident;
let span = ident.span;
let res = self.resolver.get_lifetime_res(lifetime.id).unwrap_or(LifetimeRes::Error); let res = self.resolver.get_lifetime_res(lifetime.id).unwrap_or(LifetimeRes::Error);
debug!(?res); debug!(?res);
@ -1457,39 +1459,34 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
LifetimeRes::Param { param: old_def_id, binder: _ } => { LifetimeRes::Param { param: old_def_id, binder: _ } => {
if remapping.get(&old_def_id).is_none() { if remapping.get(&old_def_id).is_none() {
let node_id = self.next_node_id(); let node_id = self.next_node_id();
let name = ParamName::Plain(ident);
let new_def_id = self.create_def( let new_def_id = self.create_def(
parent_def_id, parent_def_id,
node_id, node_id,
DefPathData::LifetimeNs(name.ident().name), DefPathData::LifetimeNs(lifetime.ident.name),
); );
remapping.insert(old_def_id, new_def_id); remapping.insert(old_def_id, new_def_id);
captured_lifetimes
.captures let new_lifetime = Lifetime { id: node_id, ident: lifetime.ident };
.insert(old_def_id, (span, node_id, name, res)); captured_lifetimes.captures.insert(old_def_id, (new_lifetime, res));
} }
} }
LifetimeRes::Fresh { param, binder: _ } => { LifetimeRes::Fresh { param, binder: _ } => {
debug_assert_eq!(ident.name, kw::UnderscoreLifetime); debug_assert_eq!(lifetime.ident.name, kw::UnderscoreLifetime);
let old_def_id = self.local_def_id(param); let old_def_id = self.local_def_id(param);
if remapping.get(&old_def_id).is_none() { if remapping.get(&old_def_id).is_none() {
let node_id = self.next_node_id(); let node_id = self.next_node_id();
let name = ParamName::Fresh;
let new_def_id = self.create_def( let new_def_id = self.create_def(
parent_def_id, parent_def_id,
node_id, node_id,
DefPathData::LifetimeNs(kw::UnderscoreLifetime), DefPathData::LifetimeNs(kw::UnderscoreLifetime),
); );
remapping.insert(old_def_id, new_def_id); remapping.insert(old_def_id, new_def_id);
captured_lifetimes
.captures let new_lifetime = Lifetime { id: node_id, ident: lifetime.ident };
.insert(old_def_id, (span, node_id, name, res)); captured_lifetimes.captures.insert(old_def_id, (new_lifetime, res));
} }
} }
@ -1703,31 +1700,37 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
let extra_lifetime_params = self.resolver.take_extra_lifetime_params(opaque_ty_node_id); let extra_lifetime_params = self.resolver.take_extra_lifetime_params(opaque_ty_node_id);
debug!(?extra_lifetime_params); debug!(?extra_lifetime_params);
for (ident, outer_node_id, outer_res) in extra_lifetime_params { for (ident, outer_node_id, outer_res) in extra_lifetime_params {
let Ident { name, span } = ident;
let outer_def_id = self.local_def_id(outer_node_id); let outer_def_id = self.local_def_id(outer_node_id);
let inner_node_id = self.next_node_id(); let inner_node_id = self.next_node_id();
// Add a definition for the in scope lifetime def. // Add a definition for the in scope lifetime def.
let inner_def_id = let inner_def_id = self.create_def(
self.create_def(opaque_ty_def_id, inner_node_id, DefPathData::LifetimeNs(name)); opaque_ty_def_id,
inner_node_id,
DefPathData::LifetimeNs(ident.name),
);
new_remapping.insert(outer_def_id, inner_def_id); new_remapping.insert(outer_def_id, inner_def_id);
let (p_name, inner_res) = match outer_res { let inner_res = match outer_res {
// Input lifetime like `'a`: // Input lifetime like `'a`:
LifetimeRes::Param { param, .. } => { LifetimeRes::Param { param, .. } => {
(hir::ParamName::Plain(ident), LifetimeRes::Param { param, binder: fn_node_id }) LifetimeRes::Param { param, binder: fn_node_id }
} }
// Input lifetime like `'1`: // Input lifetime like `'1`:
LifetimeRes::Fresh { param, .. } => { LifetimeRes::Fresh { param, .. } => {
(hir::ParamName::Fresh, LifetimeRes::Fresh { param, binder: fn_node_id }) LifetimeRes::Fresh { param, binder: fn_node_id }
} }
LifetimeRes::Static | LifetimeRes::Error => continue, LifetimeRes::Static | LifetimeRes::Error => continue,
res => { res => {
panic!("Unexpected lifetime resolution {:?} for {:?} at {:?}", res, ident, span) panic!(
"Unexpected lifetime resolution {:?} for {:?} at {:?}",
res, ident, ident.span
)
} }
}; };
captures.insert(outer_def_id, (span, inner_node_id, p_name, inner_res)); let new_lifetime = Lifetime { id: inner_node_id, ident };
captures.insert(outer_def_id, (new_lifetime, inner_res));
} }
debug!(?captures); debug!(?captures);
@ -1765,20 +1768,20 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
let future_bound = ret; let future_bound = ret;
let generic_params = let generic_params =
this.arena.alloc_from_iter(captures.iter().map(|(_, &(span, p_id, p_name, _))| { this.arena.alloc_from_iter(captures.iter().map(|(_, &(lifetime, _))| {
let hir_id = this.lower_node_id(p_id); let hir_id = this.lower_node_id(lifetime.id);
debug_assert_ne!(this.opt_local_def_id(p_id), None); debug_assert_ne!(this.opt_local_def_id(lifetime.id), None);
let kind = if p_name.ident().name == kw::UnderscoreLifetime { let (name, kind) = if lifetime.ident.name == kw::UnderscoreLifetime {
hir::LifetimeParamKind::Elided (hir::ParamName::Fresh, hir::LifetimeParamKind::Elided)
} else { } else {
hir::LifetimeParamKind::Explicit (hir::ParamName::Plain(lifetime.ident), hir::LifetimeParamKind::Explicit)
}; };
hir::GenericParam { hir::GenericParam {
hir_id, hir_id,
name: p_name, name,
span, span: lifetime.ident.span,
pure_wrt_drop: false, pure_wrt_drop: false,
kind: hir::GenericParamKind::Lifetime { kind }, kind: hir::GenericParamKind::Lifetime { kind },
colon_span: None, colon_span: None,
@ -1818,9 +1821,16 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
// For the "output" lifetime parameters, we just want to // For the "output" lifetime parameters, we just want to
// generate `'_`. // generate `'_`.
let generic_args = let generic_args =
self.arena.alloc_from_iter(captures.into_iter().map(|(_, (span, _, p_name, res))| { self.arena.alloc_from_iter(captures.into_iter().map(|(_, (lifetime, res))| {
let id = self.next_node_id(); let id = self.next_node_id();
let ident = Ident::new(p_name.ident().name, span); let span = lifetime.ident.span;
let ident = if lifetime.ident.name == kw::UnderscoreLifetime {
Ident::with_dummy_span(kw::UnderscoreLifetime)
} else {
lifetime.ident
};
let l = self.new_named_lifetime_with_res(id, span, ident, res); let l = self.new_named_lifetime_with_res(id, span, ident, res);
hir::GenericArg::Lifetime(l) hir::GenericArg::Lifetime(l)
})); }));
@ -1912,7 +1922,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
let p_name = ParamName::Plain(ident); let p_name = ParamName::Plain(ident);
if let Some(mut captured_lifetimes) = self.captured_lifetimes.take() { if let Some(mut captured_lifetimes) = self.captured_lifetimes.take() {
if let Entry::Occupied(o) = captured_lifetimes.captures.entry(param) { if let Entry::Occupied(o) = captured_lifetimes.captures.entry(param) {
param = self.local_def_id(o.get().1); param = self.local_def_id(o.get().0.id);
} }
self.captured_lifetimes = Some(captured_lifetimes); self.captured_lifetimes = Some(captured_lifetimes);
@ -1926,7 +1936,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
let mut param = self.local_def_id(param); let mut param = self.local_def_id(param);
if let Some(mut captured_lifetimes) = self.captured_lifetimes.take() { if let Some(mut captured_lifetimes) = self.captured_lifetimes.take() {
if let Entry::Occupied(o) = captured_lifetimes.captures.entry(param) { if let Entry::Occupied(o) = captured_lifetimes.captures.entry(param) {
param = self.local_def_id(o.get().1); param = self.local_def_id(o.get().0.id);
} }
self.captured_lifetimes = Some(captured_lifetimes); self.captured_lifetimes = Some(captured_lifetimes);