Skip to content

Commit 37795ba

Browse files
committed
simplify HIR folder so that it only maps 1 item to 1 item,
removing a bunch of asserts
1 parent 8c9c951 commit 37795ba

File tree

3 files changed

+95
-137
lines changed

3 files changed

+95
-137
lines changed

src/librustc/front/map/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -847,14 +847,14 @@ pub fn map_decoded_item<'ast, F: FoldOps>(map: &Map<'ast>,
847847
-> &'ast InlinedItem {
848848
let mut fld = IdAndSpanUpdater { fold_ops: fold_ops };
849849
let ii = match ii {
850-
II::Item(i) => II::Item(fld.fold_item(i).expect_one("expected one item")),
850+
II::Item(i) => II::Item(fld.fold_item(i)),
851851
II::TraitItem(d, ti) => {
852852
II::TraitItem(fld.fold_ops.new_def_id(d),
853-
fld.fold_trait_item(ti).expect_one("expected one trait item"))
853+
fld.fold_trait_item(ti))
854854
}
855855
II::ImplItem(d, ii) => {
856856
II::ImplItem(fld.fold_ops.new_def_id(d),
857-
fld.fold_impl_item(ii).expect_one("expected one impl item"))
857+
fld.fold_impl_item(ii))
858858
}
859859
II::Foreign(i) => II::Foreign(fld.fold_foreign_item(i))
860860
};

