diff options
author | Marco Bubke <marco.bubke@qt.io> | 2019-05-07 16:51:22 +0200 |
---|---|---|
committer | Marco Bubke <marco.bubke@qt.io> | 2019-06-13 16:51:48 +0000 |
commit | 4bae5de36b530bbef06ec7cb1fbfb7453fd59dc7 (patch) | |
tree | e8631b82915aef669fd63e6b0a72a1088185fa7e /src/libs/utils/environment.cpp | |
parent | f636f06b458782289340a61e42e6bbc1e523f937 (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.cpp | 369 |
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); } |