From 8d278297815e9034cc52670b468732e7d7ff7d55 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 31 Mar 2020 18:43:22 +0200 Subject: Reduce deps --- Cargo.lock | 1 - crates/ra_flycheck/src/lib.rs | 2 +- crates/ra_project_model/Cargo.toml | 1 - crates/ra_project_model/src/cargo_workspace.rs | 75 +++++++++++++------------- 4 files changed, 40 insertions(+), 39 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bdbb316cd..9a1a05683 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1103,7 +1103,6 @@ dependencies = [ "ra_arena", "ra_cfg", "ra_db", - "ra_flycheck", "ra_proc_macro", "rustc-hash", "serde", diff --git a/crates/ra_flycheck/src/lib.rs b/crates/ra_flycheck/src/lib.rs index 77ede8f63..38940a77b 100644 --- a/crates/ra_flycheck/src/lib.rs +++ b/crates/ra_flycheck/src/lib.rs @@ -243,7 +243,7 @@ impl fmt::Display for CargoError { } impl error::Error for CargoError {} -pub fn run_cargo( +fn run_cargo( args: &[String], current_dir: Option<&Path>, on_message: &mut dyn FnMut(cargo_metadata::Message) -> bool, diff --git a/crates/ra_project_model/Cargo.toml b/crates/ra_project_model/Cargo.toml index c3b7a8f74..b10644b4b 100644 --- a/crates/ra_project_model/Cargo.toml +++ b/crates/ra_project_model/Cargo.toml @@ -16,7 +16,6 @@ cargo_metadata = "0.9.1" ra_arena = { path = "../ra_arena" } ra_db = { path = "../ra_db" } ra_cfg = { path = "../ra_cfg" } -ra_flycheck = { path = "../ra_flycheck" } ra_proc_macro = { path = "../ra_proc_macro" } serde = { version = "1.0.104", features = ["derive"] } diff --git a/crates/ra_project_model/src/cargo_workspace.rs b/crates/ra_project_model/src/cargo_workspace.rs index 78ea2ab58..f4fd6ad28 100644 --- a/crates/ra_project_model/src/cargo_workspace.rs +++ b/crates/ra_project_model/src/cargo_workspace.rs @@ -1,16 +1,17 @@ //! FIXME: write short doc here use std::{ + env, ffi::OsStr, ops, path::{Path, PathBuf}, + process::Command, }; use anyhow::{Context, Result}; use cargo_metadata::{BuildScript, CargoOpt, Message, MetadataCommand, PackageId}; use ra_arena::{Arena, Idx}; use ra_db::Edition; -use ra_flycheck::run_cargo; use rustc_hash::FxHashMap; use serde::Deserialize; @@ -163,7 +164,7 @@ impl CargoWorkspace { let mut out_dir_by_id = FxHashMap::default(); let mut proc_macro_dylib_paths = FxHashMap::default(); if cargo_features.load_out_dirs_from_check { - let resources = load_extern_resources(cargo_toml, cargo_features); + let resources = load_extern_resources(cargo_toml, cargo_features)?; out_dir_by_id = resources.out_dirs; proc_macro_dylib_paths = resources.proc_dylib_paths; } @@ -272,53 +273,51 @@ pub struct ExternResources { proc_dylib_paths: FxHashMap, } -pub fn load_extern_resources(cargo_toml: &Path, cargo_features: &CargoFeatures) -> ExternResources { - let mut args: Vec = vec![ - "check".to_string(), - "--message-format=json".to_string(), - "--manifest-path".to_string(), - cargo_toml.display().to_string(), - ]; - +pub fn load_extern_resources( + cargo_toml: &Path, + cargo_features: &CargoFeatures, +) -> Result { + let mut cmd = Command::new(cargo_binary()); + cmd.args(&["check", "--message-format=json", "--manifest-path"]).arg(cargo_toml); if cargo_features.all_features { - args.push("--all-features".to_string()); + cmd.arg("--all-features"); } else if cargo_features.no_default_features { // FIXME: `NoDefaultFeatures` is mutual exclusive with `SomeFeatures` // https://github.com/oli-obk/cargo_metadata/issues/79 - args.push("--no-default-features".to_string()); + cmd.arg("--no-default-features"); } else { - args.extend(cargo_features.features.iter().cloned()); + cmd.args(&cargo_features.features); } - let mut acc = ExternResources::default(); - let res = run_cargo(&args, cargo_toml.parent(), &mut |message| { - match message { - Message::BuildScriptExecuted(BuildScript { package_id, out_dir, .. }) => { - acc.out_dirs.insert(package_id, out_dir); - } + let output = cmd.output()?; + + let mut res = ExternResources::default(); + + let stdout = String::from_utf8(output.stdout)?; + for line in stdout.lines() { + if let Ok(message) = serde_json::from_str::(&line) { + match message { + Message::BuildScriptExecuted(BuildScript { package_id, out_dir, .. }) => { + res.out_dirs.insert(package_id, out_dir); + } - Message::CompilerArtifact(message) => { - if message.target.kind.contains(&"proc-macro".to_string()) { - let package_id = message.package_id; - // 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()); + Message::CompilerArtifact(message) => { + if message.target.kind.contains(&"proc-macro".to_string()) { + let package_id = message.package_id; + // Skip rmeta file + if let Some(filename) = + message.filenames.iter().filter(|name| is_dylib(name)).next() + { + res.proc_dylib_paths.insert(package_id, filename.clone()); + } } } + Message::CompilerMessage(_) => (), + Message::Unknown => (), } - Message::CompilerMessage(_) => (), - Message::Unknown => (), } - true - }); - - if let Err(err) = res { - log::error!("Failed to load outdirs: {:?}", err); } - - acc + Ok(res) } // FIXME: File a better way to know if it is a dylib @@ -328,3 +327,7 @@ fn is_dylib(path: &Path) -> bool { Some(ext) => matches!(ext.as_str(), "dll" | "dylib" | "so"), } } + +fn cargo_binary() -> String { + env::var("CARGO").unwrap_or_else(|_| "cargo".to_string()) +} -- cgit v1.2.3