Browse Source

Completed Recreate (Clean) Build in Project menu

merge-requests/365/head
eidheim 9 years ago
parent
commit
fdddef3314
  1. 4
      src/menu.cc
  2. 66
      src/project.cc
  3. 3
      src/project.h
  4. 2
      src/source.h
  5. 19
      src/source_clang.cc
  6. 2
      src/source_clang.h
  7. 13
      src/window.cc

4
src/menu.cc

@ -245,8 +245,8 @@ Menu::Menu() {
<attribute name='action'>app.compile</attribute>
</item>
<item>
<attribute name='label' translatable='yes'>_Clean _Project</attribute>
<attribute name='action'>app.clean_project</attribute>
<attribute name='label' translatable='yes'>_Recreate _Build</attribute>
<attribute name='action'>app.project_recreate_build</attribute>
</item>
</section>
<section>

66
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<std::string, std::string> 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<Gtk::Window*>(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<Notebook::get().size();c++) {
auto source_view=Notebook::get().get_view(c);
if(auto source_clang_view=dynamic_cast<Source::ClangView*>(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<std::string, std::string> Project::Clang::debug_get_run_arguments() {
auto build_path=build->get_debug_path();

3
src/project.h

@ -43,7 +43,7 @@ namespace Project {
virtual std::pair<std::string, std::string> get_run_arguments();
virtual void compile();
virtual void compile_and_run();
virtual void clean_project();
virtual void recreate_build();
virtual std::pair<std::string, std::string> debug_get_run_arguments();
virtual Gtk::Popover *debug_get_options() { return nullptr; }
@ -84,6 +84,7 @@ namespace Project {
std::pair<std::string, std::string> get_run_arguments() override;
void compile() override;
void compile_and_run() override;
void recreate_build() override;
#ifdef JUCI_ENABLE_DEBUG
std::pair<std::string, std::string> debug_get_run_arguments() override;

2
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;

19
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() {

2
src/source_clang.h

@ -118,7 +118,7 @@ namespace Source {
public:
ClangView(const boost::filesystem::path &file_path, Glib::RefPtr<Gsv::Language> language);
bool full_reparse() override;
void full_reparse() override;
void async_delete();
private:

13
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]() {

Loading…
Cancel
Save