Auto merge of #13792 - Veykril:flycheck, r=Veykril

Add a command to clear flycheck diagnostics

And document the flycheck notifications
This commit is contained in:
bors 2022-12-17 22:45:08 +00:00
commit 9ed1829f1f
9 changed files with 85 additions and 35 deletions

View File

@ -1125,11 +1125,8 @@ pub fn rustfmt(&self) -> RustfmtConfig {
}
}
pub fn flycheck(&self) -> Option<FlycheckConfig> {
if !self.data.checkOnSave_enable {
return None;
}
let flycheck_config = match &self.data.checkOnSave_overrideCommand {
pub fn flycheck(&self) -> FlycheckConfig {
match &self.data.checkOnSave_overrideCommand {
Some(args) if !args.is_empty() => {
let mut args = args.clone();
let command = args.remove(0);
@ -1183,8 +1180,11 @@ pub fn flycheck(&self) -> Option<FlycheckConfig> {
extra_args: self.data.checkOnSave_extraArgs.clone(),
extra_env: self.check_on_save_extra_env(),
},
};
Some(flycheck_config)
}
}
pub fn check_on_save(&self) -> bool {
self.data.checkOnSave_enable
}
pub fn runnables(&self) -> RunnablesConfig {

View File

@ -132,9 +132,8 @@ pub struct ExpandedMacro {
pub enum CancelFlycheck {}
impl Request for CancelFlycheck {
impl Notification for CancelFlycheck {
type Params = ();
type Result = ();
const METHOD: &'static str = "rust-analyzer/cancelFlycheck";
}
@ -145,6 +144,13 @@ impl Notification for RunFlycheck {
const METHOD: &'static str = "rust-analyzer/runFlycheck";
}
pub enum ClearFlycheck {}
impl Notification for ClearFlycheck {
type Params = ();
const METHOD: &'static str = "rust-analyzer/clearFlycheck";
}
#[derive(Deserialize, Serialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct RunFlycheckParams {

View File

@ -581,10 +581,7 @@ fn handle_flycheck_msg(&mut self, message: flycheck::Message) {
// When we're running multiple flychecks, we have to include a disambiguator in
// the title, or the editor complains. Note that this is a user-facing string.
let title = if self.flycheck.len() == 1 {
match self.config.flycheck() {
Some(config) => format!("{}", config),
None => "cargo check".to_string(),
}
format!("{}", self.config.flycheck())
} else {
format!("cargo check (#{})", id + 1)
};
@ -593,7 +590,7 @@ fn handle_flycheck_msg(&mut self, message: flycheck::Message) {
state,
message,
None,
Some(format!("rust-analyzer/checkOnSave/{}", id)),
Some(format!("rust-analyzer/flycheck/{}", id)),
);
}
}
@ -638,7 +635,6 @@ fn on_request(&mut self, req: Request) {
.on_sync_mut::<lsp_ext::ReloadWorkspace>(handlers::handle_workspace_reload)
.on_sync_mut::<lsp_ext::MemoryUsage>(handlers::handle_memory_usage)
.on_sync_mut::<lsp_ext::ShuffleCrateGraph>(handlers::handle_shuffle_crate_graph)
.on_sync_mut::<lsp_ext::CancelFlycheck>(handlers::handle_cancel_flycheck)
.on_sync::<lsp_ext::JoinLines>(handlers::handle_join_lines)
.on_sync::<lsp_ext::OnEnter>(handlers::handle_on_enter)
.on_sync::<lsp_types::request::SelectionRangeRequest>(handlers::handle_selection_range)
@ -796,7 +792,7 @@ fn run_flycheck(this: &mut GlobalState, vfs_path: VfsPath) -> bool {
})?
.on::<lsp_types::notification::WorkDoneProgressCancel>(|this, params| {
if let lsp_types::NumberOrString::String(s) = &params.token {
if let Some(id) = s.strip_prefix("rust-analyzer/checkOnSave/") {
if let Some(id) = s.strip_prefix("rust-analyzer/flycheck/") {
if let Ok(id) = u32::from_str_radix(id, 10) {
if let Some(flycheck) = this.flycheck.get(id as usize) {
flycheck.cancel();
@ -825,6 +821,7 @@ fn run_flycheck(this: &mut GlobalState, vfs_path: VfsPath) -> bool {
}
Ok(())
})?
.on::<lsp_ext::CancelFlycheck>(handlers::handle_cancel_flycheck)?
.on::<lsp_types::notification::DidChangeTextDocument>(|this, params| {
if let Ok(path) = from_proto::vfs_path(&params.text_document.uri) {
match this.mem_docs.get_mut(&path) {
@ -864,6 +861,10 @@ fn run_flycheck(this: &mut GlobalState, vfs_path: VfsPath) -> bool {
}
Ok(())
})?
.on::<lsp_ext::ClearFlycheck>(|this, ()| {
this.diagnostics.clear_check_all();
Ok(())
})?
.on::<lsp_ext::RunFlycheck>(|this, params| {
if let Some(text_document) = params.text_document {
if let Ok(vfs_path) = from_proto::vfs_path(&text_document.uri) {
@ -888,15 +889,15 @@ fn run_flycheck(this: &mut GlobalState, vfs_path: VfsPath) -> bool {
}
}
if run_flycheck(this, vfs_path) {
if !this.config.check_on_save() || run_flycheck(this, vfs_path) {
return Ok(());
}
}
} else if this.config.check_on_save() {
// No specific flycheck was triggered, so let's trigger all of them.
for flycheck in this.flycheck.iter() {
flycheck.restart();
}
}
Ok(())
})?
.on::<lsp_types::notification::DidChangeConfiguration>(|this, _params| {

View File

@ -449,15 +449,7 @@ fn fetch_build_data_error(&self) -> Result<(), String> {
fn reload_flycheck(&mut self) {
let _p = profile::span("GlobalState::reload_flycheck");
let config = match self.config.flycheck() {
Some(it) => it,
None => {
self.flycheck = Arc::new([]);
self.diagnostics.clear_check_all();
return;
}
};
let config = self.config.flycheck();
let sender = self.flycheck_sender.clone();
let invocation_strategy = match config {
FlycheckConfig::CargoCommand { .. } => flycheck::InvocationStrategy::PerWorkspace,

View File

@ -1,5 +1,5 @@
<!---
lsp_ext.rs hash: 1cb29d3afa36e743
lsp_ext.rs hash: 45bd7985265725c5
If you need to change the above hash to make the test pass, please check if you
need to adjust this doc as well and ping this issue:
@ -459,6 +459,45 @@ Note that this functionality is intended primarily to inform the end user about
In particular, it's valid for the client to completely ignore this extension.
Clients are discouraged from but are allowed to use the `health` status to decide if it's worth sending a request to the server.
### Controlling Flycheck
The flycheck/checkOnSave feature can be controlled via notifications sent by the client to the server.
**Method:** `rust-analyzer/runFlycheck`
**Notification:**
```typescript
interface RunFlycheckParams {
/// The text document whose cargo workspace flycheck process should be started.
/// If the document is null or does not belong to a cargo workspace all flycheck processes will be started.
textDocument: lc.TextDocumentIdentifier | null;
}
```
Triggers the flycheck processes.
**Method:** `rust-analyzer/clearFlycheck`
**Notification:**
```typescript
interface ClearFlycheckParams {}
```
Clears the flycheck diagnostics.
**Method:** `rust-analyzer/cancelFlycheck`
**Notification:**
```typescript
interface CancelFlycheckParams {}
```
Cancels all running flycheck processes.
## Syntax Tree
**Method:** `rust-analyzer/syntaxTree`

View File

@ -251,6 +251,11 @@
"command": "rust-analyzer.runFlycheck",
"title": "Run flycheck",
"category": "rust-analyzer"
},
{
"command": "rust-analyzer.clearFlycheck",
"title": "Clear flycheck diagnostics",
"category": "rust-analyzer"
}
],
"keybindings": [

View File

@ -788,7 +788,13 @@ export function openDocs(ctx: CtxInit): Cmd {
export function cancelFlycheck(ctx: CtxInit): Cmd {
return async () => {
await ctx.client.sendRequest(ra.cancelFlycheck);
await ctx.client.sendNotification(ra.cancelFlycheck);
};
}
export function clearFlycheck(ctx: CtxInit): Cmd {
return async () => {
await ctx.client.sendNotification(ra.clearFlycheck);
};
}

View File

@ -79,8 +79,8 @@ export const relatedTests = new lc.RequestType<lc.TextDocumentPositionParams, Te
"rust-analyzer/relatedTests"
);
export const cancelFlycheck = new lc.RequestType0<void, void>("rust-analyzer/cancelFlycheck");
export const cancelFlycheck = new lc.NotificationType0("rust-analyzer/cancelFlycheck");
export const clearFlycheck = new lc.NotificationType0("rust-analyzer/clearFlycheck");
export const runFlycheck = new lc.NotificationType<{
textDocument: lc.TextDocumentIdentifier | null;
}>("rust-analyzer/runFlycheck");

View File

@ -150,6 +150,7 @@ function createCommands(): Record<string, CommandFactory> {
moveItemUp: { enabled: commands.moveItemUp },
moveItemDown: { enabled: commands.moveItemDown },
cancelFlycheck: { enabled: commands.cancelFlycheck },
clearFlycheck: { enabled: commands.clearFlycheck },
runFlycheck: { enabled: commands.runFlycheck },
ssr: { enabled: commands.ssr },
serverVersion: { enabled: commands.serverVersion },