@@ -219,7 +219,7 @@ use crate::schema::{METADATA_HEADER, rustc_version};
219219use rustc_data_structures:: fx:: FxHashSet ;
220220use rustc_data_structures:: svh:: Svh ;
221221use rustc_data_structures:: sync:: MetadataRef ;
222- use rustc:: middle:: cstore:: MetadataLoader ;
222+ use rustc:: middle:: cstore:: { CrateSource , MetadataLoader } ;
223223use rustc:: session:: { config, Session } ;
224224use rustc:: session:: filesearch:: { FileSearch , FileMatches , FileDoesntMatch } ;
225225use rustc:: session:: search_paths:: PathKind ;
@@ -274,10 +274,8 @@ crate struct Context<'a> {
274274}
275275
276276crate struct CratePaths {
277- pub ident : String ,
278- pub dylib : Option < PathBuf > ,
279- pub rlib : Option < PathBuf > ,
280- pub rmeta : Option < PathBuf > ,
277+ pub name : Symbol ,
278+ pub source : CrateSource ,
281279}
282280
283281#[ derive( Copy , Clone , PartialEq ) ]
@@ -297,12 +295,6 @@ impl fmt::Display for CrateFlavor {
297295 }
298296}
299297
300- impl CratePaths {
301- fn paths ( & self ) -> Vec < PathBuf > {
302- self . dylib . iter ( ) . chain ( self . rlib . iter ( ) ) . chain ( self . rmeta . iter ( ) ) . cloned ( ) . collect ( )
303- }
304- }
305-
306298impl < ' a > Context < ' a > {
307299 crate fn reset ( & mut self ) {
308300 self . rejected_via_hash . clear ( ) ;
@@ -324,7 +316,7 @@ impl<'a> Context<'a> {
324316 crate fn report_errs ( self ) -> ! {
325317 let add = match self . root {
326318 None => String :: new ( ) ,
327- Some ( r) => format ! ( " which `{}` depends on" , r. ident ) ,
319+ Some ( r) => format ! ( " which `{}` depends on" , r. name ) ,
328320 } ;
329321 let mut msg = "the following crate versions were found:" . to_string ( ) ;
330322 let mut err = if !self . rejected_via_hash . is_empty ( ) {
@@ -342,8 +334,8 @@ impl<'a> Context<'a> {
342334 match self . root {
343335 None => { }
344336 Some ( r) => {
345- for path in r. paths ( ) . iter ( ) {
346- msg. push_str ( & format ! ( "\n crate `{}`: {}" , r. ident , path. display( ) ) ) ;
337+ for path in r. source . paths ( ) {
338+ msg. push_str ( & format ! ( "\n crate `{}`: {}" , r. name , path. display( ) ) ) ;
347339 }
348340 }
349341 }
@@ -535,18 +527,8 @@ impl<'a> Context<'a> {
535527 // search is being performed for.
536528 let mut libraries = FxHashMap :: default ( ) ;
537529 for ( _hash, ( rlibs, rmetas, dylibs) ) in candidates {
538- let mut slot = None ;
539- let rlib = self . extract_one ( rlibs, CrateFlavor :: Rlib , & mut slot) ;
540- let rmeta = self . extract_one ( rmetas, CrateFlavor :: Rmeta , & mut slot) ;
541- let dylib = self . extract_one ( dylibs, CrateFlavor :: Dylib , & mut slot) ;
542- if let Some ( ( h, m) ) = slot {
543- libraries. insert ( h,
544- Library {
545- dylib,
546- rlib,
547- rmeta,
548- metadata : m,
549- } ) ;
530+ if let Some ( ( svh, lib) ) = self . extract_lib ( rlibs, rmetas, dylibs) {
531+ libraries. insert ( svh, lib) ;
550532 }
551533 }
552534
@@ -564,7 +546,7 @@ impl<'a> Context<'a> {
564546 self . crate_name) ;
565547 let candidates = libraries. iter ( ) . filter_map ( |( _, lib) | {
566548 let crate_name = & lib. metadata . get_root ( ) . name . as_str ( ) ;
567- match & ( & lib. dylib , & lib. rlib ) {
549+ match & ( & lib. source . dylib , & lib. source . rlib ) {
568550 & ( & Some ( ( ref pd, _) ) , & Some ( ( ref pr, _) ) ) => {
569551 Some ( format ! ( "\n crate `{}`: {}\n {:>padding$}" ,
570552 crate_name,
@@ -585,6 +567,21 @@ impl<'a> Context<'a> {
585567 }
586568 }
587569
570+ fn extract_lib (
571+ & mut self ,
572+ rlibs : FxHashMap < PathBuf , PathKind > ,
573+ rmetas : FxHashMap < PathBuf , PathKind > ,
574+ dylibs : FxHashMap < PathBuf , PathKind > ,
575+ ) -> Option < ( Svh , Library ) > {
576+ let mut slot = None ;
577+ let source = CrateSource {
578+ rlib : self . extract_one ( rlibs, CrateFlavor :: Rlib , & mut slot) ,
579+ rmeta : self . extract_one ( rmetas, CrateFlavor :: Rmeta , & mut slot) ,
580+ dylib : self . extract_one ( dylibs, CrateFlavor :: Dylib , & mut slot) ,
581+ } ;
582+ slot. map ( |( svh, metadata) | ( svh, Library { source, metadata } ) )
583+ }
584+
588585 // Attempts to extract *one* library from the set `m`. If the set has no
589586 // elements, `None` is returned. If the set has more than one element, then
590587 // the errors and notes are emitted about the set of libraries.
@@ -829,23 +826,8 @@ impl<'a> Context<'a> {
829826 }
830827 } ;
831828
832- // Extract the rlib/dylib pair.
833- let mut slot = None ;
834- let rlib = self . extract_one ( rlibs, CrateFlavor :: Rlib , & mut slot) ;
835- let rmeta = self . extract_one ( rmetas, CrateFlavor :: Rmeta , & mut slot) ;
836- let dylib = self . extract_one ( dylibs, CrateFlavor :: Dylib , & mut slot) ;
837-
838- if rlib. is_none ( ) && rmeta. is_none ( ) && dylib. is_none ( ) {
839- return None ;
840- }
841- slot. map ( |( _, metadata) |
842- Library {
843- dylib,
844- rlib,
845- rmeta,
846- metadata,
847- }
848- )
829+ // Extract the dylib/rlib/rmeta triple.
830+ self . extract_lib ( rlibs, rmetas, dylibs) . map ( |( _, lib) | lib)
849831 }
850832}
851833
0 commit comments