提交 ea771bdc 编写于 作者: S Sandeep Somavarapu

Fix #63433

上级 a8dbfd29
......@@ -12,32 +12,42 @@ import { Event, Emitter } from 'vs/base/common/event';
export class UserConfiguration extends Disposable {
private userConfigModelWatcher: ConfigWatcher<ConfigurationModelParser>;
private initializePromise: Promise<void>;
private readonly _onDidChangeConfiguration: Emitter<ConfigurationModel> = this._register(new Emitter<ConfigurationModel>());
readonly onDidChangeConfiguration: Event<ConfigurationModel> = this._onDidChangeConfiguration.event;
constructor(settingsPath: string) {
constructor(private settingsPath: string) {
super();
this.userConfigModelWatcher = new ConfigWatcher(settingsPath, {
changeBufferDelay: 300, onError: error => onUnexpectedError(error), defaultConfig: new ConfigurationModelParser(settingsPath), parse: (content: string, parseErrors: any[]) => {
const userConfigModelParser = new ConfigurationModelParser(settingsPath);
userConfigModelParser.parse(content);
parseErrors = [...userConfigModelParser.errors];
return userConfigModelParser;
}
});
this._register(this.userConfigModelWatcher);
// Listeners
this._register(this.userConfigModelWatcher.onDidUpdateConfiguration(() => this._onDidChangeConfiguration.fire(this.configurationModel)));
}
get configurationModel(): ConfigurationModel {
initialize(): Promise<ConfigurationModel> {
if (!this.initializePromise) {
this.initializePromise = new Promise<void>((c, e) => {
this.userConfigModelWatcher = new ConfigWatcher(this.settingsPath, {
changeBufferDelay: 300, onError: error => onUnexpectedError(error), defaultConfig: new ConfigurationModelParser(this.settingsPath), parse: (content: string, parseErrors: any[]) => {
const userConfigModelParser = new ConfigurationModelParser(this.settingsPath);
userConfigModelParser.parse(content);
parseErrors = [...userConfigModelParser.errors];
return userConfigModelParser;
}, initCallback: () => c(null)
});
this._register(this.userConfigModelWatcher);
// Listeners
this._register(this.userConfigModelWatcher.onDidUpdateConfiguration(() => this._onDidChangeConfiguration.fire(this.userConfigModelWatcher.getConfig().configurationModel)));
});
}
return this.initializePromise.then(() => this.userConfigModelWatcher.getConfig().configurationModel);
}
initializeSync(): ConfigurationModel {
this.initialize();
return this.userConfigModelWatcher.getConfig().configurationModel;
}
reload(): Promise<void> {
return new Promise<void>(c => this.userConfigModelWatcher.reload(() => c()));
reload(): Promise<ConfigurationModel> {
return this.initialize().then(() => new Promise<ConfigurationModel>(c => this.userConfigModelWatcher.reload(userConfigModelParser => c(userConfigModelParser.configurationModel))));
}
}
\ No newline at end of file
......@@ -7,7 +7,7 @@ import { Registry } from 'vs/platform/registry/common/platform';
import { IConfigurationRegistry, Extensions } from 'vs/platform/configuration/common/configurationRegistry';
import { IDisposable, Disposable } from 'vs/base/common/lifecycle';
import { IConfigurationService, IConfigurationChangeEvent, IConfigurationOverrides, ConfigurationTarget, compare, isConfigurationOverrides, IConfigurationData } from 'vs/platform/configuration/common/configuration';
import { DefaultConfigurationModel, Configuration, ConfigurationChangeEvent } from 'vs/platform/configuration/common/configurationModels';
import { DefaultConfigurationModel, Configuration, ConfigurationChangeEvent, ConfigurationModel } from 'vs/platform/configuration/common/configurationModels';
import { Event, Emitter } from 'vs/base/common/event';
import { IEnvironmentService } from 'vs/platform/environment/common/environment';
import { equals } from 'vs/base/common/objects';
......@@ -31,10 +31,13 @@ export class ConfigurationService extends Disposable implements IConfigurationSe
this.userConfiguration = this._register(new UserConfiguration(environmentService.appSettingsPath));
this.reset();
// Initialize
const defaults = new DefaultConfigurationModel();
const user = this.userConfiguration.initializeSync();
this._configuration = new Configuration(defaults, user);
// Listeners
this._register(this.userConfiguration.onDidChangeConfiguration(() => this.onDidChangeUserConfiguration()));
this._register(this.userConfiguration.onDidChangeConfiguration(userConfigurationModel => this.onDidChangeUserConfiguration(userConfigurationModel)));
this._register(Registry.as<IConfigurationRegistry>(Extensions.Configuration).onDidRegisterConfiguration(configurationProperties => this.onDidRegisterConfiguration(configurationProperties)));
}
......@@ -85,16 +88,16 @@ export class ConfigurationService extends Disposable implements IConfigurationSe
reloadConfiguration(folder?: IWorkspaceFolder): Promise<void> {
return folder ? Promise.resolve(null) :
this.userConfiguration.reload().then(() => this.onDidChangeUserConfiguration());
this.userConfiguration.reload().then(userConfigurationModel => this.onDidChangeUserConfiguration(userConfigurationModel));
}
private onDidChangeUserConfiguration(): void {
private onDidChangeUserConfiguration(userConfigurationModel: ConfigurationModel): void {
let changedKeys: string[] = [];
const { added, updated, removed } = compare(this._configuration.user, this.userConfiguration.configurationModel);
const { added, updated, removed } = compare(this._configuration.user, userConfigurationModel);
changedKeys = [...added, ...updated, ...removed];
if (changedKeys.length) {
const oldConfiguartion = this._configuration;
this.reset();
this._configuration.updateUserConfiguration(userConfigurationModel);
changedKeys = changedKeys.filter(key => !equals(oldConfiguartion.getValue(key, {}, null), this._configuration.getValue(key, {}, null)));
if (changedKeys.length) {
this.trigger(changedKeys, ConfigurationTarget.USER);
......@@ -103,16 +106,10 @@ export class ConfigurationService extends Disposable implements IConfigurationSe
}
private onDidRegisterConfiguration(keys: string[]): void {
this.reset(); // reset our caches
this._configuration.updateDefaultConfiguration(new DefaultConfigurationModel());
this.trigger(keys, ConfigurationTarget.DEFAULT);
}
private reset(): void {
const defaults = new DefaultConfigurationModel();
const user = this.userConfiguration.configurationModel;
this._configuration = new Configuration(defaults, user);
}
private trigger(keys: string[], source: ConfigurationTarget): void {
this._onDidChangeConfiguration.fire(new ConfigurationChangeEvent().change(keys).telemetryData(source, this.getTargetConfiguration(source)));
}
......
......@@ -82,7 +82,7 @@ export class WorkspaceService extends Disposable implements IWorkspaceConfigurat
this.defaultConfiguration = new DefaultConfigurationModel();
this.userConfiguration = this._register(new UserConfiguration(environmentService.appSettingsPath));
this.workspaceConfiguration = this._register(new WorkspaceConfiguration());
this._register(this.userConfiguration.onDidChangeConfiguration(() => this.onUserConfigurationChanged()));
this._register(this.userConfiguration.onDidChangeConfiguration(userConfiguration => this.onUserConfigurationChanged(userConfiguration)));
this._register(this.workspaceConfiguration.onDidUpdateConfiguration(() => this.onWorkspaceConfigurationChanged()));
this._register(Registry.as<IConfigurationRegistry>(Extensions.Configuration).onDidSchemaChange(e => this.registerConfigurationSchemas()));
......@@ -276,8 +276,8 @@ export class WorkspaceService extends Disposable implements IWorkspaceConfigurat
return this.reloadWorkspaceFolderConfiguration(folder, key);
}
return this.reloadUserConfiguration()
.then(() => this.reloadWorkspaceConfiguration())
.then(() => this.loadConfiguration());
.then(userConfigurationModel => this.reloadWorkspaceConfiguration()
.then(() => this.loadConfiguration(userConfigurationModel)));
}
inspect<T>(key: string, overrides?: IConfigurationOverrides): {
......@@ -425,10 +425,11 @@ export class WorkspaceService extends Disposable implements IWorkspaceConfigurat
private initializeConfiguration(): Promise<void> {
this.registerConfigurationSchemas();
return this.loadConfiguration();
return this.userConfiguration.initialize()
.then(userConfigurationModel => this.loadConfiguration(userConfigurationModel));
}
private reloadUserConfiguration(key?: string): Promise<void> {
private reloadUserConfiguration(key?: string): Promise<ConfigurationModel> {
return this.userConfiguration.reload();
}
......@@ -447,7 +448,7 @@ export class WorkspaceService extends Disposable implements IWorkspaceConfigurat
return this.onWorkspaceFolderConfigurationChanged(folder, key);
}
private loadConfiguration(): Promise<void> {
private loadConfiguration(userConfigurationModel: ConfigurationModel): Promise<void> {
// reset caches
this.cachedFolderConfigs = new ResourceMap<FolderConfiguration>();
......@@ -460,7 +461,7 @@ export class WorkspaceService extends Disposable implements IWorkspaceConfigurat
folderConfigurations.forEach((folderConfiguration, index) => folderConfigurationModels.set(folders[index].uri, folderConfiguration));
const currentConfiguration = this._configuration;
this._configuration = new Configuration(this.defaultConfiguration, this.userConfiguration.configurationModel, workspaceConfiguration, folderConfigurationModels, new ConfigurationModel(), new ResourceMap<ConfigurationModel>(), this.getWorkbenchState() !== WorkbenchState.EMPTY ? this.workspace : null); //TODO: Sandy Avoid passing null
this._configuration = new Configuration(this.defaultConfiguration, userConfigurationModel, workspaceConfiguration, folderConfigurationModels, new ConfigurationModel(), new ResourceMap<ConfigurationModel>(), this.getWorkbenchState() !== WorkbenchState.EMPTY ? this.workspace : null); //TODO: Sandy Avoid passing null
if (currentConfiguration) {
const changedKeys = this._configuration.compare(currentConfiguration);
......@@ -527,8 +528,8 @@ export class WorkspaceService extends Disposable implements IWorkspaceConfigurat
}
}
private onUserConfigurationChanged(): void {
let keys = this._configuration.compareAndUpdateUserConfiguration(this.userConfiguration.configurationModel);
private onUserConfigurationChanged(userConfiguration: ConfigurationModel): void {
let keys = this._configuration.compareAndUpdateUserConfiguration(userConfiguration);
this.triggerConfigurationChange(keys, ConfigurationTarget.USER);
}
......@@ -623,7 +624,7 @@ export class WorkspaceService extends Disposable implements IWorkspaceConfigurat
case ConfigurationTarget.WORKSPACE_FOLDER:
const workspaceFolder = overrides && overrides.resource ? this.workspace.getFolder(overrides.resource) : null;
if (workspaceFolder) {
return this.reloadWorkspaceFolderConfiguration(this.workspace.getFolder(overrides.resource), key);
return this.reloadWorkspaceFolderConfiguration(this.workspace.getFolder(overrides.resource), key).then(() => null);
}
}
return null;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册