提交 952dded8 编写于 作者: F Felix S. Klock II

Refactored VecPerParamSpace to hide exposure of `Vec` representation.

This basically meant changing the interface so that no borrowed `&Vec`
is exposed, by hiding `fn get_vec` and `fn get_mut_vec` and revising
`fn all_vecs`.

Instead, clients should use one of the other methods; `get_slice`,
`pop`, `truncate`, `replace`, `push_all`, or `is_empty_in`, which
should work for any case currently used in rustc.
上级 9f2a43c1
......@@ -100,7 +100,7 @@ fn enc_vec_per_param_space<T>(w: &mut MemWriter,
op: |&mut MemWriter, &ctxt, &T|) {
for &space in subst::ParamSpace::all().iter() {
mywrite!(w, "[");
for t in v.get_vec(space).iter() {
for t in v.get_slice(space).iter() {
op(w, cx, t);
}
mywrite!(w, "]");
......
......@@ -810,7 +810,7 @@ fn encode_vec_per_param_space<T>(ebml_w: &mut Encoder,
v: &subst::VecPerParamSpace<T>,
f: |&mut Encoder, &T|) {
for &space in subst::ParamSpace::all().iter() {
ebml_w.emit_from_vec(v.get_vec(space).as_slice(),
ebml_w.emit_from_vec(v.get_slice(space),
|ebml_w, n| Ok(f(ebml_w, n))).unwrap();
}
}
......
......@@ -264,6 +264,12 @@ pub struct VecPerParamSpace<T> {
vecs: (Vec<T>, Vec<T>, Vec<T>)
}
impl<T:Clone> VecPerParamSpace<T> {
pub fn push_all(&mut self, space: ParamSpace, values: &[T]) {
self.get_mut_vec(space).push_all(values);
}
}
impl<T> VecPerParamSpace<T> {
pub fn empty() -> VecPerParamSpace<T> {
VecPerParamSpace {
......@@ -293,6 +299,18 @@ pub fn push(&mut self, space: ParamSpace, value: T) {
self.get_mut_vec(space).push(value);
}
pub fn pop(&mut self, space: ParamSpace) -> Option<T> {
self.get_mut_vec(space).pop()
}
pub fn truncate(&mut self, space: ParamSpace, len: uint) {
self.get_mut_vec(space).truncate(len)
}
pub fn replace(&mut self, space: ParamSpace, elems: Vec<T>) {
*self.get_mut_vec(space) = elems;
}
pub fn get_self<'a>(&'a self) -> Option<&'a T> {
let v = self.get_vec(SelfSpace);
assert!(v.len() <= 1);
......@@ -303,11 +321,19 @@ pub fn len(&self, space: ParamSpace) -> uint {
self.get_vec(space).len()
}
pub fn get_vec<'a>(&'a self, space: ParamSpace) -> &'a Vec<T> {
pub fn is_empty_in(&self, space: ParamSpace) -> bool {
self.get_vec(space).len() == 0
}
pub fn get_slice<'a>(&'a self, space: ParamSpace) -> &'a [T] {
self.get_vec(space).as_slice()
}
fn get_vec<'a>(&'a self, space: ParamSpace) -> &'a Vec<T> {
self.vecs.get(space as uint).unwrap()
}
pub fn get_mut_vec<'a>(&'a mut self, space: ParamSpace) -> &'a mut Vec<T> {
fn get_mut_vec<'a>(&'a mut self, space: ParamSpace) -> &'a mut Vec<T> {
self.vecs.get_mut(space as uint).unwrap()
}
......@@ -336,8 +362,8 @@ pub fn iter<'a>(&'a self) -> Chain<Items<'a,T>,
r.iter().chain(s.iter().chain(f.iter()))
}
pub fn all_vecs(&self, pred: |&Vec<T>| -> bool) -> bool {
self.vecs.iter().all(pred)
pub fn all_vecs(&self, pred: |&[T]| -> bool) -> bool {
self.vecs.iter().map(|v|v.as_slice()).all(pred)
}
pub fn all(&self, pred: |&T| -> bool) -> bool {
......
......@@ -216,10 +216,8 @@ fn resolve_default_method_vtables(bcx: &Block,
bcx.tcx(), &param_substs, &impl_res);
// Now we pull any vtables for parameters on the actual method.
param_vtables
.get_mut_vec(subst::FnSpace)
.push_all(
impl_vtables.get_vec(subst::FnSpace).as_slice());
param_vtables.push_all(subst::FnSpace,
impl_vtables.get_slice(subst::FnSpace));
param_vtables
}
......
......@@ -554,7 +554,7 @@ fn from_def_id_and_substs(type_map: &mut TypeMap,
// Maybe check that there is no self type here.
let tps = substs.types.get_vec(subst::TypeSpace);
let tps = substs.types.get_slice(subst::TypeSpace);
if tps.len() > 0 {
output.push_char('<');
......@@ -1377,9 +1377,9 @@ fn get_template_parameters(cx: &CrateContext,
}
// Handle other generic parameters
let actual_types = param_substs.substs.types.get_vec(subst::FnSpace);
let actual_types = param_substs.substs.types.get_slice(subst::FnSpace);
for (index, &ast::TyParam{ ident: ident, .. }) in generics.ty_params.iter().enumerate() {
let actual_type = *actual_types.get(index);
let actual_type = actual_types[index];
// Add actual type name to <...> clause of function name
let actual_type_name = compute_debuginfo_type_name(cx,
actual_type,
......
......@@ -209,7 +209,7 @@ pub fn type_of(cx: &CrateContext, t: ty::t) -> Type {
// avoids creating more than one copy of the enum when one
// of the enum's variants refers to the enum itself.
let repr = adt::represent_type(cx, t);
let tps = substs.types.get_vec(subst::TypeSpace);
let tps = substs.types.get_slice(subst::TypeSpace);
let name = llvm_type_name(cx, an_enum, did, tps);
adt::incomplete_type_of(cx, &*repr, name.as_slice())
}
......@@ -266,7 +266,7 @@ pub fn type_of(cx: &CrateContext, t: ty::t) -> Type {
// in *after* placing it into the type cache. This prevents
// infinite recursion with recursive struct types.
let repr = adt::represent_type(cx, t);
let tps = substs.types.get_vec(subst::TypeSpace);
let tps = substs.types.get_slice(subst::TypeSpace);
let name = llvm_type_name(cx, a_struct, did, tps);
adt::incomplete_type_of(cx, &*repr, name.as_slice())
}
......@@ -305,7 +305,7 @@ pub enum named_ty { a_struct, an_enum }
pub fn llvm_type_name(cx: &CrateContext,
what: named_ty,
did: ast::DefId,
tps: &Vec<ty::t>)
tps: &[ty::t])
-> String
{
let name = match what {
......
......@@ -981,7 +981,7 @@ pub fn empty() -> Generics {
}
pub fn has_type_params(&self, space: subst::ParamSpace) -> bool {
!self.types.get_vec(space).is_empty()
!self.types.is_empty_in(space)
}
}
......@@ -4644,14 +4644,14 @@ pub fn construct_parameter_environment(
let mut types = VecPerParamSpace::empty();
for &space in subst::ParamSpace::all().iter() {
push_types_from_defs(tcx, &mut types, space,
generics.types.get_vec(space));
generics.types.get_slice(space));
}
// map bound 'a => free 'a
let mut regions = VecPerParamSpace::empty();
for &space in subst::ParamSpace::all().iter() {
push_region_params(&mut regions, space, free_id,
generics.regions.get_vec(space));
generics.regions.get_slice(space));
}
let free_substs = Substs {
......@@ -4666,7 +4666,7 @@ pub fn construct_parameter_environment(
let mut bounds = VecPerParamSpace::empty();
for &space in subst::ParamSpace::all().iter() {
push_bounds_from_defs(tcx, &mut bounds, space, &free_substs,
generics.types.get_vec(space));
generics.types.get_slice(space));
}
debug!("construct_parameter_environment: free_id={} \
......@@ -4684,7 +4684,7 @@ pub fn construct_parameter_environment(
fn push_region_params(regions: &mut VecPerParamSpace<ty::Region>,
space: subst::ParamSpace,
free_id: ast::NodeId,
region_params: &Vec<RegionParameterDef>)
region_params: &[RegionParameterDef])
{
for r in region_params.iter() {
regions.push(space, ty::free_region_from_def(free_id, r));
......@@ -4694,7 +4694,7 @@ fn push_region_params(regions: &mut VecPerParamSpace<ty::Region>,
fn push_types_from_defs(tcx: &ty::ctxt,
types: &mut subst::VecPerParamSpace<ty::t>,
space: subst::ParamSpace,
defs: &Vec<TypeParameterDef>) {
defs: &[TypeParameterDef]) {
for (i, def) in defs.iter().enumerate() {
let ty = ty::mk_param(tcx, space, i, def.def_id);
types.push(space, ty);
......@@ -4705,7 +4705,7 @@ fn push_bounds_from_defs(tcx: &ty::ctxt,
bounds: &mut subst::VecPerParamSpace<ParamBounds>,
space: subst::ParamSpace,
free_substs: &subst::Substs,
defs: &Vec<TypeParameterDef>) {
defs: &[TypeParameterDef]) {
for def in defs.iter() {
let b = (*def.bounds).subst(tcx, free_substs);
bounds.push(space, b);
......
......@@ -203,7 +203,7 @@ fn ast_path_substs<AC:AstConv,RS:RegionScope>(
};
// Convert the type parameters supplied by the user.
let ty_param_defs = decl_generics.types.get_vec(TypeSpace);
let ty_param_defs = decl_generics.types.get_slice(TypeSpace);
let supplied_ty_param_count = path.segments.iter().flat_map(|s| s.types.iter()).count();
let formal_ty_param_count = ty_param_defs.len();
let required_ty_param_count = ty_param_defs.iter()
......
......@@ -264,7 +264,7 @@ fn construct_transformed_self_ty_for_object(
// The subst we get in has Err as the "Self" type. For an object
// type, we don't put any type into the Self paramspace, so let's
// make a copy of rcvr_substs that has the Self paramspace empty.
obj_substs.types.get_mut_vec(subst::SelfSpace).pop().unwrap();
obj_substs.types.pop(subst::SelfSpace).unwrap();
match method_ty.explicit_self {
ast::SelfStatic => {
......@@ -1133,7 +1133,7 @@ fn confirm_candidate(&self, rcvr_ty: ty::t, candidate: &Candidate)
let m_regions =
self.fcx.infcx().region_vars_for_defs(
self.span,
candidate.method_ty.generics.regions.get_vec(subst::FnSpace));
candidate.method_ty.generics.regions.get_slice(subst::FnSpace));
let all_substs = candidate.rcvr_substs.clone().with_method(m_types, m_regions);
......
......@@ -917,8 +917,8 @@ fn compare_impl_method(tcx: &ty::ctxt,
return;
}
let it = trait_m.generics.types.get_vec(subst::FnSpace).iter()
.zip(impl_m.generics.types.get_vec(subst::FnSpace).iter());
let it = trait_m.generics.types.get_slice(subst::FnSpace).iter()
.zip(impl_m.generics.types.get_slice(subst::FnSpace).iter());
// This code is best explained by example. Consider a trait:
//
......@@ -989,8 +989,8 @@ fn compare_impl_method(tcx: &ty::ctxt,
let trait_to_skol_substs =
trait_to_impl_substs
.subst(tcx, &impl_to_skol_substs)
.with_method(skol_tps.get_vec(subst::FnSpace).clone(),
skol_regions.get_vec(subst::FnSpace).clone());
.with_method(Vec::from_slice(skol_tps.get_slice(subst::FnSpace)),
Vec::from_slice(skol_regions.get_slice(subst::FnSpace)));
let trait_fty = ty::mk_bare_fn(tcx, trait_m.fty.clone());
let trait_fty = trait_fty.subst(tcx, &trait_to_skol_substs);
......@@ -2002,7 +2002,7 @@ pub fn impl_self_ty(vcx: &VtableContext,
let ity = ty::lookup_item_type(tcx, did);
let (n_tps, rps, raw_ty) =
(ity.generics.types.len(subst::TypeSpace),
ity.generics.regions.get_vec(subst::TypeSpace),
ity.generics.regions.get_slice(subst::TypeSpace),
ity.ty);
let rps = vcx.infcx.region_vars_for_defs(span, rps);
......@@ -4126,12 +4126,10 @@ pub fn instantiate_path(fcx: &FnCtxt,
// a problem.
for &space in ParamSpace::all().iter() {
adjust_type_parameters(fcx, span, space, type_defs, &mut substs);
assert_eq!(substs.types.get_vec(space).len(),
type_defs.get_vec(space).len());
assert_eq!(substs.types.len(space), type_defs.len(space));
adjust_region_parameters(fcx, span, space, region_defs, &mut substs);
assert_eq!(substs.regions().get_vec(space).len(),
region_defs.get_vec(space).len());
assert_eq!(substs.regions().len(space), region_defs.len(space));
}
fcx.write_ty_substs(node_id, polytype.ty, ty::ItemSubsts {
......@@ -4183,8 +4181,8 @@ fn push_explicit_parameters_from_segment_to_substs(
*/
{
let type_count = type_defs.get_vec(space).len();
assert_eq!(substs.types.get_vec(space).len(), 0);
let type_count = type_defs.len(space);
assert_eq!(substs.types.len(space), 0);
for (i, &typ) in segment.types.iter().enumerate() {
let t = fcx.to_ty(&*typ);
if i < type_count {
......@@ -4198,14 +4196,14 @@ fn push_explicit_parameters_from_segment_to_substs(
but found {} parameter(s)",
type_count,
segment.types.len()).as_slice());
substs.types.get_mut_vec(space).truncate(0);
substs.types.truncate(space, 0);
}
}
}
{
let region_count = region_defs.get_vec(space).len();
assert_eq!(substs.regions().get_vec(space).len(), 0);
let region_count = region_defs.len(space);
assert_eq!(substs.regions().len(space), 0);
for (i, lifetime) in segment.lifetimes.iter().enumerate() {
let r = ast_region_to_region(fcx.tcx(), lifetime);
if i < region_count {
......@@ -4218,7 +4216,7 @@ fn push_explicit_parameters_from_segment_to_substs(
expected {} parameter(s) but found {} parameter(s)",
region_count,
segment.lifetimes.len()).as_slice());
substs.mut_regions().get_mut_vec(space).truncate(0);
substs.mut_regions().truncate(space, 0);
}
}
}
......@@ -4231,8 +4229,8 @@ fn adjust_type_parameters(
defs: &VecPerParamSpace<ty::TypeParameterDef>,
substs: &mut Substs)
{
let provided_len = substs.types.get_vec(space).len();
let desired = defs.get_vec(space).as_slice();
let provided_len = substs.types.len(space);
let desired = defs.get_slice(space);
let required_len = desired.iter()
.take_while(|d| d.default.is_none())
.count();
......@@ -4252,8 +4250,8 @@ fn adjust_type_parameters(
// Nothing specified at all: supply inference variables for
// everything.
if provided_len == 0 {
let provided = substs.types.get_mut_vec(space);
*provided = fcx.infcx().next_ty_vars(desired.len());
substs.types.replace(space,
fcx.infcx().next_ty_vars(desired.len()));
return;
}
......@@ -4270,8 +4268,8 @@ fn adjust_type_parameters(
qualifier,
required_len,
provided_len).as_slice());
let provided = substs.types.get_mut_vec(space);
*provided = Vec::from_elem(desired.len(), ty::mk_err());
substs.types.replace(space,
Vec::from_elem(desired.len(), ty::mk_err()));
return;
}
......@@ -4287,7 +4285,7 @@ fn adjust_type_parameters(
let default = default.subst_spanned(fcx.tcx(), substs, Some(span));
substs.types.push(space, default);
}
assert_eq!(substs.types.get_vec(space).len(), desired.len());
assert_eq!(substs.types.len(space), desired.len());
debug!("Final substs: {}", substs.repr(fcx.tcx()));
}
......@@ -4299,20 +4297,22 @@ fn adjust_region_parameters(
defs: &VecPerParamSpace<ty::RegionParameterDef>,
substs: &mut Substs)
{
let provided = substs.mut_regions().get_mut_vec(space);
let desired = defs.get_vec(space);
let provided_len = substs.mut_regions().len(space);
let desired = defs.get_slice(space);
// Enforced by `push_explicit_parameters_from_segment_to_substs()`.
assert!(provided.len() <= desired.len());
assert!(provided_len <= desired.len());
// If nothing was provided, just use inference variables.
if provided.len() == 0 {
*provided = fcx.infcx().region_vars_for_defs(span, desired);
if provided_len == 0 {
substs.mut_regions().replace(
space,
fcx.infcx().region_vars_for_defs(span, desired));
return;
}
// If just the right number were provided, everybody is happy.
if provided.len() == desired.len() {
if provided_len == desired.len() {
return;
}
......@@ -4325,9 +4325,11 @@ fn adjust_region_parameters(
expected {} parameter(s) \
but found {} parameter(s)",
desired.len(),
provided.len()).as_slice());
provided_len).as_slice());
*provided = fcx.infcx().region_vars_for_defs(span, desired);
substs.mut_regions().replace(
space,
fcx.infcx().region_vars_for_defs(span, desired));
}
}
......
......@@ -735,12 +735,12 @@ pub fn make_substs_for_receiver_types(tcx: &ty::ctxt,
*/
let meth_tps: Vec<ty::t> =
method.generics.types.get_vec(subst::FnSpace)
method.generics.types.get_slice(subst::FnSpace)
.iter()
.map(|def| ty::mk_param_from_def(tcx, def))
.collect();
let meth_regions: Vec<ty::Region> =
method.generics.regions.get_vec(subst::FnSpace)
method.generics.regions.get_slice(subst::FnSpace)
.iter()
.map(|def| ty::ReEarlyBound(def.def_id.node, def.space,
def.index, def.name))
......@@ -767,10 +767,12 @@ fn subst_receiver_types_in_method_ty(tcx: &ty::ctxt,
// replace the type parameters declared on the trait with those
// from the impl
for &space in [subst::TypeSpace, subst::SelfSpace].iter() {
*method_generics.types.get_mut_vec(space) =
impl_poly_type.generics.types.get_vec(space).clone();
*method_generics.regions.get_mut_vec(space) =
impl_poly_type.generics.regions.get_vec(space).clone();
method_generics.types.replace(
space,
Vec::from_slice(impl_poly_type.generics.types.get_slice(space)));
method_generics.regions.replace(
space,
Vec::from_slice(impl_poly_type.generics.regions.get_slice(space)));
}
debug!("subst_receiver_types_in_method_ty: method_generics={}",
......
......@@ -115,32 +115,30 @@ fn substs(&self,
let mut substs = subst::Substs::empty();
for &space in subst::ParamSpace::all().iter() {
let a_tps = a_subst.types.get_vec(space);
let b_tps = b_subst.types.get_vec(space);
let tps = if_ok!(self.tps(space,
a_tps.as_slice(),
b_tps.as_slice()));
let a_regions = a_subst.regions().get_vec(space);
let b_regions = b_subst.regions().get_vec(space);
let r_variances = variances.regions.get_vec(space);
let a_tps = a_subst.types.get_slice(space);
let b_tps = b_subst.types.get_slice(space);
let tps = if_ok!(self.tps(space, a_tps, b_tps));
let a_regions = a_subst.regions().get_slice(space);
let b_regions = b_subst.regions().get_slice(space);
let r_variances = variances.regions.get_slice(space);
let regions = if_ok!(relate_region_params(self,
item_def_id,
r_variances,
a_regions,
b_regions));
*substs.types.get_mut_vec(space) = tps;
*substs.mut_regions().get_mut_vec(space) = regions;
substs.types.replace(space, tps);
substs.mut_regions().replace(space, regions);
}
return Ok(substs);
fn relate_region_params<C:Combine>(this: &C,
item_def_id: ast::DefId,
variances: &Vec<ty::Variance>,
a_rs: &Vec<ty::Region>,
b_rs: &Vec<ty::Region>)
variances: &[ty::Variance],
a_rs: &[ty::Region],
b_rs: &[ty::Region])
-> cres<Vec<ty::Region>>
{
let tcx = this.infcx().tcx;
......@@ -160,9 +158,9 @@ fn relate_region_params<C:Combine>(this: &C,
assert_eq!(num_region_params, b_rs.len());
let mut rs = vec!();
for i in range(0, num_region_params) {
let a_r = *a_rs.get(i);
let b_r = *b_rs.get(i);
let variance = *variances.get(i);
let a_r = a_rs[i];
let b_r = b_rs[i];
let variance = variances[i];
let r = match variance {
ty::Invariant => {
eq_regions(this, a_r, b_r)
......
......@@ -624,7 +624,7 @@ pub fn next_region_var(&self, origin: RegionVariableOrigin) -> ty::Region {
pub fn region_vars_for_defs(&self,
span: Span,
defs: &Vec<ty::RegionParameterDef>)
defs: &[ty::RegionParameterDef])
-> Vec<ty::Region> {
defs.iter()
.map(|d| self.next_region_var(EarlyBoundRegion(span, d.name)))
......@@ -647,7 +647,7 @@ pub fn fresh_substs_for_type(&self,
assert!(generics.regions.len(subst::FnSpace) == 0);
let type_parameter_count = generics.types.len(subst::TypeSpace);
let region_param_defs = generics.regions.get_vec(subst::TypeSpace);
let region_param_defs = generics.regions.get_slice(subst::TypeSpace);
let regions = self.region_vars_for_defs(span, region_param_defs);
let type_parameters = self.next_ty_vars(type_parameter_count);
subst::Substs::new_type(type_parameters, regions)
......
......@@ -749,15 +749,15 @@ fn add_constraints_from_ty(&mut self,
// All type parameters on enums and structs should be
// in the TypeSpace.
assert!(generics.types.get_vec(subst::SelfSpace).is_empty());
assert!(generics.types.get_vec(subst::FnSpace).is_empty());
assert!(generics.regions.get_vec(subst::SelfSpace).is_empty());
assert!(generics.regions.get_vec(subst::FnSpace).is_empty());
assert!(generics.types.is_empty_in(subst::SelfSpace));
assert!(generics.types.is_empty_in(subst::FnSpace));
assert!(generics.regions.is_empty_in(subst::SelfSpace));
assert!(generics.regions.is_empty_in(subst::FnSpace));
self.add_constraints_from_substs(
def_id,
generics.types.get_vec(subst::TypeSpace),
generics.regions.get_vec(subst::TypeSpace),
generics.types.get_slice(subst::TypeSpace),
generics.regions.get_slice(subst::TypeSpace),
substs,
variance);
}
......@@ -768,22 +768,22 @@ fn add_constraints_from_ty(&mut self,
// Traits DO have a Self type parameter, but it is
// erased from object types.
assert!(!generics.types.get_vec(subst::SelfSpace).is_empty() &&
substs.types.get_vec(subst::SelfSpace).is_empty());
assert!(!generics.types.is_empty_in(subst::SelfSpace) &&
substs.types.is_empty_in(subst::SelfSpace));
// Traits never declare region parameters in the self
// space.
assert!(generics.regions.get_vec(subst::SelfSpace).is_empty());
assert!(generics.regions.is_empty_in(subst::SelfSpace));
// Traits never declare type/region parameters in the
// fn space.
assert!(generics.types.get_vec(subst::FnSpace).is_empty());
assert!(generics.regions.get_vec(subst::FnSpace).is_empty());
assert!(generics.types.is_empty_in(subst::FnSpace));
assert!(generics.regions.is_empty_in(subst::FnSpace));
self.add_constraints_from_substs(
def_id,
generics.types.get_vec(subst::TypeSpace),
generics.regions.get_vec(subst::TypeSpace),
generics.types.get_slice(subst::TypeSpace),
generics.regions.get_slice(subst::TypeSpace),
substs,
variance);
}
......@@ -832,8 +832,8 @@ fn add_constraints_from_ty(&mut self,
/// object, etc) appearing in a context with ambient variance `variance`
fn add_constraints_from_substs(&mut self,
def_id: ast::DefId,
type_param_defs: &Vec<ty::TypeParameterDef>,
region_param_defs: &Vec<ty::RegionParameterDef>,
type_param_defs: &[ty::TypeParameterDef],
region_param_defs: &[ty::RegionParameterDef],
substs: &subst::Substs,
variance: VarianceTermPtr<'a>) {
debug!("add_constraints_from_substs(def_id={:?})", def_id);
......
......@@ -449,8 +449,8 @@ pub fn parameterized(cx: &ctxt,
}
}
let tps = substs.types.get_vec(subst::TypeSpace);
let ty_params = generics.types.get_vec(subst::TypeSpace);
let tps = substs.types.get_slice(subst::TypeSpace);
let ty_params = generics.types.get_slice(subst::TypeSpace);
let has_defaults = ty_params.last().map_or(false, |def| def.default.is_some());
let num_defaults = if has_defaults && !cx.sess.verbose() {
ty_params.iter().zip(tps.iter()).rev().take_while(|&(def, &actual)| {
......@@ -468,7 +468,7 @@ pub fn parameterized(cx: &ctxt,
}
if cx.sess.verbose() {
for t in substs.types.get_vec(subst::SelfSpace).iter() {
for t in substs.types.get_slice(subst::SelfSpace).iter() {
strs.push(format!("for {}", t.repr(cx)));
}
}
......@@ -598,9 +598,9 @@ fn repr(&self, tcx: &ctxt) -> String {
impl<T:Repr> Repr for subst::VecPerParamSpace<T> {
fn repr(&self, tcx: &ctxt) -> String {
format!("[{};{};{}]",
self.get_vec(subst::TypeSpace).repr(tcx),
self.get_vec(subst::SelfSpace).repr(tcx),
self.get_vec(subst::FnSpace).repr(tcx))
self.get_slice(subst::TypeSpace).repr(tcx),
self.get_slice(subst::SelfSpace).repr(tcx),
self.get_slice(subst::FnSpace).repr(tcx))
}
}
......
......@@ -505,11 +505,12 @@ fn clean(&self) -> TyParamBound {
}
fn external_path(name: &str, substs: &subst::Substs) -> Path {
let lifetimes = substs.regions().get_vec(subst::TypeSpace)
let lifetimes = substs.regions().get_slice(subst::TypeSpace)
.iter()
.filter_map(|v| v.clean())
.collect();
let types = substs.types.get_vec(subst::TypeSpace).clean();
let types = Vec::from_slice(substs.types.get_slice(subst::TypeSpace));
let types = types.clean();
Path {
global: false,
segments: vec![PathSegment {
......@@ -674,8 +675,8 @@ fn clean(&self) -> Generics {
// is implicit.
let space = {
if !self.types.get_vec(subst::FnSpace).is_empty() ||
!self.regions.get_vec(subst::FnSpace).is_empty()
if !self.types.is_empty_in(subst::FnSpace) ||
!self.regions.is_empty_in(subst::FnSpace)
{
subst::FnSpace
} else {
......@@ -684,8 +685,8 @@ fn clean(&self) -> Generics {
};
Generics {
type_params: self.types.get_vec(space).clean(),
lifetimes: self.regions.get_vec(space).clean(),
type_params: Vec::from_slice(self.types.get_slice(space)).clean(),
lifetimes: Vec::from_slice(self.regions.get_slice(space)).clean(),
}
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册