ProjectExplorer: Display build configuration specific variables again

Continues d308b86847.

Task-number: QTCREATORBUG-31614
Change-Id: I408d96ccd6854b7bb62e13252c00ed3a29788b4c
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
hjk
2024-10-16 16:44:07 +02:00
parent c522831cb3
commit 9b6bbc181b
30 changed files with 58 additions and 125 deletions

View File

@@ -69,6 +69,24 @@ class Internal::BaseAspectPrivate
public:
explicit BaseAspectPrivate(AspectContainer *container) : m_container(container) {}
MacroExpander *macroExpander()
{
if (!m_expander) {
m_expander = std::make_unique<MacroExpander>();
m_expander->setDisplayName("Variables");
if (m_container)
m_expander->registerSubProvider([this] { return m_container->macroExpander(); });
}
return m_expander.get();
}
void setContainer(AspectContainer *container)
{
m_container = container;
if (m_expander)
m_expander->registerSubProvider([this] { return m_container->macroExpander(); });
}
Id m_id;
std::function<QVariant(const QVariant &)> m_toSettings;
std::function<QVariant(const QVariant &)> m_fromSettings;
@@ -96,8 +114,10 @@ public:
BaseAspect::DataCloner m_dataCloner;
QList<BaseAspect::DataExtractor> m_dataExtractors;
MacroExpander *m_expander = globalMacroExpander();
QUndoStack *m_undoStack = nullptr;
private:
std::unique_ptr<MacroExpander> m_expander;
};
/*!
@@ -649,6 +669,11 @@ void BaseAspect::forEachSubWidget(const std::function<void(QWidget *)> &func)
func(w);
}
void BaseAspect::setContainer(AspectContainer *container)
{
d->setContainer(container);
}
void BaseAspect::saveToMap(Store &data, const QVariant &value,
const QVariant &defaultValue, const Key &key)
{
@@ -741,12 +766,14 @@ QVariant BaseAspect::fromSettingsValue(const QVariant &val) const
void BaseAspect::setMacroExpander(MacroExpander *expander)
{
d->m_expander = expander;
d->macroExpander()->clearSubProviders();
if (expander)
d->macroExpander()->registerSubProvider([expander] { return expander; });
}
MacroExpander *BaseAspect::macroExpander() const
{
return d->m_expander;
return d->macroExpander();
}
void BaseAspect::addOnChanged(QObject *guard, const Callback &callback)
@@ -781,15 +808,11 @@ void BaseAspect::addOnLabelPixmapChanged(QObject *guard, const Callback &callbac
void BaseAspect::addMacroExpansion(QWidget *w)
{
if (!d->m_expander)
return;
const auto chooser = new VariableChooser(w);
chooser->addSupportedWidget(w);
if (d->m_expander == globalMacroExpander()) // default for VariableChooser()
return;
chooser->addMacroExpanderProvider([this] { return d->m_expander; });
chooser->addMacroExpanderProvider([this] { return d->macroExpander(); });
if (auto pathChooser = qobject_cast<PathChooser *>(w))
pathChooser->setMacroExpander(d->m_expander);
pathChooser->setMacroExpander(d->macroExpander());
}
namespace Internal {
@@ -3169,6 +3192,7 @@ void AspectContainer::addToLayoutImpl(Layouting::Layout &parent)
*/
void AspectContainer::registerAspect(BaseAspect *aspect, bool takeOwnership)
{
aspect->setContainer(this);
aspect->setAutoApply(isAutoApply());
aspect->setEnabled(isEnabled());
d->m_items.append(aspect);
@@ -3333,14 +3357,6 @@ void AspectContainer::setEnabled(bool enabled)
aspect->setEnabled(enabled);
}
void AspectContainer::setMacroExpander(MacroExpander *expander)
{
BaseAspect::setMacroExpander(expander);
for (BaseAspect *aspect : std::as_const(d->m_items))
aspect->setMacroExpander(expander);
}
bool AspectContainer::equals(const AspectContainer &other) const
{
// FIXME: Expensive, but should not really be needed in a fully aspectified world.

View File

@@ -286,8 +286,11 @@ protected:
}
private:
std::unique_ptr<Internal::BaseAspectPrivate> d;
friend class Internal::CheckableAspectImplementation;
friend class AspectContainer;
void setContainer(AspectContainer *container);
std::unique_ptr<Internal::BaseAspectPrivate> d;
};
QTCREATOR_UTILS_EXPORT void addToLayout(Layouting::Layout *layout, const BaseAspect *aspect);
@@ -999,8 +1002,6 @@ public:
void setUndoStack(QUndoStack *undoStack) override;
void setEnabled(bool enabled) override;
void setMacroExpander(MacroExpander *expander);
template <typename T> T *aspect() const
{
for (BaseAspect *aspect : aspects())

View File

@@ -481,6 +481,11 @@ void MacroExpander::registerSubProvider(const MacroExpanderProvider &provider)
d->m_subProviders.append(provider);
}
void MacroExpander::clearSubProviders()
{
d->m_subProviders.clear();
}
bool MacroExpander::isAccumulating() const
{
return d->m_accumulating;

View File

@@ -23,7 +23,7 @@ class QTCREATOR_UTILS_EXPORT MacroExpander
Q_DISABLE_COPY(MacroExpander)
public:
explicit MacroExpander();
MacroExpander();
~MacroExpander();
bool resolveMacro(const QString &name, QString *ret) const;
@@ -69,6 +69,7 @@ public:
void setDisplayName(const QString &displayName);
void registerSubProvider(const MacroExpanderProvider &provider);
void clearSubProviders();
bool isAccumulating() const;
void setAccumulating(bool on);

View File

@@ -53,7 +53,6 @@ public:
{
environment.addSupportedBaseEnvironment(Tr::tr("Clean Environment"), {});
extraAppArgs.setMacroExpander(macroExpander());
extraAppArgs.addOnChanged(this, [this, target] {
if (target->buildConfigurations().first()->buildType() == BuildConfiguration::BuildType::Release) {
const QString buildKey = target->activeBuildKey();

View File

@@ -562,7 +562,6 @@ public:
&m_localPath,
noMargin};
});
setMacroExpander(nullptr);
}
void updateContent(const PathMapping &mapping)

View File

@@ -30,10 +30,6 @@ public:
executable.setDeviceSelector(target, ExecutableAspect::RunDevice);
executable.setPlaceHolderText(Tr::tr("Unknown"));
arguments.setMacroExpander(macroExpander());
workingDir.setMacroExpander(macroExpander());
setUpdater([this] {
const BuildTargetInfo bti = buildTargetInfo();
executable.setExecutable(bti.targetFilePath);
@@ -60,10 +56,6 @@ public:
executable.setHistoryCompleter("BareMetal.CustomRunConfig.History");
executable.setExpectedKind(PathChooser::Any);
arguments.setMacroExpander(macroExpander());
workingDir.setMacroExpander(macroExpander());
setDefaultDisplayName(RunConfigurationFactory::decoratedTargetName(
Tr::tr("Custom Executable"), target));
setUsesEmptyBuildKeys();

View File

@@ -47,9 +47,6 @@ public:
environment.setDeviceSelector(target, EnvironmentAspect::RunDevice);
arguments.setMacroExpander(macroExpander());
workingDir.setMacroExpander(macroExpander());
workingDir.setEnvironment(&environment);
fullCommand.setLabelText(Tr::tr("Full command line:"));

View File

@@ -37,9 +37,6 @@ public:
executable.setSettingsKey("Haskell.Executable");
executable.setLabelText(Tr::tr("Executable"));
arguments.setMacroExpander(macroExpander());
workingDir.setMacroExpander(macroExpander());
workingDir.setEnvironment(&environment);
workingDir.setDefaultWorkingDirectory(project()->projectDirectory());
workingDir.setVisible(false);

View File

@@ -64,8 +64,6 @@ IosRunConfiguration::IosRunConfiguration(Target *target, Id id)
{
executable.setDeviceSelector(target, ExecutableAspect::RunDevice);
arguments.setMacroExpander(macroExpander());
setUpdater([this, target] {
IDevice::ConstPtr dev = DeviceKitAspect::device(target->kit());
const QString devName = dev ? dev->displayName() : IosDevice::name();

View File

@@ -31,9 +31,6 @@ public:
executable.setDeviceSelector(target, ExecutableAspect::RunDevice);
arguments.setMacroExpander(macroExpander());
workingDir.setMacroExpander(macroExpander());
workingDir.setEnvironment(&environment);
connect(&useLibraryPaths, &BaseAspect::changed,

View File

@@ -24,7 +24,6 @@ public:
NimbleBuildStep(BuildStepList *parentList, Id id)
: AbstractProcessStep(parentList, id)
{
arguments.setMacroExpander(macroExpander());
arguments.setSettingsKey(Constants::C_NIMBLEBUILDSTEP_ARGUMENTS);
arguments.setResetter([this] { return defaultArguments(); });
arguments.setArguments(defaultArguments());

View File

@@ -28,10 +28,6 @@ public:
executable.setDeviceSelector(target, ExecutableAspect::RunDevice);
arguments.setMacroExpander(macroExpander());
workingDir.setMacroExpander(macroExpander());
setUpdater([this] {
BuildTargetInfo bti = buildTargetInfo();
setDisplayName(bti.displayName);
@@ -74,10 +70,8 @@ public:
executable.setDeviceSelector(target, ExecutableAspect::BuildDevice);
executable.setExecutable(Nim::nimblePathFromKit(kit()));
arguments.setMacroExpander(macroExpander());
arguments.setArguments("test");
workingDir.setMacroExpander(macroExpander());
workingDir.setDefaultWorkingDirectory(project()->projectDirectory());
}

View File

@@ -30,10 +30,6 @@ public:
executable.setDeviceSelector(target, ExecutableAspect::RunDevice);
arguments.setMacroExpander(macroExpander());
workingDir.setMacroExpander(macroExpander());
setDisplayName(Tr::tr("Current Build Target"));
setDefaultDisplayName(Tr::tr("Current Build Target"));

View File

@@ -146,7 +146,6 @@ public:
bool m_configWidgetHasFrame = false;
QList<Utils::Id> m_initialBuildSteps;
QList<Utils::Id> m_initialCleanSteps;
Utils::MacroExpander m_macroExpander;
bool m_parseStdOut = false;
QList<Utils::Id> m_customParsers;
@@ -288,11 +287,6 @@ void BuildConfiguration::doInitialize(const BuildInfo &info)
d->m_initializer(info);
}
MacroExpander *BuildConfiguration::macroExpander() const
{
return &d->m_macroExpander;
}
bool BuildConfiguration::createBuildDirectory()
{
const bool result = bool(buildDirectory().ensureWritableDir());

View File

@@ -111,8 +111,6 @@ public:
void doInitialize(const BuildInfo &info);
Utils::MacroExpander *macroExpander() const;
bool createBuildDirectory();
signals:

View File

@@ -15,6 +15,7 @@
#include <utils/fileinprojectfinder.h>
#include <utils/layoutbuilder.h>
#include <utils/macroexpander.h>
#include <utils/outputformatter.h>
#include <utils/variablechooser.h>
@@ -85,10 +86,8 @@ BuildStep::BuildStep(BuildStepList *bsl, Id id)
: ProjectConfiguration(bsl->target(), id)
, m_stepList(bsl)
{
if (auto bc = buildConfiguration())
setMacroExpander(bc->macroExpander());
connect(this, &ProjectConfiguration::displayNameChanged, this, &BuildStep::updateSummary);
macroExpander()->registerSubProvider([bsl] { return bsl->projectConfiguration()->macroExpander(); });
}
QWidget *BuildStep::doCreateConfigWidget()

View File

@@ -32,9 +32,6 @@ CustomExecutableRunConfiguration::CustomExecutableRunConfiguration(Target *targe
executable.setExpectedKind(PathChooser::ExistingCommand);
executable.setEnvironment(environment.environment());
arguments.setMacroExpander(macroExpander());
workingDir.setMacroExpander(macroExpander());
workingDir.setEnvironment(&environment);
connect(&environment, &EnvironmentAspect::environmentChanged, this, [this] {

View File

@@ -32,9 +32,6 @@ protected:
executable.setDeviceSelector(target, ExecutableAspect::RunDevice);
arguments.setMacroExpander(macroExpander());
workingDir.setMacroExpander(macroExpander());
workingDir.setEnvironment(&environment);
connect(&useLibraryPaths, &UseLibraryPathsAspect::changed,

View File

@@ -148,28 +148,27 @@ RunConfiguration::RunConfiguration(Target *target, Utils::Id id)
forceDisplayNameSerialization();
connect(target, &Target::parsingFinished, this, &RunConfiguration::update);
setMacroExpander(&m_expander);
m_expander.setDisplayName(Tr::tr("Run Settings"));
m_expander.setAccumulating(true);
m_expander.registerSubProvider([target] {
MacroExpander &expander = *macroExpander();
expander.setDisplayName(Tr::tr("Run Settings"));
expander.setAccumulating(true);
expander.registerSubProvider([target] {
BuildConfiguration *bc = target->activeBuildConfiguration();
return bc ? bc->macroExpander() : target->macroExpander();
});
m_expander.registerPrefix("RunConfig:Env", Tr::tr("Variables in the run environment."),
expander.registerPrefix("RunConfig:Env", Tr::tr("Variables in the run environment."),
[this](const QString &var) {
const auto envAspect = aspect<EnvironmentAspect>();
return envAspect ? envAspect->environment().expandedValueForKey(var) : QString();
});
m_expander.registerVariable("RunConfig:WorkingDir",
expander.registerVariable("RunConfig:WorkingDir",
Tr::tr("The run configuration's working directory."),
[this] {
const auto wdAspect = aspect<WorkingDirectoryAspect>();
return wdAspect ? wdAspect->workingDirectory().toString() : QString();
});
m_expander.registerVariable("RunConfig:Name", Tr::tr("The run configuration's name."),
expander.registerVariable("RunConfig:Name", Tr::tr("The run configuration's name."),
[this] { return displayName(); });
m_expander.registerFileVariables("RunConfig:Executable",
expander.registerFileVariables("RunConfig:Executable",
Tr::tr("The run configuration's executable."),
[this] { return commandLine().executable(); });
@@ -222,7 +221,7 @@ QWidget *RunConfiguration::createConfigurationWidget()
}
auto widget = form.emerge();
VariableChooser::addSupportForChildWidgets(widget, &m_expander);
VariableChooser::addSupportForChildWidgets(widget, macroExpander());
auto detailsWidget = new Utils::DetailsWidget;
detailsWidget->setState(DetailsWidget::NoSummary);

View File

@@ -203,7 +203,6 @@ private:
CommandLineGetter m_commandLineGetter;
RunnableModifier m_runnableModifier;
Updater m_updater;
Utils::MacroExpander m_expander;
Utils::Store m_pristineState;
bool m_customized = false;
bool m_usesEmptyBuildKeys = false;

View File

@@ -320,11 +320,6 @@ ArgumentsAspect::ArgumentsAspect(AspectContainer *container)
addDataExtractor(this, &ArgumentsAspect::arguments, &Data::arguments);
}
void ArgumentsAspect::setMacroExpander(const MacroExpander *expander)
{
m_macroExpander = expander;
}
/*!
Returns the main value of this aspect.
@@ -332,12 +327,11 @@ void ArgumentsAspect::setMacroExpander(const MacroExpander *expander)
*/
QString ArgumentsAspect::arguments() const
{
QTC_ASSERT(m_macroExpander, return m_arguments);
if (m_currentlyExpanding)
return m_arguments;
m_currentlyExpanding = true;
const QString expanded = m_macroExpander->expandProcessArgs(m_arguments);
const QString expanded = macroExpander()->expandProcessArgs(m_arguments);
m_currentlyExpanding = false;
return expanded;
}
@@ -969,15 +963,9 @@ X11ForwardingAspect::X11ForwardingAspect(AspectContainer *container)
addDataExtractor(this, &X11ForwardingAspect::display, &Data::display);
}
void X11ForwardingAspect::setMacroExpander(const MacroExpander *expander)
{
m_macroExpander = expander;
}
QString X11ForwardingAspect::display() const
{
QTC_ASSERT(m_macroExpander, return value());
return !isChecked() ? QString() : m_macroExpander->expandProcessArgs(value());
return !isChecked() ? QString() : macroExpander()->expandProcessArgs(value());
}

View File

@@ -100,7 +100,6 @@ public:
void setArguments(const QString &arguments);
void setResetter(const std::function<QString()> &resetter);
void resetArguments();
void setMacroExpander(const Utils::MacroExpander *macroExpander);
struct Data : BaseAspect::Data
{
@@ -121,7 +120,6 @@ private:
bool m_multiLine = false;
mutable bool m_currentlyExpanding = false;
std::function<QString()> m_resetter;
const Utils::MacroExpander *m_macroExpander = nullptr;
};
class PROJECTEXPLORER_EXPORT UseLibraryPathsAspect : public Utils::BoolAspect
@@ -268,14 +266,9 @@ class PROJECTEXPLORER_EXPORT X11ForwardingAspect : public Utils::StringAspect
public:
X11ForwardingAspect(Utils::AspectContainer *container = nullptr);
void setMacroExpander(const Utils::MacroExpander *macroExpander);
struct Data : StringAspect::Data { QString display; };
QString display() const;
private:
const Utils::MacroExpander *m_macroExpander;
};
} // namespace ProjectExplorer

View File

@@ -119,11 +119,6 @@ public:
environment.setSupportForBuildEnvironment(target);
arguments.setMacroExpander(macroExpander());
workingDir.setMacroExpander(macroExpander());
x11Forwarding.setMacroExpander(macroExpander());
x11Forwarding.setVisible(HostOsInfo::isAnyUnixHost());
interpreter.setLabelText(Tr::tr("Python:"));

View File

@@ -518,9 +518,9 @@ QbsBuildStepConfigWidget::QbsBuildStepConfigWidget(QbsBuildStep *step)
defaultInstallDirCheckBox->setText(QbsProjectManager::Tr::tr("Use default location"));
auto chooser = new VariableChooser(this);
chooser->addMacroExpanderProvider([this] { return m_qbsStep->macroExpander(); });
chooser->addSupportedWidget(propertyEdit);
chooser->addSupportedWidget(installDirChooser->lineEdit());
chooser->addMacroExpanderProvider([step] { return step->macroExpander(); });
propertyEdit->setValidationFunction([this](FancyLineEdit *edit, QString *errorMessage) {
return validateProperties(edit, errorMessage);
});

View File

@@ -69,7 +69,6 @@ QMakeStep::QMakeStep(BuildStepList *bsl, Id id)
buildType.addOption(Tr::tr("Debug"));
buildType.addOption(Tr::tr("Release"));
userArguments.setMacroExpander(macroExpander());
userArguments.setSettingsKey(QMAKE_ARGUMENTS_KEY);
userArguments.setLabelText(Tr::tr("Additional arguments:"));

View File

@@ -84,7 +84,6 @@ QmlProjectRunConfiguration::QmlProjectRunConfiguration(Target *target, Id id)
qmlViewer.setHistoryCompleter("QmlProjectManager.viewer.history");
arguments.setSettingsKey(Constants::QML_VIEWER_ARGUMENTS_KEY);
arguments.setMacroExpander(macroExpander());
setCommandLineGetter([this, target] {
const FilePath qmlRuntime = qmlRuntimeFilePath();
@@ -169,8 +168,6 @@ QmlProjectRunConfiguration::QmlProjectRunConfiguration(Target *target, Id id)
return envModifier(environment);
});
x11Forwarding.setMacroExpander(macroExpander());
setRunnableModifier([this](ProcessRunData &r) {
const QmlBuildSystem *bs = static_cast<QmlBuildSystem *>(activeBuildSystem());
r.workingDirectory = bs->targetDirectory();

View File

@@ -42,9 +42,6 @@ public:
environment.setDeviceSelector(target, EnvironmentAspect::RunDevice);
arguments.setMacroExpander(macroExpander());
workingDir.setMacroExpander(macroExpander());
workingDir.setEnvironment(&environment);
qtLibraries.setSettingsKey("Qt4ProjectManager.QnxRunConfiguration.QtLibPath");

View File

@@ -51,15 +51,10 @@ RemoteLinuxCustomRunConfiguration::RemoteLinuxCustomRunConfiguration(Target *tar
symbolFile.setSettingsKey("RemoteLinux.CustomRunConfig.LocalExecutable");
symbolFile.setLabelText(Tr::tr("Local executable:"));
arguments.setMacroExpander(macroExpander());
workingDir.setMacroExpander(macroExpander());
workingDir.setEnvironment(&environment);
terminal.setVisible(HostOsInfo::isAnyUnixHost());
x11Forwarding.setMacroExpander(macroExpander());
setDefaultDisplayName(runConfigDefaultDisplayName());
setUsesEmptyBuildKeys();
}

View File

@@ -52,15 +52,10 @@ RemoteLinuxRunConfiguration::RemoteLinuxRunConfiguration(Target *target, Id id)
symbolFile.setLabelText(Tr::tr("Executable on host:"));
arguments.setMacroExpander(macroExpander());
workingDir.setMacroExpander(macroExpander());
workingDir.setEnvironment(&environment);
terminal.setVisible(HostOsInfo::isAnyUnixHost());
x11Forwarding.setMacroExpander(macroExpander());
connect(&useLibraryPath, &BaseAspect::changed,
&environment, &EnvironmentAspect::environmentChanged);