Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'src/edi/lsp_impl.rs')
| -rw-r--r-- | src/edi/lsp_impl.rs | 187 |
1 files changed, 155 insertions, 32 deletions
diff --git a/src/edi/lsp_impl.rs b/src/edi/lsp_impl.rs index d0e506e..6026a3d 100644 --- a/src/edi/lsp_impl.rs +++ b/src/edi/lsp_impl.rs @@ -2,16 +2,16 @@ use std::iter::repeat; use Default::default; use lsp_server::Request as LRq; -use lsp_types::request::*; use lsp_types::*; +use rust_analyzer::lsp::ext::CodeAction; use serde::{Deserialize, Serialize}; use ttools::{Tupl, With}; use crate::complete::Complete; +use crate::edi::lsp; use crate::edi::st::*; use crate::hov::{Hoverable, Hovring}; use crate::lsp::{RequestError, Rq}; -use crate::runnables::Runnables; use crate::sym::GoTo; use crate::{CompletionState, act, sig, sym}; @@ -32,14 +32,15 @@ pub struct Requests { (), RequestError<SignatureHelpRequest>, >, // vo, lines - // #[serde(serialize_with = "serialize_tokens")] - // #[serde(deserialize_with = "deserialize_tokens")] - #[serde(skip)] + #[serde(serialize_with = "serialize_tokens")] + #[serde(deserialize_with = "deserialize_tokens")] + #[serde(default)] + // #[serde(skip)] pub semantic_tokens: Rq< Box<[SemanticToken]>, Box<[SemanticToken]>, (), - RequestError<SemanticTokensFullRequest>, + RequestError<lsp_request!("textDocument/semanticTokens/full")>, >, pub diag: Rq< String, @@ -47,18 +48,18 @@ pub struct Requests { (), RequestError<DocumentDiagnosticRequest>, >, - #[serde(skip)] + #[serde(default)] pub inlay: Rq< Vec<InlayHint>, Vec<InlayHint>, (), RequestError<lsp_request!("textDocument/inlayHint")>, >, - pub def: Rq< + pub def: crate::RqS< LocationLink, - Option<GotoDefinitionResponse>, + lsp_request!("textDocument/definition"), (usize, usize), - RequestError<lsp_request!("textDocument/definition")>, + // RequestError<lsp_request!("textDocument/definition")>, >, #[serde(skip)] pub document_symbols: Rq< @@ -70,9 +71,138 @@ pub struct Requests { #[serde(skip)] pub git_diff: Rq<imara_diff::Diff, imara_diff::Diff, (), ()>, } +use serde::ser::SerializeSeq; + +fn untokenr<'de, D>( + deserializer: D, +) -> Result<Vec<SemanticToken>, D::Error> +where + D: serde::Deserializer<'de>, +{ + let data = Vec::<u32>::deserialize(deserializer)?; + let chunks = data.chunks_exact(5); + + if !chunks.remainder().is_empty() { + return Result::Err(serde::de::Error::custom( + "Length is not divisible by 5", + )); + } + + Result::Ok( + chunks + .map(|chunk| SemanticToken { + delta_line: chunk[0], + delta_start: chunk[1], + length: chunk[2], + token_type: chunk[3], + token_modifiers_bitset: chunk[4], + }) + .collect(), + ) +} + +fn tokenr<S>( + tokens: &[SemanticToken], + serializer: S, +) -> Result<S::Ok, S::Error> +where + S: serde::Serializer, +{ + let mut seq = serializer.serialize_seq(Some(tokens.len() * 5))?; + for token in tokens.iter() { + seq.serialize_element(&token.delta_line)?; + seq.serialize_element(&token.delta_start)?; + seq.serialize_element(&token.length)?; + seq.serialize_element(&token.token_type)?; + seq.serialize_element(&token.token_modifiers_bitset)?; + } + seq.end() +} + +fn deserialize_tokens_opt<'de, D>( + deserializer: D, +) -> Result<Option<Vec<SemanticToken>>, D::Error> +where + D: serde::Deserializer<'de>, +{ + #[derive(Deserialize)] + #[serde(transparent)] + struct Wrapper { + #[serde(deserialize_with = "untokenr")] + tokens: Vec<SemanticToken>, + } + + Ok(Option::<Wrapper>::deserialize(deserializer)? + .map(|wrapper| wrapper.tokens)) +} + +fn serialize_tokens_opt<S>( + data: Option<&[SemanticToken]>, + serializer: S, +) -> Result<S::Ok, S::Error> +where + S: serde::Serializer, +{ + #[derive(Serialize)] + #[serde(transparent)] + struct Wrapper<'a> { + #[serde(serialize_with = "tokenr")] + tokens: &'a [SemanticToken], + } + + let opt = data.as_ref().map(|t| Wrapper { tokens: t }); + + opt.serialize(serializer) +} +pub fn deserialize_tokens<'de, D: serde::Deserializer<'de>>( + ser: D, +) -> Result< + Rq< + Box<[SemanticToken]>, + Box<[SemanticToken]>, + (), + RequestError<lsp_request!("textDocument/semanticTokens/full")>, + >, + D::Error, +> { + { + #[derive(Deserialize)] + #[serde(transparent)] + struct Wrapper { + #[serde(deserialize_with = "untokenr")] + tokens: Vec<SemanticToken>, + } + + Ok(Option::<Wrapper>::deserialize(ser)? + .map(|wrapper| wrapper.tokens)) + } + .map(|x| Rq { result: x.map(Into::into), request: None }) +} +pub fn serialize_tokens<S: serde::Serializer>( + s: &Rq< + Box<[SemanticToken]>, + Box<[SemanticToken]>, + (), + RequestError<lsp_request!("textDocument/semanticTokens/full")>, + >, + ser: S, +) -> Result<S::Ok, S::Error> { + { + let data: &Option<Vec<SemanticToken>> = + &s.result.clone().map(|x| x.to_vec()); + #[derive(Serialize)] + #[serde(transparent)] + struct Wrapper { + #[serde(serialize_with = "tokenr")] + tokens: Vec<SemanticToken>, + } + let opt = data.as_ref().map(|t| Wrapper { tokens: t.to_vec() }); + opt.serialize(ser) + } +} impl crate::edi::Editor { pub fn poll(&mut self) { - let Some((l, ..)) = self.lsp else { return }; + lsp!(let l = self); for rq in l.req_rx.try_iter() { match rq { LRq { method: "workspace/diagnostic/refresh", .. } => { @@ -120,14 +250,7 @@ impl crate::edi::Editor { } State::CodeAction(x) => { if x.poll(|x, _| { - let lems: Vec<CodeAction> = x - .ok()?? - .into_iter() - .map(|x| match x { - CodeActionOrCommand::CodeAction(x) => x, - _ => panic!("alas we dont like these"), - }) - .collect(); + let lems = x.ok()??; if lems.is_empty() { self.bar.last_action = "no code actions available".into(); @@ -142,9 +265,10 @@ impl crate::edi::Editor { self.state = State::Default; } } + #[cfg(target_family = "unix")] State::Runnables(x) => { x.poll(|x, ((), old)| { - Some(Runnables { + Some(crate::runnables::Runnables { data: x.ok()?, ..old.unwrap_or_default() }) @@ -188,18 +312,13 @@ impl crate::edi::Editor { x.ok().map(|x| { x.and_then(|x| try { z.data.0 = match x { - GotoDefinitionResponse::Scalar( - location, + ImplementationResponse::Definition( + Definition::Location(location), ) => vec![(GoTo::from( location, ),None)], - GotoDefinitionResponse::Array( - locations, - ) => locations - .into_iter() - .map(GoTo::from).zip(repeat(None)) - .collect(), - GotoDefinitionResponse::Link( + + ImplementationResponse::DefinitionLinkList( location_links, ) => location_links .into_iter() @@ -212,6 +331,7 @@ impl crate::edi::Editor { ) }).zip(repeat(None)) .collect(), + ImplementationResponse::Definition(Definition::LocationList(x)) => {unimplemented!()}, }; }); }) @@ -251,7 +371,10 @@ impl crate::edi::Editor { } self.requests.def.poll(|x, _| { x.ok().flatten().and_then(|x| match &x { - GotoDefinitionResponse::Link([x, ..]) => Some(x.clone()), + // DefinitionResponse::Definition(x) => Some(x.clone()), + DefinitionResponse::DefinitionLinkList([x, ..]) => + Some(x.clone()), + // DefinitionRequest::Definition([x, ..]) => Some(x.clone()), _ => None, }) }); @@ -273,8 +396,8 @@ impl crate::edi::Editor { self.requests.git_diff.poll(|x, _| x.ok()); self.requests.document_symbols.poll(|x, _| { x.ok().flatten().map(|x| match x { - DocumentSymbolResponse::Flat(_) => None, - DocumentSymbolResponse::Nested(x) => Some(x), + DocumentSymbolResponse::SymbolInformationList(_) => None, + DocumentSymbolResponse::DocumentSymbolList(x) => Some(x), }) }); } |