A simple CPU rendered GUI IDE experience.
Diffstat (limited to 'src/complete.rs')
-rw-r--r--src/complete.rs48
1 files changed, 47 insertions, 1 deletions
diff --git a/src/complete.rs b/src/complete.rs
index fb326b0..ab39eb9 100644
--- a/src/complete.rs
+++ b/src/complete.rs
@@ -8,8 +8,10 @@ use lsp_types::*;
use serde::{Deserialize, Serialize};
use crate::FG;
+use crate::edi::{Editor, change, lsp};
+use crate::lsp::Rq;
use crate::menu::{Key, back, charc, filter, next, score};
-use crate::text::{col, color_, set_a};
+use crate::text::{SortTedits, col, color_, set_a};
#[derive(Serialize, Deserialize)]
pub struct Complete {
@@ -215,3 +217,47 @@ fn t() {
// println!("{:?}", now.elapsed());
x.as_ref().save("x");
}
+
+impl Editor {
+ pub fn apply_completion(&mut self, x: Complete) {
+ let Some((lsp, o)) = lsp!(self + p) else { unreachable!() };
+ let sel = x.sel(&crate::filter(&self.text));
+ let sel = lsp.resolve(sel.clone()).unwrap();
+ let CompletionItem {
+ text_edit: Some(CompletionTextEdit::Edit(ed)),
+ additional_text_edits,
+ insert_text_format,
+ ..
+ } = sel.clone()
+ else {
+ panic!()
+ };
+ match insert_text_format {
+ Some(InsertTextFormat::SNIPPET) => {
+ self.text.apply_snippet(&ed).unwrap();
+ }
+ _ => {
+ self.text.apply(&ed).unwrap();
+ // self.text
+ // .cursor
+ // .first_mut()
+ // .position =
+ // s + ed.new_text.chars().count();
+ }
+ }
+ if let Some(mut additional_tedits) = additional_text_edits {
+ additional_tedits.sort_tedits();
+ for additional in additional_tedits {
+ self.text.apply_adjusting(&additional).unwrap();
+ }
+ }
+ if self.hist.record(&self.text) {
+ change!(self, window.clone());
+ }
+ self.requests.sig_help =
+ Rq::new(lsp.runtime.spawn(lsp.request_sig_help(
+ o,
+ self.text.cursor.first().cursor(&self.text.rope),
+ )));
+ }
+}