@theia/plugin-ext 1.29.0-next.4 → 1.29.0-next.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/lib/common/plugin-api-rpc-model.d.ts +7 -0
  2. package/lib/common/plugin-api-rpc-model.d.ts.map +1 -1
  3. package/lib/common/plugin-api-rpc-model.js.map +1 -1
  4. package/lib/common/plugin-api-rpc.d.ts +21 -17
  5. package/lib/common/plugin-api-rpc.d.ts.map +1 -1
  6. package/lib/common/plugin-api-rpc.js.map +1 -1
  7. package/lib/common/rpc-protocol.d.ts +1 -1
  8. package/lib/common/rpc-protocol.d.ts.map +1 -1
  9. package/lib/common/rpc-protocol.js +3 -3
  10. package/lib/common/rpc-protocol.js.map +1 -1
  11. package/lib/main/browser/authentication-main.d.ts +3 -6
  12. package/lib/main/browser/authentication-main.d.ts.map +1 -1
  13. package/lib/main/browser/authentication-main.js +16 -37
  14. package/lib/main/browser/authentication-main.js.map +1 -1
  15. package/lib/main/browser/comments/comment-thread-widget.d.ts +2 -0
  16. package/lib/main/browser/comments/comment-thread-widget.d.ts.map +1 -1
  17. package/lib/main/browser/comments/comment-thread-widget.js +4 -3
  18. package/lib/main/browser/comments/comment-thread-widget.js.map +1 -1
  19. package/lib/main/browser/debug/debug-main.d.ts.map +1 -1
  20. package/lib/main/browser/debug/debug-main.js +20 -10
  21. package/lib/main/browser/debug/debug-main.js.map +1 -1
  22. package/lib/main/browser/debug/plugin-debug-session-factory.d.ts +4 -4
  23. package/lib/main/browser/debug/plugin-debug-session-factory.d.ts.map +1 -1
  24. package/lib/main/browser/debug/plugin-debug-session-factory.js.map +1 -1
  25. package/lib/main/browser/languages-main.d.ts +6 -1
  26. package/lib/main/browser/languages-main.d.ts.map +1 -1
  27. package/lib/main/browser/languages-main.js +15 -1
  28. package/lib/main/browser/languages-main.js.map +1 -1
  29. package/lib/main/browser/plugin-ext-frontend-module.d.ts +1 -0
  30. package/lib/main/browser/plugin-ext-frontend-module.d.ts.map +1 -1
  31. package/lib/main/browser/plugin-ext-frontend-module.js +1 -0
  32. package/lib/main/browser/plugin-ext-frontend-module.js.map +1 -1
  33. package/lib/main/browser/preference-registry-main.d.ts +4 -3
  34. package/lib/main/browser/preference-registry-main.d.ts.map +1 -1
  35. package/lib/main/browser/preference-registry-main.js +26 -14
  36. package/lib/main/browser/preference-registry-main.js.map +1 -1
  37. package/lib/main/browser/theme-icon-override.d.ts +2 -0
  38. package/lib/main/browser/theme-icon-override.d.ts.map +1 -0
  39. package/lib/main/browser/theme-icon-override.js +217 -0
  40. package/lib/main/browser/theme-icon-override.js.map +1 -0
  41. package/lib/main/browser/view/plugin-view-registry.d.ts.map +1 -1
  42. package/lib/main/browser/view/plugin-view-registry.js +0 -1
  43. package/lib/main/browser/view/plugin-view-registry.js.map +1 -1
  44. package/lib/main/browser/view/plugin-view-widget.d.ts +9 -8
  45. package/lib/main/browser/view/plugin-view-widget.d.ts.map +1 -1
  46. package/lib/main/browser/view/plugin-view-widget.js +7 -4
  47. package/lib/main/browser/view/plugin-view-widget.js.map +1 -1
  48. package/lib/main/browser/view/tree-view-decorator-service.d.ts +1 -1
  49. package/lib/main/browser/view/tree-view-decorator-service.d.ts.map +1 -1
  50. package/lib/main/browser/view/tree-view-decorator-service.js +1 -1
  51. package/lib/main/browser/view/tree-view-decorator-service.js.map +1 -1
  52. package/lib/main/node/plugin-ext-backend-module.d.ts +1 -1
  53. package/lib/main/node/plugin-ext-backend-module.d.ts.map +1 -1
  54. package/lib/main/node/plugin-ext-backend-module.js +4 -1
  55. package/lib/main/node/plugin-ext-backend-module.js.map +1 -1
  56. package/lib/main/node/plugin-localization-backend-contribution.d.ts +10 -0
  57. package/lib/main/node/plugin-localization-backend-contribution.d.ts.map +1 -0
  58. package/lib/main/node/plugin-localization-backend-contribution.js +59 -0
  59. package/lib/main/node/plugin-localization-backend-contribution.js.map +1 -0
  60. package/lib/plugin/authentication-ext.d.ts +1 -11
  61. package/lib/plugin/authentication-ext.d.ts.map +1 -1
  62. package/lib/plugin/authentication-ext.js +3 -55
  63. package/lib/plugin/authentication-ext.js.map +1 -1
  64. package/lib/plugin/languages/code-action.d.ts.map +1 -1
  65. package/lib/plugin/languages/code-action.js +8 -9
  66. package/lib/plugin/languages/code-action.js.map +1 -1
  67. package/lib/plugin/languages/document-highlight.d.ts.map +1 -1
  68. package/lib/plugin/languages/document-highlight.js +0 -1
  69. package/lib/plugin/languages/document-highlight.js.map +1 -1
  70. package/lib/plugin/languages/evaluatable-expression.d.ts +12 -0
  71. package/lib/plugin/languages/evaluatable-expression.d.ts.map +1 -0
  72. package/lib/plugin/languages/evaluatable-expression.js +41 -0
  73. package/lib/plugin/languages/evaluatable-expression.js.map +1 -0
  74. package/lib/plugin/languages/util.d.ts +2 -2
  75. package/lib/plugin/languages/util.d.ts.map +1 -1
  76. package/lib/plugin/languages/util.js +0 -2
  77. package/lib/plugin/languages/util.js.map +1 -1
  78. package/lib/plugin/languages.d.ts +3 -1
  79. package/lib/plugin/languages.d.ts.map +1 -1
  80. package/lib/plugin/languages.js +11 -0
  81. package/lib/plugin/languages.js.map +1 -1
  82. package/lib/plugin/plugin-context.d.ts.map +1 -1
  83. package/lib/plugin/plugin-context.js +7 -35
  84. package/lib/plugin/plugin-context.js.map +1 -1
  85. package/lib/plugin/plugin-storage.d.ts +1 -0
  86. package/lib/plugin/plugin-storage.d.ts.map +1 -1
  87. package/lib/plugin/plugin-storage.js +3 -0
  88. package/lib/plugin/plugin-storage.js.map +1 -1
  89. package/lib/plugin/preference-registry.d.ts +15 -2
  90. package/lib/plugin/preference-registry.d.ts.map +1 -1
  91. package/lib/plugin/preference-registry.js +105 -62
  92. package/lib/plugin/preference-registry.js.map +1 -1
  93. package/lib/plugin/preference-registry.spec.js +206 -35
  94. package/lib/plugin/preference-registry.spec.js.map +1 -1
  95. package/lib/plugin/quick-open.d.ts +5 -1
  96. package/lib/plugin/quick-open.d.ts.map +1 -1
  97. package/lib/plugin/quick-open.js +27 -4
  98. package/lib/plugin/quick-open.js.map +1 -1
  99. package/lib/plugin/type-converters.d.ts +7 -6
  100. package/lib/plugin/type-converters.d.ts.map +1 -1
  101. package/lib/plugin/type-converters.js +54 -55
  102. package/lib/plugin/type-converters.js.map +1 -1
  103. package/lib/plugin/types-impl.d.ts +13 -3
  104. package/lib/plugin/types-impl.d.ts.map +1 -1
  105. package/lib/plugin/types-impl.js +28 -10
  106. package/lib/plugin/types-impl.js.map +1 -1
  107. package/lib/plugin-ext-backend-electron-module.js +2 -2
  108. package/lib/plugin-ext-backend-electron-module.js.map +1 -1
  109. package/lib/plugin-ext-backend-module.js +2 -2
  110. package/lib/plugin-ext-backend-module.js.map +1 -1
  111. package/package.json +24 -24
  112. package/src/common/plugin-api-rpc-model.ts +10 -0
  113. package/src/common/plugin-api-rpc.ts +21 -17
  114. package/src/common/rpc-protocol.ts +5 -5
  115. package/src/main/browser/authentication-main.ts +17 -42
  116. package/src/main/browser/comments/comment-thread-widget.tsx +5 -3
  117. package/src/main/browser/debug/debug-main.ts +19 -11
  118. package/src/main/browser/debug/plugin-debug-session-factory.ts +3 -3
  119. package/src/main/browser/languages-main.ts +23 -1
  120. package/src/main/browser/plugin-ext-frontend-module.ts +1 -0
  121. package/src/main/browser/preference-registry-main.ts +23 -14
  122. package/src/main/browser/style/tree.css +2 -0
  123. package/src/main/browser/theme-icon-override.ts +221 -0
  124. package/src/main/browser/view/plugin-view-registry.ts +0 -1
  125. package/src/main/browser/view/plugin-view-widget.ts +14 -11
  126. package/src/main/browser/view/tree-view-decorator-service.ts +2 -2
  127. package/src/main/node/plugin-ext-backend-module.ts +6 -1
  128. package/src/main/node/plugin-localization-backend-contribution.ts +42 -0
  129. package/src/plugin/authentication-ext.ts +3 -70
  130. package/src/plugin/languages/code-action.ts +9 -12
  131. package/src/plugin/languages/document-highlight.ts +1 -2
  132. package/src/plugin/languages/evaluatable-expression.ts +47 -0
  133. package/src/plugin/languages/util.ts +2 -4
  134. package/src/plugin/languages.ts +15 -0
  135. package/src/plugin/plugin-context.ts +13 -42
  136. package/src/plugin/plugin-storage.ts +4 -0
  137. package/src/plugin/preference-registry.spec.ts +246 -39
  138. package/src/plugin/preference-registry.ts +107 -71
  139. package/src/plugin/quick-open.ts +32 -6
  140. package/src/plugin/type-converters.ts +58 -59
  141. package/src/plugin/types-impl.ts +36 -14
  142. package/src/plugin-ext-backend-electron-module.ts +2 -2
  143. package/src/plugin-ext-backend-module.ts +2 -2
  144. package/lib/plugin/preferences/configuration.d.ts +0 -35
  145. package/lib/plugin/preferences/configuration.d.ts.map +0 -1
  146. package/lib/plugin/preferences/configuration.js +0 -137
  147. package/lib/plugin/preferences/configuration.js.map +0 -1
  148. package/lib/plugin/preferences/configuration.spec.d.ts +0 -2
  149. package/lib/plugin/preferences/configuration.spec.d.ts.map +0 -1
  150. package/lib/plugin/preferences/configuration.spec.js +0 -178
  151. package/lib/plugin/preferences/configuration.spec.js.map +0 -1
  152. package/src/plugin/preferences/configuration.spec.ts +0 -292
  153. package/src/plugin/preferences/configuration.ts +0 -167
