diff options
author | Ivan Donchevskii <[email protected]> | 2018-07-10 15:53:51 +0200 |
---|---|---|
committer | Ivan Donchevskii <[email protected]> | 2018-08-13 13:24:12 +0000 |
commit | f60b0352953b06d1a69e2b8b2ed117eab17135f9 (patch) | |
tree | 4d2a99c75a427d1e1a6d76cf1a16697f76ae35c8 /src/plugins/clangcodemodel/clangcodemodelplugin.cpp | |
parent | 934e9b2e197199522d425af55b327108c255ae61 (diff) |
Clang: Add button to generate compile_commands.json
Change-Id: Iaabdcfc8d1b3463c3f6e5ce47536f9c52556eac0
Reviewed-by: Marco Bubke <[email protected]>
Diffstat (limited to 'src/plugins/clangcodemodel/clangcodemodelplugin.cpp')
-rw-r--r-- | src/plugins/clangcodemodel/clangcodemodelplugin.cpp | 99 |
1 files changed, 95 insertions, 4 deletions
diff --git a/src/plugins/clangcodemodel/clangcodemodelplugin.cpp b/src/plugins/clangcodemodel/clangcodemodelplugin.cpp index b2c44f0e901..faec14f7835 100644 --- a/src/plugins/clangcodemodel/clangcodemodelplugin.cpp +++ b/src/plugins/clangcodemodel/clangcodemodelplugin.cpp @@ -27,27 +27,33 @@ #include "clangconstants.h" #include "clangprojectsettingswidget.h" +#include "clangutils.h" #ifdef WITH_TESTS # include "test/clangbatchfileprocessor.h" # include "test/clangcodecompletion_test.h" #endif +#include <coreplugin/actionmanager/actioncontainer.h> +#include <coreplugin/actionmanager/actionmanager.h> + #include <cpptools/cppmodelmanager.h> +#include <projectexplorer/buildconfiguration.h> #include <projectexplorer/projectpanelfactory.h> #include <projectexplorer/projectexplorer.h> #include <projectexplorer/session.h> +#include <projectexplorer/target.h> #include <projectexplorer/taskhub.h> #include <texteditor/textmark.h> +#include <QtConcurrent> + namespace ClangCodeModel { namespace Internal { -namespace { - -void addProjectPanelWidget() +static void addProjectPanelWidget() { auto panelFactory = new ProjectExplorer::ProjectPanelFactory(); panelFactory->setPriority(60); @@ -58,7 +64,32 @@ void addProjectPanelWidget() ProjectExplorer::ProjectPanelFactory::registerFactory(panelFactory); } -} // anonymous namespace +void ClangCodeModelPlugin::generateCompilationDB() { + using namespace CppTools; + + ProjectExplorer::Project *project = ProjectExplorer::SessionManager::startupProject(); + if (!project) + return; + + m_generatorWatcher.setFuture(QtConcurrent::run( + &Utils::generateCompilationDB, + project->projectDirectory(), + CppModelManager::instance()->projectInfo(project))); +} + +static bool isDBGenerationEnabled(ProjectExplorer::Project *project) +{ + using namespace CppTools; + if (!project) + return false; + ProjectInfo projectInfo = CppModelManager::instance()->projectInfo(project); + return projectInfo.isValid() && !projectInfo.projectParts().isEmpty(); +} + +ClangCodeModelPlugin::~ClangCodeModelPlugin() +{ + m_generatorWatcher.waitForFinished(); +} bool ClangCodeModelPlugin::initialize(const QStringList &arguments, QString *errorMessage) { @@ -77,9 +108,69 @@ bool ClangCodeModelPlugin::initialize(const QStringList &arguments, QString *err addProjectPanelWidget(); + createCompilationDBButton(); + return true; } +void ClangCodeModelPlugin::createCompilationDBButton() +{ + Core::ActionContainer *mbuild = + Core::ActionManager::actionContainer(ProjectExplorer::Constants::M_BUILDPROJECT); + // generate compile_commands.json + m_generateCompilationDBAction = new ::Utils::ParameterAction( + tr("Generate compilation database"), + tr("Generate compilation database for \"%1\""), + ::Utils::ParameterAction::AlwaysEnabled, this); + + ProjectExplorer::Project *startupProject = ProjectExplorer::SessionManager::startupProject(); + m_generateCompilationDBAction->setEnabled(isDBGenerationEnabled(startupProject)); + if (startupProject) + m_generateCompilationDBAction->setParameter(startupProject->displayName()); + + Core::Command *command = Core::ActionManager::registerAction(m_generateCompilationDBAction, + Constants::GENERATE_COMPILATION_DB); + command->setAttribute(Core::Command::CA_UpdateText); + command->setDescription(m_generateCompilationDBAction->text()); + mbuild->addAction(command, ProjectExplorer::Constants::G_BUILD_BUILD); + + connect(&m_generatorWatcher, &QFutureWatcher<void>::finished, this, [this] () { + m_generateCompilationDBAction->setEnabled( + isDBGenerationEnabled(ProjectExplorer::SessionManager::startupProject())); + }); + connect(m_generateCompilationDBAction, &QAction::triggered, this, [this] { + if (!m_generateCompilationDBAction->isEnabled()) + return; + + m_generateCompilationDBAction->setEnabled(false); + generateCompilationDB(); + }); + connect(CppTools::CppModelManager::instance(), &CppTools::CppModelManager::projectPartsUpdated, + this, [this](ProjectExplorer::Project *project) { + if (project != ProjectExplorer::SessionManager::startupProject()) + return; + m_generateCompilationDBAction->setParameter(project->displayName()); + if (!m_generatorWatcher.isRunning()) + m_generateCompilationDBAction->setEnabled(isDBGenerationEnabled(project)); + }); + connect(ProjectExplorer::SessionManager::instance(), + &ProjectExplorer::SessionManager::startupProjectChanged, + this, + [this](ProjectExplorer::Project *project) { + m_generateCompilationDBAction->setParameter(project->displayName()); + if (!m_generatorWatcher.isRunning()) + m_generateCompilationDBAction->setEnabled(isDBGenerationEnabled(project)); + }); + connect(ProjectExplorer::SessionManager::instance(), + &ProjectExplorer::SessionManager::projectDisplayNameChanged, + this, + [this](ProjectExplorer::Project *project) { + if (project != ProjectExplorer::SessionManager::startupProject()) + return; + m_generateCompilationDBAction->setParameter(project->displayName()); + }); +} + void ClangCodeModelPlugin::extensionsInitialized() { } |