From a87c21a7169a87f13f2ac1c6a97f24950d4b652b Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Wed, 27 Apr 2022 22:48:50 +0200 Subject: [PATCH] Use human readable doc in lsp's signature help Fixes #2372 --- .../Handlers/OmniSharpSignatureHelpHandler.cs | 2 +- .../SignatureHandlerFact.cs | 88 +++++++++++++++++++ 2 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 tests/OmniSharp.Lsp.Tests/SignatureHandlerFact.cs diff --git a/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpSignatureHelpHandler.cs b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpSignatureHelpHandler.cs index c128e154ed..890f68cd8a 100644 --- a/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpSignatureHelpHandler.cs +++ b/src/OmniSharp.LanguageServerProtocol/Handlers/OmniSharpSignatureHelpHandler.cs @@ -49,7 +49,7 @@ public override async Task Handle(SignatureHelpParams request, Ca var containerSignatures = omnisharpResponse.Signatures.Select(x => new SignatureInformation { - Documentation = x.Documentation, + Documentation = x.StructuredDocumentation.SummaryText, Label = x.Label, Parameters = new Container(x.Parameters.Select(param => new ParameterInformation { diff --git a/tests/OmniSharp.Lsp.Tests/SignatureHandlerFact.cs b/tests/OmniSharp.Lsp.Tests/SignatureHandlerFact.cs new file mode 100644 index 0000000000..1cedc3cd3b --- /dev/null +++ b/tests/OmniSharp.Lsp.Tests/SignatureHandlerFact.cs @@ -0,0 +1,88 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.Extensions.Configuration; +using OmniSharp.Extensions.LanguageServer.Protocol; +using OmniSharp.Extensions.LanguageServer.Protocol.Document; +using OmniSharp.Extensions.LanguageServer.Protocol.Models; +using OmniSharp.Extensions.LanguageServer.Protocol.Workspace; +using OmniSharp.Models.V2; +using TestUtility; +using Xunit; +using Xunit.Abstractions; +using Xunit.Sdk; +using Range = OmniSharp.Extensions.LanguageServer.Protocol.Models.Range; + +namespace OmniSharp.Lsp.Tests +{ + public class SignatureHandlerFact : AbstractLanguageServerTestBase + { + public SignatureHandlerFact(ITestOutputHelper output) + : base(output) { } + + [Fact] + public async Task Get_signature_help() + { + const string source = +@"class Program +{ + public static void Main() + { + var flag = Compare($$); + } + ///Checks if object is tagged with the tag. + /// The game object. + /// Name of the tag. + /// Returns true if object is tagged with tag. + public static bool Compare(GameObject gameObject, string tagName) + { + return true; + } +}"; + var actual = await GetSignatureAsync(source); + Assert.Single(actual.Signatures); + Assert.Equal(0, actual.ActiveParameter); + Assert.Equal(0, actual.ActiveSignature); + Assert.Equal("Checks if object is tagged with the tag.", actual.Signatures.ElementAt(0).Documentation); + } + + private Task GetSignatureAsync(string code) + { + return GetSignatureAsync(new[] { new TestFile("dummy.cs", code) }); + } + + private async Task GetSignatureAsync(TestFile[] testFiles) + { + OmniSharpTestHost.AddFilesToWorkspace(testFiles + .Select(f => + new TestFile( + ((f.FileName.StartsWith("/") || f.FileName.StartsWith("\\")) ? f.FileName : ("/" + f.FileName)) + .Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar), f.Content)) + .ToArray() + ); + var file = testFiles.Single(tf => tf.Content.HasPosition); + var point = file.Content.GetPointFromPosition(); + + Client.TextDocument.DidChangeTextDocument(new DidChangeTextDocumentParams() + { + ContentChanges = new Container(new TextDocumentContentChangeEvent() + { + Text = file.Content.Code + }), + TextDocument = new OptionalVersionedTextDocumentIdentifier() + { + Uri = DocumentUri.From(file.FileName), + Version = 1 + } + }); + return await Client.TextDocument.RequestSignatureHelp(new SignatureHelpParams() + { + TextDocument = file.FileName, + Position = new Position(point.Line, point.Offset), + Context = new SignatureHelpContext { } + }, CancellationToken); + } + } +}