private async Task <TextEdit[]> ApplyFormattedEditsAsync( DocumentUri uri, DocumentSnapshot documentSnapshot, RazorLanguageKind kind, TextEdit[] formattedEdits, FormattingOptions options, int hostDocumentIndex, char triggerCharacter, bool bypassValidationPasses, bool collapseEdits, bool automaticallyAddUsings, CancellationToken cancellationToken) { // If we only received a single edit, let's always return a single edit back. // Otherwise, merge only if explicitly asked. collapseEdits |= formattedEdits.Length == 1; var codeDocument = await documentSnapshot.GetGeneratedOutputAsync(); using var context = FormattingContext.CreateForOnTypeFormatting(uri, documentSnapshot, codeDocument, options, _workspaceFactory, automaticallyAddUsings: automaticallyAddUsings, hostDocumentIndex, triggerCharacter); var result = new FormattingResult(formattedEdits, kind); foreach (var pass in _formattingPasses) { if (pass.IsValidationPass && bypassValidationPasses) { continue; } cancellationToken.ThrowIfCancellationRequested(); result = await pass.ExecuteAsync(context, result, cancellationToken); } var originalText = context.SourceText; var edits = result.Edits; if (collapseEdits) { var collapsedEdit = MergeEdits(result.Edits, originalText); edits = new[] { collapsedEdit }; } // Make sure the edits actually change something, or its not worth responding var textChanges = edits.Select(e => e.AsTextChange(originalText)); var changedText = originalText.WithChanges(textChanges); if (changedText.ContentEquals(originalText)) { return(Array.Empty <TextEdit>()); } return(edits); }