diff --git a/src/vs/editor/common/services/modeService.ts b/src/vs/editor/common/services/modeService.ts index e52fbf61a89..8c383913895 100644 --- a/src/vs/editor/common/services/modeService.ts +++ b/src/vs/editor/common/services/modeService.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import { Event } from 'vs/base/common/event'; -import { IDisposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { IMode, LanguageId, LanguageIdentifier } from 'vs/editor/common/modes'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; @@ -22,7 +21,7 @@ export interface ILanguageExtensionPoint { configuration?: URI; } -export interface ILanguageSelection extends IDisposable { +export interface ILanguageSelection { readonly languageIdentifier: LanguageIdentifier; readonly onDidChange: Event; } diff --git a/src/vs/editor/common/services/modeServiceImpl.ts b/src/vs/editor/common/services/modeServiceImpl.ts index f5a6eba1dad..9eee6901216 100644 --- a/src/vs/editor/common/services/modeServiceImpl.ts +++ b/src/vs/editor/common/services/modeServiceImpl.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Emitter, Event } from 'vs/base/common/event'; -import { Disposable } from 'vs/base/common/lifecycle'; +import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { IMode, LanguageId, LanguageIdentifier } from 'vs/editor/common/modes'; import { FrankensteinMode } from 'vs/editor/common/modes/abstractMode'; @@ -13,20 +13,28 @@ import { LanguagesRegistry } from 'vs/editor/common/services/languagesRegistry'; import { ILanguageSelection, IModeService } from 'vs/editor/common/services/modeService'; import { firstOrDefault } from 'vs/base/common/arrays'; -class LanguageSelection extends Disposable implements ILanguageSelection { +class LanguageSelection implements ILanguageSelection { public languageIdentifier: LanguageIdentifier; private readonly _selector: () => LanguageIdentifier; - - private readonly _onDidChange: Emitter = this._register(new Emitter()); - public readonly onDidChange: Event = this._onDidChange.event; + private readonly _onDidChange: Emitter; + public readonly onDidChange: Event; constructor(onLanguagesMaybeChanged: Event, selector: () => LanguageIdentifier) { - super(); this._selector = selector; this.languageIdentifier = this._selector(); - this._register(onLanguagesMaybeChanged(() => this._evaluate())); + + let listener: IDisposable; + this._onDidChange = new Emitter({ + onFirstListenerAdd: () => { + listener = onLanguagesMaybeChanged(() => this._evaluate()); + }, + onLastListenerRemove: () => { + listener.dispose(); + } + }); + this.onDidChange = this._onDidChange.event; } private _evaluate(): void { diff --git a/src/vs/editor/common/services/modelServiceImpl.ts b/src/vs/editor/common/services/modelServiceImpl.ts index c7bcc283b1b..af7000ffd9c 100644 --- a/src/vs/editor/common/services/modelServiceImpl.ts +++ b/src/vs/editor/common/services/modelServiceImpl.ts @@ -78,10 +78,6 @@ class ModelData implements IDisposable { this._languageSelectionListener.dispose(); this._languageSelectionListener = null; } - if (this._languageSelection) { - this._languageSelection.dispose(); - this._languageSelection = null; - } } public dispose(): void { diff --git a/src/vs/editor/test/common/mocks/mockMode.ts b/src/vs/editor/test/common/mocks/mockMode.ts index 703a760c7ad..f6cfeff1648 100644 --- a/src/vs/editor/test/common/mocks/mockMode.ts +++ b/src/vs/editor/test/common/mocks/mockMode.ts @@ -28,5 +28,4 @@ export class MockMode extends Disposable implements IMode { export class StaticLanguageSelector implements ILanguageSelection { readonly onDidChange: Event = Event.None; constructor(public readonly languageIdentifier: LanguageIdentifier) { } - public dispose(): void { } } diff --git a/src/vs/workbench/contrib/performance/browser/perfviewEditor.ts b/src/vs/workbench/contrib/performance/browser/perfviewEditor.ts index 6993e08a59f..b50dca22023 100644 --- a/src/vs/workbench/contrib/performance/browser/perfviewEditor.ts +++ b/src/vs/workbench/contrib/performance/browser/perfviewEditor.ts @@ -104,7 +104,6 @@ class PerfModelContentProvider implements ITextModelContentProvider { this._model.setMode(e); } })); - this._modelDisposables.push(langId); this._modelDisposables.push(this._extensionService.onDidChangeExtensionsStatus(this._updateModel, this)); writeTransientState(this._model, { wordWrapOverride: 'off' }, this._editorService);