Skip to content

Commit aa3678d

Browse files
committed
Remove HirVec from Generics.
1 parent d297b19 commit aa3678d

File tree

14 files changed

+127
-87
lines changed

14 files changed

+127
-87
lines changed

src/librustc/hir/intravisit.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -672,7 +672,7 @@ pub fn walk_generic_args<'v, V: Visitor<'v>>(
672672
_path_span: Span,
673673
generic_args: &'v GenericArgs<'v>,
674674
) {
675-
walk_list!(visitor, visit_generic_arg, &generic_args.args);
675+
walk_list!(visitor, visit_generic_arg, generic_args.args);
676676
walk_list!(visitor, visit_assoc_type_binding, generic_args.bindings);
677677
}
678678

@@ -780,7 +780,7 @@ pub fn walk_generic_param<'v, V: Visitor<'v>>(visitor: &mut V, param: &'v Generi
780780
}
781781

782782
pub fn walk_generics<'v, V: Visitor<'v>>(visitor: &mut V, generics: &'v Generics<'v>) {
783-
walk_list!(visitor, visit_generic_param, &generics.params);
783+
walk_list!(visitor, visit_generic_param, generics.params);
784784
walk_list!(visitor, visit_where_predicate, generics.where_clause.predicates);
785785
}
786786

src/librustc/hir/lowering.rs

Lines changed: 62 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -893,7 +893,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
893893
// in-band-lifetimes introduced by generics or where-clauses
894894
// wouldn't have been added yet.
895895
let generics =
896-
this.lower_generics(generics, ImplTraitContext::Universal(&mut params));
896+
this.lower_generics_mut(generics, ImplTraitContext::Universal(&mut params));
897897
let res = f(this, &mut params);
898898
(params, (generics, res))
899899
})
@@ -914,6 +914,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
914914

915915
lowered_generics.params = lowered_params.into();
916916

917+
let lowered_generics = lowered_generics.into_generics(self.arena);
917918
(lowered_generics, res)
918919
}
919920

