Skip to content

Commit 2adadbd

Browse files
Merge pull request #1692 from DustinCampbell/test-telemetry
Add telemetry reporting the number of times tests are run or debugged
2 parents 6013d92 + fa6c32b commit 2adadbd

File tree

9 files changed

+350
-251
lines changed

9 files changed

+350
-251
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
bin
22
node_modules
33
out
4+
.omnisharp/
45
.omnisharp-*/
56
.debugger
67
.vscode-test

src/features/abstractProvider.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,26 @@
55

66
'use strict';
77

8-
import {OmniSharpServer} from '../omnisharp/server';
9-
import {Disposable} from 'vscode';
8+
import { OmniSharpServer } from '../omnisharp/server';
9+
import { Disposable } from 'vscode';
10+
import TelemetryReporter from 'vscode-extension-telemetry';
1011

11-
export default class AbstractProvider {
12+
export default abstract class AbstractProvider {
1213

1314
protected _server: OmniSharpServer;
14-
protected _disposables: Disposable[];
15+
protected _reporter: TelemetryReporter;
16+
private _disposables: Disposable[];
1517

16-
constructor(server: OmniSharpServer) {
18+
constructor(server: OmniSharpServer, reporter: TelemetryReporter) {
1719
this._server = server;
20+
this._reporter = reporter;
1821
this._disposables = [];
1922
}
2023

24+
protected addDisposables(...disposables: Disposable[]) {
25+
this._disposables.push(...disposables);
26+
}
27+
2128
dispose() {
2229
while (this._disposables.length) {
2330
this._disposables.pop().dispose();

src/features/codeActionProvider.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,23 @@ import AbstractProvider from './abstractProvider';
1111
import * as protocol from '../omnisharp/protocol';
1212
import { toRange2 } from '../omnisharp/typeConvertion';
1313
import * as serverUtils from '../omnisharp/utils';
14+
import TelemetryReporter from 'vscode-extension-telemetry';
1415

1516
export default class CodeActionProvider extends AbstractProvider implements vscode.CodeActionProvider {
1617

1718
private _disabled: boolean;
1819
private _commandId: string;
1920

20-
constructor(server: OmniSharpServer) {
21-
super(server);
21+
constructor(server: OmniSharpServer, reporter: TelemetryReporter) {
22+
super(server, reporter);
23+
2224
this._commandId = 'omnisharp.runCodeAction';
2325

2426
this._checkOption();
2527

2628
let d1 = vscode.workspace.onDidChangeConfiguration(this._checkOption, this);
2729
let d2 = vscode.commands.registerCommand(this._commandId, this._runCodeAction, this);
28-
this._disposables.push(d1, d2);
30+
this.addDisposables(d1, d2);
2931
}
3032

3133
private _checkOption(): void {

src/features/codeLensProvider.ts

Lines changed: 53 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,35 @@
55

66
'use strict';
77

8-
import {CancellationToken, CodeLens, Range, Uri, TextDocument, CodeLensProvider} from 'vscode';
9-
import {toRange, toLocation} from '../omnisharp/typeConvertion';
10-
import AbstractSupport from './abstractProvider';
11-
import {updateCodeLensForTest} from './dotnetTest';
8+
import { OmniSharpServer } from '../omnisharp/server';
9+
import TelemetryReporter from 'vscode-extension-telemetry';
10+
import TestManager from './dotnetTest';
11+
import * as vscode from 'vscode';
12+
import { toRange, toLocation } from '../omnisharp/typeConvertion';
13+
import AbstractProvider from './abstractProvider';
1214
import * as protocol from '../omnisharp/protocol';
1315
import * as serverUtils from '../omnisharp/utils';
1416

15-
class OmniSharpCodeLens extends CodeLens {
17+
class OmniSharpCodeLens extends vscode.CodeLens {
1618

1719
fileName: string;
1820

19-
constructor(fileName: string, range: Range) {
21+
constructor(fileName: string, range: vscode.Range) {
2022
super(range);
2123
this.fileName = fileName;
2224
}
2325
}
2426

25-
export default class OmniSharpCodeLensProvider extends AbstractSupport implements CodeLensProvider {
27+
export default class OmniSharpCodeLensProvider extends AbstractProvider implements vscode.CodeLensProvider {
28+
29+
private _testManager: TestManager;
30+
31+
constructor(server: OmniSharpServer, reporter: TelemetryReporter, testManager: TestManager)
32+
{
33+
super(server, reporter);
34+
35+
this._testManager = testManager;
36+
}
2637

2738
private static filteredSymbolNames: { [name: string]: boolean } = {
2839
'Equals': true,
@@ -31,15 +42,15 @@ export default class OmniSharpCodeLensProvider extends AbstractSupport implement
3142
'ToString': true
3243
};
3344

34-
provideCodeLenses(document: TextDocument, token: CancellationToken): CodeLens[] | Thenable<CodeLens[]> {
45+
provideCodeLenses(document: vscode.TextDocument, token: vscode.CancellationToken): vscode.CodeLens[] | Thenable<vscode.CodeLens[]> {
3546
return serverUtils.currentFileMembersAsTree(this._server, { FileName: document.fileName }, token).then(tree => {
36-
let ret: CodeLens[] = [];
47+
let ret: vscode.CodeLens[] = [];
3748
tree.TopLevelTypeDefinitions.forEach(node => this._convertQuickFix(ret, document.fileName, node));
3849
return ret;
3950
});
4051
}
4152

42-
private _convertQuickFix(bucket: CodeLens[], fileName: string, node: protocol.Node): void {
53+
private _convertQuickFix(bucket: vscode.CodeLens[], fileName: string, node: protocol.Node): void {
4354

4455
if (node.Kind === 'MethodDeclaration' && OmniSharpCodeLensProvider.filteredSymbolNames[node.Location.Text]) {
4556
return;
@@ -52,10 +63,10 @@ export default class OmniSharpCodeLensProvider extends AbstractSupport implement
5263
this._convertQuickFix(bucket, fileName, child);
5364
}
5465

55-
updateCodeLensForTest(bucket, fileName, node, this._server.isDebugEnable());
66+
this._updateCodeLensForTest(bucket, fileName, node);
5667
}
5768

58-
resolveCodeLens(codeLens: CodeLens, token: CancellationToken): Thenable<CodeLens> {
69+
resolveCodeLens(codeLens: vscode.CodeLens, token: vscode.CancellationToken): Thenable<vscode.CodeLens> {
5970
if (codeLens instanceof OmniSharpCodeLens) {
6071

6172
let req = <protocol.FindUsagesRequest>{
@@ -75,11 +86,40 @@ export default class OmniSharpCodeLensProvider extends AbstractSupport implement
7586
codeLens.command = {
7687
title: len === 1 ? '1 reference' : `${len} references`,
7788
command: 'editor.action.showReferences',
78-
arguments: [Uri.file(req.FileName), codeLens.range.start, res.QuickFixes.map(toLocation)]
89+
arguments: [vscode.Uri.file(req.FileName), codeLens.range.start, res.QuickFixes.map(toLocation)]
7990
};
8091

8192
return codeLens;
8293
});
8394
}
8495
}
96+
97+
private _updateCodeLensForTest(bucket: vscode.CodeLens[], fileName: string, node: protocol.Node) {
98+
// backward compatible check: Features property doesn't present on older version OmniSharp
99+
if (node.Features === undefined) {
100+
return;
101+
}
102+
103+
let testFeature = node.Features.find(value => (value.Name == 'XunitTestMethod' || value.Name == 'NUnitTestMethod' || value.Name == 'MSTestMethod'));
104+
if (testFeature) {
105+
// this test method has a test feature
106+
let testFrameworkName = 'xunit';
107+
if (testFeature.Name == 'NunitTestMethod') {
108+
testFrameworkName = 'nunit';
109+
}
110+
else if (testFeature.Name == 'MSTestMethod') {
111+
testFrameworkName = 'mstest';
112+
}
113+
114+
bucket.push(new vscode.CodeLens(
115+
toRange(node.Location),
116+
{ title: "run test", command: 'dotnet.test.run', arguments: [testFeature.Data, fileName, testFrameworkName] }));
117+
118+
if (this._server.isDebugEnable()) {
119+
bucket.push(new vscode.CodeLens(
120+
toRange(node.Location),
121+
{ title: "debug test", command: 'dotnet.test.debug', arguments: [testFeature.Data, fileName, testFrameworkName] }));
122+
}
123+
}
124+
}
85125
}

src/features/commands.ts

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,21 @@
55

66
'use strict';
77

8-
import {OmniSharpServer} from '../omnisharp/server';
8+
import { OmniSharpServer } from '../omnisharp/server';
99
import * as serverUtils from '../omnisharp/utils';
10-
import {findLaunchTargets} from '../omnisharp/launcher';
10+
import { findLaunchTargets } from '../omnisharp/launcher';
1111
import * as cp from 'child_process';
1212
import * as fs from 'fs';
1313
import * as path from 'path';
1414
import * as protocol from '../omnisharp/protocol';
1515
import * as vscode from 'vscode';
16-
import * as dotnetTest from './dotnetTest';
17-
import {DotNetAttachItemsProviderFactory, AttachPicker, RemoteAttachPicker} from './processPicker';
18-
import {generateAssets} from '../assets';
16+
import { DotNetAttachItemsProviderFactory, AttachPicker, RemoteAttachPicker } from './processPicker';
17+
import { generateAssets } from '../assets';
18+
import TelemetryReporter from 'vscode-extension-telemetry';
1919

2020
let channel = vscode.window.createOutputChannel('.NET');
2121

22-
export default function registerCommands(server: OmniSharpServer, extensionPath: string) {
22+
export default function registerCommands(server: OmniSharpServer, reporter: TelemetryReporter) {
2323
let d1 = vscode.commands.registerCommand('o.restart', () => restartOmniSharp(server));
2424
let d2 = vscode.commands.registerCommand('o.pickProjectAndStart', () => pickProjectAndStart(server));
2525
let d3 = vscode.commands.registerCommand('o.showOutput', () => server.getChannel().show(vscode.ViewColumn.Three));
@@ -29,19 +29,15 @@ export default function registerCommands(server: OmniSharpServer, extensionPath:
2929
// running the command activates the extension, which is all we need for installation to kickoff
3030
let d5 = vscode.commands.registerCommand('csharp.downloadDebugger', () => { });
3131

32-
// register two commands for running and debugging xunit tests
33-
let d6 = dotnetTest.registerDotNetTestRunCommand(server);
34-
let d7 = dotnetTest.registerDotNetTestDebugCommand(server);
35-
3632
// register process picker for attach
3733
let attachItemsProvider = DotNetAttachItemsProviderFactory.Get();
3834
let attacher = new AttachPicker(attachItemsProvider);
39-
let d8 = vscode.commands.registerCommand('csharp.listProcess', () => attacher.ShowAttachEntries());
35+
let d6 = vscode.commands.registerCommand('csharp.listProcess', () => attacher.ShowAttachEntries());
4036
// Register command for generating tasks.json and launch.json assets.
41-
let d9 = vscode.commands.registerCommand('dotnet.generateAssets', () => generateAssets(server));
42-
let d10 = vscode.commands.registerCommand('csharp.listRemoteProcess', (args) => RemoteAttachPicker.ShowAttachEntries(args));
37+
let d7 = vscode.commands.registerCommand('dotnet.generateAssets', () => generateAssets(server));
38+
let d8 = vscode.commands.registerCommand('csharp.listRemoteProcess', (args) => RemoteAttachPicker.ShowAttachEntries(args));
4339

44-
return vscode.Disposable.from(d1, d2, d3, d4, d5, d6, d7, d8, d9, d10);
40+
return vscode.Disposable.from(d1, d2, d3, d4, d5, d6, d7, d8);
4541
}
4642

4743
function restartOmniSharp(server: OmniSharpServer) {

src/features/definitionProvider.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,14 @@ import * as serverUtils from '../omnisharp/utils';
1111
import {createRequest, toLocation} from '../omnisharp/typeConvertion';
1212
import {Uri, TextDocument, Position, Location, CancellationToken, DefinitionProvider} from 'vscode';
1313
import DefinitionMetadataDocumentProvider from './definitionMetadataDocumentProvider';
14-
14+
import TelemetryReporter from 'vscode-extension-telemetry';
1515

1616
export default class CSharpDefinitionProvider extends AbstractSupport implements DefinitionProvider {
1717
private _definitionMetadataDocumentProvider: DefinitionMetadataDocumentProvider;
1818

19-
constructor(server, definitionMetadataDocumentProvider: DefinitionMetadataDocumentProvider) {
20-
super(server);
19+
constructor(server,reporter: TelemetryReporter, definitionMetadataDocumentProvider: DefinitionMetadataDocumentProvider) {
20+
super(server, reporter);
21+
2122
this._definitionMetadataDocumentProvider = definitionMetadataDocumentProvider;
2223
}
2324

src/features/diagnosticsProvider.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import * as protocol from '../omnisharp/protocol';
99
import * as serverUtils from '../omnisharp/utils';
1010
import { toRange } from '../omnisharp/typeConvertion';
1111
import * as vscode from 'vscode';
12+
import TelemetryReporter from 'vscode-extension-telemetry';
1213

1314
export class Advisor {
1415

@@ -108,8 +109,8 @@ export class Advisor {
108109
}
109110
}
110111

111-
export default function reportDiagnostics(server: OmniSharpServer, advisor: Advisor): vscode.Disposable {
112-
return new DiagnosticsProvider(server, advisor);
112+
export default function reportDiagnostics(server: OmniSharpServer, reporter: TelemetryReporter, advisor: Advisor): vscode.Disposable {
113+
return new DiagnosticsProvider(server, reporter, advisor);
113114
}
114115

115116
class DiagnosticsProvider extends AbstractSupport {
@@ -120,8 +121,9 @@ class DiagnosticsProvider extends AbstractSupport {
120121
private _projectValidation: vscode.CancellationTokenSource;
121122
private _diagnostics: vscode.DiagnosticCollection;
122123

123-
constructor(server: OmniSharpServer, validationAdvisor: Advisor) {
124-
super(server);
124+
constructor(server: OmniSharpServer, reporter: TelemetryReporter, validationAdvisor: Advisor) {
125+
super(server, reporter);
126+
125127
this._validationAdvisor = validationAdvisor;
126128
this._diagnostics = vscode.languages.createDiagnosticCollection('csharp');
127129

0 commit comments

Comments
 (0)