about summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2012-07-24 15:29:14 -0700
committerPatrick Walton <pcwalton@mimiga.net>2012-07-24 15:29:51 -0700
commit587b0edbbf6c3ac587be98679c4262049aa2a305 (patch)
tree879bb3bdc266ecc210929950e781c4e9c2d07803 /src/libsyntax
parent695ab098995d23b0fa62248b5ce3052e5e072269 (diff)
downloadrust-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.rs3
-rw-r--r--src/libsyntax/fold.rs28
-rw-r--r--src/libsyntax/parse/parser.rs8
-rw-r--r--src/libsyntax/print/pprust.rs24
-rw-r--r--src/libsyntax/visit.rs13
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);