if (!v3supported || !textDocument.completion)
{
return false;
}
auto const& completion = textDocument.completion.value();
if (completion.completionItem)
{
auto& documentationFormat = completion.completionItem.value().documentationFormat;
if (documentationFormat)
{
auto& data = documentationFormat.value();
for (auto& it : data)
{
if (it == "markdown")
{
return true;
}
}
}
}
return false;
}
bool isWorkspaceEditResourceChangesSupported()
{
if (!workspace)
{
return false;
}
if (workspace->workspaceEdit)
{
return isTrue(workspace->workspaceEdit.value().resourceChanges);
}
return false;
}
static bool contains(std::vector<std::string> const& v, std::string const& target)
{
for (auto& it : v)
{
if (it == target)
{
return true;
}
}
return false;
}
bool isResourceOperationSupported() const
{
if (!workspace)
{
return false;
}
if (!workspace->workspaceEdit)
{
return false;
}
auto& it = (workspace->workspaceEdit.value());
if (!it.resourceOperations)
{
return false;
}
auto const& resourceOperations = it.resourceOperations.value();
return contains(resourceOperations, "create") && contains(resourceOperations, "rename")
&& contains(resourceOperations, "delete");
}
/**
* {@code true} if the client has explicitly set the
* {@code textDocument.documentSymbol.hierarchicalDocumentSymbolSupport} to
* {@code true} when initializing the LS. Otherwise, {@code false}.
*/
bool isHierarchicalDocumentSymbolSupported()
{
if (!v3supported || !textDocument.documentSymbol)
{
return false;
}
return isTrue(textDocument.documentSymbol.value().hierarchicalDocumentSymbolSupport);
}
/**
* {@code true} if the client has explicitly set the
* {@code textDocument.codeAction.codeActionLiteralSupport.codeActionKind.valueSet}
* value. Otherwise, {@code false}.
*/
bool isSupportedCodeActionKind(std::string const& kind)
{
if (!v3supported || !textDocument.codeAction)
{
return false;
}
//@formatter:off
auto const& codeAction = textDocument.codeAction.value();
if (codeAction.codeActionLiteralSupport)
{
auto const& codeActionKind = codeAction.codeActionLiteralSupport.value().codeActionKind;
if (codeActionKind)
{
auto const& valueSet = codeActionKind.value().valueSet;
if (valueSet)
{
for (auto& k : valueSet.value())
{
if (lsp::StartsWith(kind, k))
{
return true;
}
}
}
}
}
return false;
//@formatter:on
}
/**
* {@code true} if the client has explicitly set the
* {@code textDocument.publishDiagnostics.tagSupport} to
* {@code true} when initializing the LS. Otherwise, {@code false}.
*/
bool isDiagnosticTagSupported()
{
if (!v3supported || !textDocument.publishDiagnostics)
{
return false;
}
auto const& publishDiagnostics = textDocument.publishDiagnostics.value();
if (publishDiagnostics.tagSupport)
{
isTagSupported(publishDiagnostics.tagSupport);
}
return false;
}
bool isTagSupported(optional<std::pair<optional<bool>, optional<DiagnosticsTagSupport>>> const& tagSupport)
{
if (tagSupport)
{
auto& v = tagSupport.value();
if (v.first)
{
return v.first.value();
}
if (v.second)
{
return !v.second.value().valueSet.empty();
}
}
return false;
}