about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorGraydon Hoare <graydon@mozilla.com>2011-03-07 11:48:43 -0800
committerGraydon Hoare <graydon@mozilla.com>2011-03-07 11:48:43 -0800
commit90f299e710c49d689d5bc815e32db375cca00394 (patch)
treed2ee1e9784a2e2a9ff5184d2d1f75327ba315d22 /src
parentdfa85968c346e7d7892a7399cc2b79bfb7e0e5ef (diff)
downloadrust-90f299e710c49d689d5bc815e32db375cca00394.tar.gz
rust-90f299e710c49d689d5bc815e32db375cca00394.zip
Permit view items in native modules.
Diffstat (limited to 'src')
-rw-r--r--src/comp/front/ast.rs25
-rw-r--r--src/comp/front/parser.rs22
-rw-r--r--src/comp/middle/fold.rs9
-rw-r--r--src/comp/middle/resolve.rs14
4 files changed, 61 insertions, 9 deletions
diff --git a/src/comp/front/ast.rs b/src/comp/front/ast.rs
index a8bf4b00a0a..ed1e21142c5 100644
--- a/src/comp/front/ast.rs
+++ b/src/comp/front/ast.rs
@@ -265,6 +265,11 @@ tag mod_index_entry {
     mie_tag_variant(@item /* tag item */, uint /* variant index */);
 }
 
+tag native_mod_index_entry {
+    nmie_view_item(@view_item);
+    nmie_item(@native_item);
+}
+
 type mod_index = hashmap[ident,mod_index_entry];
 type _mod = rec(vec[@view_item] view_items,
                 vec[@item] items,
@@ -277,9 +282,10 @@ tag native_abi {
 
 type native_mod = rec(str native_name,
                       native_abi abi,
+                      vec[@view_item] view_items,
                       vec[@native_item] items,
                       native_mod_index index);
-type native_mod_index = hashmap[ident,@native_item];
+type native_mod_index = hashmap[ident,native_mod_index_entry];
 
 type variant_arg = rec(@ty ty, def_id id);
 type variant = rec(str name, vec[variant_arg] args, def_id id, ann ann);
@@ -359,10 +365,23 @@ fn index_item(mod_index index, @item it) {
 fn index_native_item(native_mod_index index, @native_item it) {
     alt (it.node) {
         case (ast.native_item_ty(?id, _)) {
-            index.insert(id, it);
+            index.insert(id, ast.nmie_item(it));
         }
         case (ast.native_item_fn(?id, _, _, _, _)) {
-            index.insert(id, it);
+            index.insert(id, ast.nmie_item(it));
+        }
+    }
+}
+
+fn index_native_view_item(native_mod_index index, @view_item it) {
+    alt (it.node) {
+        case(ast.view_item_import(?def_ident,_,_,_)) {
+            index.insert(def_ident, ast.nmie_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 8141595b144..6f3111c74d0 100644
--- a/src/comp/front/parser.rs
+++ b/src/comp/front/parser.rs
@@ -1846,8 +1846,11 @@ impure fn parse_native_item(parser p) -> @ast.native_item {
 impure fn parse_native_mod_items(parser p,
                                  str native_name,
                                  ast.native_abi abi) -> ast.native_mod {
-    auto index = new_str_hash[@ast.native_item]();
+    auto index = new_str_hash[ast.native_mod_index_entry]();
     let vec[@ast.native_item] items = vec();
+
+    auto view_items = parse_native_view(p, index);
+
     while (p.peek() != token.RBRACE) {
         auto item = parse_native_item(p);
         items += vec(item);
@@ -1856,7 +1859,9 @@ impure fn parse_native_mod_items(parser p,
         ast.index_native_item(index, item);
     }
     ret rec(native_name=native_name, abi=abi,
-            items=items, index=index);
+            view_items=view_items,
+            items=items,
+            index=index);
 }
 
 fn default_native_name(session.session sess, str id) -> str {
@@ -2230,6 +2235,19 @@ impure fn parse_view(parser p, ast.mod_index index) -> vec[@ast.view_item] {
     ret items;
 }
 
+impure fn parse_native_view(parser p, ast.native_mod_index index)
+    -> vec[@ast.view_item] {
+    let vec[@ast.view_item] items = vec();
+    while (is_view_item(p.peek())) {
+        auto item = parse_view_item(p);
+        items += vec(item);
+
+        ast.index_native_view_item(index, item);
+    }
+    ret items;
+}
+
+
 impure fn parse_crate_from_source_file(parser p) -> @ast.crate {
     auto lo = p.get_span();
     auto hi = lo;
diff --git a/src/comp/middle/fold.rs b/src/comp/middle/fold.rs
index 935f426b74f..8a1dc70faaf 100644
--- a/src/comp/middle/fold.rs
+++ b/src/comp/middle/fold.rs
@@ -957,8 +957,14 @@ fn fold_native_item[ENV](&ENV env, ast_fold[ENV] fld,
 
 fn fold_native_mod[ENV](&ENV e, ast_fold[ENV] fld,
                         &ast.native_mod m) -> ast.native_mod {
+    let vec[@view_item] view_items = vec();
     let vec[@native_item] items = vec();
-    auto index = new_str_hash[@ast.native_item]();
+    auto index = new_str_hash[ast.native_mod_index_entry]();
+
+    for (@view_item vi in m.view_items) {
+        auto new_vi = fold_view_item[ENV](e, fld, vi);
+        append[@view_item](view_items, new_vi);
+    }
 
     for (@native_item i in m.items) {
         auto new_item = fold_native_item[ENV](e, fld, i);
@@ -968,6 +974,7 @@ fn fold_native_mod[ENV](&ENV e, ast_fold[ENV] fld,
 
     ret fld.fold_native_mod(e, rec(native_name=m.native_name,
                                    abi=m.abi,
+                                   view_items=view_items,
                                    items=items,
                                    index=index));
 }
diff --git a/src/comp/middle/resolve.rs b/src/comp/middle/resolve.rs
index a2f4da6301a..5b6db631665 100644
--- a/src/comp/middle/resolve.rs
+++ b/src/comp/middle/resolve.rs
@@ -300,11 +300,19 @@ fn lookup_name_wrapped(&env e, ast.ident i) -> option.t[tup(@env, def_wrap)] {
     }
 
     fn check_native_mod(ast.ident i, ast.native_mod m) -> option.t[def_wrap] {
+
         alt (m.index.find(i)) {
-            case (some[@ast.native_item](?item)) {
-                ret some(found_def_native_item(item));
+            case (some[ast.native_mod_index_entry](?ent)) {
+                alt (ent) {
+                    case (ast.nmie_view_item(?view_item)) {
+                        ret some(found_def_view(view_item));
+                    }
+                    case (ast.nmie_item(?item)) {
+                        ret some(found_def_native_item(item));
+                    }
+                }
             }
-            case (_) {
+            case (none[ast.native_mod_index_entry]) {
                 ret none[def_wrap];
             }
         }