@@ -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])
258258pub 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
276286pub fn remove_meta_items_by_name ( items : ~[ @ast:: meta_item ] , name : ~str ) ->
0 commit comments