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.rs187
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),
})
});
}