From 5a41847518200383cf843b8cca1af827e9f20dc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B8rgen=20Lien=20Sell=C3=A6g?= Date: Sun, 19 Apr 2015 19:28:35 +0200 Subject: [PATCH] Moves the clang index to notebook for better parsing between edited files --- juci/api.h | 4 +-- juci/config.cc | 4 +-- juci/notebook.cc | 22 +++++++++----- juci/notebook.h | 4 +++ juci/source.cc | 46 ++++++++++++++++------------ juci/source.h | 79 ++++++++++++++++++++++++------------------------ 6 files changed, 89 insertions(+), 70 deletions(-) diff --git a/juci/api.h b/juci/api.h index eb17fc5..46f3f98 100644 --- a/juci/api.h +++ b/juci/api.h @@ -55,9 +55,9 @@ namespace libjuci { const std::string plugin_path, const std::string menu_keybinding); void AddMenuXml(const std::string plugin_name, - const string parent_menu); + const std::string parent_menu); void AddSubMenuXml(const std::string plugin_name, - const string parent_menu); + const std::string parent_menu); ////////////////////////////// //// Boost.Python methods //// ////////////////////////////// diff --git a/juci/config.cc b/juci/config.cc index 3e8a264..689fd19 100644 --- a/juci/config.cc +++ b/juci/config.cc @@ -17,16 +17,14 @@ void MainConfig::GenerateSource() { boost::property_tree::ptree colors_json = source_json.get_child("colors"); for ( auto &i : colors_json ) { source_cfg_.InsertTag(i.first, i.second.get_value()); - std::cout << "inserting tag, key: " << i.first << " value: " << i.second.get_value() << std::endl; } for ( auto &i : syntax_json ) { source_cfg_.InsertType(i.first, i.second.get_value()); - std::cout << "inserting type, key: " << i.first << " value: " << i.second.get_value() << std::endl; } } void MainConfig::GenerateKeybindings() { - string line; + std::string line; std::ifstream menu_xml("menu.xml"); if (menu_xml.is_open()) { while (getline(menu_xml, line)) { diff --git a/juci/notebook.cc b/juci/notebook.cc index bf3ef2b..c918d65 100644 --- a/juci/notebook.cc +++ b/juci/notebook.cc @@ -7,7 +7,7 @@ Notebook::Model::Model() { scrollvalue_ = 50; } -Notebook::View::View() { +Notebook::View::View() : notebook_() { view_.pack2(notebook_); view_.set_position(120); } @@ -17,7 +17,8 @@ Notebook::Controller::Controller(Gtk::Window& window, Source::Config& source_cfg, Directories::Config& dir_cfg) : source_config_(source_cfg), - directories_(dir_cfg) { + directories_(dir_cfg), + index_(0, 1) { window_ = &window; OnNewPage("juCi++"); refClipboard_ = Gtk::Clipboard::get(); @@ -26,7 +27,6 @@ Notebook::Controller::Controller(Gtk::Window& window, CreateKeybindings(keybindings); } // Constructor - void Notebook::Controller::CreateKeybindings(Keybindings::Controller &keybindings) { directories().m_TreeView.signal_row_activated() @@ -275,6 +275,14 @@ void Notebook::Controller::OnNewPage(std::string name) { Notebook().set_focus_child(text_vec_.at(Pages()-1)->view()); } +void Notebook::Controller:: +MapBuffers(std::map *buffers) { + for (auto &buffer : text_vec_) { + buffers->operator[](buffer->model().file_path()) = + buffer->buffer()->get_text().raw(); + } +} + void Notebook::Controller::OnOpenFile(std::string path) { OnCreatePage(); text_vec_.back()->OnOpenFile(path); @@ -287,8 +295,8 @@ void Notebook::Controller::OnOpenFile(std::string path) { } void Notebook::Controller::OnCreatePage() { - text_vec_.push_back(new Source::Controller(source_config())); - linenumbers_vec_.push_back(new Source::Controller(source_config())); + text_vec_.push_back(new Source::Controller(source_config(), this)); + linenumbers_vec_.push_back(new Source::Controller(source_config(), this)); scrolledline_vec_.push_back(new Gtk::ScrolledWindow()); scrolledtext_vec_.push_back(new Gtk::ScrolledWindow()); editor_vec_.push_back(new Gtk::HBox()); @@ -551,8 +559,8 @@ void Notebook::Controller::FindPopupPosition(Gtk::TextView& textview, CurrentTextView().get_window(Gtk::TextWindowType::TEXT_WINDOW_WIDGET); gdkw->get_origin(textview_edge_x, textview_edge_y); - x+=textview_edge_x; - y+=textview_edge_y; + x += textview_edge_x; + y += textview_edge_y; if ((textview_edge_x-x)*-1 > textview.get_width()-popup_x) { x -= popup_x; if (x < textview_edge_x) x = textview_edge_x; diff --git a/juci/notebook.h b/juci/notebook.h index ccab51b..1d2f0aa 100644 --- a/juci/notebook.h +++ b/juci/notebook.h @@ -10,6 +10,7 @@ #include #include #include +#include "clangmm.h" namespace Notebook { class Model { @@ -57,6 +58,8 @@ namespace Notebook { void OnOpenFile(std::string filename); void OnCreatePage(); bool ScrollEventCallback(GdkEventScroll* scroll_event); + void MapBuffers(std::map *buffers); + clang::Index* index() { return &index_; } int Pages(); Directories::Controller& directories() { return directories_; } Gtk::Paned& view(); @@ -101,6 +104,7 @@ namespace Notebook { bool ispopup; Gtk::Dialog popup_; Gtk::Window* window_; + clang::Index index_; }; // class controller } // namespace Notebook #endif // JUCI_NOTEBOOK_H_ diff --git a/juci/source.cc b/juci/source.cc index 5210541..b8d8950 100644 --- a/juci/source.cc +++ b/juci/source.cc @@ -4,7 +4,7 @@ #include #include #include - +#include "notebook.h" #define log( var ) \ std::cout << "source.cc (" << __LINE__ << ") " << #var << std::endl @@ -102,16 +102,18 @@ Source::Model::Model(const Source::Config &config) : void Source::Model:: InitSyntaxHighlighting(const std::string &filepath, const std::string &project_path, - const std::string &text, + const std::map + &buffers, int start_offset, - int end_offset) { + int end_offset, + clang::Index *index) { set_file_path(filepath); set_project_path(project_path); std::vector arguments = get_compilation_commands(); - tu_ = clang::TranslationUnit(true, + tu_ = clang::TranslationUnit(index, filepath, arguments, - text); + buffers); } // Source::View::UpdateLine @@ -123,7 +125,7 @@ OnLineEdit(const std::vector &locations, // Source::Model::UpdateLine int Source::Model:: -ReParse(const std::string &buffer) { +ReParse(const std::map &buffer) { return tu_.ReparseTranslationUnit(file_path(), buffer); } @@ -138,8 +140,9 @@ GetAutoCompleteSuggestions(int line_number, std::vector *suggestions) { parsing.lock(); - model().GetAutoCompleteSuggestions(view().get_buffer() - ->get_text().raw(), + std::map buffers; + notebook_->MapBuffers(&buffers); + model().GetAutoCompleteSuggestions(buffers, line_number, column, suggestions); @@ -147,14 +150,14 @@ GetAutoCompleteSuggestions(int line_number, } void Source::Model:: -GetAutoCompleteSuggestions(const std::string& buffer, +GetAutoCompleteSuggestions(const std::map &buffers, int line_number, int column, std::vector *suggestions) { clang::CodeCompleteResults results(&tu_, file_path(), - buffer, + buffers, line_number, column); for (int i = 0; i < results.size(); i++) { @@ -263,9 +266,9 @@ HighlightToken(clang::Token *token, // Source::Controller::Controller() // Constructor for Controller -Source::Controller::Controller(const Source::Config &config) : - model_(config) { -} +Source::Controller::Controller(const Source::Config &config, + Notebook::Controller *notebook) : + model_(config), notebook_(notebook) { } // Source::Controller::view() // return shared_ptr to the view @@ -313,7 +316,7 @@ void Source::View::OnUpdateSyntax(const std::vector &ranges, Glib::RefPtr buffer = get_buffer(); buffer->remove_all_tags(buffer->begin(), buffer->end()); for (auto &range : ranges) { - string type = std::to_string(range.kind()); + std::string type = std::to_string(range.kind()); try { config.typetable().at(type); } catch (std::exception) { @@ -337,17 +340,20 @@ void Source::View::OnUpdateSyntax(const std::vector &ranges, void Source::Controller::OnOpenFile(const string &filepath) { sourcefile s(filepath); + std::map buffers; + notebook_->MapBuffers(&buffers); + buffers[filepath] = s.get_content(); buffer()->set_text(s.get_content()); int start_offset = buffer()->begin().get_offset(); int end_offset = buffer()->end().get_offset(); - if (check_extention(filepath)) { view().ApplyConfig(model().config()); model().InitSyntaxHighlighting(filepath, extract_file_path(filepath), - buffer()->get_text().raw(), + buffers, start_offset, - end_offset); + end_offset, + notebook_->index()); view().OnUpdateSyntax(model().ExtractTokens(start_offset, end_offset), model().config()); } @@ -358,7 +364,10 @@ void Source::Controller::OnOpenFile(const string &filepath) { if (parsing.try_lock()) { while (true) { const std::string raw = buffer()->get_text().raw(); - if (model().ReParse(raw) == 0 && + std::map buffers; + notebook_->MapBuffers(&buffers); + buffers[model().file_path()] = raw; + if (model().ReParse(buffers) == 0 && raw == buffer()->get_text().raw()) { syntax.lock(); go = true; @@ -373,7 +382,6 @@ void Source::Controller::OnOpenFile(const string &filepath) { } }); - buffer()->signal_begin_user_action().connect([this]() { if (go) { syntax.lock(); diff --git a/juci/source.h b/juci/source.h index cf8789a..3f03c58 100644 --- a/juci/source.h +++ b/juci/source.h @@ -3,31 +3,34 @@ #include #include #include -#include #include "gtkmm.h" #include "clangmm.h" #include #include +#include -using std::string; +namespace Notebook { + class Controller; +} namespace Source { - class Config { public: Config(const Config &original); Config(); - const std::unordered_map& tagtable() const; - const std::unordered_map& typetable() const; - void SetTagTable(const std::unordered_map &tagtable); - void InsertTag(const string &key, const string &value); - void SetTypeTable(const std::unordered_map &tagtable); - void InsertType(const string &key, const string &value); + const std::unordered_map& tagtable() const; + const std::unordered_map& typetable() const; + void SetTagTable(const std::unordered_map + &tagtable); + void InsertTag(const std::string &key, const std::string &value); + void SetTypeTable(const std::unordered_map + &tagtable); + void InsertType(const std::string &key, const std::string &value); private: - std::unordered_map tagtable_; - std::unordered_map typetable_; - string background_; + std::unordered_map tagtable_; + std::unordered_map typetable_; + std::string background_; }; // class Config class Location { @@ -48,13 +51,6 @@ namespace Source { const Location& start() const { return start_; } const Location& end() const { return end_; } int kind() const { return kind_; } - void to_stream() const { - std::cout << "range: [" << start_.line_number()-1; - std::cout << ", " << end_.line_number()-1 << "] "; - std::cout << "<" << start_.column_offset()-1; - std::cout << ", " << end_.column_offset()-1 << ">"; - std::cout << std::endl; - } private: Location start_; Location end_; @@ -71,7 +67,7 @@ namespace Source { const Config &config); private: - string GetLine(const Gtk::TextIter &begin); + std::string GetLine(const Gtk::TextIter &begin); }; // class View class AutoCompleteChunk { @@ -98,34 +94,37 @@ namespace Source { explicit Model(const Source::Config &config); // inits the syntax highligthing on file open void InitSyntaxHighlighting(const std::string &filepath, - const std::string &project_path, - const std::string &text, - int start_offset, - int end_offset); + const std::string &project_path, + const std::map + &buffers, + int start_offset, + int end_offset, + clang::Index *index); // sets the filepath for this mvc - void set_file_path(const string &file_path); + void set_file_path(const std::string &file_path); // sets the project path for this mvc - void set_project_path(const string &project_path); + void set_project_path(const std::string &project_path); // gets the file_path member - const string& file_path() const; + const std::string& file_path() const; // gets the project_path member - const string& project_path() const; + const std::string& project_path() const; // gets the config member const Config& config() const; - void GetAutoCompleteSuggestions(const std::string& buffer, - int line_number, - int column, - std::vector - *suggestions); - ~Model() { } - int ReParse(const std::string &buffer); + void GetAutoCompleteSuggestions(const std::map + &buffers, + int line_number, + int column, + std::vector + *suggestions); + ~Model() { } + int ReParse(const std::map &buffers); std::vector ExtractTokens(int, int); private: Config config_; - string file_path_; - string project_path_; + std::string file_path_; + std::string project_path_; clang::TranslationUnit tu_; void HighlightToken(clang::Token *token, std::vector *source_ranges, @@ -137,12 +136,13 @@ namespace Source { class Controller { public: - explicit Controller(const Source::Config &config); + Controller(const Source::Config &config, + Notebook::Controller *notebook); Controller(); View& view(); Model& model(); void OnNewEmptyFile(); - void OnOpenFile(const string &filename); + void OnOpenFile(const std::string &filename); void GetAutoCompleteSuggestions(int line_number, int column, std::vector @@ -159,6 +159,7 @@ namespace Source { protected: View view_; Model model_; + Notebook::Controller *notebook_; }; // class Controller } // namespace Source #endif // JUCI_SOURCE_H_