diff --git a/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp b/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp index 1caa79c8fa7..bcf647d11a0 100644 --- a/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp +++ b/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp @@ -256,7 +256,7 @@ Runnable CustomExecutableRunConfiguration::runnable() const aspect()->workingDirectory(macroExpander()); Runnable r; - r.executable = aspect()->executable().toString(); + r.executable = executable().toString(); r.commandLineArguments = aspect()->arguments(macroExpander()); r.environment = aspect()->environment(); r.workingDirectory = workingDirectory.toString(); diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 5b3227fabbe..fe788a7d9aa 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -1614,14 +1614,8 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er tr("The currently active run configuration's executable (if applicable)."), []() -> QString { if (Target *target = activeTarget()) { - if (RunConfiguration *rc = target->activeRunConfiguration()) { - // TODO: This duplicates code and is not always correct, but see - // QTCREATORBUG-18317. - // Solution: Re-introduce RunConfiguration::executable()? - if (auto executableAspect = rc->aspect()) - return executableAspect->executable().toString(); - return QString(); - } + if (RunConfiguration *rc = target->activeRunConfiguration()) + return rc->executable().toString(); } return QString(); }); diff --git a/src/plugins/projectexplorer/runconfiguration.cpp b/src/plugins/projectexplorer/runconfiguration.cpp index 6163c96dada..f29564de56e 100644 --- a/src/plugins/projectexplorer/runconfiguration.cpp +++ b/src/plugins/projectexplorer/runconfiguration.cpp @@ -200,6 +200,12 @@ RunConfiguration::RunConfiguration(Target *target, Core::Id id) for (const AspectFactory &factory : theAspectFactories) m_aspects.append(factory(target)); + + m_executableGetter = [this] { + if (const auto executableAspect = aspect()) + return executableAspect->executable(); + return FileName(); + }; } RunConfiguration::~RunConfiguration() = default; @@ -321,6 +327,16 @@ QVariantMap RunConfiguration::toMap() const return map; } +void RunConfiguration::setExecutableGetter(const RunConfiguration::ExecutableGetter &exeGetter) +{ + m_executableGetter = exeGetter; +} + +FileName RunConfiguration::executable() const +{ + return m_executableGetter(); +} + BuildTargetInfo RunConfiguration::buildTargetInfo() const { return target()->buildTarget(m_buildKey); @@ -376,8 +392,7 @@ bool RunConfiguration::fromMap(const QVariantMap &map) Runnable RunConfiguration::runnable() const { Runnable r; - if (auto executableAspect = aspect()) - r.executable = executableAspect->executable().toString(); + r.executable = executable().toString(); if (auto argumentsAspect = aspect()) r.commandLineArguments = argumentsAspect->arguments(macroExpander()); if (auto workingDirectoryAspect = aspect()) diff --git a/src/plugins/projectexplorer/runconfiguration.h b/src/plugins/projectexplorer/runconfiguration.h index a1a8440ee69..77b9846471b 100644 --- a/src/plugins/projectexplorer/runconfiguration.h +++ b/src/plugins/projectexplorer/runconfiguration.h @@ -160,6 +160,10 @@ public: bool fromMap(const QVariantMap &map) override; QVariantMap toMap() const override; + using ExecutableGetter = std::function; + void setExecutableGetter(const ExecutableGetter &exeGetter); + Utils::FileName executable() const; + virtual Runnable runnable() const; // Return a handle to the build system target that created this run configuration. @@ -210,6 +214,7 @@ private: QString m_buildKey; bool m_isEnabled = false; std::function m_outputFormatterCreator; + ExecutableGetter m_executableGetter; }; class RunConfigurationCreationInfo diff --git a/src/plugins/pythoneditor/pythoneditorplugin.cpp b/src/plugins/pythoneditor/pythoneditorplugin.cpp index 1448546cbdd..fe5c7189dca 100644 --- a/src/plugins/pythoneditor/pythoneditorplugin.cpp +++ b/src/plugins/pythoneditor/pythoneditorplugin.cpp @@ -279,6 +279,9 @@ PythonRunConfiguration::PythonRunConfiguration(Target *target, Core::Id id) addAspect(); setOutputFormatter(); + setExecutableGetter([this] { + return FileName::fromString(aspect()->value()); + }); connect(target, &Target::applicationTargetsChanged, this, &PythonRunConfiguration::updateTargetInformation); @@ -300,7 +303,7 @@ Runnable PythonRunConfiguration::runnable() const QtcProcess::addArg(&r.commandLineArguments, mainScript()); QtcProcess::addArgs(&r.commandLineArguments, aspect()->arguments(macroExpander())); - r.executable = aspect()->value(); + r.executable = executable().toString(); r.environment = aspect()->environment(); return r; } diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp index 5c2f5128220..fa4625c535a 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp @@ -298,9 +298,11 @@ QmlProjectRunConfiguration::QmlProjectRunConfiguration(Target *target, Id id) return envModifier(Environment()); }); + setExecutableGetter([this] { return FileName::fromString(theExecutable()); }); + m_qmlViewerAspect = addAspect(); m_qmlViewerAspect->setLabelText(tr("QML Viewer:")); - m_qmlViewerAspect->setPlaceHolderText(executable()); + m_qmlViewerAspect->setPlaceHolderText(executable().toString()); m_qmlViewerAspect->setDisplayStyle(BaseStringAspect::LineEditDisplay); m_qmlViewerAspect->setHistoryCompleter("QmlProjectManager.viewer.history"); @@ -314,7 +316,6 @@ QmlProjectRunConfiguration::QmlProjectRunConfiguration(Target *target, Id id) this, &QmlProjectRunConfiguration::updateEnabledState); setOutputFormatter(); - connect(target, &Target::kitChanged, this, &QmlProjectRunConfiguration::updateEnabledState); @@ -325,7 +326,7 @@ QmlProjectRunConfiguration::QmlProjectRunConfiguration(Target *target, Id id) Runnable QmlProjectRunConfiguration::runnable() const { Runnable r; - r.executable = executable(); + r.executable = executable().toString(); r.commandLineArguments = commandLineArguments(); r.environment = aspect()->environment(); r.workingDirectory = static_cast(project())->targetDirectory(target()).toString(); @@ -338,7 +339,7 @@ QString QmlProjectRunConfiguration::disabledReason() const return tr("No script file to execute."); if (DeviceTypeKitAspect::deviceTypeId(target()->kit()) == ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE - && !QFileInfo::exists(executable())) { + && !executable().exists()) { return tr("No qmlscene found."); } if (executable().isEmpty()) @@ -346,7 +347,7 @@ QString QmlProjectRunConfiguration::disabledReason() const return RunConfiguration::disabledReason(); } -QString QmlProjectRunConfiguration::executable() const +QString QmlProjectRunConfiguration::theExecutable() const { const QString qmlViewer = m_qmlViewerAspect->value(); if (!qmlViewer.isEmpty()) diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.h b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.h index adfd3103a78..8a18fd0ef97 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.h +++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.h @@ -47,7 +47,7 @@ private: void updateEnabledState() final; QString mainScript() const; - QString executable() const; + QString theExecutable() const; QString commandLineArguments() const; ProjectExplorer::BaseStringAspect *m_qmlViewerAspect;