about summary refs log tree commit diff
diff options
context:
space:
mode:
authorRafael Ávila de Espíndola <respindola@mozilla.com>2011-01-01 12:55:18 -0500
committerRafael Ávila de Espíndola <respindola@mozilla.com>2011-01-04 11:34:05 -0500
commit5fd3d2ca5516cfe5087d802c1b207943a64653da (patch)
tree58f566f7cc707efb7436ec7173a69844a60c169d
parent35c745da03078c9bc58e6f6f2cf57c84e354f09d (diff)
downloadrust-5fd3d2ca5516cfe5087d802c1b207943a64653da.tar.gz
rust-5fd3d2ca5516cfe5087d802c1b207943a64653da.zip
Refactor the view_item code so that it is similar to the code used for
parsing regular items.
-rw-r--r--src/comp/front/ast.rs17
-rw-r--r--src/comp/front/parser.rs53
2 files changed, 40 insertions, 30 deletions
diff --git a/src/comp/front/ast.rs b/src/comp/front/ast.rs
index 1e229b349e6..55207de09ed 100644
--- a/src/comp/front/ast.rs
+++ b/src/comp/front/ast.rs
@@ -40,17 +40,6 @@ tag def {
 type crate = spanned[crate_];
 type crate_ = rec(_mod module);
 
-type use_node = spanned[use_node_];
-type use_node_ = rec(ident name, vec[@meta_item] metadata);
-
-type import_node = spanned[import_node_];
-type import_node_ = rec(vec[ident] identifiers);
-
-tag view_item {
-    view_item_use(@use_node);
-    view_item_import(@import_node);
-}
-
 type meta_item = spanned[meta_item_];
 type meta_item_ = rec(ident name, str value);
 
@@ -233,6 +222,12 @@ type _mod = rec(vec[@item] items,
 type variant_arg = rec(@ty ty, def_id id);
 type variant = rec(str name, vec[variant_arg] args, def_id id, ann ann);
 
+type view_item = spanned[view_item_];
+tag view_item_ {
+    view_item_use(ident, vec[@meta_item]);
+    view_item_import(vec[ident]);
+}
+
 type item = spanned[item_];
 tag item_ {
     item_const(ident, @ty, @expr, def_id, ann);
diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs
index b167bae460a..cdf2ae172ab 100644
--- a/src/comp/front/parser.rs
+++ b/src/comp/front/parser.rs
@@ -1662,17 +1662,18 @@ impure fn parse_optional_meta(parser p) -> vec[@ast.meta_item] {
     }
 }
 
-impure fn parse_use(parser p) -> @ast.use_node {
+impure fn parse_use(parser p) -> @ast.view_item {
     auto lo = p.get_span();
     auto hi = lo;
     expect(p, token.USE);
     auto ident = parse_ident(p);
     auto metadata = parse_optional_meta(p);
     expect(p, token.SEMI);
-    ret @spanned(lo, hi, rec(name = ident, metadata = metadata));
+    auto use_decl = ast.view_item_use(ident, metadata);
+    ret @spanned(lo, hi, use_decl);
 }
 
-impure fn parse_rest_import_name(parser p, ast.ident id) -> @ast.import_node {
+impure fn parse_rest_import_name(parser p, ast.ident id) -> @ast.view_item {
     auto lo = p.get_span();
     auto hi = lo;
     let vec[ast.ident] identifiers = vec();
@@ -1683,10 +1684,11 @@ impure fn parse_rest_import_name(parser p, ast.ident id) -> @ast.import_node {
         identifiers += i;
     }
     p.bump();
-    ret @spanned(lo, hi, rec(identifiers = identifiers));
+    auto import_decl = ast.view_item_import(identifiers);
+    ret @spanned(lo, hi, import_decl);
 }
 
-impure fn parse_full_import_name(parser p) -> @ast.import_node {
+impure fn parse_full_import_name(parser p) -> @ast.view_item {
     alt (p.peek()) {
         case (token.IDENT(?ident)) {
             p.bump();
@@ -1699,7 +1701,7 @@ impure fn parse_full_import_name(parser p) -> @ast.import_node {
     fail;
 }
 
-impure fn parse_import(parser p) -> @ast.import_node {
+impure fn parse_import(parser p) -> @ast.view_item {
     expect(p, token.IMPORT);
     alt (p.peek()) {
         case (token.IDENT(?ident)) {
@@ -1721,21 +1723,34 @@ impure fn parse_import(parser p) -> @ast.import_node {
     fail;
 }
 
-impure fn parse_view(parser p) -> vec[ast.view_item] {
-    let vec[ast.view_item] items = vec();
-    while (true) {
-        alt (p.peek()) {
-            case (token.USE) {
-                items += vec(ast.view_item_use(parse_use(p)));
-            }
-            case (token.IMPORT) {
-                items += vec(ast.view_item_import(parse_import(p)));
-            }
-            case (_) {
-                ret items;
-            }
+impure fn parse_use_or_import(parser p) -> @ast.view_item {
+    alt (p.peek()) {
+        case (token.USE) {
+            ret parse_use(p);
         }
+        case (token.IMPORT) {
+            ret parse_import(p);
+        }
+    }
+}
+
+fn is_use_or_import(token.token t) -> bool {
+    if (t == token.USE) {
+        ret true;
+    }
+    if (t == token.IMPORT) {
+        ret true;
+    }
+    ret false;
+}
+
+impure fn parse_view(parser p) -> vec[@ast.view_item] {
+    let vec[@ast.view_item] items = vec();
+    while (is_use_or_import(p.peek())) {
+        auto item = parse_use_or_import(p);
+        items += vec(item);
     }
+    ret items;
 }
 
 impure fn parse_crate_from_crate_file(parser p) -> @ast.crate {