├── .gitignore
├── .vscode
├── launch.json
└── tasks.json
├── DotNetLanguageClient.sln
├── DotNetLanguageClient.snk
├── LICENSE
├── NuGet.config
├── README.md
├── Version.props
├── samples
├── Client
│ ├── Client.csproj
│ └── Program.cs
├── Common
│ ├── Common.csproj
│ ├── ConfigurationHandler.cs
│ ├── Dummy.cs
│ └── HoverHandler.cs
├── Samples.props
├── Server
│ ├── Program.cs
│ └── Server.csproj
├── SingleProcess
│ ├── Program.cs
│ └── SingleProcess.csproj
└── VisualStudioExtension
│ ├── AssemblyDependencies.cs
│ ├── ExtensionPackage.cs
│ ├── Key.snk
│ ├── LspQuickInfoProvider.cs
│ ├── LspQuickInfoSource.cs
│ ├── Markdown.cs
│ ├── Properties
│ └── AssemblyInfo.cs
│ ├── README.md
│ ├── Resources
│ └── ExtensionPackage.ico
│ ├── TextViewCreationListener.cs
│ ├── ThreadAffinitiveSynchronizationContext.cs
│ ├── VSPackage.resx
│ ├── VisualStudioApiExtensions.cs
│ ├── VisualStudioExtension.csproj
│ ├── app.config
│ ├── packages.config
│ └── source.extension.vsixmanifest
├── src
├── Common.props
└── LSP.Client
│ ├── Clients
│ ├── TextDocumentClient.Completions.cs
│ ├── TextDocumentClient.Diagnostics.cs
│ ├── TextDocumentClient.Hover.cs
│ ├── TextDocumentClient.Sync.cs
│ ├── TextDocumentClient.cs
│ ├── WindowClient.cs
│ └── WorkspaceClient.cs
│ ├── Dispatcher
│ ├── LspDispatcher.cs
│ └── LspDispatcherExtensions.cs
│ ├── Exceptions.cs
│ ├── HandlerDelegates.cs
│ ├── Handlers
│ ├── DelegateEmptyNotificationHandler.cs
│ ├── DelegateHandler.cs
│ ├── DelegateNotificationHandler.cs
│ ├── DelegateRequestHandler.cs
│ ├── DelegateRequestResponseHandler.cs
│ ├── DynamicRegistrationHandler.cs
│ ├── HandlerKind.cs
│ ├── IHandler.cs
│ ├── IInvokeEmptyNotificationHandler.cs
│ ├── IInvokeNotificationHandler.cs
│ ├── IInvokeRequestHandler.cs
│ ├── JsonRpcEmptyNotificationHandler.cs
│ ├── JsonRpcHandler.cs
│ └── JsonRpcNotificationHandler.cs
│ ├── LSP.Client.csproj
│ ├── LanguageClient.cs
│ ├── LanguageClientRegistration.cs
│ ├── Logging
│ ├── OverwriteSourceContextEnricher.cs
│ └── SerilogExtensions.cs
│ ├── LspErrorCodes.cs
│ ├── Processes
│ ├── NamedPipeServerProcess.cs
│ ├── ServerProcess.cs
│ └── StdioServerProcess.cs
│ ├── Protocol
│ ├── ClientMessage.cs
│ ├── ErrorMessage.cs
│ ├── LspConnection.cs
│ ├── LspConnectionExtensions.cs
│ └── ServerMessage.cs
│ └── Utilities
│ └── DocumentUri.cs
└── test
├── LSP.Client.Tests
├── ConnectionTests.cs
├── LSP.Client.Tests.csproj
├── Logging
│ ├── SerilogTestOutputExtensions.cs
│ └── TestOutputSink.cs
├── PipeServerTestBase.cs
├── PipeTests.cs
└── TestBase.cs
└── TestCommon.props
/.gitignore:
--------------------------------------------------------------------------------
1 | ## VS Code
2 | .vscode/*
3 | !.vscode/settings.json
4 | !.vscode/tasks.json
5 | !.vscode/launch.json
6 | !.vscode/extensions.json
7 |
8 | # Mac
9 | .DS_Store
10 |
11 | ## Visual Studio
12 |
13 | # User-specific files
14 | *.suo
15 | *.user
16 | *.userosscache
17 | *.sln.docstates
18 |
19 | # User-specific files (MonoDevelop/Xamarin Studio)
20 | *.userprefs
21 |
22 | # Build results
23 | [Dd]ebug/
24 | [Dd]ebugPublic/
25 | [Rr]elease/
26 | [Rr]eleases/
27 | x64/
28 | x86/
29 | bld/
30 | [Bb]in/
31 | [Oo]bj/
32 | [Ll]og/
33 |
34 | # Visual Studio 2015 cache/options directory
35 | .vs/
36 | # Uncomment if you have tasks that create the project's static files in wwwroot
37 | #wwwroot/
38 |
39 | # MSTest test Results
40 | [Tt]est[Rr]esult*/
41 | [Bb]uild[Ll]og.*
42 |
43 | # NUNIT
44 | *.VisualState.xml
45 | TestResult.xml
46 |
47 | # Build Results of an ATL Project
48 | [Dd]ebugPS/
49 | [Rr]eleasePS/
50 | dlldata.c
51 |
52 | # .NET Core
53 | project.lock.json
54 | project.fragment.lock.json
55 | artifacts/
56 | **/Properties/launchSettings.json
57 |
58 | *_i.c
59 | *_p.c
60 | *_i.h
61 | *.ilk
62 | *.meta
63 | *.obj
64 | *.pch
65 | *.pdb
66 | *.pgc
67 | *.pgd
68 | *.rsp
69 | *.sbr
70 | *.tlb
71 | *.tli
72 | *.tlh
73 | *.tmp
74 | *.tmp_proj
75 | *.log
76 | *.vspscc
77 | *.vssscc
78 | .builds
79 | *.pidb
80 | *.svclog
81 | *.scc
82 |
83 | # Chutzpah Test files
84 | _Chutzpah*
85 |
86 | # Visual C++ cache files
87 | ipch/
88 | *.aps
89 | *.ncb
90 | *.opendb
91 | *.opensdf
92 | *.sdf
93 | *.cachefile
94 | *.VC.db
95 | *.VC.VC.opendb
96 |
97 | # Visual Studio profiler
98 | *.psess
99 | *.vsp
100 | *.vspx
101 | *.sap
102 |
103 | # TFS 2012 Local Workspace
104 | $tf/
105 |
106 | # Guidance Automation Toolkit
107 | *.gpState
108 |
109 | # ReSharper is a .NET coding add-in
110 | _ReSharper*/
111 | *.[Rr]e[Ss]harper
112 | *.DotSettings.user
113 |
114 | # JustCode is a .NET coding add-in
115 | .JustCode
116 |
117 | # TeamCity is a build add-in
118 | _TeamCity*
119 |
120 | # DotCover is a Code Coverage Tool
121 | *.dotCover
122 |
123 | # Visual Studio code coverage results
124 | *.coverage
125 | *.coveragexml
126 |
127 | # NCrunch
128 | _NCrunch_*
129 | .*crunch*.local.xml
130 | nCrunchTemp_*
131 |
132 | # MightyMoose
133 | *.mm.*
134 | AutoTest.Net/
135 |
136 | # Web workbench (sass)
137 | .sass-cache/
138 |
139 | # Installshield output folder
140 | [Ee]xpress/
141 |
142 | # DocProject is a documentation generator add-in
143 | DocProject/buildhelp/
144 | DocProject/Help/*.HxT
145 | DocProject/Help/*.HxC
146 | DocProject/Help/*.hhc
147 | DocProject/Help/*.hhk
148 | DocProject/Help/*.hhp
149 | DocProject/Help/Html2
150 | DocProject/Help/html
151 |
152 | # Click-Once directory
153 | publish/
154 |
155 | # Publish Web Output
156 | *.[Pp]ublish.xml
157 | *.azurePubxml
158 | # TODO: Comment the next line if you want to checkin your web deploy settings
159 | # but database connection strings (with potential passwords) will be unencrypted
160 | *.pubxml
161 | *.publishproj
162 |
163 | # Microsoft Azure Web App publish settings. Comment the next line if you want to
164 | # checkin your Azure Web App publish settings, but sensitive information contained
165 | # in these scripts will be unencrypted
166 | PublishScripts/
167 |
168 | # NuGet Packages
169 | **/packages/*
170 | # except build/, which is used as an MSBuild target.
171 | !**/packages/build/
172 | # Uncomment if necessary however generally it will be regenerated when needed
173 | #!**/packages/repositories.config
174 | # NuGet v3's project.json files produces more ignorable files
175 | *.nuget.props
176 | *.nuget.targets
177 |
178 | # Microsoft Azure Build Output
179 | csx/
180 | *.build.csdef
181 |
182 | # Microsoft Azure Emulator
183 | ecf/
184 | rcf/
185 |
186 | # Windows Store app package directories and files
187 | AppPackages/
188 | BundleArtifacts/
189 | Package.StoreAssociation.xml
190 | _pkginfo.txt
191 |
192 | # Visual Studio cache files
193 | # files ending in .cache can be ignored
194 | *.[Cc]ache
195 | # but keep track of directories ending in .cache
196 | !*.[Cc]ache/
197 |
198 | # Others
199 | ClientBin/
200 | ~$*
201 | *~
202 | *.dbmdl
203 | *.dbproj.schemaview
204 | *.jfm
205 | *.pfx
206 | *.publishsettings
207 | orleans.codegen.cs
208 |
209 | # Since there are multiple workflows, uncomment next line to ignore bower_components
210 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
211 | #bower_components/
212 |
213 | # RIA/Silverlight projects
214 | Generated_Code/
215 |
216 | # Backup & report files from converting an old project file
217 | # to a newer Visual Studio version. Backup files are not needed,
218 | # because we have git ;-)
219 | _UpgradeReport_Files/
220 | Backup*/
221 | UpgradeLog*.XML
222 | UpgradeLog*.htm
223 |
224 | # SQL Server files
225 | *.mdf
226 | *.ldf
227 | *.ndf
228 |
229 | # Business Intelligence projects
230 | *.rdl.data
231 | *.bim.layout
232 | *.bim_*.settings
233 |
234 | # Microsoft Fakes
235 | FakesAssemblies/
236 |
237 | # GhostDoc plugin setting file
238 | *.GhostDoc.xml
239 |
240 | # Node.js Tools for Visual Studio
241 | .ntvs_analysis.dat
242 | node_modules/
243 |
244 | # Typescript v1 declaration files
245 | typings/
246 |
247 | # Visual Studio 6 build log
248 | *.plg
249 |
250 | # Visual Studio 6 workspace options file
251 | *.opt
252 |
253 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
254 | *.vbw
255 |
256 | # Visual Studio LightSwitch build output
257 | **/*.HTMLClient/GeneratedArtifacts
258 | **/*.DesktopClient/GeneratedArtifacts
259 | **/*.DesktopClient/ModelManifest.xml
260 | **/*.Server/GeneratedArtifacts
261 | **/*.Server/ModelManifest.xml
262 | _Pvt_Extensions
263 |
264 | # Paket dependency manager
265 | .paket/paket.exe
266 | paket-files/
267 |
268 | # FAKE - F# Make
269 | .fake/
270 |
271 | # JetBrains Rider
272 | .idea/
273 | *.sln.iml
274 |
275 | # CodeRush
276 | .cr/
277 |
278 | # Python Tools for Visual Studio (PTVS)
279 | __pycache__/
280 | *.pyc
281 |
282 | # Cake - Uncomment if you are using it
283 | # tools/**
284 | # !tools/packages.config
285 |
286 | # Telerik's JustMock configuration file
287 | *.jmconfig
288 |
289 | # BizTalk build output
290 | *.btp.cs
291 | *.btm.cs
292 | *.odx.cs
293 | *.xsd.cs
294 |
295 |
--------------------------------------------------------------------------------
/.vscode/launch.json:
--------------------------------------------------------------------------------
1 | {
2 | // Use IntelliSense to find out which attributes exist for C# debugging
3 | // Use hover for the description of the existing attributes
4 | // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
5 | "version": "0.2.0",
6 | "configurations": [
7 | {
8 | "name": ".NET Core Launch (console)",
9 | "type": "coreclr",
10 | "request": "launch",
11 | "preLaunchTask": "build",
12 | // If you have changed target frameworks, make sure to update the program path.
13 | "program": "${workspaceRoot}/samples/Client/bin/Debug/netcoreapp2.0/Client.dll",
14 | "args": [],
15 | "cwd": "${workspaceRoot}/samples/Client",
16 | // For more information about the 'console' field, see https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md#console-terminal-window
17 | "console": "internalConsole",
18 | "stopAtEntry": false,
19 | "internalConsoleOptions": "openOnSessionStart"
20 | },
21 | {
22 | "name": ".NET Core Attach",
23 | "type": "coreclr",
24 | "request": "attach",
25 | "processId": "${command:pickProcess}"
26 | }
27 | ]
28 | }
--------------------------------------------------------------------------------
/.vscode/tasks.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "0.1.0",
3 | "command": "dotnet",
4 | "isShellCommand": true,
5 | "args": [],
6 | "tasks": [
7 | {
8 | "taskName": "build",
9 | "args": [
10 | "${workspaceRoot}/samples/Client/Client.csproj"
11 | ],
12 | "isBuildCommand": true,
13 | "problemMatcher": "$msCompile"
14 | }
15 | ]
16 | }
--------------------------------------------------------------------------------
/DotNetLanguageClient.snk:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tintoy/dotnet-language-client/208f65cf7e5080ed345fd7be19d2d4764d3393ba/DotNetLanguageClient.snk
--------------------------------------------------------------------------------
/NuGet.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # dotnet-language-client
2 | .NET client for the Language Server Protocol (LSP)
3 |
4 | **NOTE:** this code has been merged into OmniSharp's [csharp-language-server-protocol](https://github.com/OmniSharp/csharp-language-server-protocol/tree/master/src/Client) (NuGet package [here](https://www.nuget.org/packages/OmniSharp.Extensions.LanguageClient/)).
5 |
6 | ## Usage
7 |
8 | ```csharp
9 | ProcessStartInfo serverStartInfo = new ProcessStartInfo("dotnet")
10 | {
11 | Arguments = $"\"{ServerAssembly}\" arg1 arg2 arg3",
12 | Environment =
13 | {
14 | ["SomeVar"] = "Foo"
15 | }
16 | };
17 |
18 | Log.Information("Starting server...");
19 | using (LanguageClient client = new LanguageClient(serverStartInfo))
20 | {
21 | client.HandleNotification("dummy/notify", () =>
22 | {
23 | Log.Information("Received dummy notification from language server.");
24 | });
25 |
26 | await client.Start();
27 |
28 | Log.Information("Client started.");
29 |
30 | Log.Information("Sending 'initialize' request...");
31 | InitializeResult initializeResult = await client.SendRequest("initialize", new InitializeParams
32 | {
33 | RootPath = @"C:\Foo",
34 | Capabilities = new ClientCapabilities
35 | {
36 | Workspace = new WorkspaceClientCapabilites
37 | {
38 |
39 | },
40 | TextDocument = new TextDocumentClientCapabilities
41 | {
42 |
43 | }
44 | }
45 | });
46 | Log.Information("Received InitializeResult {@InitializeResult}...", initializeResult);
47 |
48 | Log.Information("Sending 'dummy' request...");
49 | await client.SendRequest("dummy", new DummyParams
50 | {
51 | Message = "Hello, world!"
52 | });
53 |
54 | Log.Information("Stopping language server...");
55 | await client.Stop();
56 | Log.Information("Server stopped.");
57 | }
58 | ```
59 |
60 | ## Visual Studio Extension Sample
61 |
62 | > What's with all the assemblies in the project folder?
63 |
64 | VS won't find our assembly dependencies (a bigger issue for .NET Standard assemblies) unless we include them in the VSIX and provide a custom code-base (see `AssemblyDependencies.cs`).
65 | There's a custom target in the project to include some of the, but I haven't had time to include the others (e.g. `Serilog` and friends).
66 |
67 | I haven't had time to reorganise the assembly dependency stuff yet, but there's probably a much cleaner way to do it.
68 |
--------------------------------------------------------------------------------
/Version.props:
--------------------------------------------------------------------------------
1 |
2 |
3 | 1.0.0
4 |
5 | <_VersionSuffix>$(VersionSuffix)
6 | <_VersionSuffix Condition=" '$(VersionSuffix)' == '' ">dev
7 | <_VersionSuffix Condition=" '$(VersionSuffix)' == 'release' ">
8 | $(_VersionSuffix)
9 |
10 |
--------------------------------------------------------------------------------
/samples/Client/Client.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Exe
5 | netcoreapp2.0
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/samples/Client/Program.cs:
--------------------------------------------------------------------------------
1 | using Common;
2 | using OmniSharp.Extensions.LanguageServer.Capabilities.Client;
3 | using LSP.Client;
4 | using Newtonsoft.Json.Linq;
5 | using Serilog;
6 | using Serilog.Events;
7 | using System;
8 | using System.Diagnostics;
9 | using System.IO;
10 | using System.Threading;
11 | using System.Threading.Tasks;
12 |
13 | namespace Client
14 | {
15 | ///
16 | /// A simple demo of using the to interact with a language server.
17 | ///
18 | static class Program
19 | {
20 | ///
21 | /// The full path to the assembly that implements the language server.
22 | ///
23 | static readonly string ServerAssembly = Path.GetFullPath(Path.Combine(
24 | Path.GetDirectoryName(typeof(Program).Assembly.Location), "..", "..", "..", "..",
25 | "Server/bin/Debug/netcoreapp2.0/Server.dll".Replace('/', Path.DirectorySeparatorChar)
26 | ));
27 |
28 | ///
29 | /// The main program entry-point.
30 | ///
31 | static void Main()
32 | {
33 | SynchronizationContext.SetSynchronizationContext(
34 | new SynchronizationContext()
35 | );
36 |
37 | ConfigureLogging();
38 |
39 | try
40 | {
41 | AsyncMain().Wait();
42 | }
43 | catch (AggregateException unexpectedError)
44 | {
45 | foreach (Exception exception in unexpectedError.Flatten().InnerExceptions)
46 | Log.Error(exception, "Unexpected error.");
47 | }
48 | catch (Exception unexpectedError)
49 | {
50 | Log.Error(unexpectedError, "Unexpected error.");
51 | }
52 | finally
53 | {
54 | Log.CloseAndFlush();
55 | }
56 | }
57 |
58 | ///
59 | /// The main asynchronous program entry-point.
60 | ///
61 | ///
62 | /// A representing program operation.
63 | ///
64 | static async Task AsyncMain()
65 | {
66 | ProcessStartInfo serverStartInfo = new ProcessStartInfo("dotnet")
67 | {
68 | Arguments = $"\"{ServerAssembly}\""
69 | };
70 |
71 | Log.Information("Starting server...");
72 | LanguageClient client = new LanguageClient(Log.Logger, serverStartInfo)
73 | {
74 | ClientCapabilities =
75 | {
76 | Workspace =
77 | {
78 | DidChangeConfiguration = new DidChangeConfigurationCapability
79 | {
80 | DynamicRegistration = false
81 | }
82 | }
83 | }
84 | };
85 | using (client)
86 | {
87 | // Listen for log messages from the language server.
88 | client.Window.OnLogMessage((message, messageType) =>
89 | {
90 | Log.Information("Language server says: [{MessageType:l}] {Message}", messageType, message);
91 | });
92 |
93 | // Listen for our custom notification from the language server.
94 | client.HandleNotification("dummy/notify", notification =>
95 | {
96 | Log.Information("Received dummy notification from language server: {Message}",
97 | notification.Message
98 | );
99 | });
100 |
101 | await client.Initialize(workspaceRoot: @"C:\Foo");
102 |
103 | Log.Information("Client started.");
104 |
105 | // Update server configuration.
106 | client.Workspace.DidChangeConfiguration(
107 | new JObject(
108 | new JProperty("setting1", true),
109 | new JProperty("setting2", "Hello")
110 | )
111 | );
112 |
113 | // Invoke our custom handler.
114 | await client.SendRequest("dummy", new DummyParams
115 | {
116 | Message = "Hello, world!"
117 | });
118 |
119 | Log.Information("Stopping language server...");
120 | await client.Shutdown();
121 | Log.Information("Server stopped.");
122 | }
123 | }
124 |
125 | ///
126 | /// Configure the global logger.
127 | ///
128 | static void ConfigureLogging()
129 | {
130 | LogEventLevel logLevel =
131 | Environment.GetEnvironmentVariable("LSP_VERBOSE_LOGGING") == "1"
132 | ? LogEventLevel.Verbose
133 | : LogEventLevel.Information;
134 |
135 | LoggerConfiguration loggerConfiguration =
136 | new LoggerConfiguration()
137 | .MinimumLevel.Verbose()
138 | .Enrich.WithProperty("ProcessId", Process.GetCurrentProcess().Id)
139 | .Enrich.WithProperty("Source", "Client")
140 | .WriteTo.Debug(
141 | restrictedToMinimumLevel: logLevel
142 | );
143 |
144 | string seqUrl = Environment.GetEnvironmentVariable("LSP_SEQ_URL");
145 | if (!String.IsNullOrWhiteSpace(seqUrl))
146 | {
147 | loggerConfiguration = loggerConfiguration.WriteTo.Seq(seqUrl,
148 | apiKey: Environment.GetEnvironmentVariable("LSP_SEQ_API_KEY"),
149 | restrictedToMinimumLevel: logLevel
150 | );
151 | }
152 |
153 | string logFile = Environment.GetEnvironmentVariable("LSP_LOG_FILE");
154 | if (!String.IsNullOrWhiteSpace(logFile))
155 | {
156 | string logExtension = Path.GetExtension(logFile);
157 | logFile = Path.GetFullPath(
158 | Path.ChangeExtension(logFile, ".Client" + logExtension)
159 | );
160 |
161 | loggerConfiguration = loggerConfiguration.WriteTo.File(logFile,
162 | restrictedToMinimumLevel: logLevel
163 | );
164 | }
165 |
166 | Log.Logger = loggerConfiguration.CreateLogger();
167 | }
168 | }
169 | }
170 |
--------------------------------------------------------------------------------
/samples/Common/Common.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | netstandard2.0
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
--------------------------------------------------------------------------------
/samples/Common/ConfigurationHandler.cs:
--------------------------------------------------------------------------------
1 | using OmniSharp.Extensions.LanguageServer.Abstractions;
2 | using OmniSharp.Extensions.LanguageServer.Capabilities.Client;
3 | using OmniSharp.Extensions.LanguageServer.Models;
4 | using OmniSharp.Extensions.LanguageServer.Protocol;
5 | using Serilog;
6 | using System.Threading.Tasks;
7 |
8 | namespace Common
9 | {
10 | ///
11 | /// Handler for "workspace/didChangeConfiguration" notifications.
12 | ///
13 | public class ConfigurationHandler
14 | : IDidChangeConfigurationHandler
15 | {
16 | ///
17 | /// The client-side capabilities for DidChangeConfiguration.
18 | ///
19 | public DidChangeConfigurationCapability Capabilities { get; private set; }
20 |
21 | ///
22 | /// Handle a "workspace/didChangeConfiguration" notification.
23 | ///
24 | ///
25 | /// The notification message.
26 | ///
27 | ///
28 | /// A representing the operation.
29 | ///
30 | public Task Handle(DidChangeConfigurationParams notification)
31 | {
32 | Log.Information("Received DidChangeConfiguration notification: {@Settings}", notification.Settings);
33 |
34 | return Task.CompletedTask;
35 | }
36 |
37 | ///
38 | /// Called to notify the handler of the client-side capabilities for DidChangeconfiguration.
39 | ///
40 | ///
41 | /// A representing the capabilities.
42 | ///
43 | void ICapability.SetCapability(DidChangeConfigurationCapability capabilities)
44 | {
45 | Log.Information("ConfigurationHandler recieved capability: {@Capability}", capabilities);
46 |
47 | Capabilities = capabilities;
48 | }
49 |
50 | ///
51 | /// Get registration options (unused).
52 | ///
53 | ///
54 | /// null
55 | ///
56 | object IRegistration