Browse Source

Optimized autocomplete more.

merge-requests/365/head
eidheim 11 years ago
parent
commit
66bfb0bed6
  1. 54
      juci/source.cc
  2. 5
      juci/source.h

54
juci/source.cc

@ -580,9 +580,9 @@ bool Source::ClangView::on_key_press_event(GdkEventKey* key) {
////////////////////////////// //////////////////////////////
//// ClangViewAutocomplete /// //// ClangViewAutocomplete ///
////////////////////////////// //////////////////////////////
//TODO: Raise autocomplete window after alt-tab back to application
Source::ClangViewAutocomplete::ClangViewAutocomplete(const std::string& file_path, const std::string& project_path, Terminal::Controller& terminal): Source::ClangViewAutocomplete::ClangViewAutocomplete(const std::string& file_path, const std::string& project_path, Terminal::Controller& terminal):
Source::ClangView(file_path, project_path, terminal), selection_dialog(*this) { Source::ClangView(file_path, project_path, terminal), selection_dialog(*this), autocomplete_cancel_starting(false) {
get_buffer()->signal_changed().connect([this](){ get_buffer()->signal_changed().connect([this](){
if(last_keyval==GDK_KEY_BackSpace) if(last_keyval==GDK_KEY_BackSpace)
return; return;
@ -592,7 +592,9 @@ Source::ClangView(file_path, project_path, terminal), selection_dialog(*this) {
const std::regex within_namespace("^(.*)([^a-zA-Z0-9_]+)([a-zA-Z0-9_]{3,})$"); const std::regex within_namespace("^(.*)([^a-zA-Z0-9_]+)([a-zA-Z0-9_]{3,})$");
std::smatch sm; std::smatch sm;
if(std::regex_match(line, sm, in_specified_namespace)) { if(std::regex_match(line, sm, in_specified_namespace)) {
prefix_mutex.lock();
prefix=sm[3].str(); prefix=sm[3].str();
prefix_mutex.unlock();
if((prefix.size()==0 || prefix[0]<'0' || prefix[0]>'9') && !autocomplete_starting && !selection_dialog.shown) { if((prefix.size()==0 || prefix[0]<'0' || prefix[0]>'9') && !autocomplete_starting && !selection_dialog.shown) {
autocomplete(); autocomplete();
} }
@ -600,7 +602,9 @@ Source::ClangView(file_path, project_path, terminal), selection_dialog(*this) {
autocomplete_cancel_starting=true; autocomplete_cancel_starting=true;
} }
else if(std::regex_match(line, sm, within_namespace)) { else if(std::regex_match(line, sm, within_namespace)) {
prefix_mutex.lock();
prefix=sm[3].str(); prefix=sm[3].str();
prefix_mutex.unlock();
if((prefix.size()==0 || prefix[0]<'0' || prefix[0]>'9') && !autocomplete_starting && !selection_dialog.shown) { if((prefix.size()==0 || prefix[0]<'0' || prefix[0]>'9') && !autocomplete_starting && !selection_dialog.shown) {
autocomplete(); autocomplete();
} }
@ -674,10 +678,8 @@ void Source::ClangViewAutocomplete::autocomplete() {
} }
auto ss_str=ss.str(); auto ss_str=ss.str();
if (ss_str.length() > 0) { // if length is 0 the result is empty 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<std::string, std::string>(ss_str, data.brief_comments);
auto pair=std::pair<std::string, std::string>(ss_str, data.brief_comments); rows[ss.str() + " --> " + return_value] = pair;
rows[ss.str() + " --> " + return_value] = pair;
}
} }
} }
if (rows.empty()) { if (rows.empty()) {
@ -700,10 +702,9 @@ void Source::ClangViewAutocomplete::autocomplete() {
column_nr--; column_nr--;
} }
buffer+="\n"; buffer+="\n";
auto prefix_copy=prefix; std::thread autocomplete_thread([this, ac_data, line_nr, column_nr, buffer_map](){
std::thread autocomplete_thread([this, ac_data, line_nr, column_nr, buffer_map, prefix_copy](){
parsing_mutex.lock(); parsing_mutex.lock();
*ac_data=move(get_autocomplete_suggestions(line_nr, column_nr, *buffer_map, prefix_copy)); *ac_data=move(get_autocomplete_suggestions(line_nr, column_nr, *buffer_map));
autocomplete_done(); autocomplete_done();
parsing_mutex.unlock(); parsing_mutex.unlock();
}); });
@ -713,7 +714,7 @@ void Source::ClangViewAutocomplete::autocomplete() {
} }
std::vector<Source::AutoCompleteData> Source::ClangViewAutocomplete:: std::vector<Source::AutoCompleteData> Source::ClangViewAutocomplete::
get_autocomplete_suggestions(int line_number, int column, std::map<std::string, std::string>& buffer_map, const std::string& prefix) { get_autocomplete_suggestions(int line_number, int column, std::map<std::string, std::string>& buffer_map) {
INFO("Getting auto complete suggestions"); INFO("Getting auto complete suggestions");
std::vector<Source::AutoCompleteData> suggestions; std::vector<Source::AutoCompleteData> suggestions;
clang::CodeCompleteResults results(clang_tu.get(), clang::CodeCompleteResults results(clang_tu.get(),
@ -721,21 +722,26 @@ get_autocomplete_suggestions(int line_number, int column, std::map<std::string,
buffer_map, buffer_map,
line_number, line_number,
column); column);
for (int i = 0; i < results.size(); i++) { if(!autocomplete_cancel_starting) {
auto result=results.get(i); prefix_mutex.lock();
if(result.available()) { auto prefix_copy=prefix;
auto chunks=result.get_chunks(); prefix_mutex.unlock();
bool match=false; for (int i = 0; i < results.size(); i++) {
for(auto &chunk: chunks) { auto result=results.get(i);
if(chunk.kind!=clang::CompletionChunk_ResultType && chunk.kind!=clang::CompletionChunk_Informative) { if(result.available()) {
if(chunk.chunk.size()>=prefix.size() && chunk.chunk.compare(0, prefix.size(), prefix)==0) auto chunks=result.get_chunks();
match=true; bool match=false;
break; for(auto &chunk: chunks) {
if(chunk.kind!=clang::CompletionChunk_ResultType && chunk.kind!=clang::CompletionChunk_Informative) {
if(chunk.chunk.size()>=prefix_copy.size() && chunk.chunk.compare(0, prefix_copy.size(), prefix_copy)==0)
match=true;
break;
}
}
if(match) {
suggestions.emplace_back(std::move(chunks));
suggestions.back().brief_comments=result.get_brief_comments();
} }
}
if(match) {
suggestions.emplace_back(std::move(chunks));
suggestions.back().brief_comments=result.get_brief_comments();
} }
} }
} }

5
juci/source.h

@ -131,13 +131,14 @@ namespace Source {
private: private:
void autocomplete(); void autocomplete();
SelectionDialog selection_dialog; SelectionDialog selection_dialog;
std::vector<Source::AutoCompleteData> get_autocomplete_suggestions(int line_number, int column, std::map<std::string, std::string>& buffer_map, const std::string& prefix); std::vector<Source::AutoCompleteData> get_autocomplete_suggestions(int line_number, int column, std::map<std::string, std::string>& buffer_map);
Glib::Dispatcher autocomplete_done; Glib::Dispatcher autocomplete_done;
sigc::connection autocomplete_done_connection; sigc::connection autocomplete_done_connection;
bool autocomplete_starting=false; bool autocomplete_starting=false;
bool autocomplete_cancel_starting=false; std::atomic<bool> autocomplete_cancel_starting;
guint last_keyval=0; guint last_keyval=0;
std::string prefix; std::string prefix;
std::mutex prefix_mutex;
}; };
class Controller { class Controller {

Loading…
Cancel
Save