Skip to content

Commit e811c15

Browse files
committed
Allow the Roslyn client to log messages from Razor
1 parent 2db499b commit e811c15

8 files changed

+86
-15
lines changed

src/activateOmniSharp.ts

+4-1
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

+7-2
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

+5-2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ 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';
3233

3334
let _channel: vscode.LogOutputChannel;
3435
let _traceChannel: vscode.OutputChannel;
@@ -43,7 +44,8 @@ export async function activateRoslynLanguageServer(
4344
optionObservable: Observable<void>,
4445
outputChannel: vscode.LogOutputChannel,
4546
reporter: TelemetryReporter,
46-
languageServerEvents: RoslynLanguageServerEvents
47+
languageServerEvents: RoslynLanguageServerEvents,
48+
razorLogger: RazorLogger
4749
): Promise<RoslynLanguageServer> {
4850
// Create a channel for outputting general logs from the language server.
4951
_channel = outputChannel;
@@ -69,7 +71,8 @@ export async function activateRoslynLanguageServer(
6971
additionalExtensionPaths,
7072
languageServerEvents,
7173
_channel,
72-
_traceChannel
74+
_traceChannel,
75+
razorLogger
7376
);
7477

7578
registerLanguageStatusItems(context, languageServer, languageServerEvents);

src/lsptoolshost/server/roslynLanguageServer.ts

+30-4
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+
LogMessageParams,
14+
MessageTransports,
15+
NotificationType,
16+
ProtocolRequestType,
17+
ServerOptions,
18+
} from 'vscode-languageclient';
1219
import {
1320
Trace,
1421
RequestType,
@@ -71,6 +78,7 @@ import {
7178
copilotLanguageServerExtensionAssemblyName,
7279
copilotLanguageServerExtensionComponentName,
7380
} from '../copilot/contextProviders';
81+
import { RazorLogger } from '../../razor/src/razorLogger';
7482

7583
// Flag indicating if C# Devkit was installed the last time we activated.
7684
// Used to determine if we need to restart the server on extension changes.
@@ -80,6 +88,7 @@ export class RoslynLanguageServer {
8088
// These are notifications we will get from the LSP server and will forward to the Razor extension.
8189
private static readonly provideRazorDynamicFileInfoMethodName: string = 'razor/provideDynamicFileInfo';
8290
private static readonly removeRazorDynamicFileInfoMethodName: string = 'razor/removeDynamicFileInfo';
91+
private static readonly razorLogMessageMethodName: string = 'razor/log';
8392

8493
/**
8594
* The encoding to use when writing to and from the stream.
@@ -119,7 +128,8 @@ export class RoslynLanguageServer {
119128
private _context: vscode.ExtensionContext,
120129
private _telemetryReporter: TelemetryReporter,
121130
private _languageServerEvents: RoslynLanguageServerEvents,
122-
private _channel: vscode.LogOutputChannel
131+
private _channel: vscode.LogOutputChannel,
132+
logger: RazorLogger
123133
) {
124134
this.registerSetTrace();
125135
this.registerSendOpenSolution();
@@ -138,6 +148,7 @@ export class RoslynLanguageServer {
138148

139149
// Register Razor dynamic file info handling
140150
this.registerDynamicFileInfo();
151+
this.registerRazorLogger(logger);
141152

142153
this.registerDebuggerAttach();
143154

@@ -253,7 +264,8 @@ export class RoslynLanguageServer {
253264
additionalExtensionPaths: string[],
254265
languageServerEvents: RoslynLanguageServerEvents,
255266
channel: vscode.LogOutputChannel,
256-
traceChannel: vscode.OutputChannel
267+
traceChannel: vscode.OutputChannel,
268+
razorlogger: RazorLogger
257269
): Promise<RoslynLanguageServer> {
258270
const devKit = getCSharpDevKit();
259271
if (devKit) {
@@ -316,7 +328,8 @@ export class RoslynLanguageServer {
316328
context,
317329
telemetryReporter,
318330
languageServerEvents,
319-
channel
331+
channel,
332+
razorlogger
320333
);
321334

322335
client.registerFeature(server._onAutoInsertFeature);
@@ -832,6 +845,19 @@ export class RoslynLanguageServer {
832845
);
833846
}
834847

848+
private RazorLoggerNotification: NotificationType<LogMessageParams> = new NotificationType(
849+
RoslynLanguageServer.razorLogMessageMethodName
850+
);
851+
852+
private registerRazorLogger(logger: RazorLogger) {
853+
this._languageClient.onNotification<LogMessageParams>(
854+
this.RazorLoggerNotification,
855+
(params: LogMessageParams) => {
856+
logger.log(params.message, params.type);
857+
}
858+
);
859+
}
860+
835861
// eslint-disable-next-line @typescript-eslint/promise-function-async
836862
private WaitForAttachCompleteAsync(attachRequestId: string): Promise<boolean> {
837863
return new Promise<boolean>((resolve) => {

src/razor/razor.ts

+4-1
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

+5-2
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

+21-3
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
}
+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
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 { LogLevel } from 'vscode';
7+
8+
export class RazorLoggerNotification {
9+
constructor(public readonly message: string, public readonly level: LogLevel) {}
10+
}

0 commit comments

Comments
 (0)