@@ -566,6 +566,72 @@ fn get_tag_variants(session.session sess, ast.def_id def)
566
566
ret infos;
567
567
}
568
568
569
+ impure fn list_file_metadata( str path, io. writer out) {
570
+ alt ( get_metadata_section( path) ) {
571
+ case ( option. some[ vec[ u8 ] ] ( ?bytes) ) {
572
+ list_crate_metadata( bytes, out) ;
573
+ }
574
+ case ( option. none[ vec[ u8 ] ] ) {
575
+ out. write_str( "Could not find metadata in " + path + ". \n ") ;
576
+ }
577
+ }
578
+ }
579
+
580
+ fn read_path( & ebml. doc d) -> tup( str , uint) {
581
+ auto desc = ebml. doc_data( d) ;
582
+ auto pos = ebml. be_uint_from_bytes( desc, 0 u, 4 u) ;
583
+ auto pathbytes = _vec. slice[ u8 ] ( desc, 4 u, _vec. len[ u8 ] ( desc) ) ;
584
+ auto path = _str. unsafe_from_bytes( pathbytes) ;
585
+ ret tup( path, pos) ;
586
+ }
587
+
588
+ impure fn list_crate_metadata( vec[ u8 ] bytes, io. writer out) {
589
+ auto md = ebml. new_doc( bytes) ;
590
+ auto paths = ebml. get_doc( md, metadata. tag_paths) ;
591
+ auto items = ebml. get_doc( md, metadata. tag_items) ;
592
+ auto index = ebml. get_doc( paths, metadata. tag_index) ;
593
+ auto bs = ebml. get_doc( index, metadata. tag_index_buckets) ;
594
+ for each ( ebml. doc bucket in
595
+ ebml. tagged_docs( bs, metadata. tag_index_buckets_bucket) ) {
596
+ auto et = metadata. tag_index_buckets_bucket_elt;
597
+ for each ( ebml. doc elt in ebml. tagged_docs( bucket, et) ) {
598
+ auto data = read_path( elt) ;
599
+ auto def = ebml. doc_at( bytes, data. _1) ;
600
+ auto did_doc = ebml. get_doc( def, metadata. tag_def_id) ;
601
+ auto did = parse_def_id( ebml. doc_data( did_doc) ) ;
602
+ out. write_str( #fmt( "%s ( %s) \n ", data. _0,
603
+ describe_def( items, did) ) ) ;
604
+ }
605
+ }
606
+ }
607
+
608
+ fn describe_def( & ebml. doc items, ast. def_id id) -> str {
609
+ if ( id. _0 != 0 ) { ret "external"; }
610
+ alt ( maybe_find_item( id. _1 as int, items) ) {
611
+ case ( option. some[ ebml. doc] ( ?item) ) {
612
+ ret item_kind_to_str( item_kind( item) ) ;
613
+ }
614
+ case ( option. none[ ebml. doc] ) {
615
+ ret "??"; // Native modules don't seem to get item entries.
616
+ }
617
+ }
618
+ }
619
+
620
+ fn item_kind_to_str( u8 kind) -> str {
621
+ alt ( kind as char ) {
622
+ case ( 'c' ) { ret "const "; }
623
+ case ( 'f' ) { ret "fn "; }
624
+ case ( 'F' ) { ret "native fn "; }
625
+ case ( 'y' ) { ret "type "; }
626
+ case ( 'o' ) { ret "obj"; }
627
+ case ( 'T' ) { ret "native type "; }
628
+ case ( 't' ) { ret "type "; }
629
+ case ( 'm' ) { ret "mod "; }
630
+ case ( 'n' ) { ret "native mod "; }
631
+ case ( 'v' ) { ret "tag"; }
632
+ }
633
+ }
634
+
569
635
// Local Variables:
570
636
// mode: rust
571
637
// fill-column: 78;
0 commit comments