From 93100779114f9e97ba115750e6d5ec8362c9b18a Mon Sep 17 00:00:00 2001 From: eidheim Date: Tue, 24 Mar 2026 19:19:47 +0100 Subject: [PATCH] Language client: cleanup of workspace/applyEdit --- src/source_language_protocol.cpp | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/source_language_protocol.cpp b/src/source_language_protocol.cpp index 7f1b37a..d1802fe 100644 --- a/src/source_language_protocol.cpp +++ b/src/source_language_protocol.cpp @@ -604,11 +604,14 @@ void LanguageProtocol::Client::handle_server_request(const boost::variant(&document_change)) { - Source::View *view = nullptr; - for(auto &e : Source::View::views) { - if(e->file_path == edit->file) { - view = e; - break; + Source::LanguageProtocolView *view = nullptr; + { + LockGuard lock(views_mutex); + for(auto &e : views) { + if(e->file_path == edit->file) { + view = e; + break; + } } } if(!view) { @@ -616,23 +619,22 @@ void LanguageProtocol::Client::handle_server_request(const boost::variant(Notebook::get().get_current_view()); + if(!view) { + applied = false; + return; + } } auto buffer = view->get_buffer(); buffer->begin_user_action(); - auto get_line_pos = [this](Source::View *view, const Gtk::TextIter &iter) -> int { - if(capabilities.use_line_index) - return iter.get_line_index(); - return utf16_code_unit_count(view->get_line(iter), 0, iter.get_line_index()); - }; auto end_iter = buffer->end(); // If entire buffer is replaced if(edit->text_edits.size() == 1 && edit->text_edits[0].range.start.line == 0 && edit->text_edits[0].range.start.character == 0 && (edit->text_edits[0].range.end.line > end_iter.get_line() || - (edit->text_edits[0].range.end.line == end_iter.get_line() && edit->text_edits[0].range.end.character >= get_line_pos(view, end_iter)))) { + (edit->text_edits[0].range.end.line == end_iter.get_line() && edit->text_edits[0].range.end.character >= view->get_line_pos(end_iter)))) { view->replace_text(edit->text_edits[0].new_text); } else {