diff --git a/crates/ra_project_model/src/cargo_workspace.rs b/crates/ra_project_model/src/cargo_workspace.rs index 91735a72655..c1b6e1ddc38 100644 --- a/crates/ra_project_model/src/cargo_workspace.rs +++ b/crates/ra_project_model/src/cargo_workspace.rs @@ -13,7 +13,6 @@ use cargo_metadata::{BuildScript, CargoOpt, Message, MetadataCommand, PackageId} use ra_arena::{Arena, Idx}; use ra_db::Edition; use rustc_hash::FxHashMap; -use serde::Deserialize; /// `CargoWorkspace` represents the logical structure of, well, a Cargo /// workspace. It pretty closely mirrors `cargo metadata` output. @@ -43,10 +42,8 @@ impl ops::Index for CargoWorkspace { } } -// TODO: rename to CargoConfig, kill `rename_all`, kill serde dep? -#[derive(Deserialize, Clone, Debug, PartialEq, Eq)] -#[serde(rename_all = "camelCase", default)] -pub struct CargoFeatures { +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct CargoConfig { /// Do not activate the `default` feature. pub no_default_features: bool, @@ -61,9 +58,9 @@ pub struct CargoFeatures { pub load_out_dirs_from_check: bool, } -impl Default for CargoFeatures { +impl Default for CargoConfig { fn default() -> Self { - CargoFeatures { + CargoConfig { no_default_features: false, all_features: true, features: Vec::new(), @@ -142,7 +139,7 @@ impl PackageData { impl CargoWorkspace { pub fn from_cargo_metadata( cargo_toml: &Path, - cargo_features: &CargoFeatures, + cargo_features: &CargoConfig, ) -> Result { let mut meta = MetadataCommand::new(); meta.manifest_path(cargo_toml); @@ -276,7 +273,7 @@ pub struct ExternResources { pub fn load_extern_resources( cargo_toml: &Path, - cargo_features: &CargoFeatures, + cargo_features: &CargoConfig, ) -> Result { let mut cmd = Command::new(cargo_binary()); cmd.args(&["check", "--message-format=json", "--manifest-path"]).arg(cargo_toml); @@ -294,9 +291,8 @@ pub fn load_extern_resources( 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) { + for message in cargo_metadata::parse_messages(output.stdout.as_slice()) { + if let Ok(message) = message { match message { Message::BuildScriptExecuted(BuildScript { package_id, out_dir, .. }) => { res.out_dirs.insert(package_id, out_dir); diff --git a/crates/ra_project_model/src/lib.rs b/crates/ra_project_model/src/lib.rs index 444d3bb3f05..dd9c80691f3 100644 --- a/crates/ra_project_model/src/lib.rs +++ b/crates/ra_project_model/src/lib.rs @@ -19,7 +19,7 @@ use rustc_hash::FxHashMap; use serde_json::from_reader; pub use crate::{ - cargo_workspace::{CargoFeatures, CargoWorkspace, Package, Target, TargetKind}, + cargo_workspace::{CargoConfig, CargoWorkspace, Package, Target, TargetKind}, json_project::JsonProject, sysroot::Sysroot, }; @@ -78,14 +78,14 @@ impl PackageRoot { } impl ProjectWorkspace { - pub fn discover(path: &Path, cargo_features: &CargoFeatures) -> Result { + pub fn discover(path: &Path, cargo_features: &CargoConfig) -> Result { ProjectWorkspace::discover_with_sysroot(path, true, cargo_features) } pub fn discover_with_sysroot( path: &Path, with_sysroot: bool, - cargo_features: &CargoFeatures, + cargo_features: &CargoConfig, ) -> Result { match find_rust_project_json(path) { Some(json_path) => { diff --git a/crates/rust-analyzer/src/bin/main.rs b/crates/rust-analyzer/src/bin/main.rs index a3897b72808..608f4f67b2c 100644 --- a/crates/rust-analyzer/src/bin/main.rs +++ b/crates/rust-analyzer/src/bin/main.rs @@ -4,7 +4,6 @@ mod args; use lsp_server::Connection; - use rust_analyzer::{cli, config::Config, from_json, Result}; use crate::args::HelpPrinted; diff --git a/crates/rust-analyzer/src/cli/load_cargo.rs b/crates/rust-analyzer/src/cli/load_cargo.rs index 832f04226c3..2c0bde920be 100644 --- a/crates/rust-analyzer/src/cli/load_cargo.rs +++ b/crates/rust-analyzer/src/cli/load_cargo.rs @@ -8,7 +8,7 @@ use crossbeam_channel::{unbounded, Receiver}; use ra_db::{ExternSourceId, FileId, SourceRootId}; use ra_ide::{AnalysisChange, AnalysisHost}; use ra_project_model::{ - get_rustc_cfg_options, CargoFeatures, PackageRoot, ProcMacroClient, ProjectWorkspace, + get_rustc_cfg_options, CargoConfig, PackageRoot, ProcMacroClient, ProjectWorkspace, }; use ra_vfs::{RootEntry, Vfs, VfsChange, VfsTask, Watch}; use rustc_hash::{FxHashMap, FxHashSet}; @@ -29,7 +29,7 @@ pub(crate) fn load_cargo( let root = std::env::current_dir()?.join(root); let ws = ProjectWorkspace::discover( root.as_ref(), - &CargoFeatures { load_out_dirs_from_check, ..Default::default() }, + &CargoConfig { load_out_dirs_from_check, ..Default::default() }, )?; let mut extern_dirs = FxHashSet::default(); diff --git a/crates/rust-analyzer/src/config.rs b/crates/rust-analyzer/src/config.rs index e72017dcc62..57372768c43 100644 --- a/crates/rust-analyzer/src/config.rs +++ b/crates/rust-analyzer/src/config.rs @@ -10,7 +10,7 @@ use lsp_types::TextDocumentClientCapabilities; use ra_flycheck::FlycheckConfig; use ra_ide::{CompletionConfig, InlayHintsConfig}; -use ra_project_model::CargoFeatures; +use ra_project_model::CargoConfig; use serde::Deserialize; #[derive(Debug, Clone)] @@ -29,7 +29,7 @@ pub struct Config { pub lru_capacity: Option, pub use_client_watching: bool, pub exclude_globs: Vec, - pub cargo: CargoFeatures, + pub cargo: CargoConfig, pub with_sysroot: bool, } @@ -92,7 +92,7 @@ impl Default for Config { lru_capacity: None, use_client_watching: false, exclude_globs: Vec::new(), - cargo: CargoFeatures::default(), + cargo: CargoConfig::default(), with_sysroot: true, } }