@@ -21,7 +21,7 @@
21
21
  // code copied and modified from https://github.com/microsoft/vscode/blob/1.47.3/src/vs/workbench/api/browser/mainThreadAuthentication.ts
22
22
 
23
23
  import { interfaces } from '@theia/core/shared/inversify';
24
- import { AuthenticationExt, AuthenticationMain, PluginManagerExt, MAIN_RPC_CONTEXT } from '../../common/plugin-api-rpc';
24
+ import { AuthenticationExt, AuthenticationMain, MAIN_RPC_CONTEXT } from '../../common/plugin-api-rpc';
25
25
  import { RPCProtocol } from '../../common/rpc-protocol';
26
26
  import { MessageService } from '@theia/core/lib/common/message-service';
27
27
  import { Dialog, StorageService } from '@theia/core/lib/browser';
@@ -43,28 +43,17 @@ export class AuthenticationMainImpl implements AuthenticationMain {
43
43
  private readonly storageService: StorageService;
44
44
  private readonly authenticationService: AuthenticationService;
45
45
  private readonly quickPickService: QuickPickService;
46
- private readonly extensionService: PluginManagerExt;
47
46
  constructor(rpc: RPCProtocol, container: interfaces.Container) {
48
47
  this.proxy = rpc.getProxy(MAIN_RPC_CONTEXT.AUTHENTICATION_EXT);
49
48
  this.messageService = container.get(MessageService);
50
49
  this.storageService = container.get(StorageService);
51
50
  this.authenticationService = container.get(AuthenticationService);
52
51
  this.quickPickService = container.get(QuickPickService);
53
- this.extensionService = rpc.getProxy(MAIN_RPC_CONTEXT.HOSTED_PLUGIN_MANAGER_EXT);
54
52
 
55
53
  this.authenticationService.onDidChangeSessions(e => {
56
- this.proxy.$onDidChangeAuthenticationSessions(e.providerId, e.label);
57
- });
58
- this.authenticationService.onDidRegisterAuthenticationProvider(info => {
59
- this.proxy.$onDidChangeAuthenticationProviders([info], []);
60
- });
61
- this.authenticationService.onDidUnregisterAuthenticationProvider(providerId => {
62
- this.proxy.$onDidChangeAuthenticationProviders([], [providerId]);
54
+ this.proxy.$onDidChangeAuthenticationSessions({ id: e.providerId, label: e.label });
63
55
  });
64
56
  }
65
- $getProviderIds(): Promise<string[]> {
66
- return Promise.resolve(this.authenticationService.getProviderIds());
67
- }
68
57
 
69
58
  async $registerAuthenticationProvider(id: string, label: string, supportsMultipleAccounts: boolean): Promise<void> {
70
59
  const provider = new AuthenticationProviderImpl(this.proxy, id, label, supportsMultipleAccounts, this.storageService, this.messageService);
@@ -230,15 +219,7 @@ export class AuthenticationMainImpl implements AuthenticationMain {
230
219
  this.storageService.setData(`authentication-session-${extensionName}-${providerId}`, sessionId);
231
220
  }
232
221
 
233
- $ensureProvider(id: string): Promise<void> {
234
- return this.extensionService.$activateByEvent(getAuthenticationProviderActivationEvent(id));
235
- }
236
-
237
- $removeSession(providerId: string, sessionId: string): Promise<void> {
238
- return this.authenticationService.logout(providerId, sessionId);
239
- }
240
-
241
- $sendDidChangeSessions(providerId: string, event: theia.AuthenticationProviderAuthenticationSessionsChangeEvent): void {
222
+ $onDidChangeSessions(providerId: string, event: theia.AuthenticationProviderAuthenticationSessionsChangeEvent): void {
242
223
  this.authenticationService.updateSessions(providerId, event);
243
224
  }
244
225
  }
@@ -272,8 +253,10 @@ interface AccountUsage {
272
253
  }
273
254
 
274
255
  export class AuthenticationProviderImpl implements AuthenticationProvider {
275
- private accounts = new Map<string, string[]>(); // Map account name to session ids
276
- private sessions = new Map<string, string>(); // Map account id to name
256
+ /** map from account name to session ids */
257
+ private accounts = new Map<string, string[]>();
258
+ /** map from session id to account name */
259
+ private sessions = new Map<string, string>();
277
260
 
278
261
  readonly onDidChangeSessions: theia.Event<theia.AuthenticationProviderAuthenticationSessionsChangeEvent>;
279
262
 
@@ -313,7 +296,7 @@ export class AuthenticationProviderImpl implements AuthenticationProvider {
313
296
  Dialog.CANCEL);
314
297
 
315
298
  if (result && result === nls.localizeByDefault('Sign Out') && sessionsForAccount) {
316
- sessionsForAccount.forEach(sessionId => this.logout(sessionId));
299
+ sessionsForAccount.forEach(sessionId => this.removeSession(sessionId));
317
300
  removeAccountUsage(this.storageService, this.id, accountName);
318
301
  }
319
302
  }
@@ -325,10 +308,10 @@ export class AuthenticationProviderImpl implements AuthenticationProvider {
325
308
  async updateSessionItems(event: theia.AuthenticationProviderAuthenticationSessionsChangeEvent): Promise<void> {
326
309
  const { added, removed } = event;
327
310
  const session = await this.proxy.$getSessions(this.id);
328
- const addedSessions = session.filter(s => added.some(addedSession => this.getSessionId(addedSession) === s.id));
311
+ const addedSessions = added ? session.filter(s => added.some(addedSession => addedSession.id === s.id)) : [];
329
312
 
330
- removed.forEach(removedSession => {
331
- const sessionId = this.getSessionId(removedSession);
313
+ removed?.forEach(removedSession => {
314
+ const sessionId = removedSession.id;
332
315
  if (sessionId) {
333
316
  const accountName = this.sessions.get(sessionId);
334
317
  if (accountName) {
@@ -347,29 +330,21 @@ export class AuthenticationProviderImpl implements AuthenticationProvider {
347
330
  addedSessions.forEach(s => this.registerSession(s));
348
331
  }
349
332
 
350
- login(scopes: string[]): Promise<theia.AuthenticationSession> {
351
- return this.proxy.$createSession(this.id, scopes);
333
+ async login(scopes: string[]): Promise<theia.AuthenticationSession> {
334
+ return this.createSession(scopes);
352
335
  }
353
336
 
354
337
  async logout(sessionId: string): Promise<void> {
355
- await this.proxy.$removeSession(this.id, sessionId);
356
- this.messageService.info('Successfully signed out.');
338
+ return this.removeSession(sessionId);
357
339
  }
358
340
 
359
341
  createSession(scopes: string[]): Thenable<theia.AuthenticationSession> {
360
- return this.login(scopes);
342
+ return this.proxy.$createSession(this.id, scopes);
361
343
  }
362
344
 
363
345
  removeSession(sessionId: string): Thenable<void> {
364
- return this.logout(sessionId);
365
- }
366
-
367
- // utility method to be backwards compatible with the old AuthenticationProviderAuthenticationSessionsChangeEvent containing only the session id string
368
- private getSessionId(obj: string | theia.AuthenticationSession | undefined): string | undefined {
369
- if (!obj || typeof obj === 'string') {
370
- return obj;
371
- }
372
- return obj.id;
346
+ return this.proxy.$removeSession(this.id, sessionId)
347
+ .then(() => { this.messageService.info('Successfully signed out.'); });
373
348
  }
374
349
  }
375
350
 
@@ -22,7 +22,6 @@ import {
22
22
  } from '../../../common/plugin-api-rpc-model';
23
23
  import { CommentGlyphWidget } from './comment-glyph-widget';
24
24
  import { BaseWidget, DISABLED_CLASS } from '@theia/core/lib/browser';
25
- import * as ReactDOM from '@theia/core/shared/react-dom';
26
25
  import * as React from '@theia/core/shared/react';
27
26
  import { MouseTargetType } from '@theia/editor/lib/browser';
28
27
  import { CommentsService } from './comments-service';
@@ -36,6 +35,7 @@ import {
36
35
  import { CommentsContextKeyService } from './comments-context-key-service';
37
36
  import { RefObject } from '@theia/core/shared/react';
38
37
  import * as monaco from '@theia/monaco-editor-core';
38
+ import { createRoot, Root } from '@theia/core/shared/react-dom/client';
39
39
 
40
40
  /*---------------------------------------------------------------------------------------------
41
41
  * Copyright (c) Microsoft Corporation. All rights reserved.
@@ -50,6 +50,7 @@ export const COMMENT_TITLE: MenuPath = ['comment-title-menu'];
50
50
  export class CommentThreadWidget extends BaseWidget {
51
51
 
52
52
  protected readonly zoneWidget: MonacoEditorZoneWidget;
53
+ protected readonly containerNodeRoot: Root;
53
54
  protected readonly commentGlyphWidget: CommentGlyphWidget;
54
55
  protected readonly contextMenu: CompositeMenuNode;
55
56
  protected readonly commentFormRef: RefObject<CommentForm> = React.createRef<CommentForm>();
@@ -67,6 +68,7 @@ export class CommentThreadWidget extends BaseWidget {
67
68
  ) {
68
69
  super();
69
70
  this.toDispose.push(this.zoneWidget = new MonacoEditorZoneWidget(editor));
71
+ this.containerNodeRoot = createRoot(this.zoneWidget.containerNode);
70
72
  this.toDispose.push(this.commentGlyphWidget = new CommentGlyphWidget(editor));
71
73
  this.toDispose.push(this._commentThread.onDidChangeCollapsibleState(state => {
72
74
  if (state === CommentThreadCollapsibleState.Expanded && !this.isExpanded) {
@@ -255,7 +257,7 @@ export class CommentThreadWidget extends BaseWidget {
255
257
 
256
258
  protected render(): void {
257
259
  const headHeight = Math.ceil(this.zoneWidget.editor.getOption(monaco.editor.EditorOption.lineHeight) * 1.2);
258
- ReactDOM.render(<div className={'review-widget'}>
260
+ this.containerNodeRoot.render(<div className={'review-widget'}>
259
261
  <div className={'head'} style={{ height: headHeight, lineHeight: `${headHeight}px` }}>
260
262
  <div className={'review-title'}>
261
263
  <span className={'filename'}>{this.getThreadLabel()}</span>
@@ -295,7 +297,7 @@ export class CommentThreadWidget extends BaseWidget {
295
297
  ref={this.commentFormRef}
296
298
  />
297
299
  </div>
298
- </div>, this.zoneWidget.containerNode);
300
+ </div>);
299
301
  }
300
302
  }
301
303
 
@@ -55,6 +55,7 @@ import { ContributionProvider } from '@theia/core/lib/common';
55
55
  import { DebugContribution } from '@theia/debug/lib/browser/debug-contribution';
56
56
  import { ConnectionImpl } from '../../../common/connection';
57
57
  import { WorkspaceService } from '@theia/workspace/lib/browser';
58
+ import { DebugSessionOptions as TheiaDebugSessionOptions } from '@theia/debug/lib/browser/debug-session-options';
58
59
 
59
60
  export class DebugMainImpl implements DebugMain, Disposable {
60
61
  private readonly debugExt: DebugExt;
@@ -294,29 +295,36 @@ export class DebugMainImpl implements DebugMain, Disposable {
294
295
  }
295
296
 
296
297
  async $startDebugging(folder: WorkspaceFolder | undefined, nameOrConfiguration: string | DebugConfiguration, options: DebugSessionOptions): Promise<boolean> {
297
- let configuration: DebugConfiguration | undefined;
298
-
298
+ // search for matching options
299
+ let sessionOptions: TheiaDebugSessionOptions | undefined;
299
300
  if (typeof nameOrConfiguration === 'string') {
300
301
  for (const configOptions of this.configurationManager.all) {
301
- if (configOptions.configuration.name === nameOrConfiguration) {
302
- configuration = configOptions.configuration;
302
+ if (configOptions.name === nameOrConfiguration) {
303
+ sessionOptions = configOptions;
303
304
  }
304
305
  }
305
306
  } else {
306
- configuration = nameOrConfiguration;
307
+ sessionOptions = {
308
+ name: nameOrConfiguration.name,
309
+ configuration: nameOrConfiguration
310
+ };
307
311
  }
308
312
 
309
- if (!configuration) {
313
+ if (!sessionOptions) {
310
314
  console.error(`There is no debug configuration for ${nameOrConfiguration}`);
311
315
  return false;
312
316
  }
313
317
 
314
- const debugConfiguration = { ...configuration, ...options };
315
- const session = await this.sessionManager.start({
316
- configuration: debugConfiguration,
317
- workspaceFolderUri: folder && Uri.revive(folder.uri).toString()
318
- });
318
+ // translate given extra data
319
+ const workspaceFolderUri = folder && Uri.revive(folder.uri).toString();
320
+ if (TheiaDebugSessionOptions.isConfiguration(sessionOptions)) {
321
+ sessionOptions = { ...sessionOptions, configuration: { ...sessionOptions.configuration, ...options }, workspaceFolderUri };
322
+ } else {
323
+ sessionOptions = { ...sessionOptions, ...options, workspaceFolderUri };
324
+ }
319
325
 
326
+ // start options
327
+ const session = await this.sessionManager.start(sessionOptions);
320
328
  return !!session;
321
329
  }
322
330
 
@@ -22,7 +22,7 @@ import { LabelProvider } from '@theia/core/lib/browser/label-provider';
22
22
  import { MessageClient } from '@theia/core/lib/common/message-service-protocol';
23
23
  import { OutputChannelManager } from '@theia/output/lib/browser/output-channel';
24
24
  import { DebugPreferences } from '@theia/debug/lib/browser/debug-preferences';
25
- import { DebugSessionOptions } from '@theia/debug/lib/browser/debug-session-options';
25
+ import { DebugConfigurationSessionOptions } from '@theia/debug/lib/browser/debug-session-options';
26
26
  import { DebugSession } from '@theia/debug/lib/browser/debug-session';
27
27
  import { DebugSessionConnection } from '@theia/debug/lib/browser/debug-session-connection';
28
28
  import { TerminalWidgetOptions, TerminalWidget } from '@theia/terminal/lib/browser/base/terminal-widget';
@@ -36,7 +36,7 @@ import { PluginChannel } from '../../../common/connection';
36
36
  export class PluginDebugSession extends DebugSession {
37
37
  constructor(
38
38
  override readonly id: string,
39
- override readonly options: DebugSessionOptions,
39
+ override readonly options: DebugConfigurationSessionOptions,
40
40
  override readonly parentSession: DebugSession | undefined,
41
41
  protected override readonly connection: DebugSessionConnection,
42
42
  protected override readonly terminalServer: TerminalService,
@@ -80,7 +80,7 @@ export class PluginDebugSessionFactory extends DefaultDebugSessionFactory {
80
80
  super();
81
81
  }
82
82
 
83
- override get(sessionId: string, options: DebugSessionOptions, parentSession?: DebugSession): DebugSession {
83
+ override get(sessionId: string, options: DebugConfigurationSessionOptions, parentSession?: DebugSession): DebugSession {
84
84
  const connection = new DebugSessionConnection(
85
85
  sessionId,
86
86
  this.connectionFactory,
@@ -66,6 +66,9 @@ import * as MonacoPath from '@theia/monaco-editor-core/esm/vs/base/common/path';
66
66
  import { IRelativePattern } from '@theia/monaco-editor-core/esm/vs/base/common/glob';
67
67
  import { EditorLanguageStatusService, LanguageStatus as EditorLanguageStatus } from '@theia/editor/lib/browser/language-status/editor-language-status-service';
68
68
  import { LanguageSelector, RelativePattern } from '@theia/editor/lib/common/language-selector';
69
+ import { ILanguageFeaturesService } from '@theia/monaco-editor-core/esm/vs/editor/common/services/languageFeatures';
70
+ import { EvaluatableExpression, EvaluatableExpressionProvider } from '@theia/monaco-editor-core/esm/vs/editor/common/languages';
71
+ import { ITextModel } from '@theia/monaco-editor-core/esm/vs/editor/common/model';
69
72
 
70
73
  /**
71
74
  * @monaco-uplift The public API declares these functions as (languageId: string, service).
@@ -338,7 +341,26 @@ export class LanguagesMainImpl implements LanguagesMain, Disposable {
338
341
  return this.proxy.$provideHover(handle, model.uri, position, token);
339
342
  }
340
343
 
341
- $registerDocumentHighlightProvider(handle: number, pluginInfo: PluginInfo, selector: SerializedDocumentFilter[]): void {
344
+ $registerEvaluatableExpressionProvider(handle: number, pluginInfo: PluginInfo, selector: SerializedDocumentFilter[]): void {
345
+ const languageSelector = this.toLanguageSelector(selector);
346
+ const evaluatableExpressionProvider = this.createEvaluatableExpressionProvider(handle);
347
+ this.register(handle,
348
+ (StandaloneServices.get(ILanguageFeaturesService).evaluatableExpressionProvider.register as RegistrationFunction<EvaluatableExpressionProvider>)
349
+ (languageSelector, evaluatableExpressionProvider));
350
+ }
351
+
352
+ protected createEvaluatableExpressionProvider(handle: number): EvaluatableExpressionProvider {
353
+ return {
354
+ provideEvaluatableExpression: (model, position, token) => this.provideEvaluatableExpression(handle, model, position, token)
355
+ };
356
+ }
357
+
358
+ protected provideEvaluatableExpression(handle: number, model: ITextModel, position: monaco.Position,
359
+ token: monaco.CancellationToken): monaco.languages.ProviderResult<EvaluatableExpression | undefined> {
360
+ return this.proxy.$provideEvaluatableExpression(handle, model.uri, position, token);
361
+ }
362
+
363
+ $registerDocumentHighlightProvider(handle: number, _pluginInfo: PluginInfo, selector: SerializedDocumentFilter[]): void {
342
364
  const languageSelector = this.toLanguageSelector(selector);
343
365
  const documentHighlightProvider = this.createDocumentHighlightProvider(handle);
344
366
  this.register(handle, (monaco.languages.registerDocumentHighlightProvider as RegistrationFunction<monaco.languages.DocumentHighlightProvider>)
@@ -79,6 +79,7 @@ import { AuthenticationService } from '@theia/core/lib/browser/authentication-se
79
79
  import { bindTreeViewDecoratorUtilities, TreeViewDecoratorService } from './view/tree-view-decorator-service';
80
80
  import { CodeEditorWidgetUtil } from './menus/vscode-theia-menu-mappings';
81
81
  import { PluginMenuCommandAdapter } from './menus/plugin-menu-command-adapter';
82
+ import './theme-icon-override';
82
83
 
83
84
  export default new ContainerModule((bind, unbind, isBound, rebind) => {
84
85
 
@@ -70,11 +70,10 @@ export class PreferenceRegistryMainImpl implements PreferenceRegistryMain, Dispo
70
70
 
71
71
  const roots = workspaceService.tryGetRoots();
72
72
  const data = getPreferences(preferenceProviderProvider, roots);
73
- const eventData: PreferenceChangeExt[] = [];
74
- for (const preferenceName of Object.keys(changes)) {
75
- const { newValue } = changes[preferenceName];
76
- eventData.push({ preferenceName, newValue });
77
- }
73
+ const eventData = Object.values(changes).map<PreferenceChangeExt>(({ scope, newValue, domain, preferenceName }) => {
74
+ const extScope = scope === PreferenceScope.User ? undefined : domain?.[0];
75
+ return { preferenceName, newValue, scope: extScope };
76
+ });
78
77
  this.proxy.$acceptConfigurationChanged(data, eventData);
79
78
  }));
80
79
  }
@@ -84,17 +83,19 @@ export class PreferenceRegistryMainImpl implements PreferenceRegistryMain, Dispo
84
83
  }
85
84
 
86
85
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
87
- async $updateConfigurationOption(target: boolean | ConfigurationTarget | undefined, key: string, value: any, resource?: string): Promise<void> {
88
- const scope = this.parseConfigurationTarget(target);
89
- await this.preferenceService.set(key, value, scope, resource);
86
+ async $updateConfigurationOption(target: boolean | ConfigurationTarget | undefined, key: string, value: any, resource?: string, withLanguageOverride?: boolean): Promise<void> {
87
+ const scope = this.parseConfigurationTarget(target, resource);
88
+ const effectiveKey = this.getEffectiveKey(key, scope, withLanguageOverride, resource);
89
+ await this.preferenceService.set(effectiveKey, value, scope, resource);
90
90
  }
91
91
 
92
- async $removeConfigurationOption(target: boolean | ConfigurationTarget | undefined, key: string, resource?: string): Promise<void> {
93
- const scope = this.parseConfigurationTarget(target);
94
- await this.preferenceService.set(key, undefined, scope, resource);
92
+ async $removeConfigurationOption(target: boolean | ConfigurationTarget | undefined, key: string, resource?: string, withLanguageOverride?: boolean): Promise<void> {
93
+ const scope = this.parseConfigurationTarget(target, resource);
94
+ const effectiveKey = this.getEffectiveKey(key, scope, withLanguageOverride, resource);
95
+ await this.preferenceService.set(effectiveKey, undefined, scope, resource);
95
96
  }
96
97
 
97
- private parseConfigurationTarget(target?: boolean | ConfigurationTarget): PreferenceScope | undefined {
98
+ private parseConfigurationTarget(target?: boolean | ConfigurationTarget, resource?: string): PreferenceScope {
98
99
  if (typeof target === 'boolean') {
99
100
  return target ? PreferenceScope.User : PreferenceScope.Workspace;
100
101
  }
@@ -106,9 +107,17 @@ export class PreferenceRegistryMainImpl implements PreferenceRegistryMain, Dispo
106
107
  case ConfigurationTarget.WorkspaceFolder:
107
108
  return PreferenceScope.Folder;
108
109
  default:
109
- // PreferenceService knows how to deal with undefined in VS Code compatible way
110
- return undefined;
110
+ return resource ? PreferenceScope.Folder : PreferenceScope.Workspace;
111
111
  }
112
112
  }
113
113
 
114
+ // If the caller does not set `withLanguageOverride = true`, we have to check whether the setting exists with that override already.
115
+ protected getEffectiveKey(key: string, scope: PreferenceScope, withLanguageOverride?: boolean, resource?: string): string {
116
+ if (withLanguageOverride) { return key; }
117
+ const overridden = this.preferenceService.overriddenPreferenceName(key);
118
+ if (!overridden) { return key; }
119
+ const value = this.preferenceService.inspectInScope(key, scope, resource, withLanguageOverride);
120
+ return value === undefined ? overridden.preferenceName : key;
121
+ }
122
+
114
123
  }
@@ -18,6 +18,8 @@
18
18
  padding-right: var(--theia-ui-padding);
19
19
  -webkit-font-smoothing: antialiased;
20
20
  flex-shrink: 0;
21
+ padding-left: 6px;
22
+ margin-left: -6px;
21
23
  }
22
24
 
23
25
  .theia-tree-view-inline-action {
@@ -0,0 +1,221 @@
1
+ // *****************************************************************************
2
+ // Copyright (C) 2022 TypeFox and others.
3
+ //
4
+ // This program and the accompanying materials are made available under the
5
+ // terms of the Eclipse Public License v. 2.0 which is available at
6
+ // http://www.eclipse.org/legal/epl-2.0.
7
+ //
8
+ // This Source Code may also be made available under the following Secondary
9
+ // Licenses when the conditions for such availability set forth in the Eclipse
10
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
11
+ // with the GNU Classpath Exception which is available at
12
+ // https://www.gnu.org/software/classpath/license.html.
13
+ //
14
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15
+ // *****************************************************************************
16
+
17
+ import { ThemeIcon } from '@theia/monaco-editor-core/esm/vs/platform/theme/common/themeService';
18
+
19
+ // @monaco-uplift
20
+ // Keep this up-to-date with the table at https://code.visualstudio.com/api/references/icons-in-labels#icon-listing
21
+ const codeIconMap: Record<string, string> = {
22
+ 'accounts-view-bar-icon': 'account',
23
+ 'breakpoints-activate': 'activate-breakpoints',
24
+ 'breakpoints-remove-all': 'close-all',
25
+ 'breakpoints-view-icon': 'debug-alt',
26
+ 'callhierarchy-incoming': 'call-incoming',
27
+ 'callhierarchy-outgoing': 'call-outgoing',
28
+ 'callstack-view-icon': 'debug-alt',
29
+ 'callstack-view-session': 'bug',
30
+ 'comments-view-icon': 'comment-discussion',
31
+ 'debug-collapse-all': 'collapse-all',
32
+ 'debug-configure': 'gear',
33
+ 'debug-console-clear-all': 'clear-all',
34
+ 'debug-console-evaluation-input': 'arrow-small-right',
35
+ 'debug-console-evaluation-prompt': 'chevron-right',
36
+ 'debug-console-view-icon': 'debug-console',
37
+ 'debug-gripper': 'gripper',
38
+ 'default-view-icon': 'window',
39
+ 'diff-editor-next-change': 'arrow-down',
40
+ 'diff-editor-previous-change': 'arrow-up',
41
+ 'diff-editor-toggle-whitespace': 'whitespace',
42
+ 'diff-insert': 'add',
43
+ 'diff-remove': 'remove',
44
+ 'diff-review-close': 'close',
45
+ 'diff-review-insert': 'add',
46
+ 'diff-review-remove': 'remove',
47
+ 'explorer-view-icon': 'files',
48
+ 'extensions-clear-search-results': 'clear-all',
49
+ 'extensions-configure-recommended': 'pencil',
50
+ 'extensions-filter': 'filter',
51
+ 'extensions-info-message': 'info',
52
+ 'extensions-install-count': 'cloud-download',
53
+ 'extensions-install-local-in-remote': 'cloud-download',
54
+ 'extensions-install-workspace-recommended': 'cloud-download',
55
+ 'extensions-manage': 'gear',
56
+ 'extensions-rating': 'star',
57
+ 'extensions-refresh': 'refresh',
58
+ 'extensions-remote': 'remote',
59
+ 'extensions-star-empty': 'star-empty',
60
+ 'extensions-star-full': 'star-full',
61
+ 'extensions-star-half': 'star-half',
62
+ 'extensions-sync-enabled': 'sync',
63
+ 'extensions-sync-ignored': 'sync-ignored',
64
+ 'extensions-view-icon': 'extensions',
65
+ 'extensions-warning-message': 'warning',
66
+ 'find-collapsed': 'chevron-right',
67
+ 'find-expanded': 'chevron-down',
68
+ 'find-next-match': 'arrow-down',
69
+ 'find-previous-match': 'arrow-up',
70
+ 'find-replace': 'replace',
71
+ 'find-replace-all': 'replace-all',
72
+ 'find-selection': 'selection',
73
+ 'folding-collapsed': 'chevron-right',
74
+ 'folding-expanded': 'chevron-down',
75
+ 'getting-started-beginner': 'lightbulb',
76
+ 'getting-started-codespaces': 'github',
77
+ 'getting-started-item-checked': 'pass-filled',
78
+ 'getting-started-item-unchecked': 'circle-large-outline',
79
+ 'getting-started-setup': 'heart',
80
+ 'goto-next-location': 'arrow-down',
81
+ 'goto-previous-location': 'arrow-up',
82
+ 'keybindings-add': 'add',
83
+ 'keybindings-edit': 'edit',
84
+ 'keybindings-record-keys': 'record-keys',
85
+ 'keybindings-sort': 'sort-precedence',
86
+ 'loaded-scripts-view-icon': 'debug-alt',
87
+ 'marker-navigation-next': 'chevron-down',
88
+ 'marker-navigation-previous': 'chevron-up',
89
+ 'markers-view-filter': 'filter',
90
+ 'markers-view-icon': 'warning',
91
+ 'markers-view-multi-line-collapsed': 'chevron-down',
92
+ 'markers-view-multi-line-expanded': 'chevron-up',
93
+ 'notebook-clear': 'clear-all',
94
+ 'notebook-collapsed': 'chevron-right',
95
+ 'notebook-delete-cell': 'trash',
96
+ 'notebook-edit': 'pencil',
97
+ 'notebook-execute': 'play',
98
+ 'notebook-execute-all': 'run-all',
99
+ 'notebook-expanded': 'chevron-down',
100
+ 'notebook-kernel-configure': 'settings-gear',
101
+ 'notebook-kernel-select': 'server-environment',
102
+ 'notebook-mimetype': 'code',
103
+ 'notebook-move-down': 'arrow-down',
104
+ 'notebook-move-up': 'arrow-up',
105
+ 'notebook-open-as-text': 'file-code',
106
+ 'notebook-render-output': 'preview',
107
+ 'notebook-revert': 'discard',
108
+ 'notebook-split-cell': 'split-vertical',
109
+ 'notebook-state-error': 'error',
110
+ 'notebook-state-success': 'check',
111
+ 'notebook-stop': 'primitive-square',
112
+ 'notebook-stop-edit': 'check',
113
+ 'notebook-unfold': 'unfold',
114
+ 'notifications-clear': 'close',
115
+ 'notifications-clear-all': 'clear-all',
116
+ 'notifications-collapse': 'chevron-down',
117
+ 'notifications-configure': 'gear',
118
+ 'notifications-expand': 'chevron-up',
119
+ 'notifications-hide': 'chevron-down',
120
+ 'open-editors-view-icon': 'book',
121
+ 'outline-view-icon': 'symbol-class',
122
+ 'output-view-icon': 'output',
123
+ 'panel-close': 'close',
124
+ 'panel-maximize': 'chevron-up',
125
+ 'panel-restore': 'chevron-down',
126
+ 'parameter-hints-next': 'chevron-down',
127
+ 'parameter-hints-previous': 'chevron-up',
128
+ 'ports-forward-icon': 'plus',
129
+ 'ports-open-browser-icon': 'globe',
130
+ 'ports-stop-forward-icon': 'x',
131
+ 'ports-view-icon': 'plug',
132
+ 'preferences-clear-input': 'clear-all',
133
+ 'preferences-open-settings': 'go-to-file',
134
+ 'private-ports-view-icon': 'lock',
135
+ 'public-ports-view-icon': 'eye',
136
+ 'refactor-preview-view-icon': 'lightbulb',
137
+ 'remote-explorer-documentation': 'book',
138
+ 'remote-explorer-feedback': 'twitter',
139
+ 'remote-explorer-get-started': 'star',
140
+ 'remote-explorer-report-issues': 'comment',
141
+ 'remote-explorer-review-issues': 'issues',
142
+ 'remote-explorer-view-icon': 'remote-explorer',
143
+ 'review-comment-collapse': 'chevron-up',
144
+ 'run-view-icon': 'debug-alt',
145
+ 'search-clear-results': 'clear-all',
146
+ 'search-collapse-results': 'collapse-all',
147
+ 'search-details': 'ellipsis',
148
+ 'search-expand-results': 'expand-all',
149
+ 'search-hide-replace': 'chevron-right',
150
+ 'search-new-editor': 'new-file',
151
+ 'search-refresh': 'refresh',
152
+ 'search-remove': 'close',
153
+ 'search-replace': 'replace',
154
+ 'search-replace-all': 'replace-all',
155
+ 'search-show-context': 'list-selection',
156
+ 'search-show-replace': 'chevron-down',
157
+ 'search-stop': 'search-stop',
158
+ 'search-view-icon': 'search',
159
+ 'settings-add': 'add',
160
+ 'settings-discard': 'discard',
161
+ 'settings-edit': 'edit',
162
+ 'settings-folder-dropdown': 'triangle-down',
163
+ 'settings-group-collapsed': 'chevron-right',
164
+ 'settings-group-expanded': 'chevron-down',
165
+ 'settings-more-action': 'gear',
166
+ 'settings-remove': 'close',
167
+ 'settings-sync-view-icon': 'sync',
168
+ 'settings-view-bar-icon': 'settings-gear',
169
+ 'source-control-view-icon': 'source-control',
170
+ 'suggest-more-info': 'chevron-right',
171
+ 'tasks-list-configure': 'gear',
172
+ 'tasks-remove': 'close',
173
+ 'terminal-kill': 'trash',
174
+ 'terminal-new': 'add',
175
+ 'terminal-rename': 'gear',
176
+ 'terminal-view-icon': 'terminal',
177
+ 'test-view-icon': 'beaker',
178
+ 'testing-cancel-icon': 'close',
179
+ 'testing-debug-icon': 'debug-alt',
180
+ 'testing-error-icon': 'warning',
181
+ 'testing-failed-icon': 'close',
182
+ 'testing-passed-icon': 'pass',
183
+ 'testing-queued-icon': 'watch',
184
+ 'testing-run-all-icon': 'run-all',
185
+ 'testing-run-icon': 'run',
186
+ 'testing-show-as-list-icon': 'list-tree',
187
+ 'testing-skipped-icon': 'debug-step-over',
188
+ 'testing-unset-icon': 'circle-outline',
189
+ 'timeline-open': 'history',
190
+ 'timeline-pin': 'pin',
191
+ 'timeline-refresh': 'refresh',
192
+ 'timeline-unpin': 'pinned',
193
+ 'timeline-view-icon': 'history',
194
+ 'variables-view-icon': 'debug-alt',
195
+ 'view-pane-container-collapsed': 'chevron-right',
196
+ 'view-pane-container-expanded': 'chevron-down',
197
+ 'watch-expressions-add': 'add',
198
+ 'watch-expressions-add-function-breakpoint': 'add',
199
+ 'watch-expressions-remove-all': 'close-all',
200
+ 'watch-view-icon': 'debug-alt',
201
+ 'widget-close': 'close'
202
+ };
203
+
204
+ const originalAsCSSSelector = ThemeIcon.asCSSSelector;
205
+ const originalAsClassName = ThemeIcon.asClassName;
206
+ const originalAsClassNameArray = ThemeIcon.asClassNameArray;
207
+
208
+ function buildMappedIcon(icon: ThemeIcon): ThemeIcon {
209
+ const id = codeIconMap[icon.id] ?? icon.id;
210
+ const newIcon: ThemeIcon = {
211
+ ...icon,
212
+ id
213
+ };
214
+ return newIcon;
215
+ }
216
+
217
+ Object.assign(ThemeIcon, {
218
+ asCSSSelector: (icon: ThemeIcon) => originalAsCSSSelector(buildMappedIcon(icon)),
219
+ asClassName: (icon: ThemeIcon) => originalAsClassName(buildMappedIcon(icon)),
220
+ asClassNameArray: (icon: ThemeIcon) => originalAsClassNameArray(buildMappedIcon(icon))
221
+ });
@@ -490,7 +490,6 @@ export class PluginViewRegistry implements FrontendApplicationContribution {
490
490
  const currentDataWidget = widget.widgets[0];
491
491
  const viewDataWidget = await this.createViewDataWidget(view.id, webviewId);
492
492
  if (widget.isDisposed) {
493
- // eslint-disable-next-line no-unused-expressions
494
493
  viewDataWidget?.dispose();
495
494
  return;
496
495
  }