LanguageServerProtocol: add inserter for variants

Change-Id: I78ff4f34dfd19dceb1f2e0912ab1a0ea036e24a4
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
David Schulz
2021-02-03 12:17:20 +01:00
parent 26e540e73d
commit 9dad47387f
3 changed files with 26 additions and 28 deletions

View File

@@ -70,6 +70,11 @@ protected:
iterator insert(const QString &key, const JsonObject &value);
iterator insert(const QString &key, const QJsonValue &value);
template <typename T, typename V>
iterator insertVariant(const QString &key, const V &variant);
template <typename T1, typename T2, typename... Args, typename V>
iterator insertVariant(const QString &key, const V &variant);
// QJSonObject redirections
QJsonValue value(const QString &key) const { return m_jsonObject.value(key); }
bool contains(const QString &key) const { return m_jsonObject.contains(key); }
@@ -129,6 +134,19 @@ private:
QJsonObject m_jsonObject;
};
template<typename T, typename V>
JsonObject::iterator JsonObject::insertVariant(const QString &key, const V &variant)
{
return Utils::holds_alternative<T>(variant) ? insert(key, Utils::get<T>(variant)) : end();
}
template<typename T1, typename T2, typename... Args, typename V>
JsonObject::iterator JsonObject::insertVariant(const QString &key, const V &variant)
{
auto result = insertVariant<T1>(key, variant);
return result != end() ? result : insertVariant<T2, Args...>(key, variant);
}
template<typename T>
T JsonObject::typedValue(const QString &key) const
{

View File

@@ -62,10 +62,7 @@ Utils::optional<Diagnostic::Code> Diagnostic::code() const
void Diagnostic::setCode(const Diagnostic::Code &code)
{
if (auto val = Utils::get_if<int>(&code))
insert(codeKey, *val);
else if (auto val = Utils::get_if<QString>(&code))
insert(codeKey, *val);
insertVariant<int, QString>(codeKey, code);
}
bool Diagnostic::isValid(ErrorHierarchy *error) const

View File

@@ -38,10 +38,7 @@ Utils::optional<ServerCapabilities::TextDocumentSync> ServerCapabilities::textDo
void ServerCapabilities::setTextDocumentSync(const ServerCapabilities::TextDocumentSync &textDocumentSync)
{
if (auto val = Utils::get_if<int>(&textDocumentSync))
insert(textDocumentSyncKey, *val);
else if (auto val = Utils::get_if<TextDocumentSyncOptions>(&textDocumentSync))
insert(textDocumentSyncKey, *val);
insertVariant<TextDocumentSyncOptions, int>(textDocumentSyncKey, textDocumentSync);
}
TextDocumentSyncKind ServerCapabilities::textDocumentSyncKindHelper()
@@ -72,10 +69,8 @@ ServerCapabilities::typeDefinitionProvider() const
void ServerCapabilities::setTypeDefinitionProvider(
const Utils::variant<bool, ServerCapabilities::RegistrationOptions> &typeDefinitionProvider)
{
if (auto activated = Utils::get_if<bool>(&typeDefinitionProvider))
insert(typeDefinitionProviderKey, *activated);
else if (auto options = Utils::get_if<RegistrationOptions>(&typeDefinitionProvider))
insert(typeDefinitionProviderKey, *options);
insertVariant<bool, ServerCapabilities::RegistrationOptions>(typeDefinitionProviderKey,
typeDefinitionProvider);
}
Utils::optional<Utils::variant<bool, ServerCapabilities::RegistrationOptions>>
@@ -92,10 +87,7 @@ ServerCapabilities::implementationProvider() const
void ServerCapabilities::setImplementationProvider(
const Utils::variant<bool, ServerCapabilities::RegistrationOptions> &implementationProvider)
{
if (Utils::holds_alternative<bool>(implementationProvider))
insert(implementationProviderKey, Utils::get<bool>(implementationProvider));
else
insert(implementationProviderKey, Utils::get<RegistrationOptions>(implementationProvider));
insertVariant<bool, RegistrationOptions>(implementationProviderKey, implementationProvider);
}
Utils::optional<Utils::variant<bool, CodeActionOptions>> ServerCapabilities::codeActionProvider() const
@@ -124,10 +116,7 @@ Utils::optional<Utils::variant<ServerCapabilities::RenameOptions, bool>> ServerC
void ServerCapabilities::setRenameProvider(Utils::variant<ServerCapabilities::RenameOptions, bool> renameProvider)
{
if (Utils::holds_alternative<bool>(renameProvider))
insert(renameProviderKey, Utils::get<bool>(renameProvider));
else if (Utils::holds_alternative<RenameOptions>(renameProvider))
insert(renameProviderKey, Utils::get<RenameOptions>(renameProvider));
insertVariant<RenameOptions, bool>(renameProviderKey, renameProvider);
}
Utils::optional<Utils::variant<bool, JsonObject>> ServerCapabilities::colorProvider() const
@@ -143,10 +132,7 @@ Utils::optional<Utils::variant<bool, JsonObject>> ServerCapabilities::colorProvi
void ServerCapabilities::setColorProvider(Utils::variant<bool, JsonObject> colorProvider)
{
if (Utils::holds_alternative<bool>(colorProvider))
insert(renameProviderKey, Utils::get<bool>(colorProvider));
else if (Utils::holds_alternative<JsonObject>(colorProvider))
insert(renameProviderKey, Utils::get<JsonObject>(colorProvider));
insertVariant<bool, JsonObject>(renameProviderKey, colorProvider);
}
bool ServerCapabilities::isValid(ErrorHierarchy *error) const
@@ -188,10 +174,7 @@ ServerCapabilities::WorkspaceServerCapabilities::WorkspaceFoldersCapabilities::c
void ServerCapabilities::WorkspaceServerCapabilities::WorkspaceFoldersCapabilities::setChangeNotifications(
Utils::variant<QString, bool> changeNotifications)
{
if (auto val = Utils::get_if<bool>(&changeNotifications))
insert(changeNotificationsKey, *val);
else if (auto val = Utils::get_if<QString>(&changeNotifications))
insert(changeNotificationsKey, *val);
insertVariant<QString, bool>(changeNotificationsKey, changeNotifications);
}
bool ServerCapabilities::WorkspaceServerCapabilities::WorkspaceFoldersCapabilities::isValid(ErrorHierarchy *error) const