Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 11 additions & 15 deletions crates/ra_flycheck/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,33 +24,32 @@ pub use crate::conv::url_from_path_with_drive_lowercasing;

#[derive(Clone, Debug)]
pub struct CheckConfig {
pub enable: bool,
pub args: Vec<String>,
pub command: String,
pub all_targets: bool,
}

/// CheckWatcher wraps the shared state and communication machinery used for
/// Flycheck wraps the shared state and communication machinery used for
/// running `cargo check` (or other compatible command) and providing
/// diagnostics based on the output.
/// The spawned thread is shut down when this struct is dropped.
#[derive(Debug)]
pub struct CheckWatcher {
pub struct Flycheck {
// XXX: drop order is significant
cmd_send: Sender<CheckCommand>,
handle: Option<jod_thread::JoinHandle<()>>,
handle: jod_thread::JoinHandle<()>,
pub task_recv: Receiver<CheckTask>,
}

impl CheckWatcher {
pub fn new(config: CheckConfig, workspace_root: PathBuf) -> CheckWatcher {
impl Flycheck {
pub fn new(config: CheckConfig, workspace_root: PathBuf) -> Flycheck {
let (task_send, task_recv) = unbounded::<CheckTask>();
let (cmd_send, cmd_recv) = unbounded::<CheckCommand>();
let handle = jod_thread::spawn(move || {
let mut check = CheckWatcherThread::new(config, workspace_root);
let mut check = FlycheckThread::new(config, workspace_root);
check.run(&task_send, &cmd_recv);
});
CheckWatcher { task_recv, cmd_send, handle: Some(handle) }
Flycheck { task_recv, cmd_send, handle }
}

/// Schedule a re-start of the cargo check worker.
Expand All @@ -76,7 +75,7 @@ pub enum CheckCommand {
Update,
}

struct CheckWatcherThread {
struct FlycheckThread {
options: CheckConfig,
workspace_root: PathBuf,
last_update_req: Option<Instant>,
Expand All @@ -90,9 +89,9 @@ struct CheckWatcherThread {
check_process: Option<jod_thread::JoinHandle<()>>,
}

impl CheckWatcherThread {
fn new(options: CheckConfig, workspace_root: PathBuf) -> CheckWatcherThread {
CheckWatcherThread {
impl FlycheckThread {
fn new(options: CheckConfig, workspace_root: PathBuf) -> FlycheckThread {
FlycheckThread {
options,
workspace_root,
last_update_req: None,
Expand Down Expand Up @@ -216,9 +215,6 @@ impl CheckWatcherThread {
// First, clear and cancel the old thread
self.message_recv = never();
self.check_process = None;
if !self.options.enable {
return;
}

let mut args: Vec<String> = vec![
self.options.command.clone(),
Expand Down
23 changes: 13 additions & 10 deletions crates/rust-analyzer/src/main_loop.rs
Original file line number Diff line number Diff line change
Expand Up @@ -101,11 +101,14 @@ fn get_config(
chaining_hints: config.inlay_hints_chaining,
max_length: config.inlay_hints_max_length,
},
check: CheckConfig {
enable: config.cargo_watch_enable,
args: config.cargo_watch_args.clone(),
command: config.cargo_watch_command.clone(),
all_targets: config.cargo_watch_all_targets,
check: if config.cargo_watch_enable {
Some(CheckConfig {
args: config.cargo_watch_args.clone(),
command: config.cargo_watch_command.clone(),
all_targets: config.cargo_watch_all_targets,
})
} else {
None
},
rustfmt_args: config.rustfmt_args.clone(),
vscode_lldb: config.vscode_lldb,
Expand Down Expand Up @@ -240,7 +243,7 @@ pub fn main_loop(
Err(RecvError) => return Err("vfs died".into()),
},
recv(libdata_receiver) -> data => Event::Lib(data.unwrap()),
recv(world_state.check_watcher.as_ref().map_or(&never(), |it| &it.task_recv)) -> task => match task {
recv(world_state.flycheck.as_ref().map_or(&never(), |it| &it.task_recv)) -> task => match task {
Ok(task) => Event::CheckWatcher(task),
Err(RecvError) => return Err("check watcher died".into()),
}
Expand Down Expand Up @@ -481,8 +484,8 @@ fn loop_turn(
&& loop_state.in_flight_libraries == 0
{
loop_state.workspace_loaded = true;
if let Some(check_watcher) = &world_state.check_watcher {
check_watcher.update();
if let Some(flycheck) = &world_state.flycheck {
flycheck.update();
}
pool.execute({
let subs = loop_state.subscriptions.subscriptions();
Expand Down Expand Up @@ -654,8 +657,8 @@ fn on_notification(
};
let not = match notification_cast::<req::DidSaveTextDocument>(not) {
Ok(_params) => {
if let Some(check_watcher) = &state.check_watcher {
check_watcher.update();
if let Some(flycheck) = &state.flycheck {
flycheck.update();
}
return Ok(());
}
Expand Down
18 changes: 10 additions & 8 deletions crates/rust-analyzer/src/world.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ use std::{
use crossbeam_channel::{unbounded, Receiver};
use lsp_types::Url;
use parking_lot::RwLock;
use ra_flycheck::{url_from_path_with_drive_lowercasing, CheckConfig, CheckWatcher};
use ra_flycheck::{url_from_path_with_drive_lowercasing, CheckConfig, Flycheck};
use ra_ide::{
Analysis, AnalysisChange, AnalysisHost, CrateGraph, FileId, InlayHintsConfig, LibraryData,
SourceRootId,
Expand All @@ -31,7 +31,9 @@ use crate::{
use ra_db::ExternSourceId;
use rustc_hash::{FxHashMap, FxHashSet};

fn create_watcher(workspaces: &[ProjectWorkspace], config: &Config) -> Option<CheckWatcher> {
fn create_flycheck(workspaces: &[ProjectWorkspace], config: &Config) -> Option<Flycheck> {
let check_config = config.check.as_ref()?;

// FIXME: Figure out the multi-workspace situation
workspaces
.iter()
Expand All @@ -41,7 +43,7 @@ fn create_watcher(workspaces: &[ProjectWorkspace], config: &Config) -> Option<Ch
})
.map(|cargo| {
let cargo_project_root = cargo.workspace_root().to_path_buf();
Some(CheckWatcher::new(config.check.clone(), cargo_project_root))
Some(Flycheck::new(check_config.clone(), cargo_project_root))
})
.unwrap_or_else(|| {
log::warn!("Cargo check watching only supported for cargo workspaces, disabling");
Expand All @@ -56,7 +58,7 @@ pub struct Config {
pub line_folding_only: bool,
pub inlay_hints: InlayHintsConfig,
pub rustfmt_args: Vec<String>,
pub check: CheckConfig,
pub check: Option<CheckConfig>,
pub vscode_lldb: bool,
pub proc_macro_srv: Option<String>,
}
Expand All @@ -76,7 +78,7 @@ pub struct WorldState {
pub vfs: Arc<RwLock<Vfs>>,
pub task_receiver: Receiver<VfsTask>,
pub latest_requests: Arc<RwLock<LatestRequests>>,
pub check_watcher: Option<CheckWatcher>,
pub flycheck: Option<Flycheck>,
pub diagnostics: DiagnosticCollection,
}

Expand Down Expand Up @@ -201,7 +203,7 @@ impl WorldState {
});
change.set_crate_graph(crate_graph);

let check_watcher = create_watcher(&workspaces, &config);
let flycheck = create_flycheck(&workspaces, &config);

let mut analysis_host = AnalysisHost::new(lru_capacity);
analysis_host.apply_change(change);
Expand All @@ -214,7 +216,7 @@ impl WorldState {
vfs: Arc::new(RwLock::new(vfs)),
task_receiver,
latest_requests: Default::default(),
check_watcher,
flycheck,
diagnostics: Default::default(),
}
}
Expand All @@ -227,7 +229,7 @@ impl WorldState {
) {
self.feature_flags = Arc::new(feature_flags);
self.analysis_host.update_lru_capacity(lru_capacity);
self.check_watcher = create_watcher(&self.workspaces, &config);
self.flycheck = create_flycheck(&self.workspaces, &config);
self.config = config;
}

Expand Down