diff options
| author | Nicholas Nethercote <n.nethercote@gmail.com> | 2022-02-02 13:16:25 +1100 |
|---|---|---|
| committer | Nicholas Nethercote <n.nethercote@gmail.com> | 2022-02-02 13:16:25 +1100 |
| commit | 0ba47f32160d4c51717b4da6449f40079a5eb317 (patch) | |
| tree | a470dc615528e53bac5cf48394e6862429b37403 | |
| parent | 89b61ea09f03060ceac3d0a1779dbb4152b6fddd (diff) | |
| download | rust-0ba47f32160d4c51717b4da6449f40079a5eb317.tar.gz rust-0ba47f32160d4c51717b4da6449f40079a5eb317.zip | |
Make `SearchPathFile::file_name_str` non-optional.
Currently, it can be `None` if the conversion from `OsString` fails, in which case all searches will skip over the `SearchPathFile`. The commit changes things so that the `SearchPathFile` just doesn't get created in the first place. Same behaviour, but slightly simpler code.
| -rw-r--r-- | compiler/rustc_metadata/src/locator.rs | 5 | ||||
| -rw-r--r-- | compiler/rustc_session/src/search_paths.rs | 26 |
2 files changed, 14 insertions, 17 deletions
diff --git a/compiler/rustc_metadata/src/locator.rs b/compiler/rustc_metadata/src/locator.rs index f65cd73007b..caa544284c9 100644 --- a/compiler/rustc_metadata/src/locator.rs +++ b/compiler/rustc_metadata/src/locator.rs @@ -399,10 +399,7 @@ impl<'a> CrateLocator<'a> { for spf in search_path.files.iter() { debug!("testing {}", spf.path.display()); - let file = match &spf.file_name_str { - None => continue, - Some(file) => file, - }; + let file = &spf.file_name_str; let (hash, found_kind) = if file.starts_with(&rlib_prefix) && file.ends_with(".rlib") { diff --git a/compiler/rustc_session/src/search_paths.rs b/compiler/rustc_session/src/search_paths.rs index acb6c735e05..b6bde28233d 100644 --- a/compiler/rustc_session/src/search_paths.rs +++ b/compiler/rustc_session/src/search_paths.rs @@ -15,22 +15,15 @@ pub struct SearchPath { /// doable, but very slow, because it involves calls to `file_name` and /// `extension` that are themselves slow. /// -/// This type augments the `PathBuf` with an `Option<String>` containing the +/// This type augments the `PathBuf` with an `String` containing the /// `PathBuf`'s filename. The prefix and suffix checking is much faster on the -/// `Option<String>` than the `PathBuf`. (It's an `Option` because -/// `Path::file_name` can fail; if that happens then all subsequent checking -/// will also fail, which is fine.) +/// `String` than the `PathBuf`. (The filename must be valid UTF-8. If it's +/// not, the entry should be skipped, because all Rust output files are valid +/// UTF-8, and so a non-UTF-8 filename couldn't be one we're looking for.) #[derive(Clone, Debug)] pub struct SearchPathFile { pub path: PathBuf, - pub file_name_str: Option<String>, -} - -impl SearchPathFile { - fn new(path: PathBuf) -> SearchPathFile { - let file_name_str = path.file_name().and_then(|f| f.to_str()).map(|s| s.to_string()); - SearchPathFile { path, file_name_str } - } + pub file_name_str: String, } #[derive(PartialEq, Clone, Copy, Debug, Hash, Eq, Encodable, Decodable)] @@ -85,7 +78,14 @@ impl SearchPath { // Get the files within the directory. let files = match std::fs::read_dir(&dir) { Ok(files) => files - .filter_map(|e| e.ok().map(|e| SearchPathFile::new(e.path()))) + .filter_map(|e| { + e.ok().and_then(|e| { + e.file_name().to_str().map(|s| SearchPathFile { + path: e.path(), + file_name_str: s.to_string(), + }) + }) + }) .collect::<Vec<_>>(), Err(..) => vec![], }; |
