From a5d6fe33cbc0ab9b29711b345de78ae63ecf2afb Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 12 Mar 2018 16:33:28 +0100 Subject: [PATCH] Partially decouple local CMakeRunConfiguration from CMakeProject Funnel all relevant data through target.applicationTargets() as done for the non-local CMake-supporting setups and QBS already. There is cleanup potential left for later changes. Change-Id: I49ed6abd98c058a7fd1545e41b3bcd6ecb758a8b Task-number: QTCREATORBUG-19985 Reviewed-by: Tobias Hunger --- .../cmakeprojectmanager/cmakeproject.cpp | 36 ++++------- .../cmakeprojectmanager/cmakeproject.h | 5 +- .../cmakerunconfiguration.cpp | 62 ++++++------------- .../cmakerunconfiguration.h | 10 +-- src/plugins/projectexplorer/buildtargetinfo.h | 1 + .../projectexplorer/runconfiguration.cpp | 6 +- .../projectexplorer/runconfiguration.h | 4 +- src/plugins/projectexplorer/target.cpp | 4 +- .../pythoneditor/pythoneditorplugin.cpp | 2 +- 9 files changed, 43 insertions(+), 87 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index 597d6d26dac..7187aa7c3b4 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -473,20 +473,9 @@ void CMakeProject::startParsing(int reparseParameters) m_buildDirManager.parse(reparseParameters); } -QStringList CMakeProject::buildTargetTitles(bool runnable) const +QStringList CMakeProject::buildTargetTitles() const { - const QList targets - = runnable ? filtered(buildTargets(), - [](const CMakeBuildTarget &ct) { - return !ct.executable.isEmpty() && ct.targetType == ExecutableType; - }) - : buildTargets(); - return transform(targets, [](const CMakeBuildTarget &ct) { return ct.title; }); -} - -bool CMakeProject::hasBuildTarget(const QString &title) const -{ - return anyOf(buildTargets(), [title](const CMakeBuildTarget &ct) { return ct.title == title; }); + return transform(buildTargets(), [](const CMakeBuildTarget &ct) { return ct.title; }); } Project::RestoreResult CMakeProject::fromMap(const QVariantMap &map, QString *errorMessage) @@ -562,14 +551,6 @@ void CMakeProject::combineScanAndParse(CMakeBuildConfiguration *bc) emitParsingFinished(m_combinedScanAndParseResult); } -CMakeBuildTarget CMakeProject::buildTargetForTitle(const QString &title) -{ - foreach (const CMakeBuildTarget &ct, buildTargets()) - if (ct.title == title) - return ct; - return CMakeBuildTarget(); -} - QStringList CMakeProject::filesGeneratedFrom(const QString &sourceFile) const { if (!activeTarget()) @@ -676,10 +657,15 @@ void CMakeProject::updateApplicationAndDeploymentTargets() } } if (ct.targetType == ExecutableType) { - FileName srcWithTrailingSlash = FileName::fromString(ct.sourceDirectory.toString()); - srcWithTrailingSlash.appendString('/'); - // TODO: Put a path to corresponding .cbp file into projectFilePath? - appTargetList.list << BuildTargetInfo(ct.title, ct.executable, srcWithTrailingSlash); + BuildTargetInfo bti; + bti.targetName = ct.title; + bti.displayName = ct.title; + bti.targetFilePath = ct.executable; + bti.projectFilePath = ct.sourceDirectory; + bti.projectFilePath.appendString('/'); + bti.workingDirectory = ct.workingDirectory; + bti.buildKey = ct.title + QChar('\n') + bti.projectFilePath.toString(); + appTargetList.list.append(bti); } } diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h index 6925296080a..61ae5d0066b 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.h +++ b/src/plugins/cmakeprojectmanager/cmakeproject.h @@ -63,10 +63,7 @@ public: explicit CMakeProject(const Utils::FileName &filename); ~CMakeProject() final; - QStringList buildTargetTitles(bool runnable = false) const; - bool hasBuildTarget(const QString &title) const; - - CMakeBuildTarget buildTargetForTitle(const QString &title); + QStringList buildTargetTitles() const; bool knowsAllBuildExecutables() const final; diff --git a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp index 9a4f871de01..6e6a9d5cdee 100644 --- a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp @@ -25,8 +25,6 @@ #include "cmakerunconfiguration.h" -#include "cmakebuildconfiguration.h" -#include "cmakeproject.h" #include "cmakeprojectconstants.h" #include @@ -40,18 +38,11 @@ #include #include #include -#include #include -#include #include #include -#include -#include #include -#include -#include -#include using namespace CMakeProjectManager; using namespace CMakeProjectManager::Internal; @@ -97,14 +88,6 @@ Runnable CMakeRunConfiguration::runnable() const return r; } -QString CMakeRunConfiguration::baseWorkingDirectory() const -{ - const QString exe = m_executable; - if (!exe.isEmpty()) - return QFileInfo(m_executable).absolutePath(); - return QString(); -} - QString CMakeRunConfiguration::title() const { return m_title; @@ -140,15 +123,22 @@ bool CMakeRunConfiguration::fromMap(const QVariantMap &map) m_executable = extraId; if (m_title.isEmpty()) m_title = extraId; - - CMakeProject *project = static_cast(target()->project()); - const CMakeBuildTarget ct = project->buildTargetForTitle(m_title); - extraAspect()->setDefaultWorkingDirectory(ct.workingDirectory); } return true; } +void CMakeRunConfiguration::doAdditionalSetup(const RunConfigurationCreationInfo &info) +{ + m_buildSystemTarget = info.targetName; + m_title = info.displayName; + m_executable = info.displayName; + setDefaultDisplayName(info.displayName); + setDisplayName(info.displayName); + BuildTargetInfo bti = target()->applicationTargets().buildTargetInfo(info.buildKey); + extraAspect()->setDefaultWorkingDirectory(bti.workingDirectory); +} + QString CMakeRunConfiguration::defaultDisplayName() const { if (m_title.isEmpty()) @@ -156,10 +146,16 @@ QString CMakeRunConfiguration::defaultDisplayName() const return m_title; } +bool CMakeRunConfiguration::isBuildTargetValid() const +{ + return Utils::anyOf(target()->applicationTargets().list, [this](const BuildTargetInfo &bti) { + return bti.targetName == m_buildSystemTarget; + }); +} + void CMakeRunConfiguration::updateEnabledState() { - auto cp = qobject_cast(target()->project()); - if (!cp->hasBuildTarget(m_buildSystemTarget)) + if (!isBuildTargetValid()) setEnabled(false); else RunConfiguration::updateEnabledState(); @@ -172,10 +168,7 @@ QWidget *CMakeRunConfiguration::createConfigurationWidget() QString CMakeRunConfiguration::disabledReason() const { - auto cp = qobject_cast(target()->project()); - QTC_ASSERT(cp, return QString()); - - if (!cp->hasBuildTarget(m_buildSystemTarget)) + if (!isBuildTargetValid()) return tr("The project no longer builds the target associated with this run configuration."); return RunConfiguration::disabledReason(); } @@ -235,18 +228,3 @@ CMakeRunConfigurationFactory::CMakeRunConfigurationFactory() registerRunConfiguration(CMAKE_RC_PREFIX); addSupportedProjectType(CMakeProjectManager::Constants::CMAKEPROJECT_ID); } - -QList -CMakeRunConfigurationFactory::availableCreators(Target *parent) const -{ - CMakeProject *project = qobject_cast(parent->project()); - QTC_ASSERT(project, return {}); - const QStringList titles = project->buildTargetTitles(true); - return Utils::transform(titles, [this](const QString &title) { return convert(title, title); }); -} - -bool CMakeRunConfigurationFactory::canCreateHelper(Target *parent, const QString &buildTarget) const -{ - CMakeProject *project = static_cast(parent->project()); - return project->hasBuildTarget(buildTarget); -} diff --git a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h index e44d1ea53e5..2a619bc574e 100644 --- a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h +++ b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h @@ -26,7 +26,6 @@ #pragma once #include -#include namespace CMakeProjectManager { namespace Internal { @@ -34,7 +33,6 @@ namespace Internal { class CMakeRunConfiguration : public ProjectExplorer::RunConfiguration { Q_OBJECT - friend class CMakeRunConfigurationWidget; public: explicit CMakeRunConfiguration(ProjectExplorer::Target *target); @@ -56,13 +54,13 @@ public: private: bool fromMap(const QVariantMap &map) override; + void doAdditionalSetup(const ProjectExplorer::RunConfigurationCreationInfo &) override; QString defaultDisplayName() const; + bool isBuildTargetValid() const; void updateEnabledState() final; QString extraId() const final; - QString baseWorkingDirectory() const; - QString m_buildSystemTarget; QString m_executable; QString m_title; @@ -82,10 +80,6 @@ class CMakeRunConfigurationFactory : public ProjectExplorer::RunConfigurationFac public: CMakeRunConfigurationFactory(); - - QList - availableCreators(ProjectExplorer::Target *parent) const override; - bool canCreateHelper(ProjectExplorer::Target *parent, const QString &suffix) const override; }; } // namespace Internal diff --git a/src/plugins/projectexplorer/buildtargetinfo.h b/src/plugins/projectexplorer/buildtargetinfo.h index 06416ea899e..2ba3225d5dc 100644 --- a/src/plugins/projectexplorer/buildtargetinfo.h +++ b/src/plugins/projectexplorer/buildtargetinfo.h @@ -54,6 +54,7 @@ public: Utils::FileName targetFilePath; Utils::FileName projectFilePath; + Utils::FileName workingDirectory; bool isQtcRunnable = true; bool usesTerminal = false; diff --git a/src/plugins/projectexplorer/runconfiguration.cpp b/src/plugins/projectexplorer/runconfiguration.cpp index eabfb002c50..46d409fb2bc 100644 --- a/src/plugins/projectexplorer/runconfiguration.cpp +++ b/src/plugins/projectexplorer/runconfiguration.cpp @@ -550,7 +550,7 @@ RunConfiguration *RunConfigurationCreationInfo::create(Target *target) const QTC_ASSERT(factory->canHandle(target), return nullptr); QTC_ASSERT(id == factory->runConfigurationBaseId(), return nullptr); - if (!factory->canCreateHelper(target, extra)) + if (!factory->canCreateHelper(target, targetName)) return nullptr; QTC_ASSERT(factory->m_creator, return nullptr); @@ -560,9 +560,9 @@ RunConfiguration *RunConfigurationCreationInfo::create(Target *target) const // "FIX" ids by mangling in the extra data (build system target etc) // for compatibility for the current format used in settings. - if (!extra.isEmpty()) { + if (!targetName.isEmpty()) { QVariantMap data = rc->toMap(); - data[ProjectConfiguration::settingsIdKey()] = id.withSuffix(extra).toString(); + data[ProjectConfiguration::settingsIdKey()] = id.withSuffix(targetName).toString(); rc->fromMap(data); } diff --git a/src/plugins/projectexplorer/runconfiguration.h b/src/plugins/projectexplorer/runconfiguration.h index 81edca33d3f..beac3fc7ddd 100644 --- a/src/plugins/projectexplorer/runconfiguration.h +++ b/src/plugins/projectexplorer/runconfiguration.h @@ -290,7 +290,7 @@ public: CreationMode creationMode = AlwaysCreate, bool useTerminal = false) : factory(factory), id(id), - extra(extra), + targetName(extra), displayName(displayName), creationMode(creationMode), useTerminal(useTerminal) @@ -300,7 +300,7 @@ public: const RunConfigurationFactory *factory = nullptr; Core::Id id; - QString extra; + QString targetName; QString displayName; QString buildKey; CreationMode creationMode = AlwaysCreate; diff --git a/src/plugins/projectexplorer/target.cpp b/src/plugins/projectexplorer/target.cpp index c275720a9d2..5afaeb53bb3 100644 --- a/src/plugins/projectexplorer/target.cpp +++ b/src/plugins/projectexplorer/target.cpp @@ -564,7 +564,7 @@ void Target::updateDefaultRunConfigurations() bool present = false; for (const RunConfigurationCreationInfo &item : creators) { QString rcExtraId = rc->extraId(); - if (item.id == rc->id() && (item.extra == rcExtraId || item.buildKey == rcExtraId)) { + if (item.id == rc->id() && (item.targetName == rcExtraId || item.buildKey == rcExtraId)) { existing.append(item); present = true; } @@ -580,7 +580,7 @@ void Target::updateDefaultRunConfigurations() continue; bool exists = false; for (const RunConfigurationCreationInfo &ex : existing) { - if (ex.id == item.id && ex.extra == item.extra) + if (ex.id == item.id && ex.targetName == item.targetName) exists = true; } if (exists) diff --git a/src/plugins/pythoneditor/pythoneditorplugin.cpp b/src/plugins/pythoneditor/pythoneditorplugin.cpp index 9d5d404374c..c158bb59d9b 100644 --- a/src/plugins/pythoneditor/pythoneditorplugin.cpp +++ b/src/plugins/pythoneditor/pythoneditorplugin.cpp @@ -204,7 +204,7 @@ void PythonRunConfiguration::doAdditionalSetup(const RunConfigurationCreationInf Environment sysEnv = Environment::systemEnvironment(); const QString exec = sysEnv.searchInPath("python").toString(); m_interpreter = exec.isEmpty() ? "python" : exec; - m_mainScript = info.extra; + m_mainScript = info.targetName; setDefaultDisplayName(defaultDisplayName()); }