|
|
|
@ -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 { |
|
|
|
|