private async Task SendSlowUpdateAsync(IReadOnlyList <Diagnostic> diagnostics, WorkSession session, object extensionResult, ICommandResultSender sender, CancellationToken cancellationToken)
        {
            if (session.IsRoslyn)
            {
                session.Roslyn.CurrentCodeActions.Clear();
            }
            var writer = sender.StartJsonMessage("slowUpdate");

            writer.WritePropertyStartArray("diagnostics");
            foreach (var diagnostic in diagnostics)
            {
                writer.WriteStartObject();
                writer.WriteProperty("id", diagnostic.Id);
                writer.WriteProperty("message", diagnostic.GetMessage());
                writer.WriteProperty("severity", FastConvert.EnumToLowerInvariantString(diagnostic.Severity));
                writer.WritePropertyStartArray("tags");
                foreach (var tag in diagnostic.Descriptor.CustomTags)
                {
                    if (tag != WellKnownDiagnosticTags.Unnecessary)
                    {
                        continue;
                    }
                    writer.WriteValue(tag.ToLowerInvariant());
                }
                writer.WriteEndArray();
                writer.WritePropertyName("span");
                writer.WriteSpan(diagnostic.Location.SourceSpan);

                var actions = await GetCodeActionsAsync(diagnostic, session, cancellationToken).ConfigureAwait(false);

                if (actions.Length > 0)
                {
                    writer.WritePropertyStartArray("actions");
                    WriteActions(writer, actions, session);
                    writer.WriteEndArray();
                }
                writer.WriteEndObject();
            }
            writer.WriteEndArray();
            if (_extension != null)
            {
                writer.WritePropertyName("x");
                _extension.WriteResult(writer, extensionResult, session);
            }
            await sender.SendJsonMessageAsync(cancellationToken).ConfigureAwait(false);
        }