From 148e11aa9e04ff2570c16d828340af1fcbc6d641 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 11 Jul 2021 13:34:22 +0300 Subject: [PATCH] prepare to move run/debug splitting to handlers --- crates/rust-analyzer/src/handlers.rs | 68 ++++++++++++++++------------ crates/rust-analyzer/src/to_proto.rs | 14 ++++-- 2 files changed, 50 insertions(+), 32 deletions(-) diff --git a/crates/rust-analyzer/src/handlers.rs b/crates/rust-analyzer/src/handlers.rs index 57b309a075..1c0a0b2719 100644 --- a/crates/rust-analyzer/src/handlers.rs +++ b/crates/rust-analyzer/src/handlers.rs @@ -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, ¶ms.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 { - 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( diff --git a/crates/rust-analyzer/src/to_proto.rs b/crates/rust-analyzer/src/to_proto.rs index 8c8ff826e1..3f565e7cdc 100644 --- a/crates/rust-analyzer/src/to_proto.rs +++ b/crates/rust-analyzer/src/to_proto.rs @@ -988,9 +988,10 @@ pub(crate) fn runnable( } pub(crate) fn code_lens( + acc: &mut Vec, snap: &GlobalStateSnapshot, annotation: Annotation, -) -> Result { +) -> 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 {