Skip to content

Commit f53c4f7

Browse files
committed
Write metadata for crate attributes. Issue #487
1 parent 894e222 commit f53c4f7

File tree

4 files changed

+74
-22
lines changed

4 files changed

+74
-22
lines changed

src/comp/metadata/decoder.rs

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ fn item_kind_to_str(u8 kind) -> str {
259259
fn get_meta_items(&ebml::doc md) -> vec[ast::meta_item] {
260260
let vec[ast::meta_item] items = [];
261261
for each (ebml::doc meta_item_doc in
262-
ebml::tagged_docs(md, tag_meta_item)) {
262+
ebml::tagged_docs(md, tag_meta_item_key_value)) {
263263
auto kd = ebml::get_doc(meta_item_doc, tag_meta_item_key);
264264
auto vd = ebml::get_doc(meta_item_doc, tag_meta_item_value);
265265
auto k = str::unsafe_from_bytes(ebml::doc_data(kd));
@@ -270,17 +270,46 @@ fn get_meta_items(&ebml::doc md) -> vec[ast::meta_item] {
270270
ret items;
271271
}
272272

273+
fn get_attributes(&ebml::doc md) -> vec[ast::attribute] {
274+
let vec[ast::attribute] attrs = [];
275+
alt (ebml::maybe_get_doc(md, tag_attributes)) {
276+
case (option::some(?attrs_d)) {
277+
for each (ebml::doc attr_doc in
278+
ebml::tagged_docs(attrs_d, tag_attribute)) {
279+
auto meta_items = get_meta_items(attr_doc);
280+
// Currently it's only possible to have a single meta item on
281+
// an attribute
282+
assert (vec::len(meta_items) == 1u);
283+
auto meta_item = meta_items.(0);
284+
attrs += [rec(node=rec(style=ast::attr_outer,
285+
value=meta_item),
286+
span=rec(lo=0u, hi=0u))];
287+
}
288+
}
289+
case (option::none) { }
290+
}
291+
ret attrs;
292+
}
293+
273294
fn list_meta_items(&ebml::doc meta_items, io::writer out) {
274295
for (ast::meta_item mi in get_meta_items(meta_items)) {
275296
out.write_str(#fmt("%s\n", pprust::meta_item_to_str(mi)));
276297
}
277298
}
278299

279300
fn list_crate_attributes(&ebml::doc md, io::writer out) {
280-
out.write_str("=Crate=\n");
301+
out.write_str("=Crate=");
302+
303+
// FIXME: This is transitional until attributes are snapshotted
304+
out.write_str("old-style:\n");
281305
auto meta_items = ebml::get_doc(md, tag_meta_export);
282306
list_meta_items(meta_items, out);
283-
out.write_str("\n");
307+
308+
for (ast::attribute attr in get_attributes(md)) {
309+
out.write_str(#fmt("%s", pprust::attribute_to_str(attr)));
310+
}
311+
312+
out.write_str("\n\n");
284313
}
285314

286315
fn list_crate_items(vec[u8] bytes, &ebml::doc md, io::writer out) {
@@ -316,7 +345,7 @@ fn get_exported_metadata(&session::session sess, &str path, &vec[u8] data) ->
316345
ebml::get_doc(ebml::new_doc(data), tag_meta_export);
317346
auto mm = common::new_str_hash[str]();
318347
for each (ebml::doc m in
319-
ebml::tagged_docs(meta_items, tag_meta_item)) {
348+
ebml::tagged_docs(meta_items, tag_meta_item_key_value)) {
320349
auto kd = ebml::get_doc(m, tag_meta_item_key);
321350
auto vd = ebml::get_doc(m, tag_meta_item_value);
322351
auto k = str::unsafe_from_bytes(ebml::doc_data(kd));

src/comp/metadata/encoder.rs

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -416,25 +416,36 @@ fn write_int(&io::writer writer, &int n) {
416416
writer.write_be_uint(n as uint, 4u);
417417
}
418418

419-
fn encode_meta_items(&ebml::writer ebml_w, &crate crate) {
420-
fn encode_meta_item(&ebml::writer ebml_w, &meta_item mi) {
421-
// FIXME (#487): Support all forms of meta item
422-
ebml::start_tag(ebml_w, tag_meta_item);
423-
alt (mi.node) {
424-
case (meta_key_value(?key, ?value)) {
425-
ebml::start_tag(ebml_w, tag_meta_item_key);
426-
ebml_w.writer.write(str::bytes(key));
427-
ebml::end_tag(ebml_w);
428-
ebml::start_tag(ebml_w, tag_meta_item_value);
429-
ebml_w.writer.write(str::bytes(value));
430-
ebml::end_tag(ebml_w);
431-
}
432-
case (_) {
433-
log_err "unimplemented meta_item type";
434-
}
419+
fn encode_meta_item(&ebml::writer ebml_w, &meta_item mi) {
420+
// FIXME (#487): Support all forms of meta item
421+
ebml::start_tag(ebml_w, tag_meta_item_key_value);
422+
alt (mi.node) {
423+
case (meta_key_value(?key, ?value)) {
424+
ebml::start_tag(ebml_w, tag_meta_item_key);
425+
ebml_w.writer.write(str::bytes(key));
426+
ebml::end_tag(ebml_w);
427+
ebml::start_tag(ebml_w, tag_meta_item_value);
428+
ebml_w.writer.write(str::bytes(value));
429+
ebml::end_tag(ebml_w);
430+
}
431+
case (_) {
432+
log_err "unimplemented meta_item type";
435433
}
434+
}
435+
ebml::end_tag(ebml_w);
436+
}
437+
438+
fn encode_attributes(&ebml::writer ebml_w, &vec[attribute] attrs) {
439+
ebml::start_tag(ebml_w, tag_attributes);
440+
for (attribute attr in attrs) {
441+
ebml::start_tag(ebml_w, tag_attribute);
442+
encode_meta_item(ebml_w, attr.node.value);
436443
ebml::end_tag(ebml_w);
437444
}
445+
ebml::end_tag(ebml_w);
446+
}
447+
448+
fn encode_meta_items(&ebml::writer ebml_w, &crate crate) {
438449
ebml::start_tag(ebml_w, tag_meta_export);
439450
for each (@meta_item mi in crate_export_metas(crate)) {
440451
encode_meta_item(ebml_w, *mi);
@@ -451,9 +462,12 @@ fn encode_metadata(&@crate_ctxt cx, &@crate crate) -> str {
451462
auto string_w = io::string_writer();
452463
auto buf_w = string_w.get_writer().get_buf_writer();
453464
auto ebml_w = ebml::create_writer(buf_w);
454-
// Encode the meta items
455465

466+
// FIXME: This is the old way of encoding crate meta items
467+
// Remove after going through a snapshot cycle
456468
encode_meta_items(ebml_w, *crate);
469+
// Encode crate attributes
470+
encode_attributes(ebml_w, crate.node.attrs);
457471
// Encode and index the paths.
458472

459473
ebml::start_tag(ebml_w, tag_paths);

src/comp/metadata/tags.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,13 @@ const uint tag_meta_export = 0x16u;
4444

4545
const uint tag_meta_local = 0x17u;
4646

47-
const uint tag_meta_item = 0x18u;
47+
const uint tag_meta_item_key_value = 0x18u;
4848

4949
const uint tag_meta_item_key = 0x19u;
5050

5151
const uint tag_meta_item_value = 0x20u;
52+
53+
const uint tag_attributes = 0x21u;
54+
55+
const uint tag_attribute = 0x22u;
56+

src/comp/pretty/pprust.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,10 @@ fn meta_item_to_str(&ast::meta_item mi) -> str {
8484
ret to_str(@mi, print_meta_item);
8585
}
8686

87+
fn attribute_to_str(&ast::attribute attr) -> str {
88+
be to_str(attr, print_attribute);
89+
}
90+
8791
fn cbox(&ps s, uint u) {
8892
vec::push(s.boxes, pp::consistent);
8993
pp::cbox(s.s, u);

0 commit comments

Comments
 (0)