src/librustc/middle/astencode.rs

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -389,20 +389,13 @@ fn simplify_ast(ii: InlinedItemRef) -> InlinedItem {
389389
match ii {
390390
// HACK we're not dropping items.
391391
InlinedItemRef::Item(i) => {
392-
InlinedItem::Item(fold::noop_fold_item(P(i.clone()), &mut fld)
393-
.expect_one("expected one item"))
392+
InlinedItem::Item(fold::noop_fold_item(P(i.clone()), &mut fld))
394393
}
395394
InlinedItemRef::TraitItem(d, ti) => {
396-
InlinedItem::TraitItem(d,
397-
fold::noop_fold_trait_item(P(ti.clone()), &mut fld)
398-
.expect_one("noop_fold_trait_item must produce \
399-
exactly one trait item"))
395+
InlinedItem::TraitItem(d, fold::noop_fold_trait_item(P(ti.clone()), &mut fld))
400396
}
401397
InlinedItemRef::ImplItem(d, ii) => {
402-
InlinedItem::ImplItem(d,
403-
fold::noop_fold_impl_item(P(ii.clone()), &mut fld)
404-
.expect_one("noop_fold_impl_item must produce \
405-
exactly one impl item"))
398+
InlinedItem::ImplItem(d, fold::noop_fold_impl_item(P(ii.clone()), &mut fld))
406399
}
407400
InlinedItemRef::Foreign(i) => {
408401
InlinedItem::Foreign(fold::noop_fold_foreign_item(P(i.clone()), &mut fld))

src/librustc_front/fold.rs

Lines changed: 89 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@ use syntax::owned_slice::OwnedSlice;
2020
use syntax::ptr::P;
2121
use syntax::parse::token;
2222
use std::ptr;
23-
use syntax::util::small_vector::SmallVector;
24-
2523

2624
// This could have a better place to live.
2725
pub trait MoveMap<T> {
@@ -79,14 +77,10 @@ pub trait Folder : Sized {
7977
noop_fold_foreign_item(ni, self)
8078
}
8179

82-
fn fold_item(&mut self, i: P<Item>) -> SmallVector<P<Item>> {
80+
fn fold_item(&mut self, i: P<Item>) -> P<Item> {
8381
noop_fold_item(i, self)
8482
}
8583

86-
fn fold_item_simple(&mut self, i: Item) -> Item {
87-
noop_fold_item_simple(i, self)
88-
}
89-
9084
fn fold_struct_field(&mut self, sf: StructField) -> StructField {
9185
noop_fold_struct_field(sf, self)
9286
}
@@ -95,11 +89,11 @@ pub trait Folder : Sized {
9589
noop_fold_item_underscore(i, self)
9690
}
9791

98-
fn fold_trait_item(&mut self, i: P<TraitItem>) -> SmallVector<P<TraitItem>> {
92+
fn fold_trait_item(&mut self, i: P<TraitItem>) -> P<TraitItem> {
9993
noop_fold_trait_item(i, self)
10094
}
10195

102-
fn fold_impl_item(&mut self, i: P<ImplItem>) -> SmallVector<P<ImplItem>> {
96+
fn fold_impl_item(&mut self, i: P<ImplItem>) -> P<ImplItem> {
10397
noop_fold_impl_item(i, self)
10498
}
10599

@@ -111,8 +105,8 @@ pub trait Folder : Sized {
111105
noop_fold_block(b, self)
112106
}
113107

114-
fn fold_stmt(&mut self, s: P<Stmt>) -> SmallVector<P<Stmt>> {
115-
s.and_then(|s| noop_fold_stmt(s, self))
108+
fn fold_stmt(&mut self, s: P<Stmt>) -> P<Stmt> {
109+
noop_fold_stmt(s, self)
116110
}
117111

118112
fn fold_arm(&mut self, a: Arm) -> Arm {
@@ -123,7 +117,7 @@ pub trait Folder : Sized {
123117
noop_fold_pat(p, self)
124118
}
125119

126-
fn fold_decl(&mut self, d: P<Decl>) -> SmallVector<P<Decl>> {
120+
fn fold_decl(&mut self, d: P<Decl>) -> P<Decl> {
127121
noop_fold_decl(d, self)
128122
}
129123

@@ -340,22 +334,17 @@ pub fn noop_fold_arm<T: Folder>(Arm { attrs, pats, guard, body }: Arm, fld: &mut
340334
}
341335
}
342336

343-
pub fn noop_fold_decl<T: Folder>(d: P<Decl>, fld: &mut T) -> SmallVector<P<Decl>> {
344-
d.and_then(|Spanned { node, span }| {
337+
pub fn noop_fold_decl<T: Folder>(d: P<Decl>, fld: &mut T) -> P<Decl> {
338+
d.map(|Spanned { node, span }| {
345339
match node {
346-
DeclLocal(l) => SmallVector::one(P(Spanned {
340+
DeclLocal(l) => Spanned {
347341
node: DeclLocal(fld.fold_local(l)),
348342
span: fld.new_span(span),
349-
})),
350-
DeclItem(it) => fld.fold_item(it)
351-
.into_iter()
352-
.map(|i| {
353-
P(Spanned {
354-
node: DeclItem(i),
355-
span: fld.new_span(span),
356-
})
357-
})
358-
.collect(),
343+
},
344+
DeclItem(it) => Spanned {
345+
node: DeclItem(fld.fold_item(it)),
346+
span: fld.new_span(span),
347+
},
359348
}
360349
})
361350
}
@@ -771,7 +760,7 @@ pub fn noop_fold_block<T: Folder>(b: P<Block>, folder: &mut T) -> P<Block> {
771760
b.map(|Block { id, stmts, expr, rules, span }| {
772761
Block {
773762
id: folder.new_id(id),
774-
stmts: stmts.into_iter().flat_map(|s| folder.fold_stmt(s).into_iter()).collect(),
763+
stmts: stmts.into_iter().map(|s| folder.fold_stmt(s)).collect(),
775764
expr: expr.map(|x| folder.fold_expr(x)),
776765
rules: rules,
777766
span: folder.new_span(span),
@@ -819,9 +808,7 @@ pub fn noop_fold_item_underscore<T: Folder>(i: Item_, folder: &mut T) -> Item_ {
819808
}
820809
ItemImpl(unsafety, polarity, generics, ifce, ty, impl_items) => {
821810
let new_impl_items = impl_items.into_iter()
822-
.flat_map(|item| {
823-
folder.fold_impl_item(item).into_iter()
824-
})
811+
.map(|item| folder.fold_impl_item(item))
825812
.collect();
826813
let ifce = match ifce {
827814
None => None,
@@ -839,7 +826,7 @@ pub fn noop_fold_item_underscore<T: Folder>(i: Item_, folder: &mut T) -> Item_ {
839826
ItemTrait(unsafety, generics, bounds, items) => {
840827
let bounds = folder.fold_bounds(bounds);
841828
let items = items.into_iter()
842-
.flat_map(|item| folder.fold_trait_item(item).into_iter())
829+
.map(|item| folder.fold_trait_item(item))
843830
.collect();
844831
ItemTrait(unsafety, folder.fold_generics(generics), bounds, items)
845832
}
@@ -848,8 +835,8 @@ pub fn noop_fold_item_underscore<T: Folder>(i: Item_, folder: &mut T) -> Item_ {
848835

849836
pub fn noop_fold_trait_item<T: Folder>(i: P<TraitItem>,
850837
folder: &mut T)
851-
-> SmallVector<P<TraitItem>> {
852-
SmallVector::one(i.map(|TraitItem { id, name, attrs, node, span }| {
838+
-> P<TraitItem> {
839+
i.map(|TraitItem { id, name, attrs, node, span }| {
853840
TraitItem {
854841
id: folder.new_id(id),
855842
name: folder.fold_name(name),
@@ -869,11 +856,11 @@ pub fn noop_fold_trait_item<T: Folder>(i: P<TraitItem>,
869856
},
870857
span: folder.new_span(span),
871858
}
872-
}))
859+
})
873860
}
874861

875-
pub fn noop_fold_impl_item<T: Folder>(i: P<ImplItem>, folder: &mut T) -> SmallVector<P<ImplItem>> {
876-
SmallVector::one(i.map(|ImplItem { id, name, attrs, node, vis, span }| {
862+
pub fn noop_fold_impl_item<T: Folder>(i: P<ImplItem>, folder: &mut T) -> P<ImplItem> {
863+
i.map(|ImplItem { id, name, attrs, node, vis, span }| {
877864
ImplItem {
878865
id: folder.new_id(id),
879866
name: folder.fold_name(name),
@@ -890,13 +877,13 @@ pub fn noop_fold_impl_item<T: Folder>(i: P<ImplItem>, folder: &mut T) -> SmallVe
890877
},
891878
span: folder.new_span(span),
892879
}
893-
}))
880+
})
894881
}
895882

896883
pub fn noop_fold_mod<T: Folder>(Mod { inner, items }: Mod, folder: &mut T) -> Mod {
897884
Mod {
898885
inner: folder.new_span(inner),
899-
items: items.into_iter().flat_map(|x| folder.fold_item(x).into_iter()).collect(),
886+
items: items.into_iter().map(|x| folder.fold_item(x)).collect(),
900887
}
901888
}
902889

@@ -905,34 +892,22 @@ pub fn noop_fold_crate<T: Folder>(Crate { module, attrs, config, span, exported_
905892
-> Crate {
906893
let config = folder.fold_meta_items(config);
907894

908-
let mut items = folder.fold_item(P(hir::Item {
909-
name: token::special_idents::invalid.name,
910-
attrs: attrs,
911-
id: DUMMY_NODE_ID,
912-
vis: hir::Public,
913-
span: span,
914-
node: hir::ItemMod(module),
915-
}))
916-
.into_iter();
917-
918-
let (module, attrs, span) = match items.next() {
919-
Some(item) => {
920-
assert!(items.next().is_none(),
921-
"a crate cannot expand to more than one item");
922-
item.and_then(|hir::Item { attrs, span, node, .. }| {
923-
match node {
924-
hir::ItemMod(m) => (m, attrs, span),
925-
_ => panic!("fold converted a module to not a module"),
926-
}
927-
})
928-
}
929-
None => (hir::Mod {
930-
inner: span,
931-
items: vec![],
932-
},
933-
vec![],
934-
span),
935-
};
895+
let crate_mod = folder.fold_item(P(hir::Item {
896+
name: token::special_idents::invalid.name,
897+
attrs: attrs,
898+
id: DUMMY_NODE_ID,
899+
vis: hir::Public,
900+
span: span,
901+
node: hir::ItemMod(module),
902+
}));
903+
904+
let (module, attrs, span) =
905+
crate_mod.and_then(|hir::Item { attrs, span, node, .. }| {
906+
match node {
907+
hir::ItemMod(m) => (m, attrs, span),
908+
_ => panic!("fold converted a module to not a module"),
909+
}
910+
});
936911

937912
Crate {
938913
module: module,
@@ -943,34 +918,28 @@ pub fn noop_fold_crate<T: Folder>(Crate { module, attrs, config, span, exported_
943918
}
944919
}
945920

946-
// fold one item into possibly many items
947-
pub fn noop_fold_item<T: Folder>(i: P<Item>, folder: &mut T) -> SmallVector<P<Item>> {
948-
SmallVector::one(i.map(|i| folder.fold_item_simple(i)))
949-
}
950-
951-
// fold one item into exactly one item
952-
pub fn noop_fold_item_simple<T: Folder>(Item { id, name, attrs, node, vis, span }: Item,
953-
folder: &mut T)
954-
-> Item {
955-
let id = folder.new_id(id);
956-
let node = folder.fold_item_underscore(node);
957-
// FIXME: we should update the impl_pretty_name, but it uses pretty printing.
958-
// let ident = match node {
959-
// // The node may have changed, recompute the "pretty" impl name.
960-
// ItemImpl(_, _, _, ref maybe_trait, ref ty, _) => {
961-
// impl_pretty_name(maybe_trait, Some(&**ty))
962-
// }
963-
// _ => ident
964-
// };
965-
966-
Item {
967-
id: id,
968-
name: folder.fold_name(name),
969-
attrs: fold_attrs(attrs, folder),
970-
node: node,
971-
vis: vis,
972-
span: folder.new_span(span),
973-
}
921+
pub fn noop_fold_item<T: Folder>(item: P<Item>, folder: &mut T) -> P<Item> {
922+
item.map(|Item { id, name, attrs, node, vis, span }| {
923+
let id = folder.new_id(id);
924+
let node = folder.fold_item_underscore(node);
925+
// FIXME: we should update the impl_pretty_name, but it uses pretty printing.
926+
// let ident = match node {
927+
// // The node may have changed, recompute the "pretty" impl name.
928+
// ItemImpl(_, _, _, ref maybe_trait, ref ty, _) => {
929+
// impl_pretty_name(maybe_trait, Some(&**ty))
930+
// }
931+
// _ => ident
932+
// };
933+
934+
Item {
935+
id: id,
936+
name: folder.fold_name(name),
937+
attrs: fold_attrs(attrs, folder),
938+
node: node,
939+
vis: vis,
940+
span: folder.new_span(span),
941+
}
942+
})
974943
}
975944

976945
pub fn noop_fold_foreign_item<T: Folder>(ni: P<ForeignItem>, folder: &mut T) -> P<ForeignItem> {
@@ -1184,36 +1153,32 @@ pub fn noop_fold_expr<T: Folder>(Expr { id, node, span }: Expr, folder: &mut T)
11841153
}
11851154
}
11861155

1187-
pub fn noop_fold_stmt<T: Folder>(Spanned { node, span }: Stmt,
1188-
folder: &mut T)
1189-
-> SmallVector<P<Stmt>> {
1190-
let span = folder.new_span(span);
1191-
match node {
1192-
StmtDecl(d, id) => {
1193-
let id = folder.new_id(id);
1194-
folder.fold_decl(d)
1195-
.into_iter()
1196-
.map(|d| {
1197-
P(Spanned {
1198-
node: StmtDecl(d, id),
1199-
span: span,
1200-
})
1201-
})
1202-
.collect()
1203-
}
1204-
StmtExpr(e, id) => {
1205-
let id = folder.new_id(id);
1206-
SmallVector::one(P(Spanned {
1207-
node: StmtExpr(folder.fold_expr(e), id),
1208-
span: span,
1209-
}))
1210-
}
1211-
StmtSemi(e, id) => {
1212-
let id = folder.new_id(id);
1213-
SmallVector::one(P(Spanned {
1214-
node: StmtSemi(folder.fold_expr(e), id),
1215-
span: span,
1216-
}))
1156+
pub fn noop_fold_stmt<T: Folder>(stmt: P<Stmt>, folder: &mut T)
1157+
-> P<Stmt> {
1158+
stmt.map(|Spanned { node, span }| {
1159+
let span = folder.new_span(span);
1160+
match node {
1161+
StmtDecl(d, id) => {
1162+
let id = folder.new_id(id);
1163+
Spanned {
1164+
node: StmtDecl(folder.fold_decl(d), id),
1165+
span: span
1166+
}
1167+
}
1168+
StmtExpr(e, id) => {
1169+
let id = folder.new_id(id);
1170+
Spanned {
1171+
node: StmtExpr(folder.fold_expr(e), id),
1172+
span: span,
1173+
}
1174+
}
1175+
StmtSemi(e, id) => {
1176+
let id = folder.new_id(id);
1177+
Spanned {
1178+
node: StmtSemi(folder.fold_expr(e), id),
1179+
span: span,
1180+
}
1181+
}
12171182
}
1218-
}
1183+
})
12191184
}

0 commit comments

Comments
 (0)