Skip to content

Commit fbde026

Browse files
authored
Allow the Roslyn client to log messages from Razor (#8201)
2 parents 2db499b + b34da5f commit fbde026

File tree

8 files changed

+81
-11
lines changed

8 files changed

+81
-11
lines changed

src/activateOmniSharp.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { activateOmniSharpLanguageServer } from './omnisharp/omnisharpLanguageSe
1313
import { EventStream } from './eventStream';
1414
import { razorOptions } from './shared/options';
1515
import { activateRazorExtension } from './razor/razor';
16+
import { RazorLogger } from './razor/src/razorLogger';
1617

1718
export function activateOmniSharp(
1819
context: vscode.ExtensionContext,
@@ -39,6 +40,7 @@ export function activateOmniSharp(
3940
reporter
4041
);
4142

43+
const razorLogger = new RazorLogger();
4244
let omnisharpRazorPromise: Promise<void> | undefined = undefined;
4345
if (!razorOptions.razorDevMode) {
4446
omnisharpRazorPromise = activateRazorExtension(
@@ -48,7 +50,8 @@ export function activateOmniSharp(
4850
reporter,
4951
undefined,
5052
platformInfo,
51-
/* useOmnisharpServer */ true
53+
/* useOmnisharpServer */ true,
54+
razorLogger
5255
);
5356
}
5457

src/activateRoslyn.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import { GlobalBrokeredServiceContainer } from '@microsoft/servicehub-framework'
2525
import { SolutionSnapshotProvider } from './lsptoolshost/solutionSnapshot/solutionSnapshotProvider';
2626
import { BuildResultDiagnostics } from './lsptoolshost/diagnostics/buildResultReporterService';
2727
import { getComponentFolder } from './lsptoolshost/extensions/builtInComponents';
28+
import { RazorLogger } from './razor/src/razorLogger';
2829

2930
export function activateRoslyn(
3031
context: vscode.ExtensionContext,
@@ -39,6 +40,8 @@ export function activateRoslyn(
3940
const roslynLanguageServerEvents = new RoslynLanguageServerEvents();
4041
context.subscriptions.push(roslynLanguageServerEvents);
4142

43+
const razorLogger = new RazorLogger();
44+
4245
// Activate Razor. Needs to be activated before Roslyn so commands are registered in the correct order.
4346
// Otherwise, if Roslyn starts up first, they could execute commands that don't yet exist on Razor's end.
4447
//
@@ -54,7 +57,8 @@ export function activateRoslyn(
5457
reporter,
5558
csharpDevkitExtension,
5659
platformInfo,
57-
/* useOmnisharpServer */ false
60+
/* useOmnisharpServer */ false,
61+
razorLogger
5862
);
5963

6064
// Setup a listener for project initialization complete before we start the server.
@@ -73,7 +77,8 @@ export function activateRoslyn(
7377
optionStream,
7478
csharpChannel,
7579
reporter,
76-
roslynLanguageServerEvents
80+
roslynLanguageServerEvents,
81+
razorLogger
7782
);
7883

7984
debugSessionTracker.initializeDebugSessionHandlers(context);

src/lsptoolshost/activate.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ import { ProjectContextStatus } from './projectContext/projectContextStatus';
2929
import { RoslynLanguageServer } from './server/roslynLanguageServer';
3030
import { registerCopilotRelatedFilesProvider } from './copilot/relatedFilesProvider';
3131
import { registerCopilotContextProviders } from './copilot/contextProviders';
32+
import { RazorLogger } from '../razor/src/razorLogger';
33+
import { registerRazorEndpoints } from './razor/razorEndpoints';
3234

3335
let _channel: vscode.LogOutputChannel;
3436
let _traceChannel: vscode.OutputChannel;
@@ -43,7 +45,8 @@ export async function activateRoslynLanguageServer(
4345
optionObservable: Observable<void>,
4446
outputChannel: vscode.LogOutputChannel,
4547
reporter: TelemetryReporter,
46-
languageServerEvents: RoslynLanguageServerEvents
48+
languageServerEvents: RoslynLanguageServerEvents,
49+
razorLogger: RazorLogger
4750
): Promise<RoslynLanguageServer> {
4851
// Create a channel for outputting general logs from the language server.
4952
_channel = outputChannel;
@@ -83,6 +86,7 @@ export async function activateRoslynLanguageServer(
8386
registerCodeActionFixAllCommands(context, languageServer, _channel);
8487

8588
registerRazorCommands(context, languageServer);
89+
registerRazorEndpoints(context, languageServer, razorLogger);
8690

8791
registerUnitTestingCommands(context, languageServer);
8892

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
import { RoslynLanguageServer } from '../server/roslynLanguageServer';
7+
import * as vscode from 'vscode';
8+
import { LogMessageParams, NotificationType } from 'vscode-languageclient';
9+
import { RazorLogger } from '../../razor/src/razorLogger';
10+
11+
export function registerRazorEndpoints(
12+
context: vscode.ExtensionContext,
13+
languageServer: RoslynLanguageServer,
14+
razorLogger: RazorLogger
15+
) {
16+
const logNotificationType = new NotificationType<LogMessageParams>('razor/log');
17+
languageServer.registerOnNotificationWithParams(logNotificationType, (params) =>
18+
razorLogger.log(params.message, params.type)
19+
);
20+
}

src/lsptoolshost/server/roslynLanguageServer.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,14 @@ import * as path from 'path';
88
import * as cp from 'child_process';
99
import * as uuid from 'uuid';
1010
import * as net from 'net';
11-
import { LanguageClientOptions, MessageTransports, ProtocolRequestType, ServerOptions } from 'vscode-languageclient';
11+
import {
12+
LanguageClientOptions,
13+
MessageTransports,
14+
NotificationHandler,
15+
NotificationType,
16+
ProtocolRequestType,
17+
ServerOptions,
18+
} from 'vscode-languageclient';
1219
import {
1320
Trace,
1421
RequestType,
@@ -437,6 +444,13 @@ export class RoslynLanguageServer {
437444
this._languageClient.addDisposable(this._languageClient.onNotification(method, handler));
438445
}
439446

447+
public registerOnNotificationWithParams<Params>(
448+
type: NotificationType<Params>,
449+
handler: NotificationHandler<Params>
450+
) {
451+
this._languageClient.addDisposable(this._languageClient.onNotification(type, handler));
452+
}
453+
440454
public async registerSolutionSnapshot(token: vscode.CancellationToken): Promise<SolutionSnapshotId> {
441455
const response = await this.sendRequest0(RoslynProtocol.RegisterSolutionSnapshotRequest.type, token);
442456
if (response) {

src/razor/razor.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { EventStream } from '../eventStream';
1212
import TelemetryReporter from '@vscode/extension-telemetry';
1313
import { PlatformInformation } from '../shared/platform';
1414
import { showWarningMessage } from '../shared/observers/utils/showMessage';
15+
import { RazorLogger } from './src/razorLogger';
1516

1617
export async function activateRazorExtension(
1718
context: vscode.ExtensionContext,
@@ -20,7 +21,8 @@ export async function activateRazorExtension(
2021
vscodeTelemetryReporter: TelemetryReporter,
2122
csharpDevkitExtension: vscode.Extension<any> | undefined,
2223
platformInfo: PlatformInformation,
23-
useOmnisharpServer: boolean
24+
useOmnisharpServer: boolean,
25+
logger: RazorLogger
2426
) {
2527
const razorConfig = vscode.workspace.getConfiguration('razor');
2628
const configuredLanguageServerDir = razorConfig.get<string>('languageServer.directory', '');
@@ -49,6 +51,7 @@ export async function activateRazorExtension(
4951
vscodeTelemetryReporter,
5052
csharpDevkitExtension,
5153
platformInfo,
54+
logger,
5255
/* enableProposedApis: */ false
5356
);
5457
}

src/razor/src/extension.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,15 +62,14 @@ export async function activate(
6262
vscodeTelemetryReporter: TelemetryReporter,
6363
csharpDevkitExtension: vscode.Extension<CSharpDevKitExports> | undefined,
6464
platformInfo: PlatformInformation,
65+
logger: RazorLogger,
6566
enableProposedApis = false
6667
) {
6768
const razorTelemetryReporter = new RazorTelemetryReporter(eventStream);
6869
const eventEmitterFactory: IEventEmitterFactory = {
6970
create: <T>() => new vscode.EventEmitter<T>(),
7071
};
7172

72-
const logger = new RazorLogger(eventEmitterFactory);
73-
7473
try {
7574
const razorOptions: RazorLanguageServerOptions = resolveRazorLanguageServerOptions(
7675
vscodeType,
@@ -82,6 +81,10 @@ export async function activate(
8281
// TODO: We still need a document manager for Html, so need to do _some_ of the below, just not sure what yet,
8382
// and it needs to be able to take a roslynLanguageServerClient instead of a razorLanguageServerClient I guess.
8483

84+
logger.logVerbose(
85+
'Razor cohosting is enabled, skipping language server activation. No rzls process will be created.'
86+
);
87+
8588
return;
8689
}
8790

src/razor/src/razorLogger.ts

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import * as fs from 'fs';
77
import * as path from 'path';
88
import * as vscodeAdapter from './vscodeAdapter';
99
import * as vscode from 'vscode';
10-
import { IEventEmitterFactory } from './IEventEmitterFactory';
1110
import { RazorLanguageServerClient } from './razorLanguageServerClient';
11+
import { MessageType } from 'vscode-languageserver-protocol';
1212

1313
export class RazorLogger implements vscodeAdapter.Disposable {
1414
public static readonly logName = 'Razor Log';
@@ -19,9 +19,9 @@ export class RazorLogger implements vscodeAdapter.Disposable {
1919

2020
private readonly onLogEmitter: vscodeAdapter.EventEmitter<string>;
2121

22-
constructor(eventEmitterFactory: IEventEmitterFactory) {
22+
constructor() {
2323
this.outputChannel = vscode.window.createOutputChannel(vscode.l10n.t('Razor Log'), { log: true });
24-
this.onLogEmitter = eventEmitterFactory.create<string>();
24+
this.onLogEmitter = new vscode.EventEmitter<string>();
2525
this.processTraceLevel();
2626

2727
this.outputChannel.onDidChangeLogLevel(async () => {
@@ -96,6 +96,24 @@ export class RazorLogger implements vscodeAdapter.Disposable {
9696
}
9797
}
9898

99+
public log(message: string, level: MessageType) {
100+
switch (level) {
101+
case MessageType.Error:
102+
this.logError(message, new Error(message));
103+
break;
104+
case MessageType.Warning:
105+
this.logWarning(message);
106+
break;
107+
case MessageType.Info:
108+
this.logMessage(message);
109+
break;
110+
case MessageType.Debug:
111+
case MessageType.Log:
112+
default:
113+
this.logVerbose(message);
114+
}
115+
}
116+
99117
public dispose() {
100118
this.outputChannel.dispose();
101119
}

0 commit comments

Comments
 (0)