Remove region from UpvarCapture and move it to CapturedPlace
Region info is completely unnecessary for upvar capture kind computation and is only needed to create the final upvar tuple ty. Doing so makes creation of UpvarCapture very cheap and expose further cleanup opportunity.
This commit is contained in:
parent
3698e03fb6
commit
48258ffe5a
9 changed files with 103 additions and 116 deletions
|
@ -52,29 +52,18 @@ impl UpvarId {
|
|||
/// Information describing the capture of an upvar. This is computed
|
||||
/// during `typeck`, specifically by `regionck`.
|
||||
#[derive(PartialEq, Clone, Debug, Copy, TyEncodable, TyDecodable, TypeFoldable, HashStable)]
|
||||
pub enum UpvarCapture<'tcx> {
|
||||
pub enum UpvarCapture {
|
||||
/// Upvar is captured by value. This is always true when the
|
||||
/// closure is labeled `move`, but can also be true in other cases
|
||||
/// depending on inference.
|
||||
ByValue,
|
||||
|
||||
/// Upvar is captured by reference.
|
||||
ByRef(UpvarBorrow<'tcx>),
|
||||
}
|
||||
|
||||
#[derive(PartialEq, Clone, Copy, TyEncodable, TyDecodable, TypeFoldable, HashStable)]
|
||||
pub struct UpvarBorrow<'tcx> {
|
||||
/// The kind of borrow: by-ref upvars have access to shared
|
||||
/// immutable borrows, which are not part of the normal language
|
||||
/// syntax.
|
||||
pub kind: BorrowKind,
|
||||
|
||||
/// Region of the resulting reference.
|
||||
pub region: ty::Region<'tcx>,
|
||||
ByRef(BorrowKind),
|
||||
}
|
||||
|
||||
pub type UpvarListMap = FxHashMap<DefId, FxIndexMap<hir::HirId, UpvarId>>;
|
||||
pub type UpvarCaptureMap<'tcx> = FxHashMap<UpvarId, UpvarCapture<'tcx>>;
|
||||
pub type UpvarCaptureMap = FxHashMap<UpvarId, UpvarCapture>;
|
||||
|
||||
/// Given the closure DefId this map provides a map of root variables to minimum
|
||||
/// set of `CapturedPlace`s that need to be tracked to support all captures of that closure.
|
||||
|
@ -144,10 +133,13 @@ pub struct CapturedPlace<'tcx> {
|
|||
pub place: HirPlace<'tcx>,
|
||||
|
||||
/// `CaptureKind` and expression(s) that resulted in such capture of `place`.
|
||||
pub info: CaptureInfo<'tcx>,
|
||||
pub info: CaptureInfo,
|
||||
|
||||
/// Represents if `place` can be mutated or not.
|
||||
pub mutability: hir::Mutability,
|
||||
|
||||
/// Region of the resulting reference if the upvar is captured by ref.
|
||||
pub region: Option<ty::Region<'tcx>>,
|
||||
}
|
||||
|
||||
impl<'tcx> CapturedPlace<'tcx> {
|
||||
|
@ -281,7 +273,7 @@ pub fn is_ancestor_or_same_capture(
|
|||
/// for a particular capture as well as identifying the part of the source code
|
||||
/// that triggered this capture to occur.
|
||||
#[derive(PartialEq, Clone, Debug, Copy, TyEncodable, TyDecodable, TypeFoldable, HashStable)]
|
||||
pub struct CaptureInfo<'tcx> {
|
||||
pub struct CaptureInfo {
|
||||
/// Expr Id pointing to use that resulted in selecting the current capture kind
|
||||
///
|
||||
/// Eg:
|
||||
|
@ -319,7 +311,7 @@ pub struct CaptureInfo<'tcx> {
|
|||
pub path_expr_id: Option<hir::HirId>,
|
||||
|
||||
/// Capture mode that was selected
|
||||
pub capture_kind: UpvarCapture<'tcx>,
|
||||
pub capture_kind: UpvarCapture,
|
||||
}
|
||||
|
||||
pub fn place_to_string_for_capture<'tcx>(tcx: TyCtxt<'tcx>, place: &HirPlace<'tcx>) -> String {
|
||||
|
|
|
@ -56,8 +56,8 @@ pub use self::binding::BindingMode::*;
|
|||
pub use self::closure::{
|
||||
is_ancestor_or_same_capture, place_to_string_for_capture, BorrowKind, CaptureInfo,
|
||||
CapturedPlace, ClosureKind, MinCaptureInformationMap, MinCaptureList,
|
||||
RootVariableMinCaptureList, UpvarBorrow, UpvarCapture, UpvarCaptureMap, UpvarId, UpvarListMap,
|
||||
UpvarPath, CAPTURE_STRUCT_LOCAL,
|
||||
RootVariableMinCaptureList, UpvarCapture, UpvarCaptureMap, UpvarId, UpvarListMap, UpvarPath,
|
||||
CAPTURE_STRUCT_LOCAL,
|
||||
};
|
||||
pub use self::consts::{Const, ConstInt, ConstKind, InferConst, ScalarInt, Unevaluated, ValTree};
|
||||
pub use self::context::{
|
||||
|
|
|
@ -47,12 +47,6 @@ impl fmt::Debug for ty::UpvarId {
|
|||
}
|
||||
}
|
||||
|
||||
impl<'tcx> fmt::Debug for ty::UpvarBorrow<'tcx> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
write!(f, "UpvarBorrow({:?}, {:?})", self.kind, self.region)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'tcx> fmt::Debug for ty::ExistentialTraitRef<'tcx> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
with_no_trimmed_paths(|| fmt::Display::fmt(self, f))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue