Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/editor/standalone/browser/standaloneServices.ts
5272 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import './standaloneCodeEditorService.js';
7
import './standaloneLayoutService.js';
8
import '../../../platform/undoRedo/common/undoRedoService.js';
9
import '../../common/services/languageFeatureDebounce.js';
10
import '../../common/services/semanticTokensStylingService.js';
11
import '../../common/services/languageFeaturesService.js';
12
import '../../../platform/hover/browser/hoverService.js';
13
import '../../browser/services/inlineCompletionsService.js';
14
15
import * as strings from '../../../base/common/strings.js';
16
import * as dom from '../../../base/browser/dom.js';
17
import { StandardKeyboardEvent } from '../../../base/browser/keyboardEvent.js';
18
import { Emitter, Event, IValueWithChangeEvent, ValueWithChangeEvent } from '../../../base/common/event.js';
19
import { ResolvedKeybinding, KeyCodeChord, Keybinding, decodeKeybinding } from '../../../base/common/keybindings.js';
20
import { IDisposable, IReference, ImmortalReference, toDisposable, DisposableStore, Disposable, combinedDisposable } from '../../../base/common/lifecycle.js';
21
import { OS, isLinux, isMacintosh } from '../../../base/common/platform.js';
22
import Severity from '../../../base/common/severity.js';
23
import { URI } from '../../../base/common/uri.js';
24
import { IRenameSymbolTrackerService, NullRenameSymbolTrackerService } from '../../browser/services/renameSymbolTrackerService.js';
25
import { IBulkEditOptions, IBulkEditResult, IBulkEditService, ResourceEdit, ResourceTextEdit } from '../../browser/services/bulkEditService.js';
26
import { isDiffEditorConfigurationKey, isEditorConfigurationKey } from '../../common/config/editorConfigurationSchema.js';
27
import { EditOperation, ISingleEditOperation } from '../../common/core/editOperation.js';
28
import { IPosition, Position as Pos } from '../../common/core/position.js';
29
import { Range } from '../../common/core/range.js';
30
import { ITextModel, ITextSnapshot } from '../../common/model.js';
31
import { IModelService } from '../../common/services/model.js';
32
import { IResolvedTextEditorModel, ITextModelContentProvider, ITextModelService } from '../../common/services/resolverService.js';
33
import { ITextResourceConfigurationService, ITextResourcePropertiesService, ITextResourceConfigurationChangeEvent } from '../../common/services/textResourceConfiguration.js';
34
import { CommandsRegistry, ICommandEvent, ICommandHandler, ICommandService } from '../../../platform/commands/common/commands.js';
35
import { IConfigurationChangeEvent, IConfigurationData, IConfigurationOverrides, IConfigurationService, IConfigurationModel, IConfigurationValue, ConfigurationTarget } from '../../../platform/configuration/common/configuration.js';
36
import { Configuration, ConfigurationModel, ConfigurationChangeEvent } from '../../../platform/configuration/common/configurationModels.js';
37
import { IContextKeyService, ContextKeyExpression } from '../../../platform/contextkey/common/contextkey.js';
38
import { IConfirmation, IConfirmationResult, IDialogService, IInputResult, IPrompt, IPromptResult, IPromptWithCustomCancel, IPromptResultWithCancel, IPromptWithDefaultCancel, IPromptBaseButton } from '../../../platform/dialogs/common/dialogs.js';
39
import { createDecorator, IInstantiationService, ServiceIdentifier } from '../../../platform/instantiation/common/instantiation.js';
40
import { AbstractKeybindingService } from '../../../platform/keybinding/common/abstractKeybindingService.js';
41
import { IKeybindingService, IKeyboardEvent, KeybindingsSchemaContribution } from '../../../platform/keybinding/common/keybinding.js';
42
import { KeybindingResolver } from '../../../platform/keybinding/common/keybindingResolver.js';
43
import { IKeybindingItem, KeybindingsRegistry } from '../../../platform/keybinding/common/keybindingsRegistry.js';
44
import { ResolvedKeybindingItem } from '../../../platform/keybinding/common/resolvedKeybindingItem.js';
45
import { USLayoutResolvedKeybinding } from '../../../platform/keybinding/common/usLayoutResolvedKeybinding.js';
46
import { ILabelService, ResourceLabelFormatter, IFormatterChangeEvent, Verbosity } from '../../../platform/label/common/label.js';
47
import { INotification, INotificationHandle, INotificationService, IPromptChoice, IPromptOptions, NoOpNotification, IStatusMessageOptions, INotificationSource, INotificationSourceFilter, NotificationsFilter, IStatusHandle } from '../../../platform/notification/common/notification.js';
48
import { IProgressRunner, IEditorProgressService, IProgressService, IProgress, IProgressCompositeOptions, IProgressDialogOptions, IProgressNotificationOptions, IProgressOptions, IProgressStep, IProgressWindowOptions } from '../../../platform/progress/common/progress.js';
49
import { ITelemetryService, TelemetryLevel } from '../../../platform/telemetry/common/telemetry.js';
50
import { ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier, IWorkspace, IWorkspaceContextService, IWorkspaceFolder, IWorkspaceFoldersChangeEvent, IWorkspaceFoldersWillChangeEvent, WorkbenchState, WorkspaceFolder, STANDALONE_EDITOR_WORKSPACE_ID } from '../../../platform/workspace/common/workspace.js';
51
import { ILayoutService } from '../../../platform/layout/browser/layoutService.js';
52
import { StandaloneServicesNLS } from '../../common/standaloneStrings.js';
53
import { basename } from '../../../base/common/resources.js';
54
import { ICodeEditorService } from '../../browser/services/codeEditorService.js';
55
import { ConsoleLogger, ILoggerService, ILogService, NullLoggerService } from '../../../platform/log/common/log.js';
56
import { IWorkspaceTrustManagementService, IWorkspaceTrustTransitionParticipant, IWorkspaceTrustUriInfo } from '../../../platform/workspace/common/workspaceTrust.js';
57
import { EditorOption } from '../../common/config/editorOptions.js';
58
import { ICodeEditor, IDiffEditor } from '../../browser/editorBrowser.js';
59
import { IContextMenuService, IContextViewDelegate, IContextViewService, IOpenContextView } from '../../../platform/contextview/browser/contextView.js';
60
import { ContextViewService } from '../../../platform/contextview/browser/contextViewService.js';
61
import { LanguageService } from '../../common/services/languageService.js';
62
import { ContextMenuService } from '../../../platform/contextview/browser/contextMenuService.js';
63
import { getSingletonServiceDescriptors, InstantiationType, registerSingleton } from '../../../platform/instantiation/common/extensions.js';
64
import { OpenerService } from '../../browser/services/openerService.js';
65
import { ILanguageService } from '../../common/languages/language.js';
66
import { MarkerDecorationsService } from '../../common/services/markerDecorationsService.js';
67
import { IMarkerDecorationsService } from '../../common/services/markerDecorations.js';
68
import { ModelService } from '../../common/services/modelService.js';
69
import { StandaloneQuickInputService } from './quickInput/standaloneQuickInputService.js';
70
import { StandaloneThemeService } from './standaloneThemeService.js';
71
import { IStandaloneThemeService } from '../common/standaloneTheme.js';
72
import { AccessibilityService } from '../../../platform/accessibility/browser/accessibilityService.js';
73
import { IAccessibilityService } from '../../../platform/accessibility/common/accessibility.js';
74
import { IMenuService } from '../../../platform/actions/common/actions.js';
75
import { MenuService } from '../../../platform/actions/common/menuService.js';
76
import { BrowserClipboardService } from '../../../platform/clipboard/browser/clipboardService.js';
77
import { IClipboardService } from '../../../platform/clipboard/common/clipboardService.js';
78
import { ContextKeyService } from '../../../platform/contextkey/browser/contextKeyService.js';
79
import { SyncDescriptor } from '../../../platform/instantiation/common/descriptors.js';
80
import { InstantiationService } from '../../../platform/instantiation/common/instantiationService.js';
81
import { ServiceCollection } from '../../../platform/instantiation/common/serviceCollection.js';
82
import { IListService, ListService } from '../../../platform/list/browser/listService.js';
83
import { IMarkerService } from '../../../platform/markers/common/markers.js';
84
import { MarkerService } from '../../../platform/markers/common/markerService.js';
85
import { IOpenerService } from '../../../platform/opener/common/opener.js';
86
import { IQuickInputService } from '../../../platform/quickinput/common/quickInput.js';
87
import { IStorageService, InMemoryStorageService } from '../../../platform/storage/common/storage.js';
88
import { DefaultConfiguration } from '../../../platform/configuration/common/configurations.js';
89
import { WorkspaceEdit } from '../../common/languages.js';
90
import { AccessibilitySignal, AccessibilityModality, IAccessibilitySignalService, Sound } from '../../../platform/accessibilitySignal/browser/accessibilitySignalService.js';
91
import { LogService } from '../../../platform/log/common/logService.js';
92
import { getEditorFeatures } from '../../common/editorFeatures.js';
93
import { onUnexpectedError } from '../../../base/common/errors.js';
94
import { ExtensionKind, IEnvironmentService, IExtensionHostDebugParams } from '../../../platform/environment/common/environment.js';
95
import { mainWindow } from '../../../base/browser/window.js';
96
import { ResourceMap } from '../../../base/common/map.js';
97
import { ITreeSitterLibraryService } from '../../common/services/treeSitter/treeSitterLibraryService.js';
98
import { StandaloneTreeSitterLibraryService } from './standaloneTreeSitterLibraryService.js';
99
import { IDataChannelService, NullDataChannelService } from '../../../platform/dataChannel/common/dataChannel.js';
100
import { IWebWorkerService } from '../../../platform/webWorker/browser/webWorkerService.js';
101
import { StandaloneWebWorkerService } from './services/standaloneWebWorkerService.js';
102
import { IDefaultAccountService } from '../../../platform/defaultAccount/common/defaultAccount.js';
103
import { IDefaultAccount, IDefaultAccountAuthenticationProvider, IPolicyData } from '../../../base/common/defaultAccount.js';
104
import { IUserInteractionService } from '../../../platform/userInteraction/browser/userInteractionService.js';
105
import { UserInteractionService } from '../../../platform/userInteraction/browser/userInteractionServiceImpl.js';
106
107
class SimpleModel implements IResolvedTextEditorModel {
108
109
private readonly model: ITextModel;
110
private readonly _onWillDispose: Emitter<void>;
111
112
constructor(model: ITextModel) {
113
this.model = model;
114
this._onWillDispose = new Emitter<void>();
115
}
116
117
public get onWillDispose(): Event<void> {
118
return this._onWillDispose.event;
119
}
120
121
public resolve(): Promise<void> {
122
return Promise.resolve();
123
}
124
125
public get textEditorModel(): ITextModel {
126
return this.model;
127
}
128
129
public createSnapshot(): ITextSnapshot {
130
return this.model.createSnapshot();
131
}
132
133
public isReadonly(): boolean {
134
return false;
135
}
136
137
private disposed = false;
138
public dispose(): void {
139
this.disposed = true;
140
141
this._onWillDispose.fire();
142
}
143
144
public isDisposed(): boolean {
145
return this.disposed;
146
}
147
148
public isResolved(): boolean {
149
return true;
150
}
151
152
public getLanguageId(): string | undefined {
153
return this.model.getLanguageId();
154
}
155
}
156
157
class StandaloneTextModelService implements ITextModelService {
158
public _serviceBrand: undefined;
159
160
constructor(
161
@IModelService private readonly modelService: IModelService
162
) { }
163
164
public createModelReference(resource: URI): Promise<IReference<IResolvedTextEditorModel>> {
165
const model = this.modelService.getModel(resource);
166
167
if (!model) {
168
return Promise.reject(new Error(`Model not found`));
169
}
170
171
return Promise.resolve(new ImmortalReference(new SimpleModel(model)));
172
}
173
174
public registerTextModelContentProvider(scheme: string, provider: ITextModelContentProvider): IDisposable {
175
return {
176
dispose: function () { /* no op */ }
177
};
178
}
179
180
public canHandleResource(resource: URI): boolean {
181
return false;
182
}
183
}
184
185
class StandaloneEditorProgressService implements IEditorProgressService {
186
declare readonly _serviceBrand: undefined;
187
188
private static NULL_PROGRESS_RUNNER: IProgressRunner = {
189
done: () => { },
190
total: () => { },
191
worked: () => { }
192
};
193
194
show(infinite: true, delay?: number): IProgressRunner;
195
show(total: number, delay?: number): IProgressRunner;
196
show(): IProgressRunner {
197
return StandaloneEditorProgressService.NULL_PROGRESS_RUNNER;
198
}
199
200
async showWhile(promise: Promise<unknown>, delay?: number): Promise<void> {
201
await promise;
202
}
203
}
204
205
class StandaloneProgressService implements IProgressService {
206
207
declare readonly _serviceBrand: undefined;
208
209
withProgress<R>(_options: IProgressOptions | IProgressDialogOptions | IProgressNotificationOptions | IProgressWindowOptions | IProgressCompositeOptions, task: (progress: IProgress<IProgressStep>) => Promise<R>, onDidCancel?: ((choice?: number | undefined) => void) | undefined): Promise<R> {
210
return task({
211
report: () => { },
212
});
213
}
214
}
215
216
class StandaloneEnvironmentService implements IEnvironmentService {
217
218
declare readonly _serviceBrand: undefined;
219
220
readonly stateResource: URI = URI.from({ scheme: 'monaco', authority: 'stateResource' });
221
readonly userRoamingDataHome: URI = URI.from({ scheme: 'monaco', authority: 'userRoamingDataHome' });
222
readonly keyboardLayoutResource: URI = URI.from({ scheme: 'monaco', authority: 'keyboardLayoutResource' });
223
readonly argvResource: URI = URI.from({ scheme: 'monaco', authority: 'argvResource' });
224
readonly untitledWorkspacesHome: URI = URI.from({ scheme: 'monaco', authority: 'untitledWorkspacesHome' });
225
readonly builtinWorkbenchModesHome: URI = URI.from({ scheme: 'monaco', authority: 'builtinWorkbenchModesHome' });
226
readonly workspaceStorageHome: URI = URI.from({ scheme: 'monaco', authority: 'workspaceStorageHome' });
227
readonly localHistoryHome: URI = URI.from({ scheme: 'monaco', authority: 'localHistoryHome' });
228
readonly cacheHome: URI = URI.from({ scheme: 'monaco', authority: 'cacheHome' });
229
readonly userDataSyncHome: URI = URI.from({ scheme: 'monaco', authority: 'userDataSyncHome' });
230
readonly sync: 'on' | 'off' | undefined = undefined;
231
readonly continueOn?: string | undefined = undefined;
232
readonly editSessionId?: string | undefined = undefined;
233
readonly debugExtensionHost: IExtensionHostDebugParams = { port: null, break: false };
234
readonly isExtensionDevelopment: boolean = false;
235
readonly disableExtensions: boolean | string[] = false;
236
readonly disableExperiments: boolean = false;
237
readonly enableExtensions?: readonly string[] | undefined = undefined;
238
readonly extensionDevelopmentLocationURI?: URI[] | undefined = undefined;
239
readonly extensionDevelopmentKind?: ExtensionKind[] | undefined = undefined;
240
readonly extensionTestsLocationURI?: URI | undefined = undefined;
241
readonly logsHome: URI = URI.from({ scheme: 'monaco', authority: 'logsHome' });
242
readonly logLevel?: string | undefined = undefined;
243
readonly extensionLogLevel?: [string, string][] | undefined = undefined;
244
readonly verbose: boolean = false;
245
readonly isBuilt: boolean = false;
246
readonly disableTelemetry: boolean = false;
247
readonly serviceMachineIdResource: URI = URI.from({ scheme: 'monaco', authority: 'serviceMachineIdResource' });
248
readonly policyFile?: URI | undefined = undefined;
249
}
250
251
class StandaloneDialogService implements IDialogService {
252
253
_serviceBrand: undefined;
254
255
readonly onWillShowDialog = Event.None;
256
readonly onDidShowDialog = Event.None;
257
258
async confirm(confirmation: IConfirmation): Promise<IConfirmationResult> {
259
const confirmed = this.doConfirm(confirmation.message, confirmation.detail);
260
261
return {
262
confirmed,
263
checkboxChecked: false // unsupported
264
};
265
}
266
267
private doConfirm(message: string, detail?: string): boolean {
268
let messageText = message;
269
if (detail) {
270
messageText = messageText + '\n\n' + detail;
271
}
272
273
return mainWindow.confirm(messageText);
274
}
275
276
prompt<T>(prompt: IPromptWithCustomCancel<T>): Promise<IPromptResultWithCancel<T>>;
277
prompt<T>(prompt: IPrompt<T>): Promise<IPromptResult<T>>;
278
prompt<T>(prompt: IPromptWithDefaultCancel<T>): Promise<IPromptResult<T>>;
279
async prompt<T>(prompt: IPrompt<T> | IPromptWithCustomCancel<T>): Promise<IPromptResult<T> | IPromptResultWithCancel<T>> {
280
let result: T | undefined = undefined;
281
const confirmed = this.doConfirm(prompt.message, prompt.detail);
282
if (confirmed) {
283
const promptButtons: IPromptBaseButton<T>[] = [...(prompt.buttons ?? [])];
284
if (prompt.cancelButton && typeof prompt.cancelButton !== 'string' && typeof prompt.cancelButton !== 'boolean') {
285
promptButtons.push(prompt.cancelButton);
286
}
287
288
result = await promptButtons[0]?.run({ checkboxChecked: false });
289
}
290
291
return { result };
292
}
293
294
async info(message: string, detail?: string): Promise<void> {
295
await this.prompt({ type: Severity.Info, message, detail });
296
}
297
298
async warn(message: string, detail?: string): Promise<void> {
299
await this.prompt({ type: Severity.Warning, message, detail });
300
}
301
302
async error(message: string, detail?: string): Promise<void> {
303
await this.prompt({ type: Severity.Error, message, detail });
304
}
305
306
input(): Promise<IInputResult> {
307
return Promise.resolve({ confirmed: false }); // unsupported
308
}
309
310
about(): Promise<void> {
311
return Promise.resolve(undefined);
312
}
313
}
314
315
export class StandaloneNotificationService implements INotificationService {
316
317
readonly onDidChangeFilter: Event<void> = Event.None;
318
319
public _serviceBrand: undefined;
320
321
private static readonly NO_OP: INotificationHandle = new NoOpNotification();
322
323
public info(message: string): INotificationHandle {
324
return this.notify({ severity: Severity.Info, message });
325
}
326
327
public warn(message: string): INotificationHandle {
328
return this.notify({ severity: Severity.Warning, message });
329
}
330
331
public error(error: string | Error): INotificationHandle {
332
return this.notify({ severity: Severity.Error, message: error });
333
}
334
335
public notify(notification: INotification): INotificationHandle {
336
switch (notification.severity) {
337
case Severity.Error:
338
console.error(notification.message);
339
break;
340
case Severity.Warning:
341
console.warn(notification.message);
342
break;
343
default:
344
console.log(notification.message);
345
break;
346
}
347
348
return StandaloneNotificationService.NO_OP;
349
}
350
351
public prompt(severity: Severity, message: string, choices: IPromptChoice[], options?: IPromptOptions): INotificationHandle {
352
return StandaloneNotificationService.NO_OP;
353
}
354
355
public status(message: string | Error, options?: IStatusMessageOptions): IStatusHandle {
356
return { close: () => { } };
357
}
358
359
public setFilter(filter: NotificationsFilter | INotificationSourceFilter): void { }
360
361
public getFilter(source?: INotificationSource): NotificationsFilter {
362
return NotificationsFilter.OFF;
363
}
364
365
public getFilters(): INotificationSourceFilter[] {
366
return [];
367
}
368
369
public removeFilter(sourceId: string): void { }
370
}
371
372
export class StandaloneCommandService implements ICommandService {
373
declare readonly _serviceBrand: undefined;
374
375
private readonly _instantiationService: IInstantiationService;
376
377
private readonly _onWillExecuteCommand = new Emitter<ICommandEvent>();
378
private readonly _onDidExecuteCommand = new Emitter<ICommandEvent>();
379
public readonly onWillExecuteCommand: Event<ICommandEvent> = this._onWillExecuteCommand.event;
380
public readonly onDidExecuteCommand: Event<ICommandEvent> = this._onDidExecuteCommand.event;
381
382
constructor(
383
@IInstantiationService instantiationService: IInstantiationService
384
) {
385
this._instantiationService = instantiationService;
386
}
387
388
public executeCommand<T>(id: string, ...args: unknown[]): Promise<T> {
389
const command = CommandsRegistry.getCommand(id);
390
if (!command) {
391
return Promise.reject(new Error(`command '${id}' not found`));
392
}
393
394
try {
395
this._onWillExecuteCommand.fire({ commandId: id, args });
396
const result = this._instantiationService.invokeFunction.apply(this._instantiationService, [command.handler, ...args]) as T;
397
398
this._onDidExecuteCommand.fire({ commandId: id, args });
399
return Promise.resolve(result);
400
} catch (err) {
401
return Promise.reject(err);
402
}
403
}
404
}
405
406
export interface IKeybindingRule {
407
keybinding: number;
408
command?: string | null;
409
commandArgs?: unknown;
410
when?: ContextKeyExpression | null;
411
}
412
413
export class StandaloneKeybindingService extends AbstractKeybindingService {
414
private _cachedResolver: KeybindingResolver | null;
415
private _dynamicKeybindings: IKeybindingItem[];
416
private readonly _domNodeListeners: DomNodeListeners[];
417
418
constructor(
419
@IContextKeyService contextKeyService: IContextKeyService,
420
@ICommandService commandService: ICommandService,
421
@ITelemetryService telemetryService: ITelemetryService,
422
@INotificationService notificationService: INotificationService,
423
@ILogService logService: ILogService,
424
@ICodeEditorService codeEditorService: ICodeEditorService
425
) {
426
super(contextKeyService, commandService, telemetryService, notificationService, logService);
427
428
this._cachedResolver = null;
429
this._dynamicKeybindings = [];
430
this._domNodeListeners = [];
431
432
const addContainer = (domNode: HTMLElement) => {
433
const disposables = new DisposableStore();
434
435
// for standard keybindings
436
disposables.add(dom.addDisposableListener(domNode, dom.EventType.KEY_DOWN, (e: KeyboardEvent) => {
437
const keyEvent = new StandardKeyboardEvent(e);
438
const shouldPreventDefault = this._dispatch(keyEvent, keyEvent.target);
439
if (shouldPreventDefault) {
440
keyEvent.preventDefault();
441
keyEvent.stopPropagation();
442
}
443
}));
444
445
// for single modifier chord keybindings (e.g. shift shift)
446
disposables.add(dom.addDisposableListener(domNode, dom.EventType.KEY_UP, (e: KeyboardEvent) => {
447
const keyEvent = new StandardKeyboardEvent(e);
448
const shouldPreventDefault = this._singleModifierDispatch(keyEvent, keyEvent.target);
449
if (shouldPreventDefault) {
450
keyEvent.preventDefault();
451
}
452
}));
453
454
this._domNodeListeners.push(new DomNodeListeners(domNode, disposables));
455
};
456
const removeContainer = (domNode: HTMLElement) => {
457
for (let i = 0; i < this._domNodeListeners.length; i++) {
458
const domNodeListeners = this._domNodeListeners[i];
459
if (domNodeListeners.domNode === domNode) {
460
this._domNodeListeners.splice(i, 1);
461
domNodeListeners.dispose();
462
}
463
}
464
};
465
466
const addCodeEditor = (codeEditor: ICodeEditor) => {
467
if (codeEditor.getOption(EditorOption.inDiffEditor)) {
468
return;
469
}
470
addContainer(codeEditor.getContainerDomNode());
471
};
472
const removeCodeEditor = (codeEditor: ICodeEditor) => {
473
if (codeEditor.getOption(EditorOption.inDiffEditor)) {
474
return;
475
}
476
removeContainer(codeEditor.getContainerDomNode());
477
};
478
this._register(codeEditorService.onCodeEditorAdd(addCodeEditor));
479
this._register(codeEditorService.onCodeEditorRemove(removeCodeEditor));
480
codeEditorService.listCodeEditors().forEach(addCodeEditor);
481
482
const addDiffEditor = (diffEditor: IDiffEditor) => {
483
addContainer(diffEditor.getContainerDomNode());
484
};
485
const removeDiffEditor = (diffEditor: IDiffEditor) => {
486
removeContainer(diffEditor.getContainerDomNode());
487
};
488
this._register(codeEditorService.onDiffEditorAdd(addDiffEditor));
489
this._register(codeEditorService.onDiffEditorRemove(removeDiffEditor));
490
codeEditorService.listDiffEditors().forEach(addDiffEditor);
491
}
492
493
public addDynamicKeybinding(command: string, keybinding: number, handler: ICommandHandler, when: ContextKeyExpression | undefined): IDisposable {
494
return combinedDisposable(
495
CommandsRegistry.registerCommand(command, handler),
496
this.addDynamicKeybindings([{
497
keybinding,
498
command,
499
when
500
}])
501
);
502
}
503
504
public addDynamicKeybindings(rules: IKeybindingRule[]): IDisposable {
505
const entries: IKeybindingItem[] = rules.map((rule) => {
506
const keybinding = decodeKeybinding(rule.keybinding, OS);
507
return {
508
keybinding,
509
command: rule.command ?? null,
510
commandArgs: rule.commandArgs,
511
when: rule.when,
512
weight1: 1000,
513
weight2: 0,
514
extensionId: null,
515
isBuiltinExtension: false
516
};
517
});
518
this._dynamicKeybindings = this._dynamicKeybindings.concat(entries);
519
520
this.updateResolver();
521
522
return toDisposable(() => {
523
// Search the first entry and remove them all since they will be contiguous
524
for (let i = 0; i < this._dynamicKeybindings.length; i++) {
525
if (this._dynamicKeybindings[i] === entries[0]) {
526
this._dynamicKeybindings.splice(i, entries.length);
527
this.updateResolver();
528
return;
529
}
530
}
531
});
532
}
533
534
private updateResolver(): void {
535
this._cachedResolver = null;
536
this._onDidUpdateKeybindings.fire();
537
}
538
539
protected _getResolver(): KeybindingResolver {
540
if (!this._cachedResolver) {
541
const defaults = this._toNormalizedKeybindingItems(KeybindingsRegistry.getDefaultKeybindings(), true);
542
const overrides = this._toNormalizedKeybindingItems(this._dynamicKeybindings, false);
543
this._cachedResolver = new KeybindingResolver(defaults, overrides, (str) => this._log(str));
544
}
545
return this._cachedResolver;
546
}
547
548
protected _documentHasFocus(): boolean {
549
return mainWindow.document.hasFocus();
550
}
551
552
private _toNormalizedKeybindingItems(items: IKeybindingItem[], isDefault: boolean): ResolvedKeybindingItem[] {
553
const result: ResolvedKeybindingItem[] = [];
554
let resultLen = 0;
555
for (const item of items) {
556
const when = item.when || undefined;
557
const keybinding = item.keybinding;
558
559
if (!keybinding) {
560
// This might be a removal keybinding item in user settings => accept it
561
result[resultLen++] = new ResolvedKeybindingItem(undefined, item.command, item.commandArgs, when, isDefault, null, false);
562
} else {
563
const resolvedKeybindings = USLayoutResolvedKeybinding.resolveKeybinding(keybinding, OS);
564
for (const resolvedKeybinding of resolvedKeybindings) {
565
result[resultLen++] = new ResolvedKeybindingItem(resolvedKeybinding, item.command, item.commandArgs, when, isDefault, null, false);
566
}
567
}
568
}
569
570
return result;
571
}
572
573
public resolveKeybinding(keybinding: Keybinding): ResolvedKeybinding[] {
574
return USLayoutResolvedKeybinding.resolveKeybinding(keybinding, OS);
575
}
576
577
public resolveKeyboardEvent(keyboardEvent: IKeyboardEvent): ResolvedKeybinding {
578
const chord = new KeyCodeChord(
579
keyboardEvent.ctrlKey,
580
keyboardEvent.shiftKey,
581
keyboardEvent.altKey,
582
keyboardEvent.metaKey,
583
keyboardEvent.keyCode
584
);
585
return new USLayoutResolvedKeybinding([chord], OS);
586
}
587
588
public resolveUserBinding(userBinding: string): ResolvedKeybinding[] {
589
return [];
590
}
591
592
public _dumpDebugInfo(): string {
593
return '';
594
}
595
596
public _dumpDebugInfoJSON(): string {
597
return '';
598
}
599
600
public registerSchemaContribution(contribution: KeybindingsSchemaContribution): IDisposable {
601
return Disposable.None;
602
}
603
604
/**
605
* not yet supported
606
*/
607
public override enableKeybindingHoldMode(commandId: string): Promise<void> | undefined {
608
return undefined;
609
}
610
}
611
612
class DomNodeListeners extends Disposable {
613
constructor(
614
public readonly domNode: HTMLElement,
615
disposables: DisposableStore
616
) {
617
super();
618
this._register(disposables);
619
}
620
}
621
622
function isConfigurationOverrides(thing: unknown): thing is IConfigurationOverrides {
623
return !!thing
624
&& typeof thing === 'object'
625
&& (!(thing as IConfigurationOverrides).overrideIdentifier || typeof (thing as IConfigurationOverrides).overrideIdentifier === 'string')
626
&& (!(thing as IConfigurationOverrides).resource || (thing as IConfigurationOverrides).resource instanceof URI);
627
}
628
629
export class StandaloneConfigurationService implements IConfigurationService {
630
631
declare readonly _serviceBrand: undefined;
632
633
private readonly _onDidChangeConfiguration = new Emitter<IConfigurationChangeEvent>();
634
public readonly onDidChangeConfiguration: Event<IConfigurationChangeEvent> = this._onDidChangeConfiguration.event;
635
636
private readonly _configuration: Configuration;
637
638
constructor(
639
@ILogService private readonly logService: ILogService,
640
) {
641
const defaultConfiguration = new DefaultConfiguration(logService);
642
this._configuration = new Configuration(
643
defaultConfiguration.reload(),
644
ConfigurationModel.createEmptyModel(logService),
645
ConfigurationModel.createEmptyModel(logService),
646
ConfigurationModel.createEmptyModel(logService),
647
ConfigurationModel.createEmptyModel(logService),
648
ConfigurationModel.createEmptyModel(logService),
649
new ResourceMap<ConfigurationModel>(),
650
ConfigurationModel.createEmptyModel(logService),
651
new ResourceMap<ConfigurationModel>(),
652
logService
653
);
654
defaultConfiguration.dispose();
655
}
656
657
getValue<T>(): T;
658
getValue<T>(section: string): T;
659
getValue<T>(overrides: IConfigurationOverrides): T;
660
getValue<T>(section: string, overrides: IConfigurationOverrides): T;
661
getValue(arg1?: unknown, arg2?: unknown): unknown {
662
const section = typeof arg1 === 'string' ? arg1 : undefined;
663
const overrides = isConfigurationOverrides(arg1) ? arg1 : isConfigurationOverrides(arg2) ? arg2 : {};
664
return this._configuration.getValue(section, overrides, undefined);
665
}
666
667
public updateValues(values: [string, unknown][]): Promise<void> {
668
const previous = { data: this._configuration.toData() };
669
670
const changedKeys: string[] = [];
671
672
for (const entry of values) {
673
const [key, value] = entry;
674
if (this.getValue(key) === value) {
675
continue;
676
}
677
this._configuration.updateValue(key, value);
678
changedKeys.push(key);
679
}
680
681
if (changedKeys.length > 0) {
682
const configurationChangeEvent = new ConfigurationChangeEvent({ keys: changedKeys, overrides: [] }, previous, this._configuration, undefined, this.logService);
683
configurationChangeEvent.source = ConfigurationTarget.MEMORY;
684
this._onDidChangeConfiguration.fire(configurationChangeEvent);
685
}
686
687
return Promise.resolve();
688
}
689
690
public updateValue(key: string, value: unknown, arg3?: unknown, arg4?: unknown): Promise<void> {
691
return this.updateValues([[key, value]]);
692
}
693
694
public inspect<C>(key: string, options: IConfigurationOverrides = {}): IConfigurationValue<C> {
695
return this._configuration.inspect<C>(key, options, undefined);
696
}
697
698
public keys() {
699
return this._configuration.keys(undefined);
700
}
701
702
public reloadConfiguration(): Promise<void> {
703
return Promise.resolve(undefined);
704
}
705
706
public getConfigurationData(): IConfigurationData | null {
707
const emptyModel: IConfigurationModel = {
708
contents: {},
709
keys: [],
710
overrides: []
711
};
712
return {
713
defaults: emptyModel,
714
policy: emptyModel,
715
application: emptyModel,
716
userLocal: emptyModel,
717
userRemote: emptyModel,
718
workspace: emptyModel,
719
folders: []
720
};
721
}
722
}
723
724
class StandaloneResourceConfigurationService extends Disposable implements ITextResourceConfigurationService {
725
726
declare readonly _serviceBrand: undefined;
727
728
private readonly _onDidChangeConfiguration = this._register(new Emitter<ITextResourceConfigurationChangeEvent>());
729
public readonly onDidChangeConfiguration = this._onDidChangeConfiguration.event;
730
731
constructor(
732
@IConfigurationService private readonly configurationService: StandaloneConfigurationService,
733
@IModelService private readonly modelService: IModelService,
734
@ILanguageService private readonly languageService: ILanguageService
735
) {
736
super();
737
this._register(this.configurationService.onDidChangeConfiguration((e) => {
738
this._onDidChangeConfiguration.fire({ affectedKeys: e.affectedKeys, affectsConfiguration: (resource: URI, configuration: string) => e.affectsConfiguration(configuration) });
739
}));
740
}
741
742
getValue<T>(resource: URI, section?: string): T;
743
getValue<T>(resource: URI, position?: IPosition, section?: string): T;
744
getValue<T>(resource: URI | undefined, arg2?: unknown, arg3?: unknown) {
745
const position: IPosition | null = Pos.isIPosition(arg2) ? arg2 : null;
746
const section: string | undefined = position ? (typeof arg3 === 'string' ? arg3 : undefined) : (typeof arg2 === 'string' ? arg2 : undefined);
747
const language = resource ? this.getLanguage(resource, position) : undefined;
748
if (typeof section === 'undefined') {
749
return this.configurationService.getValue<T>({
750
resource,
751
overrideIdentifier: language
752
});
753
}
754
return this.configurationService.getValue<T>(section, {
755
resource,
756
overrideIdentifier: language
757
});
758
}
759
760
inspect<T>(resource: URI | undefined, position: IPosition | null, section: string): IConfigurationValue<Readonly<T>> {
761
const language = resource ? this.getLanguage(resource, position) : undefined;
762
return this.configurationService.inspect<T>(section, { resource, overrideIdentifier: language });
763
}
764
765
private getLanguage(resource: URI, position: IPosition | null): string | null {
766
const model = this.modelService.getModel(resource);
767
if (model) {
768
return position ? model.getLanguageIdAtPosition(position.lineNumber, position.column) : model.getLanguageId();
769
}
770
return this.languageService.guessLanguageIdByFilepathOrFirstLine(resource);
771
}
772
773
updateValue(resource: URI, key: string, value: unknown, configurationTarget?: ConfigurationTarget): Promise<void> {
774
return this.configurationService.updateValue(key, value, { resource }, configurationTarget);
775
}
776
}
777
778
class StandaloneResourcePropertiesService implements ITextResourcePropertiesService {
779
780
declare readonly _serviceBrand: undefined;
781
782
constructor(
783
@IConfigurationService private readonly configurationService: IConfigurationService,
784
) {
785
}
786
787
getEOL(resource: URI, language?: string): string {
788
const eol = this.configurationService.getValue('files.eol', { overrideIdentifier: language, resource });
789
if (eol && typeof eol === 'string' && eol !== 'auto') {
790
return eol;
791
}
792
return (isLinux || isMacintosh) ? '\n' : '\r\n';
793
}
794
}
795
796
class StandaloneTelemetryService implements ITelemetryService {
797
declare readonly _serviceBrand: undefined;
798
readonly telemetryLevel = TelemetryLevel.NONE;
799
readonly sessionId = 'someValue.sessionId';
800
readonly machineId = 'someValue.machineId';
801
readonly sqmId = 'someValue.sqmId';
802
readonly devDeviceId = 'someValue.devDeviceId';
803
readonly firstSessionDate = 'someValue.firstSessionDate';
804
readonly sendErrorTelemetry = false;
805
setEnabled(): void { }
806
setExperimentProperty(): void { }
807
publicLog() { }
808
publicLog2() { }
809
publicLogError() { }
810
publicLogError2() { }
811
}
812
813
class StandaloneWorkspaceContextService implements IWorkspaceContextService {
814
815
public _serviceBrand: undefined;
816
817
private static readonly SCHEME = 'inmemory';
818
819
private readonly _onDidChangeWorkspaceName = new Emitter<void>();
820
public readonly onDidChangeWorkspaceName: Event<void> = this._onDidChangeWorkspaceName.event;
821
822
private readonly _onWillChangeWorkspaceFolders = new Emitter<IWorkspaceFoldersWillChangeEvent>();
823
public readonly onWillChangeWorkspaceFolders: Event<IWorkspaceFoldersWillChangeEvent> = this._onWillChangeWorkspaceFolders.event;
824
825
private readonly _onDidChangeWorkspaceFolders = new Emitter<IWorkspaceFoldersChangeEvent>();
826
public readonly onDidChangeWorkspaceFolders: Event<IWorkspaceFoldersChangeEvent> = this._onDidChangeWorkspaceFolders.event;
827
828
private readonly _onDidChangeWorkbenchState = new Emitter<WorkbenchState>();
829
public readonly onDidChangeWorkbenchState: Event<WorkbenchState> = this._onDidChangeWorkbenchState.event;
830
831
private readonly workspace: IWorkspace;
832
833
constructor() {
834
const resource = URI.from({ scheme: StandaloneWorkspaceContextService.SCHEME, authority: 'model', path: '/' });
835
this.workspace = { id: STANDALONE_EDITOR_WORKSPACE_ID, folders: [new WorkspaceFolder({ uri: resource, name: '', index: 0 })] };
836
}
837
838
getCompleteWorkspace(): Promise<IWorkspace> {
839
return Promise.resolve(this.getWorkspace());
840
}
841
842
public getWorkspace(): IWorkspace {
843
return this.workspace;
844
}
845
846
public getWorkbenchState(): WorkbenchState {
847
if (this.workspace) {
848
if (this.workspace.configuration) {
849
return WorkbenchState.WORKSPACE;
850
}
851
return WorkbenchState.FOLDER;
852
}
853
return WorkbenchState.EMPTY;
854
}
855
856
public getWorkspaceFolder(resource: URI): IWorkspaceFolder | null {
857
return resource && resource.scheme === StandaloneWorkspaceContextService.SCHEME ? this.workspace.folders[0] : null;
858
}
859
860
public isInsideWorkspace(resource: URI): boolean {
861
return resource && resource.scheme === StandaloneWorkspaceContextService.SCHEME;
862
}
863
864
public isCurrentWorkspace(workspaceIdOrFolder: IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier | URI): boolean {
865
return true;
866
}
867
}
868
869
export function updateConfigurationService(configurationService: IConfigurationService, source: any, isDiffEditor: boolean): void {
870
if (!source) {
871
return;
872
}
873
if (!(configurationService instanceof StandaloneConfigurationService)) {
874
return;
875
}
876
const toUpdate: [string, unknown][] = [];
877
Object.keys(source).forEach((key) => {
878
if (isEditorConfigurationKey(key)) {
879
toUpdate.push([`editor.${key}`, source[key]]);
880
}
881
if (isDiffEditor && isDiffEditorConfigurationKey(key)) {
882
toUpdate.push([`diffEditor.${key}`, source[key]]);
883
}
884
});
885
if (toUpdate.length > 0) {
886
configurationService.updateValues(toUpdate);
887
}
888
}
889
890
class StandaloneBulkEditService implements IBulkEditService {
891
declare readonly _serviceBrand: undefined;
892
893
constructor(
894
@IModelService private readonly _modelService: IModelService
895
) {
896
//
897
}
898
899
hasPreviewHandler(): false {
900
return false;
901
}
902
903
setPreviewHandler(): IDisposable {
904
return Disposable.None;
905
}
906
907
async apply(editsIn: ResourceEdit[] | WorkspaceEdit, _options?: IBulkEditOptions): Promise<IBulkEditResult> {
908
const edits = Array.isArray(editsIn) ? editsIn : ResourceEdit.convert(editsIn);
909
const textEdits = new Map<ITextModel, ISingleEditOperation[]>();
910
911
for (const edit of edits) {
912
if (!(edit instanceof ResourceTextEdit)) {
913
throw new Error('bad edit - only text edits are supported');
914
}
915
const model = this._modelService.getModel(edit.resource);
916
if (!model) {
917
throw new Error('bad edit - model not found');
918
}
919
if (typeof edit.versionId === 'number' && model.getVersionId() !== edit.versionId) {
920
throw new Error('bad state - model changed in the meantime');
921
}
922
let array = textEdits.get(model);
923
if (!array) {
924
array = [];
925
textEdits.set(model, array);
926
}
927
array.push(EditOperation.replaceMove(Range.lift(edit.textEdit.range), edit.textEdit.text));
928
}
929
930
931
let totalEdits = 0;
932
let totalFiles = 0;
933
for (const [model, edits] of textEdits) {
934
model.pushStackElement();
935
model.pushEditOperations([], edits, () => []);
936
model.pushStackElement();
937
totalFiles += 1;
938
totalEdits += edits.length;
939
}
940
941
return {
942
ariaSummary: strings.format(StandaloneServicesNLS.bulkEditServiceSummary, totalEdits, totalFiles),
943
isApplied: totalEdits > 0
944
};
945
}
946
}
947
948
class StandaloneUriLabelService implements ILabelService {
949
950
declare readonly _serviceBrand: undefined;
951
952
public readonly onDidChangeFormatters: Event<IFormatterChangeEvent> = Event.None;
953
954
public getUriLabel(resource: URI, options?: { relative?: boolean; forceNoTildify?: boolean }): string {
955
if (resource.scheme === 'file') {
956
return resource.fsPath;
957
}
958
return resource.path;
959
}
960
961
getUriBasenameLabel(resource: URI): string {
962
return basename(resource);
963
}
964
965
public getWorkspaceLabel(workspace: IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier | URI | IWorkspace, options?: { verbose: Verbosity }): string {
966
return '';
967
}
968
969
public getSeparator(scheme: string, authority?: string): '/' | '\\' {
970
return '/';
971
}
972
973
public registerFormatter(formatter: ResourceLabelFormatter): IDisposable {
974
throw new Error('Not implemented');
975
}
976
977
public registerCachedFormatter(formatter: ResourceLabelFormatter): IDisposable {
978
return this.registerFormatter(formatter);
979
}
980
981
public getHostLabel(): string {
982
return '';
983
}
984
985
public getHostTooltip(): string | undefined {
986
return undefined;
987
}
988
}
989
990
991
class StandaloneContextViewService extends ContextViewService {
992
993
constructor(
994
@ILayoutService layoutService: ILayoutService,
995
@ICodeEditorService private readonly _codeEditorService: ICodeEditorService,
996
) {
997
super(layoutService);
998
}
999
1000
override showContextView(delegate: IContextViewDelegate, container?: HTMLElement, shadowRoot?: boolean): IOpenContextView {
1001
if (!container) {
1002
const codeEditor = this._codeEditorService.getFocusedCodeEditor() || this._codeEditorService.getActiveCodeEditor();
1003
if (codeEditor) {
1004
container = codeEditor.getContainerDomNode();
1005
}
1006
}
1007
return super.showContextView(delegate, container, shadowRoot);
1008
}
1009
}
1010
1011
class StandaloneWorkspaceTrustManagementService implements IWorkspaceTrustManagementService {
1012
_serviceBrand: undefined;
1013
1014
private _neverEmitter = new Emitter<never>();
1015
public readonly onDidChangeTrust: Event<boolean> = this._neverEmitter.event;
1016
readonly onDidChangeTrustedFolders: Event<void> = this._neverEmitter.event;
1017
public readonly workspaceResolved = Promise.resolve();
1018
public readonly workspaceTrustInitialized = Promise.resolve();
1019
public readonly acceptsOutOfWorkspaceFiles = true;
1020
1021
isWorkspaceTrusted(): boolean {
1022
return true;
1023
}
1024
isWorkspaceTrustForced(): boolean {
1025
return false;
1026
}
1027
canSetParentFolderTrust(): boolean {
1028
return false;
1029
}
1030
async setParentFolderTrust(trusted: boolean): Promise<void> {
1031
// noop
1032
}
1033
canSetWorkspaceTrust(): boolean {
1034
return false;
1035
}
1036
async setWorkspaceTrust(trusted: boolean): Promise<void> {
1037
// noop
1038
}
1039
getUriTrustInfo(uri: URI): Promise<IWorkspaceTrustUriInfo> {
1040
throw new Error('Method not supported.');
1041
}
1042
async setUrisTrust(uri: URI[], trusted: boolean): Promise<void> {
1043
// noop
1044
}
1045
getTrustedUris(): URI[] {
1046
return [];
1047
}
1048
async setTrustedUris(uris: URI[]): Promise<void> {
1049
// noop
1050
}
1051
addWorkspaceTrustTransitionParticipant(participant: IWorkspaceTrustTransitionParticipant): IDisposable {
1052
throw new Error('Method not supported.');
1053
}
1054
}
1055
1056
class StandaloneLanguageService extends LanguageService {
1057
constructor() {
1058
super();
1059
}
1060
}
1061
1062
class StandaloneLogService extends LogService {
1063
constructor() {
1064
super(new ConsoleLogger());
1065
}
1066
}
1067
1068
class StandaloneContextMenuService extends ContextMenuService {
1069
constructor(
1070
@ITelemetryService telemetryService: ITelemetryService,
1071
@INotificationService notificationService: INotificationService,
1072
@IContextViewService contextViewService: IContextViewService,
1073
@IKeybindingService keybindingService: IKeybindingService,
1074
@IMenuService menuService: IMenuService,
1075
@IContextKeyService contextKeyService: IContextKeyService,
1076
) {
1077
super(telemetryService, notificationService, contextViewService, keybindingService, menuService, contextKeyService);
1078
this.configure({ blockMouse: false }); // we do not want that in the standalone editor
1079
}
1080
}
1081
1082
class StandaloneAccessbilitySignalService implements IAccessibilitySignalService {
1083
_serviceBrand: undefined;
1084
async playSignal(cue: AccessibilitySignal, options: {}): Promise<void> {
1085
}
1086
1087
async playSignals(cues: AccessibilitySignal[]): Promise<void> {
1088
}
1089
1090
getEnabledState(signal: AccessibilitySignal, userGesture: boolean, modality?: AccessibilityModality | undefined): IValueWithChangeEvent<boolean> {
1091
return ValueWithChangeEvent.const(false);
1092
}
1093
1094
getDelayMs(signal: AccessibilitySignal, modality: AccessibilityModality): number {
1095
return 0;
1096
}
1097
1098
isSoundEnabled(cue: AccessibilitySignal): boolean {
1099
return false;
1100
}
1101
1102
isAnnouncementEnabled(cue: AccessibilitySignal): boolean {
1103
return false;
1104
}
1105
1106
onSoundEnabledChanged(cue: AccessibilitySignal): Event<void> {
1107
return Event.None;
1108
}
1109
1110
async playSound(cue: Sound, allowManyInParallel?: boolean | undefined): Promise<void> {
1111
}
1112
playSignalLoop(cue: AccessibilitySignal): IDisposable {
1113
return toDisposable(() => { });
1114
}
1115
}
1116
1117
class StandaloneDefaultAccountService implements IDefaultAccountService {
1118
declare readonly _serviceBrand: undefined;
1119
1120
readonly onDidChangeDefaultAccount: Event<IDefaultAccount | null> = Event.None;
1121
readonly onDidChangePolicyData: Event<IPolicyData | null> = Event.None;
1122
readonly policyData: IPolicyData | null = null;
1123
1124
async getDefaultAccount(): Promise<IDefaultAccount | null> {
1125
return null;
1126
}
1127
1128
setDefaultAccountProvider(): void {
1129
// no-op
1130
}
1131
1132
async refresh(): Promise<IDefaultAccount | null> {
1133
return null;
1134
}
1135
1136
getDefaultAccountAuthenticationProvider(): IDefaultAccountAuthenticationProvider {
1137
return { id: 'default', name: 'Default', enterprise: false };
1138
}
1139
1140
async signIn(): Promise<IDefaultAccount | null> {
1141
return null;
1142
}
1143
}
1144
1145
export interface IEditorOverrideServices {
1146
[index: string]: unknown;
1147
}
1148
1149
1150
registerSingleton(IWebWorkerService, StandaloneWebWorkerService, InstantiationType.Eager);
1151
registerSingleton(ILogService, StandaloneLogService, InstantiationType.Eager);
1152
registerSingleton(IConfigurationService, StandaloneConfigurationService, InstantiationType.Eager);
1153
registerSingleton(ITextResourceConfigurationService, StandaloneResourceConfigurationService, InstantiationType.Eager);
1154
registerSingleton(ITextResourcePropertiesService, StandaloneResourcePropertiesService, InstantiationType.Eager);
1155
registerSingleton(IWorkspaceContextService, StandaloneWorkspaceContextService, InstantiationType.Eager);
1156
registerSingleton(ILabelService, StandaloneUriLabelService, InstantiationType.Eager);
1157
registerSingleton(ITelemetryService, StandaloneTelemetryService, InstantiationType.Eager);
1158
registerSingleton(IDialogService, StandaloneDialogService, InstantiationType.Eager);
1159
registerSingleton(IEnvironmentService, StandaloneEnvironmentService, InstantiationType.Eager);
1160
registerSingleton(INotificationService, StandaloneNotificationService, InstantiationType.Eager);
1161
registerSingleton(IMarkerService, MarkerService, InstantiationType.Eager);
1162
registerSingleton(ILanguageService, StandaloneLanguageService, InstantiationType.Eager);
1163
registerSingleton(IStandaloneThemeService, StandaloneThemeService, InstantiationType.Eager);
1164
registerSingleton(IModelService, ModelService, InstantiationType.Eager);
1165
registerSingleton(IMarkerDecorationsService, MarkerDecorationsService, InstantiationType.Eager);
1166
registerSingleton(IContextKeyService, ContextKeyService, InstantiationType.Eager);
1167
registerSingleton(IProgressService, StandaloneProgressService, InstantiationType.Eager);
1168
registerSingleton(IEditorProgressService, StandaloneEditorProgressService, InstantiationType.Eager);
1169
registerSingleton(IStorageService, InMemoryStorageService, InstantiationType.Eager);
1170
registerSingleton(IBulkEditService, StandaloneBulkEditService, InstantiationType.Eager);
1171
registerSingleton(IWorkspaceTrustManagementService, StandaloneWorkspaceTrustManagementService, InstantiationType.Eager);
1172
registerSingleton(ITextModelService, StandaloneTextModelService, InstantiationType.Eager);
1173
registerSingleton(IAccessibilityService, AccessibilityService, InstantiationType.Eager);
1174
registerSingleton(IListService, ListService, InstantiationType.Eager);
1175
registerSingleton(ICommandService, StandaloneCommandService, InstantiationType.Eager);
1176
registerSingleton(IKeybindingService, StandaloneKeybindingService, InstantiationType.Eager);
1177
registerSingleton(IQuickInputService, StandaloneQuickInputService, InstantiationType.Eager);
1178
registerSingleton(IContextViewService, StandaloneContextViewService, InstantiationType.Eager);
1179
registerSingleton(IOpenerService, OpenerService, InstantiationType.Eager);
1180
registerSingleton(IClipboardService, BrowserClipboardService, InstantiationType.Eager);
1181
registerSingleton(IContextMenuService, StandaloneContextMenuService, InstantiationType.Eager);
1182
registerSingleton(IMenuService, MenuService, InstantiationType.Eager);
1183
registerSingleton(IAccessibilitySignalService, StandaloneAccessbilitySignalService, InstantiationType.Eager);
1184
registerSingleton(ITreeSitterLibraryService, StandaloneTreeSitterLibraryService, InstantiationType.Eager);
1185
registerSingleton(ILoggerService, NullLoggerService, InstantiationType.Eager);
1186
registerSingleton(IDataChannelService, NullDataChannelService, InstantiationType.Eager);
1187
registerSingleton(IDefaultAccountService, StandaloneDefaultAccountService, InstantiationType.Eager);
1188
registerSingleton(IRenameSymbolTrackerService, NullRenameSymbolTrackerService, InstantiationType.Eager);
1189
registerSingleton(IUserInteractionService, UserInteractionService, InstantiationType.Eager);
1190
1191
/**
1192
* We don't want to eagerly instantiate services because embedders get a one time chance
1193
* to override services when they create the first editor.
1194
*/
1195
export namespace StandaloneServices {
1196
1197
const serviceCollection = new ServiceCollection();
1198
for (const [id, descriptor] of getSingletonServiceDescriptors()) {
1199
serviceCollection.set(id, descriptor);
1200
}
1201
1202
const instantiationService = new InstantiationService(serviceCollection, true);
1203
serviceCollection.set(IInstantiationService, instantiationService);
1204
1205
export function get<T>(serviceId: ServiceIdentifier<T>): T {
1206
if (!initialized) {
1207
initialize({});
1208
}
1209
const r = serviceCollection.get(serviceId);
1210
if (!r) {
1211
throw new Error('Missing service ' + serviceId);
1212
}
1213
if (r instanceof SyncDescriptor) {
1214
return instantiationService.invokeFunction((accessor) => accessor.get(serviceId));
1215
} else {
1216
return r;
1217
}
1218
}
1219
1220
let initialized = false;
1221
const onDidInitialize = new Emitter<void>();
1222
export function initialize(overrides: IEditorOverrideServices): IInstantiationService {
1223
if (initialized) {
1224
return instantiationService;
1225
}
1226
initialized = true;
1227
1228
// Add singletons that were registered after this module loaded
1229
for (const [id, descriptor] of getSingletonServiceDescriptors()) {
1230
if (!serviceCollection.get(id)) {
1231
serviceCollection.set(id, descriptor);
1232
}
1233
}
1234
1235
// Initialize the service collection with the overrides, but only if the
1236
// service was not instantiated in the meantime.
1237
for (const serviceId in overrides) {
1238
if (overrides.hasOwnProperty(serviceId)) {
1239
const serviceIdentifier = createDecorator(serviceId);
1240
const r = serviceCollection.get(serviceIdentifier);
1241
if (r instanceof SyncDescriptor) {
1242
serviceCollection.set(serviceIdentifier, overrides[serviceId]);
1243
}
1244
}
1245
}
1246
1247
// Instantiate all editor features
1248
const editorFeatures = getEditorFeatures();
1249
for (const feature of editorFeatures) {
1250
try {
1251
instantiationService.createInstance(feature);
1252
} catch (err) {
1253
onUnexpectedError(err);
1254
}
1255
}
1256
1257
onDidInitialize.fire();
1258
1259
return instantiationService;
1260
}
1261
1262
/**
1263
* Executes callback once services are initialized.
1264
*/
1265
export function withServices(callback: () => IDisposable): IDisposable {
1266
if (initialized) {
1267
return callback();
1268
}
1269
1270
const disposable = new DisposableStore();
1271
1272
const listener = disposable.add(onDidInitialize.event(() => {
1273
listener.dispose();
1274
disposable.add(callback());
1275
}));
1276
1277
return disposable;
1278
}
1279
1280
}
1281
1282