aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/utils/environment.cpp
diff options
context:
space:
mode:
authorMarco Bubke <marco.bubke@qt.io>2019-05-07 16:51:22 +0200
committerMarco Bubke <marco.bubke@qt.io>2019-06-13 16:51:48 +0000
commit4bae5de36b530bbef06ec7cb1fbfb7453fd59dc7 (patch)
treee8631b82915aef669fd63e6b0a72a1088185fa7e /src/libs/utils/environment.cpp
parentf636f06b458782289340a61e42e6bbc1e523f937 (diff)
Enable macro editing for the Clang indexer
Refactor much of the code from Environment* classes to NameValue* classes to share it with the preprocessor macro settings. Change-Id: Ica4ee817aa338230c422b30d91240d266248d226 Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
Diffstat (limited to 'src/libs/utils/environment.cpp')
-rw-r--r--src/libs/utils/environment.cpp369
1 files changed, 20 insertions, 349 deletions
diff --git a/src/libs/utils/environment.cpp b/src/libs/utils/environment.cpp
index d61a75ebf77..476df9c0f9d 100644
--- a/src/libs/utils/environment.cpp
+++ b/src/libs/utils/environment.cpp
@@ -39,11 +39,12 @@ Q_GLOBAL_STATIC_WITH_ARGS(Utils::Environment, staticSystemEnvironment,
Q_GLOBAL_STATIC(QVector<Utils::EnvironmentProvider>, environmentProviders)
-static QMap<QString, QString>::iterator findKey(QMap<QString, QString> &input, Utils::OsType osType,
- const QString &key)
+namespace Utils {
+
+static NameValueMap::iterator findKey(NameValueMap &input, Utils::OsType osType, const QString &key)
{
- const Qt::CaseSensitivity casing
- = (osType == Utils::OsTypeWindows) ? Qt::CaseInsensitive : Qt::CaseSensitive;
+ const Qt::CaseSensitivity casing = (osType == Utils::OsTypeWindows) ? Qt::CaseInsensitive
+ : Qt::CaseSensitive;
for (auto it = input.begin(); it != input.end(); ++it) {
if (key.compare(it.key(), casing) == 0)
return it;
@@ -51,12 +52,12 @@ static QMap<QString, QString>::iterator findKey(QMap<QString, QString> &input, U
return input.end();
}
-static QMap<QString, QString>::const_iterator findKey(const QMap<QString, QString> &input,
- Utils::OsType osType,
- const QString &key)
+static NameValueMap::const_iterator findKey(const NameValueMap &input,
+ Utils::OsType osType,
+ const QString &key)
{
- const Qt::CaseSensitivity casing
- = (osType == Utils::OsTypeWindows) ? Qt::CaseInsensitive : Qt::CaseSensitive;
+ const Qt::CaseSensitivity casing = (osType == Utils::OsTypeWindows) ? Qt::CaseInsensitive
+ : Qt::CaseSensitive;
for (auto it = input.constBegin(); it != input.constEnd(); ++it) {
if (key.compare(it.key(), casing) == 0)
return it;
@@ -64,198 +65,6 @@ static QMap<QString, QString>::const_iterator findKey(const QMap<QString, QStrin
return input.constEnd();
}
-namespace Utils {
-
-enum : char
-{
-#ifdef Q_OS_WIN
- pathSepC = ';'
-#else
- pathSepC = ':'
-#endif
-};
-
-void EnvironmentItem::sort(QList<EnvironmentItem> *list)
-{
- Utils::sort(*list, &EnvironmentItem::name);
-}
-
-QList<EnvironmentItem> EnvironmentItem::fromStringList(const QStringList &list)
-{
- QList<EnvironmentItem> result;
- for (const QString &string : list) {
- int pos = string.indexOf('=', 1);
- if (pos == -1)
- result.append(EnvironmentItem(string, QString(), EnvironmentItem::Unset));
- else
- result.append(EnvironmentItem(string.left(pos), string.mid(pos + 1)));
- }
- return result;
-}
-
-QStringList EnvironmentItem::toStringList(const QList<EnvironmentItem> &list)
-{
- return Utils::transform(list, [](const EnvironmentItem &item) {
- if (item.operation == EnvironmentItem::Unset)
- return QString(item.name);
- return QString(item.name + '=' + item.value);
- });
-}
-
-QList<EnvironmentItem> EnvironmentItem::itemsFromVariantList(const QVariantList &list)
-{
- return Utils::transform(list, [](const QVariant &item) {
- return itemFromVariantList(item.toList());
- });
-}
-
-QVariantList EnvironmentItem::toVariantList(const QList<EnvironmentItem> &list)
-{
- return Utils::transform(list, [](const EnvironmentItem &item) {
- return QVariant(toVariantList(item));
- });
-}
-
-EnvironmentItem EnvironmentItem::itemFromVariantList(const QVariantList &list)
-{
- QTC_ASSERT(list.size() == 3, return EnvironmentItem("", ""));
- QString name = list.value(0).toString();
- Operation operation = Operation(list.value(1).toInt());
- QString value = list.value(2).toString();
- return EnvironmentItem(name, value, operation);
-}
-
-QVariantList EnvironmentItem::toVariantList(const EnvironmentItem &item)
-{
- return QVariantList() << item.name << item.operation << item.value;
-}
-
-static QString expand(const Environment *e, QString value)
-{
- int replaceCount = 0;
- for (int i = 0; i < value.size(); ++i) {
- if (value.at(i) == '$') {
- if ((i + 1) < value.size()) {
- const QChar &c = value.at(i+1);
- int end = -1;
- if (c == '(')
- end = value.indexOf(')', i);
- else if (c == '{')
- end = value.indexOf('}', i);
- if (end != -1) {
- const QString &name = value.mid(i + 2, end - i - 2);
- Environment::const_iterator it = e->constFind(name);
- if (it != e->constEnd())
- value.replace(i, end - i + 1, it.value());
- ++replaceCount;
- QTC_ASSERT(replaceCount < 100, break);
- }
- }
- }
- }
- return value;
-}
-
-QDebug operator<<(QDebug debug, const EnvironmentItem &i)
-{
- QDebugStateSaver saver(debug);
- debug.noquote();
- debug.nospace();
- debug << "EnvironmentItem(";
- switch (i.operation) {
- case EnvironmentItem::Set:
- debug << "set \"" << i.name << "\" to \"" << i.value << '"';
- break;
- case EnvironmentItem::Unset:
- debug << "unset \"" << i.name << '"';
- break;
- case EnvironmentItem::Prepend:
- debug << "prepend to \"" << i.name << "\":\"" << i.value << '"';
- break;
- case EnvironmentItem::Append:
- debug << "append to \"" << i.name << "\":\"" << i.value << '"';
- break;
- }
- debug << ')';
- return debug;
-}
-
-void EnvironmentItem::apply(Environment *e, Operation op) const
-{
- switch (op) {
- case Set:
- e->set(name, expand(e, value));
- break;
- case Unset:
- e->unset(name);
- break;
- case Prepend: {
- const Environment::const_iterator it = e->constFind(name);
- if (it != e->constEnd()) {
- QString v = it.value();
- const QChar pathSep{QLatin1Char(pathSepC)};
- int sepCount = 0;
- if (v.startsWith(pathSep))
- ++sepCount;
- if (value.endsWith(pathSep))
- ++sepCount;
- if (sepCount == 2)
- v.remove(0, 1);
- else if (sepCount == 0)
- v.prepend(pathSep);
- v.prepend(expand(e, value));
- e->set(name, v);
- } else {
- apply(e, Set);
- }
- }
- break;
- case Append: {
- const Environment::const_iterator it = e->constFind(name);
- if (it != e->constEnd()) {
- QString v = it.value();
- const QChar pathSep{QLatin1Char(pathSepC)};
- int sepCount = 0;
- if (v.endsWith(pathSep))
- ++sepCount;
- if (value.startsWith(pathSep))
- ++sepCount;
- if (sepCount == 2)
- v.chop(1);
- else if (sepCount == 0)
- v.append(pathSep);
- v.append(expand(e, value));
- e->set(name, v);
- } else {
- apply(e, Set);
- }
- }
- break;
- }
-}
-
-Environment::Environment(const QStringList &env, OsType osType) : m_osType(osType)
-{
- for (const QString &s : env) {
- int i = s.indexOf('=', 1);
- if (i >= 0) {
- const QString key = s.left(i);
- if (!key.contains('=')) {
- const QString value = s.mid(i + 1);
- set(key, value);
- }
- }
- }
-}
-
-QStringList Environment::toStringList() const
-{
- QStringList result;
- for (auto it = m_values.constBegin(); it != m_values.constEnd(); ++it)
- result.append(it.key() + '=' + it.value());
- return result;
-}
-
QProcessEnvironment Environment::toProcessEnvironment() const
{
QProcessEnvironment result;
@@ -264,27 +73,21 @@ QProcessEnvironment Environment::toProcessEnvironment() const
return result;
}
-void Environment::set(const QString &key, const QString &value)
+void Environment::appendOrSetPath(const QString &value)
{
- QTC_ASSERT(!key.contains('='), return);
- auto it = findKey(m_values, m_osType, key);
- if (it == m_values.end())
- m_values.insert(key, value);
- else
- it.value() = value;
+ appendOrSet("PATH", QDir::toNativeSeparators(value),
+ QString(OsSpecificAspects::pathListSeparator(m_osType)));
}
-void Environment::unset(const QString &key)
+void Environment::prependOrSetPath(const QString &value)
{
- QTC_ASSERT(!key.contains('='), return);
- auto it = findKey(m_values, m_osType, key);
- if (it != m_values.end())
- m_values.erase(it);
+ prependOrSet("PATH", QDir::toNativeSeparators(value),
+ QString(OsSpecificAspects::pathListSeparator(m_osType)));
}
void Environment::appendOrSet(const QString &key, const QString &value, const QString &sep)
{
- QTC_ASSERT(!key.contains('='), return);
+ QTC_ASSERT(!key.contains('='), return );
auto it = findKey(m_values, m_osType, key);
if (it == m_values.end()) {
m_values.insert(key, value);
@@ -296,9 +99,9 @@ void Environment::appendOrSet(const QString &key, const QString &value, const QS
}
}
-void Environment::prependOrSet(const QString&key, const QString &value, const QString &sep)
+void Environment::prependOrSet(const QString &key, const QString &value, const QString &sep)
{
- QTC_ASSERT(!key.contains('='), return);
+ QTC_ASSERT(!key.contains('='), return );
auto it = findKey(m_values, m_osType, key);
if (it == m_values.end()) {
m_values.insert(key, value);
@@ -310,18 +113,6 @@ void Environment::prependOrSet(const QString&key, const QString &value, const QS
}
}
-void Environment::appendOrSetPath(const QString &value)
-{
- appendOrSet("PATH", QDir::toNativeSeparators(value),
- QString(OsSpecificAspects::pathListSeparator(m_osType)));
-}
-
-void Environment::prependOrSetPath(const QString &value)
-{
- prependOrSet("PATH", QDir::toNativeSeparators(value),
- QString(OsSpecificAspects::pathListSeparator(m_osType)));
-}
-
void Environment::prependOrSetLibrarySearchPath(const QString &value)
{
switch (m_osType) {
@@ -387,11 +178,6 @@ void Environment::setupEnglishOutput(QStringList *environment)
*environment = env.toStringList();
}
-void Environment::clear()
-{
- m_values.clear();
-}
-
FilePath Environment::searchInDirectory(const QStringList &execs, const FilePath &directory,
QSet<FilePath> &alreadyChecked) const
{
@@ -494,122 +280,7 @@ FilePathList Environment::path() const
return Utils::transform(pathComponents, &FilePath::fromUserInput);
}
-QString Environment::value(const QString &key) const
-{
- const auto it = findKey(m_values, m_osType, key);
- return it != m_values.end() ? it.value() : QString();
-}
-
-QString Environment::key(Environment::const_iterator it) const
-{
- return it.key();
-}
-
-QString Environment::value(Environment::const_iterator it) const
-{
- return it.value();
-}
-
-Environment::const_iterator Environment::constBegin() const
-{
- return m_values.constBegin();
-}
-
-Environment::const_iterator Environment::constEnd() const
-{
- return m_values.constEnd();
-}
-
-Environment::const_iterator Environment::constFind(const QString &name) const
-{
- return findKey(m_values, m_osType, name);
-}
-
-int Environment::size() const
-{
- return m_values.size();
-}
-
-void Environment::modify(const QList<EnvironmentItem> & list)
-{
- Environment resultEnvironment = *this;
- for (const EnvironmentItem &item : list)
- item.apply(&resultEnvironment);
- *this = resultEnvironment;
-}
-
-QList<EnvironmentItem> Environment::diff(const Environment &other, bool checkAppendPrepend) const
-{
- QMap<QString, QString>::const_iterator thisIt = constBegin();
- QMap<QString, QString>::const_iterator otherIt = other.constBegin();
-
- QList<EnvironmentItem> result;
- while (thisIt != constEnd() || otherIt != other.constEnd()) {
- if (thisIt == constEnd()) {
- result.append(EnvironmentItem(otherIt.key(), otherIt.value()));
- ++otherIt;
- } else if (otherIt == other.constEnd()) {
- result.append(EnvironmentItem(thisIt.key(), QString(), EnvironmentItem::Unset));
- ++thisIt;
- } else if (thisIt.key() < otherIt.key()) {
- result.append(EnvironmentItem(thisIt.key(), QString(), EnvironmentItem::Unset));
- ++thisIt;
- } else if (thisIt.key() > otherIt.key()) {
- result.append(EnvironmentItem(otherIt.key(), otherIt.value()));
- ++otherIt;
- } else {
- const QString &oldValue = thisIt.value();
- const QString &newValue = otherIt.value();
- if (oldValue != newValue) {
- if (checkAppendPrepend && newValue.startsWith(oldValue)) {
- QString appended = newValue.right(newValue.size() - oldValue.size());
- if (appended.startsWith(QLatin1Char(pathSepC)))
- appended.remove(0, 1);
- result.append(EnvironmentItem(otherIt.key(), appended,
- EnvironmentItem::Append));
- } else if (checkAppendPrepend && newValue.endsWith(oldValue)) {
- QString prepended = newValue.left(newValue.size() - oldValue.size());
- if (prepended.endsWith(QLatin1Char(pathSepC)))
- prepended.chop(1);
- result.append(EnvironmentItem(otherIt.key(), prepended,
- EnvironmentItem::Prepend));
- } else {
- result.append(EnvironmentItem(otherIt.key(), newValue));
- }
- }
- ++otherIt;
- ++thisIt;
- }
- }
- return result;
-}
-
-bool Environment::hasKey(const QString &key) const
-{
- return m_values.contains(key);
-}
-
-OsType Environment::osType() const
-{
- return m_osType;
-}
-
-QString Environment::userName() const
-{
- return value(QString::fromLatin1(m_osType == OsTypeWindows ? "USERNAME" : "USER"));
-}
-
-bool Environment::operator!=(const Environment &other) const
-{
- return !(*this == other);
-}
-
-bool Environment::operator==(const Environment &other) const
-{
- return m_osType == other.m_osType && m_values == other.m_values;
-}
-
-void Environment::modifySystemEnvironment(const QList<EnvironmentItem> &list)
+void Environment::modifySystemEnvironment(const EnvironmentItems &list)
{
staticSystemEnvironment->modify(list);
}