Path: blob/main/src/vs/editor/standalone/browser/standaloneServices.ts
5272 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import './standaloneCodeEditorService.js';6import './standaloneLayoutService.js';7import '../../../platform/undoRedo/common/undoRedoService.js';8import '../../common/services/languageFeatureDebounce.js';9import '../../common/services/semanticTokensStylingService.js';10import '../../common/services/languageFeaturesService.js';11import '../../../platform/hover/browser/hoverService.js';12import '../../browser/services/inlineCompletionsService.js';1314import * as strings from '../../../base/common/strings.js';15import * as dom from '../../../base/browser/dom.js';16import { StandardKeyboardEvent } from '../../../base/browser/keyboardEvent.js';17import { Emitter, Event, IValueWithChangeEvent, ValueWithChangeEvent } from '../../../base/common/event.js';18import { ResolvedKeybinding, KeyCodeChord, Keybinding, decodeKeybinding } from '../../../base/common/keybindings.js';19import { IDisposable, IReference, ImmortalReference, toDisposable, DisposableStore, Disposable, combinedDisposable } from '../../../base/common/lifecycle.js';20import { OS, isLinux, isMacintosh } from '../../../base/common/platform.js';21import Severity from '../../../base/common/severity.js';22import { URI } from '../../../base/common/uri.js';23import { IRenameSymbolTrackerService, NullRenameSymbolTrackerService } from '../../browser/services/renameSymbolTrackerService.js';24import { IBulkEditOptions, IBulkEditResult, IBulkEditService, ResourceEdit, ResourceTextEdit } from '../../browser/services/bulkEditService.js';25import { isDiffEditorConfigurationKey, isEditorConfigurationKey } from '../../common/config/editorConfigurationSchema.js';26import { EditOperation, ISingleEditOperation } from '../../common/core/editOperation.js';27import { IPosition, Position as Pos } from '../../common/core/position.js';28import { Range } from '../../common/core/range.js';29import { ITextModel, ITextSnapshot } from '../../common/model.js';30import { IModelService } from '../../common/services/model.js';31import { IResolvedTextEditorModel, ITextModelContentProvider, ITextModelService } from '../../common/services/resolverService.js';32import { ITextResourceConfigurationService, ITextResourcePropertiesService, ITextResourceConfigurationChangeEvent } from '../../common/services/textResourceConfiguration.js';33import { CommandsRegistry, ICommandEvent, ICommandHandler, ICommandService } from '../../../platform/commands/common/commands.js';34import { IConfigurationChangeEvent, IConfigurationData, IConfigurationOverrides, IConfigurationService, IConfigurationModel, IConfigurationValue, ConfigurationTarget } from '../../../platform/configuration/common/configuration.js';35import { Configuration, ConfigurationModel, ConfigurationChangeEvent } from '../../../platform/configuration/common/configurationModels.js';36import { IContextKeyService, ContextKeyExpression } from '../../../platform/contextkey/common/contextkey.js';37import { IConfirmation, IConfirmationResult, IDialogService, IInputResult, IPrompt, IPromptResult, IPromptWithCustomCancel, IPromptResultWithCancel, IPromptWithDefaultCancel, IPromptBaseButton } from '../../../platform/dialogs/common/dialogs.js';38import { createDecorator, IInstantiationService, ServiceIdentifier } from '../../../platform/instantiation/common/instantiation.js';39import { AbstractKeybindingService } from '../../../platform/keybinding/common/abstractKeybindingService.js';40import { IKeybindingService, IKeyboardEvent, KeybindingsSchemaContribution } from '../../../platform/keybinding/common/keybinding.js';41import { KeybindingResolver } from '../../../platform/keybinding/common/keybindingResolver.js';42import { IKeybindingItem, KeybindingsRegistry } from '../../../platform/keybinding/common/keybindingsRegistry.js';43import { ResolvedKeybindingItem } from '../../../platform/keybinding/common/resolvedKeybindingItem.js';44import { USLayoutResolvedKeybinding } from '../../../platform/keybinding/common/usLayoutResolvedKeybinding.js';45import { ILabelService, ResourceLabelFormatter, IFormatterChangeEvent, Verbosity } from '../../../platform/label/common/label.js';46import { INotification, INotificationHandle, INotificationService, IPromptChoice, IPromptOptions, NoOpNotification, IStatusMessageOptions, INotificationSource, INotificationSourceFilter, NotificationsFilter, IStatusHandle } from '../../../platform/notification/common/notification.js';47import { IProgressRunner, IEditorProgressService, IProgressService, IProgress, IProgressCompositeOptions, IProgressDialogOptions, IProgressNotificationOptions, IProgressOptions, IProgressStep, IProgressWindowOptions } from '../../../platform/progress/common/progress.js';48import { ITelemetryService, TelemetryLevel } from '../../../platform/telemetry/common/telemetry.js';49import { ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier, IWorkspace, IWorkspaceContextService, IWorkspaceFolder, IWorkspaceFoldersChangeEvent, IWorkspaceFoldersWillChangeEvent, WorkbenchState, WorkspaceFolder, STANDALONE_EDITOR_WORKSPACE_ID } from '../../../platform/workspace/common/workspace.js';50import { ILayoutService } from '../../../platform/layout/browser/layoutService.js';51import { StandaloneServicesNLS } from '../../common/standaloneStrings.js';52import { basename } from '../../../base/common/resources.js';53import { ICodeEditorService } from '../../browser/services/codeEditorService.js';54import { ConsoleLogger, ILoggerService, ILogService, NullLoggerService } from '../../../platform/log/common/log.js';55import { IWorkspaceTrustManagementService, IWorkspaceTrustTransitionParticipant, IWorkspaceTrustUriInfo } from '../../../platform/workspace/common/workspaceTrust.js';56import { EditorOption } from '../../common/config/editorOptions.js';57import { ICodeEditor, IDiffEditor } from '../../browser/editorBrowser.js';58import { IContextMenuService, IContextViewDelegate, IContextViewService, IOpenContextView } from '../../../platform/contextview/browser/contextView.js';59import { ContextViewService } from '../../../platform/contextview/browser/contextViewService.js';60import { LanguageService } from '../../common/services/languageService.js';61import { ContextMenuService } from '../../../platform/contextview/browser/contextMenuService.js';62import { getSingletonServiceDescriptors, InstantiationType, registerSingleton } from '../../../platform/instantiation/common/extensions.js';63import { OpenerService } from '../../browser/services/openerService.js';64import { ILanguageService } from '../../common/languages/language.js';65import { MarkerDecorationsService } from '../../common/services/markerDecorationsService.js';66import { IMarkerDecorationsService } from '../../common/services/markerDecorations.js';67import { ModelService } from '../../common/services/modelService.js';68import { StandaloneQuickInputService } from './quickInput/standaloneQuickInputService.js';69import { StandaloneThemeService } from './standaloneThemeService.js';70import { IStandaloneThemeService } from '../common/standaloneTheme.js';71import { AccessibilityService } from '../../../platform/accessibility/browser/accessibilityService.js';72import { IAccessibilityService } from '../../../platform/accessibility/common/accessibility.js';73import { IMenuService } from '../../../platform/actions/common/actions.js';74import { MenuService } from '../../../platform/actions/common/menuService.js';75import { BrowserClipboardService } from '../../../platform/clipboard/browser/clipboardService.js';76import { IClipboardService } from '../../../platform/clipboard/common/clipboardService.js';77import { ContextKeyService } from '../../../platform/contextkey/browser/contextKeyService.js';78import { SyncDescriptor } from '../../../platform/instantiation/common/descriptors.js';79import { InstantiationService } from '../../../platform/instantiation/common/instantiationService.js';80import { ServiceCollection } from '../../../platform/instantiation/common/serviceCollection.js';81import { IListService, ListService } from '../../../platform/list/browser/listService.js';82import { IMarkerService } from '../../../platform/markers/common/markers.js';83import { MarkerService } from '../../../platform/markers/common/markerService.js';84import { IOpenerService } from '../../../platform/opener/common/opener.js';85import { IQuickInputService } from '../../../platform/quickinput/common/quickInput.js';86import { IStorageService, InMemoryStorageService } from '../../../platform/storage/common/storage.js';87import { DefaultConfiguration } from '../../../platform/configuration/common/configurations.js';88import { WorkspaceEdit } from '../../common/languages.js';89import { AccessibilitySignal, AccessibilityModality, IAccessibilitySignalService, Sound } from '../../../platform/accessibilitySignal/browser/accessibilitySignalService.js';90import { LogService } from '../../../platform/log/common/logService.js';91import { getEditorFeatures } from '../../common/editorFeatures.js';92import { onUnexpectedError } from '../../../base/common/errors.js';93import { ExtensionKind, IEnvironmentService, IExtensionHostDebugParams } from '../../../platform/environment/common/environment.js';94import { mainWindow } from '../../../base/browser/window.js';95import { ResourceMap } from '../../../base/common/map.js';96import { ITreeSitterLibraryService } from '../../common/services/treeSitter/treeSitterLibraryService.js';97import { StandaloneTreeSitterLibraryService } from './standaloneTreeSitterLibraryService.js';98import { IDataChannelService, NullDataChannelService } from '../../../platform/dataChannel/common/dataChannel.js';99import { IWebWorkerService } from '../../../platform/webWorker/browser/webWorkerService.js';100import { StandaloneWebWorkerService } from './services/standaloneWebWorkerService.js';101import { IDefaultAccountService } from '../../../platform/defaultAccount/common/defaultAccount.js';102import { IDefaultAccount, IDefaultAccountAuthenticationProvider, IPolicyData } from '../../../base/common/defaultAccount.js';103import { IUserInteractionService } from '../../../platform/userInteraction/browser/userInteractionService.js';104import { UserInteractionService } from '../../../platform/userInteraction/browser/userInteractionServiceImpl.js';105106class SimpleModel implements IResolvedTextEditorModel {107108private readonly model: ITextModel;109private readonly _onWillDispose: Emitter<void>;110111constructor(model: ITextModel) {112this.model = model;113this._onWillDispose = new Emitter<void>();114}115116public get onWillDispose(): Event<void> {117return this._onWillDispose.event;118}119120public resolve(): Promise<void> {121return Promise.resolve();122}123124public get textEditorModel(): ITextModel {125return this.model;126}127128public createSnapshot(): ITextSnapshot {129return this.model.createSnapshot();130}131132public isReadonly(): boolean {133return false;134}135136private disposed = false;137public dispose(): void {138this.disposed = true;139140this._onWillDispose.fire();141}142143public isDisposed(): boolean {144return this.disposed;145}146147public isResolved(): boolean {148return true;149}150151public getLanguageId(): string | undefined {152return this.model.getLanguageId();153}154}155156class StandaloneTextModelService implements ITextModelService {157public _serviceBrand: undefined;158159constructor(160@IModelService private readonly modelService: IModelService161) { }162163public createModelReference(resource: URI): Promise<IReference<IResolvedTextEditorModel>> {164const model = this.modelService.getModel(resource);165166if (!model) {167return Promise.reject(new Error(`Model not found`));168}169170return Promise.resolve(new ImmortalReference(new SimpleModel(model)));171}172173public registerTextModelContentProvider(scheme: string, provider: ITextModelContentProvider): IDisposable {174return {175dispose: function () { /* no op */ }176};177}178179public canHandleResource(resource: URI): boolean {180return false;181}182}183184class StandaloneEditorProgressService implements IEditorProgressService {185declare readonly _serviceBrand: undefined;186187private static NULL_PROGRESS_RUNNER: IProgressRunner = {188done: () => { },189total: () => { },190worked: () => { }191};192193show(infinite: true, delay?: number): IProgressRunner;194show(total: number, delay?: number): IProgressRunner;195show(): IProgressRunner {196return StandaloneEditorProgressService.NULL_PROGRESS_RUNNER;197}198199async showWhile(promise: Promise<unknown>, delay?: number): Promise<void> {200await promise;201}202}203204class StandaloneProgressService implements IProgressService {205206declare readonly _serviceBrand: undefined;207208withProgress<R>(_options: IProgressOptions | IProgressDialogOptions | IProgressNotificationOptions | IProgressWindowOptions | IProgressCompositeOptions, task: (progress: IProgress<IProgressStep>) => Promise<R>, onDidCancel?: ((choice?: number | undefined) => void) | undefined): Promise<R> {209return task({210report: () => { },211});212}213}214215class StandaloneEnvironmentService implements IEnvironmentService {216217declare readonly _serviceBrand: undefined;218219readonly stateResource: URI = URI.from({ scheme: 'monaco', authority: 'stateResource' });220readonly userRoamingDataHome: URI = URI.from({ scheme: 'monaco', authority: 'userRoamingDataHome' });221readonly keyboardLayoutResource: URI = URI.from({ scheme: 'monaco', authority: 'keyboardLayoutResource' });222readonly argvResource: URI = URI.from({ scheme: 'monaco', authority: 'argvResource' });223readonly untitledWorkspacesHome: URI = URI.from({ scheme: 'monaco', authority: 'untitledWorkspacesHome' });224readonly builtinWorkbenchModesHome: URI = URI.from({ scheme: 'monaco', authority: 'builtinWorkbenchModesHome' });225readonly workspaceStorageHome: URI = URI.from({ scheme: 'monaco', authority: 'workspaceStorageHome' });226readonly localHistoryHome: URI = URI.from({ scheme: 'monaco', authority: 'localHistoryHome' });227readonly cacheHome: URI = URI.from({ scheme: 'monaco', authority: 'cacheHome' });228readonly userDataSyncHome: URI = URI.from({ scheme: 'monaco', authority: 'userDataSyncHome' });229readonly sync: 'on' | 'off' | undefined = undefined;230readonly continueOn?: string | undefined = undefined;231readonly editSessionId?: string | undefined = undefined;232readonly debugExtensionHost: IExtensionHostDebugParams = { port: null, break: false };233readonly isExtensionDevelopment: boolean = false;234readonly disableExtensions: boolean | string[] = false;235readonly disableExperiments: boolean = false;236readonly enableExtensions?: readonly string[] | undefined = undefined;237readonly extensionDevelopmentLocationURI?: URI[] | undefined = undefined;238readonly extensionDevelopmentKind?: ExtensionKind[] | undefined = undefined;239readonly extensionTestsLocationURI?: URI | undefined = undefined;240readonly logsHome: URI = URI.from({ scheme: 'monaco', authority: 'logsHome' });241readonly logLevel?: string | undefined = undefined;242readonly extensionLogLevel?: [string, string][] | undefined = undefined;243readonly verbose: boolean = false;244readonly isBuilt: boolean = false;245readonly disableTelemetry: boolean = false;246readonly serviceMachineIdResource: URI = URI.from({ scheme: 'monaco', authority: 'serviceMachineIdResource' });247readonly policyFile?: URI | undefined = undefined;248}249250class StandaloneDialogService implements IDialogService {251252_serviceBrand: undefined;253254readonly onWillShowDialog = Event.None;255readonly onDidShowDialog = Event.None;256257async confirm(confirmation: IConfirmation): Promise<IConfirmationResult> {258const confirmed = this.doConfirm(confirmation.message, confirmation.detail);259260return {261confirmed,262checkboxChecked: false // unsupported263};264}265266private doConfirm(message: string, detail?: string): boolean {267let messageText = message;268if (detail) {269messageText = messageText + '\n\n' + detail;270}271272return mainWindow.confirm(messageText);273}274275prompt<T>(prompt: IPromptWithCustomCancel<T>): Promise<IPromptResultWithCancel<T>>;276prompt<T>(prompt: IPrompt<T>): Promise<IPromptResult<T>>;277prompt<T>(prompt: IPromptWithDefaultCancel<T>): Promise<IPromptResult<T>>;278async prompt<T>(prompt: IPrompt<T> | IPromptWithCustomCancel<T>): Promise<IPromptResult<T> | IPromptResultWithCancel<T>> {279let result: T | undefined = undefined;280const confirmed = this.doConfirm(prompt.message, prompt.detail);281if (confirmed) {282const promptButtons: IPromptBaseButton<T>[] = [...(prompt.buttons ?? [])];283if (prompt.cancelButton && typeof prompt.cancelButton !== 'string' && typeof prompt.cancelButton !== 'boolean') {284promptButtons.push(prompt.cancelButton);285}286287result = await promptButtons[0]?.run({ checkboxChecked: false });288}289290return { result };291}292293async info(message: string, detail?: string): Promise<void> {294await this.prompt({ type: Severity.Info, message, detail });295}296297async warn(message: string, detail?: string): Promise<void> {298await this.prompt({ type: Severity.Warning, message, detail });299}300301async error(message: string, detail?: string): Promise<void> {302await this.prompt({ type: Severity.Error, message, detail });303}304305input(): Promise<IInputResult> {306return Promise.resolve({ confirmed: false }); // unsupported307}308309about(): Promise<void> {310return Promise.resolve(undefined);311}312}313314export class StandaloneNotificationService implements INotificationService {315316readonly onDidChangeFilter: Event<void> = Event.None;317318public _serviceBrand: undefined;319320private static readonly NO_OP: INotificationHandle = new NoOpNotification();321322public info(message: string): INotificationHandle {323return this.notify({ severity: Severity.Info, message });324}325326public warn(message: string): INotificationHandle {327return this.notify({ severity: Severity.Warning, message });328}329330public error(error: string | Error): INotificationHandle {331return this.notify({ severity: Severity.Error, message: error });332}333334public notify(notification: INotification): INotificationHandle {335switch (notification.severity) {336case Severity.Error:337console.error(notification.message);338break;339case Severity.Warning:340console.warn(notification.message);341break;342default:343console.log(notification.message);344break;345}346347return StandaloneNotificationService.NO_OP;348}349350public prompt(severity: Severity, message: string, choices: IPromptChoice[], options?: IPromptOptions): INotificationHandle {351return StandaloneNotificationService.NO_OP;352}353354public status(message: string | Error, options?: IStatusMessageOptions): IStatusHandle {355return { close: () => { } };356}357358public setFilter(filter: NotificationsFilter | INotificationSourceFilter): void { }359360public getFilter(source?: INotificationSource): NotificationsFilter {361return NotificationsFilter.OFF;362}363364public getFilters(): INotificationSourceFilter[] {365return [];366}367368public removeFilter(sourceId: string): void { }369}370371export class StandaloneCommandService implements ICommandService {372declare readonly _serviceBrand: undefined;373374private readonly _instantiationService: IInstantiationService;375376private readonly _onWillExecuteCommand = new Emitter<ICommandEvent>();377private readonly _onDidExecuteCommand = new Emitter<ICommandEvent>();378public readonly onWillExecuteCommand: Event<ICommandEvent> = this._onWillExecuteCommand.event;379public readonly onDidExecuteCommand: Event<ICommandEvent> = this._onDidExecuteCommand.event;380381constructor(382@IInstantiationService instantiationService: IInstantiationService383) {384this._instantiationService = instantiationService;385}386387public executeCommand<T>(id: string, ...args: unknown[]): Promise<T> {388const command = CommandsRegistry.getCommand(id);389if (!command) {390return Promise.reject(new Error(`command '${id}' not found`));391}392393try {394this._onWillExecuteCommand.fire({ commandId: id, args });395const result = this._instantiationService.invokeFunction.apply(this._instantiationService, [command.handler, ...args]) as T;396397this._onDidExecuteCommand.fire({ commandId: id, args });398return Promise.resolve(result);399} catch (err) {400return Promise.reject(err);401}402}403}404405export interface IKeybindingRule {406keybinding: number;407command?: string | null;408commandArgs?: unknown;409when?: ContextKeyExpression | null;410}411412export class StandaloneKeybindingService extends AbstractKeybindingService {413private _cachedResolver: KeybindingResolver | null;414private _dynamicKeybindings: IKeybindingItem[];415private readonly _domNodeListeners: DomNodeListeners[];416417constructor(418@IContextKeyService contextKeyService: IContextKeyService,419@ICommandService commandService: ICommandService,420@ITelemetryService telemetryService: ITelemetryService,421@INotificationService notificationService: INotificationService,422@ILogService logService: ILogService,423@ICodeEditorService codeEditorService: ICodeEditorService424) {425super(contextKeyService, commandService, telemetryService, notificationService, logService);426427this._cachedResolver = null;428this._dynamicKeybindings = [];429this._domNodeListeners = [];430431const addContainer = (domNode: HTMLElement) => {432const disposables = new DisposableStore();433434// for standard keybindings435disposables.add(dom.addDisposableListener(domNode, dom.EventType.KEY_DOWN, (e: KeyboardEvent) => {436const keyEvent = new StandardKeyboardEvent(e);437const shouldPreventDefault = this._dispatch(keyEvent, keyEvent.target);438if (shouldPreventDefault) {439keyEvent.preventDefault();440keyEvent.stopPropagation();441}442}));443444// for single modifier chord keybindings (e.g. shift shift)445disposables.add(dom.addDisposableListener(domNode, dom.EventType.KEY_UP, (e: KeyboardEvent) => {446const keyEvent = new StandardKeyboardEvent(e);447const shouldPreventDefault = this._singleModifierDispatch(keyEvent, keyEvent.target);448if (shouldPreventDefault) {449keyEvent.preventDefault();450}451}));452453this._domNodeListeners.push(new DomNodeListeners(domNode, disposables));454};455const removeContainer = (domNode: HTMLElement) => {456for (let i = 0; i < this._domNodeListeners.length; i++) {457const domNodeListeners = this._domNodeListeners[i];458if (domNodeListeners.domNode === domNode) {459this._domNodeListeners.splice(i, 1);460domNodeListeners.dispose();461}462}463};464465const addCodeEditor = (codeEditor: ICodeEditor) => {466if (codeEditor.getOption(EditorOption.inDiffEditor)) {467return;468}469addContainer(codeEditor.getContainerDomNode());470};471const removeCodeEditor = (codeEditor: ICodeEditor) => {472if (codeEditor.getOption(EditorOption.inDiffEditor)) {473return;474}475removeContainer(codeEditor.getContainerDomNode());476};477this._register(codeEditorService.onCodeEditorAdd(addCodeEditor));478this._register(codeEditorService.onCodeEditorRemove(removeCodeEditor));479codeEditorService.listCodeEditors().forEach(addCodeEditor);480481const addDiffEditor = (diffEditor: IDiffEditor) => {482addContainer(diffEditor.getContainerDomNode());483};484const removeDiffEditor = (diffEditor: IDiffEditor) => {485removeContainer(diffEditor.getContainerDomNode());486};487this._register(codeEditorService.onDiffEditorAdd(addDiffEditor));488this._register(codeEditorService.onDiffEditorRemove(removeDiffEditor));489codeEditorService.listDiffEditors().forEach(addDiffEditor);490}491492public addDynamicKeybinding(command: string, keybinding: number, handler: ICommandHandler, when: ContextKeyExpression | undefined): IDisposable {493return combinedDisposable(494CommandsRegistry.registerCommand(command, handler),495this.addDynamicKeybindings([{496keybinding,497command,498when499}])500);501}502503public addDynamicKeybindings(rules: IKeybindingRule[]): IDisposable {504const entries: IKeybindingItem[] = rules.map((rule) => {505const keybinding = decodeKeybinding(rule.keybinding, OS);506return {507keybinding,508command: rule.command ?? null,509commandArgs: rule.commandArgs,510when: rule.when,511weight1: 1000,512weight2: 0,513extensionId: null,514isBuiltinExtension: false515};516});517this._dynamicKeybindings = this._dynamicKeybindings.concat(entries);518519this.updateResolver();520521return toDisposable(() => {522// Search the first entry and remove them all since they will be contiguous523for (let i = 0; i < this._dynamicKeybindings.length; i++) {524if (this._dynamicKeybindings[i] === entries[0]) {525this._dynamicKeybindings.splice(i, entries.length);526this.updateResolver();527return;528}529}530});531}532533private updateResolver(): void {534this._cachedResolver = null;535this._onDidUpdateKeybindings.fire();536}537538protected _getResolver(): KeybindingResolver {539if (!this._cachedResolver) {540const defaults = this._toNormalizedKeybindingItems(KeybindingsRegistry.getDefaultKeybindings(), true);541const overrides = this._toNormalizedKeybindingItems(this._dynamicKeybindings, false);542this._cachedResolver = new KeybindingResolver(defaults, overrides, (str) => this._log(str));543}544return this._cachedResolver;545}546547protected _documentHasFocus(): boolean {548return mainWindow.document.hasFocus();549}550551private _toNormalizedKeybindingItems(items: IKeybindingItem[], isDefault: boolean): ResolvedKeybindingItem[] {552const result: ResolvedKeybindingItem[] = [];553let resultLen = 0;554for (const item of items) {555const when = item.when || undefined;556const keybinding = item.keybinding;557558if (!keybinding) {559// This might be a removal keybinding item in user settings => accept it560result[resultLen++] = new ResolvedKeybindingItem(undefined, item.command, item.commandArgs, when, isDefault, null, false);561} else {562const resolvedKeybindings = USLayoutResolvedKeybinding.resolveKeybinding(keybinding, OS);563for (const resolvedKeybinding of resolvedKeybindings) {564result[resultLen++] = new ResolvedKeybindingItem(resolvedKeybinding, item.command, item.commandArgs, when, isDefault, null, false);565}566}567}568569return result;570}571572public resolveKeybinding(keybinding: Keybinding): ResolvedKeybinding[] {573return USLayoutResolvedKeybinding.resolveKeybinding(keybinding, OS);574}575576public resolveKeyboardEvent(keyboardEvent: IKeyboardEvent): ResolvedKeybinding {577const chord = new KeyCodeChord(578keyboardEvent.ctrlKey,579keyboardEvent.shiftKey,580keyboardEvent.altKey,581keyboardEvent.metaKey,582keyboardEvent.keyCode583);584return new USLayoutResolvedKeybinding([chord], OS);585}586587public resolveUserBinding(userBinding: string): ResolvedKeybinding[] {588return [];589}590591public _dumpDebugInfo(): string {592return '';593}594595public _dumpDebugInfoJSON(): string {596return '';597}598599public registerSchemaContribution(contribution: KeybindingsSchemaContribution): IDisposable {600return Disposable.None;601}602603/**604* not yet supported605*/606public override enableKeybindingHoldMode(commandId: string): Promise<void> | undefined {607return undefined;608}609}610611class DomNodeListeners extends Disposable {612constructor(613public readonly domNode: HTMLElement,614disposables: DisposableStore615) {616super();617this._register(disposables);618}619}620621function isConfigurationOverrides(thing: unknown): thing is IConfigurationOverrides {622return !!thing623&& typeof thing === 'object'624&& (!(thing as IConfigurationOverrides).overrideIdentifier || typeof (thing as IConfigurationOverrides).overrideIdentifier === 'string')625&& (!(thing as IConfigurationOverrides).resource || (thing as IConfigurationOverrides).resource instanceof URI);626}627628export class StandaloneConfigurationService implements IConfigurationService {629630declare readonly _serviceBrand: undefined;631632private readonly _onDidChangeConfiguration = new Emitter<IConfigurationChangeEvent>();633public readonly onDidChangeConfiguration: Event<IConfigurationChangeEvent> = this._onDidChangeConfiguration.event;634635private readonly _configuration: Configuration;636637constructor(638@ILogService private readonly logService: ILogService,639) {640const defaultConfiguration = new DefaultConfiguration(logService);641this._configuration = new Configuration(642defaultConfiguration.reload(),643ConfigurationModel.createEmptyModel(logService),644ConfigurationModel.createEmptyModel(logService),645ConfigurationModel.createEmptyModel(logService),646ConfigurationModel.createEmptyModel(logService),647ConfigurationModel.createEmptyModel(logService),648new ResourceMap<ConfigurationModel>(),649ConfigurationModel.createEmptyModel(logService),650new ResourceMap<ConfigurationModel>(),651logService652);653defaultConfiguration.dispose();654}655656getValue<T>(): T;657getValue<T>(section: string): T;658getValue<T>(overrides: IConfigurationOverrides): T;659getValue<T>(section: string, overrides: IConfigurationOverrides): T;660getValue(arg1?: unknown, arg2?: unknown): unknown {661const section = typeof arg1 === 'string' ? arg1 : undefined;662const overrides = isConfigurationOverrides(arg1) ? arg1 : isConfigurationOverrides(arg2) ? arg2 : {};663return this._configuration.getValue(section, overrides, undefined);664}665666public updateValues(values: [string, unknown][]): Promise<void> {667const previous = { data: this._configuration.toData() };668669const changedKeys: string[] = [];670671for (const entry of values) {672const [key, value] = entry;673if (this.getValue(key) === value) {674continue;675}676this._configuration.updateValue(key, value);677changedKeys.push(key);678}679680if (changedKeys.length > 0) {681const configurationChangeEvent = new ConfigurationChangeEvent({ keys: changedKeys, overrides: [] }, previous, this._configuration, undefined, this.logService);682configurationChangeEvent.source = ConfigurationTarget.MEMORY;683this._onDidChangeConfiguration.fire(configurationChangeEvent);684}685686return Promise.resolve();687}688689public updateValue(key: string, value: unknown, arg3?: unknown, arg4?: unknown): Promise<void> {690return this.updateValues([[key, value]]);691}692693public inspect<C>(key: string, options: IConfigurationOverrides = {}): IConfigurationValue<C> {694return this._configuration.inspect<C>(key, options, undefined);695}696697public keys() {698return this._configuration.keys(undefined);699}700701public reloadConfiguration(): Promise<void> {702return Promise.resolve(undefined);703}704705public getConfigurationData(): IConfigurationData | null {706const emptyModel: IConfigurationModel = {707contents: {},708keys: [],709overrides: []710};711return {712defaults: emptyModel,713policy: emptyModel,714application: emptyModel,715userLocal: emptyModel,716userRemote: emptyModel,717workspace: emptyModel,718folders: []719};720}721}722723class StandaloneResourceConfigurationService extends Disposable implements ITextResourceConfigurationService {724725declare readonly _serviceBrand: undefined;726727private readonly _onDidChangeConfiguration = this._register(new Emitter<ITextResourceConfigurationChangeEvent>());728public readonly onDidChangeConfiguration = this._onDidChangeConfiguration.event;729730constructor(731@IConfigurationService private readonly configurationService: StandaloneConfigurationService,732@IModelService private readonly modelService: IModelService,733@ILanguageService private readonly languageService: ILanguageService734) {735super();736this._register(this.configurationService.onDidChangeConfiguration((e) => {737this._onDidChangeConfiguration.fire({ affectedKeys: e.affectedKeys, affectsConfiguration: (resource: URI, configuration: string) => e.affectsConfiguration(configuration) });738}));739}740741getValue<T>(resource: URI, section?: string): T;742getValue<T>(resource: URI, position?: IPosition, section?: string): T;743getValue<T>(resource: URI | undefined, arg2?: unknown, arg3?: unknown) {744const position: IPosition | null = Pos.isIPosition(arg2) ? arg2 : null;745const section: string | undefined = position ? (typeof arg3 === 'string' ? arg3 : undefined) : (typeof arg2 === 'string' ? arg2 : undefined);746const language = resource ? this.getLanguage(resource, position) : undefined;747if (typeof section === 'undefined') {748return this.configurationService.getValue<T>({749resource,750overrideIdentifier: language751});752}753return this.configurationService.getValue<T>(section, {754resource,755overrideIdentifier: language756});757}758759inspect<T>(resource: URI | undefined, position: IPosition | null, section: string): IConfigurationValue<Readonly<T>> {760const language = resource ? this.getLanguage(resource, position) : undefined;761return this.configurationService.inspect<T>(section, { resource, overrideIdentifier: language });762}763764private getLanguage(resource: URI, position: IPosition | null): string | null {765const model = this.modelService.getModel(resource);766if (model) {767return position ? model.getLanguageIdAtPosition(position.lineNumber, position.column) : model.getLanguageId();768}769return this.languageService.guessLanguageIdByFilepathOrFirstLine(resource);770}771772updateValue(resource: URI, key: string, value: unknown, configurationTarget?: ConfigurationTarget): Promise<void> {773return this.configurationService.updateValue(key, value, { resource }, configurationTarget);774}775}776777class StandaloneResourcePropertiesService implements ITextResourcePropertiesService {778779declare readonly _serviceBrand: undefined;780781constructor(782@IConfigurationService private readonly configurationService: IConfigurationService,783) {784}785786getEOL(resource: URI, language?: string): string {787const eol = this.configurationService.getValue('files.eol', { overrideIdentifier: language, resource });788if (eol && typeof eol === 'string' && eol !== 'auto') {789return eol;790}791return (isLinux || isMacintosh) ? '\n' : '\r\n';792}793}794795class StandaloneTelemetryService implements ITelemetryService {796declare readonly _serviceBrand: undefined;797readonly telemetryLevel = TelemetryLevel.NONE;798readonly sessionId = 'someValue.sessionId';799readonly machineId = 'someValue.machineId';800readonly sqmId = 'someValue.sqmId';801readonly devDeviceId = 'someValue.devDeviceId';802readonly firstSessionDate = 'someValue.firstSessionDate';803readonly sendErrorTelemetry = false;804setEnabled(): void { }805setExperimentProperty(): void { }806publicLog() { }807publicLog2() { }808publicLogError() { }809publicLogError2() { }810}811812class StandaloneWorkspaceContextService implements IWorkspaceContextService {813814public _serviceBrand: undefined;815816private static readonly SCHEME = 'inmemory';817818private readonly _onDidChangeWorkspaceName = new Emitter<void>();819public readonly onDidChangeWorkspaceName: Event<void> = this._onDidChangeWorkspaceName.event;820821private readonly _onWillChangeWorkspaceFolders = new Emitter<IWorkspaceFoldersWillChangeEvent>();822public readonly onWillChangeWorkspaceFolders: Event<IWorkspaceFoldersWillChangeEvent> = this._onWillChangeWorkspaceFolders.event;823824private readonly _onDidChangeWorkspaceFolders = new Emitter<IWorkspaceFoldersChangeEvent>();825public readonly onDidChangeWorkspaceFolders: Event<IWorkspaceFoldersChangeEvent> = this._onDidChangeWorkspaceFolders.event;826827private readonly _onDidChangeWorkbenchState = new Emitter<WorkbenchState>();828public readonly onDidChangeWorkbenchState: Event<WorkbenchState> = this._onDidChangeWorkbenchState.event;829830private readonly workspace: IWorkspace;831832constructor() {833const resource = URI.from({ scheme: StandaloneWorkspaceContextService.SCHEME, authority: 'model', path: '/' });834this.workspace = { id: STANDALONE_EDITOR_WORKSPACE_ID, folders: [new WorkspaceFolder({ uri: resource, name: '', index: 0 })] };835}836837getCompleteWorkspace(): Promise<IWorkspace> {838return Promise.resolve(this.getWorkspace());839}840841public getWorkspace(): IWorkspace {842return this.workspace;843}844845public getWorkbenchState(): WorkbenchState {846if (this.workspace) {847if (this.workspace.configuration) {848return WorkbenchState.WORKSPACE;849}850return WorkbenchState.FOLDER;851}852return WorkbenchState.EMPTY;853}854855public getWorkspaceFolder(resource: URI): IWorkspaceFolder | null {856return resource && resource.scheme === StandaloneWorkspaceContextService.SCHEME ? this.workspace.folders[0] : null;857}858859public isInsideWorkspace(resource: URI): boolean {860return resource && resource.scheme === StandaloneWorkspaceContextService.SCHEME;861}862863public isCurrentWorkspace(workspaceIdOrFolder: IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier | URI): boolean {864return true;865}866}867868export function updateConfigurationService(configurationService: IConfigurationService, source: any, isDiffEditor: boolean): void {869if (!source) {870return;871}872if (!(configurationService instanceof StandaloneConfigurationService)) {873return;874}875const toUpdate: [string, unknown][] = [];876Object.keys(source).forEach((key) => {877if (isEditorConfigurationKey(key)) {878toUpdate.push([`editor.${key}`, source[key]]);879}880if (isDiffEditor && isDiffEditorConfigurationKey(key)) {881toUpdate.push([`diffEditor.${key}`, source[key]]);882}883});884if (toUpdate.length > 0) {885configurationService.updateValues(toUpdate);886}887}888889class StandaloneBulkEditService implements IBulkEditService {890declare readonly _serviceBrand: undefined;891892constructor(893@IModelService private readonly _modelService: IModelService894) {895//896}897898hasPreviewHandler(): false {899return false;900}901902setPreviewHandler(): IDisposable {903return Disposable.None;904}905906async apply(editsIn: ResourceEdit[] | WorkspaceEdit, _options?: IBulkEditOptions): Promise<IBulkEditResult> {907const edits = Array.isArray(editsIn) ? editsIn : ResourceEdit.convert(editsIn);908const textEdits = new Map<ITextModel, ISingleEditOperation[]>();909910for (const edit of edits) {911if (!(edit instanceof ResourceTextEdit)) {912throw new Error('bad edit - only text edits are supported');913}914const model = this._modelService.getModel(edit.resource);915if (!model) {916throw new Error('bad edit - model not found');917}918if (typeof edit.versionId === 'number' && model.getVersionId() !== edit.versionId) {919throw new Error('bad state - model changed in the meantime');920}921let array = textEdits.get(model);922if (!array) {923array = [];924textEdits.set(model, array);925}926array.push(EditOperation.replaceMove(Range.lift(edit.textEdit.range), edit.textEdit.text));927}928929930let totalEdits = 0;931let totalFiles = 0;932for (const [model, edits] of textEdits) {933model.pushStackElement();934model.pushEditOperations([], edits, () => []);935model.pushStackElement();936totalFiles += 1;937totalEdits += edits.length;938}939940return {941ariaSummary: strings.format(StandaloneServicesNLS.bulkEditServiceSummary, totalEdits, totalFiles),942isApplied: totalEdits > 0943};944}945}946947class StandaloneUriLabelService implements ILabelService {948949declare readonly _serviceBrand: undefined;950951public readonly onDidChangeFormatters: Event<IFormatterChangeEvent> = Event.None;952953public getUriLabel(resource: URI, options?: { relative?: boolean; forceNoTildify?: boolean }): string {954if (resource.scheme === 'file') {955return resource.fsPath;956}957return resource.path;958}959960getUriBasenameLabel(resource: URI): string {961return basename(resource);962}963964public getWorkspaceLabel(workspace: IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier | URI | IWorkspace, options?: { verbose: Verbosity }): string {965return '';966}967968public getSeparator(scheme: string, authority?: string): '/' | '\\' {969return '/';970}971972public registerFormatter(formatter: ResourceLabelFormatter): IDisposable {973throw new Error('Not implemented');974}975976public registerCachedFormatter(formatter: ResourceLabelFormatter): IDisposable {977return this.registerFormatter(formatter);978}979980public getHostLabel(): string {981return '';982}983984public getHostTooltip(): string | undefined {985return undefined;986}987}988989990class StandaloneContextViewService extends ContextViewService {991992constructor(993@ILayoutService layoutService: ILayoutService,994@ICodeEditorService private readonly _codeEditorService: ICodeEditorService,995) {996super(layoutService);997}998999override showContextView(delegate: IContextViewDelegate, container?: HTMLElement, shadowRoot?: boolean): IOpenContextView {1000if (!container) {1001const codeEditor = this._codeEditorService.getFocusedCodeEditor() || this._codeEditorService.getActiveCodeEditor();1002if (codeEditor) {1003container = codeEditor.getContainerDomNode();1004}1005}1006return super.showContextView(delegate, container, shadowRoot);1007}1008}10091010class StandaloneWorkspaceTrustManagementService implements IWorkspaceTrustManagementService {1011_serviceBrand: undefined;10121013private _neverEmitter = new Emitter<never>();1014public readonly onDidChangeTrust: Event<boolean> = this._neverEmitter.event;1015readonly onDidChangeTrustedFolders: Event<void> = this._neverEmitter.event;1016public readonly workspaceResolved = Promise.resolve();1017public readonly workspaceTrustInitialized = Promise.resolve();1018public readonly acceptsOutOfWorkspaceFiles = true;10191020isWorkspaceTrusted(): boolean {1021return true;1022}1023isWorkspaceTrustForced(): boolean {1024return false;1025}1026canSetParentFolderTrust(): boolean {1027return false;1028}1029async setParentFolderTrust(trusted: boolean): Promise<void> {1030// noop1031}1032canSetWorkspaceTrust(): boolean {1033return false;1034}1035async setWorkspaceTrust(trusted: boolean): Promise<void> {1036// noop1037}1038getUriTrustInfo(uri: URI): Promise<IWorkspaceTrustUriInfo> {1039throw new Error('Method not supported.');1040}1041async setUrisTrust(uri: URI[], trusted: boolean): Promise<void> {1042// noop1043}1044getTrustedUris(): URI[] {1045return [];1046}1047async setTrustedUris(uris: URI[]): Promise<void> {1048// noop1049}1050addWorkspaceTrustTransitionParticipant(participant: IWorkspaceTrustTransitionParticipant): IDisposable {1051throw new Error('Method not supported.');1052}1053}10541055class StandaloneLanguageService extends LanguageService {1056constructor() {1057super();1058}1059}10601061class StandaloneLogService extends LogService {1062constructor() {1063super(new ConsoleLogger());1064}1065}10661067class StandaloneContextMenuService extends ContextMenuService {1068constructor(1069@ITelemetryService telemetryService: ITelemetryService,1070@INotificationService notificationService: INotificationService,1071@IContextViewService contextViewService: IContextViewService,1072@IKeybindingService keybindingService: IKeybindingService,1073@IMenuService menuService: IMenuService,1074@IContextKeyService contextKeyService: IContextKeyService,1075) {1076super(telemetryService, notificationService, contextViewService, keybindingService, menuService, contextKeyService);1077this.configure({ blockMouse: false }); // we do not want that in the standalone editor1078}1079}10801081class StandaloneAccessbilitySignalService implements IAccessibilitySignalService {1082_serviceBrand: undefined;1083async playSignal(cue: AccessibilitySignal, options: {}): Promise<void> {1084}10851086async playSignals(cues: AccessibilitySignal[]): Promise<void> {1087}10881089getEnabledState(signal: AccessibilitySignal, userGesture: boolean, modality?: AccessibilityModality | undefined): IValueWithChangeEvent<boolean> {1090return ValueWithChangeEvent.const(false);1091}10921093getDelayMs(signal: AccessibilitySignal, modality: AccessibilityModality): number {1094return 0;1095}10961097isSoundEnabled(cue: AccessibilitySignal): boolean {1098return false;1099}11001101isAnnouncementEnabled(cue: AccessibilitySignal): boolean {1102return false;1103}11041105onSoundEnabledChanged(cue: AccessibilitySignal): Event<void> {1106return Event.None;1107}11081109async playSound(cue: Sound, allowManyInParallel?: boolean | undefined): Promise<void> {1110}1111playSignalLoop(cue: AccessibilitySignal): IDisposable {1112return toDisposable(() => { });1113}1114}11151116class StandaloneDefaultAccountService implements IDefaultAccountService {1117declare readonly _serviceBrand: undefined;11181119readonly onDidChangeDefaultAccount: Event<IDefaultAccount | null> = Event.None;1120readonly onDidChangePolicyData: Event<IPolicyData | null> = Event.None;1121readonly policyData: IPolicyData | null = null;11221123async getDefaultAccount(): Promise<IDefaultAccount | null> {1124return null;1125}11261127setDefaultAccountProvider(): void {1128// no-op1129}11301131async refresh(): Promise<IDefaultAccount | null> {1132return null;1133}11341135getDefaultAccountAuthenticationProvider(): IDefaultAccountAuthenticationProvider {1136return { id: 'default', name: 'Default', enterprise: false };1137}11381139async signIn(): Promise<IDefaultAccount | null> {1140return null;1141}1142}11431144export interface IEditorOverrideServices {1145[index: string]: unknown;1146}114711481149registerSingleton(IWebWorkerService, StandaloneWebWorkerService, InstantiationType.Eager);1150registerSingleton(ILogService, StandaloneLogService, InstantiationType.Eager);1151registerSingleton(IConfigurationService, StandaloneConfigurationService, InstantiationType.Eager);1152registerSingleton(ITextResourceConfigurationService, StandaloneResourceConfigurationService, InstantiationType.Eager);1153registerSingleton(ITextResourcePropertiesService, StandaloneResourcePropertiesService, InstantiationType.Eager);1154registerSingleton(IWorkspaceContextService, StandaloneWorkspaceContextService, InstantiationType.Eager);1155registerSingleton(ILabelService, StandaloneUriLabelService, InstantiationType.Eager);1156registerSingleton(ITelemetryService, StandaloneTelemetryService, InstantiationType.Eager);1157registerSingleton(IDialogService, StandaloneDialogService, InstantiationType.Eager);1158registerSingleton(IEnvironmentService, StandaloneEnvironmentService, InstantiationType.Eager);1159registerSingleton(INotificationService, StandaloneNotificationService, InstantiationType.Eager);1160registerSingleton(IMarkerService, MarkerService, InstantiationType.Eager);1161registerSingleton(ILanguageService, StandaloneLanguageService, InstantiationType.Eager);1162registerSingleton(IStandaloneThemeService, StandaloneThemeService, InstantiationType.Eager);1163registerSingleton(IModelService, ModelService, InstantiationType.Eager);1164registerSingleton(IMarkerDecorationsService, MarkerDecorationsService, InstantiationType.Eager);1165registerSingleton(IContextKeyService, ContextKeyService, InstantiationType.Eager);1166registerSingleton(IProgressService, StandaloneProgressService, InstantiationType.Eager);1167registerSingleton(IEditorProgressService, StandaloneEditorProgressService, InstantiationType.Eager);1168registerSingleton(IStorageService, InMemoryStorageService, InstantiationType.Eager);1169registerSingleton(IBulkEditService, StandaloneBulkEditService, InstantiationType.Eager);1170registerSingleton(IWorkspaceTrustManagementService, StandaloneWorkspaceTrustManagementService, InstantiationType.Eager);1171registerSingleton(ITextModelService, StandaloneTextModelService, InstantiationType.Eager);1172registerSingleton(IAccessibilityService, AccessibilityService, InstantiationType.Eager);1173registerSingleton(IListService, ListService, InstantiationType.Eager);1174registerSingleton(ICommandService, StandaloneCommandService, InstantiationType.Eager);1175registerSingleton(IKeybindingService, StandaloneKeybindingService, InstantiationType.Eager);1176registerSingleton(IQuickInputService, StandaloneQuickInputService, InstantiationType.Eager);1177registerSingleton(IContextViewService, StandaloneContextViewService, InstantiationType.Eager);1178registerSingleton(IOpenerService, OpenerService, InstantiationType.Eager);1179registerSingleton(IClipboardService, BrowserClipboardService, InstantiationType.Eager);1180registerSingleton(IContextMenuService, StandaloneContextMenuService, InstantiationType.Eager);1181registerSingleton(IMenuService, MenuService, InstantiationType.Eager);1182registerSingleton(IAccessibilitySignalService, StandaloneAccessbilitySignalService, InstantiationType.Eager);1183registerSingleton(ITreeSitterLibraryService, StandaloneTreeSitterLibraryService, InstantiationType.Eager);1184registerSingleton(ILoggerService, NullLoggerService, InstantiationType.Eager);1185registerSingleton(IDataChannelService, NullDataChannelService, InstantiationType.Eager);1186registerSingleton(IDefaultAccountService, StandaloneDefaultAccountService, InstantiationType.Eager);1187registerSingleton(IRenameSymbolTrackerService, NullRenameSymbolTrackerService, InstantiationType.Eager);1188registerSingleton(IUserInteractionService, UserInteractionService, InstantiationType.Eager);11891190/**1191* We don't want to eagerly instantiate services because embedders get a one time chance1192* to override services when they create the first editor.1193*/1194export namespace StandaloneServices {11951196const serviceCollection = new ServiceCollection();1197for (const [id, descriptor] of getSingletonServiceDescriptors()) {1198serviceCollection.set(id, descriptor);1199}12001201const instantiationService = new InstantiationService(serviceCollection, true);1202serviceCollection.set(IInstantiationService, instantiationService);12031204export function get<T>(serviceId: ServiceIdentifier<T>): T {1205if (!initialized) {1206initialize({});1207}1208const r = serviceCollection.get(serviceId);1209if (!r) {1210throw new Error('Missing service ' + serviceId);1211}1212if (r instanceof SyncDescriptor) {1213return instantiationService.invokeFunction((accessor) => accessor.get(serviceId));1214} else {1215return r;1216}1217}12181219let initialized = false;1220const onDidInitialize = new Emitter<void>();1221export function initialize(overrides: IEditorOverrideServices): IInstantiationService {1222if (initialized) {1223return instantiationService;1224}1225initialized = true;12261227// Add singletons that were registered after this module loaded1228for (const [id, descriptor] of getSingletonServiceDescriptors()) {1229if (!serviceCollection.get(id)) {1230serviceCollection.set(id, descriptor);1231}1232}12331234// Initialize the service collection with the overrides, but only if the1235// service was not instantiated in the meantime.1236for (const serviceId in overrides) {1237if (overrides.hasOwnProperty(serviceId)) {1238const serviceIdentifier = createDecorator(serviceId);1239const r = serviceCollection.get(serviceIdentifier);1240if (r instanceof SyncDescriptor) {1241serviceCollection.set(serviceIdentifier, overrides[serviceId]);1242}1243}1244}12451246// Instantiate all editor features1247const editorFeatures = getEditorFeatures();1248for (const feature of editorFeatures) {1249try {1250instantiationService.createInstance(feature);1251} catch (err) {1252onUnexpectedError(err);1253}1254}12551256onDidInitialize.fire();12571258return instantiationService;1259}12601261/**1262* Executes callback once services are initialized.1263*/1264export function withServices(callback: () => IDisposable): IDisposable {1265if (initialized) {1266return callback();1267}12681269const disposable = new DisposableStore();12701271const listener = disposable.add(onDidInitialize.event(() => {1272listener.dispose();1273disposable.add(callback());1274}));12751276return disposable;1277}12781279}128012811282