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;