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 serverContentType = default(string);
            var projectedUri      = default(Uri);

            if (request.Kind == RazorLanguageKind.CSharp &&
                documentSnapshot.TryGetVirtualDocument <CSharpVirtualDocumentSnapshot>(out var csharpDocument))
            {
                serverContentType = RazorLSPConstants.CSharpContentTypeName;
                projectedUri      = csharpDocument.Uri;
            }
            else if (request.Kind == RazorLanguageKind.Html &&
                     documentSnapshot.TryGetVirtualDocument <HtmlVirtualDocumentSnapshot>(out var htmlDocument))
            {
                serverContentType = RazorLSPConstants.HtmlLSPContentTypeName;
                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.ReinvokeRequestOnServerAsync <DocumentRangeFormattingParams, TextEdit[]>(
                Methods.TextDocumentRangeFormattingName,
                serverContentType,
                formattingParams,
                cancellationToken).ConfigureAwait(false);

            return(response);
        }
Exemple #2
0
        public override async Task <RazorDocumentRangeFormattingResponse> RazorDocumentFormattingAsync(DocumentFormattingParams request, CancellationToken cancellationToken)
        {
            var response = new RazorDocumentRangeFormattingResponse()
            {
                Edits = Array.Empty <TextEdit>()
            };

            await _joinableTaskFactory.SwitchToMainThreadAsync(cancellationToken);

            var hostDocumentUri = request.TextDocument.Uri;

            if (!_documentManager.TryGetDocument(hostDocumentUri, out var documentSnapshot))
            {
                return(response);
            }

            string languageServerName;
            Uri    projectedUri;

            if (documentSnapshot.TryGetVirtualDocument <HtmlVirtualDocumentSnapshot>(out var htmlDocument))
            {
                languageServerName = RazorLSPConstants.HtmlLanguageServerName;
                projectedUri       = htmlDocument.Uri;
            }
            else
            {
                Debug.Fail("Unexpected RazorLanguageKind. This can't really happen in a real scenario.");
                return(response);
            }

            var formattingParams = new DocumentFormattingParams()
            {
                TextDocument = new TextDocumentIdentifier()
                {
                    Uri = projectedUri
                },
                Options = request.Options
            };

            var textBuffer = htmlDocument.Snapshot.TextBuffer;
            var edits      = await _requestInvoker.ReinvokeRequestOnServerAsync <DocumentFormattingParams, TextEdit[]>(
                textBuffer,
                Methods.TextDocumentFormattingName,
                languageServerName,
                formattingParams,
                cancellationToken).ConfigureAwait(false);

            response.Edits = edits?.Response ?? Array.Empty <TextEdit>();

            return(response);
        }