From 9bb936499d5e386a3439e6e2856acf0caba38bc7 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 29 Jan 2019 16:51:17 +0100 Subject: [PATCH] ProjectExplorer: Collapse BuildInfo hierarchy ... to pass it around as real values, avoiding, among others, the need of occasional explicit deletion. The formerly extra members of the derived stuff are handled via an extra variant (for data) and via a functor in the build configuration factory. The change is mechanical. Change-Id: I19ca4e0c5f0a5b196fc16dfb98bb005dc679f855 Reviewed-by: Christian Kandeler --- .../autotoolsbuildconfiguration.cpp | 29 +++--- .../autotoolsbuildconfiguration.h | 10 +- .../cmakebuildconfiguration.cpp | 97 +++++++++++-------- .../cmakebuildconfiguration.h | 16 +-- .../cmakeprojectmanager/cmakebuildinfo.h | 72 -------------- .../cmakeprojectimporter.cpp | 21 ++-- .../cmakeprojectimporter.h | 4 +- .../cmakeprojectmanager.pro | 1 - .../cmakeprojectmanager.qbs | 1 - .../genericbuildconfiguration.cpp | 26 +++-- .../genericbuildconfiguration.h | 10 +- .../nim/project/nimbuildconfiguration.cpp | 32 +++--- .../nim/project/nimbuildconfiguration.h | 12 +-- .../projectexplorer/buildconfiguration.cpp | 33 ++++++- .../projectexplorer/buildconfiguration.h | 19 +++- src/plugins/projectexplorer/buildinfo.cpp | 3 +- src/plugins/projectexplorer/buildinfo.h | 23 ++--- .../buildsettingspropertiespage.cpp | 22 ++--- .../buildsettingspropertiespage.h | 3 +- src/plugins/projectexplorer/project.cpp | 14 ++- src/plugins/projectexplorer/project.h | 2 +- .../projectexplorer/projectimporter.cpp | 10 +- src/plugins/projectexplorer/projectimporter.h | 4 +- src/plugins/projectexplorer/projectwindow.cpp | 11 +-- src/plugins/projectexplorer/target.cpp | 10 +- .../projectexplorer/targetsetuppage.cpp | 15 ++- .../projectexplorer/targetsetupwidget.cpp | 43 ++++---- .../projectexplorer/targetsetupwidget.h | 10 +- .../qbsbuildconfiguration.cpp | 64 ++++++------ .../qbsprojectmanager/qbsbuildconfiguration.h | 10 +- .../qbsprojectmanager/qbsbuildinfo.cpp | 48 --------- src/plugins/qbsprojectmanager/qbsbuildinfo.h | 48 --------- src/plugins/qbsprojectmanager/qbsproject.cpp | 12 +-- .../qbsprojectmanager/qbsprojectimporter.cpp | 24 ++--- .../qbsprojectmanager/qbsprojectimporter.h | 4 +- .../qbsprojectmanager/qbsprojectmanager.pro | 2 - .../qbsprojectmanager/qbsprojectmanager.qbs | 2 - .../qmakebuildconfiguration.cpp | 91 ++++++++++------- .../qmakebuildconfiguration.h | 13 ++- .../qmakeprojectmanager/qmakebuildinfo.h | 54 +---------- .../qmakeprojectmanager/qmakeproject.cpp | 12 +-- .../qmakeprojectimporter.cpp | 35 ++++--- .../qmakeprojectimporter.h | 4 +- .../tests/qmlprofilerdetailsrewriter_test.cpp | 11 ++- src/plugins/qtsupport/qtprojectimporter.cpp | 26 +++-- 45 files changed, 418 insertions(+), 595 deletions(-) delete mode 100644 src/plugins/cmakeprojectmanager/cmakebuildinfo.h delete mode 100644 src/plugins/qbsprojectmanager/qbsbuildinfo.cpp delete mode 100644 src/plugins/qbsprojectmanager/qbsbuildinfo.h diff --git a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp index 93f62323a13..33ebf0f1881 100644 --- a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp +++ b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.cpp @@ -64,7 +64,7 @@ AutotoolsBuildConfiguration::AutotoolsBuildConfiguration(Target *parent, Core::I setBuildDirectory(Utils::FileName::fromString("/")); } -void AutotoolsBuildConfiguration::initialize(const BuildInfo *info) +void AutotoolsBuildConfiguration::initialize(const BuildInfo &info) { BuildConfiguration::initialize(info); @@ -114,30 +114,27 @@ AutotoolsBuildConfigurationFactory::AutotoolsBuildConfigurationFactory() setSupportedProjectMimeTypeName(Constants::MAKEFILE_MIMETYPE); } -QList AutotoolsBuildConfigurationFactory::availableBuilds(const Target *parent) const +QList AutotoolsBuildConfigurationFactory::availableBuilds(const Target *parent) const { return {createBuildInfo(parent->kit(), parent->project()->projectDirectory())}; } -QList AutotoolsBuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const +QList AutotoolsBuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const { - QList result; - BuildInfo *info = createBuildInfo(k, - Utils::FileName::fromString(AutotoolsProject::defaultBuildDirectory(projectPath))); + BuildInfo info = createBuildInfo(k, + Utils::FileName::fromString(AutotoolsProject::defaultBuildDirectory(projectPath))); //: The name of the build configuration created by default for a autotools project. - info->displayName = tr("Default"); - result << info; - return result; + info.displayName = tr("Default"); + return {info}; } -BuildInfo *AutotoolsBuildConfigurationFactory::createBuildInfo(const Kit *k, - const Utils::FileName &buildDir) const +BuildInfo AutotoolsBuildConfigurationFactory::createBuildInfo(const Kit *k, + const Utils::FileName &buildDir) const { - auto info = new BuildInfo(this); - info->typeName = tr("Build"); - info->buildDirectory = buildDir; - info->kitId = k->id(); - + BuildInfo info(this); + info.typeName = tr("Build"); + info.buildDirectory = buildDir; + info.kitId = k->id(); return info; } diff --git a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h index 2c88c26b71a..2cd784c235e 100644 --- a/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h +++ b/src/plugins/autotoolsprojectmanager/autotoolsbuildconfiguration.h @@ -41,7 +41,7 @@ class AutotoolsBuildConfiguration : public ProjectExplorer::BuildConfiguration friend class ProjectExplorer::BuildConfigurationFactory; AutotoolsBuildConfiguration(ProjectExplorer::Target *parent, Core::Id id); - void initialize(const ProjectExplorer::BuildInfo *info) override; + void initialize(const ProjectExplorer::BuildInfo &info) override; ProjectExplorer::NamedWidget *createConfigWidget() override; BuildType buildType() const override; }; @@ -54,11 +54,11 @@ public: AutotoolsBuildConfigurationFactory(); private: - QList availableBuilds(const ProjectExplorer::Target *parent) const override; - QList availableSetups(const ProjectExplorer::Kit *k, - const QString &projectPath) const override; + QList availableBuilds(const ProjectExplorer::Target *parent) const override; + QList availableSetups(const ProjectExplorer::Kit *k, + const QString &projectPath) const override; - ProjectExplorer::BuildInfo *createBuildInfo(const ProjectExplorer::Kit *k, const Utils::FileName &buildDir) const; + ProjectExplorer::BuildInfo createBuildInfo(const ProjectExplorer::Kit *k, const Utils::FileName &buildDir) const; }; } // namespace Internal diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index 66d3ba5fbeb..565b6b80c3d 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -26,8 +26,8 @@ #include "cmakebuildconfiguration.h" #include "builddirmanager.h" -#include "cmakebuildinfo.h" #include "cmakebuildstep.h" +#include "cmakeconfigitem.h" #include "cmakekitinformation.h" #include "cmakeproject.h" #include "cmakeprojectconstants.h" @@ -37,6 +37,7 @@ #include +#include #include #include #include @@ -54,6 +55,20 @@ using namespace ProjectExplorer; using namespace Utils; +namespace CMakeProjectManager { + +class CMakeExtraBuildInfo +{ +public: + QString sourceDirectory; + CMakeConfig configuration; +}; + +} // namespace CMakeProjectManager + +Q_DECLARE_METATYPE(CMakeProjectManager::CMakeExtraBuildInfo) + + namespace CMakeProjectManager { namespace Internal { @@ -70,7 +85,7 @@ CMakeBuildConfiguration::CMakeBuildConfiguration(Target *parent, Core::Id id) connect(project, &Project::parsingFinished, this, &BuildConfiguration::enabledChanged); } -void CMakeBuildConfiguration::initialize(const BuildInfo *info) +void CMakeBuildConfiguration::initialize(const BuildInfo &info) { BuildConfiguration::initialize(info); @@ -80,13 +95,14 @@ void CMakeBuildConfiguration::initialize(const BuildInfo *info) BuildStepList *cleanSteps = stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN); cleanSteps->appendStep(new CMakeBuildStep(cleanSteps)); - if (info->buildDirectory.isEmpty()) { + if (info.buildDirectory.isEmpty()) { auto project = static_cast(target()->project()); setBuildDirectory(CMakeBuildConfiguration::shadowBuildDirectory(project->projectFilePath(), target()->kit(), - info->displayName, info->buildType)); + info.displayName, info.buildType)); } - setConfigurationForCMake(static_cast(info)->configuration); + auto extraInfo = info.extraInfo.value(); + setConfigurationForCMake(extraInfo.configuration); } bool CMakeBuildConfiguration::isEnabled() const @@ -424,74 +440,74 @@ BuildConfiguration::BuildType CMakeBuildConfigurationFactory::cmakeBuildTypeToBu return BuildConfiguration::Unknown; } -QList CMakeBuildConfigurationFactory::availableBuilds(const ProjectExplorer::Target *parent) const +QList CMakeBuildConfigurationFactory::availableBuilds(const Target *parent) const { - QList result; + QList result; for (int type = BuildTypeNone; type != BuildTypeLast; ++type) { - CMakeBuildInfo *info = createBuildInfo(parent->kit(), - parent->project()->projectDirectory().toString(), - BuildType(type)); - result << info; + result << createBuildInfo(parent->kit(), + parent->project()->projectDirectory().toString(), + BuildType(type)); } return result; } -QList CMakeBuildConfigurationFactory::availableSetups(const ProjectExplorer::Kit *k, - const QString &projectPath) const +QList CMakeBuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const { - QList result; + QList result; const FileName projectPathName = FileName::fromString(projectPath); for (int type = BuildTypeNone; type != BuildTypeLast; ++type) { - CMakeBuildInfo *info = createBuildInfo(k, - ProjectExplorer::Project::projectDirectory(projectPathName).toString(), - BuildType(type)); + BuildInfo info = createBuildInfo(k, + ProjectExplorer::Project::projectDirectory(projectPathName).toString(), + BuildType(type)); if (type == BuildTypeNone) { //: The name of the build configuration created by default for a cmake project. - info->displayName = tr("Default"); + info.displayName = tr("Default"); } else { - info->displayName = info->typeName; + info.displayName = info.typeName; } - info->buildDirectory + info.buildDirectory = CMakeBuildConfiguration::shadowBuildDirectory(projectPathName, k, - info->displayName, info->buildType); + info.displayName, info.buildType); result << info; } return result; } -CMakeBuildInfo *CMakeBuildConfigurationFactory::createBuildInfo(const ProjectExplorer::Kit *k, - const QString &sourceDir, - BuildType buildType) const +BuildInfo CMakeBuildConfigurationFactory::createBuildInfo(const Kit *k, + const QString &sourceDir, + BuildType buildType) const { - auto info = new CMakeBuildInfo(this); - info->kitId = k->id(); - info->sourceDirectory = sourceDir; + BuildInfo info(this); + info.kitId = k->id(); + + CMakeExtraBuildInfo extra; + extra.sourceDirectory = sourceDir; CMakeConfigItem buildTypeItem; switch (buildType) { case BuildTypeNone: - info->typeName = tr("Build"); + info.typeName = tr("Build"); break; case BuildTypeDebug: buildTypeItem = {CMakeConfigItem("CMAKE_BUILD_TYPE", "Debug")}; - info->typeName = tr("Debug"); - info->buildType = BuildConfiguration::Debug; + info.typeName = tr("Debug"); + info.buildType = BuildConfiguration::Debug; break; case BuildTypeRelease: buildTypeItem = {CMakeConfigItem("CMAKE_BUILD_TYPE", "Release")}; - info->typeName = tr("Release"); - info->buildType = BuildConfiguration::Release; + info.typeName = tr("Release"); + info.buildType = BuildConfiguration::Release; break; case BuildTypeMinSizeRel: buildTypeItem = {CMakeConfigItem("CMAKE_BUILD_TYPE", "MinSizeRel")}; - info->typeName = tr("Minimum Size Release"); - info->buildType = BuildConfiguration::Release; + info.typeName = tr("Minimum Size Release"); + info.buildType = BuildConfiguration::Release; break; case BuildTypeRelWithDebInfo: buildTypeItem = {CMakeConfigItem("CMAKE_BUILD_TYPE", "RelWithDebInfo")}; - info->typeName = tr("Release with Debug Information"); - info->buildType = BuildConfiguration::Profile; + info.typeName = tr("Release with Debug Information"); + info.buildType = BuildConfiguration::Profile; break; default: QTC_CHECK(false); @@ -499,19 +515,20 @@ CMakeBuildInfo *CMakeBuildConfigurationFactory::createBuildInfo(const ProjectExp } if (!buildTypeItem.isNull()) - info->configuration.append(buildTypeItem); + extra.configuration.append(buildTypeItem); const QString sysRoot = SysRootKitInformation::sysRoot(k).toString(); if (!sysRoot.isEmpty()) { - info->configuration.append(CMakeConfigItem("CMAKE_SYSROOT", sysRoot.toUtf8())); + extra.configuration.append(CMakeConfigItem("CMAKE_SYSROOT", sysRoot.toUtf8())); ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainKitInformation::toolChain( k, ProjectExplorer::Constants::CXX_LANGUAGE_ID); if (tc) { const QByteArray targetTriple = tc->originalTargetTriple().toUtf8(); - info->configuration.append(CMakeConfigItem("CMAKE_C_COMPILER_TARGET", targetTriple)); - info->configuration.append(CMakeConfigItem("CMAKE_CXX_COMPILER_TARGET ", targetTriple)); + extra.configuration.append(CMakeConfigItem("CMAKE_C_COMPILER_TARGET", targetTriple)); + extra.configuration.append(CMakeConfigItem("CMAKE_CXX_COMPILER_TARGET ", targetTriple)); } } + info.extraInfo = QVariant::fromValue(extra); return info; } diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h index d093d4474e3..587666b0bf7 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h @@ -36,7 +36,7 @@ #include namespace CMakeProjectManager { -class CMakeBuildInfo; +class CMakeExtraBuildInfo; class CMakeProject; namespace Internal { @@ -83,7 +83,7 @@ private: QVariantMap toMap() const override; BuildType buildType() const override; - void initialize(const ProjectExplorer::BuildInfo *info) override; + void initialize(const ProjectExplorer::BuildInfo &info) override; QString disabledReason() const override; ProjectExplorer::NamedWidget *createConfigWidget() override; @@ -133,14 +133,14 @@ public: static BuildType buildTypeFromByteArray(const QByteArray &in); static ProjectExplorer::BuildConfiguration::BuildType cmakeBuildTypeToBuildType(const BuildType &in); - QList availableBuilds(const ProjectExplorer::Target *parent) const override; - QList availableSetups(const ProjectExplorer::Kit *k, - const QString &projectPath) const override; + QList availableBuilds(const ProjectExplorer::Target *parent) const override; + QList availableSetups(const ProjectExplorer::Kit *k, + const QString &projectPath) const override; private: - CMakeBuildInfo *createBuildInfo(const ProjectExplorer::Kit *k, - const QString &sourceDir, - BuildType buildType) const; + ProjectExplorer::BuildInfo createBuildInfo(const ProjectExplorer::Kit *k, + const QString &sourceDir, + BuildType buildType) const; friend class CMakeProjectImporter; }; diff --git a/src/plugins/cmakeprojectmanager/cmakebuildinfo.h b/src/plugins/cmakeprojectmanager/cmakebuildinfo.h deleted file mode 100644 index fed92439d50..00000000000 --- a/src/plugins/cmakeprojectmanager/cmakebuildinfo.h +++ /dev/null @@ -1,72 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#pragma once - -#include "cmakebuildconfiguration.h" -#include "cmakeconfigitem.h" - -#include -#include -#include -#include -#include -#include - -namespace CMakeProjectManager { - -class CMakeBuildInfo : public ProjectExplorer::BuildInfo -{ -public: - CMakeBuildInfo(const ProjectExplorer::BuildConfigurationFactory *f) : ProjectExplorer::BuildInfo(f) - { } - - CMakeBuildInfo(const Internal::CMakeBuildConfiguration *bc) : - ProjectExplorer::BuildInfo(ProjectExplorer::BuildConfigurationFactory::find(bc->target())) - { - displayName = bc->displayName(); - buildDirectory = bc->buildDirectory(); - kitId = bc->target()->kit()->id(); - - QTC_ASSERT(bc->target()->project(), return); - sourceDirectory = bc->target()->project()->projectDirectory().toString(); - configuration = bc->configurationForCMake(); - } - - bool operator==(const BuildInfo &o) const final - { - if (!ProjectExplorer::BuildInfo::operator==(o)) - return false; - - auto other = static_cast(&o); - return sourceDirectory == other->sourceDirectory - && configuration == other->configuration; - } - - QString sourceDirectory; - CMakeConfig configuration; -}; - -} // namespace CMakeProjectManager diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp index 68836b6b561..7a83f082f87 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.cpp @@ -27,10 +27,10 @@ #include "builddirmanager.h" #include "cmakebuildconfiguration.h" -#include "cmakebuildinfo.h" #include "cmakekitinformation.h" #include "cmaketoolmanager.h" +#include #include #include #include @@ -347,9 +347,9 @@ Kit *CMakeProjectImporter::createKit(void *directoryData) const }); } -QList CMakeProjectImporter::buildInfoListForKit(const Kit *k, void *directoryData) const +const QList CMakeProjectImporter::buildInfoListForKit(const Kit *k, void *directoryData) const { - QList result; + QList result; auto data = static_cast(directoryData); auto factory = qobject_cast( BuildConfigurationFactory::find(k, projectFilePath().toString())); @@ -357,21 +357,20 @@ QList CMakeProjectImporter::buildInfoListForKit(const Kit *k, void return result; // create info: - std::unique_ptr - info(factory->createBuildInfo(k, projectDirectory().toString(), - CMakeBuildConfigurationFactory::buildTypeFromByteArray(data->cmakeBuildType))); - info->buildDirectory = data->buildDirectory; - info->displayName = info->typeName; + BuildInfo info = factory->createBuildInfo(k, projectDirectory().toString(), + CMakeBuildConfigurationFactory::buildTypeFromByteArray(data->cmakeBuildType)); + info.buildDirectory = data->buildDirectory; + info.displayName = info.typeName; bool found = false; - foreach (BuildInfo *bInfo, result) { - if (*static_cast(bInfo) == *info) { + foreach (BuildInfo bInfo, result) { + if (bInfo == info) { found = true; break; } } if (!found) - result << info.release(); + result << info; qCDebug(cmInputLog()) << "BuildInfo configured."; diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.h b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.h index f2cfa620e0b..c86fe77041d 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectimporter.h +++ b/src/plugins/cmakeprojectmanager/cmakeprojectimporter.h @@ -44,8 +44,8 @@ private: QList examineDirectory(const Utils::FileName &importPath) const final; bool matchKit(void *directoryData, const ProjectExplorer::Kit *k) const final; ProjectExplorer::Kit *createKit(void *directoryData) const final; - QList buildInfoListForKit(const ProjectExplorer::Kit *k, - void *directoryData) const final; + const QList buildInfoListForKit(const ProjectExplorer::Kit *k, + void *directoryData) const final; struct CMakeToolData { bool isTemporary = false; diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro index c242998441a..641c53bb255 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro +++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro @@ -4,7 +4,6 @@ include(../../qtcreatorplugin.pri) HEADERS = builddirmanager.h \ builddirparameters.h \ builddirreader.h \ - cmakebuildinfo.h \ cmakebuildstep.h \ cmakebuildtarget.h \ cmakeconfigitem.h \ diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.qbs b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.qbs index d0ce6bebe23..cfa9b36e304 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.qbs +++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.qbs @@ -28,7 +28,6 @@ QtcPlugin { "cmake_global.h", "cmakebuildconfiguration.cpp", "cmakebuildconfiguration.h", - "cmakebuildinfo.h", "cmakebuildsettingswidget.cpp", "cmakebuildsettingswidget.h", "cmakebuildstep.cpp", diff --git a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp index f6b9ea99f56..28dfdc86bbd 100644 --- a/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp +++ b/src/plugins/genericprojectmanager/genericbuildconfiguration.cpp @@ -58,7 +58,7 @@ GenericBuildConfiguration::GenericBuildConfiguration(Target *parent, Core::Id id updateCacheAndEmitEnvironmentChanged(); } -void GenericBuildConfiguration::initialize(const BuildInfo *info) +void GenericBuildConfiguration::initialize(const BuildInfo &info) { BuildConfiguration::initialize(info); @@ -91,28 +91,26 @@ GenericBuildConfigurationFactory::GenericBuildConfigurationFactory() GenericBuildConfigurationFactory::~GenericBuildConfigurationFactory() = default; -QList GenericBuildConfigurationFactory::availableBuilds(const Target *parent) const +QList GenericBuildConfigurationFactory::availableBuilds(const Target *parent) const { return {createBuildInfo(parent->kit(), parent->project()->projectDirectory())}; } -QList GenericBuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const +QList GenericBuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const { - QList result; - BuildInfo *info = createBuildInfo(k, Project::projectDirectory(Utils::FileName::fromString(projectPath))); + BuildInfo info = createBuildInfo(k, Project::projectDirectory(Utils::FileName::fromString(projectPath))); //: The name of the build configuration created by default for a generic project. - info->displayName = tr("Default"); - result << info; - return result; + info.displayName = tr("Default"); + return {info}; } -BuildInfo *GenericBuildConfigurationFactory::createBuildInfo(const Kit *k, - const Utils::FileName &buildDir) const +BuildInfo GenericBuildConfigurationFactory::createBuildInfo(const Kit *k, + const Utils::FileName &buildDir) const { - auto info = new BuildInfo(this); - info->typeName = tr("Build"); - info->buildDirectory = buildDir; - info->kitId = k->id(); + BuildInfo info(this); + info.typeName = tr("Build"); + info.buildDirectory = buildDir; + info.kitId = k->id(); return info; } diff --git a/src/plugins/genericprojectmanager/genericbuildconfiguration.h b/src/plugins/genericprojectmanager/genericbuildconfiguration.h index f0ff7a0d35f..e4d2e3e65af 100644 --- a/src/plugins/genericprojectmanager/genericbuildconfiguration.h +++ b/src/plugins/genericprojectmanager/genericbuildconfiguration.h @@ -43,7 +43,7 @@ class GenericBuildConfiguration : public ProjectExplorer::BuildConfiguration friend class ProjectExplorer::BuildConfigurationFactory; GenericBuildConfiguration(ProjectExplorer::Target *parent, Core::Id id); - void initialize(const ProjectExplorer::BuildInfo *info) override; + void initialize(const ProjectExplorer::BuildInfo &info) override; ProjectExplorer::NamedWidget *createConfigWidget() override; BuildType buildType() const override; void addToEnvironment(Utils::Environment &env) const final; @@ -58,11 +58,11 @@ public: ~GenericBuildConfigurationFactory() override; private: - QList availableBuilds(const ProjectExplorer::Target *parent) const override; - QList availableSetups(const ProjectExplorer::Kit *k, - const QString &projectPath) const override; + QList availableBuilds(const ProjectExplorer::Target *parent) const override; + QList availableSetups(const ProjectExplorer::Kit *k, + const QString &projectPath) const override; - ProjectExplorer::BuildInfo *createBuildInfo(const ProjectExplorer::Kit *k, const Utils::FileName &buildDir) const; + ProjectExplorer::BuildInfo createBuildInfo(const ProjectExplorer::Kit *k, const Utils::FileName &buildDir) const; }; class GenericBuildSettingsWidget : public ProjectExplorer::NamedWidget diff --git a/src/plugins/nim/project/nimbuildconfiguration.cpp b/src/plugins/nim/project/nimbuildconfiguration.cpp index 3aa94c6b177..46acf4881b3 100644 --- a/src/plugins/nim/project/nimbuildconfiguration.cpp +++ b/src/plugins/nim/project/nimbuildconfiguration.cpp @@ -75,7 +75,7 @@ NimBuildConfiguration::NimBuildConfiguration(Target *target, Core::Id id) { } -void NimBuildConfiguration::initialize(const BuildInfo *info) +void NimBuildConfiguration::initialize(const BuildInfo &info) { BuildConfiguration::initialize(info); @@ -85,15 +85,15 @@ void NimBuildConfiguration::initialize(const BuildInfo *info) // Create the build configuration and initialize it from build info setBuildDirectory(defaultBuildDirectory(target()->kit(), project->projectFilePath().toString(), - info->displayName, - info->buildType)); + info.displayName, + info.buildType)); // Add nim compiler build step { BuildStepList *buildSteps = stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); auto nimCompilerBuildStep = new NimCompilerBuildStep(buildSteps); NimCompilerBuildStep::DefaultBuildOptions defaultOption; - switch (info->buildType) { + switch (info.buildType) { case BuildConfiguration::Release: defaultOption = NimCompilerBuildStep::DefaultBuildOptions::Release; break; @@ -181,32 +181,32 @@ NimBuildConfigurationFactory::NimBuildConfigurationFactory() setSupportedProjectMimeTypeName(Constants::C_NIM_PROJECT_MIMETYPE); } -QList NimBuildConfigurationFactory::availableBuilds(const Target *parent) const +QList NimBuildConfigurationFactory::availableBuilds(const Target *parent) const { - QList result; + QList result; for (auto buildType : {BuildConfiguration::Debug, BuildConfiguration::Release}) result.push_back(createBuildInfo(parent->kit(), buildType)); return result; } -QList NimBuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const +QList NimBuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const { - QList result; + QList result; for (auto buildType : {BuildConfiguration::Debug, BuildConfiguration::Release}) { - BuildInfo *info = createBuildInfo(k, buildType); - info->displayName = info->typeName; - info->buildDirectory = defaultBuildDirectory(k, projectPath, info->typeName, buildType); + BuildInfo info = createBuildInfo(k, buildType); + info.displayName = info.typeName; + info.buildDirectory = defaultBuildDirectory(k, projectPath, info.typeName, buildType); result.push_back(info); } return result; } -BuildInfo *NimBuildConfigurationFactory::createBuildInfo(const Kit *k, BuildConfiguration::BuildType buildType) const +BuildInfo NimBuildConfigurationFactory::createBuildInfo(const Kit *k, BuildConfiguration::BuildType buildType) const { - auto info = new BuildInfo(this); - info->buildType = buildType; - info->kitId = k->id(); - info->typeName = displayName(buildType); + BuildInfo info(this); + info.buildType = buildType; + info.kitId = k->id(); + info.typeName = displayName(buildType); return info; } diff --git a/src/plugins/nim/project/nimbuildconfiguration.h b/src/plugins/nim/project/nimbuildconfiguration.h index ef90c69839a..90175647ead 100644 --- a/src/plugins/nim/project/nimbuildconfiguration.h +++ b/src/plugins/nim/project/nimbuildconfiguration.h @@ -39,7 +39,7 @@ class NimBuildConfiguration : public ProjectExplorer::BuildConfiguration friend class ProjectExplorer::BuildConfigurationFactory; NimBuildConfiguration(ProjectExplorer::Target *target, Core::Id id); - void initialize(const ProjectExplorer::BuildInfo *info) override; + void initialize(const ProjectExplorer::BuildInfo &info) override; ProjectExplorer::NamedWidget *createConfigWidget() override; ProjectExplorer::BuildConfiguration::BuildType buildType() const override; @@ -67,13 +67,13 @@ public: NimBuildConfigurationFactory(); private: - QList availableBuilds(const ProjectExplorer::Target *parent) const override; + QList availableBuilds(const ProjectExplorer::Target *parent) const override; - QList availableSetups(const ProjectExplorer::Kit *k, - const QString &projectPath) const override; + QList availableSetups(const ProjectExplorer::Kit *k, + const QString &projectPath) const override; - ProjectExplorer::BuildInfo *createBuildInfo(const ProjectExplorer::Kit *k, - ProjectExplorer::BuildConfiguration::BuildType buildType) const; + ProjectExplorer::BuildInfo createBuildInfo(const ProjectExplorer::Kit *k, + ProjectExplorer::BuildConfiguration::BuildType buildType) const; QString displayName(ProjectExplorer::BuildConfiguration::BuildType buildType) const; }; diff --git a/src/plugins/projectexplorer/buildconfiguration.cpp b/src/plugins/projectexplorer/buildconfiguration.cpp index d44c92bb0f6..8828f36f644 100644 --- a/src/plugins/projectexplorer/buildconfiguration.cpp +++ b/src/plugins/projectexplorer/buildconfiguration.cpp @@ -103,11 +103,11 @@ void BuildConfiguration::setBuildDirectory(const Utils::FileName &dir) emitBuildDirectoryChanged(); } -void BuildConfiguration::initialize(const BuildInfo *info) +void BuildConfiguration::initialize(const BuildInfo &info) { - setDisplayName(info->displayName); - setDefaultDisplayName(info->displayName); - setBuildDirectory(info->buildDirectory); + setDisplayName(info.displayName); + setDefaultDisplayName(info.displayName); + setBuildDirectory(info.buildDirectory); m_stepLists.append(new BuildStepList(this, Constants::BUILDSTEPS_BUILD)); m_stepLists.append(new BuildStepList(this, Constants::BUILDSTEPS_CLEAN)); @@ -338,6 +338,24 @@ int BuildConfigurationFactory::priority(const Target *parent) const return canHandle(parent) ? m_basePriority : -1; } +const QList BuildConfigurationFactory::reportIssues(ProjectExplorer::Kit *kit, const QString &projectPath, + const QString &buildDir) const +{ + if (m_issueReporter) + return m_issueReporter(kit, projectPath, buildDir); + return {}; +} + +const QList BuildConfigurationFactory::allAvailableBuilds(const Target *parent) const +{ + return availableBuilds(parent); +} + +const QList BuildConfigurationFactory::allAvailableSetups(const Kit *k, const QString &projectPath) const +{ + return availableSetups(k, projectPath); +} + bool BuildConfigurationFactory::supportsTargetDeviceType(Core::Id id) const { if (m_supportedTargetDeviceTypes.isEmpty()) @@ -419,7 +437,12 @@ bool BuildConfigurationFactory::canHandle(const Target *target) const return true; } -BuildConfiguration *BuildConfigurationFactory::create(Target *parent, const BuildInfo *info) const +void BuildConfigurationFactory::setIssueReporter(const IssueReporter &issueReporter) +{ + m_issueReporter = issueReporter; +} + +BuildConfiguration *BuildConfigurationFactory::create(Target *parent, const BuildInfo &info) const { if (!canHandle(parent)) return nullptr; diff --git a/src/plugins/projectexplorer/buildconfiguration.h b/src/plugins/projectexplorer/buildconfiguration.h index 1c2961c7737..f71e895a230 100644 --- a/src/plugins/projectexplorer/buildconfiguration.h +++ b/src/plugins/projectexplorer/buildconfiguration.h @@ -39,6 +39,7 @@ class BuildStepList; class Node; class Kit; class Target; +class Task; class IOutputParser; class PROJECTEXPLORER_EXPORT BuildConfiguration : public ProjectConfiguration @@ -105,7 +106,7 @@ signals: void buildTypeChanged(); protected: - virtual void initialize(const BuildInfo *info); + virtual void initialize(const BuildInfo &info); private: void emitBuildDirectoryChanged(); @@ -133,13 +134,13 @@ public: virtual int priority(const Target *parent) const; // List of build information that can be used to create a new build configuration via // "Add Build Configuration" button. - virtual QList availableBuilds(const Target *parent) const = 0; + const QList allAvailableBuilds(const Target *parent) const; virtual int priority(const Kit *k, const QString &projectPath) const; // List of build information that can be used to initially set up a new build configuration. - virtual QList availableSetups(const Kit *k, const QString &projectPath) const = 0; + const QList allAvailableSetups(const Kit *k, const QString &projectPath) const; - BuildConfiguration *create(Target *parent, const BuildInfo *info) const; + BuildConfiguration *create(Target *parent, const BuildInfo &info) const; static BuildConfiguration *restore(Target *parent, const QVariantMap &map); static BuildConfiguration *clone(Target *parent, const BuildConfiguration *source); @@ -147,7 +148,15 @@ public: static BuildConfigurationFactory *find(const Kit *k, const QString &projectPath); static BuildConfigurationFactory *find(Target *parent); + using IssueReporter = std::function(Kit *, const QString &, const QString &)>; + void setIssueReporter(const IssueReporter &issueReporter); + const QList reportIssues(ProjectExplorer::Kit *kit, + const QString &projectPath, const QString &buildDir) const; + protected: + virtual QList availableBuilds(const Target *parent) const = 0; + virtual QList availableSetups(const Kit *k, const QString &projectPath) const = 0; + bool supportsTargetDeviceType(Core::Id id) const; void setSupportedProjectType(Core::Id id); void setSupportedProjectMimeTypeName(const QString &mimeTypeName); @@ -173,6 +182,8 @@ private: Core::Id m_supportedProjectType; QList m_supportedTargetDeviceTypes; QString m_supportedProjectMimeTypeName; + IssueReporter m_issueReporter; + int m_basePriority = 0; // Use higher numbers (1, 2, ...) for higher priorities. }; diff --git a/src/plugins/projectexplorer/buildinfo.cpp b/src/plugins/projectexplorer/buildinfo.cpp index 67dca0e2802..5afaf27791f 100644 --- a/src/plugins/projectexplorer/buildinfo.cpp +++ b/src/plugins/projectexplorer/buildinfo.cpp @@ -27,4 +27,5 @@ using namespace ProjectExplorer; -BuildInfo::~BuildInfo() = default; + + diff --git a/src/plugins/projectexplorer/buildinfo.h b/src/plugins/projectexplorer/buildinfo.h index 6eed9c22777..e135959352e 100644 --- a/src/plugins/projectexplorer/buildinfo.h +++ b/src/plugins/projectexplorer/buildinfo.h @@ -37,11 +37,10 @@ namespace ProjectExplorer { class BuildConfigurationFactory; -class PROJECTEXPLORER_EXPORT BuildInfo +class PROJECTEXPLORER_EXPORT BuildInfo final { public: - BuildInfo(const BuildConfigurationFactory *f) : m_factory(f) { } - virtual ~BuildInfo(); + BuildInfo(const BuildConfigurationFactory *f = nullptr) : m_factory(f) { } const BuildConfigurationFactory *factory() const { return m_factory; } @@ -51,26 +50,16 @@ public: Core::Id kitId; BuildConfiguration::BuildType buildType = BuildConfiguration::Unknown; - virtual bool operator==(const BuildInfo &o) const + QVariant extraInfo; + const BuildConfigurationFactory *m_factory = nullptr; + + bool operator==(const BuildInfo &o) const { return m_factory == o.m_factory && displayName == o.displayName && typeName == o.typeName && buildDirectory == o.buildDirectory && kitId == o.kitId && buildType == o.buildType; } - - virtual QList reportIssues(const QString &projectPath, - const QString &buildDir) const - { - Q_UNUSED(projectPath); - Q_UNUSED(buildDir); - return QList(); - } - -private: - const BuildConfigurationFactory *m_factory; - - friend class BuildConfigurationFactory; }; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/buildsettingspropertiespage.cpp b/src/plugins/projectexplorer/buildsettingspropertiespage.cpp index 715ae977d7b..772740abd21 100644 --- a/src/plugins/projectexplorer/buildsettingspropertiespage.cpp +++ b/src/plugins/projectexplorer/buildsettingspropertiespage.cpp @@ -57,7 +57,6 @@ using namespace ProjectExplorer::Internal; BuildSettingsWidget::~BuildSettingsWidget() { clearWidgets(); - qDeleteAll(m_buildInfoList); } BuildSettingsWidget::BuildSettingsWidget(Target *target) : @@ -176,16 +175,13 @@ QList BuildSettingsWidget::subWidgets() const void BuildSettingsWidget::updateAddButtonMenu() { m_addButtonMenu->clear(); - qDeleteAll(m_buildInfoList); - m_buildInfoList.clear(); if (m_target) { BuildConfigurationFactory *factory = BuildConfigurationFactory::find(m_target); if (!factory) return; - m_buildInfoList = factory->availableBuilds(m_target); - foreach (BuildInfo *info, m_buildInfoList) { - QAction *action = m_addButtonMenu->addAction(info->typeName); + for (const BuildInfo &info : factory->allAvailableBuilds(m_target)) { + QAction *action = m_addButtonMenu->addAction(info.typeName); connect(action, &QAction::triggered, this, [this, info] { createConfiguration(info); }); @@ -239,28 +235,26 @@ void BuildSettingsWidget::updateActiveConfiguration() updateBuildSettings(); } -void BuildSettingsWidget::createConfiguration(BuildInfo *info) +void BuildSettingsWidget::createConfiguration(const BuildInfo &info_) { - QString originalDisplayName = info->displayName; - - if (info->displayName.isEmpty()) { + BuildInfo info = info_; + if (info.displayName.isEmpty()) { bool ok = false; - info->displayName = QInputDialog::getText(Core::ICore::mainWindow(), + info.displayName = QInputDialog::getText(Core::ICore::mainWindow(), tr("New Configuration"), tr("New configuration name:"), QLineEdit::Normal, QString(), &ok).trimmed(); - if (!ok || info->displayName.isEmpty()) + if (!ok || info.displayName.isEmpty()) return; } - BuildConfiguration *bc = info->factory()->create(m_target, info); + BuildConfiguration *bc = info.factory()->create(m_target, info); if (!bc) return; m_target->addBuildConfiguration(bc); SessionManager::setActiveBuildConfiguration(m_target, bc, SetActive::Cascade); - info->displayName = originalDisplayName; } QString BuildSettingsWidget::uniqueName(const QString & name) diff --git a/src/plugins/projectexplorer/buildsettingspropertiespage.h b/src/plugins/projectexplorer/buildsettingspropertiespage.h index 0686d2d341d..990b43c69cf 100644 --- a/src/plugins/projectexplorer/buildsettingspropertiespage.h +++ b/src/plugins/projectexplorer/buildsettingspropertiespage.h @@ -63,7 +63,7 @@ private: void updateActiveConfiguration(); - void createConfiguration(BuildInfo *info); + void createConfiguration(const BuildInfo &info); void cloneConfiguration(); void deleteConfiguration(BuildConfiguration *toDelete); QString uniqueName(const QString &name); @@ -81,7 +81,6 @@ private: QList m_subWidgets; QList m_labels; - QList m_buildInfoList; }; } // namespace Internal diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index 1be86777d97..50cd304c9fd 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -824,11 +824,11 @@ bool Project::knowsAllBuildExecutables() const return true; } -void Project::setup(const QList &infoList) +void Project::setup(const QList &infoList) { std::vector> toRegister; - for (const BuildInfo *info : infoList) { - Kit *k = KitManager::kit(info->kitId); + for (const BuildInfo &info : infoList) { + Kit *k = KitManager::kit(info.kitId); if (!k) continue; Target *t = target(k); @@ -840,13 +840,11 @@ void Project::setup(const QList &infoList) toRegister.emplace_back(std::move(newTarget)); } - if (!info->factory()) + if (!info.factory()) continue; - BuildConfiguration *bc = info->factory()->create(t, info); - if (!bc) - continue; - t->addBuildConfiguration(bc); + if (BuildConfiguration *bc = info.factory()->create(t, info)) + t->addBuildConfiguration(bc); } for (std::unique_ptr &t : toRegister) { t->updateDefaultDeployConfigurations(); diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h index 3a7a0109332..cf9590ad68d 100644 --- a/src/plugins/projectexplorer/project.h +++ b/src/plugins/projectexplorer/project.h @@ -162,7 +162,7 @@ public: // of configuration. virtual bool knowsAllBuildExecutables() const; - void setup(const QList &infoList); + void setup(const QList &infoList); Utils::MacroExpander *macroExpander() const; virtual QVariant additionalData(Core::Id id, const Target *target) const; diff --git a/src/plugins/projectexplorer/projectimporter.cpp b/src/plugins/projectexplorer/projectimporter.cpp index 2d4489c2252..174f6a74725 100644 --- a/src/plugins/projectexplorer/projectimporter.cpp +++ b/src/plugins/projectexplorer/projectimporter.cpp @@ -84,9 +84,9 @@ ProjectImporter::~ProjectImporter() removeProject(k); } -QList ProjectImporter::import(const Utils::FileName &importPath, bool silent) +const QList ProjectImporter::import(const Utils::FileName &importPath, bool silent) { - QList result; + QList result; const QLoggingCategory log("qtc.projectexplorer.import", QtWarningMsg); qCDebug(log) << "ProjectImporter::import" << importPath << silent; @@ -124,14 +124,14 @@ QList ProjectImporter::import(const Utils::FileName &importPath, bo foreach (Kit *k, kitList) { qCDebug(log) << "Creating buildinfos for kit" << k->displayName(); - QList infoList = buildInfoListForKit(k, data); + const QList infoList = buildInfoListForKit(k, data); if (infoList.isEmpty()) { qCDebug(log) << "No build infos for kit" << k->displayName(); continue; } - foreach (BuildInfo *i, infoList) { - if (!Utils::contains(result, [i](const BuildInfo *o) { return (*i) == (*o); })) + for (const BuildInfo &i : infoList) { + if (!result.contains(i)) result += i; } } diff --git a/src/plugins/projectexplorer/projectimporter.h b/src/plugins/projectexplorer/projectimporter.h index 66f6d778314..c7df542a7a2 100644 --- a/src/plugins/projectexplorer/projectimporter.h +++ b/src/plugins/projectexplorer/projectimporter.h @@ -56,7 +56,7 @@ public: const Utils::FileName projectFilePath() const { return m_projectPath; } const Utils::FileName projectDirectory() const { return m_projectPath.parentDir(); } - virtual QList import(const Utils::FileName &importPath, bool silent = false); + virtual const QList import(const Utils::FileName &importPath, bool silent = false); virtual QStringList importCandidates() = 0; virtual Target *preferredTarget(const QList &possibleTargets); @@ -93,7 +93,7 @@ protected: // will get one of the results from examineDirectory virtual Kit *createKit(void *directoryData) const = 0; // will get one of the results from examineDirectory - virtual QList buildInfoListForKit(const Kit *k, void *directoryData) const = 0; + virtual const QList buildInfoListForKit(const Kit *k, void *directoryData) const = 0; virtual void deleteDirectoryData(void *directoryData) const = 0; diff --git a/src/plugins/projectexplorer/projectwindow.cpp b/src/plugins/projectexplorer/projectwindow.cpp index 85917bcdda7..434249bee13 100644 --- a/src/plugins/projectexplorer/projectwindow.cpp +++ b/src/plugins/projectexplorer/projectwindow.cpp @@ -550,18 +550,17 @@ public: Target *lastTarget = nullptr; BuildConfiguration *lastBc = nullptr; - const QList toImport = projectImporter->import(path, false); - for (BuildInfo *info : toImport) { - Target *target = project->target(info->kitId); + for (const BuildInfo &info : projectImporter->import(path, false)) { + Target *target = project->target(info.kitId); if (!target) { - std::unique_ptr newTarget = project->createTarget(KitManager::kit(info->kitId)); + 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()); - BuildConfiguration *bc = info->factory()->create(target, info); + BuildConfiguration *bc = info.factory()->create(target, info); QTC_ASSERT(bc, continue); target->addBuildConfiguration(bc); @@ -573,8 +572,6 @@ public: SessionManager::setActiveBuildConfiguration(lastTarget, lastBc, SetActive::Cascade); SessionManager::setActiveTarget(project, lastTarget, SetActive::Cascade); } - - qDeleteAll(toImport); } void setPanel(QWidget *panel) diff --git a/src/plugins/projectexplorer/target.cpp b/src/plugins/projectexplorer/target.cpp index f8a3efaca91..70d742e34e9 100644 --- a/src/plugins/projectexplorer/target.cpp +++ b/src/plugins/projectexplorer/target.cpp @@ -493,14 +493,10 @@ void Target::updateDefaultBuildConfigurations() qWarning("No build configuration factory found for target id '%s'.", qPrintable(id().toString())); return; } - QList infoList = bcFactory->availableSetups(this->kit(), project()->projectFilePath().toString()); - foreach (BuildInfo *info, infoList) { - BuildConfiguration *bc = bcFactory->create(this, info); - if (!bc) - continue; - addBuildConfiguration(bc); + for (const BuildInfo &info : bcFactory->allAvailableSetups(kit(), project()->projectFilePath().toString())) { + if (BuildConfiguration *bc = bcFactory->create(this, info)) + addBuildConfiguration(bc); } - qDeleteAll(infoList); } void Target::updateDefaultDeployConfigurations() diff --git a/src/plugins/projectexplorer/targetsetuppage.cpp b/src/plugins/projectexplorer/targetsetuppage.cpp index 6a6006c360c..aea75ad9932 100644 --- a/src/plugins/projectexplorer/targetsetuppage.cpp +++ b/src/plugins/projectexplorer/targetsetuppage.cpp @@ -485,19 +485,16 @@ void TargetSetupPage::import(const Utils::FileName &path, bool silent) if (!m_importer) return; - QList toImport = m_importer->import(path, silent); - foreach (BuildInfo *info, toImport) { - TargetSetupWidget *w = widget(info->kitId); + for (const BuildInfo &info : m_importer->import(path, silent)) { + TargetSetupWidget *w = widget(info.kitId); if (!w) { - Kit *k = KitManager::kit(info->kitId); + Kit *k = KitManager::kit(info.kitId); Q_ASSERT(k); addWidget(k); } - w = widget(info->kitId); - if (!w) { - delete info; + w = widget(info.kitId); + if (!w) continue; - } w->addBuildInfo(info, true); w->setKitSelected(true); @@ -552,7 +549,7 @@ TargetSetupWidget *TargetSetupPage::addWidget(Kit *k) bool TargetSetupPage::setupProject(Project *project) { - QList toSetUp; // Pointers are managed by the widgets! + QList toSetUp; for (TargetSetupWidget *widget : m_widgets) { if (!widget->isKitSelected()) continue; diff --git a/src/plugins/projectexplorer/targetsetupwidget.cpp b/src/plugins/projectexplorer/targetsetupwidget.cpp index e51ee45d0e7..88e5b4ab061 100644 --- a/src/plugins/projectexplorer/targetsetupwidget.cpp +++ b/src/plugins/projectexplorer/targetsetupwidget.cpp @@ -134,9 +134,9 @@ void TargetSetupWidget::setKitSelected(bool b) m_ignoreChange = false; } -void TargetSetupWidget::addBuildInfo(BuildInfo *info, bool isImport) +void TargetSetupWidget::addBuildInfo(const BuildInfo &info, bool isImport) { - QTC_ASSERT(info && info->kitId == m_kit->id(), return); + QTC_ASSERT(info.kitId == m_kit->id(), return); if (isImport && !m_haveImported) { // disable everything on first import @@ -156,16 +156,16 @@ void TargetSetupWidget::addBuildInfo(BuildInfo *info, bool isImport) store.isEnabled = true; ++m_selected; - if (info->factory()) { + if (info.factory()) { store.checkbox = new QCheckBox; - store.checkbox->setText(info->displayName); + store.checkbox->setText(info.displayName); store.checkbox->setChecked(store.isEnabled); store.checkbox->setAttribute(Qt::WA_LayoutUsesWidgetRect); m_newBuildsLayout->addWidget(store.checkbox, pos * 2, 0); store.pathChooser = new Utils::PathChooser(); store.pathChooser->setExpectedKind(Utils::PathChooser::Directory); - store.pathChooser->setFileName(info->buildDirectory); + store.pathChooser->setFileName(info.buildDirectory); store.pathChooser->setHistoryCompleter(QLatin1String("TargetSetup.BuildDir.History")); store.pathChooser->setReadOnly(isImport); m_newBuildsLayout->addWidget(store.pathChooser, pos * 2, 1); @@ -217,7 +217,7 @@ void TargetSetupWidget::setProjectPath(const QString &projectPath) m_projectPath = projectPath; clear(); - for (BuildInfo *info : buildInfoList(m_kit, projectPath)) + for (const BuildInfo &info : buildInfoList(m_kit, projectPath)) addBuildInfo(info, false); } @@ -226,16 +226,14 @@ void TargetSetupWidget::expandWidget() m_detailsWidget->setState(Utils::DetailsWidget::Expanded); } -QList TargetSetupWidget::buildInfoList(const Kit *k, const QString &projectPath) +const QList TargetSetupWidget::buildInfoList(const Kit *k, const QString &projectPath) { - const BuildConfigurationFactory *const factory - = BuildConfigurationFactory::find(k, projectPath); - if (factory) - return factory->availableSetups(k, projectPath); + if (auto factory = BuildConfigurationFactory::find(k, projectPath)) + return factory->allAvailableSetups(k, projectPath); - auto *info = new BuildInfo(nullptr); - info->kitId = k->id(); - return QList({info}); + BuildInfo info(nullptr); + info.kitId = k->id(); + return {info}; } void TargetSetupWidget::handleKitUpdate(Kit *k) @@ -247,9 +245,9 @@ void TargetSetupWidget::handleKitUpdate(Kit *k) m_detailsWidget->setSummaryText(k->displayName()); } -QList TargetSetupWidget::selectedBuildInfoList() const +const QList TargetSetupWidget::selectedBuildInfoList() const { - QList result; + QList result; for (const BuildInfoStore &store : m_infoStore) { if (store.isEnabled) result.append(store.buildInfo); @@ -297,7 +295,7 @@ void TargetSetupWidget::pathChanged() return store.pathChooser == pathChooser; }); QTC_ASSERT(it != m_infoStore.end(), return); - it->buildInfo->buildDirectory = pathChooser->fileName(); + it->buildInfo.buildDirectory = pathChooser->fileName(); reportIssues(static_cast(std::distance(m_infoStore.begin(), it))); } @@ -315,13 +313,15 @@ void TargetSetupWidget::reportIssues(int index) } } -QPair TargetSetupWidget::findIssues(const BuildInfo *info) +QPair TargetSetupWidget::findIssues(const BuildInfo &info) { - if (m_projectPath.isEmpty() || !info->factory()) + if (m_projectPath.isEmpty() || !info.factory()) return qMakePair(Task::Unknown, QString()); - QString buildDir = info->buildDirectory.toString(); - QList issues = info->reportIssues(m_projectPath, buildDir); + QString buildDir = info.buildDirectory.toString(); + QList issues; + if (info.factory()) + issues = info.factory()->reportIssues(m_kit, m_projectPath, buildDir); QString text; Task::TaskType highestType = Task::Unknown; @@ -347,7 +347,6 @@ QPair TargetSetupWidget::findIssues(const BuildInfo *in TargetSetupWidget::BuildInfoStore::~BuildInfoStore() { - delete buildInfo; delete checkbox; delete label; delete issuesLabel; diff --git a/src/plugins/projectexplorer/targetsetupwidget.h b/src/plugins/projectexplorer/targetsetupwidget.h index 37663343f9d..62dca1af521 100644 --- a/src/plugins/projectexplorer/targetsetupwidget.h +++ b/src/plugins/projectexplorer/targetsetupwidget.h @@ -66,9 +66,9 @@ public: bool isKitSelected() const; void setKitSelected(bool b); - void addBuildInfo(BuildInfo *info, bool isImport); + void addBuildInfo(const BuildInfo &info, bool isImport); - QList selectedBuildInfoList() const; + const QList selectedBuildInfoList() const; void setProjectPath(const QString &projectPath); void expandWidget(); @@ -76,7 +76,7 @@ signals: void selectedToggled() const; private: - static QList buildInfoList(const Kit *k, const QString &projectPath); + static const QList buildInfoList(const Kit *k, const QString &projectPath); void handleKitUpdate(ProjectExplorer::Kit *k); @@ -86,7 +86,7 @@ private: void manageKit(); void reportIssues(int index); - QPair findIssues(const BuildInfo *info); + QPair findIssues(const BuildInfo &info); void clear(); Kit *m_kit; @@ -104,7 +104,7 @@ private: BuildInfoStore &operator=(const BuildInfoStore &other) = delete; BuildInfoStore &operator=(BuildInfoStore &&other) = delete; - BuildInfo *buildInfo = nullptr; + BuildInfo buildInfo; QCheckBox *checkbox = nullptr; QLabel *label = nullptr; QLabel *issuesLabel = nullptr; diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp index e7874737d8d..1d464039f54 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp +++ b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp @@ -26,7 +26,6 @@ #include "qbsbuildconfiguration.h" #include "qbsbuildconfigurationwidget.h" -#include "qbsbuildinfo.h" #include "qbsbuildstep.h" #include "qbscleanstep.h" #include "qbsinstallstep.h" @@ -36,7 +35,8 @@ #include #include -#include + +#include #include #include #include @@ -46,7 +46,11 @@ #include #include #include + +#include + #include +#include #include #include @@ -82,21 +86,20 @@ QbsBuildConfiguration::QbsBuildConfiguration(Target *target, Core::Id id) connect(project(), &Project::parsingFinished, this, &BuildConfiguration::enabledChanged); } -void QbsBuildConfiguration::initialize(const BuildInfo *info) +void QbsBuildConfiguration::initialize(const BuildInfo &info) { BuildConfiguration::initialize(info); - const auto * const bi = static_cast(info); - QVariantMap configData = bi->config; + QVariantMap configData = info.extraInfo.value(); configData.insert(QLatin1String(Constants::QBS_CONFIG_VARIANT_KEY), - (info->buildType == BuildConfiguration::Debug) + (info.buildType == BuildConfiguration::Debug) ? QLatin1String(Constants::QBS_VARIANT_DEBUG) : QLatin1String(Constants::QBS_VARIANT_RELEASE)); - Utils::FileName buildDir = info->buildDirectory; + Utils::FileName buildDir = info.buildDirectory; if (buildDir.isEmpty()) buildDir = defaultBuildDirectory(target()->project()->projectFilePath().toString(), - target()->kit(), info->displayName, info->buildType); + target()->kit(), info.displayName, info.buildType); setBuildDirectory(buildDir); // Add the build configuration. @@ -104,13 +107,13 @@ void QbsBuildConfiguration::initialize(const BuildInfo *info) QString configName = bd.take("configName").toString(); if (configName.isEmpty()) { configName = "qtc_" + target()->kit()->fileSystemFriendlyName() + '_' - + Utils::FileUtils::fileSystemFriendlyName(info->displayName); + + Utils::FileUtils::fileSystemFriendlyName(info.displayName); } setConfigurationName(configName); BuildStepList *buildSteps = stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); auto bs = new QbsBuildStep(buildSteps); - if (info->buildType == Release) + if (info.buildType == Release) bs->setQmlDebuggingEnabled(false); bs->setQbsConfiguration(bd); buildSteps->appendStep(bs); @@ -401,44 +404,51 @@ QbsBuildConfigurationFactory::QbsBuildConfigurationFactory() registerBuildConfiguration(Constants::QBS_BC_ID); setSupportedProjectType(Constants::PROJECT_ID); setSupportedProjectMimeTypeName(Constants::MIME_TYPE); + setIssueReporter([](Kit *k, const QString &projectPath, const QString &buildDir) -> QList { + const QtSupport::BaseQtVersion * const version = QtSupport::QtKitInformation::qtVersion(k); + return version ? version->reportIssues(projectPath, buildDir) + : QList(); + }); } -BuildInfo *QbsBuildConfigurationFactory::createBuildInfo(const Kit *k, - BuildConfiguration::BuildType type) const +BuildInfo QbsBuildConfigurationFactory::createBuildInfo(const Kit *k, + BuildConfiguration::BuildType type) const { - auto info = new QbsBuildInfo(this); - info->typeName = tr("Build"); - info->kitId = k->id(); - info->buildType = type; - info->config.insert("configName", type == BuildConfiguration::Debug ? "Debug" : "Release"); + BuildInfo info(this); + info.kitId = k->id(); + info.buildType = type; + info.typeName = tr("Build"); + QVariantMap config; + config.insert("configName", type == BuildConfiguration::Debug ? "Debug" : "Release"); + info.extraInfo = config; return info; } -QList QbsBuildConfigurationFactory::availableBuilds(const Target *parent) const +QList QbsBuildConfigurationFactory::availableBuilds(const Target *parent) const { return {createBuildInfo(parent->kit(), BuildConfiguration::Debug)}; } -QList QbsBuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const +QList QbsBuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const { - QList result; + QList result; - BuildInfo *info = createBuildInfo(k, BuildConfiguration::Debug); + BuildInfo info = createBuildInfo(k, BuildConfiguration::Debug); //: The name of the debug build configuration created by default for a qbs project. - info->displayName = tr("Debug"); + info.displayName = tr("Debug"); //: Non-ASCII characters in directory suffix may cause build issues. - info->buildDirectory + info.buildDirectory = defaultBuildDirectory(projectPath, k, tr("Debug", "Shadow build directory suffix"), - info->buildType); + info.buildType); result << info; info = createBuildInfo(k, BuildConfiguration::Release); //: The name of the release build configuration created by default for a qbs project. - info->displayName = tr("Release"); + info.displayName = tr("Release"); //: Non-ASCII characters in directory suffix may cause build issues. - info->buildDirectory + info.buildDirectory = defaultBuildDirectory(projectPath, k, tr("Release", "Shadow build directory suffix"), - info->buildType); + info.buildType); result << info; return result; diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h index f5a48d3b05b..19c29ac33fc 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h +++ b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.h @@ -49,7 +49,7 @@ class QbsBuildConfiguration : public ProjectExplorer::BuildConfiguration QbsBuildConfiguration(ProjectExplorer::Target *target, Core::Id id); public: - void initialize(const ProjectExplorer::BuildInfo *info) override; + void initialize(const ProjectExplorer::BuildInfo &info) override; ProjectExplorer::NamedWidget *createConfigWidget() override; QbsBuildStep *qbsStep() const; @@ -104,12 +104,12 @@ class QbsBuildConfigurationFactory : public ProjectExplorer::BuildConfigurationF public: QbsBuildConfigurationFactory(); - QList availableBuilds(const ProjectExplorer::Target *parent) const override; - QList availableSetups(const ProjectExplorer::Kit *k, - const QString &projectPath) const override; + QList availableBuilds(const ProjectExplorer::Target *parent) const override; + QList availableSetups(const ProjectExplorer::Kit *k, + const QString &projectPath) const override; private: - ProjectExplorer::BuildInfo *createBuildInfo(const ProjectExplorer::Kit *k, + ProjectExplorer::BuildInfo createBuildInfo(const ProjectExplorer::Kit *k, ProjectExplorer::BuildConfiguration::BuildType type) const; }; diff --git a/src/plugins/qbsprojectmanager/qbsbuildinfo.cpp b/src/plugins/qbsprojectmanager/qbsbuildinfo.cpp deleted file mode 100644 index fec26589a3a..00000000000 --- a/src/plugins/qbsprojectmanager/qbsbuildinfo.cpp +++ /dev/null @@ -1,48 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#include "qbsbuildinfo.h" - -#include - -namespace QbsProjectManager { -namespace Internal { - -QbsBuildInfo::QbsBuildInfo(const ProjectExplorer::BuildConfigurationFactory *f) - : ProjectExplorer::BuildInfo(f) -{ -} - -QList QbsBuildInfo::reportIssues(const QString &projectPath, - const QString &buildDir) const -{ - const ProjectExplorer::Kit * const k = ProjectExplorer::KitManager::kit(kitId); - const QtSupport::BaseQtVersion * const version = QtSupport::QtKitInformation::qtVersion(k); - return version ? version->reportIssues(projectPath, buildDir) - : QList(); -} - -} // namespace Internal -} // namespace QbsProjectManager diff --git a/src/plugins/qbsprojectmanager/qbsbuildinfo.h b/src/plugins/qbsprojectmanager/qbsbuildinfo.h deleted file mode 100644 index 9e1c9cd5218..00000000000 --- a/src/plugins/qbsprojectmanager/qbsbuildinfo.h +++ /dev/null @@ -1,48 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#pragma once - -#include - -#include - -namespace QbsProjectManager { -namespace Internal { - -class QbsBuildInfo final : public ProjectExplorer::BuildInfo -{ -public: - QbsBuildInfo(const ProjectExplorer::BuildConfigurationFactory *f); - - QVariantMap config; - -private: - QList reportIssues(const QString &projectPath, - const QString &buildDir) const override; -}; - -} // namespace Internal -} // namespace QbsProjectManager diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index 93214030130..0ea82d6f405 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -686,7 +686,7 @@ QString QbsProject::uniqueProductName(const qbs::ProductData &product) void QbsProject::configureAsExampleProject(const QSet &platforms) { - QList infoList; + QList infoList; QList kits = KitManager::kits(); const auto qtVersionMatchesPlatform = [platforms](const QtSupport::BaseQtVersion *version) { return platforms.isEmpty() || platforms.intersects(version->targetDeviceTypes()); @@ -696,16 +696,10 @@ void QbsProject::configureAsExampleProject(const QSet &platforms) = QtSupport::QtKitInformation::qtVersion(k); if (!qtVersion || !qtVersionMatchesPlatform(qtVersion)) continue; - const BuildConfigurationFactory * const factory - = BuildConfigurationFactory::find(k, projectFilePath().toString()); - if (!factory) - continue; - const auto &buildInfos = factory->availableSetups(k, projectFilePath().toString()); - for (BuildInfo * const info : buildInfos) - infoList << info; + if (auto factory = BuildConfigurationFactory::find(k, projectFilePath().toString())) + infoList << factory->allAvailableSetups(k, projectFilePath().toString()); } setup(infoList); - qDeleteAll(infoList); prepareForParsing(); } diff --git a/src/plugins/qbsprojectmanager/qbsprojectimporter.cpp b/src/plugins/qbsprojectmanager/qbsprojectimporter.cpp index 77676c94059..7e3f37d0a88 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectimporter.cpp +++ b/src/plugins/qbsprojectmanager/qbsprojectimporter.cpp @@ -26,11 +26,11 @@ #include "qbsprojectimporter.h" #include "qbsbuildconfiguration.h" -#include "qbsbuildinfo.h" #include "qbspmlogging.h" #include #include +#include #include #include #include @@ -221,26 +221,26 @@ Kit *QbsProjectImporter::createKit(void *directoryData) const }); } -QList QbsProjectImporter::buildInfoListForKit(const Kit *k, void *directoryData) const +const QList QbsProjectImporter::buildInfoListForKit(const Kit *k, void *directoryData) const { qCDebug(qbsPmLog) << "creating build info for kit" << k->displayName(); - QList result; const auto factory = qobject_cast( BuildConfigurationFactory::find(k, projectFilePath().toString())); if (!factory) { qCDebug(qbsPmLog) << "no build config factory found"; - return result; + return {}; } const auto * const bgData = static_cast(directoryData); - auto * const buildInfo = new QbsBuildInfo(factory); - buildInfo->displayName = bgData->bgFilePath.toFileInfo().completeBaseName(); - buildInfo->buildType = bgData->buildVariant == "debug" + BuildInfo info(factory); + info.displayName = bgData->bgFilePath.toFileInfo().completeBaseName(); + info.buildType = bgData->buildVariant == "debug" ? BuildConfiguration::Debug : BuildConfiguration::Release; - buildInfo->kitId = k->id(); - buildInfo->buildDirectory = bgData->bgFilePath.parentDir().parentDir(); - buildInfo->config = bgData->overriddenProperties; - buildInfo->config.insert("configName", buildInfo->displayName); - return result << buildInfo; + info.kitId = k->id(); + info.buildDirectory = bgData->bgFilePath.parentDir().parentDir(); + QVariantMap config = bgData->overriddenProperties; + config.insert("configName", info.displayName); + info.extraInfo = config; + return {info}; } void QbsProjectImporter::deleteDirectoryData(void *directoryData) const diff --git a/src/plugins/qbsprojectmanager/qbsprojectimporter.h b/src/plugins/qbsprojectmanager/qbsprojectimporter.h index 2980a70834e..4aa3682a384 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectimporter.h +++ b/src/plugins/qbsprojectmanager/qbsprojectimporter.h @@ -42,8 +42,8 @@ private: QList examineDirectory(const Utils::FileName &importPath) const override; bool matchKit(void *directoryData, const ProjectExplorer::Kit *k) const override; ProjectExplorer::Kit *createKit(void *directoryData) const override; - QList buildInfoListForKit(const ProjectExplorer::Kit *k, - void *directoryData) const override; + const QList buildInfoListForKit(const ProjectExplorer::Kit *k, + void *directoryData) const override; void deleteDirectoryData(void *directoryData) const override; }; diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanager.pro b/src/plugins/qbsprojectmanager/qbsprojectmanager.pro index dcd01e32ad0..d5d0b1b79a8 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectmanager.pro +++ b/src/plugins/qbsprojectmanager/qbsprojectmanager.pro @@ -23,7 +23,6 @@ HEADERS = \ propertyprovider.h \ qbsbuildconfiguration.h \ qbsbuildconfigurationwidget.h \ - qbsbuildinfo.h \ qbsbuildstep.h \ qbscleanstep.h \ qbskitinformation.h \ @@ -49,7 +48,6 @@ SOURCES = \ defaultpropertyprovider.cpp \ qbsbuildconfiguration.cpp \ qbsbuildconfigurationwidget.cpp \ - qbsbuildinfo.cpp \ qbsbuildstep.cpp \ qbscleanstep.cpp \ qbsinstallstep.cpp \ diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanager.qbs b/src/plugins/qbsprojectmanager/qbsprojectmanager.qbs index 4182fc1252e..6c7793db557 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectmanager.qbs +++ b/src/plugins/qbsprojectmanager/qbsprojectmanager.qbs @@ -72,8 +72,6 @@ QtcPlugin { "qbsbuildconfiguration.h", "qbsbuildconfigurationwidget.cpp", "qbsbuildconfigurationwidget.h", - "qbsbuildinfo.cpp", - "qbsbuildinfo.h", "qbsbuildstep.cpp", "qbsbuildstep.h", "qbsbuildstepconfigwidget.ui", diff --git a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp index 25e1f8486c5..9435155b442 100644 --- a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp +++ b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.cpp @@ -41,6 +41,7 @@ #include #include +#include #include #include #include @@ -126,7 +127,7 @@ QmakeBuildConfiguration::QmakeBuildConfiguration(Target *target, Core::Id id) this, &QmakeBuildConfiguration::qtVersionsChanged); } -void QmakeBuildConfiguration::initialize(const BuildInfo *info) +void QmakeBuildConfiguration::initialize(const BuildInfo &info) { BuildConfiguration::initialize(info); @@ -138,28 +139,28 @@ void QmakeBuildConfiguration::initialize(const BuildInfo *info) BuildStepList *cleanSteps = stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN); cleanSteps->appendStep(new QmakeMakeStep(cleanSteps)); - const auto *qmakeInfo = static_cast(info); + const QmakeExtraBuildInfo qmakeExtra = info.extraInfo.value(); BaseQtVersion *version = QtKitInformation::qtVersion(target()->kit()); BaseQtVersion::QmakeBuildConfigs config = version->defaultBuildConfig(); - if (qmakeInfo->buildType == BuildConfiguration::Debug) + if (info.buildType == BuildConfiguration::Debug) config |= BaseQtVersion::DebugBuild; else config &= ~BaseQtVersion::DebugBuild; - QString additionalArguments = qmakeInfo->additionalArguments; + QString additionalArguments = qmakeExtra.additionalArguments; if (!additionalArguments.isEmpty()) qmakeStep->setUserArguments(additionalArguments); - qmakeStep->setLinkQmlDebuggingLibrary(qmakeInfo->config.linkQmlDebuggingQQ2); - qmakeStep->setSeparateDebugInfo(qmakeInfo->config.separateDebugInfo); - qmakeStep->setUseQtQuickCompiler(qmakeInfo->config.useQtQuickCompiler); + qmakeStep->setLinkQmlDebuggingLibrary(qmakeExtra.config.linkQmlDebuggingQQ2); + qmakeStep->setSeparateDebugInfo(qmakeExtra.config.separateDebugInfo); + qmakeStep->setUseQtQuickCompiler(qmakeExtra.config.useQtQuickCompiler); setQMakeBuildConfiguration(config); - FileName directory = qmakeInfo->buildDirectory; + FileName directory = info.buildDirectory; if (directory.isEmpty()) { directory = defaultBuildDirectory(target()->project()->projectFilePath().toString(), - target()->kit(), qmakeInfo->displayName, buildType()); + target()->kit(), info.displayName, buildType()); } setBuildDirectory(directory); @@ -565,43 +566,66 @@ QmakeBuildConfigurationFactory::QmakeBuildConfigurationFactory() registerBuildConfiguration(Constants::QMAKE_BC_ID); setSupportedProjectType(Constants::QMAKEPROJECT_ID); setSupportedProjectMimeTypeName(Constants::PROFILE_MIMETYPE); + setIssueReporter([](Kit *k, const QString &projectPath, const QString &buildDir) { + QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(k); + QList issues; + if (version) + issues << version->reportIssues(projectPath, buildDir); + + QString tmpBuildDir = QDir(buildDir).absolutePath(); + const QChar slash = QLatin1Char('/'); + if (!tmpBuildDir.endsWith(slash)) + tmpBuildDir.append(slash); + QString sourcePath = QFileInfo(projectPath).absolutePath(); + if (!sourcePath.endsWith(slash)) + sourcePath.append(slash); + if (tmpBuildDir.count(slash) != sourcePath.count(slash)) { + const QString msg = QCoreApplication::translate("QmakeProjectManager::QtVersion", + "The build directory needs to be at the same level as the source directory."); + + issues.append(Task(Task::Warning, msg, Utils::FileName(), -1, + ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM)); + } + return issues; + }); } -QmakeBuildInfo *QmakeBuildConfigurationFactory::createBuildInfo(const Kit *k, - const QString &projectPath, - BuildConfiguration::BuildType type) const +BuildInfo QmakeBuildConfigurationFactory::createBuildInfo(const Kit *k, + const QString &projectPath, + BuildConfiguration::BuildType type) const { BaseQtVersion *version = QtKitInformation::qtVersion(k); - auto *info = new QmakeBuildInfo(this); + QmakeExtraBuildInfo extraInfo; + BuildInfo info(this); QString suffix; if (type == BuildConfiguration::Release) { //: The name of the release build configuration created by default for a qmake project. - info->displayName = tr("Release"); + info.displayName = tr("Release"); //: Non-ASCII characters in directory suffix may cause build issues. suffix = tr("Release", "Shadow build directory suffix"); if (version && version->isQtQuickCompilerSupported()) - info->config.useQtQuickCompiler = true; + extraInfo.config.useQtQuickCompiler = true; } else { if (type == BuildConfiguration::Debug) { //: The name of the debug build configuration created by default for a qmake project. - info->displayName = tr("Debug"); + info.displayName = tr("Debug"); //: Non-ASCII characters in directory suffix may cause build issues. suffix = tr("Debug", "Shadow build directory suffix"); } else if (type == BuildConfiguration::Profile) { //: The name of the profile build configuration created by default for a qmake project. - info->displayName = tr("Profile"); + info.displayName = tr("Profile"); //: Non-ASCII characters in directory suffix may cause build issues. suffix = tr("Profile", "Shadow build directory suffix"); - info->config.separateDebugInfo = true; + extraInfo.config.separateDebugInfo = true; if (version && version->isQtQuickCompilerSupported()) - info->config.useQtQuickCompiler = true; + extraInfo.config.useQtQuickCompiler = true; } if (version && version->isQmlDebuggingSupported()) - info->config.linkQmlDebuggingQQ2 = true; + extraInfo.config.linkQmlDebuggingQQ2 = true; } - info->typeName = info->displayName; - // Leave info->buildDirectory unset; - info->kitId = k->id(); + info.typeName = info.displayName; + // Leave info.buildDirectory unset; + info.kitId = k->id(); // check if this project is in the source directory: FileName projectFilePath = FileName::fromString(projectPath); @@ -613,11 +637,12 @@ QmakeBuildInfo *QmakeBuildConfigurationFactory::createBuildInfo(const Kit *k, QString qtBuildDir = version->qmakeProperty("QT_INSTALL_PREFIX"); QString absoluteBuildPath = QDir::cleanPath(qtBuildDir + QLatin1Char('/') + relativeProjectPath); - info->buildDirectory = FileName::fromString(absoluteBuildPath); + info.buildDirectory = FileName::fromString(absoluteBuildPath); } else { - info->buildDirectory = defaultBuildDirectory(projectPath, k, suffix, type); + info.buildDirectory = defaultBuildDirectory(projectPath, k, suffix, type); } - info->buildType = type; + info.buildType = type; + info.extraInfo = QVariant::fromValue(extraInfo); return info; } @@ -630,26 +655,26 @@ static QList availableBuildTypes(const BaseQtVers return types; } -QList QmakeBuildConfigurationFactory::availableBuilds(const Target *parent) const +QList QmakeBuildConfigurationFactory::availableBuilds(const Target *parent) const { - QList result; + QList result; const QString projectFilePath = parent->project()->projectFilePath().toString(); foreach (BuildConfiguration::BuildType buildType, availableBuildTypes(QtKitInformation::qtVersion(parent->kit()))) { - QmakeBuildInfo *info = createBuildInfo(parent->kit(), projectFilePath, buildType); - info->displayName.clear(); // ask for a name - info->buildDirectory.clear(); // This depends on the displayName + BuildInfo info = createBuildInfo(parent->kit(), projectFilePath, buildType); + info.displayName.clear(); // ask for a name + info.buildDirectory.clear(); // This depends on the displayName result << info; } return result; } -QList QmakeBuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const +QList QmakeBuildConfigurationFactory::availableSetups(const Kit *k, const QString &projectPath) const { - QList result; + QList result; BaseQtVersion *qtVersion = QtKitInformation::qtVersion(k); if (!qtVersion || !qtVersion->isValid()) return result; diff --git a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h index 48485c0cfe4..fe4bdeb21e5 100644 --- a/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h +++ b/src/plugins/qmakeprojectmanager/qmakebuildconfiguration.h @@ -34,7 +34,6 @@ namespace ProjectExplorer { class FileNode; } namespace QmakeProjectManager { -class QmakeBuildInfo; class QMakeStep; class QmakeMakeStep; class QmakeBuildConfigurationFactory; @@ -50,7 +49,7 @@ public: QmakeBuildConfiguration(ProjectExplorer::Target *target, Core::Id id); ~QmakeBuildConfiguration() override; - void initialize(const ProjectExplorer::BuildInfo *info) override; + void initialize(const ProjectExplorer::BuildInfo &info) override; ProjectExplorer::NamedWidget *createConfigWidget() override; bool isShadowBuild() const; @@ -152,12 +151,12 @@ class QMAKEPROJECTMANAGER_EXPORT QmakeBuildConfigurationFactory : public Project public: QmakeBuildConfigurationFactory(); - QList availableBuilds(const ProjectExplorer::Target *parent) const override; - QList availableSetups(const ProjectExplorer::Kit *k, - const QString &projectPath) const override; + QList availableBuilds(const ProjectExplorer::Target *parent) const override; + QList availableSetups(const ProjectExplorer::Kit *k, + const QString &projectPath) const override; private: - QmakeBuildInfo *createBuildInfo(const ProjectExplorer::Kit *k, const QString &projectPath, - ProjectExplorer::BuildConfiguration::BuildType type) const; + ProjectExplorer::BuildInfo createBuildInfo(const ProjectExplorer::Kit *k, const QString &projectPath, + ProjectExplorer::BuildConfiguration::BuildType type) const; }; } // namespace QmakeProjectManager diff --git a/src/plugins/qmakeprojectmanager/qmakebuildinfo.h b/src/plugins/qmakeprojectmanager/qmakebuildinfo.h index 57a001c9cc6..1d513f3271c 100644 --- a/src/plugins/qmakeprojectmanager/qmakebuildinfo.h +++ b/src/plugins/qmakeprojectmanager/qmakebuildinfo.h @@ -25,66 +25,18 @@ #pragma once -#include "qmakebuildconfiguration.h" #include "qmakestep.h" -#include -#include -#include -#include -#include - -#include -#include - namespace QmakeProjectManager { -using ProjectExplorer::Task; - -class QmakeBuildInfo : public ProjectExplorer::BuildInfo +class QmakeExtraBuildInfo final { public: - QmakeBuildInfo(const QmakeBuildConfigurationFactory *f) : ProjectExplorer::BuildInfo(f) { } - QString additionalArguments; QString makefile; QMakeStepConfig config; - - bool operator==(const BuildInfo &o) const final - { - if (!ProjectExplorer::BuildInfo::operator==(o)) - return false; - - auto other = static_cast(&o); - return additionalArguments == other->additionalArguments - && makefile == other->makefile - && config == other->config; - } - - QList reportIssues(const QString &projectPath, const QString &buildDir) const override - { - ProjectExplorer::Kit *k = ProjectExplorer::KitManager::kit(kitId); - QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(k); - QList issues; - if (version) - issues << version->reportIssues(projectPath, buildDir); - - QString tmpBuildDir = QDir(buildDir).absolutePath(); - const QChar slash = QLatin1Char('/'); - if (!tmpBuildDir.endsWith(slash)) - tmpBuildDir.append(slash); - QString sourcePath = QFileInfo(projectPath).absolutePath(); - if (!sourcePath.endsWith(slash)) - sourcePath.append(slash); - if (tmpBuildDir.count(slash) != sourcePath.count(slash)) { - const QString msg = QCoreApplication::translate("QmakeProjectManager::QtVersion", - "The build directory needs to be at the same level as the source directory."); - - issues.append(Task(Task::Warning, msg, Utils::FileName(), -1, - ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM)); - } - return issues; - } }; } // namespace QmakeProjectManager + +Q_DECLARE_METATYPE(QmakeProjectManager::QmakeExtraBuildInfo) diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.cpp b/src/plugins/qmakeprojectmanager/qmakeproject.cpp index dd26db82e0b..894163ab47c 100644 --- a/src/plugins/qmakeprojectmanager/qmakeproject.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeproject.cpp @@ -45,6 +45,8 @@ #include #include #include + +#include #include #include #include @@ -957,7 +959,7 @@ void CentralizedFolderWatcher::delayedFolderChanged(const QString &folder) void QmakeProject::configureAsExampleProject(const QSet &platforms) { - QList infoList; + QList infoList; QList kits = KitManager::kits(); foreach (Kit *k, kits) { QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(k); @@ -966,14 +968,10 @@ void QmakeProject::configureAsExampleProject(const QSet &platforms) && !Utils::contains(version->targetDeviceTypes(), [platforms](Core::Id i) { return platforms.contains(i); }))) continue; - BuildConfigurationFactory *factory = BuildConfigurationFactory::find(k, projectFilePath().toString()); - if (!factory) - continue; - foreach (BuildInfo *info, factory->availableSetups(k, projectFilePath().toString())) - infoList << info; + if (auto factory = BuildConfigurationFactory::find(k, projectFilePath().toString())) + infoList << factory->allAvailableSetups(k, projectFilePath().toString()); } setup(infoList); - qDeleteAll(infoList); } void QmakeProject::updateBuildSystemData() diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp index 46129ee9096..f6d4aad459d 100644 --- a/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeprojectimporter.cpp @@ -32,10 +32,12 @@ #include "makefileparse.h" #include "qmakestep.h" +#include #include #include #include #include + #include #include #include @@ -229,9 +231,9 @@ Kit *QmakeProjectImporter::createKit(void *directoryData) const return createTemporaryKit(data->qtVersionData, data->parsedSpec, data->archConfig, data->osType); } -QList QmakeProjectImporter::buildInfoListForKit(const Kit *k, void *directoryData) const +const QList QmakeProjectImporter::buildInfoListForKit(const Kit *k, void *directoryData) const { - QList result; + QList result; auto *data = static_cast(directoryData); auto factory = qobject_cast( BuildConfigurationFactory::find(k, projectFilePath().toString())); @@ -239,29 +241,32 @@ QList QmakeProjectImporter::buildInfoListForKit(const Kit *k, void return result; // create info: - std::unique_ptr info(new QmakeBuildInfo(factory)); + BuildInfo info(factory); if (data->buildConfig & BaseQtVersion::DebugBuild) { - info->buildType = BuildConfiguration::Debug; - info->displayName = QCoreApplication::translate("QmakeProjectManager::Internal::QmakeProjectImporter", "Debug"); + info.buildType = BuildConfiguration::Debug; + info.displayName = QCoreApplication::translate("QmakeProjectManager::Internal::QmakeProjectImporter", "Debug"); } else { - info->buildType = BuildConfiguration::Release; - info->displayName = QCoreApplication::translate("QmakeProjectManager::Internal::QmakeProjectImporter", "Release"); + info.buildType = BuildConfiguration::Release; + info.displayName = QCoreApplication::translate("QmakeProjectManager::Internal::QmakeProjectImporter", "Release"); } - info->kitId = k->id(); - info->buildDirectory = data->buildDirectory; - info->additionalArguments = data->additionalArguments; - info->config = data->config; - info->makefile = data->makefile; + info.kitId = k->id(); + info.buildDirectory = data->buildDirectory; + + QmakeExtraBuildInfo extra; + extra.additionalArguments = data->additionalArguments; + extra.config = data->config; + extra.makefile = data->makefile; + info.extraInfo = QVariant::fromValue(extra); bool found = false; - foreach (BuildInfo *bInfo, result) { - if (*static_cast(bInfo) == *info) { + foreach (const BuildInfo &bInfo, result) { + if (bInfo == info) { found = true; break; } } if (!found) - result << info.release(); + result << info; return result; } diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectimporter.h b/src/plugins/qmakeprojectmanager/qmakeprojectimporter.h index adb5a4c9c62..13dad12de55 100644 --- a/src/plugins/qmakeprojectmanager/qmakeprojectimporter.h +++ b/src/plugins/qmakeprojectmanager/qmakeprojectimporter.h @@ -44,8 +44,8 @@ private: QList examineDirectory(const Utils::FileName &importPath) const final; bool matchKit(void *directoryData, const ProjectExplorer::Kit *k) const final; ProjectExplorer::Kit *createKit(void *directoryData) const final; - QList buildInfoListForKit(const ProjectExplorer::Kit *k, - void *directoryData) const final; + const QList buildInfoListForKit(const ProjectExplorer::Kit *k, + void *directoryData) const final; void deleteDirectoryData(void *directoryData) const final; diff --git a/src/plugins/qmlprofiler/tests/qmlprofilerdetailsrewriter_test.cpp b/src/plugins/qmlprofiler/tests/qmlprofilerdetailsrewriter_test.cpp index 0a65ec24bf0..927c397aa86 100644 --- a/src/plugins/qmlprofiler/tests/qmlprofilerdetailsrewriter_test.cpp +++ b/src/plugins/qmlprofiler/tests/qmlprofilerdetailsrewriter_test.cpp @@ -25,6 +25,7 @@ #include "qmlprofilerdetailsrewriter_test.h" +#include #include #include #include @@ -74,15 +75,15 @@ public: class DummyBuildConfigurationFactory : public ProjectExplorer::BuildConfigurationFactory { public: - QList availableBuilds(const ProjectExplorer::Target *) const final + QList availableBuilds(const ProjectExplorer::Target *) const final { - return QList(); + return {}; } - QList availableSetups(const ProjectExplorer::Kit *, - const QString &) const final + QList availableSetups(const ProjectExplorer::Kit *, + const QString &) const final { - return QList(); + return {}; } int priority(const ProjectExplorer::Kit *, const QString &) const final diff --git a/src/plugins/qtsupport/qtprojectimporter.cpp b/src/plugins/qtsupport/qtprojectimporter.cpp index af32e4a4591..b9e50017d47 100644 --- a/src/plugins/qtsupport/qtprojectimporter.cpp +++ b/src/plugins/qtsupport/qtprojectimporter.cpp @@ -181,7 +181,7 @@ protected: QList examineDirectory(const Utils::FileName &importPath) const override; bool matchKit(void *directoryData, const Kit *k) const override; Kit *createKit(void *directoryData) const override; - QList buildInfoListForKit(const Kit *k, void *directoryData) const override; + const QList buildInfoListForKit(const Kit *k, void *directoryData) const override; void deleteDirectoryData(void *directoryData) const override; private: @@ -241,20 +241,19 @@ Kit *TestQtProjectImporter::createKit(void *directoryData) const }); } -QList TestQtProjectImporter::buildInfoListForKit(const Kit *k, void *directoryData) const +const QList TestQtProjectImporter::buildInfoListForKit(const Kit *k, void *directoryData) const { Q_UNUSED(directoryData); assert(m_testData.contains(directoryData)); assert(!m_deletedTestData.contains(directoryData)); assert(static_cast(directoryData)->importPath == m_path); - BuildInfo *info = new BuildInfo(nullptr); - info->displayName = "Test Build info"; - info->typeName = "Debug"; - info->buildDirectory = m_path; - info->kitId = k->id(); - info->buildType = BuildConfiguration::Debug; - + BuildInfo info; + info.displayName = "Test Build info"; + info.typeName = "Debug"; + info.buildDirectory = m_path; + info.kitId = k->id(); + info.buildType = BuildConfiguration::Debug; return {info}; } @@ -422,7 +421,7 @@ void QtSupportPlugin::testQtProjectImporter_oneProject() // -------------------------------------------------------------------- // choose an existing directory to "import" - const QList buildInfo = importer.import(Utils::FileName::fromString(appDir), true); + const QList buildInfo = importer.import(Utils::FileName::fromString(appDir), true); // VALIDATE: Basic TestImporter state: QCOMPARE(importer.projectFilePath().toString(), tempDir1.path()); @@ -436,14 +435,14 @@ void QtSupportPlugin::testQtProjectImporter_oneProject() // VALIDATE: Validate result: for (int i = 0; i < buildInfo.count(); ++i) { const DirectoryData *dd = testData.at(i); - const BuildInfo *bi = buildInfo.at(i); + const BuildInfo &bi = buildInfo.at(i); // VALIDATE: Kit id is unchanged (unless it is a new kit) if (!dd->isNewKit) - QCOMPARE(bi->kitId, defaultKit->id()); + QCOMPARE(bi.kitId, defaultKit->id()); // VALIDATE: Kit is registered with the KitManager - Kit *newKit = KitManager::kit(bi->kitId); + Kit *newKit = KitManager::kit(bi.kitId); QVERIFY(newKit); const int newQtId = QtKitInformation::qtVersionId(newKit); @@ -596,7 +595,6 @@ void QtSupportPlugin::testQtProjectImporter_oneProject() // Teardown: // -------------------------------------------------------------------- - qDeleteAll(buildInfo); qDeleteAll(testData); foreach (Kit *k, toUnregisterLater)