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
             }
         }
     };
 }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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);
        }
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
        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);
     }));
 }
Esempio n. 10
0
        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);
        }
Esempio n. 11
0
        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());
        }
Esempio n. 13
0
        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);
            }));
        }
Esempio n. 15
0
        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));
        }
Esempio n. 16
0
 public Task <TextEdit[]> GetTextDocumentRangeFormattingAsync(DocumentRangeFormattingParams documentRangeFormattingParams, CancellationToken cancellationToken)
 => _requestHandlerProvider.ExecuteRequestAsync <DocumentRangeFormattingParams, TextEdit[]>(Methods.TextDocumentRangeFormattingName,
                                                                                            documentRangeFormattingParams, _clientCapabilities, _clientName, cancellationToken);
Esempio n. 17
0
 public static Task <TextEditContainer> DocumentRangeFormatting(this ILanguageClientDocument mediator, DocumentRangeFormattingParams @params, CancellationToken cancellationToken = default)
 {
     return(mediator.SendRequest(@params, cancellationToken));
 }
Esempio n. 18
0
 public abstract RpcResult DocumentRangeFormatting(DocumentRangeFormattingParams args);
Esempio n. 19
0
 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();
Esempio n. 22
0
 public override Task <TextEditContainer> Handle(DocumentRangeFormattingParams request, CancellationToken cancellationToken) => _handler.Invoke(request, cancellationToken);
Esempio n. 23
0
 public abstract Task <TextEditContainer> Handle(DocumentRangeFormattingParams request, CancellationToken cancellationToken);