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(); auto current_view = Notebook::get().get_current_view();
for(auto &document_change : workspace_edit.document_changes) { for(auto &document_change : workspace_edit.document_changes) {
if(auto edit = boost::get<TextDocumentEdit>(&document_change)) { if(auto edit = boost::get<TextDocumentEdit>(&document_change)) {
Source::View *view = nullptr; Source::LanguageProtocolView *view = nullptr;
for(auto &e : Source::View::views) { {
if(e->file_path == edit->file) { LockGuard lock(views_mutex);
view = e; for(auto &e : views) {
break; if(e->file_path == edit->file) {
view = e;
break;
}
} }
} }
if(!view) { if(!view) {
@ -616,23 +619,22 @@ void LanguageProtocol::Client::handle_server_request(const boost::variant<size_t
applied = false; applied = false;
return; 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(); auto buffer = view->get_buffer();
buffer->begin_user_action(); 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(); auto end_iter = buffer->end();
// If entire buffer is replaced // If entire buffer is replaced
if(edit->text_edits.size() == 1 && 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.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.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); view->replace_text(edit->text_edits[0].new_text);
} }
else { else {

Loading…
Cancel
Save