Skip to content

Commit 49e0641

Browse files
committed
Added SignatureHelp support.
1 parent fe89c4d commit 49e0641

File tree

2 files changed

+133
-0
lines changed

2 files changed

+133
-0
lines changed
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
using System;
2+
using System.Threading;
3+
using System.Threading.Tasks;
4+
using OmniSharp.Extensions.LanguageServer.Client.Utilities;
5+
using OmniSharp.Extensions.LanguageServer.Protocol;
6+
using OmniSharp.Extensions.LanguageServer.Protocol.Models;
7+
8+
namespace OmniSharp.Extensions.LanguageServer.Client.Clients
9+
{
10+
/// <summary>
11+
/// Client for the LSP Text Document API.
12+
/// </summary>
13+
public partial class TextDocumentClient
14+
{
15+
/// <summary>
16+
/// Request signature help at the specified document position.
17+
/// </summary>
18+
/// <param name="filePath">
19+
/// The full file-system path of the text document.
20+
/// </param>
21+
/// <param name="line">
22+
/// The target line (0-based).
23+
/// </param>
24+
/// <param name="column">
25+
/// The target column (0-based).
26+
/// </param>
27+
/// <param name="cancellationToken">
28+
/// An optional <see cref="CancellationToken"/> that can be used to cancel the request.
29+
/// </param>
30+
/// <returns>
31+
/// A <see cref="Task{TResult}"/> that resolves to the completions or <c>null</c> if no completions are available at the specified position.
32+
/// </returns>
33+
public Task<SignatureHelp> SignatureHelp(string filePath, int line, int column, CancellationToken cancellationToken = default(CancellationToken))
34+
{
35+
if (string.IsNullOrWhiteSpace(filePath))
36+
throw new ArgumentException($"Argument cannot be null, empty, or entirely composed of whitespace: {nameof(filePath)}.", nameof(filePath));
37+
38+
var documentUri = DocumentUri.FromFileSystemPath(filePath);
39+
40+
return SignatureHelp(documentUri, line, column, cancellationToken);
41+
}
42+
43+
/// <summary>
44+
/// Request signature help at the specified document position.
45+
/// </summary>
46+
/// <param name="documentUri">
47+
/// The document URI.
48+
/// </param>
49+
/// <param name="line">
50+
/// The target line (0-based).
51+
/// </param>
52+
/// <param name="column">
53+
/// The target column (0-based).
54+
/// </param>
55+
/// <param name="cancellationToken">
56+
/// An optional <see cref="CancellationToken"/> that can be used to cancel the request.
57+
/// </param>
58+
/// <returns>
59+
/// A <see cref="Task{TResult}"/> that resolves to the completions or <c>null</c> if no completions are available at the specified position.
60+
/// </returns>
61+
public Task<SignatureHelp> SignatureHelp(Uri documentUri, int line, int column, CancellationToken cancellationToken = default(CancellationToken))
62+
{
63+
return PositionalRequest<SignatureHelp>(DocumentNames.SignatureHelp, documentUri, line, column, cancellationToken);
64+
}
65+
}
66+
}

test/Client.Tests/ClientTests.cs

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,73 @@ public async Task Completions_Success()
191191
});
192192
}
193193

194+
/// <summary>
195+
/// Ensure that the language client can successfully request SignatureHelp.
196+
/// </summary>
197+
[Fact(DisplayName = "Language client can successfully request signature help", Skip = "Periodic failures")]
198+
public async Task SignatureHelp_Success()
199+
{
200+
await Connect();
201+
202+
const int line = 5;
203+
const int column = 5;
204+
var expectedDocumentPath = AbsoluteDocumentPath;
205+
var expectedDocumentUri = DocumentUri.FromFileSystemPath(expectedDocumentPath);
206+
207+
var expectedSignatureHelp = new SignatureHelp {
208+
ActiveParameter = 0,
209+
ActiveSignature = 0,
210+
Signatures = new[] {
211+
new SignatureInformation {
212+
Documentation = new StringOrMarkupContent("test documentation"),
213+
Label = "TestSignature",
214+
Parameters = new[] {
215+
new ParameterInformation {
216+
Documentation = "test parameter documentation",
217+
Label = "parameter label"
218+
}
219+
}
220+
}
221+
}
222+
};
223+
224+
ServerDispatcher.HandleRequest<TextDocumentPositionParams, SignatureHelp>(DocumentNames.SignatureHelp, (request, cancellationToken) => {
225+
Assert.NotNull(request.TextDocument);
226+
227+
Assert.Equal(expectedDocumentUri, request.TextDocument.Uri);
228+
229+
Assert.Equal(line, request.Position.Line);
230+
Assert.Equal(column, request.Position.Character);
231+
232+
return Task.FromResult(expectedSignatureHelp);
233+
});
234+
235+
var actualSignatureHelp = await LanguageClient.TextDocument.SignatureHelp(AbsoluteDocumentPath, line, column);
236+
237+
Assert.Equal(expectedSignatureHelp.ActiveParameter, actualSignatureHelp.ActiveParameter);
238+
Assert.Equal(expectedSignatureHelp.ActiveSignature, actualSignatureHelp.ActiveSignature);
239+
240+
var actualSignatures = actualSignatureHelp.Signatures.ToArray();
241+
Assert.Collection(actualSignatures, actualSignature => {
242+
var expectedSignature = expectedSignatureHelp.Signatures.ToArray()[0];
243+
244+
Assert.True(actualSignature.Documentation.HasString);
245+
Assert.Equal(expectedSignature.Documentation.String, actualSignature.Documentation.String);
246+
247+
Assert.Equal(expectedSignature.Label, actualSignature.Label);
248+
249+
var expectedParameters = expectedSignature.Parameters.ToArray();
250+
var actualParameters = actualSignature.Parameters.ToArray();
251+
252+
Assert.Collection(actualParameters, actualParameter => {
253+
var expectedParameter = expectedParameters[0];
254+
Assert.True(actualParameter.Documentation.HasString);
255+
Assert.Equal(expectedParameter.Documentation.String, actualParameter.Documentation.String);
256+
Assert.Equal(expectedParameter.Label, actualParameter.Label);
257+
});
258+
});
259+
}
260+
194261
/// <summary>
195262
/// Ensure that the language client can successfully receive Diagnostics from the server.
196263
/// </summary>

0 commit comments

Comments
 (0)