public override async Task <RazorDocumentRangeFormattingResponse> RazorRangeFormattingAsync(RazorDocumentRangeFormattingParams request, CancellationToken cancellationToken) { var response = new RazorDocumentRangeFormattingResponse() { Edits = Array.Empty <TextEdit>() }; if (request.Kind == RazorLanguageKind.Razor) { return(response); } await _joinableTaskFactory.SwitchToMainThreadAsync(); var hostDocumentUri = new Uri(request.HostDocumentFilePath); if (!_documentManager.TryGetDocument(hostDocumentUri, out var documentSnapshot)) { return(response); } var serverKind = default(LanguageServerKind); var projectedUri = default(Uri); if (request.Kind == RazorLanguageKind.CSharp && documentSnapshot.TryGetVirtualDocument <CSharpVirtualDocumentSnapshot>(out var csharpDocument)) { serverKind = LanguageServerKind.CSharp; projectedUri = csharpDocument.Uri; } else if (request.Kind == RazorLanguageKind.Html && documentSnapshot.TryGetVirtualDocument <HtmlVirtualDocumentSnapshot>(out var htmlDocument)) { serverKind = LanguageServerKind.Html; projectedUri = htmlDocument.Uri; } else { Debug.Fail("Unexpected RazorLanguageKind. This can't really happen in a real scenario."); return(response); } var formattingParams = new DocumentRangeFormattingParams() { TextDocument = new TextDocumentIdentifier() { Uri = projectedUri }, Range = request.ProjectedRange, Options = request.Options }; response.Edits = await _requestInvoker.RequestServerAsync <DocumentRangeFormattingParams, TextEdit[]>( Methods.TextDocumentRangeFormattingName, serverKind, formattingParams, cancellationToken).ConfigureAwait(false); return(response); }
public Task <TextEdit[]> FormatDocumentRange(TextEditor editor, CancellationToken token) { if (!IsStarted) { return(Task.FromResult <TextEdit[]> (null)); } if (!IsDocumentFormattingProvider) { Log("Document formatting is not supported by server for '{0}'. File: '{1}'", Methods.TextDocumentRangeFormattingName, editor.FileName); return(Task.FromResult <TextEdit[]> (null)); } Log("Sending '{0}'. File: '{1}'", Methods.TextDocumentRangeFormattingName, editor.FileName); var message = new DocumentRangeFormattingParams { TextDocument = TextDocumentIdentifierFactory.Create(editor.FileName), Options = new FormattingOptions { InsertSpaces = editor.Options.TabsToSpaces, TabSize = editor.Options.TabSize }, Range = new Range { Start = editor.SelectionRegion.Begin.CreatePosition(), End = editor.SelectionRegion.End.CreatePosition() } }; return(jsonRpc.InvokeWithParameterObjectAsync( Methods.TextDocumentRangeFormatting, message, token)); }
public TSqlFormatterServiceTests() { textDocument = new TextDocumentIdentifier { Uri = "script file" }; docFormatParams = new DocumentFormattingParams() { TextDocument = textDocument, Options = new FormattingOptions() { InsertSpaces = true, TabSize = 4 } }; rangeFormatParams = new DocumentRangeFormattingParams() { TextDocument = textDocument, Options = new FormattingOptions() { InsertSpaces = true, TabSize = 4 }, Range = new ServiceLayer.Workspace.Contracts.Range() { // From first "(" to last ")" Start = new Position { Line = 0, Character = 16 }, End = new Position { Line = 0, Character = 56 } } }; }
public async Task <TextEditContainer> Handle(DocumentRangeFormattingParams request, CancellationToken cancellationToken) { if (!_optionsMonitor.CurrentValue.EnableFormatting) { return(null); } var document = await Task.Factory.StartNew(() => { _documentResolver.TryResolveDocument(request.TextDocument.Uri.GetAbsoluteOrUNCPath(), out var documentSnapshot); return(documentSnapshot); }, cancellationToken, TaskCreationOptions.None, _foregroundDispatcher.ForegroundScheduler); if (document is null || cancellationToken.IsCancellationRequested) { return(null); } var codeDocument = await document.GetGeneratedOutputAsync(); if (codeDocument.IsUnsupported()) { return(null); } var edits = await _razorFormattingService.FormatAsync(request.TextDocument.Uri, document, request.Range, request.Options, cancellationToken); var editContainer = new TextEditContainer(edits); return(editContainer); }
public async Task Handle_UnsupportedCodeDocument_ReturnsNull() { // Arrange var codeDocument = TestRazorCodeDocument.CreateEmpty(); codeDocument.SetUnsupported(); var uri = new Uri("file://path/test.razor"); var documentResolver = CreateDocumentResolver(uri.AbsolutePath, codeDocument); var formattingService = new TestRazorFormattingService(); var documentMappingService = new DefaultRazorDocumentMappingService(); var adhocWorkspaceFactory = TestAdhocWorkspaceFactory.Instance; var optionsMonitor = GetOptionsMonitor(enableFormatting: true); var endpoint = new RazorFormattingEndpoint( LegacyDispatcher, documentResolver, formattingService, documentMappingService, adhocWorkspaceFactory, optionsMonitor, LoggerFactory); var @params = new DocumentRangeFormattingParams() { TextDocument = new TextDocumentIdentifier(uri) }; // Act var result = await endpoint.Handle(@params, CancellationToken.None); // Assert Assert.Null(result); }
public override async Task <RazorDocumentRangeFormattingResponse> RazorRangeFormattingAsync(RazorDocumentRangeFormattingParams request, CancellationToken cancellationToken) { var response = new RazorDocumentRangeFormattingResponse() { Edits = Array.Empty <TextEdit>() }; if (request.Kind == RazorLanguageKind.Razor) { return(response); } await _joinableTaskFactory.SwitchToMainThreadAsync(cancellationToken); var hostDocumentUri = new Uri(request.HostDocumentFilePath); if (!_documentManager.TryGetDocument(hostDocumentUri, out var documentSnapshot)) { return(response); } string languageServerName; Uri projectedUri; if (request.Kind == RazorLanguageKind.CSharp && documentSnapshot.TryGetVirtualDocument <CSharpVirtualDocumentSnapshot>(out var csharpDocument)) { languageServerName = RazorLSPConstants.RazorCSharpLanguageServerName; projectedUri = csharpDocument.Uri; } else { Debug.Fail("Unexpected RazorLanguageKind. This can't really happen in a real scenario."); return(response); } var formattingParams = new DocumentRangeFormattingParams() { TextDocument = new TextDocumentIdentifier() { Uri = projectedUri }, Range = request.ProjectedRange, Options = request.Options }; var textBuffer = csharpDocument.Snapshot.TextBuffer; var edits = await _requestInvoker.ReinvokeRequestOnServerAsync <DocumentRangeFormattingParams, TextEdit[]>( textBuffer, Methods.TextDocumentRangeFormattingName, languageServerName, formattingParams, cancellationToken).ConfigureAwait(false); response.Edits = edits?.Response ?? Array.Empty <TextEdit>(); return(response); }
public async Task <TextEditContainer> Handle(DocumentRangeFormattingParams request, CancellationToken cancellationToken) { var scriptFile = _workspaceService.GetFile(request.TextDocument.Uri); var pssaSettings = _configurationService.CurrentSettings.CodeFormatting.GetPSSASettingsHashtable( (int)request.Options.TabSize, request.Options.InsertSpaces, _logger); // TODO raise an error event in case format returns null; string formattedScript; Range editRange; var extent = scriptFile.ScriptAst.Extent; // TODO create an extension for converting range to script extent editRange = new Range { Start = new Position { Line = extent.StartLineNumber - 1, Character = extent.StartColumnNumber - 1 }, End = new Position { Line = extent.EndLineNumber - 1, Character = extent.EndColumnNumber - 1 } }; Range range = request.Range; var rangeList = range == null ? null : new int[] { range.Start.Line + 1, range.Start.Character + 1, range.End.Line + 1, range.End.Character + 1 }; formattedScript = await _analysisService.FormatAsync( scriptFile.Contents, pssaSettings, rangeList).ConfigureAwait(false); if (formattedScript == null) { _logger.LogWarning("Formatting returned null. Returning original contents for file: {0}", scriptFile.DocumentUri); formattedScript = scriptFile.Contents; } return(new TextEditContainer(new TextEdit { NewText = formattedScript, Range = editRange })); }
public async Task HandleDocRangeFormatRequest(DocumentRangeFormattingParams docRangeFormatParams, RequestContext <TextEdit[]> requestContext) { Func <Task <TextEdit[]> > requestHandler = () => { return(FormatRangeAndReturnEdits(docRangeFormatParams)); }; await HandleRequest(requestHandler, requestContext, "HandleDocRangeFormatRequest"); DocumentStatusHelper.SendTelemetryEvent(requestContext, CreateTelemetryProps(isDocFormat: false)); }
private async Task <TextEdit[]> FormatRangeAndReturnEdits(DocumentRangeFormattingParams docFormatParams) { return(await Task.Factory.StartNew(() => { var range = docFormatParams.Range; ScriptFile scriptFile = GetFile(docFormatParams); TextEdit textEdit = new TextEdit { Range = range }; string text = scriptFile.GetTextInRange(range.ToBufferRange()); return DoFormat(docFormatParams, textEdit, text); })); }
public async Task Handle_FormattingDisabled_ReturnsNull() { // Arrange var formattingService = new TestRazorFormattingService(); var optionsMonitor = GetOptionsMonitor(enableFormatting: false); var endpoint = new RazorFormattingEndpoint(Dispatcher, EmptyDocumentResolver, formattingService, optionsMonitor, LoggerFactory); var @params = new DocumentRangeFormattingParams(); // Act var result = await endpoint.Handle(@params, CancellationToken.None); // Assert Assert.Null(result); }
public async Task Handle_DocumentNotFound_ReturnsNull() { // Arrange var formattingService = new TestRazorFormattingService(); var optionsMonitor = GetOptionsMonitor(enableFormatting: true); var endpoint = new RazorFormattingEndpoint(Dispatcher, EmptyDocumentResolver, formattingService, optionsMonitor, LoggerFactory); var uri = new Uri("file://path/test.razor"); var @params = new DocumentRangeFormattingParams() { TextDocument = new TextDocumentIdentifier(uri) }; // Act var result = await endpoint.Handle(@params, CancellationToken.None); // Assert Assert.Null(result); }
public async override Task <TextEditContainer> Handle(DocumentRangeFormattingParams request, CancellationToken cancellationToken) { var omnisharpRequest = new FormatRangeRequest() { FileName = Helpers.FromUri(request.TextDocument.Uri), Line = Convert.ToInt32(request.Range.Start.Line), Column = Convert.ToInt32(request.Range.Start.Character), EndLine = Convert.ToInt32(request.Range.End.Line), EndColumn = Convert.ToInt32(request.Range.End.Character), }; var omnisharpResponse = await _formatRangeHandler.Handle(omnisharpRequest); return(omnisharpResponse.Changes.Select(change => new TextEdit() { NewText = change.NewText, Range = new Range(new Position(change.StartLine, change.StartColumn), new Position(change.EndLine, change.EndColumn)) }).ToArray()); }
public async Task Handle_FormattingEnabled_InvokesFormattingService() { // Arrange var codeDocument = TestRazorCodeDocument.CreateEmpty(); var uri = new Uri("file://path/test.razor"); var documentResolver = CreateDocumentResolver(uri.GetAbsoluteOrUNCPath(), codeDocument); var formattingService = new TestRazorFormattingService(); var optionsMonitor = GetOptionsMonitor(enableFormatting: true); var endpoint = new RazorFormattingEndpoint(Dispatcher, documentResolver, formattingService, optionsMonitor, LoggerFactory); var @params = new DocumentRangeFormattingParams() { TextDocument = new TextDocumentIdentifier(uri) }; // Act var result = await endpoint.Handle(@params, CancellationToken.None); // Assert Assert.NotNull(result); Assert.True(formattingService.Called); }
private async Task <TextEdit[]> FormatRangeAndReturnEdits(DocumentRangeFormattingParams docFormatParams) { return(await Task.Factory.StartNew(() => { if (ShouldSkipFormatting(docFormatParams)) { return Array.Empty <TextEdit>(); } var range = docFormatParams.Range; ScriptFile scriptFile = GetFile(docFormatParams); if (scriptFile == null) { return new TextEdit[0]; } TextEdit textEdit = new TextEdit { Range = range }; string text = scriptFile.GetTextInRange(range.ToBufferRange()); return DoFormat(docFormatParams, textEdit, text); })); }
public Task <TextEdit[]> GetTextDocumentRangeFormattingAsync(DocumentRangeFormattingParams documentRangeFormattingParams, CancellationToken cancellationToken) { Contract.ThrowIfNull(_clientCapabilities, $"{nameof(InitializeAsync)} has not been called."); return(RequestDispatcher.ExecuteRequestAsync <DocumentRangeFormattingParams, TextEdit[]>(Queue, Methods.TextDocumentRangeFormattingName, documentRangeFormattingParams, _clientCapabilities, ClientName, cancellationToken)); }
public Task <TextEdit[]> GetTextDocumentRangeFormattingAsync(DocumentRangeFormattingParams documentRangeFormattingParams, CancellationToken cancellationToken) => _requestHandlerProvider.ExecuteRequestAsync <DocumentRangeFormattingParams, TextEdit[]>(Methods.TextDocumentRangeFormattingName, documentRangeFormattingParams, _clientCapabilities, _clientName, cancellationToken);
public static Task <TextEditContainer> DocumentRangeFormatting(this ILanguageClientDocument mediator, DocumentRangeFormattingParams @params, CancellationToken cancellationToken = default) { return(mediator.SendRequest(@params, cancellationToken)); }
public abstract RpcResult DocumentRangeFormatting(DocumentRangeFormattingParams args);
public Task <TextEdit[]> GetTextDocumentRangeFormattingAsync(DocumentRangeFormattingParams documentRangeFormattingParams, CancellationToken cancellationToken) => _protocol.ExecuteRequestAsync <DocumentRangeFormattingParams, TextEdit[]>(Methods.TextDocumentRangeFormattingName, _workspace.CurrentSolution, documentRangeFormattingParams, _clientCapabilities, _clientName, cancellationToken);
public static Task <TextEditContainer> DocumentRangeFormatting(this ILanguageClientDocument mediator, DocumentRangeFormattingParams @params) { return(mediator.SendRequest <DocumentRangeFormattingParams, TextEditContainer>(DocumentNames.RangeFormatting, @params)); }
public virtual Task <TextEdit[]> DocumentRangeFormatting(DocumentRangeFormattingParams @params, CancellationToken cancellationToken) => throw new NotImplementedException();
public override Task <TextEditContainer> Handle(DocumentRangeFormattingParams request, CancellationToken cancellationToken) => _handler.Invoke(request, cancellationToken);
public abstract Task <TextEditContainer> Handle(DocumentRangeFormattingParams request, CancellationToken cancellationToken);