Introduce TyCtxt::expect_def/expect_resolution helpers and use them where possible
This commit is contained in:
parent
4c30f6405c
commit
ee4e55398b
42 changed files with 276 additions and 472 deletions
|
|
@ -657,9 +657,8 @@ fn get_branches<'a, 'p, 'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
|||
ConstantValue(ConstantExpr(&l), debug_loc)
|
||||
}
|
||||
PatKind::Path(..) | PatKind::TupleStruct(..) | PatKind::Struct(..) => {
|
||||
let opt_def = tcx.def_map.borrow().get(&cur.id).map(|d| d.full_def());
|
||||
match opt_def {
|
||||
Some(Def::Variant(enum_id, var_id)) => {
|
||||
match tcx.expect_def(cur.id) {
|
||||
Def::Variant(enum_id, var_id) => {
|
||||
let variant = tcx.lookup_adt_def(enum_id).variant_with_id(var_id);
|
||||
Variant(Disr::from(variant.disr_val),
|
||||
adt::represent_node(bcx, cur.id),
|
||||
|
|
@ -796,7 +795,7 @@ fn any_irrefutable_adt_pat(tcx: TyCtxt, m: &[Match], col: usize) -> bool {
|
|||
match pat.node {
|
||||
PatKind::Tuple(..) => true,
|
||||
PatKind::Struct(..) | PatKind::TupleStruct(..) | PatKind::Path(..) => {
|
||||
match tcx.def_map.borrow().get(&pat.id).unwrap().full_def() {
|
||||
match tcx.expect_def(pat.id) {
|
||||
Def::Struct(..) | Def::TyAlias(..) => true,
|
||||
_ => false,
|
||||
}
|
||||
|
|
@ -1444,19 +1443,19 @@ pub fn trans_match<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
|||
/// Checks whether the binding in `discr` is assigned to anywhere in the expression `body`
|
||||
fn is_discr_reassigned(bcx: Block, discr: &hir::Expr, body: &hir::Expr) -> bool {
|
||||
let (vid, field) = match discr.node {
|
||||
hir::ExprPath(..) => match bcx.def(discr.id) {
|
||||
hir::ExprPath(..) => match bcx.tcx().expect_def(discr.id) {
|
||||
Def::Local(_, vid) | Def::Upvar(_, vid, _, _) => (vid, None),
|
||||
_ => return false
|
||||
},
|
||||
hir::ExprField(ref base, field) => {
|
||||
let vid = match bcx.tcx().def_map.borrow().get(&base.id).map(|d| d.full_def()) {
|
||||
let vid = match bcx.tcx().expect_def_or_none(base.id) {
|
||||
Some(Def::Local(_, vid)) | Some(Def::Upvar(_, vid, _, _)) => vid,
|
||||
_ => return false
|
||||
};
|
||||
(vid, Some(mc::NamedField(field.node)))
|
||||
},
|
||||
hir::ExprTupField(ref base, field) => {
|
||||
let vid = match bcx.tcx().def_map.borrow().get(&base.id).map(|d| d.full_def()) {
|
||||
let vid = match bcx.tcx().expect_def_or_none(base.id) {
|
||||
Some(Def::Local(_, vid)) | Some(Def::Upvar(_, vid, _, _)) => vid,
|
||||
_ => return false
|
||||
};
|
||||
|
|
@ -1835,9 +1834,8 @@ pub fn bind_irrefutable_pat<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
|||
}
|
||||
}
|
||||
PatKind::TupleStruct(_, ref sub_pats, ddpos) => {
|
||||
let opt_def = bcx.tcx().def_map.borrow().get(&pat.id).map(|d| d.full_def());
|
||||
match opt_def {
|
||||
Some(Def::Variant(enum_id, var_id)) => {
|
||||
match bcx.tcx().expect_def(pat.id) {
|
||||
Def::Variant(enum_id, var_id) => {
|
||||
let repr = adt::represent_node(bcx, pat.id);
|
||||
let vinfo = ccx.tcx().lookup_adt_def(enum_id).variant_with_id(var_id);
|
||||
let args = extract_variant_args(bcx,
|
||||
|
|
@ -1853,7 +1851,7 @@ pub fn bind_irrefutable_pat<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
|||
cleanup_scope);
|
||||
}
|
||||
}
|
||||
Some(Def::Struct(..)) => {
|
||||
Def::Struct(..) => {
|
||||
let expected_len = match *ccx.tcx().pat_ty(&pat) {
|
||||
ty::TyS{sty: ty::TyStruct(adt_def, _), ..} => {
|
||||
adt_def.struct_variant().fields.len()
|
||||
|
|
|
|||
|
|
@ -260,8 +260,7 @@ impl<'a, 'tcx> VariantInfo<'tcx> {
|
|||
|
||||
/// Return the variant corresponding to a given node (e.g. expr)
|
||||
pub fn of_node(tcx: TyCtxt<'a, 'tcx, 'tcx>, ty: Ty<'tcx>, id: ast::NodeId) -> Self {
|
||||
let node_def = tcx.def_map.borrow().get(&id).map(|v| v.full_def());
|
||||
Self::from_ty(tcx, ty, node_def)
|
||||
Self::from_ty(tcx, ty, Some(tcx.expect_def(id)))
|
||||
}
|
||||
|
||||
pub fn field_index(&self, name: ast::Name) -> usize {
|
||||
|
|
@ -656,15 +655,6 @@ impl<'blk, 'tcx> BlockS<'blk, 'tcx> {
|
|||
self.tcx().map.node_to_string(id).to_string()
|
||||
}
|
||||
|
||||
pub fn def(&self, nid: ast::NodeId) -> Def {
|
||||
match self.tcx().def_map.borrow().get(&nid) {
|
||||
Some(v) => v.full_def(),
|
||||
None => {
|
||||
bug!("no def associated with node id {}", nid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn to_str(&self) -> String {
|
||||
format!("[block {:p}]", self)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -297,8 +297,7 @@ pub fn get_const_expr_as_global<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>,
|
|||
// `def` must be its own statement and cannot be in the `match`
|
||||
// otherwise the `def_map` will be borrowed for the entire match instead
|
||||
// of just to get the `def` value
|
||||
let def = ccx.tcx().def_map.borrow().get(&expr.id).unwrap().full_def();
|
||||
match def {
|
||||
match ccx.tcx().expect_def(expr.id) {
|
||||
Def::Const(def_id) | Def::AssociatedConst(def_id) => {
|
||||
if !ccx.tcx().tables.borrow().adjustments.contains_key(&expr.id) {
|
||||
debug!("get_const_expr_as_global ({:?}): found const {:?}",
|
||||
|
|
@ -803,8 +802,7 @@ fn const_expr_unadjusted<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>,
|
|||
_ => break,
|
||||
}
|
||||
}
|
||||
let opt_def = cx.tcx().def_map.borrow().get(&cur.id).map(|d| d.full_def());
|
||||
if let Some(Def::Static(def_id, _)) = opt_def {
|
||||
if let Some(Def::Static(def_id, _)) = cx.tcx().expect_def_or_none(cur.id) {
|
||||
get_static(cx, def_id).val
|
||||
} else {
|
||||
// If this isn't the address of a static, then keep going through
|
||||
|
|
@ -891,8 +889,7 @@ fn const_expr_unadjusted<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>,
|
|||
}
|
||||
},
|
||||
hir::ExprPath(..) => {
|
||||
let def = cx.tcx().def_map.borrow().get(&e.id).unwrap().full_def();
|
||||
match def {
|
||||
match cx.tcx().expect_def(e.id) {
|
||||
Def::Local(_, id) => {
|
||||
if let Some(val) = fn_args.and_then(|args| args.get(&id).cloned()) {
|
||||
val
|
||||
|
|
@ -937,9 +934,8 @@ fn const_expr_unadjusted<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>,
|
|||
_ => break,
|
||||
};
|
||||
}
|
||||
let def = cx.tcx().def_map.borrow()[&callee.id].full_def();
|
||||
let arg_vals = map_list(args)?;
|
||||
match def {
|
||||
match cx.tcx().expect_def(callee.id) {
|
||||
Def::Fn(did) | Def::Method(did) => {
|
||||
const_fn_call(
|
||||
cx,
|
||||
|
|
|
|||
|
|
@ -318,8 +318,8 @@ pub fn trans_break_cont<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
|||
let loop_id = match opt_label {
|
||||
None => fcx.top_loop_scope(),
|
||||
Some(_) => {
|
||||
match bcx.tcx().def_map.borrow().get(&expr.id).map(|d| d.full_def()) {
|
||||
Some(Def::Label(loop_id)) => loop_id,
|
||||
match bcx.tcx().expect_def(expr.id) {
|
||||
Def::Label(loop_id) => loop_id,
|
||||
r => {
|
||||
bug!("{:?} in def-map for label", r)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -153,7 +153,7 @@ pub fn trans_into<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
|||
// have side effects. This seems to be reached through tuple struct constructors being
|
||||
// passed zero-size constants.
|
||||
if let hir::ExprPath(..) = expr.node {
|
||||
match bcx.def(expr.id) {
|
||||
match bcx.tcx().expect_def(expr.id) {
|
||||
Def::Const(_) | Def::AssociatedConst(_) => {
|
||||
assert!(type_is_zero_size(bcx.ccx(), bcx.tcx().node_id_to_type(expr.id)));
|
||||
return bcx;
|
||||
|
|
@ -172,7 +172,7 @@ pub fn trans_into<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
|||
// `[x; N]` somewhere within.
|
||||
match expr.node {
|
||||
hir::ExprPath(..) => {
|
||||
match bcx.def(expr.id) {
|
||||
match bcx.tcx().expect_def(expr.id) {
|
||||
Def::Const(did) | Def::AssociatedConst(did) => {
|
||||
let empty_substs = bcx.tcx().mk_substs(Substs::empty());
|
||||
let const_expr = consts::get_const_expr(bcx.ccx(), did, expr,
|
||||
|
|
@ -651,7 +651,7 @@ fn trans_datum_unadjusted<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
|||
trans(bcx, &e)
|
||||
}
|
||||
hir::ExprPath(..) => {
|
||||
let var = trans_var(bcx, bcx.def(expr.id));
|
||||
let var = trans_var(bcx, bcx.tcx().expect_def(expr.id));
|
||||
DatumBlock::new(bcx, var.to_expr_datum())
|
||||
}
|
||||
hir::ExprField(ref base, name) => {
|
||||
|
|
@ -1073,7 +1073,7 @@ fn trans_rvalue_dps_unadjusted<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
|||
trans_into(bcx, &e, dest)
|
||||
}
|
||||
hir::ExprPath(..) => {
|
||||
trans_def_dps_unadjusted(bcx, expr, bcx.def(expr.id), dest)
|
||||
trans_def_dps_unadjusted(bcx, expr, bcx.tcx().expect_def(expr.id), dest)
|
||||
}
|
||||
hir::ExprIf(ref cond, ref thn, ref els) => {
|
||||
controlflow::trans_if(bcx, expr.id, &cond, &thn, els.as_ref().map(|e| &**e), dest)
|
||||
|
|
@ -2373,7 +2373,7 @@ fn expr_kind<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, expr: &hir::Expr) -> ExprKin
|
|||
|
||||
match expr.node {
|
||||
hir::ExprPath(..) => {
|
||||
match tcx.resolve_expr(expr) {
|
||||
match tcx.expect_def(expr.id) {
|
||||
// Put functions and ctors with the ADTs, as they
|
||||
// are zero-sized, so DPS is the cheapest option.
|
||||
Def::Struct(..) | Def::Variant(..) |
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue