-
Notifications
You must be signed in to change notification settings - Fork 418
/
Copy pathOmniSharpSignatureHelpHandler.cs
80 lines (70 loc) · 3.2 KB
/
OmniSharpSignatureHelpHandler.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using OmniSharp.Extensions.JsonRpc;
using OmniSharp.Extensions.LanguageServer.Protocol.Client.Capabilities;
using OmniSharp.Extensions.LanguageServer.Protocol.Document;
using OmniSharp.Extensions.LanguageServer.Protocol.Models;
using OmniSharp.Extensions.LanguageServer.Protocol.Server;
using OmniSharp.Models.SignatureHelp;
namespace OmniSharp.LanguageServerProtocol.Handlers
{
internal class OmniSharpSignatureHelpHandler : SignatureHelpHandlerBase
{
private readonly Mef.IRequestHandler<SignatureHelpRequest, SignatureHelpResponse> _signatureHandler;
private readonly DocumentSelector _documentSelector;
public OmniSharpSignatureHelpHandler(Mef.IRequestHandler<SignatureHelpRequest, SignatureHelpResponse> signatureHandler, DocumentSelector documentSelector)
{
_signatureHandler = signatureHandler;
_documentSelector = documentSelector;
}
public static IEnumerable<IJsonRpcHandler> Enumerate(RequestHandlers handlers)
{
foreach (var (selector, handler) in handlers
.OfType<Mef.IRequestHandler<SignatureHelpRequest, SignatureHelpResponse>>())
if (handler != null)
yield return new OmniSharpSignatureHelpHandler(handler, selector);
}
public override async Task<SignatureHelp> Handle(SignatureHelpParams request, CancellationToken token)
{
var omnisharpRequest = new SignatureHelpRequest
{
FileName = Helpers.FromUri(request.TextDocument.Uri),
Column = Convert.ToInt32(request.Position.Character),
Line = Convert.ToInt32(request.Position.Line)
};
var omnisharpResponse = await _signatureHandler.Handle(omnisharpRequest);
if (omnisharpResponse == null || !omnisharpResponse.Signatures.Any())
{
return null;
}
var containerSignatures = omnisharpResponse.Signatures.Select(x => new SignatureInformation
{
Documentation = x.Documentation,
Label = x.Label,
Parameters = new Container<ParameterInformation>(x.Parameters.Select(param => new ParameterInformation
{
Documentation = param.Documentation,
Label = param.Label
}))
});
var signatures = new Container<SignatureInformation>(containerSignatures);
return new SignatureHelp
{
ActiveParameter = omnisharpResponse.ActiveParameter,
ActiveSignature = omnisharpResponse.ActiveSignature,
Signatures = signatures
};
}
protected override SignatureHelpRegistrationOptions CreateRegistrationOptions(SignatureHelpCapability capability, ClientCapabilities clientCapabilities)
{
return new SignatureHelpRegistrationOptions()
{
DocumentSelector = _documentSelector,
TriggerCharacters = new[] { "(", ",", "<", "{", "[" }
};
}
}
}