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

Fix #63433

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