rustc_middle/ty/
rvalue_scopes.rs1use rustc_hir as hir;
2use rustc_hir::ItemLocalMap;
3use rustc_macros::{HashStable, TyDecodable, TyEncodable};
4use tracing::debug;
5
6use crate::middle::region::{Scope, ScopeData, ScopeTree};
7
8#[derive(TyEncodable, TyDecodable, Clone, Debug, Default, Eq, PartialEq, HashStable)]
11pub struct RvalueScopes {
12 map: ItemLocalMap<Option<Scope>>,
13}
14
15impl RvalueScopes {
16 pub fn new() -> Self {
17 Self { map: <_>::default() }
18 }
19
20 pub fn temporary_scope(
24 &self,
25 region_scope_tree: &ScopeTree,
26 expr_id: hir::ItemLocalId,
27 ) -> (Option<Scope>, Option<Scope>) {
28 if let Some(&s) = self.map.get(&expr_id) {
30 debug!("temporary_scope({expr_id:?}) = {s:?} [custom]");
31 return (s, None);
32 }
33
34 region_scope_tree
39 .default_temporary_scope(Scope { local_id: expr_id, data: ScopeData::Node })
40 }
41
42 pub fn record_rvalue_scope(&mut self, var: hir::ItemLocalId, lifetime: Option<Scope>) {
44 debug!("record_rvalue_scope(var={var:?}, lifetime={lifetime:?})");
45 if let Some(lifetime) = lifetime {
46 assert!(var != lifetime.local_id);
47 }
48 self.map.insert(var, lifetime);
49 }
50}