Skip to content

Commit cab73f8

Browse files
committed
Write metadata for more meta_item types. Issue #487
1 parent f53c4f7 commit cab73f8

File tree

10 files changed

+95
-55
lines changed

10 files changed

+95
-55
lines changed

src/comp/back/link.rs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -292,12 +292,10 @@ fn get_crate_meta_export(&session::session sess, &ast::crate c, str k,
292292
for each (@ast::meta_item mi in crate_export_metas(c)) {
293293
// FIXME (#487): Support all variants of meta_item
294294
alt (mi.node) {
295-
case (ast::meta_key_value(?key, ?value)) {
296-
if (key == k) { v += [mi]; }
297-
}
298-
case (_) {
299-
sess.unimpl("meta_item variant");
295+
case (ast::meta_name_value(?name, ?value)) {
296+
if (name == k) { v += [mi]; }
300297
}
298+
case (_) {}
301299
}
302300
}
303301
alt (vec::len(v)) {
@@ -310,11 +308,11 @@ fn get_crate_meta_export(&session::session sess, &ast::crate c, str k,
310308
}
311309
case (1u) {
312310
alt (v.(0).node) {
313-
case (ast::meta_key_value(_, ?value)) {
311+
case (ast::meta_name_value(_, ?value)) {
314312
ret value;
315313
}
316314
case (_) {
317-
sess.unimpl("meta_item variant");
315+
ret default;
318316
}
319317
}
320318
}
@@ -333,8 +331,11 @@ fn crate_meta_extras_hash(sha1 sha, &ast::crate crate) -> str {
333331
case (ast::meta_word(?name)) {
334332
name
335333
}
336-
case (ast::meta_key_value(?key, _)) {
337-
key
334+
case (ast::meta_name_value(?name, _)) {
335+
name
336+
}
337+
case (ast::meta_list(?name, _)) {
338+
name
338339
}
339340
}
340341
}
@@ -344,8 +345,8 @@ fn crate_meta_extras_hash(sha1 sha, &ast::crate crate) -> str {
344345
let vec[mutable @ast::meta_item] v = [mutable ];
345346
for each (@ast::meta_item mi in crate_export_metas(crate)) {
346347
alt (mi.node) {
347-
case (ast::meta_key_value(?key, _)) {
348-
if (key != "name" && key != "vers") {
348+
case (ast::meta_name_value(?name, _)) {
349+
if (name != "name" && name != "vers") {
349350
v += [mutable mi];
350351
}
351352
}
@@ -359,13 +360,14 @@ fn crate_meta_extras_hash(sha1 sha, &ast::crate crate) -> str {
359360
for (@ast::meta_item m_ in v) {
360361
auto m = m_;
361362
alt (m.node) {
362-
case (ast::meta_key_value(?key, ?value)) {
363+
case (ast::meta_name_value(?key, ?value)) {
363364
sha.input_str(len_and_str(key));
364365
sha.input_str(len_and_str(value));
365366
}
366367
case (ast::meta_word(?name)) {
367368
sha.input_str(len_and_str(name));
368369
}
370+
case (_) {}
369371
}
370372
}
371373
ret truncated_sha1_result(sha);

src/comp/front/ast.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ type meta_item = spanned[meta_item_];
103103
tag meta_item_ {
104104
meta_word(ident);
105105
meta_list(ident, vec[@meta_item]);
106-
meta_key_value(ident, str);
106+
meta_name_value(ident, str);
107107
}
108108

109109
type block = spanned[block_];

src/comp/front/fold.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,8 @@ fn fold_meta_item_(&@meta_item mi, ast_fold fld) -> @meta_item {
104104
auto fold_meta_item = bind fold_meta_item_(_,fld);
105105
meta_list(id, map(fold_meta_item, mis))
106106
}
107-
case (meta_key_value(?id,?s)) {
108-
meta_key_value(fld.fold_ident(id),s)
107+
case (meta_name_value(?id,?s)) {
108+
meta_name_value(fld.fold_ident(id),s)
109109
}
110110
},
111111
span=mi.span);

src/comp/front/parser.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2142,7 +2142,7 @@ fn parse_meta_item(&parser p) -> @ast::meta_item {
21422142
p.bump();
21432143
auto value = p.get_str(s);
21442144
auto hi = p.get_hi_pos();
2145-
ret @spanned(lo, hi, ast::meta_key_value(ident, value));
2145+
ret @spanned(lo, hi, ast::meta_name_value(ident, value));
21462146
}
21472147
case (_) {
21482148
p.fatal("Metadata items must be string literals");

src/comp/metadata/creader.rs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,22 +30,22 @@ fn metadata_matches(hashmap[str, str] mm, &vec[@ast::meta_item] metas) ->
3030
vec::len(metas), mm.size());
3131
for (@ast::meta_item mi in metas) {
3232
alt (mi.node) {
33-
case (ast::meta_key_value(?key, ?value)) {
34-
alt (mm.find(key)) {
33+
case (ast::meta_name_value(?name, ?value)) {
34+
alt (mm.find(name)) {
3535
case (some(?v)) {
3636
if (v == value) {
37-
log #fmt("matched '%s': '%s'", key,
37+
log #fmt("matched '%s': '%s'", name,
3838
value);
3939
} else {
4040
log #fmt("missing '%s': '%s' (got '%s')",
41-
key,
41+
name,
4242
value, v);
4343
ret false;
4444
}
4545
}
4646
case (none) {
4747
log #fmt("missing '%s': '%s'",
48-
key, value);
48+
name, value);
4949
ret false;
5050
}
5151
}
@@ -76,15 +76,14 @@ fn find_library_crate(&session::session sess, &ast::ident ident,
7676
let str crate_name = ident;
7777
for (@ast::meta_item mi in metas) {
7878
alt (mi.node) {
79-
case (ast::meta_key_value(?key, ?value)) {
80-
if (key == "name") {
79+
case (ast::meta_name_value(?name, ?value)) {
80+
if (name == "name") {
8181
crate_name = value;
8282
break;
8383
}
8484
}
8585
case (_) {
8686
// FIXME (#487)
87-
sess.unimpl("meta_item variant")
8887
}
8988
}
9089
}

src/comp/metadata/decoder.rs

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -256,16 +256,31 @@ fn item_kind_to_str(u8 kind) -> str {
256256
}
257257
}
258258

259-
fn get_meta_items(&ebml::doc md) -> vec[ast::meta_item] {
260-
let vec[ast::meta_item] items = [];
259+
fn get_meta_items(&ebml::doc md) -> vec[@ast::meta_item] {
260+
let vec[@ast::meta_item] items = [];
261261
for each (ebml::doc meta_item_doc in
262-
ebml::tagged_docs(md, tag_meta_item_key_value)) {
263-
auto kd = ebml::get_doc(meta_item_doc, tag_meta_item_key);
262+
ebml::tagged_docs(md, tag_meta_item_word)) {
263+
auto nd = ebml::get_doc(meta_item_doc, tag_meta_item_name);
264+
auto n = str::unsafe_from_bytes(ebml::doc_data(nd));
265+
items += [@rec(node=ast::meta_word(n),
266+
span=rec(lo=0u, hi=0u))];
267+
}
268+
for each (ebml::doc meta_item_doc in
269+
ebml::tagged_docs(md, tag_meta_item_name_value)) {
270+
auto nd = ebml::get_doc(meta_item_doc, tag_meta_item_name);
264271
auto vd = ebml::get_doc(meta_item_doc, tag_meta_item_value);
265-
auto k = str::unsafe_from_bytes(ebml::doc_data(kd));
272+
auto n = str::unsafe_from_bytes(ebml::doc_data(nd));
266273
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))];
274+
items += [@rec(node=ast::meta_name_value(n, v),
275+
span=rec(lo=0u, hi=0u))];
276+
}
277+
for each (ebml::doc meta_item_doc in
278+
ebml::tagged_docs(md, tag_meta_item_list)) {
279+
auto nd = ebml::get_doc(meta_item_doc, tag_meta_item_name);
280+
auto n = str::unsafe_from_bytes(ebml::doc_data(nd));
281+
auto subitems = get_meta_items(meta_item_doc);
282+
items += [@rec(node=ast::meta_list(n, subitems),
283+
span=rec(lo=0u, hi=0u))];
269284
}
270285
ret items;
271286
}
@@ -279,10 +294,11 @@ fn get_attributes(&ebml::doc md) -> vec[ast::attribute] {
279294
auto meta_items = get_meta_items(attr_doc);
280295
// Currently it's only possible to have a single meta item on
281296
// an attribute
297+
log_err vec::len(meta_items);
282298
assert (vec::len(meta_items) == 1u);
283299
auto meta_item = meta_items.(0);
284300
attrs += [rec(node=rec(style=ast::attr_outer,
285-
value=meta_item),
301+
value=*meta_item),
286302
span=rec(lo=0u, hi=0u))];
287303
}
288304
}
@@ -292,8 +308,8 @@ fn get_attributes(&ebml::doc md) -> vec[ast::attribute] {
292308
}
293309

294310
fn list_meta_items(&ebml::doc meta_items, io::writer out) {
295-
for (ast::meta_item mi in get_meta_items(meta_items)) {
296-
out.write_str(#fmt("%s\n", pprust::meta_item_to_str(mi)));
311+
for (@ast::meta_item mi in get_meta_items(meta_items)) {
312+
out.write_str(#fmt("%s\n", pprust::meta_item_to_str(*mi)));
297313
}
298314
}
299315

@@ -345,14 +361,14 @@ fn get_exported_metadata(&session::session sess, &str path, &vec[u8] data) ->
345361
ebml::get_doc(ebml::new_doc(data), tag_meta_export);
346362
auto mm = common::new_str_hash[str]();
347363
for each (ebml::doc m in
348-
ebml::tagged_docs(meta_items, tag_meta_item_key_value)) {
349-
auto kd = ebml::get_doc(m, tag_meta_item_key);
364+
ebml::tagged_docs(meta_items, tag_meta_item_name_value)) {
365+
auto nd = ebml::get_doc(m, tag_meta_item_name);
350366
auto vd = ebml::get_doc(m, tag_meta_item_value);
351-
auto k = str::unsafe_from_bytes(ebml::doc_data(kd));
367+
auto n = str::unsafe_from_bytes(ebml::doc_data(nd));
352368
auto v = str::unsafe_from_bytes(ebml::doc_data(vd));
353-
log #fmt("metadata in %s: %s = %s", path, k, v);
354-
if (!mm.insert(k, v)) {
355-
sess.warn(#fmt("Duplicate metadata item in %s: %s", path, k));
369+
log #fmt("metadata in %s: %s = %s", path, n, v);
370+
if (!mm.insert(n, v)) {
371+
sess.warn(#fmt("Duplicate metadata item in %s: %s", path, n));
356372
}
357373
}
358374
ret mm;

src/comp/metadata/encoder.rs

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -418,21 +418,35 @@ fn write_int(&io::writer writer, &int n) {
418418

419419
fn encode_meta_item(&ebml::writer ebml_w, &meta_item mi) {
420420
// FIXME (#487): Support all forms of meta item
421-
ebml::start_tag(ebml_w, tag_meta_item_key_value);
422421
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));
422+
case (meta_word(?name)) {
423+
ebml::start_tag(ebml_w, tag_meta_item_word);
424+
ebml::start_tag(ebml_w, tag_meta_item_name);
425+
ebml_w.writer.write(str::bytes(name));
426+
ebml::end_tag(ebml_w);
427+
ebml::end_tag(ebml_w);
428+
}
429+
case (meta_name_value(?name, ?value)) {
430+
ebml::start_tag(ebml_w, tag_meta_item_name_value);
431+
ebml::start_tag(ebml_w, tag_meta_item_name);
432+
ebml_w.writer.write(str::bytes(name));
426433
ebml::end_tag(ebml_w);
427434
ebml::start_tag(ebml_w, tag_meta_item_value);
428435
ebml_w.writer.write(str::bytes(value));
429436
ebml::end_tag(ebml_w);
437+
ebml::end_tag(ebml_w);
430438
}
431-
case (_) {
432-
log_err "unimplemented meta_item type";
439+
case (meta_list(?name, ?items)) {
440+
ebml::start_tag(ebml_w, tag_meta_item_list);
441+
ebml::start_tag(ebml_w, tag_meta_item_name);
442+
ebml_w.writer.write(str::bytes(name));
443+
ebml::end_tag(ebml_w);
444+
for (@meta_item inner_item in items) {
445+
encode_meta_item(ebml_w, *inner_item);
446+
}
447+
ebml::end_tag(ebml_w);
433448
}
434449
}
435-
ebml::end_tag(ebml_w);
436450
}
437451

438452
fn encode_attributes(&ebml::writer ebml_w, &vec[attribute] attrs) {

src/comp/metadata/tags.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,16 @@ const uint tag_meta_export = 0x16u;
4444

4545
const uint tag_meta_local = 0x17u;
4646

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

49-
const uint tag_meta_item_key = 0x19u;
49+
const uint tag_meta_item_name = 0x19u;
5050

5151
const uint tag_meta_item_value = 0x20u;
5252

5353
const uint tag_attributes = 0x21u;
5454

5555
const uint tag_attribute = 0x22u;
5656

57+
const uint tag_meta_item_word = 0x23u;
58+
59+
const uint tag_meta_item_list = 0x24u;

src/comp/pretty/pprust.rs

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1062,16 +1062,20 @@ fn print_type_params(&ps s, &vec[ast::ty_param] params) {
10621062

10631063
fn print_meta_item(&ps s, &@ast::meta_item item) {
10641064
ibox(s, indent_unit);
1065-
// FIXME (#487): Print other meta item variants
10661065
alt (item.node) {
1067-
case (ast::meta_key_value(?key, ?value)) {
1068-
word_space(s, key);
1066+
case (ast::meta_word(?name)) {
1067+
word(s.s, name);
1068+
}
1069+
case (ast::meta_name_value(?name, ?value)) {
1070+
word_space(s, name);
10691071
word_space(s, "=");
10701072
print_string(s, value);
10711073
}
1072-
case (_) {
1073-
log_err "unimplemented meta_item variant";
1074-
fail;
1074+
case (ast::meta_list(?name, ?items)) {
1075+
word(s.s, name);
1076+
popen(s);
1077+
commasep(s, consistent, items, print_meta_item);
1078+
pclose(s);
10751079
}
10761080
}
10771081
end(s);

src/test/run-pass/item-attributes.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
// notation to specify their module's attributes
66
#[attr1 = "val"];
77
#[attr2 = "val"];
8+
#[attr3];
9+
#[attr4(attr5)];
810

911
// These are are attributes of the following mod
1012
#[attr1 = "val"]

0 commit comments

Comments
 (0)