prepare to move run/debug splitting to handlers

This commit is contained in:
Aleksey Kladov 2021-07-11 13:34:22 +03:00
parent 325140a165
commit 148e11aa9e
2 changed files with 50 additions and 32 deletions

View File

@ -26,7 +26,7 @@ use lsp_types::{
};
use project_model::TargetKind;
use serde_json::json;
use stdx::format_to;
use stdx::{format_to, never};
use syntax::{algo, ast, AstNode, TextRange, TextSize};
use crate::{
@ -1133,41 +1133,53 @@ pub(crate) fn handle_code_lens(
let file_id = from_proto::file_id(&snap, &params.text_document.uri)?;
let cargo_target_spec = CargoTargetSpec::for_file(&snap, file_id)?;
let lenses = snap
.analysis
.annotations(
&AnnotationConfig {
binary_target: cargo_target_spec
.map(|spec| {
matches!(
spec.target_kind,
TargetKind::Bin | TargetKind::Example | TargetKind::Test
)
})
.unwrap_or(false),
annotate_runnables: lens_config.runnable(),
annotate_impls: lens_config.implementations,
annotate_references: lens_config.refs,
annotate_method_references: lens_config.method_refs,
run: lens_config.run,
debug: lens_config.debug,
},
file_id,
)?
.into_iter()
.map(|annotation| to_proto::code_lens(&snap, annotation).unwrap())
.collect();
let annotations = snap.analysis.annotations(
&AnnotationConfig {
binary_target: cargo_target_spec
.map(|spec| {
matches!(
spec.target_kind,
TargetKind::Bin | TargetKind::Example | TargetKind::Test
)
})
.unwrap_or(false),
annotate_runnables: lens_config.runnable(),
annotate_impls: lens_config.implementations,
annotate_references: lens_config.refs,
annotate_method_references: lens_config.method_refs,
run: lens_config.run,
debug: lens_config.debug,
},
file_id,
)?;
Ok(Some(lenses))
let mut res = Vec::new();
for a in annotations {
to_proto::code_lens(&mut res, &snap, a)?;
}
Ok(Some(res))
}
pub(crate) fn handle_code_lens_resolve(
snap: GlobalStateSnapshot,
code_lens: CodeLens,
) -> Result<CodeLens> {
let annotation = from_proto::annotation(&snap, code_lens)?;
let annotation = from_proto::annotation(&snap, code_lens.clone())?;
let annotation = snap.analysis.resolve_annotation(annotation)?;
to_proto::code_lens(&snap, snap.analysis.resolve_annotation(annotation)?)
let mut acc = Vec::new();
to_proto::code_lens(&mut acc, &snap, annotation)?;
let res = match acc.pop() {
Some(it) if acc.is_empty() => it,
_ => {
never!();
code_lens
}
};
Ok(res)
}
pub(crate) fn handle_document_highlight(

View File

@ -988,9 +988,10 @@ pub(crate) fn runnable(
}
pub(crate) fn code_lens(
acc: &mut Vec<lsp_types::CodeLens>,
snap: &GlobalStateSnapshot,
annotation: Annotation,
) -> Result<lsp_types::CodeLens> {
) -> Result<()> {
match annotation.kind {
AnnotationKind::Runnable { debug, runnable: run } => {
let line_index = snap.file_line_index(run.nav.file_id)?;
@ -1002,7 +1003,11 @@ pub(crate) fn code_lens(
let command =
if debug { command::debug_single(&r) } else { command::run_single(&r, &title) };
Ok(lsp_types::CodeLens { range: annotation_range, command: Some(command), data: None })
acc.push(lsp_types::CodeLens {
range: annotation_range,
command: Some(command),
data: None,
})
}
AnnotationKind::HasImpls { position: file_position, data } => {
let line_index = snap.file_line_index(file_position.file_id)?;
@ -1041,7 +1046,7 @@ pub(crate) fn code_lens(
)
});
Ok(lsp_types::CodeLens {
acc.push(lsp_types::CodeLens {
range: annotation_range,
command,
data: Some(to_value(lsp_ext::CodeLensResolveData::Impls(goto_params)).unwrap()),
@ -1070,13 +1075,14 @@ pub(crate) fn code_lens(
)
});
Ok(lsp_types::CodeLens {
acc.push(lsp_types::CodeLens {
range: annotation_range,
command,
data: Some(to_value(lsp_ext::CodeLensResolveData::References(doc_pos)).unwrap()),
})
}
}
Ok(())
}
pub(crate) mod command {