From 69be18d4e2c5783978f2c8dfcabf8a6fca5aa99c Mon Sep 17 00:00:00 2001 From: Tamir Duberstein Date: Tue, 15 Oct 2024 11:19:06 -0400 Subject: [PATCH] rustc_metadata: reduce repetition --- compiler/rustc_metadata/src/locator.rs | 45 +++++++++++--------------- 1 file changed, 18 insertions(+), 27 deletions(-) diff --git a/compiler/rustc_metadata/src/locator.rs b/compiler/rustc_metadata/src/locator.rs index bc2f6c11552..35954ea088d 100644 --- a/compiler/rustc_metadata/src/locator.rs +++ b/compiler/rustc_metadata/src/locator.rs @@ -709,40 +709,31 @@ fn find_commandline_library(&mut self) -> Result, CrateError> { let mut rmetas = FxIndexMap::default(); let mut dylibs = FxIndexMap::default(); for loc in &self.exact_paths { - if !loc.canonicalized().exists() { - return Err(CrateError::ExternLocationNotExist( - self.crate_name, - loc.original().clone(), - )); + let loc_canon = loc.canonicalized(); + let loc_orig = loc.original(); + if !loc_canon.exists() { + return Err(CrateError::ExternLocationNotExist(self.crate_name, loc_orig.clone())); } - if !loc.original().is_file() { - return Err(CrateError::ExternLocationNotFile( - self.crate_name, - loc.original().clone(), - )); + if !loc_orig.is_file() { + return Err(CrateError::ExternLocationNotFile(self.crate_name, loc_orig.clone())); } - let Some(file) = loc.original().file_name().and_then(|s| s.to_str()) else { - return Err(CrateError::ExternLocationNotFile( - self.crate_name, - loc.original().clone(), - )); + // Note to take care and match against the non-canonicalized name: + // some systems save build artifacts into content-addressed stores + // that do not preserve extensions, and then link to them using + // e.g. symbolic links. If we canonicalize too early, we resolve + // the symlink, the file type is lost and we might treat rlibs and + // rmetas as dylibs. + let Some(file) = loc_orig.file_name().and_then(|s| s.to_str()) else { + return Err(CrateError::ExternLocationNotFile(self.crate_name, loc_orig.clone())); }; - if file.starts_with("lib") && (file.ends_with(".rlib") || file.ends_with(".rmeta")) || file.starts_with(self.target.dll_prefix.as_ref()) && file.ends_with(self.target.dll_suffix.as_ref()) { - // Note to take care and match against the non-canonicalized name: - // some systems save build artifacts into content-addressed stores - // that do not preserve extensions, and then link to them using - // e.g. symbolic links. If we canonicalize too early, we resolve - // the symlink, the file type is lost and we might treat rlibs and - // rmetas as dylibs. - let loc_canon = loc.canonicalized().clone(); - let loc = loc.original(); - if loc.file_name().unwrap().to_str().unwrap().ends_with(".rlib") { + let loc_canon = loc_canon.clone(); + if file.ends_with(".rlib") { rlibs.insert(loc_canon, PathKind::ExternFlag); - } else if loc.file_name().unwrap().to_str().unwrap().ends_with(".rmeta") { + } else if file.ends_with(".rmeta") { rmetas.insert(loc_canon, PathKind::ExternFlag); } else { dylibs.insert(loc_canon, PathKind::ExternFlag); @@ -750,7 +741,7 @@ fn find_commandline_library(&mut self) -> Result, CrateError> { } else { self.crate_rejections .via_filename - .push(CrateMismatch { path: loc.original().clone(), got: String::new() }); + .push(CrateMismatch { path: loc_orig.clone(), got: String::new() }); } }