@theia/debug 1.53.0-next.5 → 1.53.0-next.55
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/README.md +62 -62
- package/lib/browser/debug-configuration-manager.js +6 -6
- package/lib/browser/debug-frontend-application-contribution.d.ts.map +1 -1
- package/lib/browser/debug-frontend-application-contribution.js.map +1 -1
- package/lib/common/inline-debug-adapter.d.ts +1 -0
- package/lib/common/inline-debug-adapter.d.ts.map +1 -1
- package/package.json +16 -16
- package/src/browser/breakpoint/breakpoint-manager.ts +369 -369
- package/src/browser/breakpoint/breakpoint-marker.ts +104 -104
- package/src/browser/console/debug-console-contribution.tsx +240 -240
- package/src/browser/console/debug-console-items.tsx +384 -384
- package/src/browser/console/debug-console-session.ts +205 -205
- package/src/browser/debug-call-stack-item-type-key.ts +20 -20
- package/src/browser/debug-configuration-manager.ts +591 -591
- package/src/browser/debug-configuration-model.ts +100 -100
- package/src/browser/debug-contribution.ts +43 -43
- package/src/browser/debug-frontend-application-contribution.ts +1551 -1551
- package/src/browser/debug-frontend-module.ts +133 -133
- package/src/browser/debug-package.spec.ts +20 -20
- package/src/browser/debug-preferences.ts +98 -98
- package/src/browser/debug-prefix-configuration.ts +195 -195
- package/src/browser/debug-resource.ts +59 -59
- package/src/browser/debug-schema-updater.ts +149 -149
- package/src/browser/debug-session-connection.ts +357 -357
- package/src/browser/debug-session-contribution.ts +157 -157
- package/src/browser/debug-session-manager.ts +683 -683
- package/src/browser/debug-session-options.ts +120 -120
- package/src/browser/debug-session.tsx +974 -974
- package/src/browser/debug-tab-bar-decorator.ts +57 -57
- package/src/browser/debug-watch-manager.ts +93 -93
- package/src/browser/disassembly-view/disassembly-view-accessibility-provider.ts +43 -43
- package/src/browser/disassembly-view/disassembly-view-breakpoint-renderer.ts +119 -119
- package/src/browser/disassembly-view/disassembly-view-contribution.ts +109 -109
- package/src/browser/disassembly-view/disassembly-view-instruction-renderer.ts +245 -245
- package/src/browser/disassembly-view/disassembly-view-table-delegate.ts +39 -39
- package/src/browser/disassembly-view/disassembly-view-utilities.ts +55 -55
- package/src/browser/disassembly-view/disassembly-view-widget.ts +463 -463
- package/src/browser/editor/debug-breakpoint-widget.tsx +293 -293
- package/src/browser/editor/debug-editor-model.ts +529 -529
- package/src/browser/editor/debug-editor-service.ts +192 -192
- package/src/browser/editor/debug-editor.ts +20 -20
- package/src/browser/editor/debug-exception-widget.tsx +122 -122
- package/src/browser/editor/debug-expression-provider.ts +78 -78
- package/src/browser/editor/debug-hover-source.tsx +105 -105
- package/src/browser/editor/debug-hover-widget.ts +298 -298
- package/src/browser/editor/debug-inline-value-decorator.ts +373 -373
- package/src/browser/model/debug-breakpoint.tsx +151 -151
- package/src/browser/model/debug-function-breakpoint.tsx +101 -101
- package/src/browser/model/debug-instruction-breakpoint.tsx +68 -68
- package/src/browser/model/debug-source-breakpoint.tsx +237 -237
- package/src/browser/model/debug-source.ts +93 -93
- package/src/browser/model/debug-stack-frame.tsx +177 -177
- package/src/browser/model/debug-thread.tsx +292 -292
- package/src/browser/preferences/launch-preferences.ts +38 -38
- package/src/browser/style/index.css +453 -453
- package/src/browser/view/debug-action.tsx +57 -57
- package/src/browser/view/debug-breakpoints-source.tsx +53 -53
- package/src/browser/view/debug-breakpoints-widget.ts +71 -71
- package/src/browser/view/debug-configuration-select.tsx +269 -269
- package/src/browser/view/debug-configuration-widget.tsx +121 -121
- package/src/browser/view/debug-exception-breakpoint.tsx +68 -68
- package/src/browser/view/debug-session-widget.ts +124 -124
- package/src/browser/view/debug-stack-frames-source.tsx +75 -75
- package/src/browser/view/debug-stack-frames-widget.ts +135 -135
- package/src/browser/view/debug-threads-source.tsx +48 -48
- package/src/browser/view/debug-threads-widget.ts +126 -126
- package/src/browser/view/debug-toolbar-widget.tsx +145 -145
- package/src/browser/view/debug-variables-source.ts +43 -43
- package/src/browser/view/debug-variables-widget.ts +61 -61
- package/src/browser/view/debug-view-model.ts +230 -230
- package/src/browser/view/debug-watch-expression.tsx +88 -88
- package/src/browser/view/debug-watch-source.ts +41 -41
- package/src/browser/view/debug-watch-widget.ts +61 -61
- package/src/browser/view/debug-widget.ts +97 -97
- package/src/common/debug-adapter-contribution-registry.ts +206 -206
- package/src/common/debug-adapter-session.ts +102 -102
- package/src/common/debug-common.ts +19 -19
- package/src/common/debug-compound.ts +33 -33
- package/src/common/debug-configuration.ts +112 -112
- package/src/common/debug-model.ts +200 -200
- package/src/common/debug-service.ts +184 -184
- package/src/common/debug-uri-utils.ts +24 -24
- package/src/common/inline-debug-adapter.ts +47 -47
- package/src/node/debug-adapter-factory.ts +107 -107
- package/src/node/debug-adapter-session-manager.ts +106 -106
- package/src/node/debug-backend-module.ts +57 -57
- package/src/node/debug-service-impl.ts +119 -119
- package/src/node/stream-debug-adapter.ts +126 -126
|
@@ -1,269 +1,269 @@
|
|
|
1
|
-
/********************************************************************************
|
|
2
|
-
* Copyright (C) 2021 Ericsson 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-only WITH Classpath-exception-2.0
|
|
15
|
-
********************************************************************************/
|
|
16
|
-
|
|
17
|
-
import URI from '@theia/core/lib/common/uri';
|
|
18
|
-
import * as React from '@theia/core/shared/react';
|
|
19
|
-
import { DebugConfigurationManager } from '../debug-configuration-manager';
|
|
20
|
-
import { DebugSessionOptions } from '../debug-session-options';
|
|
21
|
-
import { SelectComponent, SelectOption } from '@theia/core/lib/browser/widgets/select-component';
|
|
22
|
-
import { QuickInputService } from '@theia/core/lib/browser';
|
|
23
|
-
import { nls } from '@theia/core/lib/common/nls';
|
|
24
|
-
|
|
25
|
-
interface DynamicPickItem { label: string, configurationType: string, request: string, providerType: string, workspaceFolderUri?: string }
|
|
26
|
-
|
|
27
|
-
export interface DebugConfigurationSelectProps {
|
|
28
|
-
manager: DebugConfigurationManager,
|
|
29
|
-
quickInputService: QuickInputService,
|
|
30
|
-
isMultiRoot: boolean
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export interface DebugProviderSelectState {
|
|
34
|
-
providerTypes: string[],
|
|
35
|
-
currentValue: string | undefined
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export class DebugConfigurationSelect extends React.Component<DebugConfigurationSelectProps, DebugProviderSelectState> {
|
|
39
|
-
protected static readonly SEPARATOR = '──────────';
|
|
40
|
-
protected static readonly PICK = '__PICK__';
|
|
41
|
-
protected static readonly NO_CONFIGURATION = '__NO_CONF__';
|
|
42
|
-
protected static readonly ADD_CONFIGURATION = '__ADD_CONF__';
|
|
43
|
-
protected static readonly CONFIG_MARKER = '__CONFIG__';
|
|
44
|
-
|
|
45
|
-
private readonly selectRef = React.createRef<SelectComponent>();
|
|
46
|
-
private manager: DebugConfigurationManager;
|
|
47
|
-
private quickInputService: QuickInputService;
|
|
48
|
-
|
|
49
|
-
constructor(props: DebugConfigurationSelectProps) {
|
|
50
|
-
super(props);
|
|
51
|
-
this.manager = props.manager;
|
|
52
|
-
this.quickInputService = props.quickInputService;
|
|
53
|
-
this.state = {
|
|
54
|
-
providerTypes: [],
|
|
55
|
-
currentValue: undefined
|
|
56
|
-
};
|
|
57
|
-
this.manager.onDidChangeConfigurationProviders(() => {
|
|
58
|
-
this.refreshDebugConfigurations();
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
override componentDidUpdate(): void {
|
|
63
|
-
// synchronize the currentValue with the selectComponent value
|
|
64
|
-
if (this.selectRef.current?.value !== this.currentValue) {
|
|
65
|
-
this.refreshDebugConfigurations();
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
override componentDidMount(): void {
|
|
70
|
-
this.refreshDebugConfigurations();
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
override render(): React.ReactNode {
|
|
74
|
-
return <SelectComponent
|
|
75
|
-
options={this.renderOptions()}
|
|
76
|
-
defaultValue={this.state.currentValue}
|
|
77
|
-
onChange={option => this.setCurrentConfiguration(option)}
|
|
78
|
-
onFocus={() => this.refreshDebugConfigurations()}
|
|
79
|
-
onBlur={() => this.refreshDebugConfigurations()}
|
|
80
|
-
ref={this.selectRef}
|
|
81
|
-
/>;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
protected get currentValue(): string {
|
|
85
|
-
const { current } = this.manager;
|
|
86
|
-
const matchingOption = this.getCurrentOption(current);
|
|
87
|
-
return matchingOption ? matchingOption.value! : current ? JSON.stringify(current) : DebugConfigurationSelect.NO_CONFIGURATION;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
protected getCurrentOption(current: DebugSessionOptions | undefined): SelectOption | undefined {
|
|
91
|
-
if (!current || !this.selectRef.current) {
|
|
92
|
-
return;
|
|
93
|
-
}
|
|
94
|
-
const matchingOption = this.selectRef.current!.options.find(option =>
|
|
95
|
-
option.userData === DebugConfigurationSelect.CONFIG_MARKER
|
|
96
|
-
&& this.matchesOption(JSON.parse(option.value!), current)
|
|
97
|
-
);
|
|
98
|
-
return matchingOption;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
protected matchesOption(sessionOption: DebugSessionOptions, current: DebugSessionOptions): boolean {
|
|
102
|
-
const matchesNameAndWorkspace = sessionOption.name === current.name && sessionOption.workspaceFolderUri === current.workspaceFolderUri;
|
|
103
|
-
return DebugSessionOptions.isConfiguration(sessionOption) && DebugSessionOptions.isConfiguration(current)
|
|
104
|
-
? matchesNameAndWorkspace && sessionOption.providerType === current.providerType
|
|
105
|
-
: matchesNameAndWorkspace;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
protected readonly setCurrentConfiguration = (option: SelectOption) => {
|
|
109
|
-
const value = option.value;
|
|
110
|
-
if (!value) {
|
|
111
|
-
return false;
|
|
112
|
-
} else if (value === DebugConfigurationSelect.ADD_CONFIGURATION) {
|
|
113
|
-
setTimeout(() => this.manager.addConfiguration());
|
|
114
|
-
} else if (value.startsWith(DebugConfigurationSelect.PICK)) {
|
|
115
|
-
const providerType = this.parsePickValue(value);
|
|
116
|
-
this.selectDynamicConfigFromQuickPick(providerType);
|
|
117
|
-
} else {
|
|
118
|
-
const data = JSON.parse(value) as DebugSessionOptions;
|
|
119
|
-
this.manager.current = data;
|
|
120
|
-
this.refreshDebugConfigurations();
|
|
121
|
-
}
|
|
122
|
-
};
|
|
123
|
-
|
|
124
|
-
protected toPickValue(providerType: string): string {
|
|
125
|
-
return DebugConfigurationSelect.PICK + providerType;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
protected parsePickValue(value: string): string {
|
|
129
|
-
return value.slice(DebugConfigurationSelect.PICK.length);
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
protected async resolveDynamicConfigurationPicks(providerType: string): Promise<DynamicPickItem[]> {
|
|
133
|
-
const configurationsOfProviderType =
|
|
134
|
-
(await this.manager.provideDynamicDebugConfigurations())[providerType];
|
|
135
|
-
|
|
136
|
-
if (!configurationsOfProviderType) {
|
|
137
|
-
return [];
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
return configurationsOfProviderType.map(options => ({
|
|
141
|
-
label: options.configuration.name,
|
|
142
|
-
configurationType: options.configuration.type,
|
|
143
|
-
request: options.configuration.request,
|
|
144
|
-
providerType: options.providerType,
|
|
145
|
-
description: this.toBaseName(options.workspaceFolderUri),
|
|
146
|
-
workspaceFolderUri: options.workspaceFolderUri
|
|
147
|
-
}));
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
protected async selectDynamicConfigFromQuickPick(providerType: string): Promise<void> {
|
|
151
|
-
const picks: DynamicPickItem[] = await this.resolveDynamicConfigurationPicks(providerType);
|
|
152
|
-
|
|
153
|
-
if (picks.length === 0) {
|
|
154
|
-
return;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
const selected: DynamicPickItem | undefined = await this.quickInputService.showQuickPick(
|
|
158
|
-
picks,
|
|
159
|
-
{
|
|
160
|
-
placeholder: nls.localizeByDefault('Select Launch Configuration')
|
|
161
|
-
}
|
|
162
|
-
);
|
|
163
|
-
|
|
164
|
-
if (!selected) {
|
|
165
|
-
return;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
const selectedConfiguration = {
|
|
169
|
-
name: selected.label,
|
|
170
|
-
type: selected.configurationType,
|
|
171
|
-
request: selected.request
|
|
172
|
-
};
|
|
173
|
-
this.manager.current = this.manager.find(selectedConfiguration, selected.workspaceFolderUri, selected.providerType);
|
|
174
|
-
this.refreshDebugConfigurations();
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
protected refreshDebugConfigurations = async () => {
|
|
178
|
-
const configsOptionsPerType = await this.manager.provideDynamicDebugConfigurations();
|
|
179
|
-
const providerTypes = [];
|
|
180
|
-
for (const [type, configurationsOptions] of Object.entries(configsOptionsPerType)) {
|
|
181
|
-
if (configurationsOptions.length > 0) {
|
|
182
|
-
providerTypes.push(type);
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
const value = this.currentValue;
|
|
187
|
-
this.selectRef.current!.value = value;
|
|
188
|
-
this.setState({ providerTypes, currentValue: value });
|
|
189
|
-
};
|
|
190
|
-
|
|
191
|
-
protected renderOptions(): SelectOption[] {
|
|
192
|
-
const options: SelectOption[] = [];
|
|
193
|
-
|
|
194
|
-
// Add non dynamic debug configurations
|
|
195
|
-
for (const config of this.manager.all) {
|
|
196
|
-
const value = JSON.stringify(config);
|
|
197
|
-
options.push({
|
|
198
|
-
value,
|
|
199
|
-
label: this.toName(config, this.props.isMultiRoot),
|
|
200
|
-
userData: DebugConfigurationSelect.CONFIG_MARKER
|
|
201
|
-
});
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
// Add recently used dynamic debug configurations
|
|
205
|
-
const { recentDynamicOptions } = this.manager;
|
|
206
|
-
if (recentDynamicOptions.length > 0) {
|
|
207
|
-
if (options.length > 0) {
|
|
208
|
-
options.push({
|
|
209
|
-
separator: true
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
for (const dynamicOption of recentDynamicOptions) {
|
|
213
|
-
const value = JSON.stringify(dynamicOption);
|
|
214
|
-
options.push({
|
|
215
|
-
value,
|
|
216
|
-
label: this.toName(dynamicOption, this.props.isMultiRoot) + ' (' + dynamicOption.providerType + ')',
|
|
217
|
-
userData: DebugConfigurationSelect.CONFIG_MARKER
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
// Placing a 'No Configuration' entry enables proper functioning of the 'onChange' event, by
|
|
223
|
-
// having an entry to switch from (E.g. a case where only one dynamic configuration type is available)
|
|
224
|
-
if (options.length === 0) {
|
|
225
|
-
const value = DebugConfigurationSelect.NO_CONFIGURATION;
|
|
226
|
-
options.push({
|
|
227
|
-
value,
|
|
228
|
-
label: nls.localizeByDefault('No Configurations')
|
|
229
|
-
});
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
// Add dynamic configuration types for quick pick selection
|
|
233
|
-
const types = this.state.providerTypes;
|
|
234
|
-
if (types.length > 0) {
|
|
235
|
-
options.push({
|
|
236
|
-
separator: true
|
|
237
|
-
});
|
|
238
|
-
for (const type of types) {
|
|
239
|
-
const value = this.toPickValue(type);
|
|
240
|
-
options.push({
|
|
241
|
-
value,
|
|
242
|
-
label: type + '...'
|
|
243
|
-
});
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
options.push({
|
|
248
|
-
separator: true
|
|
249
|
-
});
|
|
250
|
-
options.push({
|
|
251
|
-
value: DebugConfigurationSelect.ADD_CONFIGURATION,
|
|
252
|
-
label: nls.localizeByDefault('Add Configuration...')
|
|
253
|
-
});
|
|
254
|
-
|
|
255
|
-
return options;
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
protected toName(options: DebugSessionOptions, multiRoot: boolean): string {
|
|
259
|
-
const name = options.configuration?.name ?? options.name;
|
|
260
|
-
if (!options.workspaceFolderUri || !multiRoot) {
|
|
261
|
-
return name;
|
|
262
|
-
}
|
|
263
|
-
return `${name} (${this.toBaseName(options.workspaceFolderUri)})`;
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
protected toBaseName(uri: string | undefined): string {
|
|
267
|
-
return uri ? new URI(uri).path.base : '';
|
|
268
|
-
}
|
|
269
|
-
}
|
|
1
|
+
/********************************************************************************
|
|
2
|
+
* Copyright (C) 2021 Ericsson 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-only WITH Classpath-exception-2.0
|
|
15
|
+
********************************************************************************/
|
|
16
|
+
|
|
17
|
+
import URI from '@theia/core/lib/common/uri';
|
|
18
|
+
import * as React from '@theia/core/shared/react';
|
|
19
|
+
import { DebugConfigurationManager } from '../debug-configuration-manager';
|
|
20
|
+
import { DebugSessionOptions } from '../debug-session-options';
|
|
21
|
+
import { SelectComponent, SelectOption } from '@theia/core/lib/browser/widgets/select-component';
|
|
22
|
+
import { QuickInputService } from '@theia/core/lib/browser';
|
|
23
|
+
import { nls } from '@theia/core/lib/common/nls';
|
|
24
|
+
|
|
25
|
+
interface DynamicPickItem { label: string, configurationType: string, request: string, providerType: string, workspaceFolderUri?: string }
|
|
26
|
+
|
|
27
|
+
export interface DebugConfigurationSelectProps {
|
|
28
|
+
manager: DebugConfigurationManager,
|
|
29
|
+
quickInputService: QuickInputService,
|
|
30
|
+
isMultiRoot: boolean
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface DebugProviderSelectState {
|
|
34
|
+
providerTypes: string[],
|
|
35
|
+
currentValue: string | undefined
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export class DebugConfigurationSelect extends React.Component<DebugConfigurationSelectProps, DebugProviderSelectState> {
|
|
39
|
+
protected static readonly SEPARATOR = '──────────';
|
|
40
|
+
protected static readonly PICK = '__PICK__';
|
|
41
|
+
protected static readonly NO_CONFIGURATION = '__NO_CONF__';
|
|
42
|
+
protected static readonly ADD_CONFIGURATION = '__ADD_CONF__';
|
|
43
|
+
protected static readonly CONFIG_MARKER = '__CONFIG__';
|
|
44
|
+
|
|
45
|
+
private readonly selectRef = React.createRef<SelectComponent>();
|
|
46
|
+
private manager: DebugConfigurationManager;
|
|
47
|
+
private quickInputService: QuickInputService;
|
|
48
|
+
|
|
49
|
+
constructor(props: DebugConfigurationSelectProps) {
|
|
50
|
+
super(props);
|
|
51
|
+
this.manager = props.manager;
|
|
52
|
+
this.quickInputService = props.quickInputService;
|
|
53
|
+
this.state = {
|
|
54
|
+
providerTypes: [],
|
|
55
|
+
currentValue: undefined
|
|
56
|
+
};
|
|
57
|
+
this.manager.onDidChangeConfigurationProviders(() => {
|
|
58
|
+
this.refreshDebugConfigurations();
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
override componentDidUpdate(): void {
|
|
63
|
+
// synchronize the currentValue with the selectComponent value
|
|
64
|
+
if (this.selectRef.current?.value !== this.currentValue) {
|
|
65
|
+
this.refreshDebugConfigurations();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
override componentDidMount(): void {
|
|
70
|
+
this.refreshDebugConfigurations();
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
override render(): React.ReactNode {
|
|
74
|
+
return <SelectComponent
|
|
75
|
+
options={this.renderOptions()}
|
|
76
|
+
defaultValue={this.state.currentValue}
|
|
77
|
+
onChange={option => this.setCurrentConfiguration(option)}
|
|
78
|
+
onFocus={() => this.refreshDebugConfigurations()}
|
|
79
|
+
onBlur={() => this.refreshDebugConfigurations()}
|
|
80
|
+
ref={this.selectRef}
|
|
81
|
+
/>;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
protected get currentValue(): string {
|
|
85
|
+
const { current } = this.manager;
|
|
86
|
+
const matchingOption = this.getCurrentOption(current);
|
|
87
|
+
return matchingOption ? matchingOption.value! : current ? JSON.stringify(current) : DebugConfigurationSelect.NO_CONFIGURATION;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
protected getCurrentOption(current: DebugSessionOptions | undefined): SelectOption | undefined {
|
|
91
|
+
if (!current || !this.selectRef.current) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const matchingOption = this.selectRef.current!.options.find(option =>
|
|
95
|
+
option.userData === DebugConfigurationSelect.CONFIG_MARKER
|
|
96
|
+
&& this.matchesOption(JSON.parse(option.value!), current)
|
|
97
|
+
);
|
|
98
|
+
return matchingOption;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
protected matchesOption(sessionOption: DebugSessionOptions, current: DebugSessionOptions): boolean {
|
|
102
|
+
const matchesNameAndWorkspace = sessionOption.name === current.name && sessionOption.workspaceFolderUri === current.workspaceFolderUri;
|
|
103
|
+
return DebugSessionOptions.isConfiguration(sessionOption) && DebugSessionOptions.isConfiguration(current)
|
|
104
|
+
? matchesNameAndWorkspace && sessionOption.providerType === current.providerType
|
|
105
|
+
: matchesNameAndWorkspace;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
protected readonly setCurrentConfiguration = (option: SelectOption) => {
|
|
109
|
+
const value = option.value;
|
|
110
|
+
if (!value) {
|
|
111
|
+
return false;
|
|
112
|
+
} else if (value === DebugConfigurationSelect.ADD_CONFIGURATION) {
|
|
113
|
+
setTimeout(() => this.manager.addConfiguration());
|
|
114
|
+
} else if (value.startsWith(DebugConfigurationSelect.PICK)) {
|
|
115
|
+
const providerType = this.parsePickValue(value);
|
|
116
|
+
this.selectDynamicConfigFromQuickPick(providerType);
|
|
117
|
+
} else {
|
|
118
|
+
const data = JSON.parse(value) as DebugSessionOptions;
|
|
119
|
+
this.manager.current = data;
|
|
120
|
+
this.refreshDebugConfigurations();
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
protected toPickValue(providerType: string): string {
|
|
125
|
+
return DebugConfigurationSelect.PICK + providerType;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
protected parsePickValue(value: string): string {
|
|
129
|
+
return value.slice(DebugConfigurationSelect.PICK.length);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
protected async resolveDynamicConfigurationPicks(providerType: string): Promise<DynamicPickItem[]> {
|
|
133
|
+
const configurationsOfProviderType =
|
|
134
|
+
(await this.manager.provideDynamicDebugConfigurations())[providerType];
|
|
135
|
+
|
|
136
|
+
if (!configurationsOfProviderType) {
|
|
137
|
+
return [];
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return configurationsOfProviderType.map(options => ({
|
|
141
|
+
label: options.configuration.name,
|
|
142
|
+
configurationType: options.configuration.type,
|
|
143
|
+
request: options.configuration.request,
|
|
144
|
+
providerType: options.providerType,
|
|
145
|
+
description: this.toBaseName(options.workspaceFolderUri),
|
|
146
|
+
workspaceFolderUri: options.workspaceFolderUri
|
|
147
|
+
}));
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
protected async selectDynamicConfigFromQuickPick(providerType: string): Promise<void> {
|
|
151
|
+
const picks: DynamicPickItem[] = await this.resolveDynamicConfigurationPicks(providerType);
|
|
152
|
+
|
|
153
|
+
if (picks.length === 0) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const selected: DynamicPickItem | undefined = await this.quickInputService.showQuickPick(
|
|
158
|
+
picks,
|
|
159
|
+
{
|
|
160
|
+
placeholder: nls.localizeByDefault('Select Launch Configuration')
|
|
161
|
+
}
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
if (!selected) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const selectedConfiguration = {
|
|
169
|
+
name: selected.label,
|
|
170
|
+
type: selected.configurationType,
|
|
171
|
+
request: selected.request
|
|
172
|
+
};
|
|
173
|
+
this.manager.current = this.manager.find(selectedConfiguration, selected.workspaceFolderUri, selected.providerType);
|
|
174
|
+
this.refreshDebugConfigurations();
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
protected refreshDebugConfigurations = async () => {
|
|
178
|
+
const configsOptionsPerType = await this.manager.provideDynamicDebugConfigurations();
|
|
179
|
+
const providerTypes = [];
|
|
180
|
+
for (const [type, configurationsOptions] of Object.entries(configsOptionsPerType)) {
|
|
181
|
+
if (configurationsOptions.length > 0) {
|
|
182
|
+
providerTypes.push(type);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const value = this.currentValue;
|
|
187
|
+
this.selectRef.current!.value = value;
|
|
188
|
+
this.setState({ providerTypes, currentValue: value });
|
|
189
|
+
};
|
|
190
|
+
|
|
191
|
+
protected renderOptions(): SelectOption[] {
|
|
192
|
+
const options: SelectOption[] = [];
|
|
193
|
+
|
|
194
|
+
// Add non dynamic debug configurations
|
|
195
|
+
for (const config of this.manager.all) {
|
|
196
|
+
const value = JSON.stringify(config);
|
|
197
|
+
options.push({
|
|
198
|
+
value,
|
|
199
|
+
label: this.toName(config, this.props.isMultiRoot),
|
|
200
|
+
userData: DebugConfigurationSelect.CONFIG_MARKER
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// Add recently used dynamic debug configurations
|
|
205
|
+
const { recentDynamicOptions } = this.manager;
|
|
206
|
+
if (recentDynamicOptions.length > 0) {
|
|
207
|
+
if (options.length > 0) {
|
|
208
|
+
options.push({
|
|
209
|
+
separator: true
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
for (const dynamicOption of recentDynamicOptions) {
|
|
213
|
+
const value = JSON.stringify(dynamicOption);
|
|
214
|
+
options.push({
|
|
215
|
+
value,
|
|
216
|
+
label: this.toName(dynamicOption, this.props.isMultiRoot) + ' (' + dynamicOption.providerType + ')',
|
|
217
|
+
userData: DebugConfigurationSelect.CONFIG_MARKER
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// Placing a 'No Configuration' entry enables proper functioning of the 'onChange' event, by
|
|
223
|
+
// having an entry to switch from (E.g. a case where only one dynamic configuration type is available)
|
|
224
|
+
if (options.length === 0) {
|
|
225
|
+
const value = DebugConfigurationSelect.NO_CONFIGURATION;
|
|
226
|
+
options.push({
|
|
227
|
+
value,
|
|
228
|
+
label: nls.localizeByDefault('No Configurations')
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// Add dynamic configuration types for quick pick selection
|
|
233
|
+
const types = this.state.providerTypes;
|
|
234
|
+
if (types.length > 0) {
|
|
235
|
+
options.push({
|
|
236
|
+
separator: true
|
|
237
|
+
});
|
|
238
|
+
for (const type of types) {
|
|
239
|
+
const value = this.toPickValue(type);
|
|
240
|
+
options.push({
|
|
241
|
+
value,
|
|
242
|
+
label: type + '...'
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
options.push({
|
|
248
|
+
separator: true
|
|
249
|
+
});
|
|
250
|
+
options.push({
|
|
251
|
+
value: DebugConfigurationSelect.ADD_CONFIGURATION,
|
|
252
|
+
label: nls.localizeByDefault('Add Configuration...')
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
return options;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
protected toName(options: DebugSessionOptions, multiRoot: boolean): string {
|
|
259
|
+
const name = options.configuration?.name ?? options.name;
|
|
260
|
+
if (!options.workspaceFolderUri || !multiRoot) {
|
|
261
|
+
return name;
|
|
262
|
+
}
|
|
263
|
+
return `${name} (${this.toBaseName(options.workspaceFolderUri)})`;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
protected toBaseName(uri: string | undefined): string {
|
|
267
|
+
return uri ? new URI(uri).path.base : '';
|
|
268
|
+
}
|
|
269
|
+
}
|