提交 955f02aa 编写于 作者: J Joao Moreno

Merge branch 'master' into gallery

......@@ -14,19 +14,17 @@ export interface IDisposable {
dispose(): void;
}
export function dispose<T extends IDisposable>(disposable: T): T;
export function dispose<T extends IDisposable>(...disposables: T[]): T;
export function dispose<T extends IDisposable>(disposables: T[]): T[];
export function dispose<T extends IDisposable>(...disposables: T[]): T[];
export function dispose<T extends IDisposable>(arg: any): T[] {
if (isArray(arg)) {
const disposables: T[] = arg;
disposables.forEach(d => d && d.dispose());
return [];
export function dispose<T extends IDisposable>(...disposables: T[]): T[] {
const first = disposables[0];
if (isArray(first)) {
disposables = first as any as T[];
}
const disposable: T = arg;
disposable.dispose();
return null;
disposables.forEach(d => d && d.dispose());
return [];
}
export function combinedDisposable(disposables: IDisposable[]): IDisposable;
......
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import * as assert from 'assert';
import { IDisposable, dispose } from 'vs/base/common/lifecycle';
class Disposable implements IDisposable {
isDisposed = false;
dispose() { this.isDisposed = true; }
}
suite('Lifecycle', () => {
test('dispose single disposable', () => {
const disposable = new Disposable();
assert(!disposable.isDisposed);
dispose(disposable);
assert(disposable.isDisposed);
});
test('dispose disposable array', () => {
const disposable = new Disposable();
const disposable2 = new Disposable();
assert(!disposable.isDisposed);
assert(!disposable2.isDisposed);
dispose([disposable, disposable2]);
assert(disposable.isDisposed);
assert(disposable2.isDisposed);
});
test('dispose disposables', () => {
const disposable = new Disposable();
const disposable2 = new Disposable();
assert(!disposable.isDisposed);
assert(!disposable2.isDisposed);
dispose(disposable, disposable2);
assert(disposable.isDisposed);
assert(disposable2.isDisposed);
});
});
\ No newline at end of file
......@@ -11,6 +11,7 @@ import objects = require('vs/base/common/objects');
import errors = require('vs/base/common/errors');
import uri from 'vs/base/common/uri';
import model = require('./model');
import {RunOnceScheduler} from 'vs/base/common/async';
import lifecycle = require('vs/base/common/lifecycle');
import collections = require('vs/base/common/collections');
import {IConfigurationService, ConfigurationServiceEventTypes} from './configuration';
......@@ -42,8 +43,11 @@ interface ILoadConfigResult {
}
export abstract class ConfigurationService extends eventEmitter.EventEmitter implements IConfigurationService, lifecycle.IDisposable {
public serviceId = IConfigurationService;
private static RELOAD_CONFIGURATION_DELAY = 50;
public onDidUpdateConfiguration: Event<{ config: any }>;
protected contextService: IWorkspaceContextService;
......@@ -54,6 +58,7 @@ export abstract class ConfigurationService extends eventEmitter.EventEmitter imp
private bulkFetchFromWorkspacePromise: winjs.TPromise<any>;
private workspaceFilePathToConfiguration: { [relativeWorkspacePath: string]: winjs.TPromise<model.IConfigFile> };
private callOnDispose: Function;
private reloadConfigurationScheduler: RunOnceScheduler;
constructor(contextService: IWorkspaceContextService, eventService: IEventService, workspaceSettingsRootFolder: string = '.vscode') {
super();
......@@ -65,7 +70,7 @@ export abstract class ConfigurationService extends eventEmitter.EventEmitter imp
this.workspaceFilePathToConfiguration = Object.create(null);
let unbind = this.eventService.addListener(Files.EventType.FILE_CHANGES, (events) => this.handleFileEvents(events));
let subscription = (<IConfigurationRegistry>Registry.as(Extensions.Configuration)).onDidRegisterConfiguration(() => this.reloadAndEmit());
let subscription = (<IConfigurationRegistry>Registry.as(Extensions.Configuration)).onDidRegisterConfiguration(() => this.reloadConfiguration());
this.callOnDispose = () => {
unbind();
subscription.dispose();
......@@ -81,6 +86,10 @@ export abstract class ConfigurationService extends eventEmitter.EventEmitter imp
protected abstract resolveStat(resource: uri): winjs.TPromise<IStat>;
public dispose(): void {
if (this.reloadConfigurationScheduler) {
this.reloadConfigurationScheduler.dispose();
}
this.callOnDispose = lifecycle.cAll(this.callOnDispose);
super.dispose();
......@@ -175,11 +184,19 @@ export abstract class ConfigurationService extends eventEmitter.EventEmitter imp
});
}
protected reloadAndEmit(): winjs.TPromise<void> {
return this.reloadConfiguration().then((config) => this.emit(ConfigurationServiceEventTypes.UPDATED, { config: config }));
protected reloadConfiguration(): void {
if (!this.reloadConfigurationScheduler) {
this.reloadConfigurationScheduler = new RunOnceScheduler(() => {
this.doReloadConfiguration().then((config) => this.emit(ConfigurationServiceEventTypes.UPDATED, { config: config })).done(null, errors.onUnexpectedError);
}, ConfigurationService.RELOAD_CONFIGURATION_DELAY);
}
if (!this.reloadConfigurationScheduler.isScheduled()) {
this.reloadConfigurationScheduler.schedule();
}
}
private reloadConfiguration(section?: string): winjs.TPromise<any> {
private doReloadConfiguration(section?: string): winjs.TPromise<any> {
this.loadConfigurationPromise = null;
return this.loadConfiguration(section);
......@@ -219,7 +236,7 @@ export abstract class ConfigurationService extends eventEmitter.EventEmitter imp
}
if (affectedByChanges) {
this.reloadAndEmit();
this.reloadConfiguration();
}
}
}
......@@ -94,7 +94,7 @@ export class ConfigurationService extends CommonConfigurationService {
private onOptionsChanged(e: OptionsChangeEvent): void {
if (e.key === 'globalSettings') {
this.reloadAndEmit();
this.reloadConfiguration();
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册