}
}
-type ProcMacroLibraryImpl = ProcMacroLibraryLibloading;
-
pub struct Expander {
- inner: ProcMacroLibraryImpl,
+ inner: ProcMacroLibraryLibloading,
}
impl Expander {
- pub fn new(lib: &Path) -> Result<Expander, String> {
+ pub fn new(lib: &Path) -> io::Result<Expander> {
// Some libraries for dynamic loading require canonicalized path even when it is
// already absolute
- let lib = lib
- .canonicalize()
- .unwrap_or_else(|err| panic!("Cannot canonicalize {}: {:?}", lib.display(), err));
+ let lib = lib.canonicalize()?;
- // Copy the dylib to temp directory to prevent locking in Windows
- let lib = copy_to_temp_dir(&lib).map_err(|e| e.to_string())?;
+ let lib = ensure_file_with_lock_free_access(&lib)?;
- let library = ProcMacroLibraryImpl::open(&lib).map_err(|e| e.to_string())?;
+ let library = ProcMacroLibraryLibloading::open(&lib)?;
Ok(Expander { inner: library })
}
}
}
+/// Copy the dylib to temp directory to prevent locking in Windows
#[cfg(windows)]
-fn copy_to_temp_dir(path: &Path) -> io::Result<PathBuf> {
+fn ensure_file_with_lock_free_access(path: &Path) -> io::Result<PathBuf> {
let mut to = std::env::temp_dir();
let file_name = path.file_name().ok_or_else(|| {
io::Error::new(
}
#[cfg(unix)]
-fn copy_to_temp_dir(path: &Path) -> io::Result<PathBuf> {
+fn ensure_file_with_lock_free_access(path: &Path) -> io::Result<PathBuf> {
Ok(path.to_path_buf())
}
use ra_proc_macro::{ExpansionResult, ExpansionTask, ListMacrosResult, ListMacrosTask};
use std::{
collections::{hash_map::Entry, HashMap},
- fs::metadata,
+ fs,
path::{Path, PathBuf},
time::SystemTime,
};
}
fn expander(&mut self, path: &Path) -> Result<&dylib::Expander, String> {
- let time = metadata(path)
- .and_then(|it| it.modified())
- .map_err(|err| format!("Failed to file metadata for {}: {:?}", path.display(), err))?;
+ let time = fs::metadata(path).and_then(|it| it.modified()).map_err(|err| {
+ format!("Failed to get file metadata for {}: {:?}", path.display(), err)
+ })?;
Ok(match self.expanders.entry((path.to_path_buf(), time)) {
Entry::Vacant(v) => v.insert(dylib::Expander::new(path).map_err(|err| {