]> git.proxmox.com Git - rustc.git/blame - src/librustc/hir/fold.rs
New upstream version 1.12.1+dfsg1
[rustc.git] / src / librustc / hir / fold.rs
CommitLineData
e9174d1e
SL
1// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT
2// file at the top-level directory of this distribution and at
3// http://rust-lang.org/COPYRIGHT.
4//
5// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8// option. This file may not be copied, modified, or distributed
9// except according to those terms.
10
11//! A Folder represents an HIR->HIR fold; it accepts a HIR piece,
12//! and returns a piece of the same type.
13
14use hir::*;
92a42be0 15use syntax::ast::{Name, NodeId, DUMMY_NODE_ID, Attribute, Attribute_, MetaItem};
7453a54e 16use syntax::ast::MetaItemKind;
e9174d1e 17use hir;
3157f602
XL
18use syntax_pos::Span;
19use syntax::codemap::{respan, Spanned};
e9174d1e 20use syntax::ptr::P;
a7813a04 21use syntax::parse::token::keywords;
92a42be0 22use syntax::util::move_map::MoveMap;
e9174d1e
SL
23
24pub trait Folder : Sized {
25 // Any additions to this trait should happen in form
26 // of a call to a public `noop_*` function that only calls
27 // out to the folder again, not other `noop_*` functions.
28 //
29 // This is a necessary API workaround to the problem of not
30 // being able to call out to the super default method
31 // in an overridden default method.
32
33 fn fold_crate(&mut self, c: Crate) -> Crate {
34 noop_fold_crate(c, self)
35 }
36
9cc50fc6 37 fn fold_meta_items(&mut self, meta_items: HirVec<P<MetaItem>>) -> HirVec<P<MetaItem>> {
e9174d1e
SL
38 noop_fold_meta_items(meta_items, self)
39 }
40
41 fn fold_meta_item(&mut self, meta_item: P<MetaItem>) -> P<MetaItem> {
42 noop_fold_meta_item(meta_item, self)
43 }
44
45 fn fold_view_path(&mut self, view_path: P<ViewPath>) -> P<ViewPath> {
46 noop_fold_view_path(view_path, self)
47 }
48
92a42be0 49 fn fold_foreign_item(&mut self, ni: ForeignItem) -> ForeignItem {
e9174d1e
SL
50 noop_fold_foreign_item(ni, self)
51 }
52
92a42be0 53 fn fold_item(&mut self, i: Item) -> Item {
e9174d1e
SL
54 noop_fold_item(i, self)
55 }
56
92a42be0
SL
57 fn fold_item_id(&mut self, i: ItemId) -> ItemId {
58 noop_fold_item_id(i, self)
e9174d1e
SL
59 }
60
61 fn fold_struct_field(&mut self, sf: StructField) -> StructField {
62 noop_fold_struct_field(sf, self)
63 }
64
65 fn fold_item_underscore(&mut self, i: Item_) -> Item_ {
66 noop_fold_item_underscore(i, self)
67 }
68
92a42be0 69 fn fold_trait_item(&mut self, i: TraitItem) -> TraitItem {
e9174d1e
SL
70 noop_fold_trait_item(i, self)
71 }
72
92a42be0 73 fn fold_impl_item(&mut self, i: ImplItem) -> ImplItem {
e9174d1e
SL
74 noop_fold_impl_item(i, self)
75 }
76
77 fn fold_fn_decl(&mut self, d: P<FnDecl>) -> P<FnDecl> {
78 noop_fold_fn_decl(d, self)
79 }
80
81 fn fold_block(&mut self, b: P<Block>) -> P<Block> {
82 noop_fold_block(b, self)
83 }
84
92a42be0
SL
85 fn fold_stmt(&mut self, s: Stmt) -> Stmt {
86 noop_fold_stmt(s, self)
e9174d1e
SL
87 }
88
89 fn fold_arm(&mut self, a: Arm) -> Arm {
90 noop_fold_arm(a, self)
91 }
92
93 fn fold_pat(&mut self, p: P<Pat>) -> P<Pat> {
94 noop_fold_pat(p, self)
95 }
96
92a42be0 97 fn fold_decl(&mut self, d: P<Decl>) -> P<Decl> {
e9174d1e
SL
98 noop_fold_decl(d, self)
99 }
100
101 fn fold_expr(&mut self, e: P<Expr>) -> P<Expr> {
102 e.map(|e| noop_fold_expr(e, self))
103 }
104
105 fn fold_ty(&mut self, t: P<Ty>) -> P<Ty> {
106 noop_fold_ty(t, self)
107 }
108
92a42be0 109 fn fold_ty_binding(&mut self, t: TypeBinding) -> TypeBinding {
e9174d1e
SL
110 noop_fold_ty_binding(t, self)
111 }
112
113 fn fold_mod(&mut self, m: Mod) -> Mod {
114 noop_fold_mod(m, self)
115 }
116
117 fn fold_foreign_mod(&mut self, nm: ForeignMod) -> ForeignMod {
118 noop_fold_foreign_mod(nm, self)
119 }
120
92a42be0 121 fn fold_variant(&mut self, v: Variant) -> Variant {
e9174d1e
SL
122 noop_fold_variant(v, self)
123 }
124
b039eaaf
SL
125 fn fold_name(&mut self, n: Name) -> Name {
126 noop_fold_name(n, self)
127 }
128
e9174d1e
SL
129 fn fold_usize(&mut self, i: usize) -> usize {
130 noop_fold_usize(i, self)
131 }
132
133 fn fold_path(&mut self, p: Path) -> Path {
134 noop_fold_path(p, self)
135 }
136
137 fn fold_path_parameters(&mut self, p: PathParameters) -> PathParameters {
138 noop_fold_path_parameters(p, self)
139 }
140
b039eaaf
SL
141 fn fold_angle_bracketed_parameter_data(&mut self,
142 p: AngleBracketedParameterData)
143 -> AngleBracketedParameterData {
e9174d1e
SL
144 noop_fold_angle_bracketed_parameter_data(p, self)
145 }
146
b039eaaf
SL
147 fn fold_parenthesized_parameter_data(&mut self,
148 p: ParenthesizedParameterData)
149 -> ParenthesizedParameterData {
e9174d1e
SL
150 noop_fold_parenthesized_parameter_data(p, self)
151 }
152
153 fn fold_local(&mut self, l: P<Local>) -> P<Local> {
154 noop_fold_local(l, self)
155 }
156
e9174d1e
SL
157 fn fold_lifetime(&mut self, l: Lifetime) -> Lifetime {
158 noop_fold_lifetime(l, self)
159 }
160
161 fn fold_lifetime_def(&mut self, l: LifetimeDef) -> LifetimeDef {
162 noop_fold_lifetime_def(l, self)
163 }
164
165 fn fold_attribute(&mut self, at: Attribute) -> Option<Attribute> {
166 noop_fold_attribute(at, self)
167 }
168
169 fn fold_arg(&mut self, a: Arg) -> Arg {
170 noop_fold_arg(a, self)
171 }
172
173 fn fold_generics(&mut self, generics: Generics) -> Generics {
174 noop_fold_generics(generics, self)
175 }
176
177 fn fold_trait_ref(&mut self, p: TraitRef) -> TraitRef {
178 noop_fold_trait_ref(p, self)
179 }
180
181 fn fold_poly_trait_ref(&mut self, p: PolyTraitRef) -> PolyTraitRef {
182 noop_fold_poly_trait_ref(p, self)
183 }
184
b039eaaf
SL
185 fn fold_variant_data(&mut self, vdata: VariantData) -> VariantData {
186 noop_fold_variant_data(vdata, self)
e9174d1e
SL
187 }
188
9cc50fc6 189 fn fold_lifetimes(&mut self, lts: HirVec<Lifetime>) -> HirVec<Lifetime> {
e9174d1e
SL
190 noop_fold_lifetimes(lts, self)
191 }
192
9cc50fc6 193 fn fold_lifetime_defs(&mut self, lts: HirVec<LifetimeDef>) -> HirVec<LifetimeDef> {
e9174d1e
SL
194 noop_fold_lifetime_defs(lts, self)
195 }
196
197 fn fold_ty_param(&mut self, tp: TyParam) -> TyParam {
198 noop_fold_ty_param(tp, self)
199 }
200
9cc50fc6 201 fn fold_ty_params(&mut self, tps: HirVec<TyParam>) -> HirVec<TyParam> {
e9174d1e
SL
202 noop_fold_ty_params(tps, self)
203 }
204
205 fn fold_opt_lifetime(&mut self, o_lt: Option<Lifetime>) -> Option<Lifetime> {
206 noop_fold_opt_lifetime(o_lt, self)
207 }
208
b039eaaf 209 fn fold_opt_bounds(&mut self,
9cc50fc6
SL
210 b: Option<TyParamBounds>)
211 -> Option<TyParamBounds> {
e9174d1e
SL
212 noop_fold_opt_bounds(b, self)
213 }
214
9cc50fc6 215 fn fold_bounds(&mut self, b: TyParamBounds) -> TyParamBounds {
e9174d1e
SL
216 noop_fold_bounds(b, self)
217 }
218
219 fn fold_ty_param_bound(&mut self, tpb: TyParamBound) -> TyParamBound {
220 noop_fold_ty_param_bound(tpb, self)
221 }
222
223 fn fold_mt(&mut self, mt: MutTy) -> MutTy {
224 noop_fold_mt(mt, self)
225 }
226
227 fn fold_field(&mut self, field: Field) -> Field {
228 noop_fold_field(field, self)
229 }
230
b039eaaf 231 fn fold_where_clause(&mut self, where_clause: WhereClause) -> WhereClause {
e9174d1e
SL
232 noop_fold_where_clause(where_clause, self)
233 }
234
b039eaaf 235 fn fold_where_predicate(&mut self, where_predicate: WherePredicate) -> WherePredicate {
e9174d1e
SL
236 noop_fold_where_predicate(where_predicate, self)
237 }
238
92a42be0 239 /// called for the `id` on each declaration
e9174d1e
SL
240 fn new_id(&mut self, i: NodeId) -> NodeId {
241 i
242 }
243
92a42be0
SL
244 /// called for ids that are references (e.g., ItemDef)
245 fn map_id(&mut self, i: NodeId) -> NodeId {
246 i
247 }
248
e9174d1e
SL
249 fn new_span(&mut self, sp: Span) -> Span {
250 sp
251 }
252}
253
9cc50fc6 254pub fn noop_fold_meta_items<T: Folder>(meta_items: HirVec<P<MetaItem>>,
b039eaaf 255 fld: &mut T)
9cc50fc6 256 -> HirVec<P<MetaItem>> {
e9174d1e
SL
257 meta_items.move_map(|x| fld.fold_meta_item(x))
258}
259
260pub fn noop_fold_view_path<T: Folder>(view_path: P<ViewPath>, fld: &mut T) -> P<ViewPath> {
b039eaaf
SL
261 view_path.map(|Spanned { node, span }| {
262 Spanned {
263 node: match node {
264 ViewPathSimple(name, path) => {
265 ViewPathSimple(name, fld.fold_path(path))
266 }
267 ViewPathGlob(path) => {
268 ViewPathGlob(fld.fold_path(path))
269 }
270 ViewPathList(path, path_list_idents) => {
271 ViewPathList(fld.fold_path(path),
272 path_list_idents.move_map(|path_list_ident| {
273 Spanned {
274 node: match path_list_ident.node {
275 PathListIdent { id, name, rename } => PathListIdent {
276 id: fld.new_id(id),
277 name: name,
278 rename: rename,
279 },
280 PathListMod { id, rename } => PathListMod {
281 id: fld.new_id(id),
282 rename: rename,
283 },
284 },
285 span: fld.new_span(path_list_ident.span),
286 }
287 }))
288 }
289 },
290 span: fld.new_span(span),
291 }
e9174d1e
SL
292 })
293}
294
3157f602
XL
295pub fn fold_attrs<T, F>(attrs: T, fld: &mut F) -> T
296 where T: Into<Vec<Attribute>> + From<Vec<Attribute>>,
297 F: Folder,
298{
299 attrs.into().move_flat_map(|x| fld.fold_attribute(x)).into()
e9174d1e
SL
300}
301
b039eaaf 302pub fn noop_fold_arm<T: Folder>(Arm { attrs, pats, guard, body }: Arm, fld: &mut T) -> Arm {
e9174d1e
SL
303 Arm {
304 attrs: fold_attrs(attrs, fld),
305 pats: pats.move_map(|x| fld.fold_pat(x)),
306 guard: guard.map(|x| fld.fold_expr(x)),
307 body: fld.fold_expr(body),
308 }
309}
310
92a42be0
SL
311pub fn noop_fold_decl<T: Folder>(d: P<Decl>, fld: &mut T) -> P<Decl> {
312 d.map(|Spanned { node, span }| {
b039eaaf 313 match node {
92a42be0 314 DeclLocal(l) => Spanned {
b039eaaf
SL
315 node: DeclLocal(fld.fold_local(l)),
316 span: fld.new_span(span),
92a42be0
SL
317 },
318 DeclItem(it) => Spanned {
319 node: DeclItem(fld.fold_item_id(it)),
320 span: fld.new_span(span),
321 },
b039eaaf 322 }
e9174d1e
SL
323 })
324}
325
92a42be0
SL
326pub fn noop_fold_ty_binding<T: Folder>(b: TypeBinding, fld: &mut T) -> TypeBinding {
327 TypeBinding {
328 id: fld.new_id(b.id),
329 name: b.name,
330 ty: fld.fold_ty(b.ty),
331 span: fld.new_span(b.span),
332 }
e9174d1e
SL
333}
334
335pub fn noop_fold_ty<T: Folder>(t: P<Ty>, fld: &mut T) -> P<Ty> {
b039eaaf
SL
336 t.map(|Ty { id, node, span }| {
337 Ty {
338 id: fld.new_id(id),
339 node: match node {
340 TyInfer => node,
341 TyVec(ty) => TyVec(fld.fold_ty(ty)),
342 TyPtr(mt) => TyPtr(fld.fold_mt(mt)),
343 TyRptr(region, mt) => {
344 TyRptr(fld.fold_opt_lifetime(region), fld.fold_mt(mt))
345 }
346 TyBareFn(f) => {
347 TyBareFn(f.map(|BareFnTy { lifetimes, unsafety, abi, decl }| {
348 BareFnTy {
349 lifetimes: fld.fold_lifetime_defs(lifetimes),
350 unsafety: unsafety,
351 abi: abi,
352 decl: fld.fold_fn_decl(decl),
353 }
354 }))
355 }
5bcae85e 356 TyNever => node,
b039eaaf 357 TyTup(tys) => TyTup(tys.move_map(|ty| fld.fold_ty(ty))),
b039eaaf
SL
358 TyPath(qself, path) => {
359 let qself = qself.map(|QSelf { ty, position }| {
360 QSelf {
361 ty: fld.fold_ty(ty),
362 position: position,
363 }
364 });
365 TyPath(qself, fld.fold_path(path))
366 }
367 TyObjectSum(ty, bounds) => {
368 TyObjectSum(fld.fold_ty(ty), fld.fold_bounds(bounds))
369 }
370 TyFixedLengthVec(ty, e) => {
371 TyFixedLengthVec(fld.fold_ty(ty), fld.fold_expr(e))
372 }
373 TyTypeof(expr) => {
374 TyTypeof(fld.fold_expr(expr))
375 }
376 TyPolyTraitRef(bounds) => {
377 TyPolyTraitRef(bounds.move_map(|b| fld.fold_ty_param_bound(b)))
378 }
5bcae85e
SL
379 TyImplTrait(bounds) => {
380 TyImplTrait(bounds.move_map(|b| fld.fold_ty_param_bound(b)))
381 }
b039eaaf
SL
382 },
383 span: fld.new_span(span),
384 }
e9174d1e
SL
385 })
386}
387
b039eaaf
SL
388pub fn noop_fold_foreign_mod<T: Folder>(ForeignMod { abi, items }: ForeignMod,
389 fld: &mut T)
390 -> ForeignMod {
e9174d1e
SL
391 ForeignMod {
392 abi: abi,
393 items: items.move_map(|x| fld.fold_foreign_item(x)),
394 }
395}
396
92a42be0
SL
397pub fn noop_fold_variant<T: Folder>(v: Variant, fld: &mut T) -> Variant {
398 Spanned {
e9174d1e 399 node: Variant_ {
92a42be0
SL
400 name: v.node.name,
401 attrs: fold_attrs(v.node.attrs, fld),
402 data: fld.fold_variant_data(v.node.data),
403 disr_expr: v.node.disr_expr.map(|e| fld.fold_expr(e)),
e9174d1e 404 },
92a42be0
SL
405 span: fld.new_span(v.span),
406 }
e9174d1e
SL
407}
408
b039eaaf
SL
409pub fn noop_fold_name<T: Folder>(n: Name, _: &mut T) -> Name {
410 n
411}
412
e9174d1e
SL
413pub fn noop_fold_usize<T: Folder>(i: usize, _: &mut T) -> usize {
414 i
415}
416
b039eaaf 417pub fn noop_fold_path<T: Folder>(Path { global, segments, span }: Path, fld: &mut T) -> Path {
e9174d1e
SL
418 Path {
419 global: global,
a7813a04 420 segments: segments.move_map(|PathSegment { name, parameters }| {
b039eaaf 421 PathSegment {
a7813a04 422 name: fld.fold_name(name),
b039eaaf
SL
423 parameters: fld.fold_path_parameters(parameters),
424 }
e9174d1e 425 }),
b039eaaf 426 span: fld.new_span(span),
e9174d1e
SL
427 }
428}
429
b039eaaf
SL
430pub fn noop_fold_path_parameters<T: Folder>(path_parameters: PathParameters,
431 fld: &mut T)
432 -> PathParameters {
e9174d1e
SL
433 match path_parameters {
434 AngleBracketedParameters(data) =>
435 AngleBracketedParameters(fld.fold_angle_bracketed_parameter_data(data)),
436 ParenthesizedParameters(data) =>
437 ParenthesizedParameters(fld.fold_parenthesized_parameter_data(data)),
438 }
439}
440
441pub fn noop_fold_angle_bracketed_parameter_data<T: Folder>(data: AngleBracketedParameterData,
442 fld: &mut T)
b039eaaf 443 -> AngleBracketedParameterData {
e9174d1e 444 let AngleBracketedParameterData { lifetimes, types, bindings } = data;
b039eaaf
SL
445 AngleBracketedParameterData {
446 lifetimes: fld.fold_lifetimes(lifetimes),
447 types: types.move_map(|ty| fld.fold_ty(ty)),
448 bindings: bindings.move_map(|b| fld.fold_ty_binding(b)),
449 }
e9174d1e
SL
450}
451
452pub fn noop_fold_parenthesized_parameter_data<T: Folder>(data: ParenthesizedParameterData,
453 fld: &mut T)
b039eaaf 454 -> ParenthesizedParameterData {
e9174d1e 455 let ParenthesizedParameterData { inputs, output, span } = data;
b039eaaf
SL
456 ParenthesizedParameterData {
457 inputs: inputs.move_map(|ty| fld.fold_ty(ty)),
458 output: output.map(|ty| fld.fold_ty(ty)),
459 span: fld.new_span(span),
460 }
e9174d1e
SL
461}
462
463pub fn noop_fold_local<T: Folder>(l: P<Local>, fld: &mut T) -> P<Local> {
92a42be0 464 l.map(|Local { id, pat, ty, init, span, attrs }| {
b039eaaf
SL
465 Local {
466 id: fld.new_id(id),
467 ty: ty.map(|t| fld.fold_ty(t)),
468 pat: fld.fold_pat(pat),
469 init: init.map(|e| fld.fold_expr(e)),
470 span: fld.new_span(span),
3157f602 471 attrs: fold_attrs(attrs, fld),
b039eaaf 472 }
e9174d1e
SL
473 })
474}
475
476pub fn noop_fold_attribute<T: Folder>(at: Attribute, fld: &mut T) -> Option<Attribute> {
477 let Spanned {node: Attribute_ {id, style, value, is_sugared_doc}, span} = at;
478 Some(Spanned {
479 node: Attribute_ {
480 id: id,
481 style: style,
482 value: fld.fold_meta_item(value),
b039eaaf 483 is_sugared_doc: is_sugared_doc,
e9174d1e 484 },
b039eaaf 485 span: fld.new_span(span),
e9174d1e
SL
486 })
487}
488
e9174d1e 489pub fn noop_fold_meta_item<T: Folder>(mi: P<MetaItem>, fld: &mut T) -> P<MetaItem> {
b039eaaf
SL
490 mi.map(|Spanned { node, span }| {
491 Spanned {
492 node: match node {
7453a54e
SL
493 MetaItemKind::Word(id) => MetaItemKind::Word(id),
494 MetaItemKind::List(id, mis) => {
495 MetaItemKind::List(id, mis.move_map(|e| fld.fold_meta_item(e)))
b039eaaf 496 }
7453a54e 497 MetaItemKind::NameValue(id, s) => MetaItemKind::NameValue(id, s),
b039eaaf
SL
498 },
499 span: fld.new_span(span),
500 }
e9174d1e
SL
501 })
502}
503
b039eaaf 504pub fn noop_fold_arg<T: Folder>(Arg { id, pat, ty }: Arg, fld: &mut T) -> Arg {
e9174d1e
SL
505 Arg {
506 id: fld.new_id(id),
507 pat: fld.fold_pat(pat),
b039eaaf 508 ty: fld.fold_ty(ty),
e9174d1e
SL
509 }
510}
511
512pub fn noop_fold_fn_decl<T: Folder>(decl: P<FnDecl>, fld: &mut T) -> P<FnDecl> {
b039eaaf
SL
513 decl.map(|FnDecl { inputs, output, variadic }| {
514 FnDecl {
515 inputs: inputs.move_map(|x| fld.fold_arg(x)),
516 output: match output {
517 Return(ty) => Return(fld.fold_ty(ty)),
518 DefaultReturn(span) => DefaultReturn(span),
b039eaaf
SL
519 },
520 variadic: variadic,
521 }
e9174d1e
SL
522 })
523}
524
b039eaaf
SL
525pub fn noop_fold_ty_param_bound<T>(tpb: TyParamBound, fld: &mut T) -> TyParamBound
526 where T: Folder
527{
e9174d1e
SL
528 match tpb {
529 TraitTyParamBound(ty, modifier) => TraitTyParamBound(fld.fold_poly_trait_ref(ty), modifier),
530 RegionTyParamBound(lifetime) => RegionTyParamBound(fld.fold_lifetime(lifetime)),
531 }
532}
533
534pub fn noop_fold_ty_param<T: Folder>(tp: TyParam, fld: &mut T) -> TyParam {
b039eaaf 535 let TyParam {id, name, bounds, default, span} = tp;
e9174d1e
SL
536 TyParam {
537 id: fld.new_id(id),
b039eaaf 538 name: name,
e9174d1e
SL
539 bounds: fld.fold_bounds(bounds),
540 default: default.map(|x| fld.fold_ty(x)),
b039eaaf 541 span: span,
e9174d1e
SL
542 }
543}
544
9cc50fc6 545pub fn noop_fold_ty_params<T: Folder>(tps: HirVec<TyParam>,
b039eaaf 546 fld: &mut T)
9cc50fc6 547 -> HirVec<TyParam> {
e9174d1e
SL
548 tps.move_map(|tp| fld.fold_ty_param(tp))
549}
550
551pub fn noop_fold_lifetime<T: Folder>(l: Lifetime, fld: &mut T) -> Lifetime {
552 Lifetime {
553 id: fld.new_id(l.id),
554 name: l.name,
b039eaaf 555 span: fld.new_span(l.span),
e9174d1e
SL
556 }
557}
558
b039eaaf 559pub fn noop_fold_lifetime_def<T: Folder>(l: LifetimeDef, fld: &mut T) -> LifetimeDef {
e9174d1e
SL
560 LifetimeDef {
561 lifetime: fld.fold_lifetime(l.lifetime),
562 bounds: fld.fold_lifetimes(l.bounds),
563 }
564}
565
9cc50fc6 566pub fn noop_fold_lifetimes<T: Folder>(lts: HirVec<Lifetime>, fld: &mut T) -> HirVec<Lifetime> {
e9174d1e
SL
567 lts.move_map(|l| fld.fold_lifetime(l))
568}
569
9cc50fc6
SL
570pub fn noop_fold_lifetime_defs<T: Folder>(lts: HirVec<LifetimeDef>,
571 fld: &mut T)
572 -> HirVec<LifetimeDef> {
e9174d1e
SL
573 lts.move_map(|l| fld.fold_lifetime_def(l))
574}
575
b039eaaf 576pub fn noop_fold_opt_lifetime<T: Folder>(o_lt: Option<Lifetime>, fld: &mut T) -> Option<Lifetime> {
e9174d1e
SL
577 o_lt.map(|lt| fld.fold_lifetime(lt))
578}
579
b039eaaf
SL
580pub fn noop_fold_generics<T: Folder>(Generics { ty_params, lifetimes, where_clause }: Generics,
581 fld: &mut T)
582 -> Generics {
e9174d1e
SL
583 Generics {
584 ty_params: fld.fold_ty_params(ty_params),
585 lifetimes: fld.fold_lifetime_defs(lifetimes),
586 where_clause: fld.fold_where_clause(where_clause),
587 }
588}
589
b039eaaf
SL
590pub fn noop_fold_where_clause<T: Folder>(WhereClause { id, predicates }: WhereClause,
591 fld: &mut T)
592 -> WhereClause {
e9174d1e
SL
593 WhereClause {
594 id: fld.new_id(id),
b039eaaf 595 predicates: predicates.move_map(|predicate| fld.fold_where_predicate(predicate)),
e9174d1e
SL
596 }
597}
598
b039eaaf 599pub fn noop_fold_where_predicate<T: Folder>(pred: WherePredicate, fld: &mut T) -> WherePredicate {
e9174d1e
SL
600 match pred {
601 hir::WherePredicate::BoundPredicate(hir::WhereBoundPredicate{bound_lifetimes,
602 bounded_ty,
603 bounds,
604 span}) => {
605 hir::WherePredicate::BoundPredicate(hir::WhereBoundPredicate {
606 bound_lifetimes: fld.fold_lifetime_defs(bound_lifetimes),
607 bounded_ty: fld.fold_ty(bounded_ty),
608 bounds: bounds.move_map(|x| fld.fold_ty_param_bound(x)),
b039eaaf 609 span: fld.new_span(span),
e9174d1e
SL
610 })
611 }
612 hir::WherePredicate::RegionPredicate(hir::WhereRegionPredicate{lifetime,
613 bounds,
614 span}) => {
615 hir::WherePredicate::RegionPredicate(hir::WhereRegionPredicate {
616 span: fld.new_span(span),
617 lifetime: fld.fold_lifetime(lifetime),
b039eaaf 618 bounds: bounds.move_map(|bound| fld.fold_lifetime(bound)),
e9174d1e
SL
619 })
620 }
621 hir::WherePredicate::EqPredicate(hir::WhereEqPredicate{id,
622 path,
623 ty,
624 span}) => {
b039eaaf 625 hir::WherePredicate::EqPredicate(hir::WhereEqPredicate {
e9174d1e
SL
626 id: fld.new_id(id),
627 path: fld.fold_path(path),
b039eaaf
SL
628 ty: fld.fold_ty(ty),
629 span: fld.new_span(span),
e9174d1e
SL
630 })
631 }
632 }
633}
634
b039eaaf
SL
635pub fn noop_fold_variant_data<T: Folder>(vdata: VariantData, fld: &mut T) -> VariantData {
636 match vdata {
637 VariantData::Struct(fields, id) => {
92a42be0
SL
638 VariantData::Struct(fields.move_map(|f| fld.fold_struct_field(f)),
639 fld.new_id(id))
b039eaaf
SL
640 }
641 VariantData::Tuple(fields, id) => {
92a42be0
SL
642 VariantData::Tuple(fields.move_map(|f| fld.fold_struct_field(f)),
643 fld.new_id(id))
b039eaaf 644 }
92a42be0 645 VariantData::Unit(id) => VariantData::Unit(fld.new_id(id)),
b039eaaf 646 }
e9174d1e
SL
647}
648
649pub fn noop_fold_trait_ref<T: Folder>(p: TraitRef, fld: &mut T) -> TraitRef {
650 let id = fld.new_id(p.ref_id);
651 let TraitRef {
652 path,
653 ref_id: _,
654 } = p;
655 hir::TraitRef {
656 path: fld.fold_path(path),
657 ref_id: id,
658 }
659}
660
661pub fn noop_fold_poly_trait_ref<T: Folder>(p: PolyTraitRef, fld: &mut T) -> PolyTraitRef {
662 hir::PolyTraitRef {
663 bound_lifetimes: fld.fold_lifetime_defs(p.bound_lifetimes),
664 trait_ref: fld.fold_trait_ref(p.trait_ref),
665 span: fld.new_span(p.span),
666 }
667}
668
669pub fn noop_fold_struct_field<T: Folder>(f: StructField, fld: &mut T) -> StructField {
54a0048b
SL
670 StructField {
671 span: fld.new_span(f.span),
672 id: fld.new_id(f.id),
673 name: f.name,
674 vis: f.vis,
675 ty: fld.fold_ty(f.ty),
676 attrs: fold_attrs(f.attrs, fld),
e9174d1e
SL
677 }
678}
679
b039eaaf 680pub fn noop_fold_field<T: Folder>(Field { name, expr, span }: Field, folder: &mut T) -> Field {
e9174d1e 681 Field {
92a42be0 682 name: respan(folder.new_span(name.span), folder.fold_name(name.node)),
e9174d1e 683 expr: folder.fold_expr(expr),
b039eaaf 684 span: folder.new_span(span),
e9174d1e
SL
685 }
686}
687
b039eaaf 688pub fn noop_fold_mt<T: Folder>(MutTy { ty, mutbl }: MutTy, folder: &mut T) -> MutTy {
e9174d1e
SL
689 MutTy {
690 ty: folder.fold_ty(ty),
691 mutbl: mutbl,
692 }
693}
694
9cc50fc6 695pub fn noop_fold_opt_bounds<T: Folder>(b: Option<TyParamBounds>,
b039eaaf 696 folder: &mut T)
9cc50fc6 697 -> Option<TyParamBounds> {
e9174d1e
SL
698 b.map(|bounds| folder.fold_bounds(bounds))
699}
700
b039eaaf 701fn noop_fold_bounds<T: Folder>(bounds: TyParamBounds, folder: &mut T) -> TyParamBounds {
e9174d1e
SL
702 bounds.move_map(|bound| folder.fold_ty_param_bound(bound))
703}
704
e9174d1e 705pub fn noop_fold_block<T: Folder>(b: P<Block>, folder: &mut T) -> P<Block> {
b039eaaf
SL
706 b.map(|Block { id, stmts, expr, rules, span }| {
707 Block {
708 id: folder.new_id(id),
92a42be0 709 stmts: stmts.move_map(|s| folder.fold_stmt(s)),
b039eaaf
SL
710 expr: expr.map(|x| folder.fold_expr(x)),
711 rules: rules,
712 span: folder.new_span(span),
713 }
e9174d1e
SL
714 })
715}
716
717pub fn noop_fold_item_underscore<T: Folder>(i: Item_, folder: &mut T) -> Item_ {
718 match i {
719 ItemExternCrate(string) => ItemExternCrate(string),
720 ItemUse(view_path) => {
721 ItemUse(folder.fold_view_path(view_path))
722 }
723 ItemStatic(t, m, e) => {
724 ItemStatic(folder.fold_ty(t), m, folder.fold_expr(e))
725 }
726 ItemConst(t, e) => {
727 ItemConst(folder.fold_ty(t), folder.fold_expr(e))
728 }
729 ItemFn(decl, unsafety, constness, abi, generics, body) => {
b039eaaf
SL
730 ItemFn(folder.fold_fn_decl(decl),
731 unsafety,
732 constness,
733 abi,
734 folder.fold_generics(generics),
735 folder.fold_block(body))
e9174d1e
SL
736 }
737 ItemMod(m) => ItemMod(folder.fold_mod(m)),
738 ItemForeignMod(nm) => ItemForeignMod(folder.fold_foreign_mod(nm)),
739 ItemTy(t, generics) => {
740 ItemTy(folder.fold_ty(t), folder.fold_generics(generics))
741 }
742 ItemEnum(enum_definition, generics) => {
b039eaaf
SL
743 ItemEnum(hir::EnumDef {
744 variants: enum_definition.variants.move_map(|x| folder.fold_variant(x)),
745 },
746 folder.fold_generics(generics))
e9174d1e
SL
747 }
748 ItemStruct(struct_def, generics) => {
b039eaaf 749 let struct_def = folder.fold_variant_data(struct_def);
e9174d1e
SL
750 ItemStruct(struct_def, folder.fold_generics(generics))
751 }
752 ItemDefaultImpl(unsafety, ref trait_ref) => {
92a42be0 753 ItemDefaultImpl(unsafety, folder.fold_trait_ref((*trait_ref).clone()))
e9174d1e
SL
754 }
755 ItemImpl(unsafety, polarity, generics, ifce, ty, impl_items) => {
92a42be0
SL
756 let new_impl_items = impl_items
757 .move_map(|item| folder.fold_impl_item(item));
e9174d1e
SL
758 let ifce = match ifce {
759 None => None,
760 Some(ref trait_ref) => {
761 Some(folder.fold_trait_ref((*trait_ref).clone()))
762 }
763 };
764 ItemImpl(unsafety,
765 polarity,
766 folder.fold_generics(generics),
767 ifce,
768 folder.fold_ty(ty),
769 new_impl_items)
770 }
771 ItemTrait(unsafety, generics, bounds, items) => {
772 let bounds = folder.fold_bounds(bounds);
92a42be0 773 let items = items.move_map(|item| folder.fold_trait_item(item));
b039eaaf 774 ItemTrait(unsafety, folder.fold_generics(generics), bounds, items)
e9174d1e
SL
775 }
776 }
777}
778
92a42be0 779pub fn noop_fold_trait_item<T: Folder>(i: TraitItem,
b039eaaf 780 folder: &mut T)
92a42be0
SL
781 -> TraitItem {
782 TraitItem {
783 id: folder.new_id(i.id),
784 name: folder.fold_name(i.name),
785 attrs: fold_attrs(i.attrs, folder),
786 node: match i.node {
787 ConstTraitItem(ty, default) => {
788 ConstTraitItem(folder.fold_ty(ty), default.map(|x| folder.fold_expr(x)))
789 }
790 MethodTraitItem(sig, body) => {
791 MethodTraitItem(noop_fold_method_sig(sig, folder),
792 body.map(|x| folder.fold_block(x)))
793 }
794 TypeTraitItem(bounds, default) => {
795 TypeTraitItem(folder.fold_bounds(bounds),
796 default.map(|x| folder.fold_ty(x)))
797 }
798 },
799 span: folder.new_span(i.span),
800 }
e9174d1e
SL
801}
802
92a42be0
SL
803pub fn noop_fold_impl_item<T: Folder>(i: ImplItem, folder: &mut T) -> ImplItem {
804 ImplItem {
805 id: folder.new_id(i.id),
806 name: folder.fold_name(i.name),
807 attrs: fold_attrs(i.attrs, folder),
808 vis: i.vis,
54a0048b 809 defaultness: i.defaultness,
92a42be0
SL
810 node: match i.node {
811 ImplItemKind::Const(ty, expr) => {
812 ImplItemKind::Const(folder.fold_ty(ty), folder.fold_expr(expr))
813 }
814 ImplItemKind::Method(sig, body) => {
815 ImplItemKind::Method(noop_fold_method_sig(sig, folder), folder.fold_block(body))
816 }
817 ImplItemKind::Type(ty) => ImplItemKind::Type(folder.fold_ty(ty)),
818 },
819 span: folder.new_span(i.span),
820 }
e9174d1e
SL
821}
822
92a42be0 823pub fn noop_fold_mod<T: Folder>(Mod { inner, item_ids }: Mod, folder: &mut T) -> Mod {
e9174d1e
SL
824 Mod {
825 inner: folder.new_span(inner),
92a42be0 826 item_ids: item_ids.move_map(|x| folder.fold_item_id(x)),
e9174d1e
SL
827 }
828}
829
92a42be0
SL
830pub fn noop_fold_crate<T: Folder>(Crate { module, attrs, config, span,
831 exported_macros, items }: Crate,
b039eaaf
SL
832 folder: &mut T)
833 -> Crate {
e9174d1e
SL
834 let config = folder.fold_meta_items(config);
835
92a42be0 836 let crate_mod = folder.fold_item(hir::Item {
a7813a04 837 name: keywords::Invalid.name(),
92a42be0
SL
838 attrs: attrs,
839 id: DUMMY_NODE_ID,
840 vis: hir::Public,
841 span: span,
842 node: hir::ItemMod(module),
843 });
844
845 let (module, attrs, span) = match crate_mod {
846 hir::Item { attrs, span, node, .. } => {
847 match node {
848 hir::ItemMod(m) => (m, attrs, span),
849 _ => panic!("fold converted a module to not a module"),
850 }
e9174d1e 851 }
e9174d1e
SL
852 };
853
92a42be0
SL
854 let items = items.into_iter()
855 .map(|(id, item)| (id, folder.fold_item(item)))
856 .collect();
857
e9174d1e
SL
858 Crate {
859 module: module,
860 attrs: attrs,
861 config: config,
862 span: span,
863 exported_macros: exported_macros,
92a42be0 864 items: items,
e9174d1e
SL
865 }
866}
867
92a42be0
SL
868pub fn noop_fold_item_id<T: Folder>(i: ItemId, folder: &mut T) -> ItemId {
869 let id = folder.map_id(i.id);
870 ItemId { id: id }
e9174d1e
SL
871}
872
92a42be0
SL
873// fold one item into one item
874pub fn noop_fold_item<T: Folder>(item: Item, folder: &mut T) -> Item {
875 let Item { id, name, attrs, node, vis, span } = item;
e9174d1e
SL
876 let id = folder.new_id(id);
877 let node = folder.fold_item_underscore(node);
e9174d1e
SL
878
879 Item {
880 id: id,
b039eaaf 881 name: folder.fold_name(name),
e9174d1e
SL
882 attrs: fold_attrs(attrs, folder),
883 node: node,
884 vis: vis,
b039eaaf 885 span: folder.new_span(span),
e9174d1e
SL
886 }
887}
888
92a42be0
SL
889pub fn noop_fold_foreign_item<T: Folder>(ni: ForeignItem, folder: &mut T) -> ForeignItem {
890 ForeignItem {
891 id: folder.new_id(ni.id),
892 name: folder.fold_name(ni.name),
893 attrs: fold_attrs(ni.attrs, folder),
894 node: match ni.node {
895 ForeignItemFn(fdec, generics) => {
896 ForeignItemFn(folder.fold_fn_decl(fdec), folder.fold_generics(generics))
897 }
898 ForeignItemStatic(t, m) => {
899 ForeignItemStatic(folder.fold_ty(t), m)
900 }
901 },
902 vis: ni.vis,
903 span: folder.new_span(ni.span),
904 }
e9174d1e
SL
905}
906
907pub fn noop_fold_method_sig<T: Folder>(sig: MethodSig, folder: &mut T) -> MethodSig {
908 MethodSig {
909 generics: folder.fold_generics(sig.generics),
910 abi: sig.abi,
e9174d1e
SL
911 unsafety: sig.unsafety,
912 constness: sig.constness,
b039eaaf 913 decl: folder.fold_fn_decl(sig.decl),
e9174d1e
SL
914 }
915}
916
917pub fn noop_fold_pat<T: Folder>(p: P<Pat>, folder: &mut T) -> P<Pat> {
b039eaaf
SL
918 p.map(|Pat { id, node, span }| {
919 Pat {
920 id: folder.new_id(id),
921 node: match node {
7453a54e 922 PatKind::Wild => PatKind::Wild,
3157f602
XL
923 PatKind::Binding(binding_mode, pth1, sub) => {
924 PatKind::Binding(binding_mode,
b039eaaf
SL
925 Spanned {
926 span: folder.new_span(pth1.span),
a7813a04 927 node: folder.fold_name(pth1.node),
b039eaaf
SL
928 },
929 sub.map(|x| folder.fold_pat(x)))
930 }
7453a54e 931 PatKind::Lit(e) => PatKind::Lit(folder.fold_expr(e)),
3157f602 932 PatKind::TupleStruct(pth, pats, ddpos) => {
7453a54e 933 PatKind::TupleStruct(folder.fold_path(pth),
3157f602 934 pats.move_map(|x| folder.fold_pat(x)), ddpos)
b039eaaf 935 }
5bcae85e
SL
936 PatKind::Path(opt_qself, pth) => {
937 let opt_qself = opt_qself.map(|qself| {
938 QSelf { ty: folder.fold_ty(qself.ty), position: qself.position }
939 });
940 PatKind::Path(opt_qself, folder.fold_path(pth))
b039eaaf 941 }
7453a54e 942 PatKind::Struct(pth, fields, etc) => {
b039eaaf
SL
943 let pth = folder.fold_path(pth);
944 let fs = fields.move_map(|f| {
945 Spanned {
946 span: folder.new_span(f.span),
947 node: hir::FieldPat {
948 name: f.node.name,
949 pat: folder.fold_pat(f.node.pat),
950 is_shorthand: f.node.is_shorthand,
951 },
952 }
953 });
7453a54e 954 PatKind::Struct(pth, fs, etc)
b039eaaf 955 }
3157f602
XL
956 PatKind::Tuple(elts, ddpos) => {
957 PatKind::Tuple(elts.move_map(|x| folder.fold_pat(x)), ddpos)
958 }
7453a54e
SL
959 PatKind::Box(inner) => PatKind::Box(folder.fold_pat(inner)),
960 PatKind::Ref(inner, mutbl) => PatKind::Ref(folder.fold_pat(inner), mutbl),
961 PatKind::Range(e1, e2) => {
962 PatKind::Range(folder.fold_expr(e1), folder.fold_expr(e2))
b039eaaf 963 }
7453a54e
SL
964 PatKind::Vec(before, slice, after) => {
965 PatKind::Vec(before.move_map(|x| folder.fold_pat(x)),
b039eaaf
SL
966 slice.map(|x| folder.fold_pat(x)),
967 after.move_map(|x| folder.fold_pat(x)))
968 }
e9174d1e 969 },
b039eaaf
SL
970 span: folder.new_span(span),
971 }
e9174d1e
SL
972 })
973}
974
92a42be0 975pub fn noop_fold_expr<T: Folder>(Expr { id, node, span, attrs }: Expr, folder: &mut T) -> Expr {
e9174d1e
SL
976 Expr {
977 id: folder.new_id(id),
978 node: match node {
b039eaaf
SL
979 ExprBox(e) => {
980 ExprBox(folder.fold_expr(e))
e9174d1e
SL
981 }
982 ExprVec(exprs) => {
983 ExprVec(exprs.move_map(|x| folder.fold_expr(x)))
984 }
985 ExprRepeat(expr, count) => {
986 ExprRepeat(folder.fold_expr(expr), folder.fold_expr(count))
987 }
988 ExprTup(elts) => ExprTup(elts.move_map(|x| folder.fold_expr(x))),
989 ExprCall(f, args) => {
92a42be0 990 ExprCall(folder.fold_expr(f), args.move_map(|x| folder.fold_expr(x)))
e9174d1e 991 }
b039eaaf 992 ExprMethodCall(name, tps, args) => {
92a42be0 993 ExprMethodCall(respan(folder.new_span(name.span), folder.fold_name(name.node)),
b039eaaf
SL
994 tps.move_map(|x| folder.fold_ty(x)),
995 args.move_map(|x| folder.fold_expr(x)))
e9174d1e
SL
996 }
997 ExprBinary(binop, lhs, rhs) => {
b039eaaf 998 ExprBinary(binop, folder.fold_expr(lhs), folder.fold_expr(rhs))
e9174d1e
SL
999 }
1000 ExprUnary(binop, ohs) => {
1001 ExprUnary(binop, folder.fold_expr(ohs))
1002 }
1003 ExprLit(l) => ExprLit(l),
1004 ExprCast(expr, ty) => {
1005 ExprCast(folder.fold_expr(expr), folder.fold_ty(ty))
1006 }
9cc50fc6
SL
1007 ExprType(expr, ty) => {
1008 ExprType(folder.fold_expr(expr), folder.fold_ty(ty))
1009 }
e9174d1e
SL
1010 ExprAddrOf(m, ohs) => ExprAddrOf(m, folder.fold_expr(ohs)),
1011 ExprIf(cond, tr, fl) => {
1012 ExprIf(folder.fold_expr(cond),
1013 folder.fold_block(tr),
1014 fl.map(|x| folder.fold_expr(x)))
1015 }
a7813a04 1016 ExprWhile(cond, body, opt_name) => {
e9174d1e
SL
1017 ExprWhile(folder.fold_expr(cond),
1018 folder.fold_block(body),
3157f602
XL
1019 opt_name.map(|label| {
1020 respan(folder.new_span(label.span), folder.fold_name(label.node))
1021 }))
e9174d1e 1022 }
a7813a04 1023 ExprLoop(body, opt_name) => {
e9174d1e 1024 ExprLoop(folder.fold_block(body),
3157f602
XL
1025 opt_name.map(|label| {
1026 respan(folder.new_span(label.span), folder.fold_name(label.node))
1027 }))
e9174d1e
SL
1028 }
1029 ExprMatch(expr, arms, source) => {
1030 ExprMatch(folder.fold_expr(expr),
b039eaaf
SL
1031 arms.move_map(|x| folder.fold_arm(x)),
1032 source)
e9174d1e 1033 }
a7813a04 1034 ExprClosure(capture_clause, decl, body, fn_decl_span) => {
e9174d1e
SL
1035 ExprClosure(capture_clause,
1036 folder.fold_fn_decl(decl),
a7813a04
XL
1037 folder.fold_block(body),
1038 folder.new_span(fn_decl_span))
e9174d1e
SL
1039 }
1040 ExprBlock(blk) => ExprBlock(folder.fold_block(blk)),
1041 ExprAssign(el, er) => {
1042 ExprAssign(folder.fold_expr(el), folder.fold_expr(er))
1043 }
1044 ExprAssignOp(op, el, er) => {
b039eaaf 1045 ExprAssignOp(op, folder.fold_expr(el), folder.fold_expr(er))
e9174d1e 1046 }
b039eaaf 1047 ExprField(el, name) => {
e9174d1e 1048 ExprField(folder.fold_expr(el),
92a42be0 1049 respan(folder.new_span(name.span), folder.fold_name(name.node)))
e9174d1e 1050 }
b039eaaf 1051 ExprTupField(el, index) => {
e9174d1e 1052 ExprTupField(folder.fold_expr(el),
92a42be0 1053 respan(folder.new_span(index.span), folder.fold_usize(index.node)))
e9174d1e
SL
1054 }
1055 ExprIndex(el, er) => {
1056 ExprIndex(folder.fold_expr(el), folder.fold_expr(er))
1057 }
e9174d1e
SL
1058 ExprPath(qself, path) => {
1059 let qself = qself.map(|QSelf { ty, position }| {
1060 QSelf {
1061 ty: folder.fold_ty(ty),
b039eaaf 1062 position: position,
e9174d1e
SL
1063 }
1064 });
1065 ExprPath(qself, folder.fold_path(path))
1066 }
a7813a04
XL
1067 ExprBreak(opt_name) => ExprBreak(opt_name.map(|label| {
1068 respan(folder.new_span(label.span), folder.fold_name(label.node))
b039eaaf 1069 })),
a7813a04
XL
1070 ExprAgain(opt_name) => ExprAgain(opt_name.map(|label| {
1071 respan(folder.new_span(label.span), folder.fold_name(label.node))
b039eaaf 1072 })),
e9174d1e 1073 ExprRet(e) => ExprRet(e.map(|x| folder.fold_expr(x))),
54a0048b
SL
1074 ExprInlineAsm(asm, outputs, inputs) => {
1075 ExprInlineAsm(asm,
1076 outputs.move_map(|x| folder.fold_expr(x)),
1077 inputs.move_map(|x| folder.fold_expr(x)))
1078 }
e9174d1e
SL
1079 ExprStruct(path, fields, maybe_expr) => {
1080 ExprStruct(folder.fold_path(path),
b039eaaf
SL
1081 fields.move_map(|x| folder.fold_field(x)),
1082 maybe_expr.map(|x| folder.fold_expr(x)))
1083 }
e9174d1e 1084 },
b039eaaf 1085 span: folder.new_span(span),
3157f602 1086 attrs: fold_attrs(attrs, folder),
e9174d1e
SL
1087 }
1088}
1089
92a42be0
SL
1090pub fn noop_fold_stmt<T: Folder>(stmt: Stmt, folder: &mut T) -> Stmt {
1091 let span = folder.new_span(stmt.span);
1092 match stmt.node {
e9174d1e
SL
1093 StmtDecl(d, id) => {
1094 let id = folder.new_id(id);
92a42be0
SL
1095 Spanned {
1096 node: StmtDecl(folder.fold_decl(d), id),
1097 span: span
1098 }
e9174d1e
SL
1099 }
1100 StmtExpr(e, id) => {
1101 let id = folder.new_id(id);
92a42be0 1102 Spanned {
e9174d1e 1103 node: StmtExpr(folder.fold_expr(e), id),
b039eaaf 1104 span: span,
92a42be0 1105 }
e9174d1e
SL
1106 }
1107 StmtSemi(e, id) => {
1108 let id = folder.new_id(id);
92a42be0 1109 Spanned {
e9174d1e 1110 node: StmtSemi(folder.fold_expr(e), id),
b039eaaf 1111 span: span,
92a42be0 1112 }
e9174d1e
SL
1113 }
1114 }
1115}