@theia/plugin-ext 1.18.0-next.8e7f15b3 → 1.18.0-next.93
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.
- package/LICENSE +642 -0
- package/lib/common/arrays.d.ts +4 -0
- package/lib/common/arrays.d.ts.map +1 -1
- package/lib/common/arrays.js +9 -1
- package/lib/common/arrays.js.map +1 -1
- package/lib/common/plugin-api-rpc-model.d.ts +2 -0
- package/lib/common/plugin-api-rpc-model.d.ts.map +1 -1
- package/lib/common/plugin-api-rpc-model.js.map +1 -1
- package/lib/common/plugin-api-rpc.d.ts +27 -8
- package/lib/common/plugin-api-rpc.d.ts.map +1 -1
- package/lib/common/plugin-api-rpc.js +21 -1
- package/lib/common/plugin-api-rpc.js.map +1 -1
- package/lib/common/plugin-protocol.d.ts.map +1 -1
- package/lib/common/plugin-protocol.js.map +1 -1
- package/lib/hosted/browser/hosted-plugin.d.ts +3 -2
- package/lib/hosted/browser/hosted-plugin.d.ts.map +1 -1
- package/lib/hosted/browser/hosted-plugin.js +15 -7
- package/lib/hosted/browser/hosted-plugin.js.map +1 -1
- package/lib/hosted/browser/worker/debug-stub.d.ts.map +1 -1
- package/lib/hosted/browser/worker/debug-stub.js +1 -0
- package/lib/hosted/browser/worker/debug-stub.js.map +1 -1
- package/lib/hosted/node/scanners/scanner-theia.d.ts.map +1 -1
- package/lib/hosted/node/scanners/scanner-theia.js +2 -2
- package/lib/hosted/node/scanners/scanner-theia.js.map +1 -1
- package/lib/main/browser/callhierarchy/callhierarchy-type-converters.d.ts.map +1 -1
- package/lib/main/browser/callhierarchy/callhierarchy-type-converters.js +2 -1
- package/lib/main/browser/callhierarchy/callhierarchy-type-converters.js.map +1 -1
- package/lib/main/browser/custom-editors/custom-editor-opener.d.ts +1 -0
- package/lib/main/browser/custom-editors/custom-editor-opener.d.ts.map +1 -1
- package/lib/main/browser/custom-editors/custom-editor-opener.js +6 -2
- package/lib/main/browser/custom-editors/custom-editor-opener.js.map +1 -1
- package/lib/main/browser/debug/debug-main.js +1 -1
- package/lib/main/browser/debug/debug-main.js.map +1 -1
- package/lib/main/browser/debug/plugin-debug-adapter-contribution.d.ts +1 -1
- package/lib/main/browser/debug/plugin-debug-adapter-contribution.d.ts.map +1 -1
- package/lib/main/browser/debug/plugin-debug-adapter-contribution.js +2 -2
- package/lib/main/browser/debug/plugin-debug-adapter-contribution.js.map +1 -1
- package/lib/main/browser/debug/plugin-debug-service.d.ts +8 -0
- package/lib/main/browser/debug/plugin-debug-service.d.ts.map +1 -1
- package/lib/main/browser/debug/plugin-debug-service.js +15 -0
- package/lib/main/browser/debug/plugin-debug-service.js.map +1 -1
- package/lib/main/browser/debug/plugin-debug-session-factory.d.ts +2 -2
- package/lib/main/browser/debug/plugin-debug-session-factory.d.ts.map +1 -1
- package/lib/main/browser/dialogs/modal-notification.d.ts +1 -1
- package/lib/main/browser/dialogs/modal-notification.d.ts.map +1 -1
- package/lib/main/browser/dialogs/modal-notification.js +4 -4
- package/lib/main/browser/dialogs/modal-notification.js.map +1 -1
- package/lib/main/browser/plugin-ext-frontend-module.d.ts.map +1 -1
- package/lib/main/browser/plugin-ext-frontend-module.js +5 -3
- package/lib/main/browser/plugin-ext-frontend-module.js.map +1 -1
- package/lib/main/browser/plugin-ext-widget.d.ts.map +1 -1
- package/lib/main/browser/plugin-ext-widget.js +3 -2
- package/lib/main/browser/plugin-ext-widget.js.map +1 -1
- package/lib/main/browser/plugin-icon-theme-service.d.ts +2 -0
- package/lib/main/browser/plugin-icon-theme-service.d.ts.map +1 -1
- package/lib/main/browser/plugin-icon-theme-service.js +15 -2
- package/lib/main/browser/plugin-icon-theme-service.js.map +1 -1
- package/lib/main/browser/plugin-shared-style.js +1 -1
- package/lib/main/browser/plugin-shared-style.js.map +1 -1
- package/lib/main/browser/quick-open-main.d.ts +3 -6
- package/lib/main/browser/quick-open-main.d.ts.map +1 -1
- package/lib/main/browser/quick-open-main.js +48 -100
- package/lib/main/browser/quick-open-main.js.map +1 -1
- package/lib/main/browser/view/plugin-view-registry.d.ts +3 -1
- package/lib/main/browser/view/plugin-view-registry.d.ts.map +1 -1
- package/lib/main/browser/view/plugin-view-registry.js +62 -21
- package/lib/main/browser/view/plugin-view-registry.js.map +1 -1
- package/lib/main/browser/view/plugin-view-widget.d.ts +9 -1
- package/lib/main/browser/view/plugin-view-widget.d.ts.map +1 -1
- package/lib/main/browser/view/plugin-view-widget.js +13 -1
- package/lib/main/browser/view/plugin-view-widget.js.map +1 -1
- package/lib/main/browser/view/tree-views-main.d.ts +1 -0
- package/lib/main/browser/view/tree-views-main.d.ts.map +1 -1
- package/lib/main/browser/view/tree-views-main.js +6 -0
- package/lib/main/browser/view/tree-views-main.js.map +1 -1
- package/lib/main/browser/webview/webview.d.ts +1 -1
- package/lib/main/browser/webview/webview.d.ts.map +1 -1
- package/lib/main/browser/webview/webview.js +2 -2
- package/lib/main/browser/webview/webview.js.map +1 -1
- package/lib/plugin/languages/call-hierarchy.d.ts.map +1 -1
- package/lib/plugin/languages/call-hierarchy.js +2 -1
- package/lib/plugin/languages/call-hierarchy.js.map +1 -1
- package/lib/plugin/languages.d.ts.map +1 -1
- package/lib/plugin/languages.js +2 -1
- package/lib/plugin/languages.js.map +1 -1
- package/lib/plugin/node/debug/debug.d.ts +4 -3
- package/lib/plugin/node/debug/debug.d.ts.map +1 -1
- package/lib/plugin/node/debug/debug.js +34 -15
- package/lib/plugin/node/debug/debug.js.map +1 -1
- package/lib/plugin/node/debug/plugin-debug-adapter-session.d.ts +3 -3
- package/lib/plugin/node/debug/plugin-debug-adapter-session.d.ts.map +1 -1
- package/lib/plugin/node/debug/plugin-debug-adapter-session.js.map +1 -1
- package/lib/plugin/node/debug/plugin-debug-adapter-starter.d.ts +6 -4
- package/lib/plugin/node/debug/plugin-debug-adapter-starter.d.ts.map +1 -1
- package/lib/plugin/node/debug/plugin-debug-adapter-starter.js +23 -13
- package/lib/plugin/node/debug/plugin-debug-adapter-starter.js.map +1 -1
- package/lib/plugin/plugin-context.d.ts.map +1 -1
- package/lib/plugin/plugin-context.js +9 -3
- package/lib/plugin/plugin-context.js.map +1 -1
- package/lib/plugin/plugin-manager.d.ts +2 -0
- package/lib/plugin/plugin-manager.d.ts.map +1 -1
- package/lib/plugin/plugin-manager.js +24 -3
- package/lib/plugin/plugin-manager.js.map +1 -1
- package/lib/plugin/plugin-storage.d.ts +4 -0
- package/lib/plugin/plugin-storage.d.ts.map +1 -1
- package/lib/plugin/plugin-storage.js +6 -1
- package/lib/plugin/plugin-storage.js.map +1 -1
- package/lib/plugin/quick-open.d.ts +1 -3
- package/lib/plugin/quick-open.d.ts.map +1 -1
- package/lib/plugin/quick-open.js +12 -27
- package/lib/plugin/quick-open.js.map +1 -1
- package/lib/plugin/tasks/tasks.d.ts +1 -1
- package/lib/plugin/tasks/tasks.d.ts.map +1 -1
- package/lib/plugin/tasks/tasks.js +3 -2
- package/lib/plugin/tasks/tasks.js.map +1 -1
- package/lib/plugin/tree/tree-views.d.ts +3 -0
- package/lib/plugin/tree/tree-views.d.ts.map +1 -1
- package/lib/plugin/tree/tree-views.js +15 -1
- package/lib/plugin/tree/tree-views.js.map +1 -1
- package/lib/plugin/type-converters.d.ts.map +1 -1
- package/lib/plugin/type-converters.js +9 -5
- package/lib/plugin/type-converters.js.map +1 -1
- package/lib/plugin/types-impl.d.ts +57 -1
- package/lib/plugin/types-impl.d.ts.map +1 -1
- package/lib/plugin/types-impl.js +88 -1
- package/lib/plugin/types-impl.js.map +1 -1
- package/package.json +29 -27
- package/src/common/arrays.ts +8 -0
- package/src/common/plugin-api-rpc-model.ts +2 -0
- package/src/common/plugin-api-rpc.ts +29 -8
- package/src/common/plugin-protocol.ts +1 -0
- package/src/hosted/browser/hosted-plugin.ts +17 -8
- package/src/hosted/browser/worker/debug-stub.ts +1 -0
- package/src/hosted/node/scanners/scanner-theia.ts +3 -2
- package/src/main/browser/callhierarchy/callhierarchy-type-converters.ts +2 -1
- package/src/main/browser/custom-editors/custom-editor-opener.tsx +7 -2
- package/src/main/browser/debug/debug-main.ts +1 -1
- package/src/main/browser/debug/plugin-debug-adapter-contribution.ts +3 -3
- package/src/main/browser/debug/plugin-debug-service.ts +23 -0
- package/src/main/browser/debug/plugin-debug-session-factory.ts +2 -2
- package/src/main/browser/dialogs/modal-notification.ts +6 -6
- package/src/main/browser/plugin-ext-frontend-module.ts +6 -4
- package/src/main/browser/plugin-ext-widget.tsx +3 -2
- package/src/main/browser/plugin-icon-theme-service.ts +12 -2
- package/src/main/browser/plugin-shared-style.ts +1 -1
- package/src/main/browser/quick-open-main.ts +54 -109
- package/src/main/browser/style/index.css +1 -5
- package/src/main/browser/style/plugin-sidebar.css +1 -1
- package/src/main/browser/view/plugin-view-registry.ts +67 -24
- package/src/main/browser/view/plugin-view-widget.ts +22 -3
- package/src/main/browser/view/tree-views-main.ts +7 -0
- package/src/main/browser/webview/pre/host.js +19 -10
- package/src/main/browser/webview/pre/main.js +1 -2
- package/src/main/browser/webview/pre/service-worker.js +1 -1
- package/src/main/browser/webview/webview.ts +2 -2
- package/src/plugin/languages/call-hierarchy.ts +2 -1
- package/src/plugin/languages.ts +2 -1
- package/src/plugin/node/debug/debug.ts +40 -19
- package/src/plugin/node/debug/plugin-debug-adapter-session.ts +3 -3
- package/src/plugin/node/debug/plugin-debug-adapter-starter.ts +24 -14
- package/src/plugin/plugin-context.ts +20 -7
- package/src/plugin/plugin-manager.ts +26 -4
- package/src/plugin/plugin-storage.ts +6 -0
- package/src/plugin/quick-open.ts +14 -31
- package/src/plugin/tasks/tasks.ts +3 -2
- package/src/plugin/tree/tree-views.ts +17 -1
- package/src/plugin/type-converters.ts +9 -6
- package/src/plugin/types-impl.ts +82 -1
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
********************************************************************************/
|
|
16
16
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
17
17
|
|
|
18
|
-
import { InputBoxOptions
|
|
18
|
+
import { InputBoxOptions } from '@theia/plugin';
|
|
19
19
|
import { interfaces } from '@theia/core/shared/inversify';
|
|
20
20
|
import { RPCProtocol } from '../../common/rpc-protocol';
|
|
21
21
|
import {
|
|
@@ -23,15 +23,17 @@ import {
|
|
|
23
23
|
QuickOpenMain,
|
|
24
24
|
MAIN_RPC_CONTEXT,
|
|
25
25
|
TransferInputBox,
|
|
26
|
-
TransferQuickPick,
|
|
27
26
|
TransferQuickPickItems,
|
|
28
27
|
TransferQuickInput,
|
|
29
28
|
TransferQuickInputButton
|
|
30
29
|
} from '../../common/plugin-api-rpc';
|
|
31
30
|
import {
|
|
32
|
-
InputOptions,
|
|
31
|
+
InputOptions,
|
|
32
|
+
PickOptions,
|
|
33
|
+
QuickInputButton,
|
|
34
|
+
QuickInputButtonHandle,
|
|
35
|
+
QuickInputService
|
|
33
36
|
} from '@theia/core/lib/browser';
|
|
34
|
-
import { QuickPickService } from '@theia/core/lib/common/quick-pick-service';
|
|
35
37
|
import { DisposableCollection, Disposable } from '@theia/core/lib/common/disposable';
|
|
36
38
|
import { CancellationToken } from '@theia/core/lib/common/cancellation';
|
|
37
39
|
import { MonacoQuickInputService } from '@theia/monaco/lib/browser/monaco-quick-input-service';
|
|
@@ -47,7 +49,6 @@ export interface QuickInputSession {
|
|
|
47
49
|
export class QuickOpenMainImpl implements QuickOpenMain, Disposable {
|
|
48
50
|
|
|
49
51
|
private quickInputService: QuickInputService;
|
|
50
|
-
private quickPickService: QuickPickService;
|
|
51
52
|
private proxy: QuickOpenExt;
|
|
52
53
|
private delegate: MonacoQuickInputService;
|
|
53
54
|
private readonly items: Record<number, {
|
|
@@ -61,7 +62,6 @@ export class QuickOpenMainImpl implements QuickOpenMain, Disposable {
|
|
|
61
62
|
this.proxy = rpc.getProxy(MAIN_RPC_CONTEXT.QUICK_OPEN_EXT);
|
|
62
63
|
this.delegate = container.get(MonacoQuickInputService);
|
|
63
64
|
this.quickInputService = container.get(QuickInputService);
|
|
64
|
-
this.quickPickService = container.get(QuickPickService);
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
dispose(): void {
|
|
@@ -194,54 +194,55 @@ export class QuickOpenMainImpl implements QuickOpenMain, Disposable {
|
|
|
194
194
|
|
|
195
195
|
private sessions = new Map<number, QuickInputSession>();
|
|
196
196
|
|
|
197
|
-
$createOrUpdate<T extends theia.QuickPickItem>(params: TransferQuickInput
|
|
197
|
+
$createOrUpdate<T extends theia.QuickPickItem>(params: TransferQuickInput): Promise<void> {
|
|
198
198
|
const sessionId = params.id;
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
199
|
+
let session = this.sessions.get(sessionId);
|
|
200
|
+
if (!session) {
|
|
201
|
+
if (params.type === 'quickPick') {
|
|
202
|
+
const quickPick = this.quickInputService.createQuickPick();
|
|
203
|
+
quickPick.onDidAccept(() => {
|
|
204
|
+
this.proxy.$acceptOnDidAccept(sessionId);
|
|
205
|
+
});
|
|
206
|
+
quickPick.onDidChangeActive((items: Array<monaco.quickInput.IQuickPickItem>) => {
|
|
207
|
+
this.proxy.$onDidChangeActive(sessionId, items.map(item => (item as TransferQuickPickItems).handle));
|
|
208
|
+
});
|
|
209
|
+
quickPick.onDidChangeSelection((items: Array<monaco.quickInput.IQuickPickItem>) => {
|
|
210
|
+
this.proxy.$onDidChangeSelection(sessionId, items.map(item => (item as TransferQuickPickItems).handle));
|
|
211
|
+
});
|
|
212
|
+
quickPick.onDidTriggerButton((button: QuickInputButtonHandle) => {
|
|
213
|
+
this.proxy.$acceptOnDidTriggerButton(sessionId, button);
|
|
214
|
+
});
|
|
215
|
+
quickPick.onDidChangeValue((value: string) => {
|
|
216
|
+
this.proxy.$acceptDidChangeValue(sessionId, value);
|
|
217
|
+
});
|
|
218
|
+
quickPick.onDidHide(() => {
|
|
219
|
+
this.proxy.$acceptOnDidHide(sessionId);
|
|
220
|
+
});
|
|
221
|
+
session = {
|
|
222
|
+
input: quickPick,
|
|
223
|
+
handlesToItems: new Map()
|
|
224
|
+
};
|
|
225
|
+
} else {
|
|
226
|
+
const inputBox = this.quickInputService.createInputBox();
|
|
227
|
+
inputBox.onDidAccept(() => {
|
|
228
|
+
this.proxy.$acceptOnDidAccept(sessionId);
|
|
229
|
+
});
|
|
230
|
+
inputBox.onDidTriggerButton((button: QuickInputButtonHandle) => {
|
|
231
|
+
this.proxy.$acceptOnDidTriggerButton(sessionId, button);
|
|
232
|
+
});
|
|
233
|
+
inputBox.onDidChangeValue((value: string) => {
|
|
234
|
+
this.proxy.$acceptDidChangeValue(sessionId, value);
|
|
235
|
+
});
|
|
236
|
+
inputBox.onDidHide(() => {
|
|
237
|
+
this.proxy.$acceptOnDidHide(sessionId);
|
|
238
|
+
});
|
|
239
|
+
session = {
|
|
240
|
+
input: inputBox,
|
|
241
|
+
handlesToItems: new Map()
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
this.sessions.set(sessionId, session);
|
|
245
|
+
}
|
|
245
246
|
if (session) {
|
|
246
247
|
const { input, handlesToItems } = session;
|
|
247
248
|
for (const param in params) {
|
|
@@ -297,47 +298,6 @@ export class QuickOpenMainImpl implements QuickOpenMain, Disposable {
|
|
|
297
298
|
return Promise.resolve(undefined);
|
|
298
299
|
}
|
|
299
300
|
|
|
300
|
-
async $showCustomQuickPick<T extends QuickPickItemExt>(options: TransferQuickPick<T>): Promise<void> {
|
|
301
|
-
const sessionId = options.id;
|
|
302
|
-
const toDispose = new DisposableCollection();
|
|
303
|
-
|
|
304
|
-
toDispose.push(this.quickPickService.onDidAccept(() => {
|
|
305
|
-
this.proxy.$acceptOnDidAccept(sessionId);
|
|
306
|
-
}));
|
|
307
|
-
toDispose.push(this.quickPickService.onDidChangeActive((e: { quickPick: any, activeItems: Array<QuickPickValue<number>> }) => {
|
|
308
|
-
this.proxy.$onDidChangeActive(sessionId, e.activeItems.map(item => item.value!));
|
|
309
|
-
}));
|
|
310
|
-
toDispose.push(this.quickPickService.onDidChangeSelection((e: { quickPick: any, selectedItems: Array<QuickPickValue<number>> }) => {
|
|
311
|
-
this.proxy.$onDidChangeSelection(sessionId, e.selectedItems.map(item => item.value!));
|
|
312
|
-
}));
|
|
313
|
-
toDispose.push(this.quickPickService.onDidChangeValue((e: { quickPick: any, filter: string }) => {
|
|
314
|
-
this.proxy.$acceptDidChangeValue(sessionId, e.filter);
|
|
315
|
-
}));
|
|
316
|
-
toDispose.push(this.quickPickService.onDidTriggerButton(button => {
|
|
317
|
-
this.proxy.$acceptOnDidTriggerButton(sessionId, button);
|
|
318
|
-
}));
|
|
319
|
-
toDispose.push(this.quickPickService.onDidHide(() => {
|
|
320
|
-
this.proxy.$acceptOnDidHide(sessionId);
|
|
321
|
-
if (!toDispose.disposed) {
|
|
322
|
-
toDispose.dispose();
|
|
323
|
-
}
|
|
324
|
-
}));
|
|
325
|
-
this.toDispose.push(toDispose);
|
|
326
|
-
|
|
327
|
-
this.quickPickService.show(this.convertToQuickPickItem(options.items), {
|
|
328
|
-
buttons: options.buttons ? this.convertToQuickInputButtons(options.buttons) : [],
|
|
329
|
-
placeholder: options.placeholder,
|
|
330
|
-
matchOnDescription: options.matchOnDescription,
|
|
331
|
-
step: options.step,
|
|
332
|
-
title: options.title,
|
|
333
|
-
totalSteps: options.totalSteps,
|
|
334
|
-
ignoreFocusOut: options.ignoreFocusOut,
|
|
335
|
-
value: options.value,
|
|
336
|
-
matchOnLabel: true,
|
|
337
|
-
runIfSingle: false,
|
|
338
|
-
});
|
|
339
|
-
}
|
|
340
|
-
|
|
341
301
|
$hide(): void {
|
|
342
302
|
this.delegate.hide();
|
|
343
303
|
}
|
|
@@ -351,21 +311,6 @@ export class QuickOpenMainImpl implements QuickOpenMain, Disposable {
|
|
|
351
311
|
return Promise.resolve(undefined);
|
|
352
312
|
}
|
|
353
313
|
|
|
354
|
-
private convertToQuickPickItem(items: TransferQuickPickItems[] | undefined): Array<QuickPickItem> {
|
|
355
|
-
const convertedItems: QuickPickValue<number>[] = [];
|
|
356
|
-
if (items) {
|
|
357
|
-
for (const i of items) {
|
|
358
|
-
convertedItems.push({
|
|
359
|
-
label: i.label,
|
|
360
|
-
description: i.description,
|
|
361
|
-
detail: i.detail,
|
|
362
|
-
value: i.handle
|
|
363
|
-
});
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
return convertedItems;
|
|
367
|
-
}
|
|
368
|
-
|
|
369
314
|
private convertToQuickInputButtons(buttons: Array<TransferQuickInputButton>): Array<QuickInputButton> {
|
|
370
315
|
return buttons.map((button, i) => ({
|
|
371
316
|
iconPath: getIconUris(button.iconPath),
|
|
@@ -37,11 +37,7 @@
|
|
|
37
37
|
.theia-plugin-view-container {
|
|
38
38
|
-webkit-mask: url('');
|
|
39
39
|
mask: url('');
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
.theia-plugin-test-tab-icon {
|
|
43
|
-
-webkit-mask: url('test.svg');
|
|
44
|
-
mask: url('test.svg');
|
|
40
|
+
background-color: var(--theia-activityBar-inactiveForeground);
|
|
45
41
|
}
|
|
46
42
|
|
|
47
43
|
.theia-plugin-file-icon,
|
|
@@ -30,7 +30,6 @@
|
|
|
30
30
|
.theia-plugins .pluginHeaderContainer {
|
|
31
31
|
padding: 5px 15px;
|
|
32
32
|
font-size: var(--theia-ui-font-size0);
|
|
33
|
-
border-bottom: 1px solid;
|
|
34
33
|
}
|
|
35
34
|
|
|
36
35
|
.theia-side-panel .theia-plugins .pluginHeaderContainer {
|
|
@@ -48,6 +47,7 @@
|
|
|
48
47
|
.theia-plugins .pluginName {
|
|
49
48
|
flex: 1;
|
|
50
49
|
margin-right: 5px;
|
|
50
|
+
margin-left: 4px;
|
|
51
51
|
font-size: var(--theia-ui-font-size1);
|
|
52
52
|
font-weight: 400;
|
|
53
53
|
}
|
|
@@ -18,7 +18,7 @@ import { injectable, inject, postConstruct, optional } from '@theia/core/shared/
|
|
|
18
18
|
import {
|
|
19
19
|
ApplicationShell, ViewContainer as ViewContainerWidget, WidgetManager,
|
|
20
20
|
ViewContainerIdentifier, ViewContainerTitleOptions, Widget, FrontendApplicationContribution,
|
|
21
|
-
StatefulWidget, CommonMenus, BaseWidget, TreeViewWelcomeWidget
|
|
21
|
+
StatefulWidget, CommonMenus, BaseWidget, TreeViewWelcomeWidget, codicon, ViewContainerPart
|
|
22
22
|
} from '@theia/core/lib/browser';
|
|
23
23
|
import { ViewContainer, View, ViewWelcome } from '../../../common';
|
|
24
24
|
import { PluginSharedStyle } from '../plugin-shared-style';
|
|
@@ -34,13 +34,13 @@ import { MenuModelRegistry } from '@theia/core/lib/common/menu';
|
|
|
34
34
|
import { QuickViewService } from '@theia/core/lib/browser';
|
|
35
35
|
import { Emitter } from '@theia/core/lib/common/event';
|
|
36
36
|
import { ContextKeyService } from '@theia/core/lib/browser/context-key-service';
|
|
37
|
-
import { SearchInWorkspaceWidget } from '@theia/search-in-workspace/lib/browser/search-in-workspace-widget';
|
|
38
37
|
import { ViewContextKeyService } from './view-context-key-service';
|
|
39
38
|
import { PROBLEMS_WIDGET_ID } from '@theia/markers/lib/browser/problem/problem-widget';
|
|
40
39
|
import { OUTPUT_WIDGET_KIND } from '@theia/output/lib/browser/output-widget';
|
|
41
40
|
import { DebugConsoleContribution } from '@theia/debug/lib/browser/console/debug-console-contribution';
|
|
42
41
|
import { TERMINAL_WIDGET_FACTORY_ID } from '@theia/terminal/lib/browser/terminal-widget-impl';
|
|
43
42
|
import { TreeViewWidget } from './tree-view-widget';
|
|
43
|
+
import { SEARCH_VIEW_CONTAINER_ID } from '@theia/search-in-workspace/lib/browser/search-in-workspace-factory';
|
|
44
44
|
|
|
45
45
|
export const PLUGIN_VIEW_FACTORY_ID = 'plugin-view';
|
|
46
46
|
export const PLUGIN_VIEW_CONTAINER_FACTORY_ID = 'plugin-view-container';
|
|
@@ -100,8 +100,8 @@ export class PluginViewRegistry implements FrontendApplicationContribution {
|
|
|
100
100
|
protected init(): void {
|
|
101
101
|
// VS Code Viewlets
|
|
102
102
|
this.trackVisibleWidget(EXPLORER_VIEW_CONTAINER_ID, { viewletId: 'workbench.view.explorer' });
|
|
103
|
-
this.trackVisibleWidget(SearchInWorkspaceWidget.ID, { viewletId: 'workbench.view.search', sideArea: true });
|
|
104
103
|
this.trackVisibleWidget(SCM_VIEW_CONTAINER_ID, { viewletId: 'workbench.view.scm' });
|
|
104
|
+
this.trackVisibleWidget(SEARCH_VIEW_CONTAINER_ID, { viewletId: 'workbench.view.search' });
|
|
105
105
|
this.trackVisibleWidget(DebugWidget.ID, { viewletId: 'workbench.view.debug' });
|
|
106
106
|
// TODO workbench.view.extensions - Theia does not have a proper extension view yet
|
|
107
107
|
|
|
@@ -111,7 +111,6 @@ export class PluginViewRegistry implements FrontendApplicationContribution {
|
|
|
111
111
|
this.trackVisibleWidget(DebugConsoleContribution.options.id, { panelId: 'workbench.panel.repl' });
|
|
112
112
|
this.trackVisibleWidget(TERMINAL_WIDGET_FACTORY_ID, { panelId: 'workbench.panel.terminal' });
|
|
113
113
|
// TODO workbench.panel.comments - Theia does not have a proper comments view yet
|
|
114
|
-
this.trackVisibleWidget(SearchInWorkspaceWidget.ID, { panelId: 'workbench.view.search', sideArea: false });
|
|
115
114
|
|
|
116
115
|
this.updateFocusedView();
|
|
117
116
|
this.shell.onDidChangeActiveWidget(() => this.updateFocusedView());
|
|
@@ -123,6 +122,9 @@ export class PluginViewRegistry implements FrontendApplicationContribution {
|
|
|
123
122
|
if (factoryId === SCM_VIEW_CONTAINER_ID && widget instanceof ViewContainerWidget) {
|
|
124
123
|
waitUntil(this.prepareViewContainer('scm', widget));
|
|
125
124
|
}
|
|
125
|
+
if (factoryId === SEARCH_VIEW_CONTAINER_ID && widget instanceof ViewContainerWidget) {
|
|
126
|
+
waitUntil(this.prepareViewContainer('search', widget));
|
|
127
|
+
}
|
|
126
128
|
if (factoryId === DebugWidget.ID && widget instanceof DebugWidget) {
|
|
127
129
|
const viewContainer = widget['sessionWidget']['viewContainer'];
|
|
128
130
|
waitUntil(this.prepareViewContainer('debug', viewContainer));
|
|
@@ -146,7 +148,7 @@ export class PluginViewRegistry implements FrontendApplicationContribution {
|
|
|
146
148
|
});
|
|
147
149
|
this.doRegisterViewContainer('test', 'left', {
|
|
148
150
|
label: 'Test',
|
|
149
|
-
iconClass: '
|
|
151
|
+
iconClass: codicon('beaker'),
|
|
150
152
|
closeable: true
|
|
151
153
|
});
|
|
152
154
|
this.contextKeyService.onDidChange(e => {
|
|
@@ -401,7 +403,9 @@ export class PluginViewRegistry implements FrontendApplicationContribution {
|
|
|
401
403
|
return;
|
|
402
404
|
}
|
|
403
405
|
const [, view] = data;
|
|
404
|
-
widget.title.label
|
|
406
|
+
if (!widget.title.label) {
|
|
407
|
+
widget.title.label = view.name;
|
|
408
|
+
}
|
|
405
409
|
const currentDataWidget = widget.widgets[0];
|
|
406
410
|
const viewDataWidget = await this.createViewDataWidget(view.id);
|
|
407
411
|
if (widget.isDisposed) {
|
|
@@ -466,6 +470,14 @@ export class PluginViewRegistry implements FrontendApplicationContribution {
|
|
|
466
470
|
}
|
|
467
471
|
for (const viewId of this.getContainerViews(viewContainerId)) {
|
|
468
472
|
const identifier = this.toPluginViewWidgetIdentifier(viewId);
|
|
473
|
+
// Keep existing widget in its current container and reregister its part to the plugin view widget events.
|
|
474
|
+
const existingWidget = this.widgetManager.tryGetWidget<PluginViewWidget>(PLUGIN_VIEW_FACTORY_ID, identifier);
|
|
475
|
+
if (existingWidget && existingWidget.currentViewContainerId) {
|
|
476
|
+
const currentContainer = await this.getPluginViewContainer(existingWidget.currentViewContainerId);
|
|
477
|
+
if (currentContainer && this.registerWidgetPartEvents(existingWidget, currentContainer)) {
|
|
478
|
+
continue;
|
|
479
|
+
}
|
|
480
|
+
}
|
|
469
481
|
const widget = await this.widgetManager.getOrCreateWidget<PluginViewWidget>(PLUGIN_VIEW_FACTORY_ID, identifier);
|
|
470
482
|
if (containerWidget.getTrackableWidgets().indexOf(widget) === -1) {
|
|
471
483
|
containerWidget.addWidget(widget, {
|
|
@@ -473,27 +485,49 @@ export class PluginViewRegistry implements FrontendApplicationContribution {
|
|
|
473
485
|
initiallyHidden: !this.isViewVisible(viewId)
|
|
474
486
|
});
|
|
475
487
|
}
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
part.onDidChangeVisibility(() => widget.suppressUpdateViewVisibility = part.isHidden);
|
|
488
|
+
this.registerWidgetPartEvents(widget, containerWidget);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
480
491
|
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
492
|
+
protected registerWidgetPartEvents(widget: PluginViewWidget, containerWidget: ViewContainerWidget): ViewContainerPart | undefined {
|
|
493
|
+
const part = containerWidget.getPartFor(widget);
|
|
494
|
+
if (part) {
|
|
495
|
+
|
|
496
|
+
widget.currentViewContainerId = this.getViewContainerId(containerWidget);
|
|
497
|
+
part.onDidMove(event => { widget.currentViewContainerId = this.getViewContainerId(event); });
|
|
498
|
+
|
|
499
|
+
// if a view is explicitly hidden then suppress updating visibility based on `when` closure
|
|
500
|
+
part.onDidChangeVisibility(() => widget.suppressUpdateViewVisibility = part.isHidden);
|
|
501
|
+
|
|
502
|
+
const tryFireOnDidExpandView = () => {
|
|
503
|
+
if (widget.widgets.length === 0) {
|
|
504
|
+
if (!part.collapsed && part.isVisible) {
|
|
505
|
+
const viewId = this.toViewId(widget.options);
|
|
506
|
+
this.onDidExpandViewEmitter.fire(viewId);
|
|
488
507
|
}
|
|
489
|
-
}
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
508
|
+
} else {
|
|
509
|
+
toFire.dispose();
|
|
510
|
+
}
|
|
511
|
+
};
|
|
512
|
+
const toFire = new DisposableCollection(
|
|
513
|
+
part.onCollapsed(tryFireOnDidExpandView),
|
|
514
|
+
part.onDidChangeVisibility(tryFireOnDidExpandView)
|
|
515
|
+
);
|
|
494
516
|
|
|
495
|
-
|
|
496
|
-
|
|
517
|
+
tryFireOnDidExpandView();
|
|
518
|
+
return part;
|
|
519
|
+
}
|
|
520
|
+
};
|
|
521
|
+
|
|
522
|
+
protected getViewContainerId(container: ViewContainerWidget): string | undefined {
|
|
523
|
+
const description = this.widgetManager.getDescription(container);
|
|
524
|
+
switch (description?.factoryId) {
|
|
525
|
+
case EXPLORER_VIEW_CONTAINER_ID: return 'explorer';
|
|
526
|
+
case SCM_VIEW_CONTAINER_ID: return 'scm';
|
|
527
|
+
case SEARCH_VIEW_CONTAINER_ID: return 'search';
|
|
528
|
+
case undefined: return container.parent?.parent instanceof DebugWidget ? 'debug' : container.id;
|
|
529
|
+
case PLUGIN_VIEW_CONTAINER_FACTORY_ID: return this.toViewContainerId(description.options);
|
|
530
|
+
default: return container.id;
|
|
497
531
|
}
|
|
498
532
|
}
|
|
499
533
|
|
|
@@ -504,6 +538,9 @@ export class PluginViewRegistry implements FrontendApplicationContribution {
|
|
|
504
538
|
if (viewContainerId === 'scm') {
|
|
505
539
|
return this.widgetManager.getWidget<ViewContainerWidget>(SCM_VIEW_CONTAINER_ID);
|
|
506
540
|
}
|
|
541
|
+
if (viewContainerId === 'search') {
|
|
542
|
+
return this.widgetManager.getWidget<ViewContainerWidget>(SEARCH_VIEW_CONTAINER_ID);
|
|
543
|
+
}
|
|
507
544
|
if (viewContainerId === 'debug') {
|
|
508
545
|
const debug = await this.widgetManager.getWidget(DebugWidget.ID);
|
|
509
546
|
if (debug instanceof DebugWidget) {
|
|
@@ -546,6 +583,12 @@ export class PluginViewRegistry implements FrontendApplicationContribution {
|
|
|
546
583
|
await this.prepareViewContainer('scm', scm);
|
|
547
584
|
}
|
|
548
585
|
})().catch(console.error));
|
|
586
|
+
promises.push((async () => {
|
|
587
|
+
const search = await this.widgetManager.getWidget(SEARCH_VIEW_CONTAINER_ID);
|
|
588
|
+
if (search instanceof ViewContainerWidget) {
|
|
589
|
+
await this.prepareViewContainer('search', search);
|
|
590
|
+
}
|
|
591
|
+
})().catch(console.error));
|
|
549
592
|
promises.push((async () => {
|
|
550
593
|
const debug = await this.widgetManager.getWidget(DebugWidget.ID);
|
|
551
594
|
if (debug instanceof DebugWidget) {
|
|
@@ -22,6 +22,8 @@ import { ViewContextKeyService } from './view-context-key-service';
|
|
|
22
22
|
import { StatefulWidget } from '@theia/core/lib/browser/shell/shell-layout-restorer';
|
|
23
23
|
import { Message } from '@theia/core/shared/@phosphor/messaging';
|
|
24
24
|
import { TreeViewWidget } from './tree-view-widget';
|
|
25
|
+
import { DescriptionWidget } from '@theia/core/lib/browser/view-container';
|
|
26
|
+
import { Emitter } from '@theia/core/lib/common';
|
|
25
27
|
|
|
26
28
|
@injectable()
|
|
27
29
|
export class PluginViewWidgetIdentifier {
|
|
@@ -30,7 +32,7 @@ export class PluginViewWidgetIdentifier {
|
|
|
30
32
|
}
|
|
31
33
|
|
|
32
34
|
@injectable()
|
|
33
|
-
export class PluginViewWidget extends Panel implements StatefulWidget {
|
|
35
|
+
export class PluginViewWidget extends Panel implements StatefulWidget, DescriptionWidget {
|
|
34
36
|
|
|
35
37
|
@inject(MenuModelRegistry)
|
|
36
38
|
protected readonly menus: MenuModelRegistry;
|
|
@@ -44,12 +46,16 @@ export class PluginViewWidget extends Panel implements StatefulWidget {
|
|
|
44
46
|
@inject(PluginViewWidgetIdentifier)
|
|
45
47
|
readonly options: PluginViewWidgetIdentifier;
|
|
46
48
|
|
|
49
|
+
currentViewContainerId: string | undefined;
|
|
50
|
+
|
|
47
51
|
constructor() {
|
|
48
52
|
super();
|
|
49
53
|
this.node.tabIndex = -1;
|
|
50
54
|
this.node.style.height = '100%';
|
|
51
55
|
}
|
|
52
56
|
|
|
57
|
+
public onDidChangeDescription: Emitter<void> = new Emitter<void>();
|
|
58
|
+
|
|
53
59
|
@postConstruct()
|
|
54
60
|
protected init(): void {
|
|
55
61
|
this.id = this.options.id;
|
|
@@ -71,7 +77,8 @@ export class PluginViewWidget extends Panel implements StatefulWidget {
|
|
|
71
77
|
label: this.title.label,
|
|
72
78
|
message: this.message,
|
|
73
79
|
widgets: this.widgets,
|
|
74
|
-
suppressUpdateViewVisibility: this._suppressUpdateViewVisibility
|
|
80
|
+
suppressUpdateViewVisibility: this._suppressUpdateViewVisibility,
|
|
81
|
+
currentViewContainerId: this.currentViewContainerId
|
|
75
82
|
};
|
|
76
83
|
}
|
|
77
84
|
|
|
@@ -79,6 +86,7 @@ export class PluginViewWidget extends Panel implements StatefulWidget {
|
|
|
79
86
|
this.title.label = state.label;
|
|
80
87
|
this.message = state.message;
|
|
81
88
|
this.suppressUpdateViewVisibility = state.suppressUpdateViewVisibility;
|
|
89
|
+
this.currentViewContainerId = state.currentViewContainerId;
|
|
82
90
|
for (const widget of state.widgets) {
|
|
83
91
|
this.addWidget(widget);
|
|
84
92
|
}
|
|
@@ -112,6 +120,16 @@ export class PluginViewWidget extends Panel implements StatefulWidget {
|
|
|
112
120
|
this.updateWidgetMessage();
|
|
113
121
|
}
|
|
114
122
|
|
|
123
|
+
private _description: string = '';
|
|
124
|
+
get description(): string {
|
|
125
|
+
return this._description;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
set description(description: string) {
|
|
129
|
+
this._description = description;
|
|
130
|
+
this.onDidChangeDescription.fire();
|
|
131
|
+
}
|
|
132
|
+
|
|
115
133
|
private updateWidgetMessage(): void {
|
|
116
134
|
const widget = this.widgets[0];
|
|
117
135
|
if (widget) {
|
|
@@ -136,6 +154,7 @@ export namespace PluginViewWidget {
|
|
|
136
154
|
label: string,
|
|
137
155
|
message?: string,
|
|
138
156
|
widgets: ReadonlyArray<Widget>,
|
|
139
|
-
suppressUpdateViewVisibility: boolean
|
|
157
|
+
suppressUpdateViewVisibility: boolean;
|
|
158
|
+
currentViewContainerId: string | undefined;
|
|
140
159
|
}
|
|
141
160
|
}
|
|
@@ -150,6 +150,13 @@ export class TreeViewsMainImpl implements TreeViewsMain, Disposable {
|
|
|
150
150
|
}
|
|
151
151
|
}
|
|
152
152
|
|
|
153
|
+
async $setDescription(treeViewId: string, description: string): Promise<void> {
|
|
154
|
+
const viewPanel = await this.viewRegistry.getView(treeViewId);
|
|
155
|
+
if (viewPanel) {
|
|
156
|
+
viewPanel.description = description;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
153
160
|
protected handleTreeEvents(treeViewId: string, treeViewWidget: TreeViewWidget): void {
|
|
154
161
|
this.toDispose.push(treeViewWidget.model.onExpansionChanged(event => {
|
|
155
162
|
this.proxy.$setExpanded(treeViewId, event.id, event.expanded);
|
|
@@ -25,19 +25,28 @@
|
|
|
25
25
|
const hostMessaging = new class HostMessaging {
|
|
26
26
|
constructor() {
|
|
27
27
|
this.handlers = new Map();
|
|
28
|
-
window.addEventListener('message',
|
|
29
|
-
|
|
28
|
+
window.addEventListener('message', e => {
|
|
29
|
+
let sourceIsChildFrame = false;
|
|
30
|
+
for (let i = 0; i < window.frames.length; i++) {
|
|
31
|
+
const frame = window.frames[i];
|
|
32
|
+
if (e.source === frame) {
|
|
33
|
+
sourceIsChildFrame = true;
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (sourceIsChildFrame && e.data && (e.data.command === 'onmessage' || e.data.command === 'do-update-state')) {
|
|
30
38
|
// Came from inner iframe
|
|
31
39
|
this.postMessage(e.data.command, e.data.data);
|
|
32
|
-
return;
|
|
33
40
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
handler
|
|
39
|
-
|
|
40
|
-
|
|
41
|
+
// Note: `window.parent === window` when there is no parent...
|
|
42
|
+
if (sourceIsChildFrame || e.source === window.parent) {
|
|
43
|
+
const channel = e.data.channel;
|
|
44
|
+
const handler = this.handlers.get(channel);
|
|
45
|
+
if (handler) {
|
|
46
|
+
handler(e, e.data.args);
|
|
47
|
+
} else {
|
|
48
|
+
console.error('no handler for ', e);
|
|
49
|
+
}
|
|
41
50
|
}
|
|
42
51
|
});
|
|
43
52
|
}
|
|
@@ -193,7 +193,6 @@
|
|
|
193
193
|
initialScrollProgress: undefined
|
|
194
194
|
};
|
|
195
195
|
|
|
196
|
-
|
|
197
196
|
/**
|
|
198
197
|
* @param {HTMLDocument?} document
|
|
199
198
|
* @param {HTMLElement?} body
|
|
@@ -477,7 +476,7 @@
|
|
|
477
476
|
const newFrame = document.createElement('iframe');
|
|
478
477
|
newFrame.setAttribute('id', 'pending-frame');
|
|
479
478
|
newFrame.setAttribute('frameborder', '0');
|
|
480
|
-
newFrame.setAttribute('sandbox', options.allowScripts ? 'allow-scripts allow-forms allow-same-origin' : 'allow-same-origin');
|
|
479
|
+
newFrame.setAttribute('sandbox', options.allowScripts ? 'allow-scripts allow-forms allow-same-origin allow-downloads' : 'allow-same-origin');
|
|
481
480
|
if (host.fakeLoad) {
|
|
482
481
|
// We should just be able to use srcdoc, but I wasn't
|
|
483
482
|
// seeing the service worker applying properly.
|
|
@@ -248,7 +248,7 @@ async function processLocalhostRequest(event, requestUrl) {
|
|
|
248
248
|
const origin = requestUrl.origin;
|
|
249
249
|
|
|
250
250
|
const resolveRedirect = redirectOrigin => {
|
|
251
|
-
if (!redirectOrigin) {
|
|
251
|
+
if (!redirectOrigin || requestUrl.origin === redirectOrigin) {
|
|
252
252
|
return fetch(event.request);
|
|
253
253
|
}
|
|
254
254
|
const location = event.request.url.replace(new RegExp(`^${requestUrl.origin}(/|$)`), `${redirectOrigin}$1`);
|
|
@@ -40,7 +40,7 @@ import { Schemes } from '../../../common/uri-components';
|
|
|
40
40
|
import { PluginSharedStyle } from '../plugin-shared-style';
|
|
41
41
|
import { WebviewThemeDataProvider } from './webview-theme-data-provider';
|
|
42
42
|
import { ExternalUriService } from '@theia/core/lib/browser/external-uri-service';
|
|
43
|
-
import { OutputChannelManager } from '@theia/output/lib/
|
|
43
|
+
import { OutputChannelManager } from '@theia/output/lib/browser/output-channel';
|
|
44
44
|
import { WebviewPreferences } from './webview-preferences';
|
|
45
45
|
import { WebviewResourceCache } from './webview-resource-cache';
|
|
46
46
|
import { Endpoint } from '@theia/core/lib/browser/endpoint';
|
|
@@ -249,7 +249,7 @@ export class WebviewWidget extends BaseWidget implements StatefulWidget {
|
|
|
249
249
|
|
|
250
250
|
const element = document.createElement('iframe');
|
|
251
251
|
element.className = 'webview';
|
|
252
|
-
element.sandbox.add('allow-scripts', 'allow-forms', 'allow-same-origin');
|
|
252
|
+
element.sandbox.add('allow-scripts', 'allow-forms', 'allow-same-origin', 'allow-downloads');
|
|
253
253
|
element.setAttribute('src', `${this.externalEndpoint}/index.html?id=${this.identifier.id}`);
|
|
254
254
|
element.style.border = 'none';
|
|
255
255
|
element.style.width = '100%';
|
package/src/plugin/languages.ts
CHANGED
|
@@ -90,6 +90,7 @@ import { DeclarationAdapter } from './languages/declaration';
|
|
|
90
90
|
import { CallHierarchyAdapter } from './languages/call-hierarchy';
|
|
91
91
|
import { BinaryBuffer } from '@theia/core/lib/common/buffer';
|
|
92
92
|
import { DocumentSemanticTokensAdapter, DocumentRangeSemanticTokensAdapter } from './languages/semantic-highlighting';
|
|
93
|
+
import { isReadonlyArray } from '../common/arrays';
|
|
93
94
|
|
|
94
95
|
type Adapter = CompletionAdapter |
|
|
95
96
|
SignatureHelpAdapter |
|
|
@@ -204,7 +205,7 @@ export class LanguagesExtImpl implements LanguagesExt {
|
|
|
204
205
|
}
|
|
205
206
|
|
|
206
207
|
private transformDocumentSelector(selector: theia.DocumentSelector): SerializedDocumentFilter[] {
|
|
207
|
-
if (
|
|
208
|
+
if (isReadonlyArray(selector)) {
|
|
208
209
|
return selector.map(sel => this.doTransformDocumentSelector(sel)!);
|
|
209
210
|
}
|
|
210
211
|
|