From 8536504caa216e599a6332261cd9fcafcbba296c Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 22 Feb 2019 12:16:56 +0100 Subject: [PATCH] ProjectExplorer: Upstream CMake's handling of outdated builds This is mainly there to make the local runconfiguration implementations more uniform. Both qmake and qbs will drop runconfigs for builds that are not available anymore, so that's a no-op for them. Change-Id: I8aa32d779f67cce7a4d4733cfbe0c9a136bfd3f7 Reviewed-by: Christian Kandeler --- .../cmakerunconfiguration.cpp | 22 ------------------- .../cmakerunconfiguration.h | 5 ----- .../projectexplorer/runconfiguration.cpp | 13 ++++++++--- src/plugins/projectexplorer/target.cpp | 7 ++++++ src/plugins/projectexplorer/target.h | 1 + 5 files changed, 18 insertions(+), 30 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp index 48eaa9a41dd..3f01d583ac8 100644 --- a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp @@ -73,28 +73,6 @@ void CMakeRunConfiguration::doAdditionalSetup(const RunConfigurationCreationInfo updateTargetInformation(); } -bool CMakeRunConfiguration::isBuildTargetValid() const -{ - return Utils::anyOf(target()->applicationTargets().list, [this](const BuildTargetInfo &bti) { - return bti.buildKey == buildKey(); - }); -} - -void CMakeRunConfiguration::updateEnabledState() -{ - if (!isBuildTargetValid()) - setEnabled(false); - else - RunConfiguration::updateEnabledState(); -} - -QString CMakeRunConfiguration::disabledReason() const -{ - if (!isBuildTargetValid()) - return tr("The project no longer builds the target associated with this run configuration."); - return RunConfiguration::disabledReason(); -} - void CMakeRunConfiguration::updateTargetInformation() { BuildTargetInfo bti = buildTargetInfo(); diff --git a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h index e9d0e18827c..f7f5491bcd5 100644 --- a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h +++ b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h @@ -38,13 +38,8 @@ public: CMakeRunConfiguration(ProjectExplorer::Target *target, Core::Id id); private: - QString disabledReason() const override; - void doAdditionalSetup(const ProjectExplorer::RunConfigurationCreationInfo &) override; - bool isBuildTargetValid() const; void updateTargetInformation(); - - void updateEnabledState() final; }; class CMakeRunConfigurationFactory : public ProjectExplorer::RunConfigurationFactory diff --git a/src/plugins/projectexplorer/runconfiguration.cpp b/src/plugins/projectexplorer/runconfiguration.cpp index d6cd2dd464c..06eeecb587f 100644 --- a/src/plugins/projectexplorer/runconfiguration.cpp +++ b/src/plugins/projectexplorer/runconfiguration.cpp @@ -214,6 +214,8 @@ bool RunConfiguration::isActive() const QString RunConfiguration::disabledReason() const { + if (!target()->hasBuildTarget(m_buildKey)) + return tr("The project no longer builds the target associated with this run configuration."); if (target()->project()->isParsing()) return tr("The Project is currently being parsed."); if (!target()->project()->hasParsingData()) @@ -243,9 +245,14 @@ QWidget *RunConfiguration::createConfigurationWidget() void RunConfiguration::updateEnabledState() { - Project *p = target()->project(); - - setEnabled(!p->isParsing() && p->hasParsingData()); + if (!target()->hasBuildTarget(m_buildKey)) { + // This apparently may happen for cmake builds where also outdated + // RunConfigurations are kept when builds change. + setEnabled(false); // Might happen for CMake. + } else { + Project *p = target()->project(); + setEnabled(!p->isParsing() && p->hasParsingData()); + } } void RunConfiguration::addAspectFactory(const AspectFactory &aspectFactory) diff --git a/src/plugins/projectexplorer/target.cpp b/src/plugins/projectexplorer/target.cpp index 9baa1e8841b..a6a5c9a94c6 100644 --- a/src/plugins/projectexplorer/target.cpp +++ b/src/plugins/projectexplorer/target.cpp @@ -365,6 +365,13 @@ BuildTargetInfo Target::buildTarget(const QString &buildKey) const }); } +bool Target::hasBuildTarget(const QString &buildKey) const +{ + return Utils::anyOf(d->m_appTargets.list, [buildKey](const BuildTargetInfo &bti) { + return bti.buildKey == buildKey; + }); +} + QList Target::projectConfigurations() const { QList result; diff --git a/src/plugins/projectexplorer/target.h b/src/plugins/projectexplorer/target.h index 9734210278d..e236d22dcbd 100644 --- a/src/plugins/projectexplorer/target.h +++ b/src/plugins/projectexplorer/target.h @@ -84,6 +84,7 @@ public: void setApplicationTargets(const BuildTargetInfoList &appTargets); BuildTargetInfoList applicationTargets() const; BuildTargetInfo buildTarget(const QString &buildKey) const; + bool hasBuildTarget(const QString &buildKey) const; QList projectConfigurations() const;