A simple CPU rendered GUI IDE experience.
Diffstat (limited to 'src/lsp/client.rs')
-rw-r--r--src/lsp/client.rs264
1 files changed, 150 insertions, 114 deletions
diff --git a/src/lsp/client.rs b/src/lsp/client.rs
index 8d9b0d8..9bc85b5 100644
--- a/src/lsp/client.rs
+++ b/src/lsp/client.rs
@@ -22,7 +22,7 @@ use tokio::sync::oneshot;
use ttools::*;
use crate::lsp::BehaviourAfter::{self, *};
-use crate::lsp::{RequestError, Rq, Void};
+use crate::lsp::{RequestError, Require, Requiring, Rq};
use crate::text::cursor::ceach;
use crate::text::{LOADER, RopeExt, SortTedits, TextArea};
@@ -118,12 +118,17 @@ impl Client {
f: &Path,
(x, y): (usize, usize),
c: CompletionContext,
- ) -> impl Future<
- Output = Result<
- Option<CompletionResponse>,
- RequestError<Completion>,
- >,
- > + use<'me> {
+ ) -> Requiring<
+ "completion",
+ impl Future<
+ Output = Result<
+ Option<CompletionResponse>,
+ RequestError<Completion>,
+ >,
+ > + use<'me>,
+ > {
+ self.caps().completion_provider.require()?;
+
let (rx, _) = self
.request_::<Completion, { Redraw }>(&CompletionParams {
text_document_position: TextDocumentPositionParams {
@@ -135,35 +140,40 @@ impl Client {
context: Some(c),
})
.unwrap();
- rx
+ Ok(rx)
}
pub fn request_sig_help<'me>(
&'me self,
f: &Path,
(x, y): (usize, usize),
- ) -> impl Future<
- Output = Result<
- Option<SignatureHelp>,
- RequestError<SignatureHelpRequest>,
- >,
- > + use<'me> {
- self.request_::<SignatureHelpRequest, { Redraw }>(
- &SignatureHelpParams {
- context: None,
- text_document_position_params:
- TextDocumentPositionParams {
- text_document: f.tid(),
- position: Position {
- line: y as _,
- character: x as _,
+ ) -> Requiring<
+ "signature_help",
+ impl Future<
+ Output = Result<
+ Option<SignatureHelp>,
+ RequestError<SignatureHelpRequest>,
+ >,
+ > + use<'me>,
+ > {
+ self.caps().signature_help_provider.require()?;
+ Ok(self
+ .request_::<SignatureHelpRequest, { Redraw }>(
+ &SignatureHelpParams {
+ context: None,
+ text_document_position_params:
+ TextDocumentPositionParams {
+ text_document: f.tid(),
+ position: Position {
+ line: y as _,
+ character: x as _,
+ },
},
- },
- work_done_progress_params: default(),
- },
- )
- .unwrap()
- .0
+ work_done_progress_params: default(),
+ },
+ )
+ .unwrap()
+ .0)
}
pub fn _pull_all_diag(
@@ -301,12 +311,16 @@ impl Client {
&'me self,
f: &Path,
cursor: Position,
- ) -> impl Future<
- Output = Result<
- Vec<DocumentHighlight>,
- RequestError<DocumentHighlightRequest>,
- >,
- > + use<'me> {
+ ) -> Requiring<
+ "document_highlights",
+ impl Future<
+ Output = Result<
+ Vec<DocumentHighlight>,
+ RequestError<DocumentHighlightRequest>,
+ >,
+ > + use<'me>,
+ > {
+ self.caps().document_highlight_provider.require()?;
let p = DocumentHighlightParams {
text_document_position_params: TextDocumentPositionParams {
text_document: f.tid(),
@@ -315,21 +329,25 @@ impl Client {
work_done_progress_params: default(),
partial_result_params: default(),
};
- self.request_::<lsp_request!("textDocument/documentHighlight"), {Redraw}>(&p)
+ Ok(self.request_::<lsp_request!("textDocument/documentHighlight"), {Redraw}>(&p)
.unwrap()
.0
- .map(|x| x.map(|x| x.unwrap_or_default()))
+ .map(|x| x.map(|x| x.unwrap_or_default())))
}
pub fn document_symbols(
&'static self,
p: &Path,
- ) -> impl Future<
- Output = Result<
- Option<DocumentSymbolResponse>,
- RequestError<lsp_request!("textDocument/documentSymbol")>,
- >,
+ ) -> Requiring<
+ "document_symbol",
+ impl Future<
+ Output = Result<
+ Option<DocumentSymbolResponse>,
+ RequestError<lsp_request!("textDocument/documentSymbol")>,
+ >,
+ > + use<>,
> {
- self.request_::<lsp_request!("textDocument/documentSymbol"), { Redraw }>(
+ self.caps().document_symbol_provider.require()?;
+ Ok(self.request_::<lsp_request!("textDocument/documentSymbol"), { Redraw }>(
&DocumentSymbolParams {
text_document: p.tid(),
work_done_progress_params: default(),
@@ -337,31 +355,36 @@ impl Client {
},
)
.unwrap()
- .0
+ .0)
}
pub fn workspace_symbols(
&'static self,
f: String,
- ) -> impl Future<
- Output = Result<
- Option<WorkspaceSymbolResponse>,
- RequestError<lsp_request!("workspace/symbol")>,
+ ) -> Requiring<
+ "workspace_symbol",
+ impl Future<
+ Output = Result<
+ Option<WorkspaceSymbolResponse>,
+ RequestError<lsp_request!("workspace/symbol")>,
+ >,
>,
> {
- self.request_::<lsp_request!("workspace/symbol"), { Redraw }>(
- &lsp_types::WorkspaceSymbolParams {
- query: f,
- search_scope: Some(
- lsp_types::WorkspaceSymbolSearchScope::Workspace,
- ),
- search_kind: Some(
- lsp_types::WorkspaceSymbolSearchKind::AllSymbols,
- ),
- ..Default::default()
- },
- )
- .unwrap()
- .0
+ self.caps().workspace_symbol_provider.require()?;
+ Ok(self
+ .request_::<lsp_request!("workspace/symbol"), { Redraw }>(
+ &lsp_types::WorkspaceSymbolParams {
+ query: f,
+ search_scope: Some(
+ lsp_types::WorkspaceSymbolSearchScope::Workspace,
+ ),
+ search_kind: Some(
+ lsp_types::WorkspaceSymbolSearchKind::AllSymbols,
+ ),
+ ..Default::default()
+ },
+ )
+ .unwrap()
+ .0)
}
pub fn matching_brace_at(
@@ -400,19 +423,23 @@ impl Client {
&'static self,
f: &Path,
t: &TextArea,
- ) -> impl Future<
- Output = Result<
- Vec<InlayHint>,
- RequestError<lsp_request!("textDocument/inlayHint")>,
- >,
- > + use<> {
- self.request_::<lsp_request!("textDocument/inlayHint"), { Redraw }>(&InlayHintParams {
+ ) -> Requiring<
+ "inlay_hint",
+ impl Future<
+ Output = Result<
+ Vec<InlayHint>,
+ RequestError<lsp_request!("textDocument/inlayHint")>,
+ >,
+ > + use<>,
+ > {
+ self.caps().inlay_hint_provider.require()?;
+ Ok(self.request_::<lsp_request!("textDocument/inlayHint"), { Redraw }>(&InlayHintParams {
work_done_progress_params: default(),
text_document: f.tid(),
range: t.to_l_range(lower::saturating::math!{
t.rope.try_line_to_char(t.vo-t.r).unwrap_or(0)..t.rope.try_line_to_char(t.vo + t.r + t.r).unwrap_or(t.rope.len_chars())
}).unwrap()
- }).unwrap().0.map(|x| x.map(Option::unwrap_or_default))
+ }).unwrap().0.map(|x| x.map(Option::unwrap_or_default)))
// async {
// if let Ok(z) = z.await {
// let mut into = vec![];
@@ -431,25 +458,33 @@ impl Client {
pub fn format(
&'static self,
f: &Path,
- ) -> impl Future<
- Output = Result<Option<Vec<TextEdit>>, RequestError<Formatting>>,
+ ) -> Requiring<
+ "document_formatting",
+ impl Future<
+ Output = Result<
+ Option<Vec<TextEdit>>,
+ RequestError<Formatting>,
+ >,
+ >,
> {
- self.request::<lsp_request!("textDocument/formatting")>(
- &DocumentFormattingParams {
- text_document: f.tid(),
- options: FormattingOptions {
- tab_size: 4,
- insert_spaces: false,
- properties: default(),
- trim_trailing_whitespace: Some(true),
- insert_final_newline: Some(true),
- trim_final_newlines: Some(false),
+ self.caps().document_formatting_provider.require()?;
+ Ok(self
+ .request::<lsp_request!("textDocument/formatting")>(
+ &DocumentFormattingParams {
+ text_document: f.tid(),
+ options: FormattingOptions {
+ tab_size: 4,
+ insert_spaces: false,
+ properties: default(),
+ trim_trailing_whitespace: Some(true),
+ insert_final_newline: Some(true),
+ trim_final_newlines: Some(false),
+ },
+ work_done_progress_params: default(),
},
- work_done_progress_params: default(),
- },
- )
- .unwrap()
- .0
+ )
+ .unwrap()
+ .0)
}
pub fn rq_semantic_tokens(
&'static self,
@@ -460,38 +495,39 @@ impl Client {
RequestError<SemanticTokensFullRequest>,
>,
f: &Path,
- ) -> Result<(), RequestError<SemanticTokensFullRequest>> {
- self.caps().semantic_tokens_provider.void().ok_or(
- RequestError::<SemanticTokensFullRequest>::Unsupported,
- )?;
+ ) -> Requiring<
+ "semantic_tokens",
+ Result<(), RequestError<SemanticTokensFullRequest>>,
+ > {
+ self.caps().semantic_tokens_provider.require()?;
debug!("requested semantic tokens");
// let Some(b"rs") = f.extension().map(|x| x.as_encoded_bytes())
// else {
// return Ok(());
// };
- let (rx, _) = self.request::<SemanticTokensFullRequest>(
- &SemanticTokensParams {
- work_done_progress_params: default(),
- partial_result_params: default(),
- text_document: f.tid(),
- },
- )?;
- let x = self.runtime.spawn(async move {
- let t = rx.await;
- let y =
- t?.ok_or(RequestError::Rx(std::marker::PhantomData))?;
- debug!("received semantic tokens");
- let r = match y {
- SemanticTokensResult::Partial(_) =>
- panic!("i told the lsp i dont support this"),
- SemanticTokensResult::Tokens(x) =>
- x.data.into_boxed_slice(),
- };
- Ok(r)
- });
- to.request(x);
-
- Ok(())
+ Ok(try bikeshed Result<(), RequestError<_>> {
+ let (rx, _) = self.request::<SemanticTokensFullRequest>(
+ &SemanticTokensParams {
+ work_done_progress_params: default(),
+ partial_result_params: default(),
+ text_document: f.tid(),
+ },
+ )?;
+ let x = self.runtime.spawn(async move {
+ let t = rx.await;
+ let y =
+ t?.ok_or(RequestError::Rx(std::marker::PhantomData))?;
+ debug!("received semantic tokens");
+ let r = match y {
+ SemanticTokensResult::Partial(_) =>
+ panic!("i told the lsp i dont support this"),
+ SemanticTokensResult::Tokens(x) =>
+ x.data.into_boxed_slice(),
+ };
+ Ok(r)
+ });
+ to.request(x);
+ })
}
pub fn enter<'a>(