Send along diagnostics when requesting code actions (#10281)

This fixes #10177 by sending along the correct diagnostics when querying
the language server for diagnostics for a given cursor location.

Turns out that `gopls` takes the `range`, `source`, `message` of the
diagnostics sent along to check whether it has any code actions for the
given location.

Release Notes:

- Fixed "quickfix" code actions that were based on diagnostics not
showing up in Go files.
([#10177](https://github.com/zed-industries/zed/issues/10177)).

Co-authored-by: Conrad <conrad@zed.dev>
Co-authored-by: Marshall <marshall@zed.dev>
This commit is contained in:
Thorsten Ball 2024-04-08 17:54:06 +02:00 committed by GitHub
parent 134decb75e
commit 87c282d8f1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 10 additions and 4 deletions

View file

@ -1,4 +1,4 @@
use crate::Diagnostic;
use crate::{range_to_lsp, Diagnostic};
use collections::HashMap;
use lsp::LanguageServerId;
use std::{
@ -51,7 +51,7 @@ pub struct Summary {
count: usize,
}
impl<T> DiagnosticEntry<T> {
impl DiagnosticEntry<PointUtf16> {
/// Returns a raw LSP diagnostic ssed to provide diagnostic context to LSP
/// codeAction request
pub fn to_lsp_diagnostic_stub(&self) -> lsp::Diagnostic {
@ -61,9 +61,14 @@ impl<T> DiagnosticEntry<T> {
.clone()
.map(lsp::NumberOrString::String);
let range = range_to_lsp(self.range.clone());
lsp::Diagnostic {
code,
range,
severity: Some(self.diagnostic.severity),
source: self.diagnostic.source.clone(),
message: self.diagnostic.message.clone(),
..Default::default()
}
}

View file

@ -1699,9 +1699,10 @@ impl LspCommand for GetCodeActions {
) -> lsp::CodeActionParams {
let relevant_diagnostics = buffer
.snapshot()
.diagnostics_in_range::<_, usize>(self.range.clone(), false)
.diagnostics_in_range::<_, language::PointUtf16>(self.range.clone(), false)
.map(|entry| entry.to_lsp_diagnostic_stub())
.collect();
.collect::<Vec<_>>();
lsp::CodeActionParams {
text_document: lsp::TextDocumentIdentifier::new(
lsp::Url::from_file_path(path).unwrap(),