[] foreign_item: rustc::hir::ForeignItem<$tcx>,
[] impl_item_ref: rustc::hir::ImplItemRef,
[] macro_def: rustc::hir::MacroDef<$tcx>,
+ [] param: rustc::hir::Param,
[] path: rustc::hir::Path,
[] struct_field: rustc::hir::StructField<$tcx>,
[] trait_item_ref: rustc::hir::TraitItemRef,
walk_item(self, i)
}
- fn visit_body(&mut self, b: &'v Body) {
+ fn visit_body(&mut self, b: &'v Body<'v>) {
walk_body(self, b);
}
}
}
-pub fn walk_body<'v, V: Visitor<'v>>(visitor: &mut V, body: &'v Body) {
- walk_list!(visitor, visit_param, &body.params);
+pub fn walk_body<'v, V: Visitor<'v>>(visitor: &mut V, body: &'v Body<'v>) {
+ walk_list!(visitor, visit_param, body.params);
visitor.visit_expr(&body.value);
}
trait_items: BTreeMap<hir::TraitItemId, hir::TraitItem<'hir>>,
impl_items: BTreeMap<hir::ImplItemId, hir::ImplItem<'hir>>,
- bodies: BTreeMap<hir::BodyId, hir::Body>,
+ bodies: BTreeMap<hir::BodyId, hir::Body<'hir>>,
exported_macros: Vec<hir::MacroDef<'hir>>,
non_exported_macro_attrs: Vec<ast::Attribute>,
}
}
-fn body_ids(bodies: &BTreeMap<hir::BodyId, hir::Body>) -> Vec<hir::BodyId> {
+fn body_ids(bodies: &BTreeMap<hir::BodyId, hir::Body<'hir>>) -> Vec<hir::BodyId> {
// Sorting by span ensures that we get things in order within a
// file, and also puts the files in a sensible order.
let mut body_ids: Vec<_> = bodies.keys().cloned().collect();
use super::AnonymousLifetimeMode;
use super::ParamMode;
-use crate::hir::{self, HirVec};
+use crate::hir;
use crate::hir::ptr::P;
use crate::hir::def_id::DefId;
use crate::hir::def::{Res, DefKind};
}
}
-impl LoweringContext<'_, 'hir> {
+impl<'hir> LoweringContext<'_, 'hir> {
// Same as the method above, but accepts `hir::GenericParam`s
// instead of `ast::GenericParam`s.
// This should only be used with generics that have already had their
}
}
- fn record_body(&mut self, params: HirVec<hir::Param>, value: hir::Expr) -> hir::BodyId {
+ fn record_body(&mut self, params: &'hir [hir::Param], value: hir::Expr) -> hir::BodyId {
let body = hir::Body {
generator_kind: self.generator_kind,
params,
fn lower_body(
&mut self,
- f: impl FnOnce(&mut LoweringContext<'_, '_>) -> (HirVec<hir::Param>, hir::Expr),
+ f: impl FnOnce(&mut Self) -> (&'hir [hir::Param], hir::Expr),
) -> hir::BodyId {
let prev_gen_kind = self.generator_kind.take();
let (parameters, result) = f(self);
body: impl FnOnce(&mut LoweringContext<'_, '_>) -> hir::Expr,
) -> hir::BodyId {
self.lower_body(|this| (
- decl.inputs.iter().map(|x| this.lower_param(x)).collect(),
+ this.arena.alloc_from_iter(
+ decl.inputs.iter().map(|x| this.lower_param(x))
+ ),
body(this),
))
}
}
pub(super) fn lower_const_body(&mut self, span: Span, expr: Option<&Expr>) -> hir::BodyId {
- self.lower_body(|this| (hir_vec![], match expr {
+ self.lower_body(|this| (&[], match expr {
Some(expr) => this.lower_expr(expr),
None => this.expr_err(span),
}))
);
this.expr_block(P(body), AttrVec::new())
});
- (HirVec::from(parameters), this.expr(body_span, async_expr, AttrVec::new()))
+
+ (this.arena.alloc_from_iter(parameters), this.expr(body_span, async_expr, AttrVec::new()))
})
}
self.forest.krate.impl_item(id)
}
- pub fn body(&self, id: BodyId) -> &'hir Body {
+ pub fn body(&self, id: BodyId) -> &'hir Body<'hir> {
self.read(id.hir_id);
// N.B., intentionally bypass `self.forest.krate()` so that we
pub trait_items: BTreeMap<TraitItemId, TraitItem<'hir>>,
pub impl_items: BTreeMap<ImplItemId, ImplItem<'hir>>,
- pub bodies: BTreeMap<BodyId, Body>,
+ pub bodies: BTreeMap<BodyId, Body<'hir>>,
pub trait_impls: BTreeMap<DefId, Vec<HirId>>,
/// A list of the body ids written out in the order in which they
&self.impl_items[&id]
}
- pub fn body(&self, id: BodyId) -> &Body {
+ pub fn body(&self, id: BodyId) -> &Body<'hir> {
&self.bodies[&id]
}
}
/// All bodies have an **owner**, which can be accessed via the HIR
/// map using `body_owner_def_id()`.
#[derive(RustcEncodable, RustcDecodable, Debug)]
-pub struct Body {
- pub params: HirVec<Param>,
+pub struct Body<'hir> {
+ pub params: &'hir [Param],
pub value: Expr,
pub generator_kind: Option<GeneratorKind>,
}
-impl Body {
+impl Body<'hir> {
pub fn id(&self) -> BodyId {
BodyId {
hir_id: self.value.hir_id,
impl<'tcx> BodyResolver<'tcx> {
/// Returns a reference to the `hir::Body` with the given `BodyId`.
/// **Does not do any tracking**; use carefully.
- fn body(self, id: hir::BodyId) -> &'tcx hir::Body {
+ fn body(self, id: hir::BodyId) -> &'tcx hir::Body<'tcx> {
self.0.body(id)
}
}
}
}
-impl<'a> HashStable<StableHashingContext<'a>> for hir::Body {
+impl<'a> HashStable<StableHashingContext<'a>> for hir::Body<'_> {
fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) {
let hir::Body {
params,
intravisit::walk_local(self, local);
}
- fn visit_body(&mut self, body: &'tcx Body) {
- for param in &body.params {
+ fn visit_body(&mut self, body: &'tcx Body<'tcx>) {
+ for param in body.params {
if let (None, Some(ty)) = (
self.found_arg_pattern,
self.node_matches_type(param.hir_id),
span: Span,
err: &mut DiagnosticBuilder<'_>,
output: &FunctionRetTy,
- body: &Body,
+ body: &Body<'_>,
descr: &str,
name: &str,
ret: &str,
});
}
- fn visit_body(&mut self, body: &'tcx hir::Body) {
+ fn visit_body(&mut self, body: &'tcx hir::Body<'tcx>) {
lint_callback!(self, check_body, body);
hir_visit::walk_body(self, body);
lint_callback!(self, check_body_post, body);
($macro:path, $args:tt, [$hir:tt]) => (
$macro!($args, [$hir], [
fn check_param(a: &$hir hir::Param);
- fn check_body(a: &$hir hir::Body);
- fn check_body_post(a: &$hir hir::Body);
+ fn check_body(a: &$hir hir::Body<$hir>);
+ fn check_body_post(a: &$hir hir::Body<$hir>);
fn check_name(a: Span, b: ast::Name);
fn check_crate(a: &$hir hir::Crate<$hir>);
fn check_crate_post(a: &$hir hir::Crate<$hir>);
fn check_fn(
a: hir::intravisit::FnKind<$hir>,
b: &$hir hir::FnDecl,
- c: &$hir hir::Body,
+ c: &$hir hir::Body<$hir>,
d: Span,
e: hir::HirId);
fn check_fn_post(
a: hir::intravisit::FnKind<$hir>,
b: &$hir hir::FnDecl,
- c: &$hir hir::Body,
+ c: &$hir hir::Body<$hir>,
d: Span,
e: hir::HirId
);
pub fn yield_in_scope_for_expr(&self,
scope: Scope,
expr_hir_id: hir::HirId,
- body: &'tcx hir::Body) -> Option<Span> {
+ body: &'tcx hir::Body<'tcx>) -> Option<Span> {
self.yield_in_scope(scope).and_then(|YieldData { span, expr_and_pat_count, .. }| {
let mut visitor = ExprLocatorVisitor {
hir_id: expr_hir_id,
resolve_block(self, b);
}
- fn visit_body(&mut self, body: &'tcx hir::Body) {
+ fn visit_body(&mut self, body: &'tcx hir::Body<'tcx>) {
let body_id = body.id();
let owner_id = self.tcx.hir().body_owner(body_id);
// The arguments and `self` are parented to the fn.
self.cx.var_parent = self.cx.parent.take();
- for param in &body.params {
+ for param in body.params {
self.visit_pat(¶m.pat);
}
// Adds all labels in `b` to `ctxt.labels_in_fn`, signalling a warning
// if one of the label shadows a lifetime or another label.
-fn extract_labels(ctxt: &mut LifetimeContext<'_, '_>, body: &hir::Body) {
+fn extract_labels(ctxt: &mut LifetimeContext<'_, '_>, body: &hir::Body<'_>) {
struct GatherLabels<'a, 'tcx> {
tcx: TyCtxt<'tcx>,
scope: ScopeRef<'a>,
cx: &LateContext<'_, '_>,
fk: FnKind<'_>,
_: &hir::FnDecl,
- _: &hir::Body,
+ _: &hir::Body<'_>,
_: Span,
id: hir::HirId,
) {
abi: Abi,
return_ty: Ty<'tcx>,
return_ty_span: Span,
- body: &'tcx hir::Body,
+ body: &'tcx hir::Body<'tcx>,
) -> Body<'tcx>
where
A: Iterator<Item=ArgInfo<'tcx>>
self.check_patterns(false, &loc.pat);
}
- fn visit_body(&mut self, body: &'tcx hir::Body) {
+ fn visit_body(&mut self, body: &'tcx hir::Body<'tcx>) {
intravisit::walk_body(self, body);
- for param in &body.params {
+ for param in body.params {
self.check_irrefutable(¶m.pat, "function argument", None);
self.check_patterns(false, ¶m.pat);
}
}
impl ConstKind {
- fn for_body(body: &hir::Body, hir_map: &Map<'_>) -> Option<Self> {
+ fn for_body(body: &hir::Body<'_>, hir_map: &Map<'_>) -> Option<Self> {
let is_const_fn = |id| hir_map.fn_sig_by_hir_id(id).unwrap().header.is_const();
let owner = hir_map.body_owner(body.id());
self.recurse_into(kind, |this| hir::intravisit::walk_anon_const(this, anon));
}
- fn visit_body(&mut self, body: &'tcx hir::Body) {
+ fn visit_body(&mut self, body: &'tcx hir::Body<'tcx>) {
let kind = ConstKind::for_body(body, self.tcx.hir());
self.recurse_into(kind, |this| hir::intravisit::walk_body(this, body));
}
let body = ir.tcx.hir().body(body_id);
- for param in &body.params {
+ for param in body.params {
let is_shorthand = match param.pat.kind {
rustc::hir::PatKind::Struct(..) => true,
_ => false,
}
}
- fn warn_about_unused_args(&self, body: &hir::Body, entry_ln: LiveNode) {
- for p in &body.params {
+ fn warn_about_unused_args(&self, body: &hir::Body<'_>, entry_ln: LiveNode) {
+ for p in body.params {
self.check_unused_vars_in_pat(&p.pat, Some(entry_ln), |spans, hir_id, ln, var| {
if self.live_on_entry(ln, var).is_none() {
self.report_dead_assign(hir_id, spans, var, true);
expr: &hir::Expr,
opt_kind: Option<ty::ClosureKind>,
decl: &'tcx hir::FnDecl,
- body: &'tcx hir::Body,
+ body: &'tcx hir::Body<'tcx>,
gen: Option<hir::Movability>,
expected_sig: Option<ExpectedSig<'tcx>>,
) -> Ty<'tcx> {
&self,
expr_def_id: DefId,
decl: &hir::FnDecl,
- body: &hir::Body,
+ body: &hir::Body<'_>,
expected_sig: Option<ExpectedSig<'tcx>>,
) -> ClosureSignatures<'tcx> {
if let Some(e) = expected_sig {
&self,
expr_def_id: DefId,
decl: &hir::FnDecl,
- body: &hir::Body,
+ body: &hir::Body<'_>,
) -> ClosureSignatures<'tcx> {
debug!("sig_of_closure_no_expectation()");
&self,
expr_def_id: DefId,
decl: &hir::FnDecl,
- body: &hir::Body,
+ body: &hir::Body<'_>,
expected_sig: ExpectedSig<'tcx>,
) -> ClosureSignatures<'tcx> {
debug!(
&self,
expr_def_id: DefId,
decl: &hir::FnDecl,
- body: &hir::Body,
+ body: &hir::Body<'_>,
expected_sig: ExpectedSig<'tcx>,
) -> ClosureSignatures<'tcx> {
let expr_map_node = self.tcx.hir().get_if_local(expr_def_id).unwrap();
&self,
expr_def_id: DefId,
decl: &hir::FnDecl,
- body: &hir::Body,
+ body: &hir::Body<'_>,
expected_sigs: &ClosureSignatures<'tcx>,
) -> InferResult<'tcx, ()> {
// Get the signature S that the user gave.
&self,
expr_def_id: DefId,
decl: &hir::FnDecl,
- body: &hir::Body,
+ body: &hir::Body<'_>,
) -> ty::PolyFnSig<'tcx> {
let astconv: &dyn AstConv<'_> = self;
fn closure_sigs(
&self,
expr_def_id: DefId,
- body: &hir::Body,
+ body: &hir::Body<'_>,
bound_sig: ty::PolyFnSig<'tcx>,
) -> ClosureSignatures<'tcx> {
let liberated_sig = self.tcx()
fn_sig: ty::FnSig<'tcx>,
decl: &'tcx hir::FnDecl,
fn_id: hir::HirId,
- body: &'tcx hir::Body,
+ body: &'tcx hir::Body<'tcx>,
can_be_generator: Option<hir::Movability>,
) -> (FnCtxt<'a, 'tcx>, Option<GeneratorTypes<'tcx>>) {
let mut fn_sig = fn_sig.clone();
for (param_ty, param) in
fn_sig.inputs().iter().copied()
.chain(maybe_va_list)
- .zip(&body.params)
+ .zip(body.params)
{
// Check the pattern.
fcx.check_pat_top(¶m.pat, param_ty, None);
// PUBLIC ENTRY POINTS
impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
- pub fn regionck_expr(&self, body: &'tcx hir::Body) {
+ pub fn regionck_expr(&self, body: &'tcx hir::Body<'tcx>) {
let subject = self.tcx.hir().body_owner_def_id(body.id());
let id = body.value.hir_id;
let mut rcx = RegionCtxt::new(
/// rest of type check and because sometimes we need type
/// inference to have completed before we can determine which
/// constraints to add.
- pub fn regionck_fn(&self, fn_id: hir::HirId, body: &'tcx hir::Body) {
+ pub fn regionck_fn(&self, fn_id: hir::HirId, body: &'tcx hir::Body<'tcx>) {
debug!("regionck_fn(id={})", fn_id);
let subject = self.tcx.hir().body_owner_def_id(body.id());
let hir_id = body.value.hir_id;
fn visit_fn_body(
&mut self,
id: hir::HirId, // the id of the fn itself
- body: &'tcx hir::Body,
+ body: &'tcx hir::Body<'tcx>,
span: Span,
) {
// When we enter a function, we can derive
use syntax_pos::Span;
impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
- pub fn closure_analyze(&self, body: &'tcx hir::Body) {
+ pub fn closure_analyze(&self, body: &'tcx hir::Body<'tcx>) {
InferBorrowKindVisitor { fcx: self }.visit_body(body);
// it's our job to process these.
&self,
closure_hir_id: hir::HirId,
span: Span,
- body: &hir::Body,
+ body: &hir::Body<'_>,
capture_clause: hir::CaptureBy,
) {
// resolve_type_vars_in_body, which creates a new TypeTables which
// doesn't contain any inference types.
impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
- pub fn resolve_type_vars_in_body(&self, body: &'tcx hir::Body) -> &'tcx ty::TypeckTables<'tcx> {
+ pub fn resolve_type_vars_in_body(&self, body: &'tcx hir::Body<'tcx>) -> &'tcx ty::TypeckTables<'tcx> {
let item_id = self.tcx.hir().body_owner(body.id());
let item_def_id = self.tcx.hir().local_def_id(item_id);
let rustc_dump_user_substs = self.tcx.has_attr(item_def_id, sym::rustc_dump_user_substs);
let mut wbcx = WritebackCx::new(self, body, rustc_dump_user_substs);
- for param in &body.params {
+ for param in body.params {
wbcx.visit_node_id(param.pat.span, param.hir_id);
}
// Type only exists for constants and statics, not functions.
tables: ty::TypeckTables<'tcx>,
- body: &'tcx hir::Body,
+ body: &'tcx hir::Body<'tcx>,
rustc_dump_user_substs: bool,
}
impl<'cx, 'tcx> WritebackCx<'cx, 'tcx> {
fn new(
fcx: &'cx FnCtxt<'cx, 'tcx>,
- body: &'tcx hir::Body,
+ body: &'tcx hir::Body<'tcx>,
rustc_dump_user_substs: bool,
) -> WritebackCx<'cx, 'tcx> {
let owner = body.id().hir_id;
match e.kind {
hir::ExprKind::Closure(_, _, body, _, _) => {
let body = self.fcx.tcx.hir().body(body);
- for param in &body.params {
+ for param in body.params {
self.visit_node_id(e.span, param.hir_id);
}
tcx: TyCtxt<'tcx>,
infcx: &'cx InferCtxt<'cx, 'tcx>,
span: &'cx dyn Locatable,
- body: &'tcx hir::Body,
+ body: &'tcx hir::Body<'tcx>,
}
impl<'cx, 'tcx> Resolver<'cx, 'tcx> {
fn new(
fcx: &'cx FnCtxt<'cx, 'tcx>,
span: &'cx dyn Locatable,
- body: &'tcx hir::Body,
+ body: &'tcx hir::Body<'tcx>,
) -> Resolver<'cx, 'tcx> {
Resolver {
tcx: fcx.tcx,
}
}
- pub fn consume_body(&mut self, body: &hir::Body) {
+ pub fn consume_body(&mut self, body: &hir::Body<'_>) {
debug!("consume_body(body={:?})", body);
- for param in &body.params {
+ for param in body.params {
let param_ty = return_if_err!(self.mc.pat_ty_adjusted(¶m.pat));
debug!("consume_body: param_ty = {:?}", param_ty);