Browse Source

Using more effective clang::Tokens::get_similar_token_offsets.

merge-requests/365/head
eidheim 10 years ago
parent
commit
aeb8751ee8
  1. 24
      src/source.cc
  2. 6
      src/source.h
  3. 4
      src/window.cc

24
src/source.cc

@ -1789,7 +1789,7 @@ Source::ClangViewAutocomplete(file_path, project_path, language) {
} }
}); });
get_token=[this]() -> std::string { get_token=[this]() -> std::pair<std::string, int> {
if(source_readable) { if(source_readable) {
auto iter=get_buffer()->get_insert()->get_iter(); auto iter=get_buffer()->get_insert()->get_iter();
auto line=(unsigned)iter.get_line(); auto line=(unsigned)iter.get_line();
@ -1799,12 +1799,12 @@ Source::ClangViewAutocomplete(file_path, project_path, language) {
if(line==token.offsets.first.line-1 && index>=token.offsets.first.index-1 && index <=token.offsets.second.index-1) { if(line==token.offsets.first.line-1 && index>=token.offsets.first.index-1 && index <=token.offsets.second.index-1) {
auto referenced=token.get_cursor().get_referenced(); auto referenced=token.get_cursor().get_referenced();
if(referenced) if(referenced)
return referenced.get_usr(); return {referenced.get_usr(), static_cast<int>(referenced.get_kind())};
} }
} }
} }
} }
return ""; return {"", -1};
}; };
get_token_name=[this]() -> std::string { get_token_name=[this]() -> std::string {
@ -1823,27 +1823,27 @@ Source::ClangViewAutocomplete(file_path, project_path, language) {
return ""; return "";
}; };
tag_similar_tokens=[this](const std::string &usr){ tag_similar_tokens=[this](const std::pair<std::string, int> &token){
if(source_readable) { if(source_readable) {
if(usr.size()>0 && last_similar_tokens_tagged!=usr) { if(token.second!=0 && token.first.size()>0 && last_similar_tokens_tagged!=token.first) {
get_buffer()->remove_tag(similar_tokens_tag, get_buffer()->begin(), get_buffer()->end()); get_buffer()->remove_tag(similar_tokens_tag, get_buffer()->begin(), get_buffer()->end());
auto offsets=clang_tokens->get_similar_token_offsets(usr); auto offsets=clang_tokens->get_similar_token_offsets(token.first, static_cast<clang::CursorKind>(token.second));
for(auto &offset: offsets) { for(auto &offset: offsets) {
get_buffer()->apply_tag(similar_tokens_tag, get_buffer()->get_iter_at_line_index(offset.first.line-1, offset.first.index-1), get_buffer()->get_iter_at_line_index(offset.second.line-1, offset.second.index-1)); get_buffer()->apply_tag(similar_tokens_tag, get_buffer()->get_iter_at_line_index(offset.first.line-1, offset.first.index-1), get_buffer()->get_iter_at_line_index(offset.second.line-1, offset.second.index-1));
} }
last_similar_tokens_tagged=usr; last_similar_tokens_tagged=token.first;
} }
} }
if(usr.size()==0 && last_similar_tokens_tagged!="") { if(token.second!=0 && token.first.size()==0 && last_similar_tokens_tagged!="") {
get_buffer()->remove_tag(similar_tokens_tag, get_buffer()->begin(), get_buffer()->end()); get_buffer()->remove_tag(similar_tokens_tag, get_buffer()->begin(), get_buffer()->end());
last_similar_tokens_tagged=""; last_similar_tokens_tagged="";
} }
}; };
rename_similar_tokens=[this](const std::string &usr, const std::string &text) { rename_similar_tokens=[this](const std::pair<std::string, int> &token, const std::string &text) {
size_t number=0; size_t number=0;
if(source_readable) { if(source_readable) {
auto offsets=clang_tokens->get_similar_token_offsets(usr); auto offsets=clang_tokens->get_similar_token_offsets(token.first, static_cast<clang::CursorKind>(token.second));
std::vector<std::pair<Glib::RefPtr<Gtk::TextMark>, Glib::RefPtr<Gtk::TextMark> > > marks; std::vector<std::pair<Glib::RefPtr<Gtk::TextMark>, Glib::RefPtr<Gtk::TextMark> > > marks;
for(auto &offset: offsets) { for(auto &offset: offsets) {
marks.emplace_back(get_buffer()->create_mark(get_buffer()->get_iter_at_line_index(offset.first.line-1, offset.first.index-1)), get_buffer()->create_mark(get_buffer()->get_iter_at_line_index(offset.second.line-1, offset.second.index-1))); marks.emplace_back(get_buffer()->create_mark(get_buffer()->get_iter_at_line_index(offset.first.line-1, offset.first.index-1)), get_buffer()->create_mark(get_buffer()->get_iter_at_line_index(offset.second.line-1, offset.second.index-1)));
@ -1867,8 +1867,8 @@ Source::ClangViewAutocomplete(file_path, project_path, language) {
if(mark->get_name()=="insert") { if(mark->get_name()=="insert") {
delayed_tag_similar_tokens_connection.disconnect(); delayed_tag_similar_tokens_connection.disconnect();
delayed_tag_similar_tokens_connection=Glib::signal_timeout().connect([this]() { delayed_tag_similar_tokens_connection=Glib::signal_timeout().connect([this]() {
auto usr=get_token(); auto token=get_token();
tag_similar_tokens(usr); tag_similar_tokens(token);
return false; return false;
}, 100); }, 100);
} }

6
src/source.h

@ -69,10 +69,10 @@ namespace Source {
std::function<std::pair<std::string, clang::Offset>()> get_declaration_location; std::function<std::pair<std::string, clang::Offset>()> get_declaration_location;
std::function<void()> goto_method; std::function<void()> goto_method;
std::function<std::string()> get_token; std::function<std::pair<std::string, int>()> get_token;
std::function<std::string()> get_token_name; std::function<std::string()> get_token_name;
std::function<void(const std::string &token)> tag_similar_tokens; std::function<void(const std::pair<std::string, int> &token)> tag_similar_tokens;
std::function<size_t(const std::string &token, const std::string &text)> rename_similar_tokens; std::function<size_t(const std::pair<std::string, int> &token, const std::string &text)> rename_similar_tokens;
std::function<void(View* view, const std::string &status)> on_update_status; std::function<void(View* view, const std::string &status)> on_update_status;
std::function<void(View* view, const std::string &info)> on_update_info; std::function<void(View* view, const std::string &info)> on_update_info;

4
src/window.cc

@ -675,8 +675,8 @@ void Window::rename_token_entry() {
entry_box.clear(); entry_box.clear();
if(notebook.get_current_page()!=-1) { if(notebook.get_current_page()!=-1) {
if(notebook.get_current_view()->get_token && notebook.get_current_view()->get_token_name) { if(notebook.get_current_view()->get_token && notebook.get_current_view()->get_token_name) {
auto token=std::make_shared<std::string>(notebook.get_current_view()->get_token()); auto token=std::make_shared<std::pair<std::string, int> >(notebook.get_current_view()->get_token());
if(token->size()>0 && notebook.get_current_view()->get_token_name) { if(token->second!=0 && token->first.size()>0 && notebook.get_current_view()->get_token_name) {
auto token_name=std::make_shared<std::string>(notebook.get_current_view()->get_token_name()); auto token_name=std::make_shared<std::string>(notebook.get_current_view()->get_token_name());
for(int c=0;c<notebook.size();c++) { for(int c=0;c<notebook.size();c++) {
if(notebook.get_view(c)->tag_similar_tokens) { if(notebook.get_view(c)->tag_similar_tokens) {

Loading…
Cancel
Save