Skip to content

Commit 94d07b6

Browse files
authored
Merge pull request #2233 from akshita31/remove_vscode_disposable
Remove usage of vscode.disposable
2 parents 5691f27 + 516162c commit 94d07b6

12 files changed

+129
-111
lines changed

src/CompositeDisposable.ts

Lines changed: 28 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,32 @@
11
/*---------------------------------------------------------------------------------------------
22
* Copyright (c) Microsoft Corporation. All rights reserved.
33
* Licensed under the MIT License. See License.txt in the project root for license information.
4-
*--------------------------------------------------------------------------------------------*/
5-
6-
import { Subscription } from "rxjs/Subscription";
7-
import Disposable from "./Disposable";
8-
9-
export default class CompositeDisposable extends Disposable {
10-
private disposables = new Subscription();
11-
12-
constructor (...disposables: Disposable[]){
13-
super(() => this.disposables.unsubscribe());
14-
15-
for (const disposable of disposables) {
16-
if (disposable) {
17-
this.disposables.add(disposable.dispose);
18-
}
19-
else {
20-
throw new Error("null disposables are not supported");
21-
}
22-
}
23-
}
24-
25-
public add(disposable: Disposable | {(): void}) {
26-
if (!disposable) {
27-
throw new Error("disposable cannot be null");
28-
}
29-
30-
const actualDisposable =
31-
disposable.constructor.name === Disposable.name
32-
? <Disposable>disposable
33-
: new Disposable(<{(): void}>disposable);
34-
35-
this.disposables.add(actualDisposable.dispose);
36-
}
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
import { Subscription } from "rxjs/Subscription";
7+
import Disposable, { IDisposable } from "./Disposable";
8+
9+
export default class CompositeDisposable extends Disposable {
10+
private disposables = new Subscription();
11+
12+
constructor(...disposables: IDisposable[]) {
13+
super(() => this.disposables.unsubscribe());
14+
15+
for (const disposable of disposables) {
16+
if (disposable) {
17+
this.add(disposable);
18+
}
19+
else {
20+
throw new Error("null disposables are not supported");
21+
}
22+
}
23+
}
24+
25+
public add(disposable: IDisposable) {
26+
if (!disposable) {
27+
throw new Error("disposable cannot be null");
28+
}
29+
30+
this.disposables.add(() => disposable.dispose());
31+
}
3732
}

src/Disposable.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,29 @@
22
* Copyright (c) Microsoft Corporation. All rights reserved.
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
5+
import { Subscription } from "rxjs/Subscription";
56

6-
export default class Disposable {
7+
export default class Disposable implements IDisposable {
78
private onDispose: { (): void };
89

9-
constructor(onDispose: { (): void }) {
10+
constructor(onDispose: { (): void } | Subscription) {
1011
if (!onDispose) {
1112
throw new Error("onDispose cannot be null or empty.");
1213
}
13-
14-
this.onDispose = onDispose;
14+
15+
if (onDispose instanceof Subscription) {
16+
this.onDispose = () => onDispose.unsubscribe();
17+
}
18+
else {
19+
this.onDispose = onDispose;
20+
}
1521
}
1622

1723
public dispose = (): void => {
1824
this.onDispose();
1925
}
2026
}
27+
28+
export interface IDisposable {
29+
dispose: () => void;
30+
}

src/features/abstractProvider.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,24 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { Disposable } from 'vscode';
76
import { OmniSharpServer } from '../omnisharp/server';
7+
import CompositeDisposable from '../CompositeDisposable';
88

99
export default abstract class AbstractProvider {
1010

1111
protected _server: OmniSharpServer;
12-
private _disposables: Disposable[];
12+
private _disposables: CompositeDisposable;
1313

1414
constructor(server: OmniSharpServer) {
1515
this._server = server;
16-
this._disposables = [];
16+
this._disposables = new CompositeDisposable();
1717
}
1818

19-
protected addDisposables(...disposables: Disposable[]) {
20-
this._disposables.push(...disposables);
19+
protected addDisposables(disposables: CompositeDisposable) {
20+
this._disposables.add(disposables);
2121
}
2222

23-
dispose() {
24-
while (this._disposables.length) {
25-
this._disposables.pop().dispose();
26-
}
23+
dispose = () => {
24+
this._disposables.dispose();
2725
}
2826
}

src/features/changeForwarding.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import {Disposable, Uri, workspace} from 'vscode';
6+
import {Uri, workspace} from 'vscode';
77
import {OmniSharpServer} from '../omnisharp/server';
88
import * as serverUtils from '../omnisharp/utils';
99
import { FileChangeType } from '../omnisharp/protocol';
10+
import { IDisposable } from '../Disposable';
11+
import CompositeDisposable from '../CompositeDisposable';
1012

11-
function forwardDocumentChanges(server: OmniSharpServer): Disposable {
13+
function forwardDocumentChanges(server: OmniSharpServer): IDisposable {
1214

1315
return workspace.onDidChangeTextDocument(event => {
1416

@@ -28,7 +30,7 @@ function forwardDocumentChanges(server: OmniSharpServer): Disposable {
2830
});
2931
}
3032

31-
function forwardFileChanges(server: OmniSharpServer): Disposable {
33+
function forwardFileChanges(server: OmniSharpServer): IDisposable {
3234

3335
function onFileSystemEvent(changeType: FileChangeType): (uri: Uri) => void {
3436
return function(uri: Uri)
@@ -51,13 +53,13 @@ function forwardFileChanges(server: OmniSharpServer): Disposable {
5153
let d2 = watcher.onDidDelete(onFileSystemEvent(FileChangeType.Delete));
5254
let d3 = watcher.onDidChange(onFileSystemEvent(FileChangeType.Change));
5355

54-
return Disposable.from(watcher, d1, d2, d3);
56+
return new CompositeDisposable(watcher, d1, d2, d3);
5557
}
5658

57-
export default function forwardChanges(server: OmniSharpServer): Disposable {
59+
export default function forwardChanges(server: OmniSharpServer): IDisposable {
5860

5961
// combine file watching and text document watching
60-
return Disposable.from(
62+
return new CompositeDisposable(
6163
forwardDocumentChanges(server),
6264
forwardFileChanges(server));
6365
}

src/features/codeActionProvider.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import * as serverUtils from '../omnisharp/utils';
1212
import { Options } from '../omnisharp/options';
1313
import { FileModificationType } from '../omnisharp/protocol';
1414
import { Uri } from 'vscode';
15+
import CompositeDisposable from '../CompositeDisposable';
1516

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

@@ -27,7 +28,7 @@ export default class CodeActionProvider extends AbstractProvider implements vsco
2728

2829
let d1 = vscode.workspace.onDidChangeConfiguration(this._resetCachedOptions, this);
2930
let d2 = vscode.commands.registerCommand(this._commandId, this._runCodeAction, this);
30-
this.addDisposables(d1, d2);
31+
this.addDisposables(new CompositeDisposable(d1, d2));
3132
}
3233

3334
private _resetCachedOptions(): void {

src/features/codeLensProvider.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import AbstractProvider from './abstractProvider';
1313
import { OmniSharpServer } from '../omnisharp/server';
1414
import { Options } from '../omnisharp/options';
1515
import TestManager from './dotnetTest';
16+
import CompositeDisposable from '../CompositeDisposable';
1617

1718
class OmniSharpCodeLens extends vscode.CodeLens {
1819

@@ -34,7 +35,7 @@ export default class OmniSharpCodeLensProvider extends AbstractProvider implemen
3435
this._resetCachedOptions();
3536

3637
let configChangedDisposable = vscode.workspace.onDidChangeConfiguration(this._resetCachedOptions, this);
37-
this.addDisposables(configChangedDisposable);
38+
this.addDisposables(new CompositeDisposable(configChangedDisposable));
3839
}
3940

4041
private _resetCachedOptions(): void {

src/features/commands.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@ import { getAdapterExecutionCommand } from '../coreclr-debug/activate';
1717
import { CommandShowOutput, CommandDotNetRestoreStart, CommandDotNetRestoreProgress, CommandDotNetRestoreSucceeded, CommandDotNetRestoreFailed } from '../omnisharp/loggingEvents';
1818
import { EventStream } from '../EventStream';
1919
import { PlatformInformation } from '../platform';
20+
import CompositeDisposable from '../CompositeDisposable';
2021

21-
export default function registerCommands(server: OmniSharpServer, eventStream: EventStream, platformInfo: PlatformInformation) {
22+
export default function registerCommands(server: OmniSharpServer, eventStream: EventStream, platformInfo: PlatformInformation): CompositeDisposable {
2223
let d1 = vscode.commands.registerCommand('o.restart', () => restartOmniSharp(server));
2324
let d2 = vscode.commands.registerCommand('o.pickProjectAndStart', () => pickProjectAndStart(server));
2425
let d3 = vscode.commands.registerCommand('o.showOutput', () => eventStream.post(new CommandShowOutput()));
@@ -50,7 +51,7 @@ export default function registerCommands(server: OmniSharpServer, eventStream: E
5051
let d9 = vscode.commands.registerCommand('csharp.coreclrAdapterExecutableCommand', async (args) => getAdapterExecutionCommand(platformInfo, eventStream));
5152
let d10 = vscode.commands.registerCommand('csharp.clrAdapterExecutableCommand', async (args) => getAdapterExecutionCommand(platformInfo, eventStream));
5253

53-
return vscode.Disposable.from(d1, d2, d3, d4, d5, d6, d7, d8, d9, d10);
54+
return new CompositeDisposable(d1, d2, d3, d4, d5, d6, d7, d8, d9, d10);
5455
}
5556

5657
function restartOmniSharp(server: OmniSharpServer) {

src/features/definitionMetadataDocumentProvider.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { Disposable, TextDocument, TextDocumentContentProvider, Uri, workspace } from 'vscode';
7-
6+
import { TextDocument, TextDocumentContentProvider, Uri, workspace } from 'vscode';
87
import { MetadataResponse } from '../omnisharp/protocol';
8+
import { IDisposable } from '../Disposable';
99

10-
export default class DefinitionMetadataDocumentProvider implements TextDocumentContentProvider, Disposable {
10+
export default class DefinitionMetadataDocumentProvider implements TextDocumentContentProvider, IDisposable {
1111
readonly scheme = "omnisharp-metadata";
12-
private _registration : Disposable;
12+
private _registration : IDisposable;
1313
private _documents: Map<string, MetadataResponse>;
14-
private _documentClosedSubscription: Disposable;
14+
private _documentClosedSubscription: IDisposable;
1515

1616
constructor() {
1717
this._documents = new Map<string, MetadataResponse>();

src/features/diagnosticsProvider.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@ 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 CompositeDisposable from '../CompositeDisposable';
13+
import { IDisposable } from '../Disposable';
1214

1315
export class Advisor {
1416

15-
private _disposable: vscode.Disposable;
17+
private _disposable: CompositeDisposable;
1618
private _server: OmniSharpServer;
1719
private _packageRestoreCounter: number = 0;
1820
private _projectSourceFileCounts: { [path: string]: number } = Object.create(null);
@@ -25,7 +27,7 @@ export class Advisor {
2527
let d3 = server.onProjectRemoved(this._onProjectRemoved, this);
2628
let d4 = server.onBeforePackageRestore(this._onBeforePackageRestore, this);
2729
let d5 = server.onPackageRestore(this._onPackageRestore, this);
28-
this._disposable = vscode.Disposable.from(d1, d2, d3, d4, d5);
30+
this._disposable = new CompositeDisposable(d1, d2, d3, d4, d5);
2931
}
3032

3133
public dispose() {
@@ -108,14 +110,14 @@ export class Advisor {
108110
}
109111
}
110112

111-
export default function reportDiagnostics(server: OmniSharpServer, advisor: Advisor): vscode.Disposable {
113+
export default function reportDiagnostics(server: OmniSharpServer, advisor: Advisor): IDisposable {
112114
return new DiagnosticsProvider(server, advisor);
113115
}
114116

115117
class DiagnosticsProvider extends AbstractSupport {
116118

117119
private _validationAdvisor: Advisor;
118-
private _disposable: vscode.Disposable;
120+
private _disposable: CompositeDisposable;
119121
private _documentValidations: { [uri: string]: vscode.CancellationTokenSource } = Object.create(null);
120122
private _projectValidation: vscode.CancellationTokenSource;
121123
private _diagnostics: vscode.DiagnosticCollection;
@@ -131,7 +133,7 @@ class DiagnosticsProvider extends AbstractSupport {
131133
let d4 = vscode.workspace.onDidOpenTextDocument(event => this._onDocumentAddOrChange(event), this);
132134
let d3 = vscode.workspace.onDidChangeTextDocument(event => this._onDocumentAddOrChange(event.document), this);
133135
let d5 = vscode.workspace.onDidCloseTextDocument(this._onDocumentRemove, this);
134-
this._disposable = vscode.Disposable.from(this._diagnostics, d1, d2, d3, d4, d5);
136+
this._disposable = new CompositeDisposable(this._diagnostics, d1, d2, d3, d4, d5);
135137

136138
// Go ahead and check for diagnostics in the currently visible editors.
137139
for (let editor of vscode.window.visibleTextEditors) {
@@ -142,7 +144,7 @@ class DiagnosticsProvider extends AbstractSupport {
142144
}
143145
}
144146

145-
public dispose(): void {
147+
public dispose = () => {
146148
if (this._projectValidation) {
147149
this._projectValidation.dispose();
148150
}

src/features/dotnetTest.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import { OmniSharpServer } from '../omnisharp/server';
1616
import { TestExecutionCountReport } from '../omnisharp/loggingEvents';
1717
import { EventStream } from '../EventStream';
1818
import LaunchConfiguration from './launchConfiguration';
19+
import Disposable from '../Disposable';
20+
import CompositeDisposable from '../CompositeDisposable';
1921

2022
const TelemetryReportingDelay = 2 * 60 * 1000; // two minutes
2123

@@ -51,7 +53,7 @@ export default class TestManager extends AbstractProvider {
5153
this._telemetryIntervalId = setInterval(() =>
5254
this._reportTelemetry(), TelemetryReportingDelay);
5355

54-
let d3 = new vscode.Disposable(() => {
56+
let d3 = new Disposable(() => {
5557
if (this._telemetryIntervalId !== undefined) {
5658
// Stop reporting telemetry
5759
clearInterval(this._telemetryIntervalId);
@@ -60,13 +62,13 @@ export default class TestManager extends AbstractProvider {
6062
}
6163
});
6264

63-
this.addDisposables(d1, d2, d3, d4, d5);
65+
this.addDisposables(new CompositeDisposable(d1, d2, d3, d4, d5));
6466
}
6567

6668
private _getOutputChannel(): vscode.OutputChannel {
6769
if (this._channel === undefined) {
6870
this._channel = vscode.window.createOutputChannel(".NET Test Log");
69-
this.addDisposables(this._channel);
71+
this.addDisposables(new CompositeDisposable(this._channel));
7072
}
7173

7274
return this._channel;

0 commit comments

Comments
 (0)