diff --git a/src/source_clang.cc b/src/source_clang.cc index 597aac0..3cf76f5 100644 --- a/src/source_clang.cc +++ b/src/source_clang.cc @@ -36,7 +36,7 @@ Source::View(file_path, project_path, language), parse_error(false) { parsing_in_progress=Singleton::terminal()->print_in_progress("Parsing "+file_path.string()); //GTK-calls must happen in main thread, so the parse_thread //sends signals to the main thread that it is to call the following functions: - parse_start.connect([this]{ + parse_start_connection=parse_start.connect([this]{ if(parse_thread_buffer_map_mutex.try_lock()) { parse_thread_buffer_map=get_buffer_map(); parse_thread_mapped=true; @@ -44,7 +44,7 @@ Source::View(file_path, project_path, language), parse_error(false) { } parse_thread_go=true; }); - parse_done.connect([this](){ + parse_done_connection=parse_done.connect([this](){ if(parse_thread_mapped) { if(parsing_mutex.try_lock()) { update_syntax(); @@ -59,7 +59,7 @@ Source::View(file_path, project_path, language), parse_error(false) { parse_thread_go=true; } }); - parse_fail.connect([this](){ + parse_fail_connection=parse_fail.connect([this](){ Singleton::terminal()->print("Error: failed to reparse "+this->file_path.string()+".\n"); set_status(""); set_info(""); @@ -106,10 +106,6 @@ void Source::ClangViewParse::configure() { no_bracket_no_para_statement_regex=std::regex("^([ \\t]*)(else|try|do) *$"); } -Source::ClangViewParse::~ClangViewParse() { - delayed_reparse_connection.disconnect(); -} - void Source::ClangViewParse::init_parse() { type_tooltips.hide(); diagnostic_tooltips.hide(); @@ -660,9 +656,10 @@ Source::ClangViewParse(file_path, project_path, language), autocomplete_cancel_s autocomplete_cancel_starting=false; }); - do_delete_object.connect([this](){ + do_delete_object_connection=do_delete_object.connect([this](){ if(delete_thread.joinable()) delete_thread.join(); + do_delete_object_connection.disconnect(); delete this; }); do_restart_parse.connect([this](){ @@ -875,8 +872,6 @@ std::vector Source::ClangViewAu void Source::ClangViewAutocomplete::async_delete() { parsing_in_progress->cancel("canceled, freeing resources in the background"); - autocomplete_done_connection.disconnect(); - autocomplete_fail_connection.disconnect(); parse_thread_stop=true; delete_thread=std::thread([this](){ //TODO: Is it possible to stop the clang-process in progress? @@ -1262,13 +1257,22 @@ void Source::ClangViewRefactor::tag_similar_tokens(const Token &token) { } } -Source::ClangViewRefactor::~ClangViewRefactor() { - delayed_tag_similar_tokens_connection.disconnect(); -} - Source::ClangView::ClangView(const boost::filesystem::path &file_path, const boost::filesystem::path& project_path, Glib::RefPtr language): ClangViewRefactor(file_path, project_path, language) { if(language) { get_source_buffer()->set_highlight_syntax(true); get_source_buffer()->set_language(language); } } + +void Source::ClangView::async_delete() { + delayed_reparse_connection.disconnect(); + parse_done_connection.disconnect(); + parse_start_connection.disconnect(); + parse_fail_connection.disconnect(); + autocomplete_done_connection.disconnect(); + autocomplete_fail_connection.disconnect(); + do_restart_parse_connection.disconnect(); + delayed_tag_similar_tokens_connection.disconnect(); + ClangViewAutocomplete::async_delete(); +} + diff --git a/src/source_clang.h b/src/source_clang.h index e029a58..1ffd4b2 100644 --- a/src/source_clang.h +++ b/src/source_clang.h @@ -21,8 +21,7 @@ namespace Source { }; ClangViewParse(const boost::filesystem::path &file_path, const boost::filesystem::path& project_path, Glib::RefPtr language); - ~ClangViewParse(); - void configure(); + virtual void configure(); void start_reparse(); bool reparse_needed=false; @@ -39,8 +38,8 @@ namespace Source { std::atomic parse_thread_stop; std::atomic parse_error; - void show_diagnostic_tooltips(const Gdk::Rectangle &rectangle); - void show_type_tooltips(const Gdk::Rectangle &rectangle); + virtual void show_diagnostic_tooltips(const Gdk::Rectangle &rectangle); + virtual void show_type_tooltips(const Gdk::Rectangle &rectangle); std::regex bracket_regex; std::regex no_bracket_statement_regex; @@ -48,6 +47,10 @@ namespace Source { std::set diagnostic_offsets; std::vector fix_its; + + sigc::connection parse_done_connection; + sigc::connection parse_start_connection; + sigc::connection parse_fail_connection; private: std::map get_buffer_map() const; void update_syntax(); @@ -77,11 +80,15 @@ namespace Source { }; ClangViewAutocomplete(const boost::filesystem::path &file_path, const boost::filesystem::path& project_path, Glib::RefPtr language); - void async_delete(); + virtual void async_delete(); bool restart_parse(); protected: bool on_key_press_event(GdkEventKey* key); std::thread autocomplete_thread; + sigc::connection autocomplete_done_connection; + sigc::connection autocomplete_fail_connection; + sigc::connection do_delete_object_connection; + sigc::connection do_restart_parse_connection; private: void start_autocomplete(); void autocomplete(); @@ -89,9 +96,7 @@ namespace Source { bool completion_dialog_shown=false; std::vector get_autocomplete_suggestions(int line_number, int column, std::map& buffer_map); Glib::Dispatcher autocomplete_done; - sigc::connection autocomplete_done_connection; Glib::Dispatcher autocomplete_fail; - sigc::connection autocomplete_fail_connection; bool autocomplete_starting=false; std::atomic autocomplete_cancel_starting; guint last_keyval=0; @@ -108,13 +113,13 @@ namespace Source { class ClangViewRefactor : public ClangViewAutocomplete { public: ClangViewRefactor(const boost::filesystem::path &file_path, const boost::filesystem::path& project_path, Glib::RefPtr language); - ~ClangViewRefactor(); + protected: + sigc::connection delayed_tag_similar_tokens_connection; private: std::list, Glib::RefPtr > > similar_token_marks; void tag_similar_tokens(const Token &token); Glib::RefPtr similar_tokens_tag; Token last_tagged_token; - sigc::connection delayed_tag_similar_tokens_connection; std::unique_ptr selection_dialog; bool renaming=false; }; @@ -122,6 +127,7 @@ namespace Source { class ClangView : public ClangViewRefactor { public: ClangView(const boost::filesystem::path &file_path, const boost::filesystem::path& project_path, Glib::RefPtr language); + virtual void async_delete(); }; }