1use std::fmt;
2
3use derive_where::derive_where;
4#[cfg(feature = "nightly")]
5use rustc_macros::StableHash_NoContext;
6use rustc_type_ir_macros::{GenericTypeVisitable, Lift_Generic};
7use tracing::debug;
8
9use crate::inherent::*;
10use crate::intern::Interned;
11use crate::relate::{Relate, RelateResult, TypeRelation};
12use crate::{
13 BoundRegion, BoundRegionKind, BoundVar, BoundVarIndexKind, DebruijnIndex, FallibleTypeFolder,
14 Flags, Interner, PlaceholderRegion, RegionKind, TypeFlags, TypeFoldable, TypeFolder,
15 TypeVisitable, TypeVisitor,
16};
17
18#[automatically_derived]
impl<I: Interner> ::core::hash::Hash for Region<I> where I: Interner {
fn hash<__H: ::core::hash::Hasher>(&self, __state: &mut __H) {
match self {
Region(ref __field_0) => {
::core::hash::Hash::hash(__field_0, __state);
}
}
}
}#[derive_where(Clone, Copy, PartialEq, Eq, Hash; I: Interner)]
20#[cfg_attr(feature = "nightly", derive(const _: () =
{
impl<I: Interner> ::rustc_data_structures::stable_hash::StableHash for
Region<I> where
I::InternedRegionKind: ::rustc_data_structures::stable_hash::StableHash
{
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
Region(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash_NoContext))]
21#[cfg_attr(feature = "nightly", rustc_pass_by_value)]
22#[derive(GenericTypeVisitable, const _: () =
{
impl<I: Interner, J> ::rustc_type_ir::lift::Lift<J> for Region<I>
where J: Interner, I: ::rustc_type_ir::LiftInto<J> {
type Lifted = Region<J>;
fn lift_to_interner(self, interner: J) -> Self::Lifted {
match self {
Region(__binding_0) => {
Region(__binding_0.lift_to_interner(interner))
}
}
}
}
};Lift_Generic)]
23pub struct Region<I: Interner>(pub I::InternedRegionKind);
24
25impl<I: Interner> Region<I> {
27 #[inline]
28 pub fn new_bound(interner: I, debruijn: DebruijnIndex, bound_region: BoundRegion<I>) -> Self {
29 interner.intern_bound_region(debruijn, bound_region)
30 }
31
32 #[inline]
33 pub fn new_anon_bound(interner: I, debruijn: DebruijnIndex, var: BoundVar) -> Self {
34 Self::new_bound(interner, debruijn, BoundRegion { var, kind: BoundRegionKind::Anon })
35 }
36
37 #[inline]
38 pub fn new_canonical_bound(interner: I, var: BoundVar) -> Self {
39 interner.intern_canonical_bound(var)
40 }
41
42 #[inline]
43 pub fn new_placeholder(interner: I, placeholder: PlaceholderRegion<I>) -> Self {
44 interner.intern_region(RegionKind::RePlaceholder(placeholder))
45 }
46
47 #[inline]
48 pub fn new_static(interner: I) -> Self {
49 interner.get_re_static_lifetime()
50 }
51
52 #[inline]
53 pub fn is_bound(self) -> bool {
54 #[allow(non_exhaustive_omitted_patterns)] match self.0.get() {
RegionKind::ReBound(..) => true,
_ => false,
}matches!(self.0.get(), RegionKind::ReBound(..))
55 }
56
57 #[inline]
60 pub fn type_flags(self) -> TypeFlags {
61 let mut flags = TypeFlags::empty();
62
63 match self.0.get() {
64 RegionKind::ReVar(..) => {
65 flags = flags | TypeFlags::HAS_FREE_REGIONS;
66 flags = flags | TypeFlags::HAS_FREE_LOCAL_REGIONS;
67 flags = flags | TypeFlags::HAS_RE_INFER;
68 }
69 RegionKind::RePlaceholder(..) => {
70 flags = flags | TypeFlags::HAS_FREE_REGIONS;
71 flags = flags | TypeFlags::HAS_FREE_LOCAL_REGIONS;
72 flags = flags | TypeFlags::HAS_RE_PLACEHOLDER;
73 }
74 RegionKind::ReEarlyParam(..) => {
75 flags = flags | TypeFlags::HAS_FREE_REGIONS;
76 flags = flags | TypeFlags::HAS_FREE_LOCAL_REGIONS;
77 flags = flags | TypeFlags::HAS_RE_PARAM;
78 }
79 RegionKind::ReLateParam { .. } => {
80 flags = flags | TypeFlags::HAS_FREE_REGIONS;
81 flags = flags | TypeFlags::HAS_FREE_LOCAL_REGIONS;
82 }
83 RegionKind::ReStatic => {
84 flags = flags | TypeFlags::HAS_FREE_REGIONS;
85 }
86 RegionKind::ReBound(BoundVarIndexKind::Canonical, _) => {
87 flags = flags | TypeFlags::HAS_RE_BOUND;
88 flags = flags | TypeFlags::HAS_CANONICAL_BOUND;
89 }
90 RegionKind::ReBound(BoundVarIndexKind::Bound(..), _) => {
91 flags = flags | TypeFlags::HAS_RE_BOUND;
92 }
93 RegionKind::ReErased => {
94 flags = flags | TypeFlags::HAS_RE_ERASED;
95 }
96 RegionKind::ReError(_) => {
97 flags = flags | TypeFlags::HAS_FREE_REGIONS;
98 flags = flags | TypeFlags::HAS_RE_ERROR;
99 }
100 }
101 {
use ::tracing::__macro_support::Callsite as _;
static __CALLSITE: ::tracing::callsite::DefaultCallsite =
{
static META: ::tracing::Metadata<'static> =
{
::tracing_core::metadata::Metadata::new("event compiler/rustc_type_ir/src/sty/mod.rs:101",
"rustc_type_ir::sty", ::tracing::Level::DEBUG,
::tracing_core::__macro_support::Option::Some("compiler/rustc_type_ir/src/sty/mod.rs"),
::tracing_core::__macro_support::Option::Some(101u32),
::tracing_core::__macro_support::Option::Some("rustc_type_ir::sty"),
::tracing_core::field::FieldSet::new(&["message"],
::tracing_core::callsite::Identifier(&__CALLSITE)),
::tracing::metadata::Kind::EVENT)
};
::tracing::callsite::DefaultCallsite::new(&META)
};
let enabled =
::tracing::Level::DEBUG <= ::tracing::level_filters::STATIC_MAX_LEVEL
&&
::tracing::Level::DEBUG <=
::tracing::level_filters::LevelFilter::current() &&
{
let interest = __CALLSITE.interest();
!interest.is_never() &&
::tracing::__macro_support::__is_enabled(__CALLSITE.metadata(),
interest)
};
if enabled {
(|value_set: ::tracing::field::ValueSet|
{
let meta = __CALLSITE.metadata();
::tracing::Event::dispatch(meta, &value_set);
;
})({
#[allow(unused_imports)]
use ::tracing::field::{debug, display, Value};
__CALLSITE.metadata().fields().value_set_all(&[(::tracing::__macro_support::Option::Some(&format_args!("type_flags({0:?}) = {1:?}",
self, flags) as &dyn ::tracing::field::Value))])
});
} else { ; }
};debug!("type_flags({:?}) = {:?}", self, flags);
102
103 flags
104 }
105
106 #[inline]
107 pub fn kind(self) -> RegionKind<I> {
108 self.0.get()
109 }
110}
111
112impl<I: Interner> Flags for Region<I> {
113 fn flags(&self) -> TypeFlags {
114 self.type_flags()
115 }
116
117 fn outer_exclusive_binder(&self) -> DebruijnIndex {
118 match self.kind() {
119 RegionKind::ReBound(BoundVarIndexKind::Bound(debruijn), _) => debruijn.shifted_in(1),
120 _ => crate::INNERMOST,
121 }
122 }
123}
124
125impl<I: Interner> IntoKind for Region<I> {
126 type Kind = RegionKind<I>;
127
128 fn kind(self) -> Self::Kind {
129 self.0.get()
130 }
131}
132
133impl<I: Interner> Relate<I> for Region<I> {
134 fn relate<R: TypeRelation<I>>(
135 relation: &mut R,
136 a: Region<I>,
137 b: Region<I>,
138 ) -> RelateResult<I, Region<I>> {
139 relation.regions(a, b)
140 }
141}
142
143impl<I: Interner> fmt::Debug for Region<I> {
144 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
145 f.write_fmt(format_args!("{0:?}", self.kind()))write!(f, "{:?}", self.kind())
146 }
147}
148
149impl<I: Interner> TypeVisitable<I> for Region<I> {
150 fn visit_with<V: TypeVisitor<I>>(&self, visitor: &mut V) -> V::Result {
151 visitor.visit_region(*self)
152 }
153}
154
155impl<I: Interner> TypeFoldable<I> for Region<I> {
156 fn try_fold_with<F: FallibleTypeFolder<I>>(self, folder: &mut F) -> Result<Self, F::Error> {
157 folder.try_fold_region(self)
158 }
159
160 fn fold_with<F: TypeFolder<I>>(self, folder: &mut F) -> Self {
161 folder.fold_region(self)
162 }
163}