Skip to content

Commit 9ea05a4

Browse files
committed
auto merge of #4978 : z0w0/rust/issue-607, r=graydon
2 parents aa8af12 + fe9f1d1 commit 9ea05a4

File tree

2 files changed

+31
-15
lines changed

2 files changed

+31
-15
lines changed

src/librustc/back/link.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -497,8 +497,7 @@ pub fn build_link_meta(sess: Session, c: &ast::crate, output: &Path,
497497

498498
let cmh_items = attr::sort_meta_items(cmh_items);
499499

500-
symbol_hasher.reset();
501-
for cmh_items.each |m| {
500+
fn hash(symbol_hasher: &hash::State, m: &@ast::meta_item) {
502501
match m.node {
503502
ast::meta_name_value(ref key, value) => {
504503
symbol_hasher.write_str(len_and_str((*key)));
@@ -507,13 +506,20 @@ pub fn build_link_meta(sess: Session, c: &ast::crate, output: &Path,
507506
ast::meta_word(ref name) => {
508507
symbol_hasher.write_str(len_and_str((*name)));
509508
}
510-
ast::meta_list(_, _) => {
511-
// FIXME (#607): Implement this
512-
fail!(~"unimplemented meta_item variant");
509+
ast::meta_list(ref name, ref mis) => {
510+
symbol_hasher.write_str(len_and_str((*name)));
511+
for mis.each |m_| {
512+
hash(symbol_hasher, m_);
513+
}
513514
}
514515
}
515516
}
516517

518+
symbol_hasher.reset();
519+
for cmh_items.each |m| {
520+
hash(symbol_hasher, m);
521+
}
522+
517523
for dep_hashes.each |dh| {
518524
symbol_hasher.write_str(len_and_str(*dh));
519525
}

src/libsyntax/attr.rs

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -192,13 +192,15 @@ fn eq(a: @ast::meta_item, b: @ast::meta_item) -> bool {
192192
}
193193
_ => false
194194
},
195-
ast::meta_list(*) => {
196-
197-
// ~[Fixme-sorting]
198-
// FIXME (#607): Needs implementing
199-
// This involves probably sorting the list by name and
200-
// meta_item variant
201-
fail!(~"unimplemented meta_item variant")
195+
ast::meta_list(ref na, misa) => match b.node {
196+
ast::meta_list(ref nb, misb) => {
197+
if na != nb { return false; }
198+
for misa.each |&mi| {
199+
if !contains(misb, mi) { return false; }
200+
}
201+
true
202+
}
203+
_ => false
202204
}
203205
}
204206
}
@@ -253,8 +255,6 @@ pub fn last_meta_item_list_by_name(items: ~[@ast::meta_item], name: ~str)
253255

254256
/* Higher-level applications */
255257

256-
// FIXME (#607): This needs to sort by meta_item variant in addition to
257-
// the item name (See [Fixme-sorting])
258258
pub fn sort_meta_items(+items: ~[@ast::meta_item]) -> ~[@ast::meta_item] {
259259
pure fn lteq(ma: &@ast::meta_item, mb: &@ast::meta_item) -> bool {
260260
pure fn key(m: &ast::meta_item) -> ~str {
@@ -270,7 +270,17 @@ pub fn sort_meta_items(+items: ~[@ast::meta_item]) -> ~[@ast::meta_item] {
270270
// This is sort of stupid here, converting to a vec of mutables and back
271271
let mut v: ~[@ast::meta_item] = items;
272272
std::sort::quick_sort(v, lteq);
273-
v
273+
274+
// There doesn't seem to be a more optimal way to do this
275+
do v.map |&m| {
276+
match m.node {
277+
ast::meta_list(n, mis) => @spanned {
278+
node: ast::meta_list(n, sort_meta_items(mis)),
279+
.. *m
280+
},
281+
_ => m
282+
}
283+
}
274284
}
275285

276286
pub fn remove_meta_items_by_name(items: ~[@ast::meta_item], name: ~str) ->

0 commit comments

Comments
 (0)