Make RegionName
Copy
by (transitively) interning the few string variants
This commit is contained in:
parent
ad3d04c55e
commit
795be51dd9
1 changed files with 13 additions and 13 deletions
|
@ -15,7 +15,7 @@ use crate::{universal_regions::DefiningTy, MirBorrowckCtxt};
|
||||||
|
|
||||||
/// A name for a particular region used in emitting diagnostics. This name could be a generated
|
/// A name for a particular region used in emitting diagnostics. This name could be a generated
|
||||||
/// name like `'1`, a name used by the user like `'a`, or a name like `'static`.
|
/// name like `'1`, a name used by the user like `'a`, or a name like `'static`.
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
pub(crate) struct RegionName {
|
pub(crate) struct RegionName {
|
||||||
/// The name of the region (interned).
|
/// The name of the region (interned).
|
||||||
pub(crate) name: Symbol,
|
pub(crate) name: Symbol,
|
||||||
|
@ -26,7 +26,7 @@ pub(crate) struct RegionName {
|
||||||
/// Denotes the source of a region that is named by a `RegionName`. For example, a free region that
|
/// Denotes the source of a region that is named by a `RegionName`. For example, a free region that
|
||||||
/// was named by the user would get `NamedLateParamRegion` and `'static` lifetime would get `Static`.
|
/// was named by the user would get `NamedLateParamRegion` and `'static` lifetime would get `Static`.
|
||||||
/// This helps to print the right kinds of diagnostics.
|
/// This helps to print the right kinds of diagnostics.
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
pub(crate) enum RegionNameSource {
|
pub(crate) enum RegionNameSource {
|
||||||
/// A bound (not free) region that was instantiated at the def site (not an HRTB).
|
/// A bound (not free) region that was instantiated at the def site (not an HRTB).
|
||||||
NamedEarlyParamRegion(Span),
|
NamedEarlyParamRegion(Span),
|
||||||
|
@ -43,7 +43,7 @@ pub(crate) enum RegionNameSource {
|
||||||
/// The region corresponding to the return type of a closure.
|
/// The region corresponding to the return type of a closure.
|
||||||
AnonRegionFromOutput(RegionNameHighlight, &'static str),
|
AnonRegionFromOutput(RegionNameHighlight, &'static str),
|
||||||
/// The region from a type yielded by a coroutine.
|
/// The region from a type yielded by a coroutine.
|
||||||
AnonRegionFromYieldTy(Span, String),
|
AnonRegionFromYieldTy(Span, Symbol),
|
||||||
/// An anonymous region from an async fn.
|
/// An anonymous region from an async fn.
|
||||||
AnonRegionFromAsyncFn(Span),
|
AnonRegionFromAsyncFn(Span),
|
||||||
/// An anonymous region from an impl self type or trait
|
/// An anonymous region from an impl self type or trait
|
||||||
|
@ -52,7 +52,7 @@ pub(crate) enum RegionNameSource {
|
||||||
|
|
||||||
/// Describes what to highlight to explain to the user that we're giving an anonymous region a
|
/// Describes what to highlight to explain to the user that we're giving an anonymous region a
|
||||||
/// synthesized name, and how to highlight it.
|
/// synthesized name, and how to highlight it.
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone, Copy)]
|
||||||
pub(crate) enum RegionNameHighlight {
|
pub(crate) enum RegionNameHighlight {
|
||||||
/// The anonymous region corresponds to a reference that was found by traversing the type in the HIR.
|
/// The anonymous region corresponds to a reference that was found by traversing the type in the HIR.
|
||||||
MatchedHirTy(Span),
|
MatchedHirTy(Span),
|
||||||
|
@ -60,11 +60,11 @@ pub(crate) enum RegionNameHighlight {
|
||||||
MatchedAdtAndSegment(Span),
|
MatchedAdtAndSegment(Span),
|
||||||
/// The anonymous region corresponds to a region where the type annotation is completely missing
|
/// The anonymous region corresponds to a region where the type annotation is completely missing
|
||||||
/// from the code, e.g. in a closure arguments `|x| { ... }`, where `x` is a reference.
|
/// from the code, e.g. in a closure arguments `|x| { ... }`, where `x` is a reference.
|
||||||
CannotMatchHirTy(Span, String),
|
CannotMatchHirTy(Span, Symbol),
|
||||||
/// The anonymous region corresponds to a region where the type annotation is completely missing
|
/// The anonymous region corresponds to a region where the type annotation is completely missing
|
||||||
/// from the code, and *even if* we print out the full name of the type, the region name won't
|
/// from the code, and *even if* we print out the full name of the type, the region name won't
|
||||||
/// be included. This currently occurs for opaque types like `impl Future`.
|
/// be included. This currently occurs for opaque types like `impl Future`.
|
||||||
Occluded(Span, String),
|
Occluded(Span, Symbol),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl RegionName {
|
impl RegionName {
|
||||||
|
@ -249,7 +249,7 @@ impl<'tcx> MirBorrowckCtxt<'_, 'tcx> {
|
||||||
assert!(self.regioncx.universal_regions().is_universal_region(fr));
|
assert!(self.regioncx.universal_regions().is_universal_region(fr));
|
||||||
|
|
||||||
match self.region_names.borrow_mut().entry(fr) {
|
match self.region_names.borrow_mut().entry(fr) {
|
||||||
IndexEntry::Occupied(precomputed_name) => Some(precomputed_name.get().clone()),
|
IndexEntry::Occupied(precomputed_name) => Some(*precomputed_name.get()),
|
||||||
IndexEntry::Vacant(slot) => {
|
IndexEntry::Vacant(slot) => {
|
||||||
let new_name = self
|
let new_name = self
|
||||||
.give_name_from_error_region(fr)
|
.give_name_from_error_region(fr)
|
||||||
|
@ -262,8 +262,8 @@ impl<'tcx> MirBorrowckCtxt<'_, 'tcx> {
|
||||||
self.give_name_if_anonymous_region_appears_in_arg_position_impl_trait(fr)
|
self.give_name_if_anonymous_region_appears_in_arg_position_impl_trait(fr)
|
||||||
});
|
});
|
||||||
|
|
||||||
if let Some(new_name) = &new_name {
|
if let Some(new_name) = new_name {
|
||||||
slot.insert(new_name.clone());
|
slot.insert(new_name);
|
||||||
}
|
}
|
||||||
debug!("give_region_a_name: gave name {:?}", new_name);
|
debug!("give_region_a_name: gave name {:?}", new_name);
|
||||||
|
|
||||||
|
@ -460,9 +460,9 @@ impl<'tcx> MirBorrowckCtxt<'_, 'tcx> {
|
||||||
);
|
);
|
||||||
if type_name.contains(&format!("'{counter}")) {
|
if type_name.contains(&format!("'{counter}")) {
|
||||||
// Only add a label if we can confirm that a region was labelled.
|
// Only add a label if we can confirm that a region was labelled.
|
||||||
RegionNameHighlight::CannotMatchHirTy(span, type_name)
|
RegionNameHighlight::CannotMatchHirTy(span, Symbol::intern(&type_name))
|
||||||
} else {
|
} else {
|
||||||
RegionNameHighlight::Occluded(span, type_name)
|
RegionNameHighlight::Occluded(span, Symbol::intern(&type_name))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -882,7 +882,7 @@ impl<'tcx> MirBorrowckCtxt<'_, 'tcx> {
|
||||||
|
|
||||||
Some(RegionName {
|
Some(RegionName {
|
||||||
name: self.synthesize_region_name(),
|
name: self.synthesize_region_name(),
|
||||||
source: RegionNameSource::AnonRegionFromYieldTy(yield_span, type_name),
|
source: RegionNameSource::AnonRegionFromYieldTy(yield_span, Symbol::intern(&type_name)),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -974,7 +974,7 @@ impl<'tcx> MirBorrowckCtxt<'_, 'tcx> {
|
||||||
Some(RegionName {
|
Some(RegionName {
|
||||||
name: region_name,
|
name: region_name,
|
||||||
source: RegionNameSource::AnonRegionFromArgument(
|
source: RegionNameSource::AnonRegionFromArgument(
|
||||||
RegionNameHighlight::CannotMatchHirTy(arg_span, arg_name?.to_string()),
|
RegionNameHighlight::CannotMatchHirTy(arg_span, arg_name?),
|
||||||
),
|
),
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue