Skip to content

Commit 76021d8

Browse files
committed
Refactor away extension traits RegionEscape and HasTypeFlags
1 parent f9808ea commit 76021d8

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

51 files changed

+159
-186
lines changed

src/librustc/middle/implicator.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use middle::def_id::DefId;
1414
use middle::infer::{InferCtxt, GenericKind};
1515
use middle::subst::Substs;
1616
use middle::traits;
17-
use middle::ty::{self, RegionEscape, ToPredicate, Ty};
17+
use middle::ty::{self, ToPredicate, Ty};
1818
use middle::ty::fold::{TypeFoldable, TypeFolder};
1919

2020
use syntax::ast;

src/librustc/middle/infer/error_reporting.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ use middle::def_id::DefId;
8282
use middle::infer::{self, TypeOrigin};
8383
use middle::region;
8484
use middle::subst;
85-
use middle::ty::{self, Ty, HasTypeFlags};
85+
use middle::ty::{self, Ty, TypeFoldable};
8686
use middle::ty::{Region, ReFree};
8787
use middle::ty::error::TypeError;
8888

@@ -250,7 +250,7 @@ pub trait ErrorReporting<'tcx> {
250250

251251
fn values_str(&self, values: &ValuePairs<'tcx>) -> Option<String>;
252252

253-
fn expected_found_str<T: fmt::Display + Resolvable<'tcx> + HasTypeFlags>(
253+
fn expected_found_str<T: fmt::Display + Resolvable<'tcx> + TypeFoldable<'tcx>>(
254254
&self,
255255
exp_found: &ty::error::ExpectedFound<T>)
256256
-> Option<String>;
@@ -575,7 +575,7 @@ impl<'a, 'tcx> ErrorReporting<'tcx> for InferCtxt<'a, 'tcx> {
575575
}
576576
}
577577

578-
fn expected_found_str<T: fmt::Display + Resolvable<'tcx> + HasTypeFlags>(
578+
fn expected_found_str<T: fmt::Display + Resolvable<'tcx> + TypeFoldable<'tcx>>(
579579
&self,
580580
exp_found: &ty::error::ExpectedFound<T>)
581581
-> Option<String>

src/librustc/middle/infer/freshen.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,7 @@
3030
//! variable only once, and it does so as soon as it can, so it is reasonable to ask what the type
3131
//! inferencer knows "so far".
3232
33-
use middle::ty::{self, Ty, HasTypeFlags};
34-
use middle::ty::fold::TypeFoldable;
33+
use middle::ty::{self, Ty, TypeFoldable};
3534
use middle::ty::fold::TypeFolder;
3635
use std::collections::hash_map::{self, Entry};
3736

src/librustc/middle/infer/higher_ranked/mod.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,8 @@
1414
use super::{CombinedSnapshot, InferCtxt, HigherRankedType, SkolemizationMap};
1515
use super::combine::CombineFields;
1616

