about summary refs log tree commit diff
path: root/src/rustc/metadata/decoder.rs
diff options
context:
space:
mode:
authorHaitao Li <lihaitao@gmail.com>2012-04-08 01:59:37 +0800
committerHaitao Li <lihaitao@gmail.com>2012-04-08 02:00:58 +0800
commit5aa5220f8a3fc3ec0c58dede9f4c14be4a3752af (patch)
tree9da57dea28427cf266ddc04da6a1c08b7c452637 /src/rustc/metadata/decoder.rs
parent5300662b4e06f4cde219427bbcc2313eca0a5c51 (diff)
downloadrust-5aa5220f8a3fc3ec0c58dede9f4c14be4a3752af.tar.gz
rust-5aa5220f8a3fc3ec0c58dede9f4c14be4a3752af.zip
Encode crate dependencies' hash and version data
Diffstat (limited to 'src/rustc/metadata/decoder.rs')
-rw-r--r--src/rustc/metadata/decoder.rs25
1 files changed, 21 insertions, 4 deletions
diff --git a/src/rustc/metadata/decoder.rs b/src/rustc/metadata/decoder.rs
index c40e8d8f609..015f9d27258 100644
--- a/src/rustc/metadata/decoder.rs
+++ b/src/rustc/metadata/decoder.rs
@@ -33,6 +33,7 @@ export list_crate_metadata;
 export crate_dep;
 export get_crate_deps;
 export get_crate_hash;
+export get_crate_vers;
 export get_impls_for_mod;
 export get_iface_methods;
 export get_crate_module_paths;
@@ -579,16 +580,22 @@ fn get_crate_attributes(data: @[u8]) -> [ast::attribute] {
     ret get_attributes(ebml::doc(data));
 }
 
-type crate_dep = {cnum: ast::crate_num, ident: str};
+type crate_dep = {cnum: ast::crate_num, name: ast::ident,
+                  vers: str, hash: str};
 
 fn get_crate_deps(data: @[u8]) -> [crate_dep] {
     let mut deps: [crate_dep] = [];
     let cratedoc = ebml::doc(data);
     let depsdoc = ebml::get_doc(cratedoc, tag_crate_deps);
     let mut crate_num = 1;
+    fn docstr(doc: ebml::doc, tag_: uint) -> str {
+        str::from_bytes(ebml::doc_data(ebml::get_doc(doc, tag_)))
+    }
     ebml::tagged_docs(depsdoc, tag_crate_dep) {|depdoc|
-        let depname = str::from_bytes(ebml::doc_data(depdoc));
-        deps += [{cnum: crate_num, ident: depname}];
+        deps += [{cnum: crate_num,
+                  name: docstr(depdoc, tag_crate_dep_name),
+                  vers: docstr(depdoc, tag_crate_dep_vers),
+                  hash: docstr(depdoc, tag_crate_dep_hash)}];
         crate_num += 1;
     };
     ret deps;
@@ -598,7 +605,8 @@ fn list_crate_deps(data: @[u8], out: io::writer) {
     out.write_str("=External Dependencies=\n");
 
     for get_crate_deps(data).each {|dep|
-        out.write_str(#fmt["%d %s\n", dep.cnum, dep.ident]);
+        out.write_str(#fmt["%d %s-%s-%s\n",
+                           dep.cnum, dep.name, dep.hash, dep.vers]);
     }
 
     out.write_str("\n");
@@ -610,6 +618,15 @@ fn get_crate_hash(data: @[u8]) -> str {
     ret str::from_bytes(ebml::doc_data(hashdoc));
 }
 
+fn get_crate_vers(data: @[u8]) -> str {
+    let attrs = decoder::get_crate_attributes(data);
+    ret alt attr::meta_item_value_from_list(
+        attr::find_linkage_metas(attrs), "vers") {
+      some(ver) { ver }
+      none { "0.0" }
+    };
+}
+
 fn list_crate_items(bytes: @[u8], md: ebml::doc, out: io::writer) {
     out.write_str("=Items=\n");
     let items = ebml::get_doc(md, tag_items);