standaloneServices.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  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. import { Disposable } from '../../../base/common/lifecycle.js';
  6. import { IBulkEditService } from '../../browser/services/bulkEditService.js';
  7. import { ICodeEditorService } from '../../browser/services/codeEditorService.js';
  8. import { IEditorWorkerService } from '../../common/services/editorWorkerService.js';
  9. import { EditorWorkerServiceImpl } from '../../common/services/editorWorkerServiceImpl.js';
  10. import { IModeService } from '../../common/services/modeService.js';
  11. import { ModeServiceImpl } from '../../common/services/modeServiceImpl.js';
  12. import { IModelService } from '../../common/services/modelService.js';
  13. import { ModelServiceImpl } from '../../common/services/modelServiceImpl.js';
  14. import { ITextResourceConfigurationService, ITextResourcePropertiesService } from '../../common/services/textResourceConfigurationService.js';
  15. import { SimpleBulkEditService, SimpleConfigurationService, SimpleDialogService, SimpleNotificationService, SimpleEditorProgressService, SimpleResourceConfigurationService, SimpleResourcePropertiesService, SimpleUriLabelService, SimpleWorkspaceContextService, StandaloneCommandService, StandaloneKeybindingService, StandaloneTelemetryService, SimpleLayoutService, SimpleWorkspaceTrustManagementService } from './simpleServices.js';
  16. import { StandaloneCodeEditorServiceImpl } from './standaloneCodeServiceImpl.js';
  17. import { StandaloneThemeServiceImpl } from './standaloneThemeServiceImpl.js';
  18. import { IStandaloneThemeService } from '../common/standaloneThemeService.js';
  19. import { IMenuService } from '../../../platform/actions/common/actions.js';
  20. import { ICommandService } from '../../../platform/commands/common/commands.js';
  21. import { IConfigurationService } from '../../../platform/configuration/common/configuration.js';
  22. import { ContextKeyService } from '../../../platform/contextkey/browser/contextKeyService.js';
  23. import { IContextKeyService } from '../../../platform/contextkey/common/contextkey.js';
  24. import { ContextMenuService } from '../../../platform/contextview/browser/contextMenuService.js';
  25. import { IContextMenuService, IContextViewService } from '../../../platform/contextview/browser/contextView.js';
  26. import { ContextViewService } from '../../../platform/contextview/browser/contextViewService.js';
  27. import { IDialogService } from '../../../platform/dialogs/common/dialogs.js';
  28. import { IInstantiationService, createDecorator } from '../../../platform/instantiation/common/instantiation.js';
  29. import { InstantiationService } from '../../../platform/instantiation/common/instantiationService.js';
  30. import { ServiceCollection } from '../../../platform/instantiation/common/serviceCollection.js';
  31. import { IKeybindingService } from '../../../platform/keybinding/common/keybinding.js';
  32. import { ILabelService } from '../../../platform/label/common/label.js';
  33. import { IListService, ListService } from '../../../platform/list/browser/listService.js';
  34. import { ConsoleLogger, ILogService, LogService } from '../../../platform/log/common/log.js';
  35. import { MarkerService } from '../../../platform/markers/common/markerService.js';
  36. import { IMarkerService } from '../../../platform/markers/common/markers.js';
  37. import { INotificationService } from '../../../platform/notification/common/notification.js';
  38. import { IEditorProgressService } from '../../../platform/progress/common/progress.js';
  39. import { IStorageService, InMemoryStorageService } from '../../../platform/storage/common/storage.js';
  40. import { ITelemetryService } from '../../../platform/telemetry/common/telemetry.js';
  41. import { IThemeService } from '../../../platform/theme/common/themeService.js';
  42. import { IWorkspaceContextService } from '../../../platform/workspace/common/workspace.js';
  43. import { MenuService } from '../../../platform/actions/common/menuService.js';
  44. import { IMarkerDecorationsService } from '../../common/services/markersDecorationService.js';
  45. import { MarkerDecorationsService } from '../../common/services/markerDecorationsServiceImpl.js';
  46. import { IAccessibilityService } from '../../../platform/accessibility/common/accessibility.js';
  47. import { ILayoutService } from '../../../platform/layout/browser/layoutService.js';
  48. import { getSingletonServiceDescriptors } from '../../../platform/instantiation/common/extensions.js';
  49. import { AccessibilityService } from '../../../platform/accessibility/browser/accessibilityService.js';
  50. import { IClipboardService } from '../../../platform/clipboard/common/clipboardService.js';
  51. import { BrowserClipboardService } from '../../../platform/clipboard/browser/clipboardService.js';
  52. import { IUndoRedoService } from '../../../platform/undoRedo/common/undoRedo.js';
  53. import { UndoRedoService } from '../../../platform/undoRedo/common/undoRedoService.js';
  54. import { StandaloneQuickInputServiceImpl } from './quickInput/standaloneQuickInputServiceImpl.js';
  55. import { IQuickInputService } from '../../../platform/quickinput/common/quickInput.js';
  56. import { ILanguageConfigurationService, LanguageConfigurationService } from '../../common/modes/languageConfigurationRegistry.js';
  57. import { IWorkspaceTrustManagementService } from '../../../platform/workspace/common/workspaceTrust.js';
  58. export var StaticServices;
  59. (function (StaticServices) {
  60. const _serviceCollection = new ServiceCollection();
  61. class LazyStaticService {
  62. constructor(serviceId, factory) {
  63. this._serviceId = serviceId;
  64. this._factory = factory;
  65. this._value = null;
  66. }
  67. get id() { return this._serviceId; }
  68. get(overrides) {
  69. if (!this._value) {
  70. if (overrides) {
  71. this._value = overrides[this._serviceId.toString()];
  72. }
  73. if (!this._value) {
  74. this._value = this._factory(overrides);
  75. }
  76. if (!this._value) {
  77. throw new Error('Service ' + this._serviceId + ' is missing!');
  78. }
  79. _serviceCollection.set(this._serviceId, this._value);
  80. }
  81. return this._value;
  82. }
  83. }
  84. StaticServices.LazyStaticService = LazyStaticService;
  85. let _all = [];
  86. function define(serviceId, factory) {
  87. let r = new LazyStaticService(serviceId, factory);
  88. _all.push(r);
  89. return r;
  90. }
  91. function init(overrides) {
  92. // Create a fresh service collection
  93. let result = new ServiceCollection();
  94. // make sure to add all services that use `registerSingleton`
  95. for (const [id, descriptor] of getSingletonServiceDescriptors()) {
  96. result.set(id, descriptor);
  97. }
  98. // Initialize the service collection with the overrides
  99. for (let serviceId in overrides) {
  100. if (overrides.hasOwnProperty(serviceId)) {
  101. result.set(createDecorator(serviceId), overrides[serviceId]);
  102. }
  103. }
  104. // Make sure the same static services are present in all service collections
  105. _all.forEach(service => result.set(service.id, service.get(overrides)));
  106. // Ensure the collection gets the correct instantiation service
  107. let instantiationService = new InstantiationService(result, true);
  108. result.set(IInstantiationService, instantiationService);
  109. return [result, instantiationService];
  110. }
  111. StaticServices.init = init;
  112. StaticServices.instantiationService = define(IInstantiationService, () => new InstantiationService(_serviceCollection, true));
  113. const configurationServiceImpl = new SimpleConfigurationService();
  114. StaticServices.configurationService = define(IConfigurationService, () => configurationServiceImpl);
  115. StaticServices.resourceConfigurationService = define(ITextResourceConfigurationService, () => new SimpleResourceConfigurationService(configurationServiceImpl));
  116. StaticServices.resourcePropertiesService = define(ITextResourcePropertiesService, () => new SimpleResourcePropertiesService(configurationServiceImpl));
  117. StaticServices.contextService = define(IWorkspaceContextService, () => new SimpleWorkspaceContextService());
  118. StaticServices.labelService = define(ILabelService, () => new SimpleUriLabelService());
  119. StaticServices.telemetryService = define(ITelemetryService, () => new StandaloneTelemetryService());
  120. StaticServices.dialogService = define(IDialogService, () => new SimpleDialogService());
  121. StaticServices.notificationService = define(INotificationService, () => new SimpleNotificationService());
  122. StaticServices.markerService = define(IMarkerService, () => new MarkerService());
  123. StaticServices.modeService = define(IModeService, (o) => new ModeServiceImpl());
  124. StaticServices.standaloneThemeService = define(IStandaloneThemeService, () => new StandaloneThemeServiceImpl());
  125. StaticServices.logService = define(ILogService, () => new LogService(new ConsoleLogger()));
  126. StaticServices.undoRedoService = define(IUndoRedoService, (o) => new UndoRedoService(StaticServices.dialogService.get(o), StaticServices.notificationService.get(o)));
  127. StaticServices.languageConfigurationService = define(ILanguageConfigurationService, (o) => new LanguageConfigurationService(StaticServices.configurationService.get(o), StaticServices.modeService.get(o)));
  128. StaticServices.modelService = define(IModelService, (o) => new ModelServiceImpl(StaticServices.configurationService.get(o), StaticServices.resourcePropertiesService.get(o), StaticServices.standaloneThemeService.get(o), StaticServices.logService.get(o), StaticServices.undoRedoService.get(o), StaticServices.modeService.get(o), StaticServices.languageConfigurationService.get(o)));
  129. StaticServices.markerDecorationsService = define(IMarkerDecorationsService, (o) => new MarkerDecorationsService(StaticServices.modelService.get(o), StaticServices.markerService.get(o)));
  130. StaticServices.contextKeyService = define(IContextKeyService, (o) => new ContextKeyService(StaticServices.configurationService.get(o)));
  131. StaticServices.codeEditorService = define(ICodeEditorService, (o) => new StandaloneCodeEditorServiceImpl(null, StaticServices.contextKeyService.get(o), StaticServices.standaloneThemeService.get(o)));
  132. StaticServices.editorProgressService = define(IEditorProgressService, () => new SimpleEditorProgressService());
  133. StaticServices.storageService = define(IStorageService, () => new InMemoryStorageService());
  134. StaticServices.editorWorkerService = define(IEditorWorkerService, (o) => new EditorWorkerServiceImpl(StaticServices.modelService.get(o), StaticServices.resourceConfigurationService.get(o), StaticServices.logService.get(o)));
  135. })(StaticServices || (StaticServices = {}));
  136. export class DynamicStandaloneServices extends Disposable {
  137. constructor(domElement, overrides) {
  138. super();
  139. const [_serviceCollection, _instantiationService] = StaticServices.init(overrides);
  140. this._serviceCollection = _serviceCollection;
  141. this._instantiationService = _instantiationService;
  142. const configurationService = this.get(IConfigurationService);
  143. const notificationService = this.get(INotificationService);
  144. const telemetryService = this.get(ITelemetryService);
  145. const themeService = this.get(IThemeService);
  146. const logService = this.get(ILogService);
  147. const contextKeyService = this.get(IContextKeyService);
  148. let ensure = (serviceId, factory) => {
  149. let value = null;
  150. if (overrides) {
  151. value = overrides[serviceId.toString()];
  152. }
  153. if (!value) {
  154. value = factory();
  155. }
  156. this._serviceCollection.set(serviceId, value);
  157. return value;
  158. };
  159. ensure(IAccessibilityService, () => new AccessibilityService(contextKeyService, configurationService));
  160. ensure(IListService, () => new ListService(themeService));
  161. let commandService = ensure(ICommandService, () => new StandaloneCommandService(this._instantiationService));
  162. let keybindingService = ensure(IKeybindingService, () => this._register(new StandaloneKeybindingService(contextKeyService, commandService, telemetryService, notificationService, logService, domElement)));
  163. let layoutService = ensure(ILayoutService, () => new SimpleLayoutService(StaticServices.codeEditorService.get(ICodeEditorService), domElement));
  164. ensure(IQuickInputService, () => new StandaloneQuickInputServiceImpl(_instantiationService, StaticServices.codeEditorService.get(ICodeEditorService)));
  165. let contextViewService = ensure(IContextViewService, () => this._register(new ContextViewService(layoutService)));
  166. ensure(IClipboardService, () => new BrowserClipboardService());
  167. ensure(IContextMenuService, () => {
  168. const contextMenuService = new ContextMenuService(telemetryService, notificationService, contextViewService, keybindingService, themeService);
  169. contextMenuService.configure({ blockMouse: false }); // we do not want that in the standalone editor
  170. return this._register(contextMenuService);
  171. });
  172. ensure(IMenuService, () => new MenuService(commandService));
  173. ensure(IBulkEditService, () => new SimpleBulkEditService(StaticServices.modelService.get(IModelService)));
  174. ensure(IWorkspaceTrustManagementService, () => new SimpleWorkspaceTrustManagementService());
  175. }
  176. get(serviceId) {
  177. let r = this._serviceCollection.get(serviceId);
  178. if (!r) {
  179. throw new Error('Missing service ' + serviceId);
  180. }
  181. return r;
  182. }
  183. set(serviceId, instance) {
  184. this._serviceCollection.set(serviceId, instance);
  185. }
  186. has(serviceId) {
  187. return this._serviceCollection.has(serviceId);
  188. }
  189. }