diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index 9c25e8d3b5e..cb934f2ed90 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -47,7 +47,7 @@ #include #include -#include +#include #include #include @@ -163,7 +163,7 @@ public: std::unique_ptr m_document; std::unique_ptr m_rootProjectNode; std::unique_ptr m_containerNode; - QList m_targets; + std::vector> m_targets; Target *m_activeTarget = nullptr; EditorConfiguration m_editorConfiguration; Core::Context m_projectLanguages; @@ -181,8 +181,6 @@ public: ProjectPrivate::~ProjectPrivate() { - qDeleteAll(m_targets); - // Make sure our root node is null when deleting the actual node std::unique_ptr oldNode = std::move(m_rootProjectNode); } @@ -241,31 +239,32 @@ bool Project::hasActiveBuildSettings() const return activeTarget() && IBuildConfigurationFactory::find(activeTarget()); } -void Project::addTarget(Target *t) +void Project::addTarget(std::unique_ptr &&t) { - QTC_ASSERT(t && !d->m_targets.contains(t), return); + auto pointer = t.get(); + QTC_ASSERT(t && !Utils::contains(d->m_targets, pointer), return); QTC_ASSERT(!target(t->kit()), return); Q_ASSERT(t->project() == this); t->setDefaultDisplayName(t->displayName()); // add it - d->m_targets.push_back(t); - connect(t, &Target::addedProjectConfiguration, this, &Project::addedProjectConfiguration); - connect(t, &Target::aboutToRemoveProjectConfiguration, this, &Project::aboutToRemoveProjectConfiguration); - connect(t, &Target::removedProjectConfiguration, this, &Project::removedProjectConfiguration); - connect(t, &Target::activeProjectConfigurationChanged, this, &Project::activeProjectConfigurationChanged); - emit addedProjectConfiguration(t); - emit addedTarget(t); + d->m_targets.emplace_back(std::move(t)); + connect(pointer, &Target::addedProjectConfiguration, this, &Project::addedProjectConfiguration); + connect(pointer, &Target::aboutToRemoveProjectConfiguration, this, &Project::aboutToRemoveProjectConfiguration); + connect(pointer, &Target::removedProjectConfiguration, this, &Project::removedProjectConfiguration); + connect(pointer, &Target::activeProjectConfigurationChanged, this, &Project::activeProjectConfigurationChanged); + emit addedProjectConfiguration(pointer); + emit addedTarget(pointer); // check activeTarget: if (!activeTarget()) - setActiveTarget(t); + setActiveTarget(pointer); } bool Project::removeTarget(Target *target) { - QTC_ASSERT(target && d->m_targets.contains(target), return false); + QTC_ASSERT(target && Utils::contains(d->m_targets, target), return false); if (BuildManager::isBuilding(target)) return false; @@ -273,25 +272,24 @@ bool Project::removeTarget(Target *target) if (target == activeTarget()) { if (d->m_targets.size() == 1) SessionManager::setActiveTarget(this, nullptr, SetActive::Cascade); - else if (d->m_targets.first() == target) - SessionManager::setActiveTarget(this, d->m_targets.at(1), SetActive::Cascade); + else if (d->m_targets.at(0).get() == target) + SessionManager::setActiveTarget(this, d->m_targets.at(1).get(), SetActive::Cascade); else - SessionManager::setActiveTarget(this, d->m_targets.at(0), SetActive::Cascade); + SessionManager::setActiveTarget(this, d->m_targets.at(0).get(), SetActive::Cascade); } emit aboutToRemoveProjectConfiguration(target); emit aboutToRemoveTarget(target); - d->m_targets.removeOne(target); + auto keep = Utils::take(d->m_targets, target); emit removedTarget(target); emit removedProjectConfiguration(target); - delete target; return true; } QList Project::targets() const { - return d->m_targets; + return Utils::toRawPointer(d->m_targets); } Target *Project::activeTarget() const @@ -301,8 +299,8 @@ Target *Project::activeTarget() const void Project::setActiveTarget(Target *target) { - if ((!target && !d->m_targets.isEmpty()) || - (target && d->m_targets.contains(target) && d->m_activeTarget != target)) { + if ((!target && d->m_targets.size() > 0) || + (target && Utils::contains(d->m_targets, target) && d->m_activeTarget != target)) { d->m_activeTarget = target; emit activeProjectConfigurationChanged(d->m_activeTarget); emit activeTargetChanged(d->m_activeTarget); @@ -327,16 +325,14 @@ QList Project::projectIssues(const Kit *k) const return {}; } -Target *Project::createTarget(Kit *k) +std::unique_ptr Project::createTarget(Kit *k) { if (!k || target(k)) return nullptr; - auto t = new Target(this, k); - if (!setupTarget(t)) { - delete t; - return nullptr; - } + auto t = std::make_unique(this, k, Target::_constructor_tag{}); + if (!setupTarget(t.get())) + return {}; return t; } @@ -529,7 +525,7 @@ void Project::handleSubTreeChanged(FolderNode *node) emit fileListChanged(); } -Target *Project::restoreTarget(const QVariantMap &data) +std::unique_ptr Project::restoreTarget(const QVariantMap &data) { Core::Id id = idFromMap(data); if (target(id)) { @@ -544,11 +540,9 @@ Target *Project::restoreTarget(const QVariantMap &data) return nullptr; } - auto t = new Target(this, k); - if (!t->fromMap(data)) { - delete t; - return nullptr; - } + auto t = std::make_unique(this, k, Target::_constructor_tag{}); + if (!t->fromMap(data)) + return {}; return t; } @@ -698,16 +692,11 @@ void Project::createTargetFromMap(const QVariantMap &map, int index) return; QVariantMap targetMap = map.value(key).toMap(); - Target *t = restoreTarget(targetMap); - if (!t) + std::unique_ptr t = restoreTarget(targetMap); + if (!t || (t->runConfigurations().isEmpty() && t->buildConfigurations().isEmpty())) return; - if (t->runConfigurations().isEmpty() && t->buildConfigurations().isEmpty()) { - delete t; - return; - } - - addTarget(t); + addTarget(std::move(t)); } EditorConfiguration *Project::editorConfiguration() const @@ -799,7 +788,7 @@ void Project::setNamedSettings(const QString &name, const QVariant &value) bool Project::needsConfiguration() const { - return d->m_targets.isEmpty(); + return d->m_targets.size() == 0; } bool Project::needsBuildConfigurations() const @@ -822,20 +811,20 @@ bool Project::knowsAllBuildExecutables() const return true; } -void Project::setup(QList infoList) +void Project::setup(const QList &infoList) { - QList toRegister; - foreach (const BuildInfo *info, infoList) { + std::vector> toRegister; + for (const BuildInfo *info : infoList) { Kit *k = KitManager::kit(info->kitId); if (!k) continue; Target *t = target(k); - if (!t) { + if (!t) t = Utils::findOrDefault(toRegister, Utils::equal(&Target::kit, k)); - } if (!t) { - t = new Target(this, k); - toRegister << t; + auto newTarget = std::make_unique(this, k, Target::_constructor_tag{}); + t = newTarget.get(); + toRegister.emplace_back(std::move(newTarget)); } if (!info->factory()) @@ -846,10 +835,10 @@ void Project::setup(QList infoList) continue; t->addBuildConfiguration(bc); } - foreach (Target *t, toRegister) { + for (std::unique_ptr &t : toRegister) { t->updateDefaultDeployConfigurations(); t->updateDefaultRunConfigurations(); - addTarget(t); + addTarget(std::move(t)); } } diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h index 29e6d7fb2d1..2b4d7abbb04 100644 --- a/src/plugins/projectexplorer/project.h +++ b/src/plugins/projectexplorer/project.h @@ -114,7 +114,7 @@ public: EditorConfiguration *editorConfiguration() const; // Target: - void addTarget(Target *target); + void addTarget(std::unique_ptr &&target); bool removeTarget(Target *target); QList targets() const; @@ -124,9 +124,9 @@ public: Target *target(Kit *k) const; virtual QList projectIssues(const Kit *k) const; - Target *createTarget(Kit *k); + std::unique_ptr createTarget(Kit *k); static bool copySteps(Target *sourceTarget, Target *newTarget); - Target *restoreTarget(const QVariantMap &data); + std::unique_ptr restoreTarget(const QVariantMap &data); void saveSettings(); enum class RestoreResult { Ok, Error, UserAbort }; @@ -163,7 +163,7 @@ public: // of configuration. virtual bool knowsAllBuildExecutables() const; - void setup(QList infoList); + void setup(const QList &infoList); Utils::MacroExpander *macroExpander() const; bool isParsing() const; diff --git a/src/plugins/projectexplorer/projectwindow.cpp b/src/plugins/projectexplorer/projectwindow.cpp index 51e17e5610d..b0ad690ef7a 100644 --- a/src/plugins/projectexplorer/projectwindow.cpp +++ b/src/plugins/projectexplorer/projectwindow.cpp @@ -554,9 +554,10 @@ public: for (BuildInfo *info : toImport) { Target *target = project->target(info->kitId); if (!target) { - target = project->createTarget(KitManager::kit(info->kitId)); - if (target) - project->addTarget(target); + std::unique_ptr newTarget = project->createTarget(KitManager::kit(info->kitId)); + target = newTarget.get(); + if (newTarget) + project->addTarget(std::move(newTarget)); } if (target) { projectImporter->makePersistent(target->kit()); diff --git a/src/plugins/projectexplorer/target.cpp b/src/plugins/projectexplorer/target.cpp index de47a67f26d..676a3bb8816 100644 --- a/src/plugins/projectexplorer/target.cpp +++ b/src/plugins/projectexplorer/target.cpp @@ -92,11 +92,11 @@ public: QIcon m_overlayIcon; QList m_buildConfigurations; - BuildConfiguration *m_activeBuildConfiguration = 0; + BuildConfiguration *m_activeBuildConfiguration = nullptr; QList m_deployConfigurations; - DeployConfiguration *m_activeDeployConfiguration = 0; + DeployConfiguration *m_activeDeployConfiguration = nullptr; QList m_runConfigurations; - RunConfiguration* m_activeRunConfiguration = 0; + RunConfiguration* m_activeRunConfiguration = nullptr; DeploymentData m_deploymentData; BuildTargetInfoList m_appTargets; QVariantMap m_pluginSettings; @@ -108,7 +108,7 @@ TargetPrivate::TargetPrivate(Kit *k) : m_kit(k) { } -Target::Target(Project *project, Kit *k) : +Target::Target(Project *project, Kit *k, _constructor_tag) : ProjectConfiguration(project, k->id()), d(new TargetPrivate(k)) { diff --git a/src/plugins/projectexplorer/target.h b/src/plugins/projectexplorer/target.h index 8f4e544db24..43d7c39796c 100644 --- a/src/plugins/projectexplorer/target.h +++ b/src/plugins/projectexplorer/target.h @@ -54,7 +54,10 @@ class PROJECTEXPLORER_EXPORT Target : public ProjectConfiguration friend class SessionManager; // for setActiveBuild and setActiveDeployConfiguration Q_OBJECT + struct _constructor_tag { explicit _constructor_tag() = default; }; + public: + Target(Project *parent, Kit *k, _constructor_tag); ~Target() override; Project *project() const override; @@ -164,7 +167,6 @@ signals: void applicationTargetsChanged(); private: - Target(Project *parent, Kit *k); void setEnabled(bool); bool fromMap(const QVariantMap &map) override; diff --git a/src/plugins/qmlprofiler/tests/qmlprofilerdetailsrewriter_test.cpp b/src/plugins/qmlprofiler/tests/qmlprofilerdetailsrewriter_test.cpp index f4e9d0e00db..986e23b09bb 100644 --- a/src/plugins/qmlprofiler/tests/qmlprofilerdetailsrewriter_test.cpp +++ b/src/plugins/qmlprofiler/tests/qmlprofilerdetailsrewriter_test.cpp @@ -202,9 +202,9 @@ void QmlProfilerDetailsRewriterTest::seedRewriter() DummyProject *project = new DummyProject(Utils::FileName::fromString(filename)); ProjectExplorer::SessionManager::addProject(project); - ProjectExplorer::Target *target = project->createTarget(kit); + std::unique_ptr target = project->createTarget(kit); - m_rewriter.populateFileFinder(target); + m_rewriter.populateFileFinder(target.get()); ProjectExplorer::SessionManager::removeProject(project); ProjectExplorer::KitManager::deleteKit(kit); } diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.h b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.h index 5c6d1dca479..9da009370e1 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.h +++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.h @@ -27,6 +27,7 @@ #include "qmlprojectmanager_global.h" +#include #include namespace Core { class IEditor; }