public override async Task <TextEdit[]> ApplyFormattedEditsAsync( DocumentUri uri, DocumentSnapshot documentSnapshot, RazorLanguageKind kind, TextEdit[] formattedEdits, FormattingOptions options, CancellationToken cancellationToken, bool bypassValidationPasses = false) { if (kind == RazorLanguageKind.Html) { // We don't support formatting HTML edits yet. return(formattedEdits); } var codeDocument = await documentSnapshot.GetGeneratedOutputAsync(); using var context = FormattingContext.Create(uri, documentSnapshot, codeDocument, options, isFormatOnType: true); 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); } return(result.Edits); }
public override async Task <TextEdit[]> FormatAsync(Uri uri, DocumentSnapshot documentSnapshot, Range range, FormattingOptions options) { if (uri is null) { throw new ArgumentNullException(nameof(uri)); } if (documentSnapshot is null) { throw new ArgumentNullException(nameof(documentSnapshot)); } if (range is null) { throw new ArgumentNullException(nameof(range)); } if (options is null) { throw new ArgumentNullException(nameof(options)); } var codeDocument = await documentSnapshot.GetGeneratedOutputAsync(); var context = FormattingContext.Create(uri, documentSnapshot, codeDocument, options, range); var result = new FormattingResult(Array.Empty <TextEdit>()); foreach (var pass in _formattingPasses) { result = await pass.ExecuteAsync(context, result); } return(result.Edits); }
public override async Task <TextEdit[]> FormatAsync(Uri uri, RazorCodeDocument codeDocument, Range range, FormattingOptions options) { if (uri is null) { throw new ArgumentNullException(nameof(uri)); } if (codeDocument is null) { throw new ArgumentNullException(nameof(codeDocument)); } if (range is null) { throw new ArgumentNullException(nameof(range)); } if (options is null) { throw new ArgumentNullException(nameof(options)); } var formattingContext = FormattingContext.Create(uri, codeDocument, range, options); var edits = await FormatCodeBlockDirectivesAsync(formattingContext); return(edits); }
public override async Task <TextEdit[]> FormatAsync( DocumentUri uri, DocumentSnapshot documentSnapshot, Range range, FormattingOptions options, CancellationToken cancellationToken) { if (uri is null) { throw new ArgumentNullException(nameof(uri)); } if (documentSnapshot is null) { throw new ArgumentNullException(nameof(documentSnapshot)); } if (range is null) { throw new ArgumentNullException(nameof(range)); } if (options is null) { throw new ArgumentNullException(nameof(options)); } var codeDocument = await documentSnapshot.GetGeneratedOutputAsync(); using var context = FormattingContext.Create(uri, documentSnapshot, codeDocument, options, _workspaceFactory); var originalText = context.SourceText; var result = new FormattingResult(Array.Empty <TextEdit>()); foreach (var pass in _formattingPasses) { cancellationToken.ThrowIfCancellationRequested(); result = await pass.ExecuteAsync(context, result, cancellationToken); } var filteredEdits = result.Edits.Where(e => range.LineOverlapsWith(e.Range)); // Make sure the edits actually change something, or its not worth responding var textChanges = filteredEdits.Select(e => e.AsTextChange(originalText)); var changedText = originalText.WithChanges(textChanges); if (changedText.ContentEquals(originalText)) { return(Array.Empty <TextEdit>()); } // Only send back the minimum edits var minimalChanges = SourceTextDiffer.GetMinimalTextChanges(originalText, changedText, lineDiffOnly: false); var finalEdits = minimalChanges.Select(f => f.AsTextEdit(originalText)).ToArray(); return(finalEdits); }
public override async Task <TextEdit[]> ApplyFormattedEditsAsync( DocumentUri uri, DocumentSnapshot documentSnapshot, RazorLanguageKind kind, TextEdit[] formattedEdits, FormattingOptions options, CancellationToken cancellationToken, bool bypassValidationPasses = false, bool collapseEdits = false) { if (kind == RazorLanguageKind.Html) { // We don't support formatting HTML edits yet. return(formattedEdits); } // 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.Create(uri, documentSnapshot, codeDocument, options, _workspaceFactory, isFormatOnType: true); 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); }
private FormattingContext CreateFormattingContext(SourceText source, int tabSize = 4, bool insertSpaces = true, string fileKind = null) { var path = "file:///path/to/document.razor"; var uri = new Uri(path); var(codeDocument, documentSnapshot) = CreateCodeDocumentAndSnapshot(source, uri.AbsolutePath, fileKind: fileKind); var options = new FormattingOptions() { TabSize = tabSize, InsertSpaces = insertSpaces, }; var context = FormattingContext.Create(uri, documentSnapshot, codeDocument, options); return(context); }
public override async Task <TextEdit[]> ApplyFormattedEditsAsync( DocumentUri uri, DocumentSnapshot documentSnapshot, RazorLanguageKind kind, TextEdit[] formattedEdits, FormattingOptions options, CancellationToken cancellationToken, bool bypassValidationPasses = false, bool collapseEdits = false) { if (kind == RazorLanguageKind.Html) { // We don't support formatting HTML edits yet. return(formattedEdits); } // 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.Create(uri, documentSnapshot, codeDocument, options, isFormatOnType: true); 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 edits = result.Edits; if (collapseEdits) { var collapsedEdit = MergeEdits(result.Edits, context.SourceText); edits = new[] { collapsedEdit }; } return(edits); }
public override async Task <TextEdit[]> FormatAsync( DocumentUri uri, DocumentSnapshot documentSnapshot, Range range, FormattingOptions options, CancellationToken cancellationToken) { if (uri is null) { throw new ArgumentNullException(nameof(uri)); } if (documentSnapshot is null) { throw new ArgumentNullException(nameof(documentSnapshot)); } if (range is null) { throw new ArgumentNullException(nameof(range)); } if (options is null) { throw new ArgumentNullException(nameof(options)); } var codeDocument = await documentSnapshot.GetGeneratedOutputAsync(); using var context = FormattingContext.Create(uri, documentSnapshot, codeDocument, options, _workspaceFactory); var result = new FormattingResult(Array.Empty <TextEdit>()); foreach (var pass in _formattingPasses) { cancellationToken.ThrowIfCancellationRequested(); result = await pass.ExecuteAsync(context, result, cancellationToken); } var filteredEdits = result.Edits.Where(e => range.LineOverlapsWith(e.Range)).ToArray(); return(filteredEdits); }
public override async Task <TextEdit[]> ApplyFormattedEditsAsync(Uri uri, DocumentSnapshot documentSnapshot, RazorLanguageKind kind, TextEdit[] formattedEdits, FormattingOptions options) { if (kind == RazorLanguageKind.Html) { // We don't support formatting HTML edits yet. return(formattedEdits); } var codeDocument = await documentSnapshot.GetGeneratedOutputAsync(); var context = FormattingContext.Create(uri, documentSnapshot, codeDocument, options, isFormatOnType: true); var result = new FormattingResult(formattedEdits, kind); foreach (var pass in _formattingPasses) { result = await pass.ExecuteAsync(context, result); } return(result.Edits); }