Skip to content

Commit bc3222c

Browse files
committed
Move isDebugEnable switch into OmniSharpServer
1 parent ca485c8 commit bc3222c

File tree

4 files changed

+72
-62
lines changed

4 files changed

+72
-62
lines changed

src/features/codeLensProvider.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,15 @@ export default class OmniSharpCodeLensProvider extends AbstractSupport implement
3232
};
3333

3434
provideCodeLenses(document: TextDocument, token: CancellationToken): CodeLens[] | Thenable<CodeLens[]> {
35-
35+
let request = { Filename: document.fileName };
3636
return serverUtils.currentFileMembersAsTree(this._server, { Filename: document.fileName }, token).then(tree => {
3737
let ret: CodeLens[] = [];
38-
tree.TopLevelTypeDefinitions.forEach(node => OmniSharpCodeLensProvider._convertQuickFix(ret, document.fileName, node));
38+
tree.TopLevelTypeDefinitions.forEach(node => this._convertQuickFix(ret, document.fileName, node));
3939
return ret;
4040
});
4141
}
4242

43-
private static _convertQuickFix(bucket: CodeLens[], fileName: string, node: protocol.Node): void {
43+
private _convertQuickFix(bucket: CodeLens[], fileName: string, node: protocol.Node): void {
4444

4545
if (node.Kind === 'MethodDeclaration' && OmniSharpCodeLensProvider.filteredSymbolNames[node.Location.Text]) {
4646
return;
@@ -50,10 +50,10 @@ export default class OmniSharpCodeLensProvider extends AbstractSupport implement
5050
bucket.push(lens);
5151

5252
for (let child of node.ChildNodes) {
53-
OmniSharpCodeLensProvider._convertQuickFix(bucket, fileName, child);
53+
this._convertQuickFix(bucket, fileName, child);
5454
}
5555

56-
updateCodeLensForTest(bucket, fileName, node);
56+
updateCodeLensForTest(bucket, fileName, node, this._server.isDebugEnable());
5757
}
5858

5959
resolveCodeLens(codeLens: CodeLens, token: CancellationToken): Thenable<CodeLens> {

src/features/dotnetTest.ts

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,6 @@ import * as vscode from 'vscode';
1111
import * as serverUtils from "../omnisharpUtils";
1212
import * as protocol from '../protocol';
1313

14-
let enableDebug = false;
15-
16-
// check if debugger start is enable
17-
vscode.commands.getCommands().then(commands => {
18-
if (commands.find(c => c == "vscode.startDebug")) {
19-
enableDebug = true;
20-
}
21-
});
22-
2314
export function registerDotNetTestRunCommand(server: OmnisharpServer): vscode.Disposable {
2415
return vscode.commands.registerCommand(
2516
'dotnet.test.run',
@@ -64,27 +55,29 @@ export function debugDotnetTest(testMethod: string, fileName: string, server: Om
6455
"stopAtEntry": false
6556
}
6657
).then(
67-
response => {
68-
vscode.window.showInformationMessage('call back from debugger start command')
69-
},
70-
reason => { vscode.window.showErrorMessage('Failed to debug test because ' + reason + '.') });
58+
response => { },
59+
reason => { vscode.window.showErrorMessage('Failed to start debugger on test because ' + reason + '.') });
7160
});
7261
}
7362

74-
export function updateCodeLensForTest(bucket: vscode.CodeLens[], fileName: string, node: protocol.Node) {
75-
let testFeature = node.Features.find(value => value.startsWith('XunitTestMethod'));
63+
export function updateCodeLensForTest(bucket: vscode.CodeLens[], fileName: string, node: protocol.Node, isDebugEnable: boolean) {
64+
// backward compatible check: Features property doesn't present on older version OmniSharp
65+
if (node.Features == undefined) {
66+
return;
67+
}
68+
69+
let testFeature = node.Features.find(value => value.Name == 'XunitTestMethod');
7670
if (testFeature) {
7771
// this test method has a test feature
78-
let testMethod = testFeature.split(':')[1];
7972

8073
bucket.push(new vscode.CodeLens(
8174
toRange(node.Location),
82-
{ title: "run test", command: 'dotnet.test.run', arguments: [testMethod, fileName] }));
75+
{ title: "run test", command: 'dotnet.test.run', arguments: [testFeature.Data, fileName] }));
8376

84-
if (enableDebug) {
77+
if (isDebugEnable) {
8578
bucket.push(new vscode.CodeLens(
8679
toRange(node.Location),
87-
{ title: "debug test", command: 'dotnet.test.debug', arguments: [testMethod, fileName] }));
80+
{ title: "debug test", command: 'dotnet.test.debug', arguments: [testFeature.Data, fileName] }));
8881
}
8982
}
9083
}

src/omnisharpServer.ts

Lines changed: 49 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {Disposable, CancellationToken, OutputChannel, workspace, window} from 'v
1414
import {ErrorMessage, UnresolvedDependenciesMessage, MSBuildProjectDiagnostics, ProjectInformationResponse} from './protocol';
1515
import getLaunchTargets, {LaunchTarget} from './launchTargetFinder';
1616
import TelemetryReporter from 'vscode-extension-telemetry';
17+
import * as vscode from 'vscode'
1718