17-
use middle::ty::{self, Binder};
17+
use middle::ty::{self, Binder, TypeFoldable};
1818
use middle::ty::error::TypeError;
19-
use middle::ty::fold::TypeFoldable;
2019
use middle::ty::relate::{Relate, RelateResult, TypeRelation};
2120
use syntax::codemap::Span;
2221
use util::nodemap::{FnvHashMap, FnvHashSet};
@@ -557,7 +556,7 @@ pub fn plug_leaks<'a,'tcx,T>(infcx: &InferCtxt<'a,'tcx>,
557556
snapshot: &CombinedSnapshot,
558557
value: &T)
559558
-> T
560-
where T : TypeFoldable<'tcx> + ty::HasTypeFlags
559+
where T : TypeFoldable<'tcx>
561560
{
562561
debug_assert!(leak_check(infcx, &skol_map, snapshot).is_ok());
563562

src/librustc/middle/infer/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ use middle::subst::Subst;
3030
use middle::traits;
3131
use middle::ty::adjustment;
3232
use middle::ty::{TyVid, IntVid, FloatVid};
33-
use middle::ty::{self, Ty, HasTypeFlags};
33+
use middle::ty::{self, Ty};
3434
use middle::ty::error::{ExpectedFound, TypeError, UnconstrainedNumeric};
3535
use middle::ty::fold::{TypeFolder, TypeFoldable};
3636
use middle::ty::relate::{Relate, RelateResult, TypeRelation};

src/librustc/middle/infer/resolve.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@
99
// except according to those terms.
1010

1111
use super::{InferCtxt, FixupError, FixupResult};
12-
use middle::ty::{self, Ty, HasTypeFlags};
13-
use middle::ty::fold::{TypeFoldable};
12+
use middle::ty::{self, Ty, TypeFoldable};
1413

1514
///////////////////////////////////////////////////////////////////////////
1615
// OPPORTUNISTIC TYPE RESOLVER

src/librustc/middle/intrinsicck.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use middle::def::DefFn;
1313
use middle::def_id::DefId;
1414
use middle::subst::{Subst, Substs, EnumeratedItems};
1515
use middle::ty::{TransmuteRestriction, ctxt, TyBareFn};
16-
use middle::ty::{self, Ty, HasTypeFlags};
16+
use middle::ty::{self, Ty, TypeFoldable};
1717

1818
use std::fmt;
1919

src/librustc/middle/subst.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ pub use self::ParamSpace::*;
1414
pub use self::RegionSubsts::*;
1515

1616
use middle::cstore;
17-
use middle::ty::{self, Ty, HasTypeFlags, RegionEscape};
17+
use middle::ty::{self, Ty};
1818
use middle::ty::fold::{TypeFoldable, TypeFolder};
1919

2020
use serialize::{Encodable, Encoder, Decodable, Decoder};

src/librustc/middle/traits/error_reporting.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,8 @@ use super::{
2626
use fmt_macros::{Parser, Piece, Position};
2727
use middle::def_id::DefId;
2828
use middle::infer::InferCtxt;
29-
use middle::ty::{self, ToPredicate, HasTypeFlags, ToPolyTraitRef, TraitRef, Ty};
29+
use middle::ty::{self, ToPredicate, ToPolyTraitRef, TraitRef, Ty, TypeFoldable};
3030
use middle::ty::fast_reject;
31-
use middle::ty::fold::TypeFoldable;
3231
use util::nodemap::{FnvHashMap, FnvHashSet};
3332

3433
use std::cmp;

src/librustc/middle/traits/fulfill.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
// except according to those terms.
1010

1111
use middle::infer::InferCtxt;
12-
use middle::ty::{self, RegionEscape, Ty, HasTypeFlags};
12+
use middle::ty::{self, Ty, TypeFoldable};
1313

1414
use syntax::ast;
1515
use util::common::ErrorReported;

src/librustc/middle/traits/mod.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,8 @@ use dep_graph::DepNode;
1919
use middle::def_id::DefId;
2020
use middle::free_region::FreeRegionMap;
2121
use middle::subst;
22-
use middle::ty::{self, HasTypeFlags, Ty};
22+
use middle::ty::{self, Ty, TypeFoldable};
2323
use middle::ty::fast_reject;
24-
use middle::ty::fold::TypeFoldable;
2524
use middle::infer::{self, fixup_err_to_string, InferCtxt};
2625

2726
use std::rc::Rc;

src/librustc/middle/traits/object_safety.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use super::elaborate_predicates;
2323
use middle::def_id::DefId;
2424
use middle::subst::{self, SelfSpace, TypeSpace};
2525
use middle::traits;
26-
use middle::ty::{self, HasTypeFlags, ToPolyTraitRef, Ty};
26+
use middle::ty::{self, ToPolyTraitRef, Ty, TypeFoldable};
2727
use std::rc::Rc;
2828
use syntax::ast;
2929

src/librustc/middle/traits/project.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use super::util;
2323

2424
use middle::infer::{self, TypeOrigin};
2525
use middle::subst::Subst;
26-
use middle::ty::{self, ToPredicate, RegionEscape, HasTypeFlags, ToPolyTraitRef, Ty};
26+
use middle::ty::{self, ToPredicate, ToPolyTraitRef, Ty};
2727
use middle::ty::fold::{TypeFoldable, TypeFolder};
2828
use syntax::parse::token;
2929
use util::common::FN_OUTPUT_NAME;

src/librustc/middle/traits/select.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,8 @@ use middle::def_id::DefId;
3939
use middle::infer;
4040
use middle::infer::{InferCtxt, TypeFreshener, TypeOrigin};
4141
use middle::subst::{Subst, Substs, TypeSpace};
42-
use middle::ty::{self, ToPredicate, RegionEscape, ToPolyTraitRef, Ty, HasTypeFlags};
42+
use middle::ty::{self, ToPredicate, ToPolyTraitRef, Ty, TypeFoldable};
4343
use middle::ty::fast_reject;
44-
use middle::ty::fold::TypeFoldable;
4544
use middle::ty::relate::TypeRelation;
4645

4746
use std::cell::RefCell;

src/librustc/middle/ty/adjustment.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@
1111
pub use self::AutoAdjustment::*;
1212
pub use self::AutoRef::*;
1313

14-
use middle::ty::{self, Ty, TypeAndMut};
15-
use middle::ty::HasTypeFlags;
14+
use middle::ty::{self, Ty, TypeAndMut, TypeFoldable};
1615
use middle::ty::LvaluePreference::{NoPreference};
1716

1817
use syntax::ast;

src/librustc/middle/ty/flags.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
// except according to those terms.
1010

1111
use middle::subst;
12-
use middle::ty::{self, HasTypeFlags, Ty, TypeFlags};
12+
use middle::ty::{self, Ty, TypeFlags, TypeFoldable};
1313

1414
pub struct FlagComputation {
1515
pub flags: TypeFlags,

src/librustc/middle/ty/fold.rs

Lines changed: 106 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
use middle::region;
4343
use middle::subst;
4444
use middle::ty::adjustment;
45-
use middle::ty::{self, Binder, Ty, RegionEscape, HasTypeFlags};
45+
use middle::ty::{self, Binder, Ty, TypeFlags};
4646

4747
use std::fmt;
4848
use util::nodemap::{FnvHashMap, FnvHashSet};
@@ -59,6 +59,53 @@ pub trait TypeFoldable<'tcx>: fmt::Debug + Clone {
5959
fn visit_subitems_with<V: TypeVisitor<'tcx>>(&self, visitor: &mut V) -> bool {
6060
self.visit_with(visitor)
6161
}
62+
63+
fn has_regions_escaping_depth(&self, depth: u32) -> bool {
64+
self.visit_with(&mut HasEscapingRegionsVisitor { depth: depth })
65+
}
66+
fn has_escaping_regions(&self) -> bool {
67+
self.has_regions_escaping_depth(0)
68+
}
69+
70+
fn has_type_flags(&self, flags: TypeFlags) -> bool {
71+
self.visit_with(&mut HasTypeFlagsVisitor { flags: flags })
72+
}
73+
fn has_projection_types(&self) -> bool {
74+
self.has_type_flags(TypeFlags::HAS_PROJECTION)
75+
}
76+
fn references_error(&self) -> bool {
77+
self.has_type_flags(TypeFlags::HAS_TY_ERR)
78+
}
79+
fn has_param_types(&self) -> bool {
80+
self.has_type_flags(TypeFlags::HAS_PARAMS)
81+
}
82+
fn has_self_ty(&self) -> bool {
83+
self.has_type_flags(TypeFlags::HAS_SELF)
84+
}
85+
fn has_infer_types(&self) -> bool {
86+
self.has_type_flags(TypeFlags::HAS_TY_INFER)
87+
}
88+
fn needs_infer(&self) -> bool {
89+
self.has_type_flags(TypeFlags::HAS_TY_INFER | TypeFlags::HAS_RE_INFER)
90+
}
91+
fn needs_subst(&self) -> bool {
92+
self.has_type_flags(TypeFlags::NEEDS_SUBST)
93+
}
94+
fn has_closure_types(&self) -> bool {
95+
self.has_type_flags(TypeFlags::HAS_TY_CLOSURE)
96+
}
97+
fn has_erasable_regions(&self) -> bool {
98+
self.has_type_flags(TypeFlags::HAS_RE_EARLY_BOUND |
99+
TypeFlags::HAS_RE_INFER |
100+
TypeFlags::HAS_FREE_REGIONS)
101+
}
102+
/// Indicates whether this value references only 'global'
103+
/// types/lifetimes that are the same regardless of what fn we are
104+
/// in. This is used for caching. Errs on the side of returning
105+
/// false.
106+
fn is_global(&self) -> bool {
107+
!self.has_type_flags(TypeFlags::HAS_LOCAL_NAMES)
108+
}
62109
}
63110

64111
/// The TypeFolder trait defines the actual *folding*. There is a
@@ -518,64 +565,74 @@ pub fn shift_regions<'tcx, T:TypeFoldable<'tcx>>(tcx: &ty::ctxt<'tcx>,
518565
}))
519566
}
520567

