From c6ef3addcc73ebf69cf21b5ba947e59bd9587f15 Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 20 Oct 2014 23:13:13 +0200 Subject: [PATCH] Make expanders work with subexpanders Change-Id: I30bad85ce2fbaf1f02043b3d97f657461f5a1995 Reviewed-by: Tobias Hunger --- src/libs/utils/macroexpander.cpp | 50 ++++- src/libs/utils/macroexpander.h | 17 ++ src/plugins/coreplugin/variablechooser.cpp | 183 +++++++++++++----- src/plugins/coreplugin/variablechooser.h | 7 +- .../debugger/debuggerkitinformation.cpp | 14 +- src/plugins/debugger/debuggerkitinformation.h | 2 +- src/plugins/projectexplorer/kit.cpp | 19 +- src/plugins/projectexplorer/kit.h | 4 +- .../kitinformationmacroexpander.h | 4 +- src/plugins/projectexplorer/kitmanager.cpp | 8 +- src/plugins/projectexplorer/kitmanager.h | 6 +- .../kitmanagerconfigwidget.cpp | 8 +- .../projectexplorer/projectexplorer.cpp | 2 +- .../projectexplorer/projectmacroexpander.cpp | 14 +- .../projectexplorer/projectmacroexpander.h | 1 - .../projectexplorer/settingsaccessor.cpp | 2 +- src/plugins/qtsupport/baseqtversion.cpp | 6 +- src/plugins/qtsupport/qtkitinformation.cpp | 27 ++- src/plugins/qtsupport/qtkitinformation.h | 3 +- 19 files changed, 247 insertions(+), 130 deletions(-) diff --git a/src/libs/utils/macroexpander.cpp b/src/libs/utils/macroexpander.cpp index 9dc456cf832..a7ec1f9b08f 100644 --- a/src/libs/utils/macroexpander.cpp +++ b/src/libs/utils/macroexpander.cpp @@ -30,6 +30,8 @@ #include "macroexpander.h" +#include "algorithm.h" + #include #include #include @@ -46,10 +48,15 @@ const char kFileBaseNamePostfix[] = ":FileBaseName"; class MacroExpanderPrivate { public: + MacroExpanderPrivate() : m_accumulating(false) {} + QHash m_map; QHash m_prefixMap; QMap m_descriptions; QString m_displayName; + QVector m_subProviders; + QVector m_subExpanders; // Not owned + bool m_accumulating; }; } // Internal @@ -184,7 +191,18 @@ bool MacroExpander::resolveMacro(const QString &name, QString *ret) { bool found; *ret = value(name.toUtf8(), &found); - return found; + if (found) + return true; + + found = Utils::anyOf(d->m_subProviders, [name, ret] (const MacroExpanderProvider &p) -> bool { + MacroExpander *expander = p ? p() : 0; + return expander && expander->resolveMacro(name, ret); + }); + + if (found) + return true; + + return this == globalMacroExpander() ? false : globalMacroExpander()->resolveMacro(name, ret); } /*! @@ -223,9 +241,8 @@ QString MacroExpander::value(const QByteArray &variable, bool *found) */ QString MacroExpander::expand(const QString &stringWithVariables) { - QString res = Utils::expandMacros(stringWithVariables, this); - if (this != globalMacroExpander()) - res = Utils::expandMacros(res, this); + QString res = stringWithVariables; + Utils::expandMacros(&res, this); return res; } @@ -329,6 +346,17 @@ QString MacroExpander::variableDescription(const QByteArray &variable) return d->m_descriptions.value(variable); } +MacroExpanders MacroExpander::subExpanders() const +{ + MacroExpanders expanders; + foreach (const MacroExpanderProvider &provider, d->m_subProviders) + if (provider) + if (MacroExpander *expander = provider()) + expanders.append(expander); + + return expanders; +} + QString MacroExpander::displayName() const { return d->m_displayName; @@ -339,6 +367,20 @@ void MacroExpander::setDisplayName(const QString &displayName) d->m_displayName = displayName; } +void MacroExpander::registerSubProvider(const MacroExpanderProvider &provider) +{ + d->m_subProviders.append(provider); +} + +bool MacroExpander::isAccumulating() const +{ + return d->m_accumulating; +} + +void MacroExpander::setAccumulating(bool on) +{ + d->m_accumulating = on; +} class GlobalMacroExpander : public MacroExpander { diff --git a/src/libs/utils/macroexpander.h b/src/libs/utils/macroexpander.h index a2d90734653..c11cb92dbd6 100644 --- a/src/libs/utils/macroexpander.h +++ b/src/libs/utils/macroexpander.h @@ -35,12 +35,22 @@ #include +#include +#include +#include + namespace Utils { namespace Internal { class MacroExpanderPrivate; } +class MacroExpander; +typedef std::function MacroExpanderProvider; +typedef QVector MacroExpanders; + class QTCREATOR_UTILS_EXPORT MacroExpander : public AbstractMacroExpander { + Q_DECLARE_TR_FUNCTIONS("MacroExpander") + public: explicit MacroExpander(); ~MacroExpander(); @@ -71,9 +81,16 @@ public: QList variables(); QString variableDescription(const QByteArray &variable); + MacroExpanders subExpanders() const; + QString displayName() const; void setDisplayName(const QString &displayName); + void registerSubProvider(const MacroExpanderProvider &provider); + + bool isAccumulating() const; + void setAccumulating(bool on); + private: MacroExpander(const MacroExpander &) Q_DECL_EQ_DELETE; void operator=(const MacroExpander &) Q_DECL_EQ_DELETE; diff --git a/src/plugins/coreplugin/variablechooser.cpp b/src/plugins/coreplugin/variablechooser.cpp index 3e3353e4c85..1c793e9e101 100644 --- a/src/plugins/coreplugin/variablechooser.cpp +++ b/src/plugins/coreplugin/variablechooser.cpp @@ -32,6 +32,7 @@ #include "coreconstants.h" #include // IconButton +#include // IconButton #include #include #include @@ -42,6 +43,7 @@ #include #include #include +#include #include #include #include @@ -55,6 +57,31 @@ using namespace Utils; namespace Core { namespace Internal { +enum { + UnexpandedTextRole = Qt::UserRole, + ExpandedTextRole +}; + +class VariableTreeView : public QTreeView +{ +public: + VariableTreeView(QWidget *parent, VariableChooserPrivate *target) + : QTreeView(parent), m_target(target) + { + setAttribute(Qt::WA_MacSmallSize); + setAttribute(Qt::WA_MacShowFocusRect, false); + setIndentation(indentation() * 7/10); + header()->hide(); + new Utils::HeaderViewStretcher(header(), 0); + } + + void contextMenuEvent(QContextMenuEvent *ev); + +private: + VariableChooserPrivate *m_target; +}; + + class VariableChooserPrivate : public QObject { public: @@ -73,7 +100,7 @@ public: void updateDescription(const QModelIndex &index); void updateCurrentEditor(QWidget *old, QWidget *widget); void handleItemActivated(const QModelIndex &index); - void insertVariable(const QString &variable); + void insertText(const QString &variable); void updatePositionAndShow(bool); QWidget *currentWidget(); @@ -87,40 +114,17 @@ public: QPointer m_plainTextEdit; QPointer m_iconButton; - QTreeView *m_variableTree; + VariableTreeView *m_variableTree; QLabel *m_variableDescription; QString m_defaultDescription; QByteArray m_currentVariableName; // Prevent recursive insertion of currently expanded item }; -class VariableItem : public TreeItem -{ -public: - VariableItem() - {} - - QVariant data(int column, int role) const - { - if (role == Qt::DisplayRole || role == Qt::EditRole) { - if (column == 0) - return m_display; - } - if (role == Qt::ToolTipRole) - return m_description; - - return QVariant(); - } - -public: - QString m_display; - QString m_description; -}; - class VariableGroupItem : public TreeItem { public: - VariableGroupItem(VariableChooserPrivate *chooser) - : m_chooser(chooser), m_expander(0) + VariableGroupItem() + : m_chooser(0), m_expander(0) { setLazy(true); } @@ -138,30 +142,87 @@ public: if (column == 0 && ensureExpander()) return m_expander->displayName(); } + return QVariant(); } void populate() { - if (ensureExpander()) { - foreach (const QByteArray &variable, m_expander->variables()) { - auto item = new VariableItem; - item->m_display = QString::fromLatin1(variable); - item->m_description = m_expander->variableDescription(variable); - if (variable == m_chooser->m_currentVariableName) - item->setFlags(Qt::ItemIsSelectable); // not ItemIsEnabled - appendChild(item); - } - } + if (ensureExpander()) + populateGroup(m_expander); } + void populateGroup(MacroExpander *expander); + public: VariableChooserPrivate *m_chooser; // Not owned. MacroExpanderProvider m_provider; mutable MacroExpander *m_expander; // Not owned. - QString m_displayName; }; +class VariableItem : public TreeItem +{ +public: + VariableItem() {} + + QVariant data(int column, int role) const + { + if (role == Qt::DisplayRole || role == Qt::EditRole) { + if (column == 0) + return m_variable; + } + + if (role == Qt::ToolTipRole) + return m_expander->variableDescription(m_variable.toUtf8()); + + if (role == UnexpandedTextRole) + return QString(QLatin1String("%{") + m_variable + QLatin1Char('}')); + + if (role == ExpandedTextRole) + return m_expander->expand(QLatin1String("%{") + m_variable + QLatin1Char('}')); + + return QVariant(); + } + +public: + MacroExpander *m_expander; + QString m_variable; +}; + +void VariableTreeView::contextMenuEvent(QContextMenuEvent *ev) +{ + const QModelIndex index = indexAt(ev->pos()); + + QString unexpandedText = index.data(UnexpandedTextRole).toString(); + QString expandedText = index.data(ExpandedTextRole).toString(); + + QMenu menu; + QAction *insertUnexpandedAction = 0; + QAction *insertExpandedAction = 0; + + if (unexpandedText.isEmpty()) { + insertUnexpandedAction = menu.addAction(tr("Insert unexpanded value")); + insertUnexpandedAction->setEnabled(false); + } else { + insertUnexpandedAction = menu.addAction(tr("Insert \"%1\"").arg(unexpandedText)); + } + + if (expandedText.isEmpty()) { + insertExpandedAction = menu.addAction(tr("Insert expanded value")); + insertExpandedAction->setEnabled(false); + } else { + insertExpandedAction = menu.addAction(tr("Insert \"%1\"").arg(expandedText)); + } + + + QAction *act = menu.exec(ev->globalPos()); + + if (act == insertUnexpandedAction) + m_target->insertText(unexpandedText); + else if (act == insertExpandedAction) + m_target->insertText(expandedText); +} + VariableChooserPrivate::VariableChooserPrivate(VariableChooser *parent) : q(parent), m_lineEdit(0), @@ -170,12 +231,8 @@ VariableChooserPrivate::VariableChooserPrivate(VariableChooser *parent) { m_defaultDescription = VariableChooser::tr("Select a variable to insert."); - m_variableTree = new QTreeView(q); - m_variableTree->setAttribute(Qt::WA_MacSmallSize); - m_variableTree->setAttribute(Qt::WA_MacShowFocusRect, false); + m_variableTree = new VariableTreeView(q, this); m_variableTree->setModel(&m_model); - m_variableTree->header()->hide(); - m_variableTree->header()->setStretchLastSection(true); m_variableDescription = new QLabel(q); m_variableDescription->setText(m_defaultDescription); @@ -189,8 +246,6 @@ VariableChooserPrivate::VariableChooserPrivate(VariableChooser *parent) verticalLayout->addWidget(m_variableTree); verticalLayout->addWidget(m_variableDescription); - // connect(m_variableList, &QTreeView::currentChanged, - // this, &VariableChooserPrivate::updateDescription); connect(m_variableTree, &QTreeView::clicked, this, &VariableChooserPrivate::updateDescription); connect(m_variableTree, &QTreeView::activated, @@ -200,6 +255,29 @@ VariableChooserPrivate::VariableChooserPrivate(VariableChooser *parent) updateCurrentEditor(0, qApp->focusWidget()); } +void VariableGroupItem::populateGroup(MacroExpander *expander) +{ + foreach (const QByteArray &variable, expander->variables()) { + auto item = new VariableItem; + item->m_variable = QString::fromUtf8(variable); + item->m_expander = expander; + if (variable == m_chooser->m_currentVariableName) + item->setFlags(Qt::ItemIsSelectable); // not ItemIsEnabled + appendChild(item); + } + + foreach (MacroExpander *subExpander, expander->subExpanders()) { + if (expander->isAccumulating()) { + populateGroup(subExpander); + } else { + auto item = new VariableGroupItem; + item->m_chooser = m_chooser; + item->m_expander = subExpander; + appendChild(item); + } + } +} + } // namespace Internal using namespace Internal; @@ -274,7 +352,8 @@ VariableChooser::~VariableChooser() void VariableChooser::addMacroExpanderProvider(const MacroExpanderProvider &provider) { - auto *item = new VariableGroupItem(d); + auto item = new VariableGroupItem; + item->m_chooser = d; item->m_provider = provider; d->m_model.rootItem()->prependChild(item); } @@ -378,6 +457,7 @@ void VariableChooserPrivate::updatePositionAndShow(bool) q->show(); q->raise(); q->activateWindow(); + m_variableTree->expandAll(); } /*! @@ -397,15 +477,16 @@ QWidget *VariableChooserPrivate::currentWidget() */ void VariableChooserPrivate::handleItemActivated(const QModelIndex &index) { - insertVariable(m_model.data(index, Qt::DisplayRole).toString()); + QString text = m_model.data(index, UnexpandedTextRole).toString(); + if (!text.isEmpty()) + insertText(text); } /*! * \internal */ -void VariableChooserPrivate::insertVariable(const QString &variable) +void VariableChooserPrivate::insertText(const QString &text) { - const QString text = QLatin1String("%{") + variable + QLatin1Char('}'); if (m_lineEdit) { m_lineEdit->insert(text); m_lineEdit->activateWindow(); @@ -434,9 +515,9 @@ static bool handleEscapePressed(QKeyEvent *ke, QWidget *widget) /*! * \internal */ -void VariableChooser::keyPressEvent(QKeyEvent *ke) +void VariableChooser::keyPressEvent(QKeyEvent *ev) { - handleEscapePressed(ke, this); + handleEscapePressed(ev, this); } /*! diff --git a/src/plugins/coreplugin/variablechooser.h b/src/plugins/coreplugin/variablechooser.h index dd24550596f..7c4a1568bd2 100644 --- a/src/plugins/coreplugin/variablechooser.h +++ b/src/plugins/coreplugin/variablechooser.h @@ -35,6 +35,7 @@ #include +#include #include namespace Utils { class MacroExpander; } @@ -43,8 +44,6 @@ namespace Core { namespace Internal { class VariableChooserPrivate; } -typedef std::function MacroExpanderProvider; - class CORE_EXPORT VariableChooser : public QWidget { Q_OBJECT @@ -53,11 +52,11 @@ public: explicit VariableChooser(QWidget *parent = 0); ~VariableChooser(); - void addMacroExpanderProvider(const MacroExpanderProvider &provider); + void addMacroExpanderProvider(const Utils::MacroExpanderProvider &provider); void addSupportedWidget(QWidget *textcontrol, const QByteArray &ownName = QByteArray()); protected: - void keyPressEvent(QKeyEvent *ke); + void keyPressEvent(QKeyEvent *ev); bool eventFilter(QObject *, QEvent *event); private: diff --git a/src/plugins/debugger/debuggerkitinformation.cpp b/src/plugins/debugger/debuggerkitinformation.cpp index 6a9bb7edb34..12af19eda06 100644 --- a/src/plugins/debugger/debuggerkitinformation.cpp +++ b/src/plugins/debugger/debuggerkitinformation.cpp @@ -302,15 +302,13 @@ KitConfigWidget *DebuggerKitInformation::createConfigWidget(Kit *k) const return new Internal::DebuggerKitConfigWidget(k, this); } -bool DebuggerKitInformation::resolveMacro(const Kit *kit, const QString &name, QString *ret) const +void DebuggerKitInformation::addToMacroExpander(Kit *kit, MacroExpander *expander) const { - const DebuggerItem *item = debugger(kit); - if (name == QLatin1String("Debugger:engineType")) { - *ret = item ? item->engineTypeName() : tr("none"); - return true; - } - - return false; + expander->registerVariable("Debugger:engineType", tr("Type of Debugger Backend"), + [this, kit]() -> QString { + const DebuggerItem *item = debugger(kit); + return item ? item->engineTypeName() : tr("unknown"); + }); } KitInformation::ItemList DebuggerKitInformation::toUserOutput(const Kit *k) const diff --git a/src/plugins/debugger/debuggerkitinformation.h b/src/plugins/debugger/debuggerkitinformation.h index 026ba180c9e..3e56cc39a21 100644 --- a/src/plugins/debugger/debuggerkitinformation.h +++ b/src/plugins/debugger/debuggerkitinformation.h @@ -63,7 +63,7 @@ public: static bool isValidDebugger(const ProjectExplorer::Kit *k); ProjectExplorer::KitConfigWidget *createConfigWidget(ProjectExplorer::Kit *k) const; - bool resolveMacro(const ProjectExplorer::Kit *kit, const QString &name, QString *ret) const; + void addToMacroExpander(ProjectExplorer::Kit *kit, Utils::MacroExpander *expander) const; ItemList toUserOutput(const ProjectExplorer::Kit *k) const; diff --git a/src/plugins/projectexplorer/kit.cpp b/src/plugins/projectexplorer/kit.cpp index 683cbf4aa6e..243568f2949 100644 --- a/src/plugins/projectexplorer/kit.cpp +++ b/src/plugins/projectexplorer/kit.cpp @@ -61,6 +61,7 @@ const char MUTABLE_INFO_KEY[] = "PE.Profile.MutableInfo"; const char STICKY_INFO_KEY[] = "PE.Profile.StickyInfo"; namespace ProjectExplorer { +namespace Internal { // -------------------------------------------------------------------- // KitMacroExpander: @@ -69,26 +70,20 @@ namespace ProjectExplorer { class KitMacroExpander : public MacroExpander { public: - KitMacroExpander(Kit *kit) : m_kit(kit) {} - - bool resolveMacro(const QString &name, QString *ret) + explicit KitMacroExpander(Kit *kit) { + setDisplayName(QCoreApplication::translate("ProjectExplorer::Kit", "Kit")); + setAccumulating(true); + foreach (KitInformation *ki, KitManager::kitInformation()) - if (ki->resolveMacro(m_kit, name, ret)) - return true; - - return false; + ki->addToMacroExpander(kit, this); } - -private: - Kit *m_kit; }; // ------------------------------------------------------------------------- // KitPrivate // ------------------------------------------------------------------------- -namespace Internal { class KitPrivate { @@ -663,7 +658,7 @@ bool Kit::hasFeatures(const FeatureSet &features) const return availableFeatures().contains(features); } -AbstractMacroExpander *Kit::macroExpander() const +MacroExpander *Kit::macroExpander() const { return &d->m_macroExpander; } diff --git a/src/plugins/projectexplorer/kit.h b/src/plugins/projectexplorer/kit.h index 50488550d8c..a5ccecf588e 100644 --- a/src/plugins/projectexplorer/kit.h +++ b/src/plugins/projectexplorer/kit.h @@ -40,8 +40,8 @@ #include namespace Utils { -class AbstractMacroExpander; class Environment; +class MacroExpander; } // namespace Utils namespace ProjectExplorer { @@ -128,9 +128,9 @@ public: QString displayNameForPlatform(const QString &platform) const; Core::FeatureSet availableFeatures() const; bool hasFeatures(const Core::FeatureSet &features) const; + Utils::MacroExpander *macroExpander() const; private: - Utils::AbstractMacroExpander *macroExpander() const; void setSdkProvided(bool sdkProvided); ~Kit(); diff --git a/src/plugins/projectexplorer/kitinformationmacroexpander.h b/src/plugins/projectexplorer/kitinformationmacroexpander.h index e92d96e1a3f..f5dabd396f3 100644 --- a/src/plugins/projectexplorer/kitinformationmacroexpander.h +++ b/src/plugins/projectexplorer/kitinformationmacroexpander.h @@ -33,7 +33,7 @@ #include "projectexplorer_export.h" -#include +#include namespace ProjectExplorer { @@ -43,7 +43,7 @@ class Kit; // KitInformationMacroExpander: // -------------------------------------------------------------------------- -class PROJECTEXPLORER_EXPORT KitInformationMacroExpander : public Utils::AbstractMacroExpander +class PROJECTEXPLORER_EXPORT KitInformationMacroExpander : public Utils::MacroExpander { public: KitInformationMacroExpander(const Kit *k); diff --git a/src/plugins/projectexplorer/kitmanager.cpp b/src/plugins/projectexplorer/kitmanager.cpp index 1e3720a2464..fee4a52b1c1 100644 --- a/src/plugins/projectexplorer/kitmanager.cpp +++ b/src/plugins/projectexplorer/kitmanager.cpp @@ -585,12 +585,10 @@ FeatureSet KitInformation::availableFeatures(const Kit *k) const return FeatureSet(); } -bool KitInformation::resolveMacro(const Kit *kit, const QString &name, QString *ret) const +void KitInformation::addToMacroExpander(Kit *k, MacroExpander *expander) const { - Q_UNUSED(kit); - Q_UNUSED(name); - Q_UNUSED(ret); - return false; + Q_UNUSED(k); + Q_UNUSED(expander); } void KitInformation::notifyAboutUpdate(Kit *k) diff --git a/src/plugins/projectexplorer/kitmanager.h b/src/plugins/projectexplorer/kitmanager.h index b475b49b5a4..f2c723df329 100644 --- a/src/plugins/projectexplorer/kitmanager.h +++ b/src/plugins/projectexplorer/kitmanager.h @@ -42,9 +42,9 @@ #include namespace Utils { -class AbstractMacroExpander; -class FileName; class Environment; +class FileName; +class MacroExpander; } namespace ProjectExplorer { @@ -99,7 +99,7 @@ public: virtual QString displayNameForPlatform(const Kit *k, const QString &platform) const; virtual Core::FeatureSet availableFeatures(const Kit *k) const; - virtual bool resolveMacro(const Kit *kit, const QString &name, QString *ret) const; + virtual void addToMacroExpander(ProjectExplorer::Kit *kit, Utils::MacroExpander *expander) const; protected: void setId(Core::Id id) { m_id = id; } diff --git a/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp b/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp index 5eab274fd86..290343929bb 100644 --- a/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp +++ b/src/plugins/projectexplorer/kitmanagerconfigwidget.cpp @@ -35,9 +35,11 @@ #include "kitmanager.h" #include "task.h" +#include + #include #include -#include +#include #include #include @@ -118,6 +120,10 @@ KitManagerConfigWidget::KitManagerConfigWidget(Kit *k) : this, &KitManagerConfigWidget::workingCopyWasUpdated); connect(km, &KitManager::kitUpdated, this, &KitManagerConfigWidget::kitWasUpdated); + + auto chooser = new Core::VariableChooser(this); + chooser->addSupportedWidget(m_nameEdit); + chooser->addMacroExpanderProvider([this]() { return m_modifiedKit->macroExpander(); }); } KitManagerConfigWidget::~KitManagerConfigWidget() diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 16a1bb2b97b..b03b9a11a12 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -363,7 +363,7 @@ static QString variableValue(const char *variable) } ProjectMacroExpander expander(projectFilePath, projectName, kit, buildConfigurationName); QString result; - expander.resolveProjectMacro(QString::fromUtf8(variable), &result); + expander.resolveMacro(QString::fromUtf8(variable), &result); return result; } diff --git a/src/plugins/projectexplorer/projectmacroexpander.cpp b/src/plugins/projectexplorer/projectmacroexpander.cpp index fc98079a5ee..a102920e49a 100644 --- a/src/plugins/projectexplorer/projectmacroexpander.cpp +++ b/src/plugins/projectexplorer/projectmacroexpander.cpp @@ -43,7 +43,7 @@ ProjectMacroExpander::ProjectMacroExpander(const QString &projectFilePath, const : m_projectFile(projectFilePath), m_projectName(projectName), m_kit(k), m_bcName(bcName) { } -bool ProjectMacroExpander::resolveProjectMacro(const QString &name, QString *ret) +bool ProjectMacroExpander::resolveMacro(const QString &name, QString *ret) { QString result; bool found = false; @@ -93,15 +93,3 @@ bool ProjectMacroExpander::resolveProjectMacro(const QString &name, QString *ret *ret = result; return found; } - -// Try to resolve using local information, otherwise fall back to global variables. -bool ProjectMacroExpander::resolveMacro(const QString &name, QString *ret) -{ - bool found = resolveProjectMacro(name, ret); - if (!found) { - QString result = Utils::globalMacroExpander()->value(name.toUtf8(), &found); - if (ret) - *ret = result; - } - return found; -} diff --git a/src/plugins/projectexplorer/projectmacroexpander.h b/src/plugins/projectexplorer/projectmacroexpander.h index 786d2b34581..aead773845e 100644 --- a/src/plugins/projectexplorer/projectmacroexpander.h +++ b/src/plugins/projectexplorer/projectmacroexpander.h @@ -42,7 +42,6 @@ class PROJECTEXPLORER_EXPORT ProjectMacroExpander : public Utils::MacroExpander { public: ProjectMacroExpander(const QString &projectFilePath, const QString &projectName, const Kit *k, const QString &bcName); - bool resolveProjectMacro(const QString &name, QString *ret); bool resolveMacro(const QString &name, QString *ret); private: diff --git a/src/plugins/projectexplorer/settingsaccessor.cpp b/src/plugins/projectexplorer/settingsaccessor.cpp index 5b891d1a819..c638ab47c73 100644 --- a/src/plugins/projectexplorer/settingsaccessor.cpp +++ b/src/plugins/projectexplorer/settingsaccessor.cpp @@ -115,7 +115,7 @@ QVariantMap VersionUpgrader::renameKeys(const QList &changes, QVariantMa } // ProjectExplorer using namespace ProjectExplorer; -using namespace Internal; +using namespace ProjectExplorer::Internal; namespace { diff --git a/src/plugins/qtsupport/baseqtversion.cpp b/src/plugins/qtsupport/baseqtversion.cpp index 42d9f0501e2..b21f2cec042 100644 --- a/src/plugins/qtsupport/baseqtversion.cpp +++ b/src/plugins/qtsupport/baseqtversion.cpp @@ -234,6 +234,9 @@ void BaseQtVersion::ctor(const FileName &qmakePath) void BaseQtVersion::setupExpander() { + m_expander.setDisplayName( + QCoreApplication::translate("QtSupport::QtKitInformation", "Qt version")); + m_expander.registerVariable("Qt:version", QCoreApplication::translate("QtSupport::QtKitInformation", "The version string of the current Qt version."), [this]() { return qtVersionString(); }); @@ -250,9 +253,6 @@ void BaseQtVersion::setupExpander() // m_expander.registerVariable("Qt:name", // QCoreApplication::translate("QtSupport::QtKitInformation", "The display name of the current Qt version."), // [this]() { return displayName(); }); - - m_expander.setDisplayName( - QCoreApplication::translate("QtSupport::QtKitInformation", "Qt version")); } BaseQtVersion::~BaseQtVersion() diff --git a/src/plugins/qtsupport/qtkitinformation.cpp b/src/plugins/qtsupport/qtkitinformation.cpp index 278dc7525fd..51d0e3d418b 100644 --- a/src/plugins/qtsupport/qtkitinformation.cpp +++ b/src/plugins/qtsupport/qtkitinformation.cpp @@ -132,24 +132,19 @@ ProjectExplorer::IOutputParser *QtKitInformation::createOutputParser(const Proje return 0; } -bool QtKitInformation::resolveMacro(const ProjectExplorer::Kit *kit, const QString &name, QString *ret) const +void QtKitInformation::addToMacroExpander(Kit *kit, MacroExpander *expander) const { - if (BaseQtVersion *version = qtVersion(kit)) { - MacroExpander *expander = version->macroExpander(); - if (expander->resolveMacro(name, ret)) - return true; + expander->registerSubProvider( + [this, kit]() -> MacroExpander * { + BaseQtVersion *version = qtVersion(kit); + return version ? version->macroExpander() : 0; + }); - // FIXME: Handle in version expander once we can detect loops. - if (name == QLatin1String("Qt:name")) { - *ret = version->displayName(); - return true; - } - } - - if (Utils::globalMacroExpander()->resolveMacro(name, ret)) - return true; - - return false; + expander->registerVariable("Qt:name", tr("Name of Qt Version"), + [this, kit]() -> QString { + BaseQtVersion *version = qtVersion(kit); + return version ? version->displayName() : tr("unknown"); + }); } Core::Id QtKitInformation::id() diff --git a/src/plugins/qtsupport/qtkitinformation.h b/src/plugins/qtsupport/qtkitinformation.h index 9df94990eec..ccacc9a8749 100644 --- a/src/plugins/qtsupport/qtkitinformation.h +++ b/src/plugins/qtsupport/qtkitinformation.h @@ -62,8 +62,7 @@ public: void addToEnvironment(const ProjectExplorer::Kit *k, Utils::Environment &env) const; ProjectExplorer::IOutputParser *createOutputParser(const ProjectExplorer::Kit *k) const; - - bool resolveMacro(const ProjectExplorer::Kit *kit, const QString &name, QString *ret) const; + void addToMacroExpander(ProjectExplorer::Kit *kit, Utils::MacroExpander *expander) const; static Core::Id id(); static int qtVersionId(const ProjectExplorer::Kit *k);