A simple CPU rendered GUI IDE experience.
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 83 |
1 files changed, 53 insertions, 30 deletions
diff --git a/src/main.rs b/src/main.rs index 962ccde..f1cca39 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,7 @@ // this looks pretty good though #![feature(tuple_trait, unboxed_closures, fn_traits)] #![feature( + current_thread_id, vec_try_remove, iter_next_chunk, iter_array_chunks, @@ -33,7 +34,6 @@ )] #![allow(incomplete_features, redundant_semicolons)] use std::borrow::Cow; -use std::collections::HashMap; use std::iter::once; mod act; use std::num::NonZeroU32; @@ -84,7 +84,8 @@ mod sni; mod text; mod winit_app; fn main() { - let x = 4; + let _x = 4; + // let x = HashMap::new(); unsafe { std::env::set_var("CARGO_UNSTABLE_RUSTC_UNICODE", "true") }; env_logger::init(); // lsp::x(); @@ -211,6 +212,8 @@ pub(crate) fn entry(event_loop: EventLoop<()>) { .and_then(|x| x.canonicalize().ok()); let c = workspace.as_ref().zip(origin.clone()).map( |(workspace, origin)| { + let dh = std::panic::take_hook(); + let main = std::thread::current_id(); // let mut c = Command::new("rust-analyzer") // .stdin(Stdio::piped()) // .stdout(Stdio::piped()) @@ -221,9 +224,15 @@ pub(crate) fn entry(event_loop: EventLoop<()>) { std::thread::Builder::new() .name("Rust Analyzer".into()) .stack_size(1024 * 1024 * 8) - .spawn(|| { - std::panic::set_hook(Box::new(|info| { - println!("RA panic @ {}", info.location().unwrap()); + .spawn(move || { + let ra = std::thread::current_id(); + std::panic::set_hook(Box::new(move |info| { + // iz + if std::thread::current_id() == main { + dh(info); + } else if std::thread::current_id() == ra || std::thread::current().name().is_some_and(|x| x.starts_with("RA")) { + println!("RA panic @ {}", info.location().unwrap()); + } })); rust_analyzer::bin::run_server(b) }) @@ -380,8 +389,8 @@ pub(crate) fn entry(event_loop: EventLoop<()>) { for rq in l.req_rx.try_iter() { match rq { LRq { method: "workspace/diagnostic/refresh", .. } => { - let x = l.pull_diag(o.into(), diag.result.clone()); - diag.request(l.runtime.spawn(x)); + // let x = l.pull_diag(o.into(), diag.result.clone()); + // diag.request(l.runtime.spawn(x)); }, rq => log::debug!("discarding request {rq:?}"), @@ -398,11 +407,17 @@ pub(crate) fn entry(event_loop: EventLoop<()>) { }; if let State::CodeAction(x) = &mut state { x.poll(|x, _| { - Some(act::CodeActions {selection:0, vo:0, inner: x.ok()??.into_iter().map(|x| match x { + let lems: Vec<CodeAction> = x.ok()??.into_iter().map(|x| match x { CodeActionOrCommand::CodeAction(x) => x, _ => panic!("alas we dont like these"), - }).collect(),}) - },&l.runtime); + }).collect(); + if lems.is_empty() { + bar.last_action = "no code actions available".into(); + None + } else { + Some(act::CodeActions::new(lems)) + } + },&l.runtime); } def.poll(|x, _| x.ok().flatten().and_then(|x| match &x { @@ -704,7 +719,7 @@ pub(crate) fn entry(event_loop: EventLoop<()>) { match diag.data.as_ref().unwrap_or_default().get("rendered") { Some(x) if let Some(x) = x.as_str() => { let mut t = pattypan::term::Terminal::new((95, (r.saturating_sub(5)) as _), false); - for b in x.replace('\n', "\r\n").bytes(){ t.rx(b,std::fs::File::open("/dev/null").unwrap().as_fd()); } + for b in x.replace('\n', "\r\n").replace("⸬", ":").replace("/home/os", "").bytes(){ t.rx(b,std::fs::File::open("/dev/null").unwrap().as_fd()); } let y_lim = t.cells.rows().position(|x| x.iter().all(_.letter.is_none())).unwrap_or(20); let c =t.cells.c() as usize; let Some(x_lim) = t.cells.rows().map(_.iter().rev().take_while(_.letter.is_none()).count()).map(|x| @@ -756,14 +771,12 @@ pub(crate) fn entry(event_loop: EventLoop<()>) { State::CodeAction(Rq{ result :Some(x), ..}) => 'out: { let m = x.maxc(); let c = x.write(m); - dbg!(&c); let (_x, _y) = text.cursor_visual(); let _x = _x + text.line_number_offset()+1; let Some(_y) = _y.checked_sub(text.vo) else { println!("rah"); break 'out }; let Ok((is_above,left, top, w, mut h)) = place_around((_x, _y), &mut fonts, i.as_mut(), &c, m, ppem, ls, 0., 0., 0.)else { println!("ra?"); break 'out}; - dbg!(c); i.r#box((left .saturating_sub(1) as _, top.saturating_sub(1) as _), w as _,h as _, BORDER); }, _ =>{}, @@ -1039,6 +1052,7 @@ hovering.request = (DropH::new(handle), cursor_position).into(); if let Some((lsp, path)) = lsp!() { sig_help.request(lsp.runtime.spawn(window.redraw_after(lsp.request_sig_help(path, text.cursor())))); } + hist.last.cursor = text.cursor; text.setc(); } Some(Do::ExtendSelectionToMouse) => { @@ -1145,8 +1159,14 @@ hovering.request = (DropH::new(handle), cursor_position).into(); Some(Do::CodeAction) => { if let Some((lsp, f)) = lsp!() { let r = lsp.request::<lsp_request!("textDocument/codeAction")>(&CodeActionParams { - text_document: f.tid(), range: text.to_l_range(text.beginning_of_line(text.cursor).unwrap() - ..text.eol(text.cursor)).unwrap(), context: CodeActionContext { trigger_kind: Some(CodeActionTriggerKind::INVOKED), ..default() }, work_done_progress_params: default(), partial_result_params: default() }).unwrap(); + text_document: f.tid(), range: text.to_l_range(text.cursor..text.cursor).unwrap(), context: CodeActionContext { + trigger_kind: Some(CodeActionTriggerKind::INVOKED), + // diagnostics: if let Some((lsp, p)) = lsp!() && let uri = Url::from_file_path(p).unwrap() && let Some(diag) = lsp.diagnostics.get(&uri, &lsp.diagnostics.guard()) { dbg!(diag.iter().filter(|x| { + + // text.l_range(x.range).unwrap().contains(&text.cursor) + // }).cloned().collect()) } else { vec![] }, + ..default() + }, work_done_progress_params: default(), partial_result_params: default() }).unwrap(); let mut r2 = Rq::default(); r2.request(lsp.runtime.spawn( @@ -1158,29 +1178,32 @@ hovering.request = (DropH::new(handle), cursor_position).into(); ); } } - Some(Do::CASelect(act)) if let Some((lsp,f)) = lsp!() => { + Some(Do::CASelectLeft) => { + let State::CodeAction(Rq{ result: Some(c), .. }) = &mut state else { panic!()}; + c.left(); + } + Some(Do::CASelectRight) =>'out: { + let Some((lsp,f)) = lsp!() else {unreachable!()}; + let State::CodeAction(Rq{ result: Some(c), .. }) = &mut state else { panic!()}; + let Some(act) = c.right() else { break 'out }; + let act = act.clone(); + state = State::Default; + hist.last.cursor = text.cursor; hist.test_push(&text); - let act = act.sel(); let act = lsp.runtime.block_on( lsp.request::<CodeActionResolveRequest>(&act).unwrap().0 ).unwrap(); let mut f_ = |edits: &[SnippetTextEdit]|{ - let mut first = false; + // let mut first = false; for SnippetTextEdit { text_edit, insert_text_format ,..}in edits { match insert_text_format { Some(InsertTextFormat::SNIPPET) => { text.apply_snippet(&text_edit).unwrap() }, _ => { - if first { - let (b, e) = text.apply(&text_edit).unwrap(); - log::error!("dont account for this case yet"); - } else { - text.apply_adjusting(text_edit).unwrap(); - } + text.apply_adjusting(text_edit).unwrap(); } } - first = false; } }; match act.edit { @@ -1219,14 +1242,13 @@ hovering.request = (DropH::new(handle), cursor_position).into(); change!(); hist.record(&text); } - Some(Do::CASelect(_)) => {} Some(Do::CASelectNext) => { let State::CodeAction(Rq{ result: Some(c), .. }) = &mut state else { panic!()}; - c.next(); + c.down(); } Some(Do::CASelectPrev) => { let State::CodeAction(Rq{ result: Some(c), .. }) = &mut state else { panic!()}; - c.back(); + c.up(); } Some(Do::Reinsert | Do::GoToDefinition) => panic!(), Some(Do::Save) => match &origin { @@ -1577,11 +1599,12 @@ Default => { K(_) => _ [Edit], M(_) => _, }, -CodeAction(Rq<act::CodeActions, Option<CodeActionResponse>,()> => Rq { result : Some(act), request: None, }) => { +CodeAction(Rq<act::CodeActions, Option<CodeActionResponse>,()> => Rq { result : Some(_x), request: None, }) => { K(Key::Named(Tab) if shift()) => _ [CASelectPrev], K(Key::Named(ArrowDown | Tab)) => _ [CASelectNext], K(Key::Named(ArrowUp)) => _ [CASelectPrev], - K(Key::Named(Enter)) => Default [CASelect(act::CodeActions => act)], + K(Key::Named(Enter | ArrowRight)) => _ [CASelectRight], + K(Key::Named(ArrowLeft)) => _ [CASelectLeft], }, CodeAction(Rq<act::CodeActions, Option<CodeActionResponse>,(), RequestError<lsp_request!("textDocument/codeAction")>> => rq) => { K(Key::Named(Escape)) => Default, |