about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>2019-11-17 19:21:43 +0300
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>2019-11-17 20:13:54 +0300
commitfebde53fde9fa88f5e1ea2b779c002a6f0d68cd6 (patch)
tree3a7eb276025d2e3dfce1130ae30a88d550265f05 /src
parent26f113e5b670a37678750b81d8ad3e5ca2a789a0 (diff)
downloadrust-febde53fde9fa88f5e1ea2b779c002a6f0d68cd6.tar.gz
rust-febde53fde9fa88f5e1ea2b779c002a6f0d68cd6.zip
rustc_metadata: Cleanup crate search with exact paths
Diffstat (limited to 'src')
-rw-r--r--src/librustc_metadata/locator.rs48
1 files changed, 22 insertions, 26 deletions
diff --git a/src/librustc_metadata/locator.rs b/src/librustc_metadata/locator.rs
index 58661292b27..64230fd9e60 100644
--- a/src/librustc_metadata/locator.rs
+++ b/src/librustc_metadata/locator.rs
@@ -261,6 +261,7 @@ crate struct CrateLocator<'a> {
 
     // Immutable per-search configuration.
     crate_name: Symbol,
+    exact_paths: Vec<PathBuf>,
     pub hash: Option<&'a Svh>,
     pub host_hash: Option<&'a Svh>,
     extra_filename: Option<&'a str>,
@@ -277,7 +278,6 @@ crate struct CrateLocator<'a> {
     rejected_via_kind: Vec<CrateMismatch>,
     rejected_via_version: Vec<CrateMismatch>,
     rejected_via_filename: Vec<CrateMismatch>,
-    should_match_name: bool,
 }
 
 crate struct CratePaths {
@@ -326,6 +326,15 @@ impl<'a> CrateLocator<'a> {
             sess,
             metadata_loader,
             crate_name,
+            exact_paths: if hash.is_none() {
+                sess.opts.externs.get(&crate_name.as_str()).into_iter()
+                    .flat_map(|entry| entry.locations.iter())
+                    .filter_map(|location| location.clone().map(PathBuf::from)).collect()
+            } else {
+                // SVH being specified means this is a transitive dependency,
+                // so `--extern` options do not apply.
+                Vec::new()
+            },
             hash,
             host_hash,
             extra_filename,
@@ -348,7 +357,6 @@ impl<'a> CrateLocator<'a> {
             rejected_via_kind: Vec::new(),
             rejected_via_version: Vec::new(),
             rejected_via_filename: Vec::new(),
-            should_match_name: true,
         }
     }
 
@@ -361,6 +369,9 @@ impl<'a> CrateLocator<'a> {
     }
 
     crate fn maybe_load_library_crate(&mut self) -> Option<Library> {
+        if !self.exact_paths.is_empty() {
+            return self.find_commandline_library();
+        }
         let mut seen_paths = FxHashSet::default();
         match self.extra_filename {
             Some(s) => self.find_library_crate(s, &mut seen_paths)
@@ -486,21 +497,6 @@ impl<'a> CrateLocator<'a> {
                           extra_prefix: &str,
                           seen_paths: &mut FxHashSet<PathBuf>)
                           -> Option<Library> {
-        // If an SVH is specified, then this is a transitive dependency that
-        // must be loaded via -L plus some filtering.
-        if self.hash.is_none() {
-            self.should_match_name = false;
-            if let Some(entry) = self.sess.opts.externs.get(&self.crate_name.as_str()) {
-                // Only use `--extern crate_name=path` here, not `--extern crate_name`.
-                if entry.locations.iter().any(|l| l.is_some()) {
-                    return self.find_commandline_library(
-                        entry.locations.iter().filter_map(|l| l.as_ref()),
-                    );
-                }
-            }
-            self.should_match_name = true;
-        }
-
         let dypair = self.dylibname();
         let staticpair = self.staticlibname();
 
@@ -777,7 +773,7 @@ impl<'a> CrateLocator<'a> {
             }
         }
 
-        if self.should_match_name {
+        if self.exact_paths.is_empty() {
             if self.crate_name != root.name {
                 info!("Rejecting via crate name");
                 return None;
@@ -824,9 +820,7 @@ impl<'a> CrateLocator<'a> {
         (t.options.staticlib_prefix.clone(), t.options.staticlib_suffix.clone())
     }
 
-    fn find_commandline_library<'b, LOCS>(&mut self, locs: LOCS) -> Option<Library>
-        where LOCS: Iterator<Item = &'b String>
-    {
+    fn find_commandline_library(&mut self) -> Option<Library> {
         // First, filter out all libraries that look suspicious. We only accept
         // files which actually exist that have the correct naming scheme for
         // rlibs/dylibs.
@@ -836,10 +830,12 @@ impl<'a> CrateLocator<'a> {
         let mut rmetas = FxHashMap::default();
         let mut dylibs = FxHashMap::default();
         {
-            let locs = locs.map(|l| PathBuf::from(l)).filter(|loc| {
+                let crate_name = self.crate_name;
+                let rejected_via_filename = &mut self.rejected_via_filename;
+                let locs = self.exact_paths.iter().filter(|loc| {
                 if !loc.exists() {
                     sess.err(&format!("extern location for {} does not exist: {}",
-                                      self.crate_name,
+                                      crate_name,
                                       loc.display()));
                     return false;
                 }
@@ -847,7 +843,7 @@ impl<'a> CrateLocator<'a> {
                     Some(file) => file,
                     None => {
                         sess.err(&format!("extern location for {} is not a file: {}",
-                                          self.crate_name,
+                                          crate_name,
                                           loc.display()));
                         return false;
                     }
@@ -862,8 +858,8 @@ impl<'a> CrateLocator<'a> {
                     }
                 }
 
-                self.rejected_via_filename.push(CrateMismatch {
-                    path: loc.clone(),
+                rejected_via_filename.push(CrateMismatch {
+                    path: (*loc).clone(),
                     got: String::new(),
                 });