about summary refs log tree commit diff
diff options
context:
space:
mode:
authorGraydon Hoare <graydon@mozilla.com>2011-03-02 13:50:42 -0800
committerGraydon Hoare <graydon@mozilla.com>2011-03-02 13:50:42 -0800
commit9e4943c9229e15fa11069eeb2b20060994f9ac0f (patch)
treeecd8c204e4026e865ab3576e3b87bd334aa00a3d
parentd33110ebfcf7f2a5796d3a4c4f969efbf13e7548 (diff)
Parse, add to AST, and otherwise ignore 'export' view items. Need to add support to resolve.
-rw-r--r--src/comp/front/ast.rs6
-rw-r--r--src/comp/front/parser.rs39
2 files changed, 34 insertions, 11 deletions
diff --git a/src/comp/front/ast.rs b/src/comp/front/ast.rs
index 46f5716861a..474dc4aaa46 100644
--- a/src/comp/front/ast.rs
+++ b/src/comp/front/ast.rs
@@ -279,6 +279,7 @@ type view_item = spanned[view_item_];
 tag view_item_ {
     view_item_use(ident, vec[@meta_item], def_id);
     view_item_import(ident, vec[ident], def_id, option.t[def]);
+    view_item_export(ident);
 }
 
 type item = spanned[item_];
@@ -306,6 +307,11 @@ fn index_view_item(mod_index index, @view_item it) {
         case(ast.view_item_import(?def_ident,_,_,_)) {
             index.insert(def_ident, ast.mie_view_item(it));
         }
+        case(ast.view_item_export(_)) {
+            // NB: don't index these, they might collide with
+            // the import or use that they're exporting. Have
+            // to do linear search for exports.
+        }
     }
 }
 
diff --git a/src/comp/front/parser.rs b/src/comp/front/parser.rs
index 50545a2f9b0..1be4226c038 100644
--- a/src/comp/front/parser.rs
+++ b/src/comp/front/parser.rs
@@ -2187,7 +2187,16 @@ impure fn parse_import(parser p) -> @ast.view_item {
     fail;
 }
 
-impure fn parse_use_or_import(parser p) -> @ast.view_item {
+impure fn parse_export(parser p) -> @ast.view_item {
+    auto lo = p.get_span();
+    expect(p, token.EXPORT);
+    auto id = parse_ident(p);
+    auto hi = p.get_span();
+    expect(p, token.SEMI);
+    ret @spanned(lo, hi, ast.view_item_export(id));
+}
+
+impure fn parse_view_item(parser p) -> @ast.view_item {
     alt (p.peek()) {
         case (token.USE) {
             ret parse_use(p);
@@ -2195,23 +2204,26 @@ impure fn parse_use_or_import(parser p) -> @ast.view_item {
         case (token.IMPORT) {
             ret parse_import(p);
         }
+        case (token.EXPORT) {
+            ret parse_export(p);
+        }
     }
 }
 
-fn is_use_or_import(token.token t) -> bool {
-    if (t == token.USE) {
-        ret true;
-    }
-    if (t == token.IMPORT) {
-        ret true;
+fn is_view_item(token.token t) -> bool {
+    alt (t) {
+        case (token.USE) { ret true; }
+        case (token.IMPORT) { ret true; }
+        case (token.EXPORT) { ret true; }
+        case (_) {}
     }
     ret false;
 }
 
 impure fn parse_view(parser p, ast.mod_index index) -> 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);
+    while (is_view_item(p.peek())) {
+        auto item = parse_view_item(p);
         items += vec(item);
 
         ast.index_view_item(index, item);
@@ -2305,12 +2317,17 @@ impure fn parse_crate_directive(parser p) -> ast.crate_directive
         }
 
         case (token.USE) {
-            auto vi = parse_use_or_import(p);
+            auto vi = parse_view_item(p);
             ret spanned(lo, vi.span, ast.cdir_view_item(vi));
         }
 
         case (token.IMPORT) {
-            auto vi = parse_use_or_import(p);
+            auto vi = parse_view_item(p);
+            ret spanned(lo, vi.span, ast.cdir_view_item(vi));
+        }
+
+        case (token.EXPORT) {
+            auto vi = parse_view_item(p);
             ret spanned(lo, vi.span, ast.cdir_view_item(vi));
         }