@@ -1224,28 +1225,25 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
12241225
};
12251226
hir::TyKind::Rptr(lifetime, self.lower_mt(mt, itctx))
12261227
}
1227-
TyKind::BareFn(ref f) => self.with_in_scope_lifetime_defs(&f.generic_params, |this| {
1228-
this.with_anonymous_lifetime_mode(AnonymousLifetimeMode::PassThrough, |this| {
1229-
hir::TyKind::BareFn(
1230-
this.arena.alloc(hir::BareFnTy {
1231-
generic_params: this.arena.alloc_from_iter(
1232-
this.lower_generic_params(
1233-
&f.generic_params,
1234-
&NodeMap::default(),
1235-
ImplTraitContext::disallowed(),
1236-
)
1237-
.into_iter(),
1228+
TyKind::BareFn(ref f) => {
1229+
self.with_in_scope_lifetime_defs(&f.generic_params, |this| {
1230+
this.with_anonymous_lifetime_mode(AnonymousLifetimeMode::PassThrough, |this| {
1231+
hir::TyKind::BareFn(this.arena.alloc(hir::BareFnTy {
1232+
generic_params: this.lower_generic_params(
1233+
&f.generic_params,
1234+
&NodeMap::default(),
1235+
ImplTraitContext::disallowed(),
12381236
),
12391237
unsafety: f.unsafety,
12401238
abi: this.lower_extern(f.ext),
12411239
decl: this.lower_fn_decl(&f.decl, None, false, None),
12421240
param_names: this.arena.alloc_from_iter(
12431241
this.lower_fn_params_to_names(&f.decl).into_iter(),
12441242
),
1245-
}),
1246-
)
1243+
}))
1244+
})
12471245
})
1248-
}),
1246+
}
12491247
TyKind::Never => hir::TyKind::Never,
12501248
TyKind::Tup(ref tys) => {
12511249
hir::TyKind::Tup(self.arena.alloc_from_iter(
@@ -1414,12 +1412,13 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
14141412
opaque_ty_def_index,
14151413
&hir_bounds,
14161414
);
1415+
let lifetime_defs = self.arena.alloc_from_iter(lifetime_defs.into_iter());
14171416

14181417
debug!("lower_opaque_impl_trait: lifetimes={:#?}", lifetimes,);
14191418

14201419
debug!("lower_opaque_impl_trait: lifetime_defs={:#?}", lifetime_defs,);
14211420

1422-
self.with_hir_id_owner(opaque_ty_node_id, |lctx| {
1421+
self.with_hir_id_owner(opaque_ty_node_id, move |lctx| {
14231422
let opaque_ty_item = hir::OpaqueTy {
14241423
generics: hir::Generics {
14251424
params: lifetime_defs,
@@ -1978,7 +1977,11 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
19781977
hir_id: Some(id),
19791978
res: Some(self.lower_res(res)),
19801979
infer_args,
1981-
args: if generic_args.is_empty() { None } else { Some(self.arena.alloc(generic_args)) },
1980+
args: if generic_args.is_empty() {
1981+
None
1982+
} else {
1983+
Some(self.arena.alloc(generic_args.into_generic_args(self.arena)))
1984+
},
19821985
}
19831986
}
19841987

@@ -1987,15 +1990,15 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
19871990
data: &AngleBracketedArgs,
19881991
param_mode: ParamMode,
19891992
mut itctx: ImplTraitContext<'_, 'hir>,
1990-
) -> (hir::GenericArgs<'hir>, bool) {
1993+
) -> (GenericArgsCtor<'hir>, bool) {
19911994
let &AngleBracketedArgs { ref args, ref constraints, .. } = data;
19921995
let has_non_lt_args = args.iter().any(|arg| match arg {
19931996
ast::GenericArg::Lifetime(_) => false,
19941997
ast::GenericArg::Type(_) => true,
19951998
ast::GenericArg::Const(_) => true,
19961999
});
19972000
(
1998-
hir::GenericArgs {
2001+
GenericArgsCtor {
19992002
args: args.iter().map(|a| self.lower_generic_arg(a, itctx.reborrow())).collect(),
20002003
bindings: self.arena.alloc_from_iter(
20012004
constraints.iter().map(|b| self.lower_assoc_ty_constraint(b, itctx.reborrow())),
@@ -2009,7 +2012,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
20092012
fn lower_parenthesized_parameter_data(
20102013
&mut self,
20112014
data: &ParenthesizedArgs,
2012-
) -> (hir::GenericArgs<'hir>, bool) {
2015+
) -> (GenericArgsCtor<'hir>, bool) {
20132016
// Switch to `PassThrough` mode for anonymous lifetimes; this
20142017
// means that we permit things like `&Ref<T>`, where `Ref` has
20152018
// a hidden lifetime parameter. This is needed for backwards
@@ -2024,15 +2027,15 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
20242027
FunctionRetTy::Ty(ty) => this.lower_ty(&ty, ImplTraitContext::disallowed()),
20252028
FunctionRetTy::Default(_) => this.arena.alloc(this.ty_tup(span, &[])),
20262029
};
2027-
let args = hir_vec![GenericArg::Type(this.ty_tup(span, inputs))];
2030+
let args = vec![GenericArg::Type(this.ty_tup(span, inputs))];
20282031
let binding = hir::TypeBinding {
20292032
hir_id: this.next_id(),
20302033
ident: Ident::with_dummy_span(FN_OUTPUT_NAME),
20312034
span: output_ty.span,
20322035
kind: hir::TypeBindingKind::Equality { ty: output_ty },
20332036
};
20342037
(
2035-
hir::GenericArgs { args, bindings: arena_vec![this; binding], parenthesized: true },
2038+
GenericArgsCtor { args, bindings: arena_vec![this; binding], parenthesized: true },
20362039
false,
20372040
)
20382041
})
@@ -2310,12 +2313,10 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
23102313
debug!("lower_async_fn_ret_ty: lifetimes_to_define={:#?}", this.lifetimes_to_define);
23112314
debug!("lower_async_fn_ret_ty: lifetime_params={:#?}", lifetime_params);
23122315

2313-
let generic_params = lifetime_params
2314-
.iter()
2315-
.map(|(span, hir_name)| {
2316+
let generic_params =
2317+
this.arena.alloc_from_iter(lifetime_params.iter().map(|(span, hir_name)| {
23162318
this.lifetime_to_generic_param(*span, *hir_name, opaque_ty_def_index)
2317-
})
2318-
.collect();
2319+
}));
23192320

23202321
let opaque_ty_item = hir::OpaqueTy {
23212322
generics: hir::Generics {
@@ -2395,7 +2396,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
23952396

23962397
// "<Output = T>"
23972398
let future_params = self.arena.alloc(hir::GenericArgs {
2398-
args: HirVec::new(),
2399+
args: &[],
23992400
bindings: arena_vec![self; hir::TypeBinding {
24002401
ident: Ident::with_dummy_span(FN_OUTPUT_NAME),
24012402
kind: hir::TypeBindingKind::Equality { ty: output_ty },
@@ -2474,18 +2475,27 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
24742475
hir::Lifetime { hir_id: self.lower_node_id(id), span, name }
24752476
}
24762477

2477-
fn lower_generic_params(
2478+
fn lower_generic_params_mut(
24782479
&mut self,
24792480
params: &[GenericParam],
24802481
add_bounds: &NodeMap<Vec<GenericBound>>,
24812482
mut itctx: ImplTraitContext<'_, 'hir>,
2482-
) -> HirVec<hir::GenericParam<'hir>> {
2483+
) -> Vec<hir::GenericParam<'hir>> {
24832484
params
24842485
.iter()
24852486
.map(|param| self.lower_generic_param(param, add_bounds, itctx.reborrow()))
24862487
.collect()
24872488
}
24882489

2490+
fn lower_generic_params(
2491+
&mut self,
2492+
params: &[GenericParam],
2493+
add_bounds: &NodeMap<Vec<GenericBound>>,
2494+
itctx: ImplTraitContext<'_, 'hir>,
2495+
) -> &'hir [hir::GenericParam<'hir>] {
2496+
self.arena.alloc_from_iter(self.lower_generic_params_mut(params, add_bounds, itctx))
2497+
}
2498+
24892499
fn lower_generic_param(
24902500
&mut self,
24912501
param: &GenericParam,
@@ -2593,11 +2603,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
25932603
this.lower_trait_ref(&p.trait_ref, itctx)
25942604
});
25952605

2596-
hir::PolyTraitRef {
2597-
bound_generic_params: self.arena.alloc_from_iter(bound_generic_params.into_iter()),
2598-
trait_ref,
2599-
span: p.span,
2600-
}
2606+
hir::PolyTraitRef { bound_generic_params, trait_ref, span: p.span }
26012607
}
26022608

26032609
fn lower_mt(&mut self, mt: &MutTy, itctx: ImplTraitContext<'_, 'hir>) -> hir::MutTy<'hir> {
@@ -3304,3 +3310,24 @@ fn body_ids(bodies: &BTreeMap<hir::BodyId, hir::Body<'hir>>) -> Vec<hir::BodyId>
33043310
body_ids.sort_by_key(|b| bodies[b].value.span);
33053311
body_ids
33063312
}
3313+
3314+
/// Helper struct for delayed construction of GenericArgs.
3315+
struct GenericArgsCtor<'hir> {
3316+
args: Vec<hir::GenericArg<'hir>>,
3317+
bindings: &'hir [hir::TypeBinding<'hir>],
3318+
parenthesized: bool,
3319+
}
3320+
3321+
impl GenericArgsCtor<'hir> {
3322+
fn is_empty(&self) -> bool {
3323+
self.args.is_empty() && self.bindings.is_empty() && !self.parenthesized
3324+
}
3325+
3326+
fn into_generic_args(self, arena: &'hir Arena<'hir>) -> hir::GenericArgs<'hir> {
3327+
hir::GenericArgs {
3328+
args: arena.alloc_from_iter(self.args),
3329+
bindings: self.bindings,
3330+
parenthesized: self.parenthesized,
3331+
}
3332+
}
3333+
}

src/librustc/hir/lowering/item.rs

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use super::ImplTraitTypeIdVisitor;
55
use super::LoweringContext;
66
use super::ParamMode;
77

8+
use crate::arena::Arena;
89
use crate::hir;
910
use crate::hir::def::{DefKind, Res};
1011
use crate::hir::def_id::DefId;
@@ -1295,11 +1296,11 @@ impl<'hir> LoweringContext<'_, 'hir> {
12951296
}
12961297
}
12971298

1298-
pub(super) fn lower_generics(
1299+
pub(super) fn lower_generics_mut(
12991300
&mut self,
13001301
generics: &Generics,
13011302
itctx: ImplTraitContext<'_, 'hir>,
1302-
) -> hir::Generics<'hir> {
1303+
) -> GenericsCtor<'hir> {
13031304
// Collect `?Trait` bounds in where clause and move them to parameter definitions.
13041305
// FIXME: this could probably be done with less rightward drift. It also looks like two
13051306
// control paths where `report_error` is called are the only paths that advance to after the
@@ -1355,13 +1356,22 @@ impl<'hir> LoweringContext<'_, 'hir> {
13551356
}
13561357
}
13571358

1358-
hir::Generics {
1359-
params: self.lower_generic_params(&generics.params, &add_bounds, itctx),
1359+
GenericsCtor {
1360+
params: self.lower_generic_params_mut(&generics.params, &add_bounds, itctx),
13601361
where_clause: self.lower_where_clause(&generics.where_clause),
13611362
span: generics.span,
13621363
}
13631364
}
13641365

1366+
pub(super) fn lower_generics(
1367+
&mut self,
1368+
generics: &Generics,
1369+
itctx: ImplTraitContext<'_, 'hir>,
1370+
) -> hir::Generics<'hir> {
1371+
let generics_ctor = self.lower_generics_mut(generics, itctx);
1372+
generics_ctor.into_generics(self.arena)
1373+
}
1374+
13651375
fn lower_where_clause(&mut self, wc: &WhereClause) -> hir::WhereClause<'hir> {
13661376
self.with_anonymous_lifetime_mode(AnonymousLifetimeMode::ReportError, |this| {
13671377
hir::WhereClause {
@@ -1383,13 +1393,10 @@ impl<'hir> LoweringContext<'_, 'hir> {
13831393
}) => {
13841394
self.with_in_scope_lifetime_defs(&bound_generic_params, |this| {
13851395
hir::WherePredicate::BoundPredicate(hir::WhereBoundPredicate {
1386-
bound_generic_params: this.arena.alloc_from_iter(
1387-
this.lower_generic_params(
1388-
bound_generic_params,
1389-
&NodeMap::default(),
1390-
ImplTraitContext::disallowed(),
1391-
)
1392-
.into_iter(),
1396+
bound_generic_params: this.lower_generic_params(
1397+
bound_generic_params,
1398+
&NodeMap::default(),
1399+
ImplTraitContext::disallowed(),
13931400
),
13941401
bounded_ty: this.lower_ty(bounded_ty, ImplTraitContext::disallowed()),
13951402
bounds: this.arena.alloc_from_iter(bounds.iter().filter_map(|bound| {
@@ -1426,3 +1433,20 @@ impl<'hir> LoweringContext<'_, 'hir> {
14261433
}
14271434
}
14281435
}
1436+
1437+
/// Helper struct for delayed construction of Generics.
1438+
pub(super) struct GenericsCtor<'hir> {
1439+
pub(super) params: Vec<hir::GenericParam<'hir>>,
1440+
where_clause: hir::WhereClause<'hir>,
1441+
span: Span,
1442+
}
1443+
1444+
impl GenericsCtor<'hir> {
1445+
pub(super) fn into_generics(self, arena: &'hir Arena<'hir>) -> hir::Generics<'hir> {
1446+
hir::Generics {
1447+
params: arena.alloc_from_iter(self.params),
1448+
where_clause: self.where_clause,
1449+
span: self.span,
1450+
}
1451+
}
1452+
}

0 commit comments

Comments
 (0)