Skip to content

Commit 3038968

Browse files
committed
rustc: Perform some AST surgery to separate out class fields from methods
1 parent 353c632 commit 3038968

File tree

18 files changed

+301
-308
lines changed

18 files changed

+301
-308
lines changed

src/libsyntax/ast.rs

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -717,10 +717,27 @@ type trait_ref = {path: @path, ref_id: node_id, impl_id: node_id};
717717
#[auto_serialize]
718718
enum visibility { public, private, inherited }
719719

720+
#[auto_serialize]
721+
type struct_field_ = {
722+
kind: struct_field_kind,
723+
id: node_id,
724+
ty: @ty
725+
};
726+
727+
#[auto_serialize]
728+
type struct_field = spanned<struct_field_>;
729+
730+
#[auto_serialize]
731+
enum struct_field_kind {
732+
named_field(ident, class_mutability, visibility),
733+
unnamed_field // element of a tuple-like struct
734+
}
735+
720736
#[auto_serialize]
721737
type struct_def = {
722-
traits: ~[@trait_ref], /* traits this class implements */
723-
members: ~[@class_member], /* methods, etc. */
738+
traits: ~[@trait_ref], /* traits this struct implements */
739+
fields: ~[@struct_field], /* fields */
740+
methods: ~[@method], /* methods */
724741
/* (not including ctor or dtor) */
725742
/* ctor is optional, and will soon go away */
726743
ctor: option<class_ctor>,
@@ -750,15 +767,6 @@ enum item_ {
750767
item_mac(mac),
751768
}
752769

753-
#[auto_serialize]
754-
type class_member = spanned<class_member_>;
755-
756-
#[auto_serialize]
757-
enum class_member_ {
758-
instance_var(ident, @ty, class_mutability, node_id, visibility),
759-
class_method(@method)
760-
}
761-
762770
#[auto_serialize]
763771
enum class_mutability { class_mutable, class_immutable }
764772

src/libsyntax/ast_map.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,6 @@ fn map_item(i: @item, cx: ctx, v: vt) {
248248

249249
fn map_struct_def(struct_def: @ast::struct_def, parent_node: ast_node,
250250
ident: ast::ident, id: ast::node_id, cx: ctx, _v: vt) {
251-
let (_, ms) = ast_util::split_class_items(struct_def.members);
252251
// Map trait refs to their parent classes. This is
253252
// so we can find the self_ty
254253
for struct_def.traits.each |p| {
@@ -260,7 +259,7 @@ fn map_struct_def(struct_def: @ast::struct_def, parent_node: ast_node,
260259
let d_id = ast_util::local_def(id);
261260
let p = extend(cx, ident);
262261
// only need to handle methods
263-
do vec::iter(ms) |m| { map_method(d_id, p, m, cx); }
262+
do vec::iter(struct_def.methods) |m| { map_method(d_id, p, m, cx); }
264263
}
265264

266265
fn map_view_item(vi: @view_item, cx: ctx, _v: vt) {

src/libsyntax/ast_util.rs

Lines changed: 10 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -295,16 +295,6 @@ pure fn unguarded_pat(a: arm) -> option<~[@pat]> {
295295
if is_unguarded(a) { some(/* FIXME (#2543) */ copy a.pats) } else { none }
296296
}
297297

298-
pure fn class_item_ident(ci: @class_member) -> ident {
299-
match ci.node {
300-
instance_var(i,_,_,_,_) => /* FIXME (#2543) */ copy i,
301-
class_method(it) => /* FIXME (#2543) */ copy it.ident
302-
}
303-
}
304-
305-
type ivar = {ident: ident, ty: @ty, cm: class_mutability,
306-
id: node_id, vis: visibility};
307-
308298
fn public_methods(ms: ~[@method]) -> ~[@method] {
309299
vec::filter(ms,
310300
|m| match m.vis {
@@ -313,23 +303,6 @@ fn public_methods(ms: ~[@method]) -> ~[@method] {
313303
})
314304
}
315305

316-
fn split_class_items(cs: ~[@class_member]) -> (~[ivar], ~[@method]) {
317-
let mut vs = ~[], ms = ~[];
318-
for cs.each |c| {
319-
match c.node {
320-
instance_var(i, t, cm, id, vis) => {
321-
vec::push(vs, {ident: /* FIXME (#2543) */ copy i,
322-
ty: t,
323-
cm: cm,
324-
id: id,
325-
vis: vis});
326-
}
327-
class_method(m) => vec::push(ms, m)
328-
}
329-
};
330-
(vs, ms)
331-
}
332-
333306
// extract a ty_method from a trait_method. if the trait_method is
334307
// a default, pull out the useful fields to make a ty_method
335308
fn trait_method_to_ty_method(method: trait_method) -> ty_method {
@@ -355,11 +328,11 @@ fn split_trait_methods(trait_methods: ~[trait_method])
355328
(reqd, provd)
356329
}
357330

358-
pure fn class_member_visibility(ci: @class_member) -> visibility {
359-
match ci.node {
360-
instance_var(_, _, _, _, vis) => vis,
361-
class_method(m) => m.vis
362-
}
331+
pure fn struct_field_visibility(field: ast::struct_field) -> visibility {
332+
match field.node.kind {
333+
ast::named_field(_, _, visibility) => visibility,
334+
ast::unnamed_field => ast::public
335+
}
363336
}
364337

365338
trait inlined_item_utils {
@@ -570,11 +543,11 @@ fn id_visitor(vfn: fn@(node_id)) -> visit::vt<()> {
570543
_id: node_id) {
571544
},
572545

573-
visit_class_item: fn@(c: @class_member) {
574-
match c.node {
575-
instance_var(_, _, _, id,_) => vfn(id),
576-
class_method(_) => ()
577-
}
546+
visit_struct_field: fn@(f: @struct_field) {
547+
vfn(f.node.id);
548+
},
549+
550+
visit_struct_method: fn@(_m: @method) {
578551
}
579552
})
580553
}

src/libsyntax/fold.rs

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ trait ast_fold {
2424
fn fold_view_item(&&@view_item) -> @view_item;
2525
fn fold_foreign_item(&&@foreign_item) -> @foreign_item;
2626
fn fold_item(&&@item) -> option<@item>;
27-
fn fold_class_item(&&@class_member) -> @class_member;
27+
fn fold_struct_field(&&@struct_field) -> @struct_field;
2828
fn fold_item_underscore(item_) -> item_;
2929
fn fold_method(&&@method) -> @method;
3030
fn fold_block(blk) -> blk;
@@ -55,7 +55,7 @@ type ast_fold_precursor = @{
5555
fold_view_item: fn@(view_item_, ast_fold) -> view_item_,
5656
fold_foreign_item: fn@(&&@foreign_item, ast_fold) -> @foreign_item,
5757
fold_item: fn@(&&@item, ast_fold) -> option<@item>,
58-
fold_class_item: fn@(&&@class_member, ast_fold) -> @class_member,
58+
fold_struct_field: fn@(&&@struct_field, ast_fold) -> @struct_field,
5959
fold_item_underscore: fn@(item_, ast_fold) -> item_,
6060
fold_method: fn@(&&@method, ast_fold) -> @method,
6161
fold_block: fn@(blk_, span, ast_fold) -> (blk_, span),
@@ -214,16 +214,12 @@ fn noop_fold_item(&&i: @item, fld: ast_fold) -> option<@item> {
214214
span: fld.new_span(i.span)});
215215
}
216216

217-
fn noop_fold_class_item(&&ci: @class_member, fld: ast_fold)
218-
-> @class_member {
219-
@{node: match ci.node {
220-
instance_var(ident, t, cm, id, p) => {
221-
instance_var(/* FIXME (#2543) */ copy ident,
222-
fld.fold_ty(t), cm, id, p)
223-
}
224-
class_method(m) => class_method(fld.fold_method(m))
225-
},
226-
span: ci.span}
217+
fn noop_fold_struct_field(&&sf: @struct_field, fld: ast_fold)
218+
-> @struct_field {
219+
@{node: {kind: copy sf.node.kind,
220+
id: sf.node.id,
221+
ty: fld.fold_ty(sf.node.ty)},
222+
span: sf.span}
227223
}
228224

229225
fn noop_fold_item_underscore(i: item_, fld: ast_fold) -> item_ {
@@ -295,7 +291,8 @@ fn fold_struct_def(struct_def: @ast::struct_def, fld: ast_fold)
295291
with dtor}};
296292
return @{
297293
traits: vec::map(struct_def.traits, |p| fold_trait_ref(p, fld)),
298-
members: vec::map(struct_def.members, |x| fld.fold_class_item(x)),
294+
fields: vec::map(struct_def.fields, |f| fold_struct_field(f, fld)),
295+
methods: vec::map(struct_def.methods, |m| fld.fold_method(m)),
299296
ctor: resulting_optional_constructor,
300297
dtor: dtor
301298
};
@@ -306,6 +303,13 @@ fn fold_trait_ref(&&p: @trait_ref, fld: ast_fold) -> @trait_ref {
306303
impl_id: fld.new_id(p.impl_id)}
307304
}
308305

306+
fn fold_struct_field(&&f: @struct_field, fld: ast_fold) -> @struct_field {
307+
@{node: {kind: copy f.node.kind,
308+
id: fld.new_id(f.node.id),
309+
ty: fld.fold_ty(f.node.ty)},
310+
span: fld.new_span(f.span)}
311+
}
312+
309313
fn noop_fold_method(&&m: @method, fld: ast_fold) -> @method {
310314
return @{ident: fld.fold_ident(m.ident),
311315
attrs: /* FIXME (#2543) */ copy m.attrs,
@@ -570,8 +574,9 @@ fn noop_fold_variant(v: variant_, fld: ast_fold) -> variant_ {
570574
with dtor}};
571575
kind = struct_variant_kind(@{
572576
traits: ~[],
573-
members: vec::map(struct_def.members,
574-
|x| fld.fold_class_item(x)),
577+
fields: vec::map(struct_def.fields,
578+
|f| fld.fold_struct_field(f)),
579+
methods: vec::map(struct_def.methods, |m| fld.fold_method(m)),
575580
ctor: none,
576581
dtor: dtor
577582
})
@@ -644,7 +649,7 @@ fn default_ast_fold() -> ast_fold_precursor {
644649
fold_view_item: noop_fold_view_item,
645650
fold_foreign_item: noop_fold_foreign_item,
646651
fold_item: noop_fold_item,
647-
fold_class_item: noop_fold_class_item,
652+
fold_struct_field: noop_fold_struct_field,
648653
fold_item_underscore: noop_fold_item_underscore,
649654
fold_method: noop_fold_method,
650655
fold_block: wrap(noop_fold_block),
@@ -692,16 +697,11 @@ impl ast_fold_precursor: ast_fold {
692697
fn fold_item(&&i: @item) -> option<@item> {
693698
return self.fold_item(i, self as ast_fold);
694699
}
695-
fn fold_class_item(&&ci: @class_member) -> @class_member {
696-
@{node: match ci.node {
697-
instance_var(nm, t, mt, id, p) => {
698-
instance_var(/* FIXME (#2543) */ copy nm,
699-
(self as ast_fold).fold_ty(t), mt, id, p)
700-
}
701-
class_method(m) => {
702-
class_method(self.fold_method(m, self as ast_fold))
703-
}
704-
}, span: self.new_span(ci.span)}
700+
fn fold_struct_field(&&sf: @struct_field) -> @struct_field {
701+
@{node: {kind: copy sf.node.kind,
702+
id: sf.node.id,
703+
ty: (self as ast_fold).fold_ty(sf.node.ty)},
704+
span: self.new_span(sf.span)}
705705
}
706706
fn fold_item_underscore(i: item_) ->
707707
item_ {

0 commit comments

Comments
 (0)