diff --git a/src/menu.cc b/src/menu.cc
index a9eccf0..ac6a464 100644
--- a/src/menu.cc
+++ b/src/menu.cc
@@ -245,8 +245,8 @@ Menu::Menu() {
app.compile
-
- _Clean _Project
- app.clean_project
+ _Recreate _Build
+ app.project_recreate_build
diff --git a/src/project.cc b/src/project.cc
index 96d6c1a..11de813 100644
--- a/src/project.cc
+++ b/src/project.cc
@@ -147,17 +147,8 @@ void Project::Base::compile_and_run() {
Info::get().print("Could not find a supported project");
}
-void Project::Base::clean_project() {
- auto default_build_path=build->get_default_path();
- if(default_build_path.empty() || !build->update_default())
- return;
-
- if(Config::get().project.clear_terminal_on_compile)
- Terminal::get().clear();
- Terminal::get().print("Cleaning build directory\n");
- boost::filesystem::remove_all(default_build_path);
- boost::filesystem::create_directory(default_build_path);
- Terminal::get().print("Build directory cleaned!\n");
+void Project::Base::recreate_build() {
+ Info::get().print("Could not find a supported project");
}
std::pair Project::Base::debug_get_run_arguments() {
@@ -281,6 +272,59 @@ void Project::Clang::compile_and_run() {
});
}
+void Project::Clang::recreate_build() {
+ auto default_build_path=build->get_default_path();
+ if(default_build_path.empty())
+ return;
+
+ auto debug_build_path=build->get_debug_path();
+ bool has_default_build=boost::filesystem::exists(default_build_path);
+ bool has_debug_build=!debug_build_path.empty() && boost::filesystem::exists(debug_build_path);
+
+ if(has_default_build || has_debug_build) {
+ Gtk::MessageDialog dialog(*static_cast(Notebook::get().get_toplevel()), "Recreate Build", false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_YES_NO);
+ dialog.set_default_response(Gtk::RESPONSE_NO);
+ std::string message="Are you sure you want to recreate ";
+ if(has_default_build)
+ message+=default_build_path.string();
+ if(has_debug_build) {
+ if(has_default_build)
+ message+=" and ";
+ message+=debug_build_path.string();
+ }
+ dialog.set_secondary_text(message+"?");
+ if(dialog.run()!=Gtk::RESPONSE_YES)
+ return;
+ try {
+ if(has_default_build)
+ boost::filesystem::remove_all(default_build_path);
+ if(has_debug_build)
+ boost::filesystem::remove_all(debug_build_path);
+ }
+ catch(const std::exception &e) {
+ Terminal::get().print(std::string("Error: could remove build: ")+e.what()+"\n", true);
+ return;
+ }
+ }
+
+ build->update_default(true);
+ if(has_debug_build)
+ build->update_debug(true);
+
+ for(size_t c=0;c(source_view)) {
+ if(filesystem::file_in_path(source_clang_view->file_path, build->project_path))
+ source_clang_view->full_reparse_needed=true;
+ }
+ }
+
+ if(auto view=Notebook::get().get_current_view()) {
+ if(view->full_reparse_needed)
+ view->full_reparse();
+ }
+}
+
#ifdef JUCI_ENABLE_DEBUG
std::pair Project::Clang::debug_get_run_arguments() {
auto build_path=build->get_debug_path();
diff --git a/src/project.h b/src/project.h
index e1270a1..d9596c6 100644
--- a/src/project.h
+++ b/src/project.h
@@ -43,7 +43,7 @@ namespace Project {
virtual std::pair get_run_arguments();
virtual void compile();
virtual void compile_and_run();
- virtual void clean_project();
+ virtual void recreate_build();
virtual std::pair debug_get_run_arguments();
virtual Gtk::Popover *debug_get_options() { return nullptr; }
@@ -84,6 +84,7 @@ namespace Project {
std::pair get_run_arguments() override;
void compile() override;
void compile_and_run() override;
+ void recreate_build() override;
#ifdef JUCI_ENABLE_DEBUG
std::pair debug_get_run_arguments() override;
diff --git a/src/source.h b/src/source.h
index 01ef30f..4091003 100644
--- a/src/source.h
+++ b/src/source.h
@@ -96,7 +96,7 @@ namespace Source {
bool soft_reparse_needed=false;
bool full_reparse_needed=false;
virtual void soft_reparse() {soft_reparse_needed=false;}
- virtual bool full_reparse() {full_reparse_needed=false; return true;}
+ virtual void full_reparse() {full_reparse_needed=false;}
protected:
std::time_t last_read_time;
bool parsed=false;
diff --git a/src/source_clang.cc b/src/source_clang.cc
index 95d9571..80d14b6 100644
--- a/src/source_clang.cc
+++ b/src/source_clang.cc
@@ -1409,14 +1409,23 @@ Source::ClangView::ClangView(const boost::filesystem::path &file_path, Glib::Ref
});
}
-bool Source::ClangView::full_reparse() {
+void Source::ClangView::full_reparse() {
+ auto print_error=[this] {
+ Terminal::get().async_print("Error: failed to reparse "+file_path.string()+". Please reopen the file manually.\n", true);
+ };
full_reparse_needed=false;
- if(!full_reparse_running) {
+ if(full_reparse_running) {
+ print_error();
+ return;
+ }
+ else {
auto expected=ParseState::PROCESSING;
if(!parse_state.compare_exchange_strong(expected, ParseState::RESTARTING)) {
expected=ParseState::RESTARTING;
- if(!parse_state.compare_exchange_strong(expected, ParseState::RESTARTING))
- return false;
+ if(!parse_state.compare_exchange_strong(expected, ParseState::RESTARTING)) {
+ print_error();
+ return;
+ }
}
autocomplete_state=AutocompleteState::IDLE;
soft_reparse_needed=false;
@@ -1433,9 +1442,7 @@ bool Source::ClangView::full_reparse() {
full_reparse_running=false;
});
});
- return true;
}
- return false;
}
void Source::ClangView::async_delete() {
diff --git a/src/source_clang.h b/src/source_clang.h
index 24212a6..f429a42 100644
--- a/src/source_clang.h
+++ b/src/source_clang.h
@@ -118,7 +118,7 @@ namespace Source {
public:
ClangView(const boost::filesystem::path &file_path, Glib::RefPtr language);
- bool full_reparse() override;
+ void full_reparse() override;
void async_delete();
private:
diff --git a/src/window.cc b/src/window.cc
index 40a58f3..c34f7ea 100644
--- a/src/window.cc
+++ b/src/window.cc
@@ -117,10 +117,8 @@ Window::Window() {
Directories::get().select(view->file_path);
- if(view->full_reparse_needed) {
- if(!view->full_reparse())
- Terminal::get().async_print("Error: failed to reparse "+view->file_path.string()+". Please reopen the file manually.\n", true);
- }
+ if(view->full_reparse_needed)
+ view->full_reparse();
else if(view->soft_reparse_needed)
view->soft_reparse();
@@ -855,18 +853,15 @@ void Window::set_menu_actions() {
Project::current->compile();
});
- menu.add_action("clean_project", [this]() {
+ menu.add_action("project_recreate_build", [this]() {
if(Project::compiling || Project::debugging) {
Info::get().print("Compile or debug in progress");
return;
}
Project::current=Project::create();
-
- if(Config::get().project.save_on_compile_or_run)
- Project::save_files(Project::current->build->project_path);
- Project::current->clean_project();
+ Project::current->recreate_build();
});
menu.add_action("run_command", [this]() {