提交 838d4a33 编写于 作者: S Sandeep Somavarapu

Fix #34353

上级 1fa9254d
......@@ -51,8 +51,15 @@ export interface IConfigurationService {
*/
reloadConfiguration<T>(section?: string): TPromise<T>;
// TODO: @sandy: Merge these to single fine grained configuration change event
// These events were separated to improve the start up performance - #34353
/**
* Event that fires when the configuration changes.
* Event that fires when the configurations from extensions are registered.
*/
onDidRegisterExtensionsConfigurations: Event<void>;
/**
* Event that fires when the configuration changes. This event is not fired when configurations from extensions are registered.
*/
onDidUpdateConfiguration: Event<IConfigurationServiceEvent>;
......
......@@ -35,7 +35,7 @@ export interface IConfigurationRegistry {
* Event that fires whenver a configuratio has been
* registered.
*/
onDidRegisterConfiguration: Event<IConfigurationRegistry>;
onDidRegisterConfiguration: Event<IConfigurationNode[]>;
/**
* Returns all configuration nodes contributed to this registry.
......@@ -75,6 +75,7 @@ export interface IConfigurationNode {
allOf?: IConfigurationNode[];
overridable?: boolean;
scope?: ConfigurationScope;
isFromExtensions?: boolean;
}
export interface IDefaultConfigurationExtension {
......@@ -93,14 +94,14 @@ class ConfigurationRegistry implements IConfigurationRegistry {
private configurationContributors: IConfigurationNode[];
private configurationProperties: { [qualifiedKey: string]: IJSONSchema };
private editorConfigurationSchema: IJSONSchema;
private _onDidRegisterConfiguration: Emitter<IConfigurationRegistry>;
private _onDidRegisterConfiguration: Emitter<IConfigurationNode[]>;
private overrideIdentifiers: string[] = [];
private overridePropertyPattern: string;
constructor() {
this.configurationContributors = [];
this.editorConfigurationSchema = { properties: {}, patternProperties: {}, additionalProperties: false, errorMessage: 'Unknown editor configuration setting' };
this._onDidRegisterConfiguration = new Emitter<IConfigurationRegistry>();
this._onDidRegisterConfiguration = new Emitter<IConfigurationNode[]>();
this.configurationProperties = {};
this.computeOverridePropertyPattern();
......@@ -123,7 +124,7 @@ class ConfigurationRegistry implements IConfigurationRegistry {
this.updateSchemaForOverrideSettingsConfiguration(configuration);
});
this._onDidRegisterConfiguration.fire(this);
this._onDidRegisterConfiguration.fire(configurations);
}
public registerOverrideIdentifiers(overrideIdentifiers: string[]): void {
......@@ -135,7 +136,8 @@ class ConfigurationRegistry implements IConfigurationRegistry {
const configurationNode: IConfigurationNode = {
id: 'defaultOverrides',
title: nls.localize('defaultConfigurations.title', "Default Configuration Overrides"),
properties: {}
properties: {},
isFromExtensions: true
};
for (const defaultConfiguration of defaultConfigurations) {
for (const key in defaultConfiguration.defaults) {
......
......@@ -7,7 +7,7 @@
import { TPromise } from 'vs/base/common/winjs.base';
import { ConfigWatcher } from 'vs/base/node/config';
import { Registry } from 'vs/platform/registry/common/platform';
import { IConfigurationRegistry, Extensions } from 'vs/platform/configuration/common/configurationRegistry';
import { IConfigurationRegistry, Extensions, IConfigurationNode } from 'vs/platform/configuration/common/configurationRegistry';
import { IDisposable, Disposable } from 'vs/base/common/lifecycle';
import { ConfigurationSource, IConfigurationService, IConfigurationServiceEvent, IConfigurationValue, IConfigurationKeys, ConfigurationModel, IConfigurationOverrides, Configuration, IConfigurationValues, IConfigurationData } from 'vs/platform/configuration/common/configuration';
import { CustomConfigurationModel, DefaultConfigurationModel } from 'vs/platform/configuration/common/model';
......@@ -25,6 +25,9 @@ export class ConfigurationService<T> extends Disposable implements IConfiguratio
private _onDidUpdateConfiguration: Emitter<IConfigurationServiceEvent> = this._register(new Emitter<IConfigurationServiceEvent>());
public readonly onDidUpdateConfiguration: Event<IConfigurationServiceEvent> = this._onDidUpdateConfiguration.event;
private _onDidRegisterExtensionsConfigurations: Emitter<void> = this._register(new Emitter<void>());
public readonly onDidRegisterExtensionsConfigurations: Event<void> = this._onDidRegisterExtensionsConfigurations.event;
constructor(
@IEnvironmentService environmentService: IEnvironmentService
) {
......@@ -41,23 +44,27 @@ export class ConfigurationService<T> extends Disposable implements IConfiguratio
// Listeners
this._register(this.userConfigModelWatcher.onDidUpdateConfiguration(() => this.onConfigurationChange(ConfigurationSource.User)));
this._register(Registry.as<IConfigurationRegistry>(Extensions.Configuration).onDidRegisterConfiguration(() => this.onConfigurationChange(ConfigurationSource.Default)));
this._register(Registry.as<IConfigurationRegistry>(Extensions.Configuration).onDidRegisterConfiguration(configurations => this.onConfigurationChange(ConfigurationSource.Default, configurations)));
}
public configuration(): Configuration<any> {
return this._configuration || (this._configuration = this.consolidateConfigurations());
}
private onConfigurationChange(source: ConfigurationSource): void {
private onConfigurationChange(source: ConfigurationSource, configurations?: IConfigurationNode[]): void {
this.reset(); // reset our caches
const cache = this.configuration();
if (configurations && configurations.length && configurations.every(c => c.isFromExtensions)) {
this._onDidRegisterExtensionsConfigurations.fire();
} else {
this._onDidUpdateConfiguration.fire({
source,
sourceConfig: source === ConfigurationSource.Default ? cache.defaults.contents : cache.user.contents
});
}
}
public reloadConfiguration<C>(section?: string): TPromise<C> {
return new TPromise<C>(c => {
......
......@@ -6,7 +6,7 @@
import URI from 'vs/base/common/uri';
import { TPromise } from 'vs/base/common/winjs.base';
import { IDisposable } from 'vs/base/common/lifecycle';
import { Disposable } from 'vs/base/common/lifecycle';
import { Registry } from 'vs/platform/registry/common/platform';
import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry';
import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace';
......@@ -16,9 +16,7 @@ import { MainThreadConfigurationShape, MainContext, ExtHostContext, IExtHostCont
import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers';
@extHostNamedCustomer(MainContext.MainThreadConfiguration)
export class MainThreadConfiguration implements MainThreadConfigurationShape {
private readonly _configurationListener: IDisposable;
export class MainThreadConfiguration extends Disposable implements MainThreadConfigurationShape {
constructor(
extHostContext: IExtHostContext,
......@@ -26,15 +24,16 @@ export class MainThreadConfiguration implements MainThreadConfigurationShape {
@IWorkspaceContextService private readonly _workspaceContextService: IWorkspaceContextService,
@IWorkspaceConfigurationService configurationService: IWorkspaceConfigurationService
) {
super();
const proxy = extHostContext.get(ExtHostContext.ExtHostConfiguration);
this._configurationListener = configurationService.onDidUpdateConfiguration(() => {
this._register(configurationService.onDidUpdateConfiguration(() => {
proxy.$acceptConfigurationChanged(configurationService.getConfigurationData());
});
}
}));
public dispose(): void {
this._configurationListener.dispose();
this._register(configurationService.onDidRegisterExtensionsConfigurations(() => {
proxy.$acceptConfigurationChanged(configurationService.getConfigurationData());
}));
}
$updateConfigurationOption(target: ConfigurationTarget, key: string, value: any, resource: URI): TPromise<void> {
......
......@@ -128,6 +128,7 @@ configurationExtPoint.setHandler(extensions => {
validateProperties(configuration, collector);
configuration.id = id;
configuration.isFromExtensions = true;
configurations.push(configuration);
};
......@@ -275,6 +276,9 @@ export class WorkspaceService extends Disposable implements IWorkspaceConfigurat
protected readonly _onDidUpdateConfiguration: Emitter<IConfigurationServiceEvent> = this._register(new Emitter<IConfigurationServiceEvent>());
public readonly onDidUpdateConfiguration: Event<IConfigurationServiceEvent> = this._onDidUpdateConfiguration.event;
private _onDidRegisterExtensionsConfigurations: Emitter<void> = this._register(new Emitter<void>());
public readonly onDidRegisterExtensionsConfigurations: Event<void> = this._onDidRegisterExtensionsConfigurations.event;
protected readonly _onDidChangeWorkspaceFolders: Emitter<IWorkspaceFoldersChangeEvent> = this._register(new Emitter<IWorkspaceFoldersChangeEvent>());
public readonly onDidChangeWorkspaceFolders: Event<IWorkspaceFoldersChangeEvent> = this._onDidChangeWorkspaceFolders.event;
......@@ -292,6 +296,7 @@ export class WorkspaceService extends Disposable implements IWorkspaceConfigurat
this.baseConfigurationService = this._register(new GlobalConfigurationService(environmentService));
this._register(this.baseConfigurationService.onDidUpdateConfiguration(e => this.onBaseConfigurationChanged(e)));
this._register(this.baseConfigurationService.onDidRegisterExtensionsConfigurations(e => this.onDidRegisterExtensionsDefaultsConfigurations()));
this._register(configurationRegistry.onDidRegisterConfiguration(e => this.registerConfigurationSchemas()));
}
......@@ -517,14 +522,24 @@ export class WorkspaceService extends Disposable implements IWorkspaceConfigurat
}
}
private onBaseConfigurationChanged({ source, sourceConfig }: IConfigurationServiceEvent): void {
private onBaseConfigurationChanged({ source, sourceConfig }: IConfigurationServiceEvent, doNotTrigger: boolean = false): boolean {
if (this.workspace) {
if (source === ConfigurationSource.Default) {
this.workspace.folders.forEach(folder => this._configuration.getFolderConfigurationModel(folder.uri).update());
}
if (this._configuration.updateBaseConfiguration(<any>this.baseConfigurationService.configuration())) {
if (!doNotTrigger) {
this._onDidUpdateConfiguration.fire({ source, sourceConfig });
}
return true;
}
}
return false;
}
private onDidRegisterExtensionsDefaultsConfigurations(): void {
if (this.onBaseConfigurationChanged({ source: ConfigurationSource.Default, sourceConfig: this.baseConfigurationService.getConfigurationData().defaults.contents }, true)) {
this._onDidRegisterExtensionsConfigurations.fire();
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册