@@ -192,13 +192,15 @@ fn eq(a: @ast::meta_item, b: @ast::meta_item) -> bool {
192
192
}
193
193
_ => false
194
194
} ,
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
202
204
}
203
205
}
204
206
}
@@ -253,8 +255,6 @@ pub fn last_meta_item_list_by_name(items: ~[@ast::meta_item], name: ~str)
253
255
254
256
/* Higher-level applications */
255
257
256
- // FIXME (#607): This needs to sort by meta_item variant in addition to
257
- // the item name (See [Fixme-sorting])
258
258
pub fn sort_meta_items ( +items : ~[ @ast:: meta_item ] ) -> ~[ @ast:: meta_item ] {
259
259
pure fn lteq ( ma : & @ast:: meta_item , mb : & @ast:: meta_item ) -> bool {
260
260
pure fn key ( m : & ast:: meta_item ) -> ~str {
@@ -270,7 +270,17 @@ pub fn sort_meta_items(+items: ~[@ast::meta_item]) -> ~[@ast::meta_item] {
270
270
// This is sort of stupid here, converting to a vec of mutables and back
271
271
let mut v: ~[ @ast:: meta_item ] = items;
272
272
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
+ }
274
284
}
275
285
276
286
pub fn remove_meta_items_by_name ( items : ~[ @ast:: meta_item ] , name : ~str ) ->
0 commit comments