@@ -725,25 +725,196 @@ impl MetadataBlob {
725725 LazyValue :: < CrateRoot > :: from_position ( NonZeroUsize :: new ( pos) . unwrap ( ) ) . decode ( self )
726726 }
727727
728- pub ( crate ) fn list_crate_metadata ( & self , out : & mut dyn io:: Write ) -> io:: Result < ( ) > {
728+ pub ( crate ) fn list_crate_metadata (
729+ & self ,
730+ out : & mut dyn io:: Write ,
731+ ls_kinds : & [ String ] ,
732+ ) -> io:: Result < ( ) > {
729733 let root = self . get_root ( ) ;
730- writeln ! ( out, "Crate info:" ) ?;
731- writeln ! ( out, "name {}{}" , root. name( ) , root. extra_filename) ?;
732- writeln ! ( out, "hash {} stable_crate_id {:?}" , root. hash( ) , root. stable_crate_id) ?;
733- writeln ! ( out, "proc_macro {:?}" , root. proc_macro_data. is_some( ) ) ?;
734- writeln ! ( out, "=External Dependencies=" ) ?;
735-
736- for ( i, dep) in root. crate_deps . decode ( self ) . enumerate ( ) {
737- let CrateDep { name, extra_filename, hash, host_hash, kind, is_private } = dep;
738- let number = i + 1 ;
739-
740- writeln ! (
741- out,
742- "{number} {name}{extra_filename} hash {hash} host_hash {host_hash:?} kind {kind:?} {privacy}" ,
743- privacy = if is_private { "private" } else { "public" }
744- ) ?;
734+
735+ let all_ls_kinds = vec ! [
736+ "root" . to_owned( ) ,
737+ "lang_items" . to_owned( ) ,
738+ "features" . to_owned( ) ,
739+ "items" . to_owned( ) ,
740+ ] ;
741+ let ls_kinds = if ls_kinds. contains ( & "all" . to_owned ( ) ) { & all_ls_kinds } else { ls_kinds } ;
742+
743+ for kind in ls_kinds {
744+ match & * * kind {
745+ "root" => {
746+ writeln ! ( out, "Crate info:" ) ?;
747+ writeln ! ( out, "name {}{}" , root. name( ) , root. extra_filename) ?;
748+ writeln ! (
749+ out,
750+ "hash {} stable_crate_id {:?}" ,
751+ root. hash( ) ,
752+ root. stable_crate_id
753+ ) ?;
754+ writeln ! ( out, "proc_macro {:?}" , root. proc_macro_data. is_some( ) ) ?;
755+ writeln ! ( out, "triple {}" , root. header. triple. triple( ) ) ?;
756+ writeln ! ( out, "edition {}" , root. edition) ?;
757+ writeln ! ( out, "symbol_mangling_version {:?}" , root. symbol_mangling_version) ?;
758+ writeln ! (
759+ out,
760+ "required_panic_strategy {:?} panic_in_drop_strategy {:?}" ,
761+ root. required_panic_strategy, root. panic_in_drop_strategy
762+ ) ?;
763+ writeln ! (
764+ out,
765+ "has_global_allocator {} has_alloc_error_handler {} has_panic_handler {} has_default_lib_allocator {}" ,
766+ root. has_global_allocator,
767+ root. has_alloc_error_handler,
768+ root. has_panic_handler,
769+ root. has_default_lib_allocator
770+ ) ?;
771+ writeln ! (
772+ out,
773+ "compiler_builtins {} needs_allocator {} needs_panic_runtime {} no_builtins {} panic_runtime {} profiler_runtime {}" ,
774+ root. compiler_builtins,
775+ root. needs_allocator,
776+ root. needs_panic_runtime,
777+ root. no_builtins,
778+ root. panic_runtime,
779+ root. profiler_runtime
780+ ) ?;
781+
782+ writeln ! ( out, "=External Dependencies=" ) ?;
783+ let dylib_dependency_formats =
784+ root. dylib_dependency_formats . decode ( self ) . collect :: < Vec < _ > > ( ) ;
785+ for ( i, dep) in root. crate_deps . decode ( self ) . enumerate ( ) {
786+ let CrateDep { name, extra_filename, hash, host_hash, kind, is_private } =
787+ dep;
788+ let number = i + 1 ;
789+
790+ writeln ! (
791+ out,
792+ "{number} {name}{extra_filename} hash {hash} host_hash {host_hash:?} kind {kind:?} {privacy}{linkage}" ,
793+ privacy = if is_private { "private" } else { "public" } ,
794+ linkage = if dylib_dependency_formats. is_empty( ) {
795+ String :: new( )
796+ } else {
797+ format!( " linkage {:?}" , dylib_dependency_formats[ i] )
798+ }
799+ ) ?;
800+ }
801+ write ! ( out, "\n " ) ?;
802+ }
803+
804+ "lang_items" => {
805+ writeln ! ( out, "=Lang items=" ) ?;
806+ for ( id, lang_item) in root. lang_items . decode ( self ) {
807+ writeln ! (
808+ out,
809+ "{} = crate{}" ,
810+ lang_item. name( ) ,
811+ DefPath :: make( LOCAL_CRATE , id, |parent| root
812+ . tables
813+ . def_keys
814+ . get( self , parent)
815+ . unwrap( )
816+ . decode( self ) )
817+ . to_string_no_crate_verbose( )
818+ ) ?;
819+ }
820+ for lang_item in root. lang_items_missing . decode ( self ) {
821+ writeln ! ( out, "{} = <missing>" , lang_item. name( ) ) ?;
822+ }
823+ write ! ( out, "\n " ) ?;
824+ }
825+
826+ "features" => {
827+ writeln ! ( out, "=Lib features=" ) ?;
828+ for ( feature, since) in root. lib_features . decode ( self ) {
829+ writeln ! (
830+ out,
831+ "{}{}" ,
832+ feature,
833+ if let Some ( since) = since {
834+ format!( " since {since}" )
835+ } else {
836+ String :: new( )
837+ }
838+ ) ?;
839+ }
840+ write ! ( out, "\n " ) ?;
841+ }
842+
843+ "items" => {
844+ writeln ! ( out, "=Items=" ) ?;
845+
846+ fn print_item (
847+ blob : & MetadataBlob ,
848+ out : & mut dyn io:: Write ,
849+ item : DefIndex ,
850+ indent : usize ,
851+ ) -> io:: Result < ( ) > {
852+ let root = blob. get_root ( ) ;
853+
854+ let def_kind = root. tables . opt_def_kind . get ( blob, item) . unwrap ( ) ;
855+ let def_key = root. tables . def_keys . get ( blob, item) . unwrap ( ) . decode ( blob) ;
856+ let def_name = if item == CRATE_DEF_INDEX {
857+ rustc_span:: symbol:: kw:: Crate
858+ } else {
859+ def_key
860+ . disambiguated_data
861+ . data
862+ . get_opt_name ( )
863+ . unwrap_or_else ( || Symbol :: intern ( "???" ) )
864+ } ;
865+ let visibility =
866+ root. tables . visibility . get ( blob, item) . unwrap ( ) . decode ( blob) . map_id (
867+ |index| {
868+ format ! (
869+ "crate{}" ,
870+ DefPath :: make( LOCAL_CRATE , index, |parent| root
871+ . tables
872+ . def_keys
873+ . get( blob, parent)
874+ . unwrap( )
875+ . decode( blob) )
876+ . to_string_no_crate_verbose( )
877+ )
878+ } ,
879+ ) ;
880+ write ! (
881+ out,
882+ "{nil: <indent$}{:?} {:?} {} {{" ,
883+ visibility,
884+ def_kind,
885+ def_name,
886+ nil = "" ,
887+ ) ?;
888+
889+ if let Some ( children) =
890+ root. tables . module_children_non_reexports . get ( blob, item)
891+ {
892+ write ! ( out, "\n " ) ?;
893+ for child in children. decode ( blob) {
894+ print_item ( blob, out, child, indent + 4 ) ?;
895+ }
896+ writeln ! ( out, "{nil: <indent$}}}" , nil = "" ) ?;
897+ } else {
898+ writeln ! ( out, "}}" ) ?;
899+ }
900+
901+ Ok ( ( ) )
902+ }
903+
904+ print_item ( self , out, CRATE_DEF_INDEX , 0 ) ?;
905+
906+ write ! ( out, "\n " ) ?;
907+ }
908+
909+ _ => {
910+ writeln ! (
911+ out,
912+ "unknown -Zls kind. allowed values are: all, root, lang_items, features, items"
913+ ) ?;
914+ }
915+ }
745916 }
746- write ! ( out , " \n " ) ? ;
917+
747918 Ok ( ( ) )
748919 }
749920}
0 commit comments