Browse Source

Much less resource demanding type information retrieval.

merge-requests/365/head
eidheim 10 years ago
parent
commit
252cec4e58
  1. 55
      src/source.cc
  2. 6
      src/source.h

55
src/source.cc

@ -310,8 +310,8 @@ void Source::View::set_tooltip_events() {
Tooltips::init(); Tooltips::init();
Gdk::Rectangle rectangle(x, y, 1, 1); Gdk::Rectangle rectangle(x, y, 1, 1);
if(source_readable) { if(source_readable) {
type_tooltips.show(rectangle); show_type_tooltips(rectangle);
diagnostic_tooltips.show(rectangle); show_diagnostic_tooltips(rectangle);
} }
return false; return false;
}, 100); }, 100);
@ -338,10 +338,10 @@ void Source::View::set_tooltip_events() {
buffer_to_window_coords(Gtk::TextWindowType::TEXT_WINDOW_TEXT, rectangle.get_x(), rectangle.get_y(), location_window_x, location_window_y); buffer_to_window_coords(Gtk::TextWindowType::TEXT_WINDOW_TEXT, rectangle.get_x(), rectangle.get_y(), location_window_x, location_window_y);
rectangle.set_x(location_window_x-2); rectangle.set_x(location_window_x-2);
rectangle.set_y(location_window_y); rectangle.set_y(location_window_y);
rectangle.set_width(4); rectangle.set_width(5);
if(source_readable) { if(source_readable) {
type_tooltips.show(rectangle); show_type_tooltips(rectangle);
diagnostic_tooltips.show(rectangle); show_diagnostic_tooltips(rectangle);
} }
return false; return false;
}, 500); }, 500);
@ -1018,7 +1018,6 @@ Source::View(file_path, language), project_path(project_path), parse_error(false
if(parsing_mutex.try_lock()) { if(parsing_mutex.try_lock()) {
update_syntax(); update_syntax();
update_diagnostics(); update_diagnostics();
update_types();
source_readable=true; source_readable=true;
set_status(""); set_status("");
parsing_mutex.unlock(); parsing_mutex.unlock();
@ -1293,9 +1292,43 @@ void Source::ClangViewParse::update_diagnostics() {
set_info(" "+diagnostic_info); set_info(" "+diagnostic_info);
} }
void Source::ClangViewParse::update_types() { void Source::ClangViewParse::show_diagnostic_tooltips(const Gdk::Rectangle &rectangle) {
diagnostic_tooltips.show(rectangle);
}
void Source::ClangViewParse::show_type_tooltips(const Gdk::Rectangle &rectangle) {
if(source_readable) {
Gtk::TextIter iter;
int location_x, location_y;
window_to_buffer_coords(Gtk::TextWindowType::TEXT_WINDOW_TEXT, rectangle.get_x(), rectangle.get_y(), location_x, location_y);
location_x+=(rectangle.get_width()-1)/2;
get_iter_at_location(iter, location_x, location_y);
Gdk::Rectangle iter_rectangle;
get_iter_location(iter, iter_rectangle);
if(iter_rectangle.get_x()>location_x) {
if(!iter.starts_line()) {
if(!iter.backward_char())
return;
}
}
bool found_token=false;
if(!((*iter>='a' && *iter<='z') || (*iter>='A' && *iter<='Z') || (*iter>='0' && *iter<='9') || *iter=='_')) {
if(!iter.backward_char())
return;
}
while((*iter>='a' && *iter<='z') || (*iter>='A' && *iter<='Z') || (*iter>='0' && *iter<='9') || *iter=='_') {
if(!found_token)
found_token=true;
if(!iter.backward_char())
return;
}
if(found_token && iter.forward_char()) {
auto tokens=clang_tu->get_tokens(iter.get_line()+1, iter.get_line_index()+1,
iter.get_line()+1, iter.get_line_index()+1);
type_tooltips.clear(); type_tooltips.clear();
for(auto &token: *clang_tokens) { for(auto &token: *tokens) {
if(token.get_kind()==clang::Token_Identifier && token.has_type()) { if(token.get_kind()==clang::Token_Identifier && token.has_type()) {
auto start=get_buffer()->get_iter_at_line_index(token.offsets.first.line-1, token.offsets.first.index-1); auto start=get_buffer()->get_iter_at_line_index(token.offsets.first.line-1, token.offsets.first.index-1);
auto end=get_buffer()->get_iter_at_line_index(token.offsets.second.line-1, token.offsets.second.index-1); auto end=get_buffer()->get_iter_at_line_index(token.offsets.second.line-1, token.offsets.second.index-1);
@ -1311,6 +1344,12 @@ void Source::ClangViewParse::update_types() {
type_tooltips.emplace_back(create_tooltip_buffer, *this, get_buffer()->create_mark(start), get_buffer()->create_mark(end)); type_tooltips.emplace_back(create_tooltip_buffer, *this, get_buffer()->create_mark(start), get_buffer()->create_mark(end));
} }
} }
type_tooltips.show();
}
}
//type_tooltips.show(rectangle);
} }
//Clang indentation. //Clang indentation.

6
src/source.h

@ -84,6 +84,8 @@ namespace Source {
bool source_readable; bool source_readable;
Tooltips diagnostic_tooltips; Tooltips diagnostic_tooltips;
Tooltips type_tooltips; Tooltips type_tooltips;
virtual void show_diagnostic_tooltips(const Gdk::Rectangle &rectangle) {}
virtual void show_type_tooltips(const Gdk::Rectangle &rectangle) {}
gdouble on_motion_last_x; gdouble on_motion_last_x;
gdouble on_motion_last_y; gdouble on_motion_last_y;
sigc::connection delayed_tooltips_connection; sigc::connection delayed_tooltips_connection;
@ -155,6 +157,9 @@ namespace Source {
std::atomic<bool> parse_thread_stop; std::atomic<bool> parse_thread_stop;
std::atomic<bool> parse_error; std::atomic<bool> parse_error;
void show_diagnostic_tooltips(const Gdk::Rectangle &rectangle);
void show_type_tooltips(const Gdk::Rectangle &rectangle);
std::regex bracket_regex; std::regex bracket_regex;
std::regex no_bracket_statement_regex; std::regex no_bracket_statement_regex;
std::regex no_bracket_no_para_statement_regex; std::regex no_bracket_no_para_statement_regex;
@ -163,7 +168,6 @@ namespace Source {
void update_syntax(); void update_syntax();
std::set<std::string> last_syntax_tags; std::set<std::string> last_syntax_tags;
void update_diagnostics(); void update_diagnostics();
void update_types();
static clang::Index clang_index; static clang::Index clang_index;
std::vector<std::string> get_compilation_commands(); std::vector<std::string> get_compilation_commands();

Loading…
Cancel
Save