From 064da4e0cc199743def9ffec008cfb162b4ad3b6 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Fri, 5 Mar 2021 11:56:41 +0100 Subject: [PATCH] LanguageClient: make typed settings backwards compatible Instead of saving the typed settings in the same list as the generic stdio settings use a separate key. This way the new typed settings won't get misinterpreted and overwritten by running older Qt Creator versions. Change-Id: Ic14dfd978b5577b6ae08735bf811c21fba5ab725 Reviewed-by: Christian Stenger --- .../languageclient/languageclientsettings.cpp | 36 ++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/src/plugins/languageclient/languageclientsettings.cpp b/src/plugins/languageclient/languageclientsettings.cpp index fff4b3d9c0e..db793e3c110 100644 --- a/src/plugins/languageclient/languageclientsettings.cpp +++ b/src/plugins/languageclient/languageclientsettings.cpp @@ -79,6 +79,7 @@ constexpr char executableKey[] = "executable"; constexpr char argumentsKey[] = "arguments"; constexpr char settingsGroupKey[] = "LanguageClient"; constexpr char clientsKey[] = "clients"; +constexpr char typedClientsKey[] = "typedClients"; constexpr char mimeType[] = "application/language.client.setting"; namespace LanguageClient { @@ -615,16 +616,21 @@ QList LanguageClientSettings::fromSettings(QSettings *settingsIn { settingsIn->beginGroup(settingsGroupKey); QList result; - for (const QVariant& var : settingsIn->value(clientsKey).toList()) { - const QMap &map = var.toMap(); - Utils::Id typeId = Utils::Id::fromSetting(map.value(typeIdKey)); - if (!typeId.isValid()) - typeId = Constants::LANGUAGECLIENT_STDIO_SETTINGS_ID; - if (BaseSettings *settings = generateSettings(typeId)) { - settings->fromMap(var.toMap()); - result << settings; + + for (auto varList : + {settingsIn->value(clientsKey).toList(), settingsIn->value(typedClientsKey).toList()}) { + for (const QVariant &var : varList) { + const QMap &map = var.toMap(); + Utils::Id typeId = Utils::Id::fromSetting(map.value(typeIdKey)); + if (!typeId.isValid()) + typeId = Constants::LANGUAGECLIENT_STDIO_SETTINGS_ID; + if (BaseSettings *settings = generateSettings(typeId)) { + settings->fromMap(map); + result << settings; + } } } + settingsIn->endGroup(); return result; } @@ -659,10 +665,16 @@ void LanguageClientSettings::toSettings(QSettings *settings, const QList &languageClientSettings) { settings->beginGroup(settingsGroupKey); - settings->setValue(clientsKey, Utils::transform(languageClientSettings, - [](const BaseSettings *setting){ - return QVariant(setting->toMap()); - })); + auto transform = [](const QList &settings) { + return Utils::transform(settings, [](const BaseSettings *setting) { + return QVariant(setting->toMap()); + }); + }; + auto isStdioSetting = Utils::equal(&BaseSettings::m_settingsTypeId, + Utils::Id(Constants::LANGUAGECLIENT_STDIO_SETTINGS_ID)); + auto [stdioSettings, typedSettings] = Utils::partition(languageClientSettings, isStdioSetting); + settings->setValue(clientsKey, transform(stdioSettings)); + settings->setValue(typedClientsKey, transform(typedSettings)); settings->endGroup(); }