about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMarijn Haverbeke <marijnh@gmail.com>2011-04-18 09:22:23 +0200
committerMarijn Haverbeke <marijnh@gmail.com>2011-04-18 15:28:47 +0200
commit0bf75a203e6611f0b0293c3fc08a6f2ee3a5f1ba (patch)
tree158b96caa1d2590f84238a10650fa3aba14a8bab
parent0984d1db2e523d4c012b59dbcc87d53021f67cd2 (diff)
downloadrust-0bf75a203e6611f0b0293c3fc08a6f2ee3a5f1ba.tar.gz
rust-0bf75a203e6611f0b0293c3fc08a6f2ee3a5f1ba.zip
collect crate meta info and ext crate names
-rw-r--r--src/comp/driver/rustc.rs3
-rw-r--r--src/comp/driver/session.rs17
-rw-r--r--src/comp/front/creader.rs10
-rw-r--r--src/comp/front/eval.rs5
4 files changed, 24 insertions, 11 deletions
diff --git a/src/comp/driver/rustc.rs b/src/comp/driver/rustc.rs
index d6f6f6944c4..afa2a9bbcd9 100644
--- a/src/comp/driver/rustc.rs
+++ b/src/comp/driver/rustc.rs
@@ -128,8 +128,9 @@ impure fn main(vec[str] args) {
 
     auto crate_cache = common.new_int_hash[session.crate_metadata]();
     auto target_crate_num = 0;
+    let vec[@front.ast.meta_item] md = vec();
     auto sess = session.session(target_crate_num, target_cfg, crate_cache,
-                                front.codemap.new_codemap());
+                                md, front.codemap.new_codemap());
 
     let option.t[str] input_file = none[str];
     let option.t[str] output_file = none[str];
diff --git a/src/comp/driver/session.rs b/src/comp/driver/session.rs
index dab02fbd627..9cbbc94c6d4 100644
--- a/src/comp/driver/session.rs
+++ b/src/comp/driver/session.rs
@@ -23,11 +23,13 @@ type cfg = rec(os os,
                ty_mach uint_type,
                ty_mach float_type);
 
-type crate_metadata = vec[u8];
+type crate_metadata = rec(str name,
+                          vec[u8] data);
 
-obj session(ast.crate_num cnum, cfg targ,
-            map.hashmap[int, crate_metadata] crates,
-            codemap.codemap cm) {
+state obj session(ast.crate_num cnum, cfg targ,
+                  map.hashmap[int, crate_metadata] crates,
+                  mutable vec[@ast.meta_item] metadata,
+                  codemap.codemap cm) {
 
     fn get_targ_cfg() -> cfg {
         ret targ;
@@ -53,6 +55,13 @@ obj session(ast.crate_num cnum, cfg targ,
         fail;
     }
 
+    fn add_metadata(vec[@ast.meta_item] data) {
+        metadata = metadata + data;
+    }
+    fn get_metadata() -> vec[@ast.meta_item] {
+        ret metadata;
+    }
+
     fn span_warn(span sp, str msg) {
         auto lo = codemap.lookup_pos(cm, sp.lo);
         auto hi = codemap.lookup_pos(cm, sp.hi);
diff --git a/src/comp/front/creader.rs b/src/comp/front/creader.rs
index b70153803c8..55b40cce2fd 100644
--- a/src/comp/front/creader.rs
+++ b/src/comp/front/creader.rs
@@ -400,7 +400,7 @@ fn load_crate(session.session sess,
         auto path = fs.connect(library_search_path, filename);
         alt (get_metadata_section(path)) {
             case (option.some[vec[u8]](?cvec)) {
-                sess.set_external_crate(cnum, cvec);
+                sess.set_external_crate(cnum, rec(name=ident, data=cvec));
                 ret;
             }
             case (_) {}
@@ -470,7 +470,7 @@ fn kind_has_type_params(u8 kind_ch) -> bool {
 
 fn lookup_def(session.session sess, int cnum, vec[ast.ident] path)
         -> option.t[ast.def] {
-    auto data = sess.get_external_crate(cnum);
+    auto data = sess.get_external_crate(cnum).data;
 
     auto did;
     alt (resolve_path(path, data)) {
@@ -513,7 +513,7 @@ fn lookup_def(session.session sess, int cnum, vec[ast.ident] path)
 fn get_type(session.session sess, ast.def_id def)
         -> ty.ty_param_count_and_ty {
     auto external_crate_id = def._0;
-    auto data = sess.get_external_crate(external_crate_id);
+    auto data = sess.get_external_crate(external_crate_id).data;
     auto item = lookup_item(def._1, data);
     auto t = item_type(item, external_crate_id);
 
@@ -531,7 +531,7 @@ fn get_type(session.session sess, ast.def_id def)
 
 fn get_symbol(session.session sess, ast.def_id def) -> str {
     auto external_crate_id = def._0;
-    auto data = sess.get_external_crate(external_crate_id);
+    auto data = sess.get_external_crate(external_crate_id).data;
     auto item = lookup_item(def._1, data);
     ret item_symbol(item);
 }
@@ -539,7 +539,7 @@ fn get_symbol(session.session sess, ast.def_id def) -> str {
 fn get_tag_variants(session.session sess, ast.def_id def)
         -> vec[trans.variant_info] {
     auto external_crate_id = def._0;
-    auto data = sess.get_external_crate(external_crate_id);
+    auto data = sess.get_external_crate(external_crate_id).data;
     auto items = ebml.get_doc(ebml.new_doc(data), metadata.tag_items);
     auto item = find_item(def._1, items);
 
diff --git a/src/comp/front/eval.rs b/src/comp/front/eval.rs
index ca350c36530..8306bcf01e0 100644
--- a/src/comp/front/eval.rs
+++ b/src/comp/front/eval.rs
@@ -419,7 +419,10 @@ impure fn eval_crate_directive(ctx cx,
             ast.index_view_item(index, vi);
         }
 
-        case (ast.cdir_meta(?mi)) {}
+        case (ast.cdir_meta(?mi)) {
+            cx.sess.add_metadata(mi);
+        }
+
         case (ast.cdir_syntax(?pth)) {}
         case (ast.cdir_auth(?pth, ?eff)) {}
     }