1
Fork 0

Make RegionName Copy by (transitively) interning the few string variants

This commit is contained in:
Amanda Stjerna 2024-02-07 14:51:51 +01:00
parent ad3d04c55e
commit 795be51dd9

View file

@ -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 {