Browse Source

Cleanup of autocompletion run checks

merge-requests/404/merge
eidheim 5 years ago
parent
commit
20a046db69
  1. 10
      src/source.cpp
  2. 48
      src/source_clang.cpp
  3. 31
      src/source_generic.cpp
  4. 48
      src/source_language_protocol.cpp

10
src/source.cpp

@ -928,7 +928,7 @@ void Source::View::setup_format_style(bool is_generic_view) {
try { try {
boost::property_tree::ptree pt; boost::property_tree::ptree pt;
boost::property_tree::xml_parser::read_xml(stdout_stream, 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) { for(auto it = replacements_pt.rbegin(); it != replacements_pt.rend(); ++it) {
if(it->first == "replacement") { if(it->first == "replacement") {
auto offset = it->second.get<size_t>("<xmlattr>.offset"); auto offset = it->second.get<size_t>("<xmlattr>.offset");
@ -2030,7 +2030,7 @@ bool Source::View::find_close_symbol_forward(Gtk::TextIter iter, Gtk::TextIter &
long curly_count = 0; long curly_count = 0;
do { do {
if(curly_count == 0 && *iter == positive_char && is_code_iter(iter)) { 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; auto prev = iter;
if(prev.backward_char() && *prev == '-') if(prev.backward_char() && *prev == '-')
continue; continue;
@ -2043,7 +2043,7 @@ bool Source::View::find_close_symbol_forward(Gtk::TextIter iter, Gtk::TextIter &
count++; count++;
} }
else if(curly_count == 0 && *iter == negative_char && is_code_iter(iter)) { 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; auto prev = iter;
if(prev.backward_char() && *prev == '-') if(prev.backward_char() && *prev == '-')
continue; continue;
@ -2091,7 +2091,7 @@ bool Source::View::find_open_symbol_backward(Gtk::TextIter iter, Gtk::TextIter &
long curly_count = 0; long curly_count = 0;
do { do {
if(curly_count == 0 && *iter == positive_char && is_code_iter(iter)) { 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; auto prev = iter;
if(prev.backward_char() && *prev == '-') if(prev.backward_char() && *prev == '-')
continue; continue;
@ -2108,7 +2108,7 @@ bool Source::View::find_open_symbol_backward(Gtk::TextIter iter, Gtk::TextIter &
count++; count++;
} }
else if(curly_count == 0 && *iter == negative_char && is_code_iter(iter)) { 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; auto prev = iter;
if(prev.backward_char() && *prev == '-') if(prev.backward_char() && *prev == '-')
continue; continue;

48
src/source_clang.cpp

@ -856,25 +856,29 @@ Source::ClangViewAutocomplete::ClangViewAutocomplete(const boost::filesystem::pa
}; };
autocomplete.run_check = [this]() { autocomplete.run_check = [this]() {
auto iter = get_buffer()->get_insert()->get_iter(); auto prefix_start = get_buffer()->get_insert()->get_iter();
auto prefix_end = iter; auto prefix_end = prefix_start;
auto prev = prefix_start;
prev.backward_char();
if(!is_code_iter(prev))
return false;
size_t count = 0; size_t count = 0;
while(iter.backward_char() && is_token_char(*iter)) while(prefix_start.backward_char() && is_token_char(*prefix_start))
++count; ++count;
if(count == 0)
return false;
enable_snippets = false; enable_snippets = false;
show_parameters = false; show_parameters = false;
auto prefix_start = iter; if(prefix_start != prefix_end && !is_token_char(*prefix_start))
if(prefix_start != prefix_end && !is_token_char(*iter))
prefix_start.forward_char(); prefix_start.forward_char();
auto previous = iter; prev = prefix_start;
if(*iter == '.') { prev.backward_char();
auto prevprev = prev;
if(*prev == '.') {
auto iter = prev;
bool starts_with_num = false; bool starts_with_num = false;
size_t count = 0; size_t count = 0;
while(iter.backward_char() && is_token_char(*iter)) { while(iter.backward_char() && is_token_char(*iter)) {
@ -889,8 +893,8 @@ Source::ClangViewAutocomplete::ClangViewAutocomplete(const boost::filesystem::pa
return true; return true;
} }
} }
else if((previous.backward_char() && ((*previous == ':' && *iter == ':') || (*previous == '-' && *iter == '>')))) { else if((prevprev.backward_char() && ((*prevprev == ':' && *prev == ':') || (*prevprev == '-' && *prev == '>')))) {
if(*iter == ':' || (previous.backward_char() && (is_token_char(*previous) || *previous == ')' || *previous == ']'))) { if(*prev == ':' || (prevprev.backward_char() && (is_token_char(*prevprev) || *prevprev == ')' || *prevprev == ']'))) {
{ {
LockGuard lock(autocomplete.prefix_mutex); LockGuard lock(autocomplete.prefix_mutex);
autocomplete.prefix = get_buffer()->get_text(prefix_start, prefix_end); autocomplete.prefix = get_buffer()->get_text(prefix_start, prefix_end);
@ -913,26 +917,12 @@ Source::ClangViewAutocomplete::ClangViewAutocomplete(const boost::filesystem::pa
return true; return true;
} }
if(!interactive_completion) { 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); LockGuard lock(autocomplete.prefix_mutex);
autocomplete.prefix = get_buffer()->get_text(iter, end_iter); autocomplete.prefix = get_buffer()->get_text(prefix_start, prefix_end);
}
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;
} }
auto prevprev = prev;
enable_snippets = !(*prev == '.' || (prevprev.backward_char() && ((*prevprev == ':' && *prev == ':') || (*prevprev == '-' && *prev == '>'))));
return true; return true;
} }

31
src/source_generic.cpp

@ -204,34 +204,27 @@ void Source::GenericView::setup_autocomplete() {
}; };
autocomplete.run_check = [this]() { autocomplete.run_check = [this]() {
auto start = get_buffer()->get_insert()->get_iter(); auto prefix_start = get_buffer()->get_insert()->get_iter();
auto end = start; auto prefix_end = prefix_start;
size_t count = 0; size_t count = 0;
while(start.backward_char() && is_token_char(*start)) while(prefix_start.backward_char() && is_token_char(*prefix_start))
++count; ++count;
if(!is_token_char(*start)) if(prefix_start != prefix_end && !is_token_char(*prefix_start))
start.forward_char(); 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 lock1(autocomplete.prefix_mutex);
LockGuard lock2(buffer_words_mutex); LockGuard lock2(buffer_words_mutex);
autocomplete.prefix = get_buffer()->get_text(start, end); 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(); show_prefix_buffer_word = buffer_words.find(autocomplete.prefix) != buffer_words.end();
return true; else {
} auto it = buffer_words.find(autocomplete.prefix);
else if(!interactive_completion) { show_prefix_buffer_word = !(it == buffer_words.end() || it->second == 1);
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 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; return true;
} }

48
src/source_language_protocol.cpp

@ -1630,25 +1630,29 @@ void Source::LanguageProtocolView::setup_autocomplete() {
} }
autocomplete->run_check = [this, is_possible_jsx_property]() { autocomplete->run_check = [this, is_possible_jsx_property]() {
auto iter = get_buffer()->get_insert()->get_iter(); auto prefix_start = get_buffer()->get_insert()->get_iter();
auto prefix_end = iter; auto prefix_end = prefix_start;
auto prev = prefix_start;
prev.backward_char();
if(!is_code_iter(prev))
return false;
size_t count = 0; size_t count = 0;
while(iter.backward_char() && is_token_char(*iter)) while(prefix_start.backward_char() && is_token_char(*prefix_start))
++count; ++count;
if(count == 0)
return false;
autocomplete_enable_snippets = false; autocomplete_enable_snippets = false;
autocomplete_show_arguments = false; autocomplete_show_arguments = false;
auto prefix_start = iter; if(prefix_start != prefix_end && !is_token_char(*prefix_start))
if(prefix_start != prefix_end && !is_token_char(*iter))
prefix_start.forward_char(); prefix_start.forward_char();
auto previous = iter; prev = prefix_start;
if(*iter == '.') { prev.backward_char();
auto prevprev = prev;
if(*prev == '.') {
auto iter = prev;
bool starts_with_num = false; bool starts_with_num = false;
size_t count = 0; size_t count = 0;
while(iter.backward_char() && is_token_char(*iter)) { while(iter.backward_char() && is_token_char(*iter)) {
@ -1663,7 +1667,7 @@ void Source::LanguageProtocolView::setup_autocomplete() {
return true; return true;
} }
} }
else if((previous.backward_char() && *previous == ':' && *iter == ':')) { else if((prevprev.backward_char() && *prevprev == ':' && *prev == ':')) {
{ {
LockGuard lock(autocomplete->prefix_mutex); LockGuard lock(autocomplete->prefix_mutex);
autocomplete->prefix = get_buffer()->get_text(prefix_start, prefix_end); autocomplete->prefix = get_buffer()->get_text(prefix_start, prefix_end);
@ -1678,7 +1682,7 @@ void Source::LanguageProtocolView::setup_autocomplete() {
autocomplete_enable_snippets = true; autocomplete_enable_snippets = true;
return true; return true;
} }
if(is_possible_jsx_property(iter)) { if(is_possible_jsx_property(prefix_start)) {
LockGuard lock(autocomplete->prefix_mutex); LockGuard lock(autocomplete->prefix_mutex);
autocomplete->prefix = ""; autocomplete->prefix = "";
return true; return true;
@ -1690,26 +1694,12 @@ void Source::LanguageProtocolView::setup_autocomplete() {
return true; return true;
} }
if(!interactive_completion) { 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); LockGuard lock(autocomplete->prefix_mutex);
autocomplete->prefix = get_buffer()->get_text(iter, end_iter); autocomplete->prefix = get_buffer()->get_text(prefix_start, prefix_end);
}
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;
} }
auto prevprev = prev;
autocomplete_enable_snippets = !(*prev == '.' || (prevprev.backward_char() && *prevprev == ':' && *prev == ':'));
return true; return true;
} }

Loading…
Cancel
Save