Skip to content

Commit 44acea4

Browse files
committed
AST/HIR: Merge field access expressions for named and numeric fields
1 parent 6c53749 commit 44acea4

Some content is hidden

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

43 files changed

+105
-432
lines changed

src/librustc/cfg/construct.rs

-1
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,6 @@ impl<'a, 'tcx> CFGBuilder<'a, 'tcx> {
389389
hir::ExprType(ref e, _) |
390390
hir::ExprUnary(_, ref e) |
391391
hir::ExprField(ref e, _) |
392-
hir::ExprTupField(ref e, _) |
393392
hir::ExprYield(ref e) |
394393
hir::ExprRepeat(ref e, _) => {
395394
self.straightline(expr, pred, Some(&**e).into_iter())

src/librustc/hir/intravisit.rs

-3
Original file line numberDiff line numberDiff line change
@@ -1025,9 +1025,6 @@ pub fn walk_expr<'v, V: Visitor<'v>>(visitor: &mut V, expression: &'v Expr) {
10251025
visitor.visit_expr(subexpression);
10261026
visitor.visit_name(name.span, name.node);
10271027
}
1028-
ExprTupField(ref subexpression, _) => {
1029-
visitor.visit_expr(subexpression);
1030-
}
10311028
ExprIndex(ref main_expression, ref index_expression) => {
10321029
visitor.visit_expr(main_expression);
10331030
visitor.visit_expr(index_expression)

src/librustc/hir/lowering.rs

-1
Original file line numberDiff line numberDiff line change
@@ -3095,7 +3095,6 @@ impl<'a> LoweringContext<'a> {
30953095
P(self.lower_expr(el)),
30963096
respan(ident.span, self.lower_ident(ident)),
30973097
),
3098-
ExprKind::TupField(ref el, ident) => hir::ExprTupField(P(self.lower_expr(el)), ident),
30993098
ExprKind::Index(ref el, ref er) => {
31003099
hir::ExprIndex(P(self.lower_expr(el)), P(self.lower_expr(er)))
31013100
}

src/librustc/hir/mod.rs

+1-6
Original file line numberDiff line numberDiff line change
@@ -1276,7 +1276,6 @@ impl Expr {
12761276
ExprAssign(..) => ExprPrecedence::Assign,
12771277
ExprAssignOp(..) => ExprPrecedence::AssignOp,
12781278
ExprField(..) => ExprPrecedence::Field,
1279-
ExprTupField(..) => ExprPrecedence::TupField,
12801279
ExprIndex(..) => ExprPrecedence::Index,
12811280
ExprPath(..) => ExprPrecedence::Path,
12821281
ExprAddrOf(..) => ExprPrecedence::AddrOf,
@@ -1363,12 +1362,8 @@ pub enum Expr_ {
13631362
///
13641363
/// For example, `a += 1`.
13651364
ExprAssignOp(BinOp, P<Expr>, P<Expr>),
1366-
/// Access of a named struct field (`obj.foo`)
1365+
/// Access of a named (`obj.foo`) or unnamed (`obj.0`) struct or tuple field
13671366
ExprField(P<Expr>, Spanned<Name>),
1368-
/// Access of an unnamed field of a struct or tuple-struct
1369-
///
1370-
/// For example, `foo.0`.
1371-
ExprTupField(P<Expr>, Spanned<usize>),
13721367
/// An indexing operation (`foo[2]`)
13731368
ExprIndex(P<Expr>, P<Expr>),
13741369

src/librustc/hir/print.rs

+1-8
Original file line numberDiff line numberDiff line change
@@ -1201,8 +1201,7 @@ impl<'a> State<'a> {
12011201
fn print_expr_call(&mut self, func: &hir::Expr, args: &[hir::Expr]) -> io::Result<()> {
12021202
let prec =
12031203
match func.node {
1204-
hir::ExprField(..) |
1205-
hir::ExprTupField(..) => parser::PREC_FORCE_PAREN,
1204+
hir::ExprField(..) => parser::PREC_FORCE_PAREN,
12061205
_ => parser::PREC_POSTFIX,
12071206
};
12081207

@@ -1405,11 +1404,6 @@ impl<'a> State<'a> {
14051404
self.s.word(".")?;
14061405
self.print_name(name.node)?;
14071406
}
1408-
hir::ExprTupField(ref expr, id) => {
1409-
self.print_expr_maybe_paren(&expr, parser::PREC_POSTFIX)?;
1410-
self.s.word(".")?;
1411-
self.print_usize(id.node)?;
1412-
}
14131407
hir::ExprIndex(ref expr, ref index) => {
14141408
self.print_expr_maybe_paren(&expr, parser::PREC_POSTFIX)?;
14151409
self.s.word("[")?;
@@ -2376,7 +2370,6 @@ fn contains_exterior_struct_lit(value: &hir::Expr) -> bool {
23762370
hir::ExprCast(ref x, _) |
23772371
hir::ExprType(ref x, _) |
23782372
hir::ExprField(ref x, _) |
2379-
hir::ExprTupField(ref x, _) |
23802373
hir::ExprIndex(ref x, _) => {
23812374
// &X { y: 1 }, X { y: 1 }.y
23822375
contains_exterior_struct_lit(&x)

src/librustc/ich/impls_hir.rs

-1
Original file line numberDiff line numberDiff line change
@@ -569,7 +569,6 @@ impl_stable_hash_for!(enum hir::Expr_ {
569569
ExprAssign(lhs, rhs),
570570
ExprAssignOp(op, lhs, rhs),
571571
ExprField(owner, field_name),
572-
ExprTupField(owner, idx),
573572
ExprIndex(lhs, rhs),
574573
ExprPath(path),
575574
ExprAddrOf(mutability, sub),

src/librustc/middle/dead.rs

+1-13
Original file line numberDiff line numberDiff line change
@@ -104,17 +104,8 @@ impl<'a, 'tcx> MarkSymbolVisitor<'a, 'tcx> {
104104
ty::TyAdt(def, _) => {
105105
self.insert_def_id(def.non_enum_variant().field_named(name).did);
106106
}
107-
_ => span_bug!(lhs.span, "named field access on non-ADT"),
108-
}
109-
}
110-
111-
fn handle_tup_field_access(&mut self, lhs: &hir::Expr, idx: usize) {
112-
match self.tables.expr_ty_adjusted(lhs).sty {
113-
ty::TyAdt(def, _) => {
114-
self.insert_def_id(def.non_enum_variant().fields[idx].did);
115-
}
116107
ty::TyTuple(..) => {}
117-
_ => span_bug!(lhs.span, "numeric field access on non-ADT"),
108+
_ => span_bug!(lhs.span, "named field access on non-ADT"),
118109
}
119110
}
120111

@@ -245,9 +236,6 @@ impl<'a, 'tcx> Visitor<'tcx> for MarkSymbolVisitor<'a, 'tcx> {
245236
hir::ExprField(ref lhs, ref name) => {
246237
self.handle_field_access(&lhs, name.node);
247238
}
248-
hir::ExprTupField(ref lhs, idx) => {
249-
self.handle_tup_field_access(&lhs, idx.node);
250-
}
251239
hir::ExprStruct(_, ref fields, _) => {
252240
if let ty::TypeVariants::TyAdt(ref def, _) = self.tables.expr_ty(expr).sty {
253241
if def.is_union() {

src/librustc/middle/expr_use_visitor.rs

-4
Original file line numberDiff line numberDiff line change
@@ -404,10 +404,6 @@ impl<'a, 'gcx, 'tcx> ExprUseVisitor<'a, 'gcx, 'tcx> {
404404
self.select_from_expr(&base);
405405
}
406406

407-
hir::ExprTupField(ref base, _) => { // base.<n>
408-
self.select_from_expr(&base);
409-
}
410-
411407
hir::ExprIndex(ref lhs, ref rhs) => { // lhs[rhs]
412408
self.select_from_expr(&lhs);
413409
self.consume_expr(&rhs);

src/librustc/middle/liveness.rs

+2-7
Original file line numberDiff line numberDiff line change
@@ -476,7 +476,7 @@ fn visit_expr<'a, 'tcx>(ir: &mut IrMaps<'a, 'tcx>, expr: &'tcx Expr) {
476476
}
477477

478478
// otherwise, live nodes are not required:
479-
hir::ExprIndex(..) | hir::ExprField(..) | hir::ExprTupField(..) |
479+
hir::ExprIndex(..) | hir::ExprField(..) |
480480
hir::ExprArray(..) | hir::ExprCall(..) | hir::ExprMethodCall(..) |
481481
hir::ExprTup(..) | hir::ExprBinary(..) | hir::ExprAddrOf(..) |
482482
hir::ExprCast(..) | hir::ExprUnary(..) | hir::ExprBreak(..) |
@@ -912,10 +912,6 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
912912
self.propagate_through_expr(&e, succ)
913913
}
914914

915-
hir::ExprTupField(ref e, _) => {
916-
self.propagate_through_expr(&e, succ)
917-
}
918-
919915
hir::ExprClosure(.., blk_id, _, _) => {
920916
debug!("{} is an ExprClosure", self.ir.tcx.hir.node_to_pretty_string(expr.id));
921917

@@ -1226,7 +1222,6 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> {
12261222
match expr.node {
12271223
hir::ExprPath(_) => succ,
12281224
hir::ExprField(ref e, _) => self.propagate_through_expr(&e, succ),
1229-
hir::ExprTupField(ref e, _) => self.propagate_through_expr(&e, succ),
12301225
_ => self.propagate_through_expr(expr, succ)
12311226
}
12321227
}
@@ -1419,7 +1414,7 @@ fn check_expr<'a, 'tcx>(this: &mut Liveness<'a, 'tcx>, expr: &'tcx Expr) {
14191414
// no correctness conditions related to liveness
14201415
hir::ExprCall(..) | hir::ExprMethodCall(..) | hir::ExprIf(..) |
14211416
hir::ExprMatch(..) | hir::ExprWhile(..) | hir::ExprLoop(..) |
1422-
hir::ExprIndex(..) | hir::ExprField(..) | hir::ExprTupField(..) |
1417+
hir::ExprIndex(..) | hir::ExprField(..) |
14231418
hir::ExprArray(..) | hir::ExprTup(..) | hir::ExprBinary(..) |
14241419
hir::ExprCast(..) | hir::ExprUnary(..) | hir::ExprRet(..) |
14251420
hir::ExprBreak(..) | hir::ExprAgain(..) | hir::ExprLit(_) |

src/librustc/middle/mem_categorization.rs

+17-51
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@
6262

6363
pub use self::PointerKind::*;
6464
pub use self::InteriorKind::*;
65-
pub use self::FieldName::*;
6665
pub use self::MutabilityCategory::*;
6766
pub use self::AliasableReason::*;
6867
pub use self::Note::*;
@@ -81,7 +80,7 @@ use ty::fold::TypeFoldable;
8180
use hir::{MutImmutable, MutMutable, PatKind};
8281
use hir::pat_util::EnumerateAndAdjustIterator;
8382
use hir;
84-
use syntax::ast;
83+
use syntax::ast::{self, Name};
8584
use syntax_pos::Span;
8685

8786
use std::fmt;
@@ -129,15 +128,13 @@ pub enum PointerKind<'tcx> {
129128
// base without a pointer dereference", e.g. a field
130129
#[derive(Clone, Copy, PartialEq, Eq, Hash)]
131130
pub enum InteriorKind {
132-
InteriorField(FieldName),
131+
InteriorField(FieldIndex),
133132
InteriorElement(InteriorOffsetKind),
134133
}
135134

136-
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
137-
pub enum FieldName {
138-
NamedField(ast::Name),
139-
PositionalField(usize)
140-
}
135+
// FIXME: Use actual index instead of `ast::Name` with questionable hygiene
136+
#[derive(Clone, Copy, PartialEq, Eq, Hash)]
137+
pub struct FieldIndex(pub ast::Name);
141138

142139
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
143140
pub enum InteriorOffsetKind {
@@ -198,7 +195,7 @@ pub enum ImmutabilityBlame<'tcx> {
198195
}
199196

200197
impl<'tcx> cmt_<'tcx> {
201-
fn resolve_field(&self, field_name: FieldName) -> Option<(&'tcx ty::AdtDef, &'tcx ty::FieldDef)>
198+
fn resolve_field(&self, field_name: Name) -> Option<(&'tcx ty::AdtDef, &'tcx ty::FieldDef)>
202199
{
203200
let adt_def = match self.ty.sty {
204201
ty::TyAdt(def, _) => def,
@@ -215,11 +212,7 @@ impl<'tcx> cmt_<'tcx> {
215212
&adt_def.variants[0]
216213
}
217214
};
218-
let field_def = match field_name {
219-
NamedField(name) => variant_def.field_named(name),
220-
PositionalField(idx) => &variant_def.fields[idx]
221-
};
222-
Some((adt_def, field_def))
215+
Some((adt_def, variant_def.field_named(field_name)))
223216
}
224217

225218
pub fn immutability_blame(&self) -> Option<ImmutabilityBlame<'tcx>> {
@@ -230,8 +223,8 @@ impl<'tcx> cmt_<'tcx> {
230223
match base_cmt.cat {
231224
Categorization::Local(node_id) =>
232225
Some(ImmutabilityBlame::LocalDeref(node_id)),
233-
Categorization::Interior(ref base_cmt, InteriorField(field_name)) => {
234-
base_cmt.resolve_field(field_name).map(|(adt_def, field_def)| {
226+
Categorization::Interior(ref base_cmt, InteriorField(field_index)) => {
227+
base_cmt.resolve_field(field_index.0).map(|(adt_def, field_def)| {
235228
ImmutabilityBlame::AdtFieldDeref(adt_def, field_def)
236229
})
237230
}
@@ -649,11 +642,6 @@ impl<'a, 'gcx, 'tcx> MemCategorizationContext<'a, 'gcx, 'tcx> {
649642
Ok(self.cat_field(expr, base_cmt, f_name.node, expr_ty))
650643
}
651644

652-
hir::ExprTupField(ref base, idx) => {
653-
let base_cmt = self.cat_expr(&base)?;
654-
Ok(self.cat_tup_field(expr, base_cmt, idx.node, expr_ty))
655-
}
656-
657645
hir::ExprIndex(ref base, _) => {
658646
if self.tables.is_method_call(expr) {
659647
// If this is an index implemented by a method call, then it
@@ -979,39 +967,21 @@ impl<'a, 'gcx, 'tcx> MemCategorizationContext<'a, 'gcx, 'tcx> {
979967
pub fn cat_field<N:ast_node>(&self,
980968
node: &N,
981969
base_cmt: cmt<'tcx>,
982-
f_name: ast::Name,
970+
f_name: Name,
983971
f_ty: Ty<'tcx>)
984972
-> cmt<'tcx> {
985973
let ret = Rc::new(cmt_ {
986974
id: node.id(),
987975
span: node.span(),
988976
mutbl: base_cmt.mutbl.inherit(),
989-
cat: Categorization::Interior(base_cmt, InteriorField(NamedField(f_name))),
977+
cat: Categorization::Interior(base_cmt, InteriorField(FieldIndex(f_name))),
990978
ty: f_ty,
991979
note: NoteNone
992980
});
993981
debug!("cat_field ret {:?}", ret);
994982
ret
995983
}
996984

997-
pub fn cat_tup_field<N:ast_node>(&self,
998-
node: &N,
999-
base_cmt: cmt<'tcx>,
1000-
f_idx: usize,
1001-
f_ty: Ty<'tcx>)
1002-
-> cmt<'tcx> {
1003-
let ret = Rc::new(cmt_ {
1004-
id: node.id(),
1005-
span: node.span(),
1006-
mutbl: base_cmt.mutbl.inherit(),
1007-
cat: Categorization::Interior(base_cmt, InteriorField(PositionalField(f_idx))),
1008-
ty: f_ty,
1009-
note: NoteNone
1010-
});
1011-
debug!("cat_tup_field ret {:?}", ret);
1012-
ret
1013-
}
1014-
1015985
fn cat_overloaded_place(&self,
1016986
expr: &hir::Expr,
1017987
base: &hir::Expr,
@@ -1292,8 +1262,8 @@ impl<'a, 'gcx, 'tcx> MemCategorizationContext<'a, 'gcx, 'tcx> {
12921262

12931263
for (i, subpat) in subpats.iter().enumerate_and_adjust(expected_len, ddpos) {
12941264
let subpat_ty = self.pat_ty(&subpat)?; // see (*2)
1295-
let subcmt = self.cat_imm_interior(pat, cmt.clone(), subpat_ty,
1296-
InteriorField(PositionalField(i)));
1265+
let interior = InteriorField(FieldIndex(Name::intern(&i.to_string())));
1266+
let subcmt = self.cat_imm_interior(pat, cmt.clone(), subpat_ty, interior);
12971267
self.cat_pattern_(subcmt, &subpat, op)?;
12981268
}
12991269
}
@@ -1332,8 +1302,8 @@ impl<'a, 'gcx, 'tcx> MemCategorizationContext<'a, 'gcx, 'tcx> {
13321302
};
13331303
for (i, subpat) in subpats.iter().enumerate_and_adjust(expected_len, ddpos) {
13341304
let subpat_ty = self.pat_ty(&subpat)?; // see (*2)
1335-
let subcmt = self.cat_imm_interior(pat, cmt.clone(), subpat_ty,
1336-
InteriorField(PositionalField(i)));
1305+
let interior = InteriorField(FieldIndex(Name::intern(&i.to_string())));
1306+
let subcmt = self.cat_imm_interior(pat, cmt.clone(), subpat_ty, interior);
13371307
self.cat_pattern_(subcmt, &subpat, op)?;
13381308
}
13391309
}
@@ -1516,12 +1486,9 @@ impl<'tcx> cmt_<'tcx> {
15161486
}
15171487
}
15181488
}
1519-
Categorization::Interior(_, InteriorField(NamedField(_))) => {
1489+
Categorization::Interior(_, InteriorField(..)) => {
15201490
"field".to_string()
15211491
}
1522-
Categorization::Interior(_, InteriorField(PositionalField(_))) => {
1523-
"anonymous field".to_string()
1524-
}
15251492
Categorization::Interior(_, InteriorElement(InteriorOffsetKind::Index)) => {
15261493
"indexed content".to_string()
15271494
}
@@ -1554,8 +1521,7 @@ pub fn ptr_sigil(ptr: PointerKind) -> &'static str {
15541521
impl fmt::Debug for InteriorKind {
15551522
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
15561523
match *self {
1557-
InteriorField(NamedField(fld)) => write!(f, "{}", fld),
1558-
InteriorField(PositionalField(i)) => write!(f, "#{}", i),
1524+
InteriorField(FieldIndex(name)) => write!(f, "{}", name),
15591525
InteriorElement(..) => write!(f, "[]"),
15601526
}
15611527
}

src/librustc/middle/region.rs

-1
Original file line numberDiff line numberDiff line change
@@ -1307,7 +1307,6 @@ fn resolve_local<'a, 'tcx>(visitor: &mut RegionResolutionVisitor<'a, 'tcx>,
13071307
hir::ExprAddrOf(_, ref subexpr) |
13081308
hir::ExprUnary(hir::UnDeref, ref subexpr) |
13091309
hir::ExprField(ref subexpr, _) |
1310-
hir::ExprTupField(ref subexpr, _) |
13111310
hir::ExprIndex(ref subexpr, _) => {
13121311
expr = &subexpr;
13131312
}

src/librustc_borrowck/borrowck/gather_loans/restrictions.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ impl<'a, 'tcx> RestrictionsContext<'a, 'tcx> {
108108
RestrictionResult::Safe => RestrictionResult::Safe,
109109
RestrictionResult::SafeIf(base_lp, mut base_vec) => {
110110
for field in &adt_def.non_enum_variant().fields {
111-
let field = InteriorKind::InteriorField(mc::NamedField(field.name));
111+
let field = InteriorKind::InteriorField(mc::FieldIndex(field.name));
112112
let field_ty = if field == interior {
113113
cmt.ty
114114
} else {

src/librustc_borrowck/borrowck/mod.rs

+5-14
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,7 @@ const DOWNCAST_PRINTED_OPERATOR: &'static str = " as ";
370370
// is tracked is irrelevant here.)
371371
#[derive(Clone, Copy, PartialEq, Eq, Hash)]
372372
pub enum InteriorKind {
373-
InteriorField(mc::FieldName),
373+
InteriorField(mc::FieldIndex),
374374
InteriorElement,
375375
}
376376

@@ -1336,18 +1336,10 @@ impl<'a, 'tcx> BorrowckCtxt<'a, 'tcx> {
13361336
out.push(')');
13371337
}
13381338

1339-
LpExtend(ref lp_base, _, LpInterior(_, InteriorField(fname))) => {
1339+
LpExtend(ref lp_base, _, LpInterior(_, InteriorField(mc::FieldIndex(fname)))) => {
13401340
self.append_autoderefd_loan_path_to_string(&lp_base, out);
1341-
match fname {
1342-
mc::NamedField(fname) => {
1343-
out.push('.');
1344-
out.push_str(&fname.as_str());
1345-
}
1346-
mc::PositionalField(idx) => {
1347-
out.push('.');
1348-
out.push_str(&idx.to_string());
1349-
}
1350-
}
1341+
out.push('.');
1342+
out.push_str(&fname.as_str());
13511343
}
13521344

13531345
LpExtend(ref lp_base, _, LpInterior(_, InteriorElement)) => {
@@ -1422,8 +1414,7 @@ impl DataFlowOperator for LoanDataFlowOperator {
14221414
impl<'tcx> fmt::Debug for InteriorKind {
14231415
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
14241416
match *self {
1425-
InteriorField(mc::NamedField(fld)) => write!(f, "{}", fld),
1426-
InteriorField(mc::PositionalField(i)) => write!(f, "#{}", i),
1417+
InteriorField(mc::FieldIndex(name)) => write!(f, "{}", name),
14271418
InteriorElement => write!(f, "[]"),
14281419
}
14291420
}

0 commit comments

Comments
 (0)