1819
enum ServerState {
1920
Starting,
@@ -31,29 +32,29 @@ interface Request {
3132

3233
module Events {
3334
export const StateChanged = 'stateChanged';
34-
35+
3536
export const StdOut = 'stdout';
3637
export const StdErr = 'stderr';
37-
38+
3839
export const Error = 'Error';
3940
export const ServerError = 'ServerError';
40-
41+
4142
export const UnresolvedDependencies = 'UnresolvedDependencies';
4243
export const PackageRestoreStarted = 'PackageRestoreStarted';
4344
export const PackageRestoreFinished = 'PackageRestoreFinished';
44-
45+
4546
export const ProjectChanged = 'ProjectChanged';
4647
export const ProjectAdded = 'ProjectAdded';
4748
export const ProjectRemoved = 'ProjectRemoved';
48-
49+
4950
export const MsBuildProjectDiagnostics = 'MsBuildProjectDiagnostics';
50-
51+
5152
export const BeforeServerStart = 'BeforeServerStart';
5253
export const ServerStart = 'ServerStart';
5354
export const ServerStop = 'ServerStop';
54-
55+
5556
export const MultipleLaunchTargets = 'server:MultipleLaunchTargets';
56-
57+
5758
export const Started = 'started';
5859
}
5960

@@ -65,7 +66,7 @@ class Delays {
6566
idleDelays: number = 0; // 501-1500 milliseconds
6667
nonFocusDelays: number = 0; // 1501-3000 milliseconds
6768
bigDelays: number = 0; // 3000+ milliseconds
68-
69+
6970
public report(elapsedTime: number) {
7071
if (elapsedTime <= 25) {
7172
this.immediateDelays += 1;
@@ -89,8 +90,8 @@ class Delays {
8990
this.bigDelays += 1;
9091
}
9192
}
92-
93-
public toMeasures(): {[key: string]: number} {
93+
94+
public toMeasures(): { [key: string]: number } {
9495
return {
9596
immedateDelays: this.immediateDelays,
9697
nearImmediateDelays: this.nearImmediateDelays,
@@ -115,6 +116,8 @@ export abstract class OmnisharpServer {
115116
private _isProcessingQueue = false;
116117
private _channel: OutputChannel;
117118

119+
private _isDebugEnable: boolean = false;
120+
118121
protected _serverProcess: ChildProcess;
119122
protected _extraArgv: string[];
120123

@@ -132,28 +135,28 @@ export abstract class OmnisharpServer {
132135
return this._state;
133136
}
134137

135-
private _setState(value: ServerState) : void {
138+
private _setState(value: ServerState): void {
136139
if (typeof value !== 'undefined' && value !== this._state) {
137140
this._state = value;
138141
this._fireEvent(Events.StateChanged, this._state);
139142
}
140143
}
141-
144+
142145
private _recordRequestDelay(requestName: string, elapsedTime: number) {
143146
let delays = this._requestDelays[requestName];
144147
if (!delays) {
145148
delays = new Delays();
146149
this._requestDelays[requestName] = delays;
147150
}
148-
151+
149152
delays.report(elapsedTime);
150153
}
151-
154+
152155
public reportAndClearTelemetry() {
153156
for (var path in this._requestDelays) {
154157
const eventName = 'omnisharp' + path;
155158
const measures = this._requestDelays[path].toMeasures();
156-
159+
157160
this._reporter.sendTelemetryEvent(eventName, null, measures);
158161
}
159162

@@ -168,6 +171,10 @@ export abstract class OmnisharpServer {
168171
return this._channel;
169172
}
170173

174+
public isDebugEnable(): boolean {
175+
return this._isDebugEnable;
176+
}
177+
171178
// --- eventing
172179

173180
public onStdout(listener: (e: string) => any, thisArg?: any) {
@@ -186,7 +193,7 @@ export abstract class OmnisharpServer {
186193
return this._addListener(Events.ServerError, listener, thisArg);
187194
}
188195

189-
public onUnresolvedDependencies(listener: (e: UnresolvedDependenciesMessage) => any, thisArg?:any) {
196+
public onUnresolvedDependencies(listener: (e: UnresolvedDependenciesMessage) => any, thisArg?: any) {
190197
return this._addListener(Events.UnresolvedDependencies, listener, thisArg);
191198
}
192199

@@ -214,7 +221,7 @@ export abstract class OmnisharpServer {
214221
return this._addListener(Events.MsBuildProjectDiagnostics, listener, thisArg);
215222
}
216223

217-
public onBeforeServerStart(listener: (e:string) => any) {
224+
public onBeforeServerStart(listener: (e: string) => any) {
218225
return this._addListener(Events.BeforeServerStart, listener);
219226
}
220227

@@ -271,6 +278,13 @@ export abstract class OmnisharpServer {
271278
this._setState(ServerState.Started);
272279
this._fireEvent(Events.ServerStart, solutionPath);
273280
return this._doConnect();
281+
}).then(_ => {
282+
return vscode.commands.getCommands()
283+
.then(commands => {
284+
if (commands.find(c => c == "vscode.startDebug")) {
285+
this._isDebugEnable = true;
286+
}
287+
});
274288
}).then(_ => {
275289
this._processQueue();
276290
}, err => {
@@ -300,7 +314,7 @@ export abstract class OmnisharpServer {
300314
return reject(err);
301315
}
302316
});
303-
317+
304318
killer.on('exit', resolve);
305319
killer.on('error', reject);
306320
});
@@ -309,7 +323,7 @@ export abstract class OmnisharpServer {
309323
this._serverProcess.kill('SIGTERM');
310324
ret = Promise.resolve<OmnisharpServer>(undefined);
311325
}
312-
326+
313327
return ret.then(_ => {
314328
this._start = null;
315329
this._serverProcess = null;
@@ -327,7 +341,7 @@ export abstract class OmnisharpServer {
327341
}
328342
}
329343

330-
public autoStart(preferredPath:string): Thenable<void> {
344+
public autoStart(preferredPath: string): Thenable<void> {
331345
return getLaunchTargets().then(targets => {
332346
if (targets.length === 0) {
333347
return new Promise<void>((resolve, reject) => {
@@ -368,23 +382,23 @@ export abstract class OmnisharpServer {
368382
if (this._getState() !== ServerState.Started) {
369383
return Promise.reject<TResponse>('server has been stopped or not started');
370384
}
371-
385+
372386
let startTime: number;
373387
let request: Request;
374-
388+
375389
let promise = new Promise<TResponse>((resolve, reject) => {
376390
startTime = Date.now();
377-
391+
378392
request = {
379393
path,
380394
data,
381395
onSuccess: value => resolve(value),
382396
onError: err => reject(err),
383397
_enqueued: Date.now()
384398
};
385-
399+
386400
this._queue.push(request);
387-
401+
388402
if (this._getState() === ServerState.Started && !this._isProcessingQueue) {
389403
this._processQueue();
390404
}
@@ -406,7 +420,7 @@ export abstract class OmnisharpServer {
406420
let endTime = Date.now();
407421
let elapsedTime = endTime - startTime;
408422
this._recordRequestDelay(path, elapsedTime);
409-
423+
410424
return response;
411425
});
412426
}
@@ -504,19 +518,17 @@ export class StdioOmnisharpServer extends OmnisharpServer {
504518

505519
// timeout logic
506520
const handle = setTimeout(() => {
507-
if (listener)
508-
{
521+
if (listener) {
509522
listener.dispose();
510523
}
511-
524+
512525
reject(new Error('Failed to start OmniSharp'));
513526
}, StdioOmnisharpServer.StartupTimeout);
514527

515528
// handle started-event
516529
listener = this.onOmnisharpStart(() => {
517-
if (listener)
518-
{
519-
listener.dispose();
530+
if (listener) {
531+
listener.dispose();
520532
}
521533
clearTimeout(handle);
522534
resolve(this);
@@ -552,17 +564,17 @@ export class StdioOmnisharpServer extends OmnisharpServer {
552564

553565
switch (packet.Type) {
554566
case 'response':
555-
this._handleResponsePacket(<WireProtocol.ResponsePacket> packet);
567+
this._handleResponsePacket(<WireProtocol.ResponsePacket>packet);
556568
break;
557569
case 'event':
558-
this._handleEventPacket(<WireProtocol.EventPacket> packet);
570+
this._handleEventPacket(<WireProtocol.EventPacket>packet);
559571
break;
560572
default:
561573
console.warn('unknown packet: ', packet);
562574
break;
563575
}
564576
};
565-
577+
566578
this._rl.addListener('line', onLineReceived);
567579
this._callOnStop.push(() => this._rl.removeListener('line', onLineReceived));
568580
}
@@ -590,7 +602,7 @@ export class StdioOmnisharpServer extends OmnisharpServer {
590602

591603
if (packet.Event === 'log') {
592604
// handle log events
593-
const entry = <{ LogLevel: string; Name: string; Message: string; }> packet.Body;
605+
const entry = <{ LogLevel: string; Name: string; Message: string; }>packet.Body;
594606
this._fireEvent(Events.StdOut, `[${entry.LogLevel}:${entry.Name}] ${entry.Message}\n`);
595607
return;
596608
} else {

src/protocol.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,11 +176,16 @@ export interface GetCodeActionsResponse {
176176
CodeActions: string[];
177177
}
178178

179+
export interface SyntaxFeature {
180+
Name: string;
181+
Data: string;
182+
}
183+
179184
export interface Node {
180185
ChildNodes: Node[];
181186
Location: QuickFix;
182187
Kind: string;
183-
Features: string[];
188+
Features: SyntaxFeature[];
184189
}
185190

186191
export interface CurrentFileMembersAsTreeResponse {

0 commit comments

Comments
 (0)