From 503cbd3f4b54f3be224d7a4221fa023f0e35d228 Mon Sep 17 00:00:00 2001 From: Edwin Cheng Date: Fri, 27 Mar 2020 04:26:34 +0800 Subject: Implement ra_proc_macro client logic --- crates/ra_project_model/src/cargo_workspace.rs | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) (limited to 'crates/ra_project_model/src') diff --git a/crates/ra_project_model/src/cargo_workspace.rs b/crates/ra_project_model/src/cargo_workspace.rs index 738fd6f61..32592e660 100644 --- a/crates/ra_project_model/src/cargo_workspace.rs +++ b/crates/ra_project_model/src/cargo_workspace.rs @@ -1,6 +1,7 @@ //! FIXME: write short doc here use std::{ + ffi::OsStr, ops, path::{Path, PathBuf}, }; @@ -299,7 +300,10 @@ pub fn load_extern_resources(cargo_toml: &Path, cargo_features: &CargoFeatures) Message::CompilerArtifact(message) => { if message.target.kind.contains(&"proc-macro".to_string()) { let package_id = message.package_id; - if let Some(filename) = message.filenames.get(0) { + // Skip rmeta file + if let Some(filename) = + message.filenames.iter().filter(|name| is_dylib(name)).next() + { acc.proc_dylib_paths.insert(package_id, filename.clone()); } } @@ -316,3 +320,19 @@ pub fn load_extern_resources(cargo_toml: &Path, cargo_features: &CargoFeatures) acc } + +// FIXME: File a better way to know if it is a dylib +fn is_dylib(path: &Path) -> bool { + let ext = match path.extension().and_then(OsStr::to_str).map(|it| it.to_string().to_lowercase()) + { + None => return false, + Some(ext) => ext, + }; + + match ext.as_str() { + "dll" => true, + "dylib" => true, + "so" => true, + _ => false, + } +} -- cgit v1.2.3