@@ -31,11 +31,16 @@ internal class PsesLanguageServer
31
31
32
32
/// <summary>
33
33
/// Create a new language server instance.
34
+ ///
35
+ /// NOTE: This class is only ever instantiated via <see
36
+ /// cref="EditorServicesServerFactory.CreateLanguageServer"/>. It is essentially a
37
+ /// singleton. The factory hides the logger.
34
38
/// </summary>
35
39
/// <param name="factory">Factory to create loggers with.</param>
36
40
/// <param name="inputStream">Protocol transport input stream.</param>
37
41
/// <param name="outputStream">Protocol transport output stream.</param>
38
- /// <param name="hostStartupInfo">Host configuration to instantiate the server and services with.</param>
42
+ /// <param name="hostStartupInfo">Host configuration to instantiate the server and services
43
+ /// with.</param>
39
44
public PsesLanguageServer (
40
45
ILoggerFactory factory ,
41
46
Stream inputStream ,
@@ -52,6 +57,10 @@ public PsesLanguageServer(
52
57
53
58
/// <summary>
54
59
/// Start the server listening for input.
60
+ ///
61
+ /// For the services (including the <see cref="PowerShellContextService">
62
+ /// context wrapper around PowerShell itself) see <see
63
+ /// cref="PsesServiceCollectionExtensions.AddPsesLanguageServices"/>.
55
64
/// </summary>
56
65
/// <returns>A task that completes when the server is ready and listening.</returns>
57
66
public async Task StartAsync ( )
@@ -62,11 +71,12 @@ public async Task StartAsync()
62
71
. WithInput ( _inputStream )
63
72
. WithOutput ( _outputStream )
64
73
. WithServices ( serviceCollection => serviceCollection
65
- . AddPsesLanguageServices ( _hostDetails ) )
74
+ . AddPsesLanguageServices ( _hostDetails ) ) // NOTE: This adds a lot of services!
66
75
. ConfigureLogging ( builder => builder
67
- . AddSerilog ( Log . Logger )
76
+ . AddSerilog ( Log . Logger ) // TODO: Set dispose to true?
68
77
. AddLanguageProtocolLogging ( )
69
78
. SetMinimumLevel ( _minimumLogLevel ) )
79
+ // TODO: Consider replacing all WithHandler with AddSingleton
70
80
. WithHandler < PsesWorkspaceSymbolsHandler > ( )
71
81
. WithHandler < PsesTextDocumentHandler > ( )
72
82
. WithHandler < GetVersionHandler > ( )
@@ -91,10 +101,14 @@ public async Task StartAsync()
91
101
. WithHandler < ShowHelpHandler > ( )
92
102
. WithHandler < ExpandAliasHandler > ( )
93
103
. WithHandler < PsesSemanticTokensHandler > ( )
104
+ // The OnInitialize delegate gets run when we first receive the _Initialize_ request:
105
+ // https://microsoft.github.io/language-server-protocol/specifications/specification-current/#initialize
94
106
. OnInitialize (
95
107
// TODO: Either fix or ignore "method lacks 'await'" warning.
96
108
async ( languageServer , request , cancellationToken ) =>
97
109
{
110
+ Log . Logger . Debug ( "Initializing OmniSharp Language Server" ) ;
111
+
98
112
var serviceProvider = languageServer . Services ;
99
113
var workspaceService = serviceProvider . GetService < WorkspaceService > ( ) ;
100
114
@@ -125,6 +139,7 @@ public async Task StartAsync()
125
139
/// <returns>A task that completes when the server is shut down.</returns>
126
140
public async Task WaitForShutdown ( )
127
141
{
142
+ Log . Logger . Debug ( "Shutting down OmniSharp Language Server" ) ;
128
143
await _serverStart . Task . ConfigureAwait ( false ) ;
129
144
await LanguageServer . WaitForExit . ConfigureAwait ( false ) ;
130
145
}
0 commit comments