about summary refs log tree commit diff
path: root/src/comp/front
diff options
context:
space:
mode:
authorGraydon Hoare <graydon@mozilla.com>2010-12-14 15:32:13 -0800
committerGraydon Hoare <graydon@mozilla.com>2010-12-14 15:32:13 -0800
commitb606ba81cf4f872e9aff4d4f8d23da6843ce0638 (patch)
tree7ae26247cdcdcf97866ce3f18da5c46f88a341db /src/comp/front
parent3f227c71b21c0a6962d8529b4ce8b725bde69a8c (diff)
downloadrust-b606ba81cf4f872e9aff4d4f8d23da6843ce0638.tar.gz
rust-b606ba81cf4f872e9aff4d4f8d23da6843ce0638.zip
Add obj items to AST and parser.
Diffstat (limited to 'src/comp/front')
-rw-r--r--src/comp/front/ast.rs11
-rw-r--r--src/comp/front/parser.rs109
2 files changed, 94 insertions, 26 deletions
diff --git a/src/comp/front/ast.rs b/src/comp/front/ast.rs
index eb41f8596ae..3b6ebd35f71 100644
--- a/src/comp/front/ast.rs
+++ b/src/comp/front/ast.rs
@@ -26,6 +26,7 @@ tag ann {
 
 tag def {
     def_fn(def_id);
+    def_obj(def_id);
     def_mod(def_id);
     def_const(def_id);
     def_arg(def_id);
@@ -194,6 +195,15 @@ type _fn = rec(effect effect,
                @ty output,
                block body);
 
+
+type method_ = rec(ident ident, _fn meth, def_id id);
+type method = spanned[method_];
+
+type obj_field = rec(@ty ty, ident ident, def_id id);
+type _obj = rec(vec[obj_field] fields,
+                vec[@method] methods);
+
+
 tag mod_index_entry {
     mie_item(uint);
     mie_tag_variant(uint /* tag item index */, uint /* variant index */);
@@ -212,6 +222,7 @@ tag item_ {
     item_mod(ident, _mod, def_id);
     item_ty(ident, @ty, vec[ty_param], def_id, ann);
     item_tag(ident, vec[variant], vec[ty_param], def_id);
+    item_obj(ident, _obj, vec[ty_param], def_id, ann);
 }
 
 
diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs
index a3b0462d2b5..5fd90508aef 100644
--- a/src/comp/front/parser.rs
+++ b/src/comp/front/parser.rs
@@ -141,6 +141,12 @@ impure fn parse_ty_fn(parser p) -> ast.ty_ {
     ret ast.ty_fn(inputs.node, output);
 }
 
+impure fn parse_ty_field(parser p) -> ast.ty_field {
+    auto ty = parse_ty(p);
+    auto id = parse_ident(p);
+    ret rec(ident=id, ty=ty);
+}
+
 impure fn parse_ty(parser p) -> @ast.ty {
     auto lo = p.get_span();
     auto hi = lo;
@@ -196,12 +202,7 @@ impure fn parse_ty(parser p) -> @ast.ty {
 
         case (token.REC) {
             p.bump();
-            impure fn parse_field(parser p) -> ast.ty_field {
-                auto ty = parse_ty(p);
-                auto id = parse_ident(p);
-                ret rec(ident=id, ty=ty);
-            }
-            auto f = parse_field; // FIXME: trans_const_lval bug
+            auto f = parse_ty_field; // FIXME: trans_const_lval bug
             auto elems =
                 parse_seq[ast.ty_field](token.LPAREN,
                                         token.RPAREN,
@@ -367,6 +368,14 @@ impure fn parse_mutabliity(parser p) -> ast.mutability {
     ret ast.imm;
 }
 
+impure fn parse_field(parser p) -> ast.field {
+    auto m = parse_mutabliity(p);
+    auto i = parse_ident(p);
+    expect(p, token.EQ);
+    auto e = parse_expr(p);
+    ret rec(mut=m, ident=i, expr=e);
+}
+
 impure fn parse_bottom_expr(parser p) -> @ast.expr {
 
     auto lo = p.get_span();
@@ -447,13 +456,6 @@ impure fn parse_bottom_expr(parser p) -> @ast.expr {
 
         case (token.REC) {
             p.bump();
-            impure fn parse_field(parser p) -> ast.field {
-                auto m = parse_mutabliity(p);
-                auto i = parse_ident(p);
-                expect(p, token.EQ);
-                auto e = parse_expr(p);
-                ret rec(mut=m, ident=i, expr=e);
-            }
             auto pf = parse_field;
             auto fs =
                 parse_seq[ast.field](token.LPAREN,
@@ -1214,12 +1216,7 @@ impure fn parse_ty_params(parser p) -> vec[ast.ty_param] {
     ret ty_params;
 }
 
-impure fn parse_item_fn(parser p, ast.effect eff) -> @ast.item {
-    auto lo = p.get_span();
-    expect(p, token.FN);
-    auto id = parse_ident(p);
-    auto ty_params = parse_ty_params(p);
-
+impure fn parse_fn(parser p, ast.effect eff) -> ast._fn {
     auto pf = parse_arg;
     let util.common.spanned[vec[ast.arg]] inputs =
         // FIXME: passing parse_arg as an lval doesn't work at the
@@ -1235,18 +1232,72 @@ impure fn parse_item_fn(parser p, ast.effect eff) -> @ast.item {
         p.bump();
         output = parse_ty(p);
     } else {
-        output = @spanned(lo, inputs.span, ast.ty_nil);
+        output = @spanned(inputs.span, inputs.span, ast.ty_nil);
     }
 
     auto body = parse_block(p);
 
-    let ast._fn f = rec(effect = eff,
-                        inputs = inputs.node,
-                        output = output,
-                        body = body);
+    ret rec(effect = eff,
+            inputs = inputs.node,
+            output = output,
+            body = body);
+}
 
+impure fn parse_item_fn(parser p, ast.effect eff) -> @ast.item {
+    auto lo = p.get_span();
+    expect(p, token.FN);
+    auto id = parse_ident(p);
+    auto ty_params = parse_ty_params(p);
+    auto f = parse_fn(p, eff);
     auto item = ast.item_fn(id, f, ty_params, p.next_def_id(), ast.ann_none);
-    ret @spanned(lo, body.span, item);
+    ret @spanned(lo, f.body.span, item);
+}
+
+
+impure fn parse_obj_field(parser p) -> ast.obj_field {
+    auto ty = parse_ty(p);
+    auto ident = parse_ident(p);
+    ret rec(ty=ty, ident=ident, id=p.next_def_id());
+}
+
+impure fn parse_method(parser p) -> @ast.method {
+    auto lo = p.get_span();
+    auto eff = parse_effect(p);
+    expect(p, token.FN);
+    auto ident = parse_ident(p);
+    auto f = parse_fn(p, eff);
+    auto meth = rec(ident = ident, meth = f, id = p.next_def_id());
+    ret @spanned(lo, f.body.span, meth);
+}
+
+impure fn parse_item_obj(parser p, ast.layer lyr) -> @ast.item {
+    auto lo = p.get_span();
+    expect(p, token.OBJ);
+    auto ident = parse_ident(p);
+    auto ty_params = parse_ty_params(p);
+    auto pf = parse_obj_field;
+    let util.common.spanned[vec[ast.obj_field]] fields =
+        parse_seq[ast.obj_field]
+        (token.LPAREN,
+         token.RPAREN,
+         some(token.COMMA),
+         pf, p);
+
+    auto pm = parse_method;
+    let util.common.spanned[vec[@ast.method]] meths =
+        parse_seq[@ast.method]
+        (token.LBRACE,
+         token.RBRACE,
+         none[token.token],
+         pm, p);
+
+    let ast._obj ob = rec(fields=fields.node,
+                          methods=meths.node);
+
+    auto item = ast.item_obj(ident, ob, ty_params,
+                             p.next_def_id(), ast.ann_none);
+
+    ret @spanned(lo, meths.span, item);
 }
 
 impure fn parse_mod_items(parser p, token.token term) -> ast._mod {
@@ -1271,7 +1322,6 @@ impure fn parse_mod_items(parser p, token.token term) -> ast._mod {
             case (ast.item_ty(?id, _, _, _, _)) {
                 index.insert(id, ast.mie_item(u));
             }
-
             case (ast.item_tag(?id, ?variants, _, _)) {
                 index.insert(id, ast.mie_item(u));
                 let uint variant_idx = 0u;
@@ -1280,6 +1330,9 @@ impure fn parse_mod_items(parser p, token.token term) -> ast._mod {
                     variant_idx += 1u;
                 }
             }
+            case (ast.item_obj(?id, _, _, _, _)) {
+                index.insert(id, ast.mie_item(u));
+            }
         }
 
         u += 1u;
@@ -1438,6 +1491,10 @@ impure fn parse_item(parser p) -> @ast.item {
             check (eff == ast.eff_pure);
             ret parse_item_tag(p);
         }
+        case (token.OBJ) {
+            check (eff == ast.eff_pure);
+            ret parse_item_obj(p, lyr);
+        }
         case (?t) {
             p.err("expected item but found " + token.to_str(t));
         }