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) {
auto iter=get_buffer()->get_insert()->get_iter();
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) {
auto referenced=token.get_cursor().get_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 {
@ -1823,27 +1823,27 @@ Source::ClangViewAutocomplete(file_path, project_path, language) {
return "";
};
tag_similar_tokens=[this](const std::string &usr){
tag_similar_tokens=[this](const std::pair<std::string, int> &token){
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());
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) {
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());
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;
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;
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)));
@ -1867,8 +1867,8 @@ Source::ClangViewAutocomplete(file_path, project_path, language) {
if(mark->get_name()=="insert") {
delayed_tag_similar_tokens_connection.disconnect();
delayed_tag_similar_tokens_connection=Glib::signal_timeout().connect([this]() {
auto usr=get_token();
tag_similar_tokens(usr);
auto token=get_token();
tag_similar_tokens(token);
return false;
}, 100);
}

6
src/source.h

@ -69,10 +69,10 @@ namespace Source {
std::function<std::pair<std::string, clang::Offset>()> get_declaration_location;
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<void(const std::string &token)> tag_similar_tokens;
std::function<size_t(const std::string &token, const std::string &text)> rename_similar_tokens;
std::function<void(const std::pair<std::string, int> &token)> tag_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 &info)> on_update_info;

4
src/window.cc

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

Loading…
Cancel
Save