From 20a046db69565dd3958e6fb8c65f38dfb960fd2a Mon Sep 17 00:00:00 2001 From: eidheim Date: Tue, 8 Jun 2021 14:07:17 +0200 Subject: [PATCH] Cleanup of autocompletion run checks --- src/source.cpp | 10 +++---- src/source_clang.cpp | 48 +++++++++++++------------------- src/source_generic.cpp | 33 +++++++++------------- src/source_language_protocol.cpp | 48 +++++++++++++------------------- 4 files changed, 56 insertions(+), 83 deletions(-) diff --git a/src/source.cpp b/src/source.cpp index 4eb6ab8..679b647 100644 --- a/src/source.cpp +++ b/src/source.cpp @@ -928,7 +928,7 @@ void Source::View::setup_format_style(bool is_generic_view) { try { boost::property_tree::ptree pt; boost::property_tree::xml_parser::read_xml(stdout_stream, pt); - auto replacements_pt = pt.get_child("replacements"); + auto replacements_pt = pt.get_child("replacements", boost::property_tree::ptree()); for(auto it = replacements_pt.rbegin(); it != replacements_pt.rend(); ++it) { if(it->first == "replacement") { auto offset = it->second.get(".offset"); @@ -2030,7 +2030,7 @@ bool Source::View::find_close_symbol_forward(Gtk::TextIter iter, Gtk::TextIter & long curly_count = 0; do { if(curly_count == 0 && *iter == positive_char && is_code_iter(iter)) { - if(is_cpp && positive_char == '>') { + if((is_c || is_cpp) && positive_char == '>') { auto prev = iter; if(prev.backward_char() && *prev == '-') continue; @@ -2043,7 +2043,7 @@ bool Source::View::find_close_symbol_forward(Gtk::TextIter iter, Gtk::TextIter & count++; } else if(curly_count == 0 && *iter == negative_char && is_code_iter(iter)) { - if(is_cpp && negative_char == '>') { + if((is_c || is_cpp) && negative_char == '>') { auto prev = iter; if(prev.backward_char() && *prev == '-') continue; @@ -2091,7 +2091,7 @@ bool Source::View::find_open_symbol_backward(Gtk::TextIter iter, Gtk::TextIter & long curly_count = 0; do { if(curly_count == 0 && *iter == positive_char && is_code_iter(iter)) { - if(is_cpp && positive_char == '>') { + if((is_c || is_cpp) && positive_char == '>') { auto prev = iter; if(prev.backward_char() && *prev == '-') continue; @@ -2108,7 +2108,7 @@ bool Source::View::find_open_symbol_backward(Gtk::TextIter iter, Gtk::TextIter & count++; } else if(curly_count == 0 && *iter == negative_char && is_code_iter(iter)) { - if(is_cpp && negative_char == '>') { + if((is_c || is_cpp) && negative_char == '>') { auto prev = iter; if(prev.backward_char() && *prev == '-') continue; diff --git a/src/source_clang.cpp b/src/source_clang.cpp index 2d87481..29e618c 100644 --- a/src/source_clang.cpp +++ b/src/source_clang.cpp @@ -856,25 +856,29 @@ Source::ClangViewAutocomplete::ClangViewAutocomplete(const boost::filesystem::pa }; autocomplete.run_check = [this]() { - auto iter = get_buffer()->get_insert()->get_iter(); - auto prefix_end = iter; + auto prefix_start = get_buffer()->get_insert()->get_iter(); + auto prefix_end = prefix_start; + + auto prev = prefix_start; + prev.backward_char(); + if(!is_code_iter(prev)) + return false; size_t count = 0; - while(iter.backward_char() && is_token_char(*iter)) + while(prefix_start.backward_char() && is_token_char(*prefix_start)) ++count; - if(count == 0) - return false; - enable_snippets = false; show_parameters = false; - auto prefix_start = iter; - if(prefix_start != prefix_end && !is_token_char(*iter)) + if(prefix_start != prefix_end && !is_token_char(*prefix_start)) prefix_start.forward_char(); - auto previous = iter; - if(*iter == '.') { + prev = prefix_start; + prev.backward_char(); + auto prevprev = prev; + if(*prev == '.') { + auto iter = prev; bool starts_with_num = false; size_t count = 0; while(iter.backward_char() && is_token_char(*iter)) { @@ -889,8 +893,8 @@ Source::ClangViewAutocomplete::ClangViewAutocomplete(const boost::filesystem::pa return true; } } - else if((previous.backward_char() && ((*previous == ':' && *iter == ':') || (*previous == '-' && *iter == '>')))) { - if(*iter == ':' || (previous.backward_char() && (is_token_char(*previous) || *previous == ')' || *previous == ']'))) { + else if((prevprev.backward_char() && ((*prevprev == ':' && *prev == ':') || (*prevprev == '-' && *prev == '>')))) { + if(*prev == ':' || (prevprev.backward_char() && (is_token_char(*prevprev) || *prevprev == ')' || *prevprev == ']'))) { { LockGuard lock(autocomplete.prefix_mutex); autocomplete.prefix = get_buffer()->get_text(prefix_start, prefix_end); @@ -913,26 +917,12 @@ Source::ClangViewAutocomplete::ClangViewAutocomplete(const boost::filesystem::pa return true; } if(!interactive_completion) { - auto end_iter = get_buffer()->get_insert()->get_iter(); - auto iter = end_iter; - while(iter.backward_char() && is_token_char(*iter)) { - } - if(iter != end_iter) - iter.forward_char(); - { LockGuard lock(autocomplete.prefix_mutex); - autocomplete.prefix = get_buffer()->get_text(iter, end_iter); - } - auto prev1 = iter; - if(prev1.backward_char() && *prev1 != '.') { - auto prev2 = prev1; - if(!prev2.backward_char()) - enable_snippets = true; - else if(!(*prev2 == ':' && *prev1 == ':') && !(*prev2 == '-' && *prev1 == '>')) - enable_snippets = true; + autocomplete.prefix = get_buffer()->get_text(prefix_start, prefix_end); } - + auto prevprev = prev; + enable_snippets = !(*prev == '.' || (prevprev.backward_char() && ((*prevprev == ':' && *prev == ':') || (*prevprev == '-' && *prev == '>')))); return true; } diff --git a/src/source_generic.cpp b/src/source_generic.cpp index b43c29e..d310bc4 100644 --- a/src/source_generic.cpp +++ b/src/source_generic.cpp @@ -204,34 +204,27 @@ void Source::GenericView::setup_autocomplete() { }; autocomplete.run_check = [this]() { - auto start = get_buffer()->get_insert()->get_iter(); - auto end = start; + auto prefix_start = get_buffer()->get_insert()->get_iter(); + auto prefix_end = prefix_start; size_t count = 0; - while(start.backward_char() && is_token_char(*start)) + while(prefix_start.backward_char() && is_token_char(*prefix_start)) ++count; - if(!is_token_char(*start)) - start.forward_char(); + if(prefix_start != prefix_end && !is_token_char(*prefix_start)) + prefix_start.forward_char(); - if(count >= 3 && !(*start >= '0' && *start <= '9')) { + if((count >= 3 && !(*prefix_start >= '0' && *prefix_start <= '9')) || !interactive_completion) { LockGuard lock1(autocomplete.prefix_mutex); LockGuard lock2(buffer_words_mutex); - autocomplete.prefix = get_buffer()->get_text(start, end); - show_prefix_buffer_word = buffer_words.find(autocomplete.prefix) != buffer_words.end(); - return true; - } - else if(!interactive_completion) { - auto end_iter = get_buffer()->get_insert()->get_iter(); - auto iter = end_iter; - while(iter.backward_char() && is_token_char(*iter)) { + autocomplete.prefix = get_buffer()->get_text(prefix_start, prefix_end); + + if(interactive_completion) + show_prefix_buffer_word = buffer_words.find(autocomplete.prefix) != buffer_words.end(); + else { + auto it = buffer_words.find(autocomplete.prefix); + show_prefix_buffer_word = !(it == buffer_words.end() || it->second == 1); } - if(iter != end_iter) - iter.forward_char(); - LockGuard lock1(autocomplete.prefix_mutex); - LockGuard lock2(buffer_words_mutex); - autocomplete.prefix = get_buffer()->get_text(iter, end_iter); - show_prefix_buffer_word = buffer_words.find(autocomplete.prefix) != buffer_words.end(); return true; } diff --git a/src/source_language_protocol.cpp b/src/source_language_protocol.cpp index f67b0c4..b035db6 100644 --- a/src/source_language_protocol.cpp +++ b/src/source_language_protocol.cpp @@ -1630,25 +1630,29 @@ void Source::LanguageProtocolView::setup_autocomplete() { } autocomplete->run_check = [this, is_possible_jsx_property]() { - auto iter = get_buffer()->get_insert()->get_iter(); - auto prefix_end = iter; + auto prefix_start = get_buffer()->get_insert()->get_iter(); + auto prefix_end = prefix_start; + + auto prev = prefix_start; + prev.backward_char(); + if(!is_code_iter(prev)) + return false; size_t count = 0; - while(iter.backward_char() && is_token_char(*iter)) + while(prefix_start.backward_char() && is_token_char(*prefix_start)) ++count; - if(count == 0) - return false; - autocomplete_enable_snippets = false; autocomplete_show_arguments = false; - auto prefix_start = iter; - if(prefix_start != prefix_end && !is_token_char(*iter)) + if(prefix_start != prefix_end && !is_token_char(*prefix_start)) prefix_start.forward_char(); - auto previous = iter; - if(*iter == '.') { + prev = prefix_start; + prev.backward_char(); + auto prevprev = prev; + if(*prev == '.') { + auto iter = prev; bool starts_with_num = false; size_t count = 0; while(iter.backward_char() && is_token_char(*iter)) { @@ -1663,7 +1667,7 @@ void Source::LanguageProtocolView::setup_autocomplete() { return true; } } - else if((previous.backward_char() && *previous == ':' && *iter == ':')) { + else if((prevprev.backward_char() && *prevprev == ':' && *prev == ':')) { { LockGuard lock(autocomplete->prefix_mutex); autocomplete->prefix = get_buffer()->get_text(prefix_start, prefix_end); @@ -1678,7 +1682,7 @@ void Source::LanguageProtocolView::setup_autocomplete() { autocomplete_enable_snippets = true; return true; } - if(is_possible_jsx_property(iter)) { + if(is_possible_jsx_property(prefix_start)) { LockGuard lock(autocomplete->prefix_mutex); autocomplete->prefix = ""; return true; @@ -1690,26 +1694,12 @@ void Source::LanguageProtocolView::setup_autocomplete() { return true; } if(!interactive_completion) { - auto end_iter = get_buffer()->get_insert()->get_iter(); - auto iter = end_iter; - while(iter.backward_char() && is_token_char(*iter)) { - } - if(iter != end_iter) - iter.forward_char(); - { LockGuard lock(autocomplete->prefix_mutex); - autocomplete->prefix = get_buffer()->get_text(iter, end_iter); - } - auto prev1 = iter; - if(prev1.backward_char() && *prev1 != '.') { - auto prev2 = prev1; - if(!prev2.backward_char()) - autocomplete_enable_snippets = true; - else if(!(*prev2 == ':' && *prev1 == ':')) - autocomplete_enable_snippets = true; + autocomplete->prefix = get_buffer()->get_text(prefix_start, prefix_end); } - + auto prevprev = prev; + autocomplete_enable_snippets = !(*prev == '.' || (prevprev.backward_char() && *prevprev == ':' && *prev == ':')); return true; }