A simple CPU rendered GUI IDE experience.
| -rw-r--r-- | src/edi.rs | 178 | ||||
| -rw-r--r-- | src/lsp/rq.rs | 15 | ||||
| -rw-r--r-- | src/main.rs | 2 |
3 files changed, 74 insertions, 121 deletions
@@ -416,7 +416,7 @@ impl Editor { std::fs::write(self.origin.as_ref().unwrap(), &t).unwrap(); self.mtime = Self::modify(self.origin.as_deref()); } - pub fn poll(&mut self, w: Option<&Arc<dyn Window>>) { + pub fn poll(&mut self) { let Some((l, ..)) = self.lsp else { return }; for rq in l.req_rx.try_iter() { match rq { @@ -427,130 +427,98 @@ impl Editor { rq => log::debug!("discarding request {rq:?}"), } } - let r = &l.runtime; self.requests.inlay.poll(|x, p| { x.ok().or(p.1).inspect(|x| { self.text.set_inlay(x); }) }); - self.requests.document_highlights.poll_r(|x, _| x.ok(), r, w); - self.requests.diag.poll_r(|x, _| x.ok().flatten(), r, w); + self.requests.document_highlights.poll(|x, _| x.ok()); + self.requests.diag.poll(|x, _| x.ok().flatten()); if let CompletionState::Complete(rq) = &mut self.requests.complete { - rq.poll_r( - |f, (c, _)| { - f.ok().flatten().map(|x| Complete { - r: x, - start: c, - selection: 0, - vo: 0, - }) - }, - r, - w, - ); + rq.poll(|f, (c, _)| { + f.ok().flatten().map(|x| Complete { + r: x, + start: c, + selection: 0, + vo: 0, + }) + }); }; match &mut self.state { State::Symbols(x) => { - x.poll_r( - |x, (_, p)| { - let Some(p) = p else { unreachable!() }; - x.ok().flatten().map(|r| sym::Symbols { - data: (r, p.data.1, p.data.2), - selection: 0, - vo: 0, - ..p - }) - }, - r, - w, - ); + x.poll(|x, (_, p)| { + let Some(p) = p else { unreachable!() }; + x.ok().flatten().map(|r| sym::Symbols { + data: (r, p.data.1, p.data.2), + selection: 0, + vo: 0, + ..p + }) + }); } State::CodeAction(x) => { - if x.poll_r( - |x, _| { - let lems: Vec<CodeAction> = x - .ok()?? - .into_iter() - .map(|x| match x { - CodeActionOrCommand::CodeAction(x) => x, - _ => panic!("alas we dont like these"), - }) - .collect(); - if lems.is_empty() { - self.bar.last_action = - "no code actions available".into(); - None - } else { - self.bar.last_action = - format!("{} code actions", lems.len()); - Some(act::CodeActions::new(lems)) - } - }, - r, - w, - ) && x.result.is_none() + 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(); + if lems.is_empty() { + self.bar.last_action = + "no code actions available".into(); + None + } else { + self.bar.last_action = + format!("{} code actions", lems.len()); + Some(act::CodeActions::new(lems)) + } + }) && x.result.is_none() { self.state = State::Default; } } State::Runnables(x) => { - x.poll_r( - |x, ((), old)| { - Some(Runnables { - data: x.ok()?, - ..old.unwrap_or_default() - }) - }, - r, - w, - ); + x.poll(|x, ((), old)| { + Some(Runnables { + data: x.ok()?, + ..old.unwrap_or_default() + }) + }); } _ => {} } - self.requests.def.poll_r( - |x, _| { - x.ok().flatten().and_then(|x| match &x { - GotoDefinitionResponse::Link([x, ..]) => - Some(x.clone()), - _ => None, - }) - }, - r, - w, - ); - self.requests.semantic_tokens.poll_r( - |x, _| x.ok().inspect(|x| self.text.set_toks(&x)), - &l.runtime, - w, - ); - self.requests.sig_help.poll_r( - |x, ((), y)| { - x.ok().flatten().map(|x| { - if let Some((old_sig, vo, max)) = y - && &sig::active(&old_sig) == &sig::active(&x) - { - (x, vo, max) - } else { - (x, 0, None) - } - }) - }, - r, - w, - ); - self.requests.hovering.poll_r(|x, _| x.ok().flatten(), r, w); - self.requests.git_diff.poll_r(|x, _| x.ok(), r, w); - self.requests.document_symbols.poll_r( - |x, _| { - x.ok().flatten().map(|x| match x { - DocumentSymbolResponse::Flat(_) => None, - DocumentSymbolResponse::Nested(x) => Some(x), - }) - }, - r, - w, - ); + self.requests.def.poll(|x, _| { + x.ok().flatten().and_then(|x| match &x { + GotoDefinitionResponse::Link([x, ..]) => Some(x.clone()), + _ => None, + }) + }); + self.requests + .semantic_tokens + .poll(|x, _| x.ok().inspect(|x| self.text.set_toks(&x))); + self.requests.sig_help.poll(|x, ((), y)| { + x.ok().flatten().map(|x| { + if let Some((old_sig, vo, max)) = y + && &sig::active(&old_sig) == &sig::active(&x) + { + (x, vo, max) + } else { + (x, 0, None) + } + }) + }); + self.requests.hovering.poll(|x, _| x.ok().flatten()); + 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), + }) + }); } #[implicit_fn] pub fn cursor_moved( diff --git a/src/lsp/rq.rs b/src/lsp/rq.rs index 97ed4c5..eb3ec7e 100644 --- a/src/lsp/rq.rs +++ b/src/lsp/rq.rs @@ -1,7 +1,6 @@ use std::backtrace::Backtrace; use std::fmt::Debug; use std::marker::PhantomData; -use std::sync::Arc; use crossbeam::channel::SendError; use lsp_server::{Message, Response as Re}; @@ -11,7 +10,6 @@ use serde::{Deserialize, Serialize}; use tokio::sync::oneshot; use tokio::task; use tokio_util::task::AbortOnDropHandle; -use winit::window::Window; #[derive(Serialize, Deserialize)] pub enum RequestError<X> { @@ -155,17 +153,4 @@ impl<T, R, D, E> Rq<T, R, D, E> { false } } - - pub fn poll_r( - &mut self, - f: impl FnOnce(Result<R, E>, (D, Option<T>)) -> Option<T>, - _runtime: &tokio::runtime::Runtime, - _w: Option<&Arc<dyn Window>>, - ) -> bool { - self.poll(|x, y| { - f(x, y).inspect(|_| { - // w.map(|x| x.request_redraw()); - }) - }) - } } diff --git a/src/main.rs b/src/main.rs index 1827980..b2f1e4a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -222,7 +222,7 @@ pub(crate) fn entry(event_loop: EventLoop) { window.request_redraw(); } // let before = ed.state.name(); - ed.poll(Some(window)); + ed.poll(); // println!("{before} -> poll -> {}", ed.state.name()); // let before = ed.state.name(); // let ev = format!("{event:?}"); |