forked from qt-creator/qt-creator
Utils: MacroExpander API cosmetics.
Make const-correct, add convenience function for commandline parameter expansion. Change-Id: I12c3651e4e7b8a0a9319d1dfbea676b622b1a41a Reviewed-by: Tobias Hunger <tobias.hunger@theqtcompany.com>
This commit is contained in:
@@ -29,6 +29,7 @@
|
||||
****************************************************************************/
|
||||
|
||||
#include "macroexpander.h"
|
||||
#include "qtcprocess.h"
|
||||
|
||||
#include "algorithm.h"
|
||||
|
||||
@@ -45,11 +46,52 @@ const char kPathPostfix[] = ":Path";
|
||||
const char kFileNamePostfix[] = ":FileName";
|
||||
const char kFileBaseNamePostfix[] = ":FileBaseName";
|
||||
|
||||
class MacroExpanderPrivate
|
||||
class MacroExpanderPrivate : public AbstractMacroExpander
|
||||
{
|
||||
public:
|
||||
MacroExpanderPrivate() : m_accumulating(false) {}
|
||||
|
||||
bool resolveMacro(const QString &name, QString *ret)
|
||||
{
|
||||
bool found;
|
||||
*ret = value(name.toUtf8(), &found);
|
||||
if (found)
|
||||
return true;
|
||||
|
||||
found = Utils::anyOf(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()->d ? false : globalMacroExpander()->d->resolveMacro(name, ret);
|
||||
}
|
||||
|
||||
QString value(const QByteArray &variable, bool *found)
|
||||
{
|
||||
MacroExpander::StringFunction sf = m_map.value(variable);
|
||||
if (sf) {
|
||||
if (found)
|
||||
*found = true;
|
||||
return sf();
|
||||
}
|
||||
|
||||
for (auto it = m_prefixMap.constBegin(); it != m_prefixMap.constEnd(); ++it) {
|
||||
if (variable.startsWith(it.key())) {
|
||||
MacroExpander::PrefixFunction pf = it.value();
|
||||
if (found)
|
||||
*found = true;
|
||||
return pf(QString::fromUtf8(variable.mid(it.key().count())));
|
||||
}
|
||||
}
|
||||
if (found)
|
||||
*found = false;
|
||||
|
||||
return QString();
|
||||
}
|
||||
|
||||
QHash<QByteArray, MacroExpander::StringFunction> m_map;
|
||||
QHash<QByteArray, MacroExpander::PrefixFunction> m_prefixMap;
|
||||
QMap<QByteArray, QString> m_descriptions;
|
||||
@@ -187,49 +229,18 @@ MacroExpander::~MacroExpander()
|
||||
/*!
|
||||
* \internal
|
||||
*/
|
||||
bool MacroExpander::resolveMacro(const QString &name, QString *ret)
|
||||
bool MacroExpander::resolveMacro(const QString &name, QString *ret) const
|
||||
{
|
||||
bool found;
|
||||
*ret = value(name.toUtf8(), &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);
|
||||
return d->resolveMacro(name, ret);
|
||||
}
|
||||
|
||||
/*!
|
||||
* Returns the value of the given \a variable. If \a found is given, it is
|
||||
* set to true if the variable has a value at all, false if not.
|
||||
*/
|
||||
QString MacroExpander::value(const QByteArray &variable, bool *found)
|
||||
QString MacroExpander::value(const QByteArray &variable, bool *found) const
|
||||
{
|
||||
StringFunction sf = d->m_map.value(variable);
|
||||
if (sf) {
|
||||
if (found)
|
||||
*found = true;
|
||||
return sf();
|
||||
}
|
||||
|
||||
for (auto it = d->m_prefixMap.constBegin(); it != d->m_prefixMap.constEnd(); ++it) {
|
||||
if (variable.startsWith(it.key())) {
|
||||
PrefixFunction pf = it.value();
|
||||
if (found)
|
||||
*found = true;
|
||||
return pf(QString::fromUtf8(variable.mid(it.key().count())));
|
||||
}
|
||||
}
|
||||
if (found)
|
||||
*found = false;
|
||||
|
||||
return QString();
|
||||
return d->value(variable, found);
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -239,18 +250,23 @@ QString MacroExpander::value(const QByteArray &variable, bool *found)
|
||||
* \sa MacroExpander
|
||||
* \sa macroExpander()
|
||||
*/
|
||||
QString MacroExpander::expand(const QString &stringWithVariables)
|
||||
QString MacroExpander::expand(const QString &stringWithVariables) const
|
||||
{
|
||||
QString res = stringWithVariables;
|
||||
Utils::expandMacros(&res, this);
|
||||
Utils::expandMacros(&res, d);
|
||||
return res;
|
||||
}
|
||||
|
||||
QByteArray MacroExpander::expand(const QByteArray &stringWithVariables)
|
||||
QByteArray MacroExpander::expand(const QByteArray &stringWithVariables) const
|
||||
{
|
||||
return expand(QString::fromLatin1(stringWithVariables)).toLatin1();
|
||||
}
|
||||
|
||||
QString MacroExpander::expandProcessArgs(const QString &argsWithVariables) const
|
||||
{
|
||||
return QtcProcess::expandMacros(argsWithVariables, d);
|
||||
}
|
||||
|
||||
/*!
|
||||
* Makes the given string-valued \a prefix known to the variable manager,
|
||||
* together with a localized \a description.
|
||||
@@ -333,7 +349,7 @@ void MacroExpander::registerFileVariables(const QByteArray &prefix,
|
||||
* \sa registerVariable()
|
||||
* \sa registerFileVariables()
|
||||
*/
|
||||
QList<QByteArray> MacroExpander::variables()
|
||||
QList<QByteArray> MacroExpander::variables() const
|
||||
{
|
||||
return d->m_descriptions.keys();
|
||||
}
|
||||
@@ -341,7 +357,7 @@ QList<QByteArray> MacroExpander::variables()
|
||||
/*!
|
||||
* Returns the description that was registered for the \a variable.
|
||||
*/
|
||||
QString MacroExpander::variableDescription(const QByteArray &variable)
|
||||
QString MacroExpander::variableDescription(const QByteArray &variable) const
|
||||
{
|
||||
return d->m_descriptions.value(variable);
|
||||
}
|
||||
@@ -357,6 +373,11 @@ MacroExpanders MacroExpander::subExpanders() const
|
||||
return expanders;
|
||||
}
|
||||
|
||||
AbstractMacroExpander *MacroExpander::abstractExpander() const
|
||||
{
|
||||
return d;
|
||||
}
|
||||
|
||||
QString MacroExpander::displayName() const
|
||||
{
|
||||
return d->m_displayName;
|
||||
|
||||
@@ -47,20 +47,22 @@ class MacroExpander;
|
||||
typedef std::function<MacroExpander *()> MacroExpanderProvider;
|
||||
typedef QVector<MacroExpander *> MacroExpanders;
|
||||
|
||||
class QTCREATOR_UTILS_EXPORT MacroExpander : public AbstractMacroExpander
|
||||
class QTCREATOR_UTILS_EXPORT MacroExpander
|
||||
{
|
||||
Q_DECLARE_TR_FUNCTIONS("MacroExpander")
|
||||
|
||||
public:
|
||||
explicit MacroExpander();
|
||||
~MacroExpander();
|
||||
virtual ~MacroExpander();
|
||||
|
||||
bool resolveMacro(const QString &name, QString *ret);
|
||||
virtual bool resolveMacro(const QString &name, QString *ret) const;
|
||||
|
||||
QString value(const QByteArray &variable, bool *found = 0);
|
||||
QString value(const QByteArray &variable, bool *found = 0) const;
|
||||
|
||||
QString expand(const QString &stringWithVariables);
|
||||
QByteArray expand(const QByteArray &stringWithVariables);
|
||||
QString expand(const QString &stringWithVariables) const;
|
||||
QByteArray expand(const QByteArray &stringWithVariables) const;
|
||||
|
||||
QString expandProcessArgs(const QString &argsWithVariables) const;
|
||||
|
||||
typedef std::function<QString(QString)> PrefixFunction;
|
||||
typedef std::function<QString()> StringFunction;
|
||||
@@ -78,10 +80,11 @@ public:
|
||||
void registerFileVariables(const QByteArray &prefix,
|
||||
const QString &heading, const StringFunction &value);
|
||||
|
||||
QList<QByteArray> variables();
|
||||
QString variableDescription(const QByteArray &variable);
|
||||
QList<QByteArray> variables() const;
|
||||
QString variableDescription(const QByteArray &variable) const;
|
||||
|
||||
MacroExpanders subExpanders() const;
|
||||
AbstractMacroExpander *abstractExpander() const;
|
||||
|
||||
QString displayName() const;
|
||||
void setDisplayName(const QString &displayName);
|
||||
@@ -95,6 +98,7 @@ private:
|
||||
MacroExpander(const MacroExpander &) Q_DECL_EQ_DELETE;
|
||||
void operator=(const MacroExpander &) Q_DECL_EQ_DELETE;
|
||||
|
||||
friend class Internal::MacroExpanderPrivate;
|
||||
Internal::MacroExpanderPrivate *d;
|
||||
};
|
||||
|
||||
|
||||
@@ -135,7 +135,7 @@ QString CMakeRunConfiguration::baseWorkingDirectory() const
|
||||
|
||||
QString CMakeRunConfiguration::commandLineArguments() const
|
||||
{
|
||||
return Utils::QtcProcess::expandMacros(m_arguments, macroExpander());
|
||||
return macroExpander()->expandProcessArgs(m_arguments);
|
||||
}
|
||||
|
||||
QString CMakeRunConfiguration::title() const
|
||||
|
||||
@@ -594,6 +594,5 @@ void ExternalToolConfig::addCategory()
|
||||
|
||||
void ExternalToolConfig::updateEffectiveArguments()
|
||||
{
|
||||
ui->arguments->setToolTip(Utils::QtcProcess::expandMacros(ui->arguments->text(),
|
||||
Utils::globalMacroExpander()));
|
||||
ui->arguments->setToolTip(Utils::globalMacroExpander()->expandProcessArgs(ui->arguments->text()));
|
||||
}
|
||||
|
||||
@@ -576,7 +576,7 @@ bool ExternalToolRunner::resolve()
|
||||
}
|
||||
}
|
||||
|
||||
m_resolvedArguments = QtcProcess::expandMacros(m_tool->arguments(), expander);
|
||||
m_resolvedArguments = expander->expandProcessArgs(m_tool->arguments());
|
||||
m_resolvedInput = expander->expand(m_tool->input());
|
||||
m_resolvedWorkingDirectory = expander->expand(m_tool->workingDirectory());
|
||||
|
||||
|
||||
@@ -67,12 +67,12 @@ public:
|
||||
bc->displayName()),
|
||||
m_bc(bc)
|
||||
{}
|
||||
virtual bool resolveMacro(const QString &name, QString *ret);
|
||||
virtual bool resolveMacro(const QString &name, QString *ret) const;
|
||||
private:
|
||||
const BuildConfiguration *m_bc;
|
||||
};
|
||||
|
||||
bool BuildConfigMacroExpander::resolveMacro(const QString &name, QString *ret)
|
||||
bool BuildConfigMacroExpander::resolveMacro(const QString &name, QString *ret) const
|
||||
{
|
||||
// legacy variables
|
||||
if (name == QLatin1String("sourceDir")) {
|
||||
|
||||
@@ -50,7 +50,7 @@ JsonWizardExpander::JsonWizardExpander(JsonWizard *wizard) :
|
||||
QTC_CHECK(m_wizard);
|
||||
}
|
||||
|
||||
bool JsonWizardExpander::resolveMacro(const QString &name, QString *ret)
|
||||
bool JsonWizardExpander::resolveMacro(const QString &name, QString *ret) const
|
||||
{
|
||||
QVariant v = m_wizard->value(name);
|
||||
if (v.isValid()) {
|
||||
|
||||
@@ -45,7 +45,7 @@ class JsonWizardExpander : public Utils::MacroExpander
|
||||
public:
|
||||
explicit JsonWizardExpander(JsonWizard *wizard);
|
||||
|
||||
bool resolveMacro(const QString &name, QString *ret);
|
||||
bool resolveMacro(const QString &name, QString *ret) const;
|
||||
|
||||
public:
|
||||
JsonWizard *m_wizard;
|
||||
|
||||
@@ -46,12 +46,12 @@ class FallBackMacroExpander : public Utils::MacroExpander
|
||||
{
|
||||
public:
|
||||
explicit FallBackMacroExpander(const Target *target) : m_target(target) {}
|
||||
virtual bool resolveMacro(const QString &name, QString *ret);
|
||||
virtual bool resolveMacro(const QString &name, QString *ret) const;
|
||||
private:
|
||||
const Target *m_target;
|
||||
};
|
||||
|
||||
bool FallBackMacroExpander::resolveMacro(const QString &name, QString *ret)
|
||||
bool FallBackMacroExpander::resolveMacro(const QString &name, QString *ret) const
|
||||
{
|
||||
if (name == QLatin1String("sourceDir")) {
|
||||
*ret = m_target->project()->projectDirectory().toUserOutput();
|
||||
|
||||
@@ -43,7 +43,7 @@ ProjectMacroExpander::ProjectMacroExpander(const QString &projectFilePath, const
|
||||
: m_projectFile(projectFilePath), m_projectName(projectName), m_kit(k), m_bcName(bcName)
|
||||
{ }
|
||||
|
||||
bool ProjectMacroExpander::resolveMacro(const QString &name, QString *ret)
|
||||
bool ProjectMacroExpander::resolveMacro(const QString &name, QString *ret) const
|
||||
{
|
||||
QString result;
|
||||
bool found = false;
|
||||
|
||||
@@ -42,7 +42,7 @@ class PROJECTEXPLORER_EXPORT ProjectMacroExpander : public Utils::MacroExpander
|
||||
{
|
||||
public:
|
||||
ProjectMacroExpander(const QString &projectFilePath, const QString &projectName, const Kit *k, const QString &bcName);
|
||||
bool resolveMacro(const QString &name, QString *ret);
|
||||
bool resolveMacro(const QString &name, QString *ret) const;
|
||||
|
||||
private:
|
||||
QFileInfo m_projectFile;
|
||||
|
||||
@@ -282,7 +282,7 @@ QString QbsRunConfiguration::baseWorkingDirectory() const
|
||||
|
||||
QString QbsRunConfiguration::commandLineArguments() const
|
||||
{
|
||||
return Utils::QtcProcess::expandMacros(m_commandLineArguments, macroExpander());
|
||||
return macroExpander()->expandProcessArgs(m_commandLineArguments);
|
||||
}
|
||||
|
||||
QString QbsRunConfiguration::rawCommandLineArguments() const
|
||||
|
||||
@@ -496,7 +496,7 @@ QString DesktopQmakeRunConfiguration::baseWorkingDirectory() const
|
||||
|
||||
QString DesktopQmakeRunConfiguration::commandLineArguments() const
|
||||
{
|
||||
return QtcProcess::expandMacros(m_commandLineArguments, macroExpander());
|
||||
return macroExpander()->expandProcessArgs(m_commandLineArguments);
|
||||
}
|
||||
|
||||
QString DesktopQmakeRunConfiguration::rawCommandLineArguments() const
|
||||
|
||||
@@ -251,7 +251,7 @@ QString CustomExecutableRunConfiguration::baseWorkingDirectory() const
|
||||
|
||||
QString CustomExecutableRunConfiguration::commandLineArguments() const
|
||||
{
|
||||
return Utils::QtcProcess::expandMacros(m_cmdArguments, macroExpander());
|
||||
return macroExpander()->expandProcessArgs(m_cmdArguments);
|
||||
}
|
||||
|
||||
QString CustomExecutableRunConfiguration::rawCommandLineArguments() const
|
||||
|
||||
Reference in New Issue
Block a user