From 4a3a1ddfd9d27ac4a6325bd287092413c9907ed4 Mon Sep 17 00:00:00 2001 From: eidheim Date: Sun, 12 Jul 2015 21:45:48 +0200 Subject: [PATCH] Autocomplete optimization and fix for completion after parentheses. --- juci/source.cc | 31 ++++++++++++++++++++++--------- juci/source.h | 2 +- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/juci/source.cc b/juci/source.cc index 2c1d7e6..f90ae44 100644 --- a/juci/source.cc +++ b/juci/source.cc @@ -588,7 +588,7 @@ Source::ClangView(file_path, project_path, terminal), selection_dialog(*this) { return; std::string line=" "+get_line_before_insert(); if((std::count(line.begin(), line.end(), '\"')%2)!=1 && line.find("//")==std::string::npos) { - const std::regex in_specified_namespace("^(.*[a-zA-Z0-9_])(->|\\.|::)([a-zA-Z0-9_]*)$"); + const std::regex in_specified_namespace("^(.*[a-zA-Z0-9_\\)])(->|\\.|::)([a-zA-Z0-9_]*)$"); const std::regex within_namespace("^(.*)([^a-zA-Z0-9_]+)([a-zA-Z0-9_]{3,})$"); std::smatch sm; if(std::regex_match(line, sm, in_specified_namespace)) { @@ -672,9 +672,10 @@ void Source::ClangViewAutocomplete::autocomplete() { default: ss << chunk.chunk; break; } } - if (ss.str().length() > 0) { // if length is 0 the result is empty - if(prefix.size()==0 || ss.str().find(prefix)==0) { - auto pair=std::pair(ss.str(), data.brief_comments); + auto ss_str=ss.str(); + if (ss_str.length() > 0) { // if length is 0 the result is empty + if(ss_str.size()>=prefix.size() && ss_str.compare(0, prefix.size(), prefix)==0) { + auto pair=std::pair(ss_str, data.brief_comments); rows[ss.str() + " --> " + return_value] = pair; } } @@ -699,9 +700,10 @@ void Source::ClangViewAutocomplete::autocomplete() { column_nr--; } buffer+="\n"; - std::thread autocomplete_thread([this, ac_data, line_nr, column_nr, buffer_map](){ + auto prefix_copy=prefix; + std::thread autocomplete_thread([this, ac_data, line_nr, column_nr, buffer_map, prefix_copy](){ parsing_mutex.lock(); - *ac_data=move(get_autocomplete_suggestions(line_nr, column_nr, *buffer_map)); + *ac_data=move(get_autocomplete_suggestions(line_nr, column_nr, *buffer_map, prefix_copy)); autocomplete_done(); parsing_mutex.unlock(); }); @@ -711,7 +713,7 @@ void Source::ClangViewAutocomplete::autocomplete() { } std::vector Source::ClangViewAutocomplete:: -get_autocomplete_suggestions(int line_number, int column, std::map& buffer_map) { +get_autocomplete_suggestions(int line_number, int column, std::map& buffer_map, const std::string& prefix) { INFO("Getting auto complete suggestions"); std::vector suggestions; clang::CodeCompleteResults results(clang_tu.get(), @@ -722,8 +724,19 @@ get_autocomplete_suggestions(int line_number, int column, std::map=prefix.size() && chunk.chunk.compare(0, prefix.size(), prefix)==0) + match=true; + break; + } + } + if(match) { + suggestions.emplace_back(std::move(chunks)); + suggestions.back().brief_comments=result.get_brief_comments(); + } } } DEBUG("Number of suggestions"); diff --git a/juci/source.h b/juci/source.h index a86654c..66ff9ac 100644 --- a/juci/source.h +++ b/juci/source.h @@ -131,7 +131,7 @@ namespace Source { private: void autocomplete(); SelectionDialog selection_dialog; - std::vector get_autocomplete_suggestions(int line_number, int column, std::map& buffer_map); + std::vector get_autocomplete_suggestions(int line_number, int column, std::map& buffer_map, const std::string& prefix); Glib::Dispatcher autocomplete_done; sigc::connection autocomplete_done_connection; bool autocomplete_starting=false;