diff options
| author | Patrick Walton <pcwalton@mimiga.net> | 2012-07-24 15:29:14 -0700 |
|---|---|---|
| committer | Patrick Walton <pcwalton@mimiga.net> | 2012-07-24 15:29:51 -0700 |
| commit | 587b0edbbf6c3ac587be98679c4262049aa2a305 (patch) | |
| tree | 879bb3bdc266ecc210929950e781c4e9c2d07803 /src/libsyntax | |
| parent | 695ab098995d23b0fa62248b5ce3052e5e072269 (diff) | |
| download | rust-587b0edbbf6c3ac587be98679c4262049aa2a305.tar.gz rust-587b0edbbf6c3ac587be98679c4262049aa2a305.zip | |
rustc: Don't require that structs have constructors
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/ast.rs | 3 | ||||
| -rw-r--r-- | src/libsyntax/fold.rs | 28 | ||||
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 8 | ||||
| -rw-r--r-- | src/libsyntax/print/pprust.rs | 24 | ||||
| -rw-r--r-- | src/libsyntax/visit.rs | 13 |
5 files changed, 48 insertions, 28 deletions
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs index 761bfd906ad..fb27724e369 100644 --- a/src/libsyntax/ast.rs +++ b/src/libsyntax/ast.rs @@ -636,7 +636,8 @@ enum item_ { ~[@trait_ref], /* traits this class implements */ ~[@class_member], /* methods, etc. */ /* (not including ctor or dtor) */ - class_ctor, + /* ctor is optional, and will soon go away */ + option<class_ctor>, /* dtor is optional */ option<class_dtor> ), diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs index b23d2acaccb..de9ed4b2570 100644 --- a/src/libsyntax/fold.rs +++ b/src/libsyntax/fold.rs @@ -242,10 +242,24 @@ fn noop_fold_item_underscore(i: item_, fld: ast_fold) -> item_ { item_enum(vec::map(variants, |x| fld.fold_variant(x)), fold_ty_params(typms, fld)) } - item_class(typms, traits, items, ctor, m_dtor) { - let ctor_body = fld.fold_block(ctor.node.body); - let ctor_decl = fold_fn_decl(ctor.node.dec, fld); - let ctor_id = fld.new_id(ctor.node.id); + item_class(typms, traits, items, m_ctor, m_dtor) { + let resulting_optional_constructor; + alt m_ctor { + none => { + resulting_optional_constructor = none; + } + some(constructor) => { + resulting_optional_constructor = some({ + node: { + body: fld.fold_block(constructor.node.body), + dec: fold_fn_decl(constructor.node.dec, fld), + id: fld.new_id(constructor.node.id) + with constructor.node + } + with constructor + }); + } + } let dtor = do option::map(m_dtor) |dtor| { let dtor_body = fld.fold_block(dtor.node.body); let dtor_id = fld.new_id(dtor.node.id); @@ -256,10 +270,8 @@ fn noop_fold_item_underscore(i: item_, fld: ast_fold) -> item_ { /* FIXME (#2543) */ copy typms, vec::map(traits, |p| fold_trait_ref(p, fld)), vec::map(items, |x| fld.fold_class_item(x)), - {node: {body: ctor_body, - dec: ctor_decl, - id: ctor_id with ctor.node} - with ctor}, dtor) + resulting_optional_constructor, + dtor) } item_impl(tps, ifce, ty, methods) { item_impl(fold_ty_params(tps, fld), diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index b9fb9dab374..0686bad2532 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -2205,20 +2205,22 @@ class parser { alt the_ctor { some((ct_d, ct_attrs, ct_b, ct_s)) { (class_name, - item_class(ty_params, traits, ms, { + item_class(ty_params, traits, ms, some({ node: {id: ctor_id, attrs: ct_attrs, self_id: self.get_id(), dec: ct_d, body: ct_b}, - span: ct_s}, actual_dtor), + span: ct_s}), actual_dtor), none) } /* Is it strange for the parser to check this? */ none { - self.fatal(~"class with no constructor"); + (class_name, + item_class(ty_params, traits, ms, none, actual_dtor), + none) } } } diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs index 8df555fc864..aacb725ec6c 100644 --- a/src/libsyntax/print/pprust.rs +++ b/src/libsyntax/print/pprust.rs @@ -488,7 +488,7 @@ fn print_item(s: ps, &&item: @ast::item) { bclose(s, item.span); } } - ast::item_class(tps, traits, items, ctor, m_dtor) { + ast::item_class(tps, traits, items, m_ctor, m_dtor) { head(s, ~"class"); word_nbsp(s, *item.ident); print_type_params(s, tps); @@ -499,16 +499,18 @@ fn print_item(s: ps, &&item: @ast::item) { } bopen(s); hardbreak_if_not_bol(s); - maybe_print_comment(s, ctor.span.lo); - print_outer_attributes(s, ctor.node.attrs); - /* Doesn't call head because there shouldn't be a space after new */ - cbox(s, indent_unit); - ibox(s, 4); - word(s.s, ~"new("); - print_fn_args(s, ctor.node.dec, ~[]); - word(s.s, ~")"); - space(s.s); - print_block(s, ctor.node.body); + do option::iter(m_ctor) |ctor| { + maybe_print_comment(s, ctor.span.lo); + print_outer_attributes(s, ctor.node.attrs); + // Doesn't call head because there shouldn't be a space after new. + cbox(s, indent_unit); + ibox(s, 4); + word(s.s, ~"new("); + print_fn_args(s, ctor.node.dec, ~[]); + word(s.s, ~")"); + space(s.s); + print_block(s, ctor.node.body); + } do option::iter(m_dtor) |dtor| { hardbreak_if_not_bol(s); maybe_print_comment(s, dtor.span.lo); diff --git a/src/libsyntax/visit.rs b/src/libsyntax/visit.rs index ad57ac28b2c..c7aed0ef90a 100644 --- a/src/libsyntax/visit.rs +++ b/src/libsyntax/visit.rs @@ -145,17 +145,20 @@ fn visit_item<E>(i: @item, e: E, v: vt<E>) { visit_method_helper(m, e, v) } } - item_class(tps, traits, members, ctor, m_dtor) { + item_class(tps, traits, members, m_ctor, m_dtor) { v.visit_ty_params(tps, e, v); for members.each |m| { v.visit_class_item(m, e, v); } for traits.each |p| { visit_path(p.path, e, v); } - visit_class_ctor_helper(ctor, i.ident, tps, - ast_util::local_def(i.id), e, v); + do option::iter(m_ctor) |ctor| { + visit_class_ctor_helper(ctor, i.ident, tps, + ast_util::local_def(i.id), e, v); + }; do option::iter(m_dtor) |dtor| { - visit_class_dtor_helper(dtor, tps, - ast_util::local_def(i.id), e, v)}; + visit_class_dtor_helper(dtor, tps, + ast_util::local_def(i.id), e, v) + }; } item_trait(tps, methods) { v.visit_ty_params(tps, e, v); |
