Skip to content

Commit 51f8552

Browse files
committed
---
yaml --- r: 3403 b: refs/heads/master c: d328c7e h: refs/heads/master i: 3401: e168db7 3399: 818abf0 v: v3
1 parent 73e3bcb commit 51f8552

File tree

4 files changed

+65
-23
lines changed

4 files changed

+65
-23
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 9561def20974acb302034c21b6de221972918d27
2+
refs/heads/master: d328c7e03e6daf9d6bb60f2a7c62176e7a772cde

trunk/src/comp/metadata/creader.rs

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -24,25 +24,6 @@ import tags::*;
2424
export read_crates;
2525
export list_file_metadata;
2626

27-
fn get_exported_metadata(&session::session sess, &str path, &vec[u8] data) ->
28-
hashmap[str, str] {
29-
auto meta_items =
30-
ebml::get_doc(ebml::new_doc(data), tag_meta_export);
31-
auto mm = common::new_str_hash[str]();
32-
for each (ebml::doc m in
33-
ebml::tagged_docs(meta_items, tag_meta_item)) {
34-
auto kd = ebml::get_doc(m, tag_meta_item_key);
35-
auto vd = ebml::get_doc(m, tag_meta_item_value);
36-
auto k = str::unsafe_from_bytes(ebml::doc_data(kd));
37-
auto v = str::unsafe_from_bytes(ebml::doc_data(vd));
38-
log #fmt("metadata in %s: %s = %s", path, k, v);
39-
if (!mm.insert(k, v)) {
40-
sess.warn(#fmt("Duplicate metadata item in %s: %s", path, k));
41-
}
42-
}
43-
ret mm;
44-
}
45-
4627
fn metadata_matches(hashmap[str, str] mm, &vec[@ast::meta_item] metas) ->
4728
bool {
4829
log #fmt("matching %u metadata requirements against %u metadata items",
@@ -126,7 +107,8 @@ fn find_library_crate(&session::session sess, &ast::ident ident,
126107
}
127108
alt (get_metadata_section(path)) {
128109
case (option::some(?cvec)) {
129-
auto mm = get_exported_metadata(sess, path, cvec);
110+
auto mm = decoder::get_exported_metadata(sess,
111+
path, cvec);
130112
if (!metadata_matches(mm, metas)) {
131113
log #fmt("skipping %s, metadata doesn't match", path);
132114
cont;

trunk/src/comp/metadata/decoder.rs

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,23 @@ import std::option;
55
import std::vec;
66
import std::str;
77
import std::io;
8+
import std::map::hashmap;
89
import front::ast;
910
import middle::ty;
1011
import tags::*;
1112
import tydecode::parse_def_id;
1213
import tydecode::parse_ty_data;
1314
import driver::session;
15+
import util::common;
16+
import pretty::pprust;
1417

1518
export get_symbol;
1619
export get_tag_variants;
1720
export get_type;
1821
export lookup_defs;
1922
export get_type;
2023
export list_crate_metadata;
24+
export get_exported_metadata;
2125

2226
fn lookup_hash(&ebml::doc d, fn(vec[u8]) -> bool eq_fn, uint hash) ->
2327
vec[ebml::doc] {
@@ -252,8 +256,35 @@ fn item_kind_to_str(u8 kind) -> str {
252256
}
253257
}
254258

255-
fn list_crate_metadata(vec[u8] bytes, io::writer out) {
256-
auto md = ebml::new_doc(bytes);
259+
fn get_meta_items(&ebml::doc md) -> vec[ast::meta_item] {
260+
let vec[ast::meta_item] items = [];
261+
for each (ebml::doc meta_item_doc in
262+
ebml::tagged_docs(md, tag_meta_item)) {
263+
auto kd = ebml::get_doc(meta_item_doc, tag_meta_item_key);
264+
auto vd = ebml::get_doc(meta_item_doc, tag_meta_item_value);
265+
auto k = str::unsafe_from_bytes(ebml::doc_data(kd));
266+
auto v = str::unsafe_from_bytes(ebml::doc_data(vd));
267+
items += [rec(node=ast::meta_key_value(k, v),
268+
span=rec(lo=0u, hi=0u))];
269+
}
270+
ret items;
271+
}
272+
273+
fn list_meta_items(&ebml::doc meta_items, io::writer out) {
274+
for (ast::meta_item mi in get_meta_items(meta_items)) {
275+
out.write_str(#fmt("%s\n", pprust::meta_item_to_str(mi)));
276+
}
277+
}
278+
279+
fn list_crate_attributes(&ebml::doc md, io::writer out) {
280+
out.write_str("=Crate=\n");
281+
auto meta_items = ebml::get_doc(md, tag_meta_export);
282+
list_meta_items(meta_items, out);
283+
out.write_str("\n");
284+
}
285+
286+
fn list_crate_items(vec[u8] bytes, &ebml::doc md, io::writer out) {
287+
out.write_str("=Items=\n");
257288
auto paths = ebml::get_doc(md, tag_paths);
258289
auto items = ebml::get_doc(md, tag_items);
259290
auto index = ebml::get_doc(paths, tag_index);
@@ -270,8 +301,33 @@ fn list_crate_metadata(vec[u8] bytes, io::writer out) {
270301
describe_def(items, did)));
271302
}
272303
}
304+
out.write_str("\n");
305+
}
306+
307+
fn list_crate_metadata(vec[u8] bytes, io::writer out) {
308+
auto md = ebml::new_doc(bytes);
309+
list_crate_attributes(md, out);
310+
list_crate_items(bytes, md, out);
273311
}
274312

313+
fn get_exported_metadata(&session::session sess, &str path, &vec[u8] data) ->
314+
hashmap[str, str] {
315+
auto meta_items =
316+
ebml::get_doc(ebml::new_doc(data), tag_meta_export);
317+
auto mm = common::new_str_hash[str]();
318+
for each (ebml::doc m in
319+
ebml::tagged_docs(meta_items, tag_meta_item)) {
320+
auto kd = ebml::get_doc(m, tag_meta_item_key);
321+
auto vd = ebml::get_doc(m, tag_meta_item_value);
322+
auto k = str::unsafe_from_bytes(ebml::doc_data(kd));
323+
auto v = str::unsafe_from_bytes(ebml::doc_data(vd));
324+
log #fmt("metadata in %s: %s = %s", path, k, v);
325+
if (!mm.insert(k, v)) {
326+
sess.warn(#fmt("Duplicate metadata item in %s: %s", path, k));
327+
}
328+
}
329+
ret mm;
330+
}
275331

276332
// Local Variables:
277333
// mode: rust

trunk/src/comp/pretty/pprust.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,10 @@ fn block_to_str(&ast::block blk) -> str {
8080
ret writer.get_str();
8181
}
8282

83+
fn meta_item_to_str(&ast::meta_item mi) -> str {
84+
ret to_str(@mi, print_meta_item);
85+
}
86+
8387
fn cbox(&ps s, uint u) {
8488
vec::push(s.boxes, pp::consistent);
8589
pp::cbox(s.s, u);

0 commit comments

Comments
 (0)