From ce9ca1f0ef4af4695e6c57983fc89a8bbc49976d Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Tue, 12 Jul 2016 15:08:53 +0200 Subject: [PATCH] ToolChain: Create toolchains for different languages Enable creation of toolchains for different languages and wire up the logic in the ToolChain Options Page. Change-Id: I9fbd95607d30cc1aa10f73d6532338f07f3e2b4e Reviewed-by: Tim Jenssen --- .../projectexplorer/customtoolchain.cpp | 12 ++-- src/plugins/projectexplorer/customtoolchain.h | 3 +- src/plugins/projectexplorer/gcctoolchain.cpp | 8 +-- .../projectexplorer/gcctoolchainfactories.h | 2 +- src/plugins/projectexplorer/toolchain.cpp | 3 +- src/plugins/projectexplorer/toolchain.h | 2 +- .../projectexplorer/toolchainoptionspage.cpp | 57 +++++++++++-------- src/plugins/qnx/qnxtoolchain.cpp | 4 +- src/plugins/qnx/qnxtoolchain.h | 2 +- 9 files changed, 53 insertions(+), 40 deletions(-) diff --git a/src/plugins/projectexplorer/customtoolchain.cpp b/src/plugins/projectexplorer/customtoolchain.cpp index 7aafa808d5e..2e5a93be319 100644 --- a/src/plugins/projectexplorer/customtoolchain.cpp +++ b/src/plugins/projectexplorer/customtoolchain.cpp @@ -88,10 +88,14 @@ static const char messageCapKeyC[] = "ProjectExplorer.CustomToolChain.MessageCap CustomToolChain::CustomToolChain(Detection d) : ToolChain(Constants::CUSTOM_TOOLCHAIN_TYPEID, d), m_outputParser(Gcc) +{ } + +CustomToolChain::CustomToolChain(Language l, Detection d) : CustomToolChain(d) { - setLanguage(Language::Cxx); + setLanguage(l); } + QString CustomToolChain::typeDisplayName() const { return Internal::CustomToolChainFactory::tr("Custom"); @@ -434,7 +438,7 @@ CustomToolChainFactory::CustomToolChainFactory() QSet CustomToolChainFactory::supportedLanguages() const { - return { ToolChain::Language::Cxx }; + return ToolChain::allLanguages(); } bool CustomToolChainFactory::canCreate() @@ -442,9 +446,9 @@ bool CustomToolChainFactory::canCreate() return true; } -ToolChain *CustomToolChainFactory::create() +ToolChain *CustomToolChainFactory::create(ToolChain::Language l) { - return new CustomToolChain(ToolChain::ManualDetection); + return new CustomToolChain(l, ToolChain::ManualDetection); } // Used by the ToolChainManager to restore user-generated tool chains diff --git a/src/plugins/projectexplorer/customtoolchain.h b/src/plugins/projectexplorer/customtoolchain.h index e4ef3a80066..7b46a948489 100644 --- a/src/plugins/projectexplorer/customtoolchain.h +++ b/src/plugins/projectexplorer/customtoolchain.h @@ -122,6 +122,7 @@ protected: private: explicit CustomToolChain(Detection d); + explicit CustomToolChain(Language l, Detection d); Utils::FileName m_compilerCommand; Utils::FileName m_makeCommand; @@ -150,7 +151,7 @@ public: QSet supportedLanguages() const override; bool canCreate() override; - ToolChain *create() override; + ToolChain *create(ToolChain::Language l) override; // Used by the ToolChainManager to restore user-generated tool chains bool canRestore(const QVariantMap &data) override; diff --git a/src/plugins/projectexplorer/gcctoolchain.cpp b/src/plugins/projectexplorer/gcctoolchain.cpp index c089e9e54dc..f1a81d7e69c 100644 --- a/src/plugins/projectexplorer/gcctoolchain.cpp +++ b/src/plugins/projectexplorer/gcctoolchain.cpp @@ -771,7 +771,7 @@ GccToolChainFactory::GccToolChainFactory() QSet GccToolChainFactory::supportedLanguages() const { - return { ToolChain::Language::Cxx }; + return { ToolChain::Language::Cxx, ToolChain::Language::C }; } bool GccToolChainFactory::canCreate() @@ -779,10 +779,10 @@ bool GccToolChainFactory::canCreate() return true; } -ToolChain *GccToolChainFactory::create() +ToolChain *GccToolChainFactory::create(ToolChain::Language l) { ToolChain *tc = createToolChain(false); - tc->setLanguage({ ToolChain::Language::Cxx }); + tc->setLanguage(l); return tc; } @@ -1141,7 +1141,7 @@ ClangToolChainFactory::ClangToolChainFactory() QSet ClangToolChainFactory::supportedLanguages() const { - return { ProjectExplorer::ToolChain::Language::Cxx }; + return { ProjectExplorer::ToolChain::Language::Cxx, ProjectExplorer::ToolChain::Language::C }; } QList ClangToolChainFactory::autoDetect(const QList &alreadyKnown) diff --git a/src/plugins/projectexplorer/gcctoolchainfactories.h b/src/plugins/projectexplorer/gcctoolchainfactories.h index c8e984a5136..6a472853c24 100644 --- a/src/plugins/projectexplorer/gcctoolchainfactories.h +++ b/src/plugins/projectexplorer/gcctoolchainfactories.h @@ -54,7 +54,7 @@ public: QList autoDetect(const QList &alreadyKnown) override; bool canCreate() override; - ToolChain *create() override; + ToolChain *create(ToolChain::Language l) override; bool canRestore(const QVariantMap &data) override; ToolChain *restore(const QVariantMap &data) override; diff --git a/src/plugins/projectexplorer/toolchain.cpp b/src/plugins/projectexplorer/toolchain.cpp index f9142ce8b84..4f59e76a35c 100644 --- a/src/plugins/projectexplorer/toolchain.cpp +++ b/src/plugins/projectexplorer/toolchain.cpp @@ -291,8 +291,9 @@ bool ToolChainFactory::canCreate() return false; } -ToolChain *ToolChainFactory::create() +ToolChain *ToolChainFactory::create(ToolChain::Language l) { + Q_UNUSED(l); return nullptr; } diff --git a/src/plugins/projectexplorer/toolchain.h b/src/plugins/projectexplorer/toolchain.h index 00dd9c250e4..2b0af1b02ac 100644 --- a/src/plugins/projectexplorer/toolchain.h +++ b/src/plugins/projectexplorer/toolchain.h @@ -166,7 +166,7 @@ public: virtual QList autoDetect(const QList &alreadyKnown); virtual bool canCreate(); - virtual ToolChain *create(); + virtual ToolChain *create(ToolChain::Language l); virtual bool canRestore(const QVariantMap &data); virtual ToolChain *restore(const QVariantMap &data); diff --git a/src/plugins/projectexplorer/toolchainoptionspage.cpp b/src/plugins/projectexplorer/toolchainoptionspage.cpp index 2ff25cbf4bb..3ef0228a8fd 100644 --- a/src/plugins/projectexplorer/toolchainoptionspage.cpp +++ b/src/plugins/projectexplorer/toolchainoptionspage.cpp @@ -152,27 +152,20 @@ public: continue; if (languages.count() == 1) { - QAction *action = new QAction(addMenu); - action->setText(factory->displayName()); - connect(action, &QAction::triggered, [this, factory] { createToolChain(factory); }); - addMenu->addAction(action); + addMenu->addAction(createAction(factory->displayName(), factory, languages.at(0))); } else { Utils::sort(languages, [](ToolChain::Language l1, ToolChain::Language l2) { return ToolChain::languageDisplayName(l1) < ToolChain::languageDisplayName(l2); }); auto subMenu = addMenu->addMenu(factory->displayName()); - foreach (ToolChain::Language l, languages) { - auto action = new QAction(subMenu); - action->setText(ToolChain::languageDisplayName(l)); - connect(action, &QAction::triggered, [this, factory] { createToolChain(factory); }); - subMenu->addAction(action); - } + foreach (ToolChain::Language l, languages) + subMenu->addAction(createAction(ToolChain::languageDisplayName(l), factory, l)); } } m_addButton->setMenu(addMenu); m_cloneButton = new QPushButton(ToolChainOptionsPage::tr("Clone"), this); - connect(m_cloneButton, &QAbstractButton::clicked, [this] { createToolChain(nullptr); }); + connect(m_cloneButton, &QAbstractButton::clicked, [this] { cloneToolChain(); }); m_delButton = new QPushButton(ToolChainOptionsPage::tr("Remove"), this); @@ -216,7 +209,8 @@ public: void toolChainSelectionChanged(); void updateState(); - void createToolChain(ToolChainFactory *factory); + void createToolChain(ToolChainFactory *factory, ToolChain::Language l); + void cloneToolChain(); ToolChainTreeItem *currentTreeItem(); void markForRemoval(ToolChainTreeItem *item); @@ -225,6 +219,12 @@ public: void removeToolChain(ProjectExplorer::ToolChain *); StaticTreeItem *parentForToolChain(ToolChain *tc); + QAction *createAction(const QString &name, ToolChainFactory *factory, ToolChain::Language l) + { + auto action = new QAction(name, nullptr); + connect(action, &QAction::triggered, [this, factory, l] { createToolChain(factory, l); }); + return action; + } void apply(); @@ -374,21 +374,28 @@ void ToolChainOptionsWidget::apply() } } -void ToolChainOptionsWidget::createToolChain(ToolChainFactory *factory) +void ToolChainOptionsWidget::createToolChain(ToolChainFactory *factory, ToolChain::Language l) { - ToolChain *tc = nullptr; + QTC_ASSERT(factory, return); + QTC_ASSERT(factory->canCreate(), return); + QTC_ASSERT(l != ToolChain::Language::None, return); - if (factory) { - // Clone. - QTC_CHECK(factory->canCreate()); - tc = factory->create(); - } else { - // Copy. - ToolChainTreeItem *current = currentTreeItem(); - if (!current) - return; - tc = current->toolChain->clone(); - } + ToolChain *tc = factory->create(l); + if (!tc) + return; + + auto item = insertToolChain(tc, true); + m_toAddList.append(item); + + m_toolChainView->setCurrentIndex(m_model.indexForItem(item)); +} + +void ToolChainOptionsWidget::cloneToolChain() +{ + ToolChainTreeItem *current = currentTreeItem(); + if (!current) + return; + ToolChain *tc = current->toolChain->clone(); if (!tc) return; diff --git a/src/plugins/qnx/qnxtoolchain.cpp b/src/plugins/qnx/qnxtoolchain.cpp index 20af5355fd1..4fcf377f71e 100644 --- a/src/plugins/qnx/qnxtoolchain.cpp +++ b/src/plugins/qnx/qnxtoolchain.cpp @@ -185,9 +185,9 @@ bool QnxToolChainFactory::canCreate() return true; } -ToolChain *QnxToolChainFactory::create() +ToolChain *QnxToolChainFactory::create(ToolChain::Language l) { - return new QnxToolChain(ToolChain::ManualDetection); + return new QnxToolChain(l, ToolChain::ManualDetection); } //--------------------------------------------------------------------------------- diff --git a/src/plugins/qnx/qnxtoolchain.h b/src/plugins/qnx/qnxtoolchain.h index b55d2f358d4..dfde82df437 100644 --- a/src/plugins/qnx/qnxtoolchain.h +++ b/src/plugins/qnx/qnxtoolchain.h @@ -75,7 +75,7 @@ public: ProjectExplorer::ToolChain *restore(const QVariantMap &data) override; bool canCreate() override; - ProjectExplorer::ToolChain *create() override; + ProjectExplorer::ToolChain *create(ProjectExplorer::ToolChain::Language l) override; }; //----------------------------------------------------------------------------