From a824fe4ec4d2b77f081aa1bdd5ad94ec2d8d3da4 Mon Sep 17 00:00:00 2001 From: eidheim Date: Fri, 28 Jun 2019 20:43:53 +0200 Subject: [PATCH] Language protocol: added workaround for extreme line and character values --- src/source_language_protocol.cc | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/src/source_language_protocol.cc b/src/source_language_protocol.cc index 614f0a2..153085c 100644 --- a/src/source_language_protocol.cc +++ b/src/source_language_protocol.cc @@ -17,8 +17,25 @@ const std::string type_coverage_message = "Un-type checked code. Consider adding type annotations."; -LanguageProtocol::Offset::Offset(const boost::property_tree::ptree &pt) : line(pt.get("line")), character(pt.get("character")) {} - +LanguageProtocol::Offset::Offset(const boost::property_tree::ptree &pt) { + try { + line = pt.get("line"); + character = pt.get("character"); + } + catch(...) { + // Workaround for buggy rls + auto line = pt.get("line"); + auto character = pt.get("character"); + if(line > static_cast(std::numeric_limits::max())) + this->line = std::numeric_limits::max(); + else + this->line = line; + if(character > static_cast(std::numeric_limits::max())) + this->character = std::numeric_limits::max(); + else + this->character = character; + } +} LanguageProtocol::Range::Range(const boost::property_tree::ptree &pt) : start(pt.get_child("start")), end(pt.get_child("end")) {} LanguageProtocol::Location::Location(const boost::property_tree::ptree &pt, std::string file_) : range(pt.get_child("range")) { @@ -1153,7 +1170,7 @@ void Source::LanguageProtocolView::apply_clickable_tag(const Gtk::TextIter &iter if(current_request != request_count || !clickable_tag_applied) return; get_buffer()->remove_tag(clickable_tag, get_buffer()->begin(), get_buffer()->end()); - auto range = get_token_iters(get_iter_at_line_offset(line, offset)); + auto range = get_token_iters(get_iter_at_line_pos(line, offset)); get_buffer()->apply_tag(clickable_tag, range.first, range.second); }); } @@ -1534,8 +1551,8 @@ void Source::LanguageProtocolView::update_type_coverage() { type_coverage_marks.clear(); get_buffer()->remove_tag_by_name("def:warning_underline", get_buffer()->begin(), get_buffer()->end()); for(auto &range : ranges) { - auto start = get_iter_at_line_offset(range.start.line, range.start.character); - auto end = get_iter_at_line_offset(range.end.line, range.end.character); + auto start = get_iter_at_line_pos(range.start.line, range.start.character); + auto end = get_iter_at_line_pos(range.end.line, range.end.character); add_diagnostic_tooltip(start, end, false, [](const Glib::RefPtr &buffer) { buffer->insert_at_cursor(type_coverage_message); });