mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-14 14:13:58 +00:00
Run flycheck only on crate if target is binary.
This commit is contained in:
parent
b02c214132
commit
ffc3bfe435
3 changed files with 58 additions and 27 deletions
|
@ -118,14 +118,14 @@ impl FlycheckHandle {
|
|||
}
|
||||
|
||||
/// Schedule a re-start of the cargo check worker to do a workspace wide check.
|
||||
pub(crate) fn restart_workspace(&self, saved_file: Option<AbsPathBuf>) {
|
||||
self.sender.send(StateChange::Restart { package: None, saved_file }).unwrap();
|
||||
pub(crate) fn restart_workspace(&self, saved_file: Option<AbsPathBuf>, target: Option<String>) {
|
||||
self.sender.send(StateChange::Restart { package: None, saved_file, target }).unwrap();
|
||||
}
|
||||
|
||||
/// Schedule a re-start of the cargo check worker to do a package wide check.
|
||||
pub(crate) fn restart_for_package(&self, package: String) {
|
||||
pub(crate) fn restart_for_package(&self, package: String, target: Option<String>) {
|
||||
self.sender
|
||||
.send(StateChange::Restart { package: Some(package), saved_file: None })
|
||||
.send(StateChange::Restart { package: Some(package), saved_file: None, target })
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
|
@ -183,7 +183,7 @@ pub(crate) enum Progress {
|
|||
}
|
||||
|
||||
enum StateChange {
|
||||
Restart { package: Option<String>, saved_file: Option<AbsPathBuf> },
|
||||
Restart { package: Option<String>, saved_file: Option<AbsPathBuf>, target: Option<String> },
|
||||
Cancel,
|
||||
}
|
||||
|
||||
|
@ -271,7 +271,7 @@ impl FlycheckActor {
|
|||
tracing::debug!(flycheck_id = self.id, "flycheck cancelled");
|
||||
self.cancel_check_process();
|
||||
}
|
||||
Event::RequestStateChange(StateChange::Restart { package, saved_file }) => {
|
||||
Event::RequestStateChange(StateChange::Restart { package, saved_file, target }) => {
|
||||
// Cancel the previously spawned process
|
||||
self.cancel_check_process();
|
||||
while let Ok(restart) = inbox.recv_timeout(Duration::from_millis(50)) {
|
||||
|
@ -281,8 +281,11 @@ impl FlycheckActor {
|
|||
}
|
||||
}
|
||||
|
||||
let command =
|
||||
match self.check_command(package.as_deref(), saved_file.as_deref()) {
|
||||
let command = match self.check_command(
|
||||
package.as_deref(),
|
||||
saved_file.as_deref(),
|
||||
target.as_deref(),
|
||||
) {
|
||||
Some(c) => c,
|
||||
None => continue,
|
||||
};
|
||||
|
@ -381,6 +384,7 @@ impl FlycheckActor {
|
|||
&self,
|
||||
package: Option<&str>,
|
||||
saved_file: Option<&AbsPath>,
|
||||
bin_target: Option<&str>,
|
||||
) -> Option<Command> {
|
||||
match &self.config {
|
||||
FlycheckConfig::CargoCommand { command, options, ansi_color_output } => {
|
||||
|
@ -396,6 +400,10 @@ impl FlycheckActor {
|
|||
None => cmd.arg("--workspace"),
|
||||
};
|
||||
|
||||
if let Some(tgt) = bin_target {
|
||||
cmd.arg("--bin").arg(tgt);
|
||||
}
|
||||
|
||||
cmd.arg(if *ansi_color_output {
|
||||
"--message-format=json-diagnostic-rendered-ansi"
|
||||
} else {
|
||||
|
|
|
@ -20,6 +20,7 @@ use crate::{
|
|||
lsp_ext::{self, RunFlycheckParams},
|
||||
mem_docs::DocumentData,
|
||||
reload,
|
||||
target_spec::TargetSpec,
|
||||
};
|
||||
|
||||
pub(crate) fn handle_cancel(state: &mut GlobalState, params: CancelParams) -> anyhow::Result<()> {
|
||||
|
@ -185,7 +186,7 @@ pub(crate) fn handle_did_save_text_document(
|
|||
} else if state.config.check_on_save() {
|
||||
// No specific flycheck was triggered, so let's trigger all of them.
|
||||
for flycheck in state.flycheck.iter() {
|
||||
flycheck.restart_workspace(None);
|
||||
flycheck.restart_workspace(None, None);
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
|
@ -287,16 +288,33 @@ fn run_flycheck(state: &mut GlobalState, vfs_path: VfsPath) -> bool {
|
|||
let world = state.snapshot();
|
||||
let mut updated = false;
|
||||
let task = move || -> std::result::Result<(), ide::Cancelled> {
|
||||
// Is the target binary? If so we let flycheck run only for the workspace that contains the crate.
|
||||
let target_is_bin = TargetSpec::for_file(&world, file_id)?.and_then(|x| {
|
||||
if x.target_kind() == project_model::TargetKind::Bin {
|
||||
return match x {
|
||||
TargetSpec::Cargo(c) => Some(c.target),
|
||||
TargetSpec::ProjectJson(p) => Some(p.label),
|
||||
};
|
||||
}
|
||||
|
||||
None
|
||||
});
|
||||
|
||||
let crate_ids = if target_is_bin.is_some() {
|
||||
// Trigger flychecks for the only workspace which the binary crate belongs to
|
||||
world.analysis.crates_for(file_id)?.into_iter().unique().collect::<Vec<_>>()
|
||||
} else {
|
||||
// Trigger flychecks for all workspaces that depend on the saved file
|
||||
// Crates containing or depending on the saved file
|
||||
let crate_ids: Vec<_> = world
|
||||
world
|
||||
.analysis
|
||||
.crates_for(file_id)?
|
||||
.into_iter()
|
||||
.flat_map(|id| world.analysis.transitive_rev_deps(id))
|
||||
.flatten()
|
||||
.unique()
|
||||
.collect();
|
||||
.collect::<Vec<_>>()
|
||||
};
|
||||
|
||||
let crate_root_paths: Vec<_> = crate_ids
|
||||
.iter()
|
||||
|
@ -347,8 +365,11 @@ fn run_flycheck(state: &mut GlobalState, vfs_path: VfsPath) -> bool {
|
|||
if id == flycheck.id() {
|
||||
updated = true;
|
||||
match package.filter(|_| !world.config.flycheck_workspace()) {
|
||||
Some(package) => flycheck.restart_for_package(package),
|
||||
None => flycheck.restart_workspace(saved_file.clone()),
|
||||
Some(package) => {
|
||||
flycheck.restart_for_package(package, target_is_bin.clone())
|
||||
}
|
||||
None => flycheck
|
||||
.restart_workspace(saved_file.clone(), target_is_bin.clone()),
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
@ -357,7 +378,7 @@ fn run_flycheck(state: &mut GlobalState, vfs_path: VfsPath) -> bool {
|
|||
// No specific flycheck was triggered, so let's trigger all of them.
|
||||
if !updated {
|
||||
for flycheck in world.flycheck.iter() {
|
||||
flycheck.restart_workspace(saved_file.clone());
|
||||
flycheck.restart_workspace(saved_file.clone(), None);
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
|
@ -399,7 +420,7 @@ pub(crate) fn handle_run_flycheck(
|
|||
}
|
||||
// No specific flycheck was triggered, so let's trigger all of them.
|
||||
for flycheck in state.flycheck.iter() {
|
||||
flycheck.restart_workspace(None);
|
||||
flycheck.restart_workspace(None, None);
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
@ -406,7 +406,9 @@ impl GlobalState {
|
|||
if became_quiescent {
|
||||
if self.config.check_on_save() {
|
||||
// Project has loaded properly, kick off initial flycheck
|
||||
self.flycheck.iter().for_each(|flycheck| flycheck.restart_workspace(None));
|
||||
self.flycheck
|
||||
.iter()
|
||||
.for_each(|flycheck| flycheck.restart_workspace(None, None));
|
||||
}
|
||||
if self.config.prefill_caches() {
|
||||
self.prime_caches_queue.request_op("became quiescent".to_owned(), ());
|
||||
|
|
Loading…
Reference in a new issue