Browse Source

Language protocol: added support for textDocument/rename result with documentChanges array

merge-requests/365/head
eidheim 8 years ago
parent
commit
a7a52b5976
  1. 53
      src/source_language_protocol.cc

53
src/source_language_protocol.cc

@ -9,6 +9,7 @@
#endif #endif
#include <regex> #include <regex>
#include <future> #include <future>
#include <limits>
const bool output_messages_and_errors=false; const bool output_messages_and_errors=false;
@ -581,6 +582,7 @@ void Source::LanguageProtocolView::setup_navigation_and_refactoring() {
class Usages { class Usages {
public: public:
boost::filesystem::path path; boost::filesystem::path path;
std::unique_ptr<std::string> new_text;
std::vector<std::pair<Offset, Offset>> offsets; std::vector<std::pair<Offset, Offset>> offsets;
}; };
@ -600,7 +602,7 @@ void Source::LanguageProtocolView::setup_navigation_and_refactoring() {
auto path=file_it->first; auto path=file_it->first;
if(path.size()>=7) { if(path.size()>=7) {
path.erase(0, 7); path.erase(0, 7);
usages.emplace_back(Usages{path, std::vector<std::pair<Offset, Offset>>()}); usages.emplace_back(Usages{path, nullptr, std::vector<std::pair<Offset, Offset>>()});
for(auto edit_it=file_it->second.begin();edit_it!=file_it->second.end();++edit_it) { for(auto edit_it=file_it->second.begin();edit_it!=file_it->second.end();++edit_it) {
auto range_it=edit_it->second.find("range"); auto range_it=edit_it->second.find("range");
if(range_it!=edit_it->second.not_found()) { if(range_it!=edit_it->second.not_found()) {
@ -614,6 +616,38 @@ void Source::LanguageProtocolView::setup_navigation_and_refactoring() {
} }
} }
} }
else {
auto changes_pt=result.get_child("documentChanges", boost::property_tree::ptree());
for(auto change_it=changes_pt.begin();change_it!=changes_pt.end();++change_it) {
auto document_it=change_it->second.find("textDocument");
if(document_it!=change_it->second.not_found()) {
auto path=document_it->second.get<std::string>("uri", "");
if(path.size()>=7) {
path.erase(0, 7);
usages.emplace_back(Usages{path, std::make_unique<std::string>(), std::vector<std::pair<Offset, Offset>>()});
auto edits_pt=change_it->second.get_child("edits", boost::property_tree::ptree());
for(auto edit_it=edits_pt.begin();edit_it!=edits_pt.end();++edit_it) {
auto new_text_it=edit_it->second.find("newText");
if(new_text_it!=edit_it->second.not_found()) {
auto range_it=edit_it->second.find("range");
if(range_it!=edit_it->second.not_found()) {
auto start_it=range_it->second.find("start");
auto end_it=range_it->second.find("end");
if(start_it!=range_it->second.not_found() && end_it!=range_it->second.not_found()) {
auto end_line=end_it->second.get<size_t>("line");
if(end_line>std::numeric_limits<int>::max())
end_line=std::numeric_limits<int>::max();
*usages.back().new_text=new_text_it->second.get_value<std::string>();
usages.back().offsets.emplace_back(std::make_pair(Offset(start_it->second.get<unsigned>("line"), start_it->second.get<unsigned>("character")),
Offset(static_cast<unsigned>(end_line), end_it->second.get<unsigned>("character"))));
}
}
}
}
}
}
}
}
} }
catch(...) { catch(...) {
usages.clear(); usages.clear();
@ -639,6 +673,9 @@ void Source::LanguageProtocolView::setup_navigation_and_refactoring() {
auto end_iter=(*view_it)->get_iter_at_line_pos(offset_it->second.line, offset_it->second.index); auto end_iter=(*view_it)->get_iter_at_line_pos(offset_it->second.line, offset_it->second.index);
(*view_it)->get_buffer()->erase(start_iter, end_iter); (*view_it)->get_buffer()->erase(start_iter, end_iter);
start_iter=(*view_it)->get_iter_at_line_pos(offset_it->first.line, offset_it->first.index); start_iter=(*view_it)->get_iter_at_line_pos(offset_it->first.line, offset_it->first.index);
if(usage.new_text)
(*view_it)->get_buffer()->insert(start_iter, *usage.new_text);
else
(*view_it)->get_buffer()->insert(start_iter, text); (*view_it)->get_buffer()->insert(start_iter, text);
} }
(*view_it)->get_buffer()->end_user_action(); (*view_it)->get_buffer()->end_user_action();
@ -662,13 +699,21 @@ void Source::LanguageProtocolView::setup_navigation_and_refactoring() {
for(auto offset_it=usage.offsets.rbegin();offset_it!=usage.offsets.rend();++offset_it) { for(auto offset_it=usage.offsets.rbegin();offset_it!=usage.offsets.rend();++offset_it) {
auto start_line=offset_it->first.line; auto start_line=offset_it->first.line;
auto end_line=offset_it->second.line; auto end_line=offset_it->second.line;
if(start_line<lines_start_pos.size() && end_line<lines_start_pos.size()) { if(start_line<lines_start_pos.size()) {
auto start=lines_start_pos[start_line]+offset_it->first.index; auto start=lines_start_pos[start_line]+offset_it->first.index;
auto end=lines_start_pos[end_line]+offset_it->second.index; unsigned end;
if(start<buffer.size() && end<=buffer.size()) if(end_line>=lines_start_pos.size())
end=buffer.size();
else
end=lines_start_pos[end_line]+offset_it->second.index;
if(start<buffer.size() && end<=buffer.size()) {
if(usage.new_text)
buffer.replace(start, end-start, *usage.new_text);
else
buffer.replace(start, end-start, text); buffer.replace(start, end-start, text);
} }
} }
}
stream.write(buffer.data(), buffer.bytes()); stream.write(buffer.data(), buffer.bytes());
usages_renamed.emplace_back(&usage); usages_renamed.emplace_back(&usage);
} }

Loading…
Cancel
Save