@jupyterlab/debugger 4.0.0-alpha.9 → 4.0.0-beta.1
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/lib/debugger.d.ts +3 -1
- package/lib/debugger.js +5 -3
- package/lib/debugger.js.map +1 -1
- package/lib/dialogs/evaluate.d.ts +5 -0
- package/lib/dialogs/evaluate.js +16 -6
- package/lib/dialogs/evaluate.js.map +1 -1
- package/lib/factory.d.ts +1 -1
- package/lib/factory.js +15 -9
- package/lib/factory.js.map +1 -1
- package/lib/handler.js +15 -7
- package/lib/handler.js.map +1 -1
- package/lib/handlers/console.js +9 -3
- package/lib/handlers/console.js.map +1 -1
- package/lib/handlers/editor.d.ts +26 -12
- package/lib/handlers/editor.js +166 -89
- package/lib/handlers/editor.js.map +1 -1
- package/lib/handlers/file.js +6 -2
- package/lib/handlers/file.js.map +1 -1
- package/lib/handlers/notebook.d.ts +0 -7
- package/lib/handlers/notebook.js +11 -17
- package/lib/handlers/notebook.js.map +1 -1
- package/lib/icons.d.ts +2 -1
- package/lib/icons.js +6 -1
- package/lib/icons.js.map +1 -1
- package/lib/model.js +1 -0
- package/lib/model.js.map +1 -1
- package/lib/panels/breakpoints/index.d.ts +2 -2
- package/lib/panels/breakpoints/index.js +9 -7
- package/lib/panels/breakpoints/index.js.map +1 -1
- package/lib/panels/breakpoints/pauseonexceptions.d.ts +53 -0
- package/lib/panels/breakpoints/pauseonexceptions.js +98 -0
- package/lib/panels/breakpoints/pauseonexceptions.js.map +1 -0
- package/lib/panels/callstack/index.d.ts +1 -1
- package/lib/panels/kernelSources/body.d.ts +5 -7
- package/lib/panels/kernelSources/body.js +37 -47
- package/lib/panels/kernelSources/body.js.map +1 -1
- package/lib/panels/kernelSources/filter.d.ts +1 -2
- package/lib/panels/kernelSources/filter.js +2 -2
- package/lib/panels/kernelSources/filter.js.map +1 -1
- package/lib/panels/kernelSources/index.js +1 -1
- package/lib/panels/kernelSources/index.js.map +1 -1
- package/lib/panels/kernelSources/model.d.ts +10 -1
- package/lib/panels/kernelSources/model.js +19 -1
- package/lib/panels/kernelSources/model.js.map +1 -1
- package/lib/panels/sources/body.js +5 -3
- package/lib/panels/sources/body.js.map +1 -1
- package/lib/panels/sources/sourcepath.js +1 -1
- package/lib/panels/sources/sourcepath.js.map +1 -1
- package/lib/panels/variables/grid.d.ts +23 -10
- package/lib/panels/variables/grid.js +42 -367
- package/lib/panels/variables/grid.js.map +1 -1
- package/lib/panels/variables/gridpanel.d.ts +138 -0
- package/lib/panels/variables/gridpanel.js +362 -0
- package/lib/panels/variables/gridpanel.js.map +1 -0
- package/lib/panels/variables/mimerenderer.js +9 -1
- package/lib/panels/variables/mimerenderer.js.map +1 -1
- package/lib/panels/variables/scope.js +4 -0
- package/lib/panels/variables/scope.js.map +1 -1
- package/lib/panels/variables/tree.d.ts +1 -0
- package/lib/panels/variables/tree.js +136 -47
- package/lib/panels/variables/tree.js.map +1 -1
- package/lib/service.d.ts +20 -6
- package/lib/service.js +84 -59
- package/lib/service.js.map +1 -1
- package/lib/session.d.ts +20 -6
- package/lib/session.js +59 -11
- package/lib/session.js.map +1 -1
- package/lib/sidebar.js +1 -1
- package/lib/sources.d.ts +2 -2
- package/lib/sources.js +32 -17
- package/lib/sources.js.map +1 -1
- package/lib/tokens.d.ts +57 -13
- package/lib/tokens.js.map +1 -1
- package/package.json +38 -46
- package/src/config.ts +78 -0
- package/src/debugger.ts +154 -0
- package/src/dialogs/evaluate.ts +144 -0
- package/src/factory.ts +72 -0
- package/src/handler.ts +528 -0
- package/src/handlers/console.ts +118 -0
- package/src/handlers/editor.ts +469 -0
- package/src/handlers/file.ts +86 -0
- package/src/handlers/notebook.ts +128 -0
- package/src/hash.ts +69 -0
- package/src/icons.ts +64 -0
- package/src/index.ts +16 -0
- package/src/model.ts +155 -0
- package/src/panels/breakpoints/body.tsx +145 -0
- package/src/panels/breakpoints/index.ts +116 -0
- package/src/panels/breakpoints/model.ts +74 -0
- package/src/panels/breakpoints/pauseonexceptions.tsx +141 -0
- package/src/panels/callstack/body.tsx +96 -0
- package/src/panels/callstack/index.ts +152 -0
- package/src/panels/callstack/model.ts +86 -0
- package/src/panels/kernelSources/body.tsx +139 -0
- package/src/panels/kernelSources/filter.tsx +44 -0
- package/src/panels/kernelSources/index.tsx +106 -0
- package/src/panels/kernelSources/model.ts +160 -0
- package/src/panels/sources/body.ts +161 -0
- package/src/panels/sources/index.tsx +85 -0
- package/src/panels/sources/model.ts +94 -0
- package/src/panels/sources/sourcepath.tsx +31 -0
- package/src/panels/variables/grid.ts +145 -0
- package/src/panels/variables/gridpanel.ts +453 -0
- package/src/panels/variables/index.ts +199 -0
- package/src/panels/variables/mimerenderer.ts +125 -0
- package/src/panels/variables/model.ts +61 -0
- package/src/panels/variables/scope.tsx +132 -0
- package/src/panels/variables/tree.tsx +521 -0
- package/src/service.ts +1009 -0
- package/src/session.ts +342 -0
- package/src/sidebar.ts +194 -0
- package/src/sources.ts +327 -0
- package/src/svg.d.ts +9 -0
- package/src/tokens.ts +1071 -0
- package/style/breakpoints.css +21 -12
- package/style/callstack.css +2 -2
- package/style/icons/exceptions.svg +10 -0
- package/style/index.css +1 -1
- package/style/index.js +1 -1
- package/style/kernelSources.css +3 -9
- package/style/sources.css +1 -1
- package/style/variables.css +68 -21
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
// Copyright (c) Jupyter Development Team.
|
|
2
2
|
// Distributed under the terms of the Modified BSD License.
|
|
3
3
|
import { nullTranslator } from '@jupyterlab/translation';
|
|
4
|
+
import { Signal } from '@lumino/signaling';
|
|
4
5
|
import { caretDownEmptyIcon, ReactWidget, searchIcon } from '@jupyterlab/ui-components';
|
|
5
6
|
import { ArrayExt } from '@lumino/algorithm';
|
|
6
|
-
import React, { useEffect, useState } from 'react';
|
|
7
|
+
import React, { useCallback, useEffect, useState } from 'react';
|
|
7
8
|
import { convertType } from '.';
|
|
8
9
|
import { Debugger } from '../../debugger';
|
|
10
|
+
const BUTTONS_CLASS = 'jp-DebuggerVariables-buttons';
|
|
9
11
|
/**
|
|
10
12
|
* The body for tree of variables.
|
|
11
13
|
*/
|
|
@@ -23,6 +25,7 @@ export class VariablesBodyTree extends ReactWidget {
|
|
|
23
25
|
this._commands = options.commands;
|
|
24
26
|
this._service = options.service;
|
|
25
27
|
this._translator = options.translator;
|
|
28
|
+
this._hoverChanged = new Signal(this);
|
|
26
29
|
const model = (this.model = options.model);
|
|
27
30
|
model.changed.connect(this._updateScopes, this);
|
|
28
31
|
this.addClass('jp-DebuggerVariables-body');
|
|
@@ -33,9 +36,15 @@ export class VariablesBodyTree extends ReactWidget {
|
|
|
33
36
|
render() {
|
|
34
37
|
var _a;
|
|
35
38
|
const scope = (_a = this._scopes.find(scope => scope.name === this._scope)) !== null && _a !== void 0 ? _a : this._scopes[0];
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
+
const handleSelectVariable = (variable) => {
|
|
40
|
+
this.model.selectedVariable = variable;
|
|
41
|
+
};
|
|
42
|
+
const collapserIcon = (React.createElement(caretDownEmptyIcon.react, { stylesheet: "menuItem", tag: "span" }));
|
|
43
|
+
return scope ? (React.createElement(React.Fragment, null,
|
|
44
|
+
React.createElement(VariablesBranch, { key: scope.name, commands: this._commands, service: this._service, data: scope.variables, filter: this._filter, translator: this._translator, handleSelectVariable: handleSelectVariable, onHoverChanged: (data) => {
|
|
45
|
+
this._hoverChanged.emit(data);
|
|
46
|
+
}, collapserIcon: collapserIcon }),
|
|
47
|
+
React.createElement(TreeButtons, { commands: this._commands, service: this._service, hoverChanged: this._hoverChanged, handleSelectVariable: handleSelectVariable }))) : (React.createElement("div", null));
|
|
39
48
|
}
|
|
40
49
|
/**
|
|
41
50
|
* Set the variable filter list.
|
|
@@ -64,6 +73,91 @@ export class VariablesBodyTree extends ReactWidget {
|
|
|
64
73
|
this.update();
|
|
65
74
|
}
|
|
66
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* The singleton buttons bar shown by the variables.
|
|
78
|
+
*/
|
|
79
|
+
const TreeButtons = (props) => {
|
|
80
|
+
var _a;
|
|
81
|
+
const { commands, service, translator, handleSelectVariable } = props;
|
|
82
|
+
const trans = (translator !== null && translator !== void 0 ? translator : nullTranslator).load('jupyterlab');
|
|
83
|
+
const [buttonsTop, setButtonsTop] = useState(0);
|
|
84
|
+
const [variable, setVariable] = useState(null);
|
|
85
|
+
let stateRefreshLock = 0;
|
|
86
|
+
// Empty dependency array is to only register once per lifetime.
|
|
87
|
+
const handleHover = useCallback((_, data) => {
|
|
88
|
+
const current = ++stateRefreshLock;
|
|
89
|
+
if (!data.variable) {
|
|
90
|
+
// Handle mouse leave.
|
|
91
|
+
if (current !== stateRefreshLock) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const target = data.target;
|
|
95
|
+
if (target &&
|
|
96
|
+
// Note: Element, not HTMLElement to permit entering <svg> icon.
|
|
97
|
+
target instanceof Element &&
|
|
98
|
+
target.closest(`.${BUTTONS_CLASS}`)) {
|
|
99
|
+
// Allow to enter the buttons.
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
setVariable(null);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
// Handle mouse over.
|
|
106
|
+
setVariable(data.variable);
|
|
107
|
+
requestAnimationFrame(() => {
|
|
108
|
+
if (current !== stateRefreshLock || !data.target) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
setButtonsTop(data.target.offsetTop);
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}, []);
|
|
115
|
+
useEffect(() => {
|
|
116
|
+
props.hoverChanged.connect(handleHover);
|
|
117
|
+
return () => {
|
|
118
|
+
props.hoverChanged.disconnect(handleHover);
|
|
119
|
+
};
|
|
120
|
+
}, [handleHover]);
|
|
121
|
+
return (React.createElement("div", { className: BUTTONS_CLASS, style:
|
|
122
|
+
// Positioning and hiding is implemented using compositor-only
|
|
123
|
+
// properties (transform and opacity) for performance.
|
|
124
|
+
{
|
|
125
|
+
transform: `translateY(${buttonsTop}px)`,
|
|
126
|
+
opacity: !variable ||
|
|
127
|
+
// Do not show buttons display for special entries, defined in debugpy:
|
|
128
|
+
// https://github.com/microsoft/debugpy/blob/cf0d684566edc339545b161da7c3dfc48af7c7d5/src/debugpy/_vendored/pydevd/_pydevd_bundle/pydevd_utils.py#L359
|
|
129
|
+
[
|
|
130
|
+
'special variables',
|
|
131
|
+
'protected variables',
|
|
132
|
+
'function variables',
|
|
133
|
+
'class variables'
|
|
134
|
+
].includes(variable.name)
|
|
135
|
+
? 0
|
|
136
|
+
: 1
|
|
137
|
+
} },
|
|
138
|
+
React.createElement("button", { className: "jp-DebuggerVariables-renderVariable", disabled: !variable ||
|
|
139
|
+
!service.model.hasRichVariableRendering ||
|
|
140
|
+
!commands.isEnabled(Debugger.CommandIDs.renderMimeVariable, {
|
|
141
|
+
name: variable.name,
|
|
142
|
+
frameID: (_a = service.model.callstack.frame) === null || _a === void 0 ? void 0 : _a.id
|
|
143
|
+
}), onClick: e => {
|
|
144
|
+
var _a;
|
|
145
|
+
if (!variable || !handleSelectVariable) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
e.stopPropagation();
|
|
149
|
+
handleSelectVariable(variable);
|
|
150
|
+
commands
|
|
151
|
+
.execute(Debugger.CommandIDs.renderMimeVariable, {
|
|
152
|
+
name: variable.name,
|
|
153
|
+
frameID: (_a = service.model.callstack.frame) === null || _a === void 0 ? void 0 : _a.id
|
|
154
|
+
})
|
|
155
|
+
.catch(reason => {
|
|
156
|
+
console.error(`Failed to render variable ${variable === null || variable === void 0 ? void 0 : variable.name}`, reason);
|
|
157
|
+
});
|
|
158
|
+
}, title: trans.__('Render variable: %1', variable === null || variable === void 0 ? void 0 : variable.name) },
|
|
159
|
+
React.createElement(searchIcon.react, { stylesheet: "menuItem", tag: "span" }))));
|
|
160
|
+
};
|
|
67
161
|
/**
|
|
68
162
|
* A React component to display a list of variables.
|
|
69
163
|
*
|
|
@@ -72,17 +166,28 @@ export class VariablesBodyTree extends ReactWidget {
|
|
|
72
166
|
* @param props.service The debugger service.
|
|
73
167
|
* @param props.filter Optional variable filter list.
|
|
74
168
|
*/
|
|
75
|
-
const
|
|
76
|
-
const { commands, data, service, filter, translator, handleSelectVariable } = props;
|
|
169
|
+
const VariablesBranch = (props) => {
|
|
170
|
+
const { commands, data, service, filter, translator, handleSelectVariable, onHoverChanged, collapserIcon } = props;
|
|
77
171
|
const [variables, setVariables] = useState(data);
|
|
78
172
|
useEffect(() => {
|
|
79
173
|
setVariables(data);
|
|
80
174
|
}, [data]);
|
|
81
|
-
return (React.createElement("ul",
|
|
175
|
+
return (React.createElement("ul", { className: "jp-DebuggerVariables-branch" }, variables
|
|
176
|
+
.filter(variable => !(filter || new Set()).has(variable.evaluateName || ''))
|
|
177
|
+
.map(variable => {
|
|
82
178
|
const key = `${variable.name}-${variable.evaluateName}-${variable.type}-${variable.value}-${variable.variablesReference}`;
|
|
83
|
-
return (React.createElement(VariableComponent, { key: key, commands: commands, data: variable, service: service, filter: filter, translator: translator, onSelect: handleSelectVariable }));
|
|
179
|
+
return (React.createElement(VariableComponent, { key: key, commands: commands, data: variable, service: service, filter: filter, translator: translator, onSelect: handleSelectVariable, onHoverChanged: onHoverChanged, collapserIcon: collapserIcon }));
|
|
84
180
|
})));
|
|
85
181
|
};
|
|
182
|
+
function _prepareDetail(variable) {
|
|
183
|
+
const detail = convertType(variable);
|
|
184
|
+
if (variable.type === 'float' && isNaN(detail)) {
|
|
185
|
+
// silence React warning:
|
|
186
|
+
// `Received NaN for the `children` attribute. If this is expected, cast the value to a string`
|
|
187
|
+
return 'NaN';
|
|
188
|
+
}
|
|
189
|
+
return detail;
|
|
190
|
+
}
|
|
86
191
|
/**
|
|
87
192
|
* A React component to display one node variable in tree.
|
|
88
193
|
*
|
|
@@ -92,19 +197,12 @@ const VariablesComponent = (props) => {
|
|
|
92
197
|
* @param props.filter Optional variable filter list.
|
|
93
198
|
*/
|
|
94
199
|
const VariableComponent = (props) => {
|
|
95
|
-
const { commands, data, service, filter, translator, onSelect } = props;
|
|
200
|
+
const { commands, data, service, filter, translator, onSelect, onHoverChanged, collapserIcon } = props;
|
|
96
201
|
const [variable] = useState(data);
|
|
97
202
|
const [expanded, setExpanded] = useState();
|
|
98
203
|
const [variables, setVariables] = useState();
|
|
99
|
-
const styleName = {
|
|
100
|
-
color: 'var(--jp-mirror-editor-attribute-color)'
|
|
101
|
-
};
|
|
102
|
-
const styleType = {
|
|
103
|
-
color: 'var(--jp-mirror-editor-string-color)'
|
|
104
|
-
};
|
|
105
204
|
const onSelection = onSelect !== null && onSelect !== void 0 ? onSelect : (() => void 0);
|
|
106
205
|
const expandable = variable.variablesReference !== 0 || variable.type === 'function';
|
|
107
|
-
const trans = (translator !== null && translator !== void 0 ? translator : nullTranslator).load('jupyterlab');
|
|
108
206
|
const onVariableClicked = async (e) => {
|
|
109
207
|
if (!expandable) {
|
|
110
208
|
return;
|
|
@@ -114,38 +212,29 @@ const VariableComponent = (props) => {
|
|
|
114
212
|
setExpanded(!expanded);
|
|
115
213
|
setVariables(variables);
|
|
116
214
|
};
|
|
117
|
-
return (React.createElement("li", { onClick: (e) => onVariableClicked(e), onMouseDown:
|
|
215
|
+
return (React.createElement("li", { onClick: (e) => onVariableClicked(e), onMouseDown: e => {
|
|
216
|
+
e.stopPropagation();
|
|
118
217
|
onSelection(variable);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
'special variables',
|
|
130
|
-
'protected variables',
|
|
131
|
-
'function variables',
|
|
132
|
-
'class variables'
|
|
133
|
-
].includes(variable.name) && (React.createElement("button", { className: "jp-DebuggerVariables-renderVariable", disabled: !commands.isEnabled(Debugger.CommandIDs.renderMimeVariable, {
|
|
134
|
-
name: variable.name,
|
|
135
|
-
variablesReference: variable.variablesReference
|
|
136
|
-
}), onClick: e => {
|
|
137
|
-
e.stopPropagation();
|
|
138
|
-
onSelection(variable);
|
|
139
|
-
commands
|
|
140
|
-
.execute(Debugger.CommandIDs.renderMimeVariable, {
|
|
141
|
-
name: variable.name,
|
|
142
|
-
variablesReference: variable.variablesReference
|
|
143
|
-
})
|
|
144
|
-
.catch(reason => {
|
|
145
|
-
console.error(`Failed to render variable ${variable.name}`, reason);
|
|
218
|
+
}, onMouseOver: (event) => {
|
|
219
|
+
if (onHoverChanged) {
|
|
220
|
+
onHoverChanged({ target: event.currentTarget, variable });
|
|
221
|
+
event.stopPropagation();
|
|
222
|
+
}
|
|
223
|
+
}, onMouseLeave: (event) => {
|
|
224
|
+
if (onHoverChanged) {
|
|
225
|
+
onHoverChanged({
|
|
226
|
+
target: event.relatedTarget,
|
|
227
|
+
variable: null
|
|
146
228
|
});
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
229
|
+
event.stopPropagation();
|
|
230
|
+
}
|
|
231
|
+
} },
|
|
232
|
+
React.createElement("span", { className: 'jp-DebuggerVariables-collapser' +
|
|
233
|
+
(expanded ? ' jp-mod-expanded' : '') },
|
|
234
|
+
// note: using React.cloneElement due to high typestyle cost
|
|
235
|
+
expandable ? React.cloneElement(collapserIcon) : null),
|
|
236
|
+
React.createElement("span", { className: "jp-DebuggerVariables-name" }, variable.name),
|
|
237
|
+
React.createElement("span", { className: "jp-DebuggerVariables-detail" }, _prepareDetail(variable)),
|
|
238
|
+
expanded && variables && (React.createElement(VariablesBranch, { key: variable.name, commands: commands, data: variables, service: service, filter: filter, translator: translator, handleSelectVariable: onSelect, onHoverChanged: onHoverChanged, collapserIcon: collapserIcon }))));
|
|
150
239
|
};
|
|
151
240
|
//# sourceMappingURL=tree.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree.js","sourceRoot":"","sources":["../../../src/panels/variables/tree.tsx"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,2DAA2D;AAE3D,OAAO,EAAe,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEtE,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,UAAU,EACX,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAM7C,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"tree.js","sourceRoot":"","sources":["../../../src/panels/variables/tree.tsx"],"names":[],"mappings":"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"}
|
package/lib/service.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { KernelSpec, Session } from '@jupyterlab/services';
|
|
2
2
|
import { ITranslator } from '@jupyterlab/translation';
|
|
3
3
|
import { IDisposable } from '@lumino/disposable';
|
|
4
|
-
import { ISignal } from '@lumino/signaling';
|
|
4
|
+
import { ISignal, Signal } from '@lumino/signaling';
|
|
5
5
|
import { DebugProtocol } from '@vscode/debugprotocol';
|
|
6
6
|
import { IDebugger } from './tokens';
|
|
7
7
|
/**
|
|
@@ -18,6 +18,10 @@ export declare class DebuggerService implements IDebugger, IDisposable {
|
|
|
18
18
|
* Signal emitted for debug event messages.
|
|
19
19
|
*/
|
|
20
20
|
get eventMessage(): ISignal<IDebugger, IDebugger.ISession.Event>;
|
|
21
|
+
/**
|
|
22
|
+
* Get debugger config.
|
|
23
|
+
*/
|
|
24
|
+
get config(): IDebugger.IConfig;
|
|
21
25
|
/**
|
|
22
26
|
* Whether the debug service is disposed.
|
|
23
27
|
*/
|
|
@@ -27,9 +31,9 @@ export declare class DebuggerService implements IDebugger, IDisposable {
|
|
|
27
31
|
*/
|
|
28
32
|
get isStarted(): boolean;
|
|
29
33
|
/**
|
|
30
|
-
*
|
|
34
|
+
* A signal emitted when the pause on exception filter changes.
|
|
31
35
|
*/
|
|
32
|
-
get
|
|
36
|
+
get pauseOnExceptionChanged(): Signal<IDebugger, void>;
|
|
33
37
|
/**
|
|
34
38
|
* Returns the debugger service's model.
|
|
35
39
|
*/
|
|
@@ -127,6 +131,10 @@ export declare class DebuggerService implements IDebugger, IDisposable {
|
|
|
127
131
|
* Precondition: !isStarted
|
|
128
132
|
*/
|
|
129
133
|
start(): Promise<void>;
|
|
134
|
+
/**
|
|
135
|
+
* Makes the current thread pause if possible.
|
|
136
|
+
*/
|
|
137
|
+
pause(): Promise<void>;
|
|
130
138
|
/**
|
|
131
139
|
* Makes the current thread step in a function / method if possible.
|
|
132
140
|
*/
|
|
@@ -150,15 +158,20 @@ export declare class DebuggerService implements IDebugger, IDisposable {
|
|
|
150
158
|
updateBreakpoints(code: string, breakpoints: IDebugger.IBreakpoint[], path?: string): Promise<void>;
|
|
151
159
|
/**
|
|
152
160
|
* Determines if pausing on exceptions is supported by the kernel
|
|
153
|
-
*
|
|
154
161
|
*/
|
|
155
162
|
pauseOnExceptionsIsValid(): boolean;
|
|
163
|
+
/**
|
|
164
|
+
* Add or remove a filter from the current used filters.
|
|
165
|
+
*
|
|
166
|
+
* @param exceptionFilter - The filter to add or remove from current filters.
|
|
167
|
+
*/
|
|
168
|
+
pauseOnExceptionsFilter(exceptionFilter: string): Promise<void>;
|
|
156
169
|
/**
|
|
157
170
|
* Enable or disable pausing on exceptions.
|
|
158
171
|
*
|
|
159
|
-
* @param
|
|
172
|
+
* @param exceptionFilters - The filters to use for the current debugging session.
|
|
160
173
|
*/
|
|
161
|
-
pauseOnExceptions(
|
|
174
|
+
pauseOnExceptions(exceptionFilters: string[]): Promise<void>;
|
|
162
175
|
/**
|
|
163
176
|
* Get the debugger state
|
|
164
177
|
*
|
|
@@ -269,6 +282,7 @@ export declare class DebuggerService implements IDebugger, IDisposable {
|
|
|
269
282
|
private _sessionChanged;
|
|
270
283
|
private _specsManager;
|
|
271
284
|
private _trans;
|
|
285
|
+
private _pauseOnExceptionChanged;
|
|
272
286
|
}
|
|
273
287
|
/**
|
|
274
288
|
* A namespace for `DebuggerService` statics.
|
package/lib/service.js
CHANGED
|
@@ -17,6 +17,7 @@ export class DebuggerService {
|
|
|
17
17
|
this._eventMessage = new Signal(this);
|
|
18
18
|
this._isDisposed = false;
|
|
19
19
|
this._sessionChanged = new Signal(this);
|
|
20
|
+
this._pauseOnExceptionChanged = new Signal(this);
|
|
20
21
|
this._config = options.config;
|
|
21
22
|
// Avoids setting session with invalid client
|
|
22
23
|
// session should be set only when a notebook or
|
|
@@ -35,6 +36,12 @@ export class DebuggerService {
|
|
|
35
36
|
get eventMessage() {
|
|
36
37
|
return this._eventMessage;
|
|
37
38
|
}
|
|
39
|
+
/**
|
|
40
|
+
* Get debugger config.
|
|
41
|
+
*/
|
|
42
|
+
get config() {
|
|
43
|
+
return this._config;
|
|
44
|
+
}
|
|
38
45
|
/**
|
|
39
46
|
* Whether the debug service is disposed.
|
|
40
47
|
*/
|
|
@@ -49,18 +56,10 @@ export class DebuggerService {
|
|
|
49
56
|
return (_b = (_a = this._session) === null || _a === void 0 ? void 0 : _a.isStarted) !== null && _b !== void 0 ? _b : false;
|
|
50
57
|
}
|
|
51
58
|
/**
|
|
52
|
-
*
|
|
59
|
+
* A signal emitted when the pause on exception filter changes.
|
|
53
60
|
*/
|
|
54
|
-
get
|
|
55
|
-
|
|
56
|
-
const kernel = (_d = (_c = (_b = (_a = this.session) === null || _a === void 0 ? void 0 : _a.connection) === null || _b === void 0 ? void 0 : _b.kernel) === null || _c === void 0 ? void 0 : _c.name) !== null && _d !== void 0 ? _d : '';
|
|
57
|
-
if (kernel) {
|
|
58
|
-
const tmpFileParams = this._config.getTmpFileParams(kernel);
|
|
59
|
-
if (tmpFileParams) {
|
|
60
|
-
return ((_f = (_e = this._session) === null || _e === void 0 ? void 0 : _e.pausingOnExceptions.includes(tmpFileParams.prefix)) !== null && _f !== void 0 ? _f : false);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
return false;
|
|
61
|
+
get pauseOnExceptionChanged() {
|
|
62
|
+
return this._pauseOnExceptionChanged;
|
|
64
63
|
}
|
|
65
64
|
/**
|
|
66
65
|
* Returns the debugger service's model.
|
|
@@ -207,7 +206,7 @@ export class DebuggerService {
|
|
|
207
206
|
source,
|
|
208
207
|
sourceReference: (_a = source.sourceReference) !== null && _a !== void 0 ? _a : 0
|
|
209
208
|
});
|
|
210
|
-
return
|
|
209
|
+
return { ...reply.body, path: (_b = source.path) !== null && _b !== void 0 ? _b : '' };
|
|
211
210
|
}
|
|
212
211
|
/**
|
|
213
212
|
* Evaluate an expression.
|
|
@@ -377,6 +376,10 @@ export class DebuggerService {
|
|
|
377
376
|
this._clearModel();
|
|
378
377
|
this._clearSignals();
|
|
379
378
|
}
|
|
379
|
+
// Send the currentExceptionFilters to debugger.
|
|
380
|
+
if (this.session.currentExceptionFilters) {
|
|
381
|
+
await this.pauseOnExceptions(this.session.currentExceptionFilters);
|
|
382
|
+
}
|
|
380
383
|
}
|
|
381
384
|
/**
|
|
382
385
|
* Starts a debugger.
|
|
@@ -388,6 +391,22 @@ export class DebuggerService {
|
|
|
388
391
|
}
|
|
389
392
|
return this.session.start();
|
|
390
393
|
}
|
|
394
|
+
/**
|
|
395
|
+
* Makes the current thread pause if possible.
|
|
396
|
+
*/
|
|
397
|
+
async pause() {
|
|
398
|
+
try {
|
|
399
|
+
if (!this.session) {
|
|
400
|
+
throw new Error('No active debugger session');
|
|
401
|
+
}
|
|
402
|
+
await this.session.sendRequest('pause', {
|
|
403
|
+
threadId: this._currentThread()
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
catch (err) {
|
|
407
|
+
console.error('Error:', err.message);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
391
410
|
/**
|
|
392
411
|
* Makes the current thread step in a function / method if possible.
|
|
393
412
|
*/
|
|
@@ -461,75 +480,77 @@ export class DebuggerService {
|
|
|
461
480
|
else {
|
|
462
481
|
this._model.breakpoints.restoreBreakpoints(remoteBreakpoints);
|
|
463
482
|
}
|
|
483
|
+
// Removes duplicated breakpoints. It is better to do it here than
|
|
484
|
+
// in the editor, because the kernel can change the line of a
|
|
485
|
+
// breakpoint (when you attemp to set a breakpoint on an empty
|
|
486
|
+
// line for instance).
|
|
487
|
+
let addedLines = new Set();
|
|
464
488
|
// Set the kernel's breakpoints for this path.
|
|
465
489
|
const reply = await this._setBreakpoints(localBreakpoints, path);
|
|
466
|
-
const updatedBreakpoints = reply.body.breakpoints.filter((val, _, arr) =>
|
|
490
|
+
const updatedBreakpoints = reply.body.breakpoints.filter((val, _, arr) => {
|
|
491
|
+
const cond1 = arr.findIndex(el => el.line === val.line) > -1;
|
|
492
|
+
const cond2 = !addedLines.has(val.line);
|
|
493
|
+
addedLines.add(val.line);
|
|
494
|
+
return cond1 && cond2;
|
|
495
|
+
});
|
|
467
496
|
// Update the local model and finish kernel configuration.
|
|
468
497
|
this._model.breakpoints.setBreakpoints(path, updatedBreakpoints);
|
|
469
498
|
await this.session.sendRequest('configurationDone', {});
|
|
470
499
|
}
|
|
471
500
|
/**
|
|
472
501
|
* Determines if pausing on exceptions is supported by the kernel
|
|
473
|
-
*
|
|
474
502
|
*/
|
|
475
503
|
pauseOnExceptionsIsValid() {
|
|
476
|
-
var _a;
|
|
504
|
+
var _a, _b;
|
|
477
505
|
if (this.isStarted) {
|
|
478
|
-
if ((_a = this.session) === null || _a === void 0 ? void 0 : _a.exceptionBreakpointFilters) {
|
|
506
|
+
if (((_b = (_a = this.session) === null || _a === void 0 ? void 0 : _a.exceptionBreakpointFilters) === null || _b === void 0 ? void 0 : _b.length) !== 0) {
|
|
479
507
|
return true;
|
|
480
508
|
}
|
|
481
509
|
}
|
|
482
510
|
return false;
|
|
483
511
|
}
|
|
484
512
|
/**
|
|
485
|
-
*
|
|
513
|
+
* Add or remove a filter from the current used filters.
|
|
486
514
|
*
|
|
487
|
-
* @param
|
|
515
|
+
* @param exceptionFilter - The filter to add or remove from current filters.
|
|
488
516
|
*/
|
|
489
|
-
async
|
|
490
|
-
var _a
|
|
517
|
+
async pauseOnExceptionsFilter(exceptionFilter) {
|
|
518
|
+
var _a;
|
|
491
519
|
if (!((_a = this.session) === null || _a === void 0 ? void 0 : _a.isStarted)) {
|
|
492
520
|
return;
|
|
493
521
|
}
|
|
494
|
-
|
|
495
|
-
if (
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
const tmpFileParams = this._config.getTmpFileParams(kernel);
|
|
499
|
-
if (!tmpFileParams) {
|
|
500
|
-
return;
|
|
501
|
-
}
|
|
502
|
-
let prefix = tmpFileParams.prefix;
|
|
503
|
-
const exceptionBreakpointFilters = this.session.exceptionBreakpointFilters;
|
|
504
|
-
let pauseOnExceptionKernels = this.session.pausingOnExceptions;
|
|
505
|
-
if (enable) {
|
|
506
|
-
if (!this.session.pausingOnExceptions.includes(prefix)) {
|
|
507
|
-
pauseOnExceptionKernels.push(prefix);
|
|
508
|
-
this.session.pausingOnExceptions = pauseOnExceptionKernels;
|
|
509
|
-
}
|
|
522
|
+
let exceptionFilters = this.session.currentExceptionFilters;
|
|
523
|
+
if (this.session.isPausingOnException(exceptionFilter)) {
|
|
524
|
+
const index = exceptionFilters.indexOf(exceptionFilter);
|
|
525
|
+
exceptionFilters.splice(index, 1);
|
|
510
526
|
}
|
|
511
527
|
else {
|
|
512
|
-
|
|
513
|
-
if (prefixIndex > -1) {
|
|
514
|
-
this.session.pausingOnExceptions = pauseOnExceptionKernels.splice(prefixIndex, 1);
|
|
515
|
-
this.session.pausingOnExceptions = pauseOnExceptionKernels;
|
|
516
|
-
}
|
|
528
|
+
exceptionFilters === null || exceptionFilters === void 0 ? void 0 : exceptionFilters.push(exceptionFilter);
|
|
517
529
|
}
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
530
|
+
await this.pauseOnExceptions(exceptionFilters);
|
|
531
|
+
}
|
|
532
|
+
/**
|
|
533
|
+
* Enable or disable pausing on exceptions.
|
|
534
|
+
*
|
|
535
|
+
* @param exceptionFilters - The filters to use for the current debugging session.
|
|
536
|
+
*/
|
|
537
|
+
async pauseOnExceptions(exceptionFilters) {
|
|
538
|
+
var _a, _b;
|
|
539
|
+
if (!((_a = this.session) === null || _a === void 0 ? void 0 : _a.isStarted)) {
|
|
540
|
+
return;
|
|
527
541
|
}
|
|
528
|
-
const
|
|
529
|
-
|
|
530
|
-
|
|
542
|
+
const exceptionBreakpointFilters = ((_b = this.session.exceptionBreakpointFilters) === null || _b === void 0 ? void 0 : _b.map(e => e.filter)) || [];
|
|
543
|
+
let options = {
|
|
544
|
+
filters: []
|
|
531
545
|
};
|
|
546
|
+
exceptionFilters.forEach(filter => {
|
|
547
|
+
if (exceptionBreakpointFilters.includes(filter)) {
|
|
548
|
+
options.filters.push(filter);
|
|
549
|
+
}
|
|
550
|
+
});
|
|
551
|
+
this.session.currentExceptionFilters = options.filters;
|
|
532
552
|
await this.session.sendRequest('setExceptionBreakpoints', options);
|
|
553
|
+
this._pauseOnExceptionChanged.emit();
|
|
533
554
|
}
|
|
534
555
|
/**
|
|
535
556
|
* Get the debugger state
|
|
@@ -548,7 +569,7 @@ export class DebuggerService {
|
|
|
548
569
|
path: (_g = (_f = (_e = this._session) === null || _e === void 0 ? void 0 : _e.connection) === null || _f === void 0 ? void 0 : _f.path) !== null && _g !== void 0 ? _g : '',
|
|
549
570
|
source: id
|
|
550
571
|
});
|
|
551
|
-
const tmpCells = editorList.map(e => e.
|
|
572
|
+
const tmpCells = editorList.map(e => e.src.getSource());
|
|
552
573
|
cells = cells.concat(tmpCells);
|
|
553
574
|
}
|
|
554
575
|
}
|
|
@@ -609,7 +630,7 @@ export class DebuggerService {
|
|
|
609
630
|
return {
|
|
610
631
|
name: scope.name,
|
|
611
632
|
variables: variables[i].map(variable => {
|
|
612
|
-
return
|
|
633
|
+
return { ...variable };
|
|
613
634
|
})
|
|
614
635
|
};
|
|
615
636
|
});
|
|
@@ -731,7 +752,11 @@ export class DebuggerService {
|
|
|
731
752
|
}
|
|
732
753
|
return breakpoints.reduce((map, val) => {
|
|
733
754
|
const { breakpoints, source } = val;
|
|
734
|
-
map.set(source, breakpoints.map(point => (
|
|
755
|
+
map.set(source, breakpoints.map(point => ({
|
|
756
|
+
...point,
|
|
757
|
+
source: { path: source },
|
|
758
|
+
verified: true
|
|
759
|
+
})));
|
|
735
760
|
return map;
|
|
736
761
|
}, new Map());
|
|
737
762
|
}
|
|
@@ -763,14 +788,14 @@ export class DebuggerService {
|
|
|
763
788
|
const reply = await this.session.sendRequest('variables', {
|
|
764
789
|
variablesReference: variable.variablesReference
|
|
765
790
|
});
|
|
766
|
-
let newVariable =
|
|
791
|
+
let newVariable = { ...variable, expanded: true };
|
|
767
792
|
reply.body.variables.forEach((variable) => {
|
|
768
|
-
newVariable =
|
|
793
|
+
newVariable = { [variable.name]: variable, ...newVariable };
|
|
769
794
|
});
|
|
770
795
|
const newScopes = this._model.variables.scopes.map(scope => {
|
|
771
796
|
const findIndex = scope.variables.findIndex(ele => ele.variablesReference === variable.variablesReference);
|
|
772
797
|
scope.variables[findIndex] = newVariable;
|
|
773
|
-
return
|
|
798
|
+
return { ...scope };
|
|
774
799
|
});
|
|
775
800
|
this._model.variables.scopes = [...newScopes];
|
|
776
801
|
return reply.body.variables;
|