@@ -127,9 +127,10 @@ export class RoslynLanguageServer {
127
127
private _context : vscode . ExtensionContext ,
128
128
private _telemetryReporter : TelemetryReporter ,
129
129
private _languageServerEvents : RoslynLanguageServerEvents ,
130
- private _channel : vscode . LogOutputChannel
130
+ private _channel : vscode . LogOutputChannel ,
131
+ private _traceChannel : vscode . LogOutputChannel
131
132
) {
132
- this . registerSetTrace ( ) ;
133
+ this . registerOutputChannelsChangeHandlers ( ) ;
133
134
this . registerSendOpenSolution ( ) ;
134
135
this . registerProjectInitialization ( ) ;
135
136
this . registerServerStateChanged ( ) ;
@@ -164,29 +165,41 @@ export class RoslynLanguageServer {
164
165
return RoslynLanguageServer . _processId ;
165
166
}
166
167
167
- private registerSetTrace ( ) {
168
- // Set the language client trace level based on the log level option.
169
- // setTrace only works after the client is already running.
168
+ private registerOutputChannelsChangeHandlers ( ) {
170
169
this . _languageClient . onDidChangeState ( async ( state ) => {
171
170
if ( state . newState === State . Running ) {
172
- await this . updateLogLevel ( ) ;
171
+ await this . updateOutputChannelLogLevel ( ) ;
172
+ await this . updateTraceChannelLogLevel ( ) ;
173
173
}
174
174
} ) ;
175
175
// Register for changes to the log level.
176
176
this . _channel . onDidChangeLogLevel ( async ( ) => {
177
- await this . updateLogLevel ( ) ;
177
+ await this . updateOutputChannelLogLevel ( ) ;
178
+ } ) ;
179
+ this . _traceChannel . onDidChangeLogLevel ( async ( ) => {
180
+ // The LSP client also responds to didChangeLogLevel and sets its own logic; we want to override that so do a small delay
181
+ setTimeout ( async ( ) => {
182
+ await this . updateTraceChannelLogLevel ( ) ;
183
+ } , 1 ) ;
178
184
} ) ;
179
185
}
180
186
181
- private async updateLogLevel ( ) : Promise < void > {
187
+ private async updateOutputChannelLogLevel ( ) : Promise < void > {
182
188
if ( this . _languageClient . state === State . Running ) {
183
- const languageClientTraceLevel = RoslynLanguageServer . GetTraceLevel ( this . _channel . logLevel ) ;
184
189
// Update the server's log level.
185
190
await this . sendNotification ( 'roslyn/updateLogLevel' , {
186
191
logLevel : RoslynLanguageServer . GetServerLogLevel ( this . _channel . logLevel ) ,
187
192
} ) ;
188
- // Update the trace level that the client uses to log trace messages.
189
- await this . _languageClient . setTrace ( languageClientTraceLevel ) ;
193
+ }
194
+ }
195
+
196
+ private async updateTraceChannelLogLevel ( ) : Promise < void > {
197
+ if ( this . _languageClient . state === State . Running ) {
198
+ await this . _languageClient . setTrace (
199
+ // If the logLevel is set to trace, we want to have verbose tracing. All tracing from the LSP client is done at 'trace' level,
200
+ // so we can't show tracing at any other output window levels, since it just gets filtered away.
201
+ this . _traceChannel . logLevel == vscode . LogLevel . Trace ? Trace . Verbose : Trace . Off
202
+ ) ;
190
203
}
191
204
}
192
205
@@ -329,7 +342,8 @@ export class RoslynLanguageServer {
329
342
context ,
330
343
telemetryReporter ,
331
344
languageServerEvents ,
332
- channel
345
+ channel ,
346
+ traceChannel
333
347
) ;
334
348
335
349
client . registerFeature ( server . _onAutoInsertFeature ) ;
@@ -1102,25 +1116,6 @@ export class RoslynLanguageServer {
1102
1116
}
1103
1117
}
1104
1118
1105
- private static GetTraceLevel ( logLevel : vscode . LogLevel ) : Trace {
1106
- switch ( logLevel ) {
1107
- case vscode . LogLevel . Trace :
1108
- return Trace . Verbose ;
1109
- case vscode . LogLevel . Debug :
1110
- return Trace . Messages ;
1111
- case vscode . LogLevel . Info :
1112
- return Trace . Off ;
1113
- case vscode . LogLevel . Warning :
1114
- return Trace . Off ;
1115
- case vscode . LogLevel . Error :
1116
- return Trace . Off ;
1117
- case vscode . LogLevel . Off :
1118
- return Trace . Off ;
1119
- default :
1120
- throw new Error ( `Invalid log level ${ logLevel } ` ) ;
1121
- }
1122
- }
1123
-
1124
1119
public async getBuildOnlyDiagnosticIds ( token : vscode . CancellationToken ) : Promise < string [ ] > {
1125
1120
// If the server isn't running, no build diagnostics to get
1126
1121
if ( ! this . isRunning ( ) ) {
0 commit comments