diff --git a/src/libs/languageserverprotocol/jsonkeys.h b/src/libs/languageserverprotocol/jsonkeys.h index e3673085ebb..7e1ea3720b7 100644 --- a/src/libs/languageserverprotocol/jsonkeys.h +++ b/src/libs/languageserverprotocol/jsonkeys.h @@ -144,6 +144,7 @@ constexpr char optionsKey[] = "options"; constexpr char parametersKey[] = "params"; constexpr char patternKey[] = "pattern"; constexpr char positionKey[] = "position"; +constexpr char prepareProviderKey[] = "prepareProvider"; constexpr char processIdKey[] = "processId"; constexpr char queryKey[] = "query"; constexpr char rangeFormattingKey[] = "rangeFormatting"; diff --git a/src/libs/languageserverprotocol/servercapabilities.cpp b/src/libs/languageserverprotocol/servercapabilities.cpp index 6ebf4f431fa..3d2721f4a69 100644 --- a/src/libs/languageserverprotocol/servercapabilities.cpp +++ b/src/libs/languageserverprotocol/servercapabilities.cpp @@ -111,6 +111,25 @@ Utils::optional> ServerCapabilities::cod return Utils::nullopt; } +Utils::optional> ServerCapabilities::renameProvider() const +{ + using RetType = Utils::variant; + const QJsonValue &localValue = value(renameProviderKey); + if (localValue.isBool()) + return RetType(localValue.toBool()); + if (localValue.isObject()) + return RetType(RenameOptions(localValue.toObject())); + return Utils::nullopt; +} + +void ServerCapabilities::setRenameProvider(Utils::variant renameProvider) +{ + if (Utils::holds_alternative(renameProvider)) + insert(renameProviderKey, Utils::get(renameProvider)); + else if (Utils::holds_alternative(renameProvider)) + insert(renameProviderKey, Utils::get(renameProvider)); +} + bool ServerCapabilities::isValid(QStringList *error) const { return checkOptional(error, textDocumentSyncKey) @@ -128,7 +147,7 @@ bool ServerCapabilities::isValid(QStringList *error) const && checkOptional(error, codeLensProviderKey) && checkOptional(error, documentFormattingProviderKey) && checkOptional(error, documentRangeFormattingProviderKey) - && checkOptional(error, renameProviderKey) + && checkOptional(error, renameProviderKey) && checkOptional(error, documentLinkProviderKey) && checkOptional(error, colorProviderKey) && checkOptional(error, executeCommandProviderKey) diff --git a/src/libs/languageserverprotocol/servercapabilities.h b/src/libs/languageserverprotocol/servercapabilities.h index 71d3e4a4965..0cbc7facf87 100644 --- a/src/libs/languageserverprotocol/servercapabilities.h +++ b/src/libs/languageserverprotocol/servercapabilities.h @@ -346,9 +346,23 @@ public: { insert(documentRangeFormattingProviderKey, documentRangeFormattingProvider); } void clearDocumentRangeFormattingProvider() { remove(documentRangeFormattingProviderKey); } + class RenameOptions : public JsonObject + { + public: + using JsonObject::JsonObject; + + // Renames should be checked and tested before being executed. + Utils::optional prepareProvider() const { return optionalValue(prepareProviderKey); } + void setPrepareProvider(bool prepareProvider) { insert(prepareProviderKey, prepareProvider); } + void clearPrepareProvider() { remove(prepareProviderKey); } + + bool isValid(QStringList * error) const override + { return checkOptional(error, prepareProviderKey); } + }; + // The server provides rename support. - Utils::optional renameProvider() const { return optionalValue(renameProviderKey); } - void setRenameProvider(bool renameProvider) { insert(renameProviderKey, renameProvider); } + Utils::optional> renameProvider() const; + void setRenameProvider(Utils::variant renameProvider); void clearRenameProvider() { remove(renameProviderKey); } // The server provides document link support.