From ed292c8c897efaaafe9ff1d32a64df2e2703b48f Mon Sep 17 00:00:00 2001 From: eidheim Date: Wed, 26 Aug 2020 12:21:14 +0200 Subject: [PATCH] C/C++: corrected reparse after autocomplete error --- src/autocomplete.cpp | 8 +++++--- src/autocomplete.hpp | 4 ++-- src/source_clang.cpp | 8 +++----- src/source_generic.cpp | 6 +----- src/source_language_protocol.cpp | 7 ++----- 5 files changed, 13 insertions(+), 20 deletions(-) diff --git a/src/autocomplete.cpp b/src/autocomplete.cpp index 06eba50..55d8fc7 100644 --- a/src/autocomplete.cpp +++ b/src/autocomplete.cpp @@ -76,11 +76,13 @@ void Autocomplete::run() { return; stop_parse(); - auto &buffer_raw = const_cast(buffer.raw()); rows.clear(); - add_rows(buffer_raw, line_nr, column_nr); + auto &buffer_raw = const_cast(buffer.raw()); + bool success = add_rows(buffer_raw, line_nr, column_nr); + if(!is_processing()) + return; - if(is_processing()) { + if(success) { dispatcher.post([this]() { after_add_rows(); if(state == State::restarting) { diff --git a/src/autocomplete.hpp b/src/autocomplete.hpp index dd22091..55a14bb 100644 --- a/src/autocomplete.hpp +++ b/src/autocomplete.hpp @@ -42,8 +42,8 @@ public: std::function after_add_rows = [] {}; std::function on_add_rows_error = [] {}; - /// The handler is not run in the main loop. - std::function add_rows = [](std::string &, int, int) {}; + /// The handler is not run in the main loop. Should return false on error. + std::function add_rows = [](std::string &, int, int) { return true; }; std::function on_show = [] {}; std::function on_hide = [] {}; diff --git a/src/source_clang.cpp b/src/source_clang.cpp index 539b39c..24ba741 100644 --- a/src/source_clang.cpp +++ b/src/source_clang.cpp @@ -919,11 +919,8 @@ Source::ClangViewAutocomplete::ClangViewAutocomplete(const boost::filesystem::pa if(this->language && (this->language->get_id() == "chdr" || this->language->get_id() == "cpphdr")) clangmm::remove_include_guard(buffer); code_complete_results = std::make_unique(clang_tu->get_code_completions(buffer, line_number, column)); - if(!code_complete_results->cx_results) { - auto expected = ParseState::processing; - parse_state.compare_exchange_strong(expected, ParseState::restarting); - return; - } + if(!code_complete_results->cx_results) + return false; if(autocomplete.state == Autocomplete::State::starting) { std::string prefix; @@ -1011,6 +1008,7 @@ Source::ClangViewAutocomplete::ClangViewAutocomplete(const boost::filesystem::pa } } } + return true; }; autocomplete.on_show = [this] { diff --git a/src/source_generic.cpp b/src/source_generic.cpp index e393e74..2de0950 100644 --- a/src/source_generic.cpp +++ b/src/source_generic.cpp @@ -245,11 +245,6 @@ void Source::GenericView::setup_autocomplete() { update_status_state(this); }; - autocomplete.on_add_rows_error = [this] { - autocomplete_comment.clear(); - autocomplete_insert.clear(); - }; - autocomplete.add_rows = [this](std::string &buffer, int line_number, int column) { if(autocomplete.state == Autocomplete::State::starting) { autocomplete_comment.clear(); @@ -290,6 +285,7 @@ void Source::GenericView::setup_autocomplete() { } } } + return true; }; autocomplete.on_show = [this] { diff --git a/src/source_language_protocol.cpp b/src/source_language_protocol.cpp index 9309ed2..a89f647 100644 --- a/src/source_language_protocol.cpp +++ b/src/source_language_protocol.cpp @@ -1526,17 +1526,13 @@ void Source::LanguageProtocolView::setup_autocomplete() { update_status_state(this); }; - autocomplete->on_add_rows_error = [this] { - autocomplete_rows.clear(); - }; - autocomplete->add_rows = [this](std::string &buffer, int line_number, int column) { if(autocomplete->state == Autocomplete::State::starting) { autocomplete_rows.clear(); std::promise result_processed; if(autocomplete_show_arguments) { if(!capabilities.signature_help) - return; + return true; dispatcher.post([this, line_number, column, &result_processed] { // Find current parameter number and previously used named parameters unsigned current_parameter_position = 0; @@ -1681,6 +1677,7 @@ void Source::LanguageProtocolView::setup_autocomplete() { } result_processed.get_future().get(); } + return true; }; autocomplete->on_show = [this] {