From 74c26a785ad8e8ef857b903d3639beb623077933 Mon Sep 17 00:00:00 2001 From: Aaron Wood Date: Tue, 15 Sep 2020 18:51:57 -0700 Subject: Add support for custom flycheck commands with JSON project workspaces Enable flychecks with JSON project workspaces if an override command was provided as part of the client configuration. --- crates/project_model/src/project_json.rs | 8 ++++++++ crates/rust-analyzer/src/reload.rs | 18 +++++++++++------- 2 files changed, 19 insertions(+), 7 deletions(-) (limited to 'crates') diff --git a/crates/project_model/src/project_json.rs b/crates/project_model/src/project_json.rs index 979e90058..545f254aa 100644 --- a/crates/project_model/src/project_json.rs +++ b/crates/project_model/src/project_json.rs @@ -13,6 +13,7 @@ use crate::cfg_flag::CfgFlag; #[derive(Clone, Debug, Eq, PartialEq)] pub struct ProjectJson { pub(crate) sysroot_src: Option, + project_root: Option, crates: Vec, } @@ -36,6 +37,7 @@ impl ProjectJson { pub fn new(base: &AbsPath, data: ProjectJsonData) -> ProjectJson { ProjectJson { sysroot_src: data.sysroot_src.map(|it| base.join(it)), + project_root: base.parent().map(AbsPath::to_path_buf), crates: data .crates .into_iter() @@ -89,6 +91,12 @@ impl ProjectJson { pub fn crates(&self) -> impl Iterator + '_ { self.crates.iter().enumerate().map(|(idx, krate)| (CrateId(idx as u32), krate)) } + pub fn path(&self) -> Option<&AbsPath> { + match &self.project_root { + Some(p) => Some(p.as_path()), + None => None, + } + } } #[derive(Deserialize)] diff --git a/crates/rust-analyzer/src/reload.rs b/crates/rust-analyzer/src/reload.rs index bab6f8a71..b819618cb 100644 --- a/crates/rust-analyzer/src/reload.rs +++ b/crates/rust-analyzer/src/reload.rs @@ -2,7 +2,7 @@ use std::{mem, sync::Arc}; use base_db::{CrateGraph, SourceRoot, VfsPath}; -use flycheck::FlycheckHandle; +use flycheck::{FlycheckConfig, FlycheckHandle}; use ide::AnalysisChange; use project_model::{ProcMacroClient, ProjectWorkspace}; use vfs::{file_set::FileSetConfig, AbsPath, AbsPathBuf, ChangeKind}; @@ -244,13 +244,17 @@ impl GlobalState { .iter() // FIXME: Figure out the multi-workspace situation .find_map(|w| match w { - ProjectWorkspace::Cargo { cargo, sysroot: _ } => Some(cargo), - ProjectWorkspace::Json { .. } => None, - }) - .map(move |cargo| { - let cargo_project_root = cargo.workspace_root().to_path_buf(); - FlycheckHandle::spawn(sender, config, cargo_project_root.into()) + ProjectWorkspace::Cargo { cargo, sysroot: _ } => Some(cargo.workspace_root()), + ProjectWorkspace::Json { project, .. } => { + // Enable flychecks for json projects if a custom flycheck command was supplied + // in the workspace configuration. + match config { + FlycheckConfig::CustomCommand { .. } => project.path(), + _ => None, + } + } }) + .map(move |root| FlycheckHandle::spawn(sender, config, root.to_path_buf().into())) } } -- cgit v1.2.3