521-
impl<'tcx, T: TypeFoldable<'tcx>> RegionEscape for T {
522-
fn has_regions_escaping_depth(&self, depth: u32) -> bool {
523-
struct RegionEscapeVisitor {
524-
depth: u32,
525-
}
526-
527-
impl<'tcx> TypeVisitor<'tcx> for RegionEscapeVisitor {
528-
fn enter_region_binder(&mut self) {
529-
self.depth += 1;
530-
}
568+
/// An "escaping region" is a bound region whose binder is not part of `t`.
569+
///
570+
/// So, for example, consider a type like the following, which has two binders:
571+
///
572+
/// for<'a> fn(x: for<'b> fn(&'a isize, &'b isize))
573+
/// ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ outer scope
574+
/// ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ inner scope
575+
///
576+
/// This type has *bound regions* (`'a`, `'b`), but it does not have escaping regions, because the
577+
/// binders of both `'a` and `'b` are part of the type itself. However, if we consider the *inner
578+
/// fn type*, that type has an escaping region: `'a`.
579+
///
580+
/// Note that what I'm calling an "escaping region" is often just called a "free region". However,
581+
/// we already use the term "free region". It refers to the regions that we use to represent bound
582+
/// regions on a fn definition while we are typechecking its body.
583+
///
584+
/// To clarify, conceptually there is no particular difference between an "escaping" region and a
585+
/// "free" region. However, there is a big difference in practice. Basically, when "entering" a
586+
/// binding level, one is generally required to do some sort of processing to a bound region, such
587+
/// as replacing it with a fresh/skolemized region, or making an entry in the environment to
588+
/// represent the scope to which it is attached, etc. An escaping region represents a bound region
589+
/// for which this processing has not yet been done.
590+
struct HasEscapingRegionsVisitor {
591+
depth: u32,
592+
}
531593

532-
fn exit_region_binder(&mut self) {
533-
self.depth -= 1;
534-
}
594+
impl<'tcx> TypeVisitor<'tcx> for HasEscapingRegionsVisitor {
595+
fn enter_region_binder(&mut self) {
596+
self.depth += 1;
597+
}
535598

536-
fn visit_ty(&mut self, t: Ty<'tcx>) -> bool {
537-
t.region_depth > self.depth
538-
}
599+
fn exit_region_binder(&mut self) {
600+
self.depth -= 1;
601+
}
539602

540-
fn visit_region(&mut self, r: ty::Region) -> bool {
541-
r.escapes_depth(self.depth)
542-
}
543-
}
603+
fn visit_ty(&mut self, t: Ty<'tcx>) -> bool {
604+
t.region_depth > self.depth
605+
}
544606

545-
self.visit_with(&mut RegionEscapeVisitor { depth: depth })
607+
fn visit_region(&mut self, r: ty::Region) -> bool {
608+
r.escapes_depth(self.depth)
546609
}
547610
}
548611

549-
impl<'tcx, T: TypeFoldable<'tcx>> HasTypeFlags for T {
550-
fn has_type_flags(&self, flags: ty::TypeFlags) -> bool {
551-
struct HasTypeFlagsVisitor {
552-
flags: ty::TypeFlags,
553-
}
612+
struct HasTypeFlagsVisitor {
613+
flags: ty::TypeFlags,
614+
}
554615

555-
impl<'tcx> TypeVisitor<'tcx> for HasTypeFlagsVisitor {
556-
fn visit_ty(&mut self, t: Ty) -> bool {
557-
t.flags.get().intersects(self.flags)
558-
}
616+
impl<'tcx> TypeVisitor<'tcx> for HasTypeFlagsVisitor {
617+
fn visit_ty(&mut self, t: Ty) -> bool {
618+
t.flags.get().intersects(self.flags)
619+
}
559620

560-
fn visit_region(&mut self, r: ty::Region) -> bool {
561-
if self.flags.intersects(ty::TypeFlags::HAS_LOCAL_NAMES) {
562-
// does this represent a region that cannot be named
563-
// in a global way? used in fulfillment caching.
564-
match r {
565-
ty::ReStatic | ty::ReEmpty => {}
566-
_ => return true,
567-
}
568-
}
569-
if self.flags.intersects(ty::TypeFlags::HAS_RE_INFER) {
570-
match r {
571-
ty::ReVar(_) | ty::ReSkolemized(..) => { return true }
572-
_ => {}
573-
}
574-
}
575-
false
621+
fn visit_region(&mut self, r: ty::Region) -> bool {
622+
if self.flags.intersects(ty::TypeFlags::HAS_LOCAL_NAMES) {
623+
// does this represent a region that cannot be named
624+
// in a global way? used in fulfillment caching.
625+
match r {
626+
ty::ReStatic | ty::ReEmpty => {}
627+
_ => return true,
576628
}
577629
}
578-
579-
self.visit_with(&mut HasTypeFlagsVisitor { flags: flags })
630+
if self.flags.intersects(ty::TypeFlags::HAS_RE_INFER) {
631+
match r {
632+
ty::ReVar(_) | ty::ReSkolemized(..) => { return true }
633+
_ => {}
634+
}
635+
}
636+
false
580637
}
581638
}

0 commit comments

Comments
 (0)