Browse Source

Language client: cleanup of workspace/applyEdit

master
eidheim 1 month ago
parent
commit
9310077911
  1. 26
      src/source_language_protocol.cpp

26
src/source_language_protocol.cpp

@ -604,11 +604,14 @@ void LanguageProtocol::Client::handle_server_request(const boost::variant<size_t
auto current_view = Notebook::get().get_current_view();
for(auto &document_change : workspace_edit.document_changes) {
if(auto edit = boost::get<TextDocumentEdit>(&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<size_t
applied = false;
return;
}
view = Notebook::get().get_current_view();
view = dynamic_cast<Source::LanguageProtocolView *>(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 {

Loading…
Cancel
Save