Browse Source

Fixed autocomplete on for instance '.' after newline

merge-requests/413/head
eidheim 3 years ago
parent
commit
c2d31f20ff
  1. 7
      src/source_base.cpp
  2. 1
      src/source_base.hpp
  3. 26
      src/source_clang.cpp
  4. 19
      src/source_language_protocol.cpp

7
src/source_base.cpp

@ -884,9 +884,14 @@ Gtk::TextIter Source::BaseView::get_tabs_end_iter() {
return get_tabs_end_iter(get_buffer()->get_insert()); return get_tabs_end_iter(get_buffer()->get_insert());
} }
bool Source::BaseView::is_whitespace_char(gunichar chr) {
return chr == ' ' || chr == '\t' || chr == '\n' || chr == '\r' || chr == '\f';
}
bool Source::BaseView::is_token_char(gunichar chr) { bool Source::BaseView::is_token_char(gunichar chr) {
return (chr >= 'A' && chr <= 'Z') || (chr >= 'a' && chr <= 'z') || (chr >= '0' && chr <= '9') || chr == '_' || chr == '$' || chr >= 128 || return (chr >= 'A' && chr <= 'Z') || (chr >= 'a' && chr <= 'z') || (chr >= '0' && chr <= '9') || chr == '_' || chr == '$' || chr >= 128 ||
(language_id == "css" && chr == '-'); (language_id == "css" && chr == '-') ||
(language_id == "rust" && chr == '!');
} }
std::pair<Gtk::TextIter, Gtk::TextIter> Source::BaseView::get_token_iters(Gtk::TextIter iter) { std::pair<Gtk::TextIter, Gtk::TextIter> Source::BaseView::get_token_iters(Gtk::TextIter iter) {

1
src/source_base.hpp

@ -173,6 +173,7 @@ namespace Source {
Gtk::TextIter get_tabs_end_iter(); Gtk::TextIter get_tabs_end_iter();
public: public:
bool is_whitespace_char(gunichar chr);
bool is_token_char(gunichar chr); bool is_token_char(gunichar chr);
protected: protected:

26
src/source_clang.cpp

@ -916,15 +916,23 @@ Source::ClangViewAutocomplete::ClangViewAutocomplete(const boost::filesystem::pa
prev = prefix_start; prev = prefix_start;
prev.backward_char(); prev.backward_char();
auto prevprev = prev; auto prevprev = prev;
if(*prev == '.') {
auto iter = prev; auto valid_continuation_token = [this](Gtk::TextIter iter) {
bool starts_with_num = false; while(iter.backward_char() && is_whitespace_char(*iter)) {
size_t count = 0; }
if(!is_whitespace_char(*iter))
iter.forward_char();
bool found_token = false;
bool starts_with_digit = false;
while(iter.backward_char() && is_token_char(*iter)) { while(iter.backward_char() && is_token_char(*iter)) {
++count; found_token = true;
starts_with_num = Glib::Unicode::isdigit(*iter); starts_with_digit = Glib::Unicode::isdigit(*iter);
} }
if((count >= 1 || *iter == ')' || *iter == ']') && !starts_with_num) { return (found_token || *iter == ')' || *iter == ']' || *iter == '}') && !starts_with_digit;
};
if(*prev == '.') {
if(valid_continuation_token(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);
@ -932,8 +940,8 @@ Source::ClangViewAutocomplete::ClangViewAutocomplete(const boost::filesystem::pa
return true; return true;
} }
} }
else if((prevprev.backward_char() && ((*prevprev == ':' && *prev == ':') || (*prevprev == '-' && *prev == '>')))) { else if(prevprev.backward_char() && ((*prevprev == ':' && *prev == ':') || (*prevprev == '-' && *prev == '>'))) {
if(*prev == ':' || (prevprev.backward_char() && (is_token_char(*prevprev) || *prevprev == ')' || *prevprev == ']'))) { if(*prev == ':' || valid_continuation_token(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);

19
src/source_language_protocol.cpp

@ -1644,22 +1644,13 @@ void Source::LanguageProtocolView::setup_autocomplete() {
prev.backward_char(); prev.backward_char();
auto prevprev = prev; auto prevprev = prev;
if(*prev == '.') { if(*prev == '.') {
auto iter = prev; {
bool starts_with_num = false; LockGuard lock(autocomplete->prefix_mutex);
size_t count = 0; autocomplete->prefix = get_buffer()->get_text(prefix_start, prefix_end);
while(iter.backward_char() && is_token_char(*iter)) {
++count;
starts_with_num = Glib::Unicode::isdigit(*iter);
}
if((count >= 1 || *iter == ')' || *iter == ']' || *iter == '"' || *iter == '\'' || *iter == '?') && !starts_with_num) {
{
LockGuard lock(autocomplete->prefix_mutex);
autocomplete->prefix = get_buffer()->get_text(prefix_start, prefix_end);
}
return true;
} }
return true;
} }
else if((prevprev.backward_char() && *prevprev == ':' && *prev == ':')) { 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);

Loading…
Cancel
Save