From 4999f003f3fc9ee6a7eeb76e06e0f784322dd312 Mon Sep 17 00:00:00 2001 From: Dongdong Zhou Date: Sat, 2 Jul 2022 20:49:16 +0100 Subject: [PATCH] get inlay hints only when editing --- lapce-data/src/document.rs | 57 ++++++++++++++++++++++++++++++++++- lapce-data/src/editor.rs | 59 ------------------------------------- lapce-ui/src/editor/view.rs | 1 - lapce-ui/src/tab.rs | 2 +- 4 files changed, 57 insertions(+), 62 deletions(-) diff --git a/lapce-data/src/document.rs b/lapce-data/src/document.rs index 4f315b69..f0393e02 100644 --- a/lapce-data/src/document.rs +++ b/lapce-data/src/document.rs @@ -39,7 +39,10 @@ }; use serde::{Deserialize, Serialize}; use smallvec::SmallVec; -use xi_rope::{spans::Spans, Rope, RopeDelta}; +use xi_rope::{ + spans::{Spans, SpansBuilder}, + Interval, Rope, RopeDelta, +}; use crate::{ command::{LapceUICommand, LAPCE_UI_COMMAND}, @@ -610,9 +613,61 @@ pub fn update_history_styles( } } + pub fn get_inlay_hints(&self) { + if !self.loaded() { + return; + } + + if !self.content().is_file() { + return; + } + + if let BufferContent::File(path) = self.content() { + let tab_id = self.tab_id; + let path = path.clone(); + let buffer_id = self.id(); + let rev = self.rev(); + let len = self.buffer().len(); + let buffer = self.buffer().clone(); + let event_sink = self.event_sink.clone(); + self.proxy.get_inlay_hints( + buffer_id, + Box::new(move |result| { + if let Ok(res) = result { + if let Ok(resp) = + serde_json::from_value::>(res) + { + let mut hints_span = SpansBuilder::new(len); + for hint in resp { + let offset = buffer + .offset_of_position(&hint.position) + .min(len); + hints_span.add_span( + Interval::new(offset, (offset + 1).min(len)), + hint.clone(), + ); + } + let hints = hints_span.build(); + let _ = event_sink.submit_command( + LAPCE_UI_COMMAND, + LapceUICommand::UpdateInlayHints { + path, + rev, + hints, + }, + Target::Widget(tab_id), + ); + } + } + }), + ); + } + } + fn on_update(&mut self, delta: Option<&RopeDelta>) { self.find.borrow_mut().unset(); *self.find_progress.borrow_mut() = FindProgress::Started; + self.get_inlay_hints(); self.clear_style_cache(); self.trigger_syntax_change(delta); self.trigger_head_change(); diff --git a/lapce-data/src/editor.rs b/lapce-data/src/editor.rs index 6b273504..0a397c40 100644 --- a/lapce-data/src/editor.rs +++ b/lapce-data/src/editor.rs @@ -44,7 +44,6 @@ use lsp_types::CompletionTextEdit; use lsp_types::DocumentChangeOperation; use lsp_types::DocumentChanges; -use lsp_types::InlayHint; use lsp_types::OneOf; use lsp_types::TextEdit; use lsp_types::Url; @@ -60,8 +59,6 @@ use std::{collections::HashMap, sync::Arc}; use std::{iter::Iterator, path::PathBuf}; use std::{str::FromStr, time::Duration}; -use xi_rope::spans::SpansBuilder; -use xi_rope::Interval; use xi_rope::{RopeDelta, Transformer}; pub struct LapceUI {} @@ -153,62 +150,6 @@ fn inline_find( } } - pub fn get_inlay_hints(&self, ctx: &mut EventCtx) { - if !self.doc.loaded() { - return; - } - - if !self.doc.content().is_file() { - return; - } - - if !self.config.editor.enable_inlay_hints { - return; - } - - if let BufferContent::File(path) = self.doc.content() { - // TODO: check if we already have inlay hints for this file? - let tab_id = self.doc.tab_id; - let path = path.clone(); - let buffer_id = self.doc.id(); - let rev = self.doc.rev(); - let event_sink = ctx.get_external_handle(); - let len = self.doc.buffer().len(); - let buffer = self.doc.buffer().clone(); - self.proxy.get_inlay_hints( - buffer_id, - Box::new(move |result| { - if let Ok(res) = result { - if let Ok(resp) = - serde_json::from_value::>(res) - { - let mut hints_span = SpansBuilder::new(len); - for hint in resp { - let offset = buffer - .offset_of_position(&hint.position) - .min(len); - hints_span.add_span( - Interval::new(offset, (offset + 1).min(len)), - hint.clone(), - ); - } - let hints = hints_span.build(); - let _ = event_sink.submit_command( - LAPCE_UI_COMMAND, - LapceUICommand::UpdateInlayHints { - path, - rev, - hints, - }, - Target::Widget(tab_id), - ); - } - } - }), - ); - } - } - pub fn get_code_actions(&self, ctx: &mut EventCtx) { if !self.doc.loaded() { return; diff --git a/lapce-ui/src/editor/view.rs b/lapce-ui/src/editor/view.rs index 4d559ac5..d517bfae 100644 --- a/lapce-ui/src/editor/view.rs +++ b/lapce-ui/src/editor/view.rs @@ -627,7 +627,6 @@ fn event( editor_data.sync_buffer_position( self.editor.widget().editor.widget().inner().offset(), ); - editor_data.get_inlay_hints(ctx); editor_data.get_code_actions(ctx); data.keypress = keypress.clone(); diff --git a/lapce-ui/src/tab.rs b/lapce-ui/src/tab.rs index b667a3b5..7b4c03e3 100644 --- a/lapce-ui/src/tab.rs +++ b/lapce-ui/src/tab.rs @@ -957,7 +957,7 @@ fn handle_event( { let editor_data = data.editor_view_content(*view_id); - editor_data.get_inlay_hints(ctx); + editor_data.doc.get_inlay_hints(); } for i in data .progresses