Skip to content

Commit 3dc76ed

Browse files
committed
1 parent f256ab1 commit 3dc76ed

7 files changed

Lines changed: 98 additions & 121 deletions

File tree

src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ class MainProcessService implements IMainProcessService {
7979
}
8080
}
8181

82-
function main(server: Server, initData: ISharedProcessInitData, configuration: ISharedProcessConfiguration): void {
82+
async function main(server: Server, initData: ISharedProcessInitData, configuration: ISharedProcessConfiguration): Promise<void> {
8383
const services = new ServiceCollection();
8484

8585
const disposables: IDisposable[] = [];
@@ -96,12 +96,15 @@ function main(server: Server, initData: ISharedProcessInitData, configuration: I
9696
const logLevelClient = new LogLevelSetterChannelClient(server.getChannel('loglevel', mainRouter));
9797
const logService = new FollowerLogService(logLevelClient, new SpdLogService('sharedprocess', environmentService.logsPath, initData.logLevel));
9898
disposables.push(logService);
99-
10099
logService.info('main', JSON.stringify(configuration));
101100

101+
const configurationService = new ConfigurationService(environmentService.appSettingsPath);
102+
disposables.push(configurationService);
103+
await configurationService.initialize();
104+
102105
services.set(IEnvironmentService, environmentService);
103106
services.set(ILogService, logService);
104-
services.set(IConfigurationService, new SyncDescriptor(ConfigurationService, [environmentService.appSettingsPath]));
107+
services.set(IConfigurationService, configurationService);
105108
services.set(IRequestService, new SyncDescriptor(RequestService));
106109
services.set(IDownloadService, new SyncDescriptor(DownloadService));
107110

@@ -218,6 +221,6 @@ async function handshake(configuration: ISharedProcessConfiguration): Promise<vo
218221

219222
const server = await setupIPC(data.sharedIPCHandle);
220223

221-
main(server, data, configuration);
224+
await main(server, data, configuration);
222225
ipcRenderer.send('handshake:im ready');
223226
}

src/vs/code/electron-main/app.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@ import product from 'vs/platform/product/node/product';
3737
import pkg from 'vs/platform/product/node/package';
3838
import { ProxyAuthHandler } from 'vs/code/electron-main/auth';
3939
import { Disposable } from 'vs/base/common/lifecycle';
40-
import { ConfigurationService } from 'vs/platform/configuration/node/configurationService';
4140
import { IWindowsMainService, ICodeWindow } from 'vs/platform/windows/electron-main/windows';
4241
import { IHistoryMainService } from 'vs/platform/history/common/history';
4342
import { withUndefinedAsNull } from 'vs/base/common/types';
@@ -98,7 +97,7 @@ export class CodeApplication extends Disposable {
9897
@ILogService private readonly logService: ILogService,
9998
@IEnvironmentService private readonly environmentService: IEnvironmentService,
10099
@ILifecycleService private readonly lifecycleService: ILifecycleService,
101-
@IConfigurationService private readonly configurationService: ConfigurationService,
100+
@IConfigurationService private readonly configurationService: IConfigurationService,
102101
@IStateService private readonly stateService: IStateService
103102
) {
104103
super();

src/vs/code/electron-main/main.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,11 @@ class CodeMain {
9797
// Init services
9898
await instantiationService.invokeFunction(async accessor => {
9999
const environmentService = accessor.get(IEnvironmentService);
100+
const configurationService = accessor.get(IConfigurationService);
100101
const stateService = accessor.get(IStateService);
101102

102103
try {
103-
await this.initServices(environmentService, stateService as StateService);
104+
await this.initServices(environmentService, configurationService as ConfigurationService, stateService as StateService);
104105
} catch (error) {
105106

106107
// Show a dialog for errors that can be resolved by the user
@@ -140,17 +141,17 @@ class CodeMain {
140141
process.once('exit', () => logService.dispose());
141142
services.set(ILogService, logService);
142143

144+
services.set(IConfigurationService, new ConfigurationService(environmentService.appSettingsPath));
143145
services.set(ILifecycleService, new SyncDescriptor(LifecycleService));
144146
services.set(IStateService, new SyncDescriptor(StateService));
145-
services.set(IConfigurationService, new SyncDescriptor(ConfigurationService, [environmentService.appSettingsPath]));
146147
services.set(IRequestService, new SyncDescriptor(RequestService));
147148
services.set(IDiagnosticsService, new SyncDescriptor(DiagnosticsService));
148149
services.set(IThemeMainService, new SyncDescriptor(ThemeMainService));
149150

150151
return [new InstantiationService(services, true), instanceEnvironment];
151152
}
152153

153-
private initServices(environmentService: IEnvironmentService, stateService: StateService): Promise<unknown> {
154+
private initServices(environmentService: IEnvironmentService, configurationService: ConfigurationService, stateService: StateService): Promise<unknown> {
154155

155156
// Environment service (paths)
156157
const environmentServiceInitialization = Promise.all<void | undefined>([
@@ -162,10 +163,13 @@ class CodeMain {
162163
environmentService.backupHome
163164
].map((path): undefined | Promise<void> => path ? mkdirp(path) : undefined));
164165

166+
// Configuration service
167+
const configurationServiceInitialization = configurationService.initialize();
168+
165169
// State service
166170
const stateServiceInitialization = stateService.init();
167171

168-
return Promise.all([environmentServiceInitialization, stateServiceInitialization]);
172+
return Promise.all([environmentServiceInitialization, configurationServiceInitialization, stateServiceInitialization]);
169173
}
170174

171175
private patchEnvironment(environmentService: IEnvironmentService): typeof process.env {

src/vs/code/node/cliProcessMain.ts

Lines changed: 31 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -275,17 +275,22 @@ export class Main {
275275

276276
const eventPrefix = 'monacoworkbench';
277277

278-
export function main(argv: ParsedArgs): Promise<void> {
278+
export async function main(argv: ParsedArgs): Promise<void> {
279279
const services = new ServiceCollection();
280280

281281
const environmentService = new EnvironmentService(argv, process.execPath);
282282
const logService: ILogService = new SpdLogService('cli', environmentService.logsPath, getLogLevel(environmentService));
283283
process.once('exit', () => logService.dispose());
284-
285284
logService.info('main', argv);
286285

286+
await Promise.all([environmentService.appSettingsHome, environmentService.extensionsPath].map(p => mkdirp(p)));
287+
288+
const configurationService = new ConfigurationService(environmentService.appSettingsPath);
289+
await configurationService.initialize();
290+
287291
services.set(IEnvironmentService, environmentService);
288292
services.set(ILogService, logService);
293+
services.set(IConfigurationService, configurationService);
289294
services.set(IStateService, new SyncDescriptor(StateService));
290295

291296
const instantiationService: IInstantiationService = new InstantiationService(services);
@@ -294,40 +299,37 @@ export function main(argv: ParsedArgs): Promise<void> {
294299
const envService = accessor.get(IEnvironmentService);
295300
const stateService = accessor.get(IStateService);
296301

297-
return Promise.all([envService.appSettingsHome, envService.extensionsPath].map(p => mkdirp(p))).then(() => {
298-
const { appRoot, extensionsPath, extensionDevelopmentLocationURI: extensionDevelopmentLocationURI, isBuilt, installSourcePath } = envService;
302+
const { appRoot, extensionsPath, extensionDevelopmentLocationURI: extensionDevelopmentLocationURI, isBuilt, installSourcePath } = envService;
299303

300-
const services = new ServiceCollection();
301-
services.set(IConfigurationService, new SyncDescriptor(ConfigurationService, [environmentService.appSettingsPath]));
302-
services.set(IRequestService, new SyncDescriptor(RequestService));
303-
services.set(IExtensionManagementService, new SyncDescriptor(ExtensionManagementService));
304-
services.set(IExtensionGalleryService, new SyncDescriptor(ExtensionGalleryService));
304+
const services = new ServiceCollection();
305+
services.set(IRequestService, new SyncDescriptor(RequestService));
306+
services.set(IExtensionManagementService, new SyncDescriptor(ExtensionManagementService));
307+
services.set(IExtensionGalleryService, new SyncDescriptor(ExtensionGalleryService));
305308

306-
const appenders: AppInsightsAppender[] = [];
307-
if (isBuilt && !extensionDevelopmentLocationURI && !envService.args['disable-telemetry'] && product.enableTelemetry) {
309+
const appenders: AppInsightsAppender[] = [];
310+
if (isBuilt && !extensionDevelopmentLocationURI && !envService.args['disable-telemetry'] && product.enableTelemetry) {
308311

309-
if (product.aiConfig && product.aiConfig.asimovKey) {
310-
appenders.push(new AppInsightsAppender(eventPrefix, null, product.aiConfig.asimovKey, logService));
311-
}
312+
if (product.aiConfig && product.aiConfig.asimovKey) {
313+
appenders.push(new AppInsightsAppender(eventPrefix, null, product.aiConfig.asimovKey, logService));
314+
}
312315

313-
const config: ITelemetryServiceConfig = {
314-
appender: combinedAppender(...appenders),
315-
commonProperties: resolveCommonProperties(product.commit, pkg.version, stateService.getItem('telemetry.machineId'), installSourcePath),
316-
piiPaths: [appRoot, extensionsPath]
317-
};
316+
const config: ITelemetryServiceConfig = {
317+
appender: combinedAppender(...appenders),
318+
commonProperties: resolveCommonProperties(product.commit, pkg.version, stateService.getItem('telemetry.machineId'), installSourcePath),
319+
piiPaths: [appRoot, extensionsPath]
320+
};
318321

319-
services.set(ITelemetryService, new SyncDescriptor(TelemetryService, [config]));
320-
} else {
321-
services.set(ITelemetryService, NullTelemetryService);
322-
}
322+
services.set(ITelemetryService, new SyncDescriptor(TelemetryService, [config]));
323+
} else {
324+
services.set(ITelemetryService, NullTelemetryService);
325+
}
323326

324-
const instantiationService2 = instantiationService.createChild(services);
325-
const main = instantiationService2.createInstance(Main);
327+
const instantiationService2 = instantiationService.createChild(services);
328+
const main = instantiationService2.createInstance(Main);
326329

327-
return main.run(argv).then(() => {
328-
// Dispose the AI adapter so that remaining data gets flushed.
329-
return combinedAppender(...appenders).dispose();
330-
});
330+
return main.run(argv).then(() => {
331+
// Dispose the AI adapter so that remaining data gets flushed.
332+
return combinedAppender(...appenders).dispose();
331333
});
332334
});
333335
}

src/vs/platform/configuration/node/configuration.ts

Lines changed: 0 additions & 56 deletions
This file was deleted.

src/vs/platform/configuration/node/configurationService.ts

Lines changed: 38 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,40 +7,49 @@ import { Registry } from 'vs/platform/registry/common/platform';
77
import { IConfigurationRegistry, Extensions } from 'vs/platform/configuration/common/configurationRegistry';
88
import { IDisposable, Disposable } from 'vs/base/common/lifecycle';
99
import { IConfigurationService, IConfigurationChangeEvent, IConfigurationOverrides, ConfigurationTarget, compare, isConfigurationOverrides, IConfigurationData } from 'vs/platform/configuration/common/configuration';
10-
import { DefaultConfigurationModel, Configuration, ConfigurationChangeEvent, ConfigurationModel } from 'vs/platform/configuration/common/configurationModels';
10+
import { DefaultConfigurationModel, Configuration, ConfigurationChangeEvent, ConfigurationModel, ConfigurationModelParser } from 'vs/platform/configuration/common/configurationModels';
1111
import { Event, Emitter } from 'vs/base/common/event';
1212
import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace';
13-
import { NodeBasedUserConfiguration } from 'vs/platform/configuration/node/configuration';
13+
import { ConfigWatcher } from 'vs/base/node/config';
14+
import { onUnexpectedError } from 'vs/base/common/errors';
1415

1516
export class ConfigurationService extends Disposable implements IConfigurationService, IDisposable {
1617

1718
_serviceBrand: any;
1819

19-
private _configuration: Configuration;
20-
private userConfiguration: NodeBasedUserConfiguration;
20+
private configuration: Configuration;
21+
private userConfigModelWatcher: ConfigWatcher<ConfigurationModelParser> | undefined;
2122

2223
private readonly _onDidChangeConfiguration: Emitter<IConfigurationChangeEvent> = this._register(new Emitter<IConfigurationChangeEvent>());
2324
readonly onDidChangeConfiguration: Event<IConfigurationChangeEvent> = this._onDidChangeConfiguration.event;
2425

2526
constructor(
26-
configurationPath: string
27+
private readonly configurationPath: string
2728
) {
2829
super();
29-
30-
this.userConfiguration = this._register(new NodeBasedUserConfiguration(configurationPath));
31-
32-
// Initialize
33-
const defaults = new DefaultConfigurationModel();
34-
const user = this.userConfiguration.initializeSync();
35-
this._configuration = new Configuration(defaults, user);
36-
37-
// Listeners
38-
this._register(this.userConfiguration.onDidChangeConfiguration(userConfigurationModel => this.onDidChangeUserConfiguration(userConfigurationModel)));
30+
this.configuration = new Configuration(new DefaultConfigurationModel(), new ConfigurationModel());
3931
this._register(Registry.as<IConfigurationRegistry>(Extensions.Configuration).onDidUpdateConfiguration(configurationProperties => this.onDidDefaultConfigurationChange(configurationProperties)));
4032
}
4133

42-
get configuration(): Configuration {
43-
return this._configuration;
34+
initialize(): Promise<void> {
35+
if (this.userConfigModelWatcher) {
36+
this.userConfigModelWatcher.dispose();
37+
}
38+
39+
return new Promise<void>((c, e) => {
40+
this.userConfigModelWatcher = this._register(new ConfigWatcher(this.configurationPath, {
41+
changeBufferDelay: 300, onError: error => onUnexpectedError(error), defaultConfig: new ConfigurationModelParser(this.configurationPath), parse: (content: string, parseErrors: any[]) => {
42+
const userConfigModelParser = new ConfigurationModelParser(this.configurationPath);
43+
userConfigModelParser.parseContent(content);
44+
parseErrors = [...userConfigModelParser.errors];
45+
return userConfigModelParser;
46+
}, initCallback: () => {
47+
this.configuration = new Configuration(new DefaultConfigurationModel(), this.userConfigModelWatcher!.getConfig().configurationModel);
48+
this._register(this.userConfigModelWatcher!.onDidUpdateConfiguration(() => this.onDidChangeUserConfiguration(this.userConfigModelWatcher!.getConfig().configurationModel)));
49+
c();
50+
}
51+
}));
52+
});
4453
}
4554

4655
getConfigurationData(): IConfigurationData {
@@ -85,21 +94,26 @@ export class ConfigurationService extends Disposable implements IConfigurationSe
8594
}
8695

8796
reloadConfiguration(folder?: IWorkspaceFolder): Promise<void> {
88-
return folder ? Promise.resolve(undefined) :
89-
this.userConfiguration.reload().then(userConfigurationModel => this.onDidChangeUserConfiguration(userConfigurationModel));
97+
if (this.userConfigModelWatcher) {
98+
return new Promise<void>(c => this.userConfigModelWatcher!.reload(userConfigModelParser => {
99+
this.onDidChangeUserConfiguration(userConfigModelParser.configurationModel);
100+
c();
101+
}));
102+
}
103+
return this.initialize();
90104
}
91105

92106
private onDidChangeUserConfiguration(userConfigurationModel: ConfigurationModel): void {
93-
const { added, updated, removed } = compare(this._configuration.localUserConfiguration, userConfigurationModel);
107+
const { added, updated, removed } = compare(this.configuration.localUserConfiguration, userConfigurationModel);
94108
const changedKeys = [...added, ...updated, ...removed];
95109
if (changedKeys.length) {
96-
this._configuration.updateLocalUserConfiguration(userConfigurationModel);
110+
this.configuration.updateLocalUserConfiguration(userConfigurationModel);
97111
this.trigger(changedKeys, ConfigurationTarget.USER);
98112
}
99113
}
100114

101115
private onDidDefaultConfigurationChange(keys: string[]): void {
102-
this._configuration.updateDefaultConfiguration(new DefaultConfigurationModel());
116+
this.configuration.updateDefaultConfiguration(new DefaultConfigurationModel());
103117
this.trigger(keys, ConfigurationTarget.DEFAULT);
104118
}
105119

@@ -110,9 +124,9 @@ export class ConfigurationService extends Disposable implements IConfigurationSe
110124
private getTargetConfiguration(target: ConfigurationTarget): any {
111125
switch (target) {
112126
case ConfigurationTarget.DEFAULT:
113-
return this._configuration.defaults.contents;
127+
return this.configuration.defaults.contents;
114128
case ConfigurationTarget.USER:
115-
return this._configuration.localUserConfiguration.contents;
129+
return this.configuration.localUserConfiguration.contents;
116130
}
117131
return {};
118132
}

0 commit comments

Comments
 (0)