ProjectExplorer: Add a ProjectConfiguration::target()

... with a suitable default implementation accessing a member
populated at construction time instead of walking the parent
chains on each access.

Change-Id: I58dae6da80ed0b023cc603fca13a5a205b123672
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
hjk
2019-07-26 16:08:13 +02:00
parent 8493a6b044
commit d16330de6d
16 changed files with 42 additions and 79 deletions

View File

@@ -65,6 +65,7 @@ namespace ProjectExplorer {
BuildConfiguration::BuildConfiguration(Target *target, Core::Id id) BuildConfiguration::BuildConfiguration(Target *target, Core::Id id)
: ProjectConfiguration(target, id) : ProjectConfiguration(target, id)
{ {
QTC_CHECK(target && target == this->target());
Utils::MacroExpander *expander = macroExpander(); Utils::MacroExpander *expander = macroExpander();
expander->setDisplayName(tr("Build Settings")); expander->setDisplayName(tr("Build Settings"));
expander->setAccumulating(true); expander->setAccumulating(true);
@@ -271,16 +272,6 @@ void BuildConfiguration::setBuildDirectorySettingsKey(const QString &key)
m_buildDirectoryAspect->setSettingsKey(key); m_buildDirectoryAspect->setSettingsKey(key);
} }
Target *BuildConfiguration::target() const
{
return static_cast<Target *>(parent());
}
Project *BuildConfiguration::project() const
{
return target()->project();
}
Utils::Environment BuildConfiguration::baseEnvironment() const Utils::Environment BuildConfiguration::baseEnvironment() const
{ {
Utils::Environment result; Utils::Environment result;

View File

@@ -75,9 +75,6 @@ public:
bool fromMap(const QVariantMap &map) override; bool fromMap(const QVariantMap &map) override;
QVariantMap toMap() const override; QVariantMap toMap() const override;
Target *target() const;
Project *project() const override;
virtual bool isEnabled() const; virtual bool isEnabled() const;
virtual QString disabledReason() const; virtual QString disabledReason() const;

View File

@@ -126,6 +126,7 @@ static QList<BuildStepFactory *> g_buildStepFactories;
BuildStep::BuildStep(BuildStepList *bsl, Core::Id id) : BuildStep::BuildStep(BuildStepList *bsl, Core::Id id) :
ProjectConfiguration(bsl, id) ProjectConfiguration(bsl, id)
{ {
QTC_CHECK(bsl->target() && bsl->target() == this->target());
Utils::MacroExpander *expander = macroExpander(); Utils::MacroExpander *expander = macroExpander();
expander->setDisplayName(tr("Build Step")); expander->setDisplayName(tr("Build Step"));
expander->setAccumulating(true); expander->setAccumulating(true);
@@ -204,16 +205,6 @@ ProjectConfiguration *BuildStep::projectConfiguration() const
return static_cast<ProjectConfiguration *>(parent()->parent()); return static_cast<ProjectConfiguration *>(parent()->parent());
} }
Target *BuildStep::target() const
{
return qobject_cast<Target *>(parent()->parent()->parent());
}
Project *BuildStep::project() const
{
return target()->project();
}
void BuildStep::reportRunResult(QFutureInterface<bool> &fi, bool success) void BuildStep::reportRunResult(QFutureInterface<bool> &fi, bool success)
{ {
fi.reportResult(success); fi.reportResult(success);

View File

@@ -72,8 +72,6 @@ public:
BuildConfiguration *buildConfiguration() const; BuildConfiguration *buildConfiguration() const;
DeployConfiguration *deployConfiguration() const; DeployConfiguration *deployConfiguration() const;
ProjectConfiguration *projectConfiguration() const; ProjectConfiguration *projectConfiguration() const;
Target *target() const;
Project *project() const override;
enum class OutputFormat { enum class OutputFormat {
Stdout, Stderr, // These are for forwarded output from external tools Stdout, Stderr, // These are for forwarded output from external tools

View File

@@ -46,6 +46,7 @@ const char STEPS_PREFIX[] = "ProjectExplorer.BuildStepList.Step.";
BuildStepList::BuildStepList(QObject *parent, Core::Id id) BuildStepList::BuildStepList(QObject *parent, Core::Id id)
: ProjectConfiguration(parent, id) : ProjectConfiguration(parent, id)
{ {
QTC_CHECK(parent && parent->parent() && parent->parent() == target());
if (id == Constants::BUILDSTEPS_BUILD) { if (id == Constants::BUILDSTEPS_BUILD) {
//: Display name of the build build step list. Used as part of the labels in the project window. //: Display name of the build build step list. Used as part of the labels in the project window.
setDefaultDisplayName(tr("Build")); setDefaultDisplayName(tr("Build"));
@@ -192,20 +193,3 @@ BuildStep *BuildStepList::at(int position)
{ {
return m_steps.at(position); return m_steps.at(position);
} }
Target *BuildStepList::target() const
{
Q_ASSERT(parent());
auto bc = qobject_cast<BuildConfiguration *>(parent());
if (bc)
return bc->target();
auto dc = qobject_cast<DeployConfiguration *>(parent());
if (dc)
return dc->target();
return nullptr;
}
Project *BuildStepList::project() const
{
return target()->project();
}

View File

@@ -77,9 +77,6 @@ public:
void moveStepUp(int position); void moveStepUp(int position);
BuildStep *at(int position); BuildStep *at(int position);
Target *target() const;
Project *project() const override;
QVariantMap toMap() const override; QVariantMap toMap() const override;
bool fromMap(const QVariantMap &map) override; bool fromMap(const QVariantMap &map) override;

View File

@@ -44,6 +44,7 @@ DeployConfiguration::DeployConfiguration(Target *target, Core::Id id)
: ProjectConfiguration(target, id), : ProjectConfiguration(target, id),
m_stepList(this, Constants::BUILDSTEPS_DEPLOY) m_stepList(this, Constants::BUILDSTEPS_DEPLOY)
{ {
QTC_CHECK(target && target == this->target());
Utils::MacroExpander *expander = macroExpander(); Utils::MacroExpander *expander = macroExpander();
expander->setDisplayName(tr("Deploy Settings")); expander->setDisplayName(tr("Deploy Settings"));
expander->setAccumulating(true); expander->setAccumulating(true);
@@ -108,16 +109,6 @@ bool DeployConfiguration::fromMap(const QVariantMap &map)
return true; return true;
} }
Target *DeployConfiguration::target() const
{
return static_cast<Target *>(parent());
}
Project *DeployConfiguration::project() const
{
return target()->project();
}
bool DeployConfiguration::isActive() const bool DeployConfiguration::isActive() const
{ {
return target()->isActive() && target()->activeDeployConfiguration() == this; return target()->isActive() && target()->activeDeployConfiguration() == this;

View File

@@ -56,9 +56,6 @@ public:
bool fromMap(const QVariantMap &map) override; bool fromMap(const QVariantMap &map) override;
QVariantMap toMap() const override; QVariantMap toMap() const override;
Target *target() const;
Project *project() const override;
bool isActive() const override; bool isActive() const override;
private: private:

View File

@@ -24,6 +24,7 @@
****************************************************************************/ ****************************************************************************/
#include "projectconfiguration.h" #include "projectconfiguration.h"
#include "target.h"
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
@@ -86,10 +87,25 @@ ProjectConfiguration::ProjectConfiguration(QObject *parent, Core::Id id)
{ {
QTC_CHECK(id.isValid()); QTC_CHECK(id.isValid());
setObjectName(id.toString()); setObjectName(id.toString());
for (QObject *obj = this; obj; obj = obj->parent()) {
m_target = qobject_cast<Target *>(obj);
if (m_target != nullptr)
break;
}
// FIXME: Below triggers on 'real' Targets with this here a base class as it's
// not a real Target at this point of time. Plan is to cut this dependency and
// enable the check, for now the item is set manually in the Target ctor.
// QTC_CHECK(m_target);
} }
ProjectConfiguration::~ProjectConfiguration() = default; ProjectConfiguration::~ProjectConfiguration() = default;
Project *ProjectConfiguration::project() const
{
return m_target->project();
}
Core::Id ProjectConfiguration::id() const Core::Id ProjectConfiguration::id() const
{ {
return m_id; return m_id;
@@ -159,6 +175,12 @@ QVariantMap ProjectConfiguration::toMap() const
return map; return map;
} }
Target *ProjectConfiguration::target() const
{
return m_target;
}
bool ProjectConfiguration::fromMap(const QVariantMap &map) bool ProjectConfiguration::fromMap(const QVariantMap &map)
{ {
Core::Id id = Core::Id::fromSetting(map.value(QLatin1String(CONFIGURATION_ID_KEY))); Core::Id id = Core::Id::fromSetting(map.value(QLatin1String(CONFIGURATION_ID_KEY)));

View File

@@ -42,6 +42,7 @@ namespace ProjectExplorer {
class Project; class Project;
class ProjectConfigurationAspects; class ProjectConfigurationAspects;
class Target;
class PROJECTEXPLORER_EXPORT ProjectConfigurationAspect : public QObject class PROJECTEXPLORER_EXPORT ProjectConfigurationAspect : public QObject
{ {
@@ -153,7 +154,8 @@ public:
Utils::MacroExpander *macroExpander() { return &m_macroExpander; } Utils::MacroExpander *macroExpander() { return &m_macroExpander; }
const Utils::MacroExpander *macroExpander() const { return &m_macroExpander; } const Utils::MacroExpander *macroExpander() const { return &m_macroExpander; }
virtual Project *project() const = 0; Target *target() const;
Project *project() const;
virtual bool isActive() const = 0; virtual bool isActive() const = 0;
@@ -180,6 +182,8 @@ protected:
ProjectConfigurationAspects m_aspects; ProjectConfigurationAspects m_aspects;
private: private:
friend class Target; // FIXME: Remove
Target *m_target = nullptr;
const Core::Id m_id; const Core::Id m_id;
QString m_displayName; QString m_displayName;
QString m_defaultDisplayName; QString m_defaultDisplayName;

View File

@@ -160,6 +160,7 @@ static std::vector<RunConfiguration::AspectFactory> theAspectFactories;
RunConfiguration::RunConfiguration(Target *target, Core::Id id) RunConfiguration::RunConfiguration(Target *target, Core::Id id)
: ProjectConfiguration(target, id) : ProjectConfiguration(target, id)
{ {
QTC_CHECK(target && target == this->target());
connect(target->project(), &Project::parsingStarted, connect(target->project(), &Project::parsingStarted,
this, [this]() { updateEnabledState(); }); this, [this]() { updateEnabledState(); });
connect(target->project(), &Project::parsingFinished, connect(target->project(), &Project::parsingFinished,
@@ -308,16 +309,6 @@ BuildConfiguration *RunConfiguration::activeBuildConfiguration() const
return target()->activeBuildConfiguration(); return target()->activeBuildConfiguration();
} }
Target *RunConfiguration::target() const
{
return static_cast<Target *>(parent());
}
Project *RunConfiguration::project() const
{
return target()->project();
}
QVariantMap RunConfiguration::toMap() const QVariantMap RunConfiguration::toMap() const
{ {
QVariantMap map = ProjectConfiguration::toMap(); QVariantMap map = ProjectConfiguration::toMap();

View File

@@ -152,9 +152,6 @@ public:
// TODO rename function // TODO rename function
virtual ConfigurationState ensureConfigured(QString *errorMessage = nullptr); virtual ConfigurationState ensureConfigured(QString *errorMessage = nullptr);
Target *target() const;
Project *project() const override;
Utils::OutputFormatter *createOutputFormatter() const; Utils::OutputFormatter *createOutputFormatter() const;
bool fromMap(const QVariantMap &map) override; bool fromMap(const QVariantMap &map) override;

View File

@@ -116,6 +116,9 @@ Target::Target(Project *project, Kit *k, _constructor_tag) :
ProjectConfiguration(project, k->id()), ProjectConfiguration(project, k->id()),
d(std::make_unique<TargetPrivate>(k)) d(std::make_unique<TargetPrivate>(k))
{ {
// FIXME: Remove, see comment in ProjectConfiguration ctor.
m_target = this;
QTC_CHECK(d->m_kit); QTC_CHECK(d->m_kit);
connect(DeviceManager::instance(), &DeviceManager::updated, this, &Target::updateDeviceState); connect(DeviceManager::instance(), &DeviceManager::updated, this, &Target::updateDeviceState);
connect(project, &Project::parsingFinished, this, [this](bool success) { connect(project, &Project::parsingFinished, this, [this](bool success) {

View File

@@ -57,10 +57,10 @@ public:
Target(Project *parent, Kit *k, _constructor_tag); Target(Project *parent, Kit *k, _constructor_tag);
~Target() override; ~Target() override;
Project *project() const override;
bool isActive() const final; bool isActive() const final;
Project *project() const;
// Kit: // Kit:
Kit *kit() const; Kit *kit() const;

View File

@@ -158,21 +158,21 @@ QVariantMap QbsBuildConfiguration::qbsConfiguration() const
return config; return config;
} }
Internal::QbsProject *QbsBuildConfiguration::project() const Internal::QbsProject *QbsBuildConfiguration::qbsProject() const
{ {
return qobject_cast<Internal::QbsProject *>(BuildConfiguration::project()); return qobject_cast<Internal::QbsProject *>(project());
} }
bool QbsBuildConfiguration::isEnabled() const bool QbsBuildConfiguration::isEnabled() const
{ {
return !project()->isParsing() && project()->hasParseResult(); return !project()->isParsing() && qbsProject()->hasParseResult();
} }
QString QbsBuildConfiguration::disabledReason() const QString QbsBuildConfiguration::disabledReason() const
{ {
if (project()->isParsing()) if (project()->isParsing())
return tr("Parsing the Qbs project."); return tr("Parsing the Qbs project.");
if (!project()->hasParseResult()) if (!qbsProject()->hasParseResult())
return tr("Parsing of Qbs project has failed."); return tr("Parsing of Qbs project has failed.");
return QString(); return QString();
} }

View File

@@ -53,7 +53,7 @@ public:
QbsBuildStep *qbsStep() const; QbsBuildStep *qbsStep() const;
QVariantMap qbsConfiguration() const; QVariantMap qbsConfiguration() const;
Internal::QbsProject *project() const override; Internal::QbsProject *qbsProject() const;
bool isEnabled() const override; bool isEnabled() const override;
QString disabledReason() const override; QString disabledReason() const override;