@opensumi/ide-debug 2.22.11 → 2.23.1-next-1679481979.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/lib/browser/breakpoint/breakpoint-manager.d.ts +2 -0
  2. package/lib/browser/breakpoint/breakpoint-manager.d.ts.map +1 -1
  3. package/lib/browser/breakpoint/breakpoint-manager.js +5 -0
  4. package/lib/browser/breakpoint/breakpoint-manager.js.map +1 -1
  5. package/lib/browser/contextkeys/debug-contextkey.service.d.ts +1 -1
  6. package/lib/browser/contextkeys/debug-contextkey.service.d.ts.map +1 -1
  7. package/lib/browser/contextkeys/debug-contextkey.service.js +1 -1
  8. package/lib/browser/contextkeys/debug-contextkey.service.js.map +1 -1
  9. package/lib/browser/debug-session-manager.d.ts.map +1 -1
  10. package/lib/browser/debug-session-manager.js +1 -5
  11. package/lib/browser/debug-session-manager.js.map +1 -1
  12. package/lib/browser/debug-session.js +3 -3
  13. package/lib/browser/debug-session.js.map +1 -1
  14. package/lib/browser/editor/debug-editor-contribution.d.ts.map +1 -1
  15. package/lib/browser/editor/debug-editor-contribution.js +1 -1
  16. package/lib/browser/editor/debug-editor-contribution.js.map +1 -1
  17. package/lib/browser/editor/debug-model.d.ts +2 -2
  18. package/lib/browser/editor/debug-model.d.ts.map +1 -1
  19. package/lib/browser/editor/debug-model.js +4 -3
  20. package/lib/browser/editor/debug-model.js.map +1 -1
  21. package/lib/browser/model/debug-stack-frame.d.ts +12 -0
  22. package/lib/browser/model/debug-stack-frame.d.ts.map +1 -1
  23. package/lib/browser/model/debug-stack-frame.js +24 -1
  24. package/lib/browser/model/debug-stack-frame.js.map +1 -1
  25. package/lib/browser/view/breakpoints/debug-breakpoints.service.d.ts.map +1 -1
  26. package/lib/browser/view/breakpoints/debug-breakpoints.service.js +5 -4
  27. package/lib/browser/view/breakpoints/debug-breakpoints.service.js.map +1 -1
  28. package/lib/browser/view/breakpoints/debug-breakpoints.view.d.ts.map +1 -1
  29. package/lib/browser/view/breakpoints/debug-breakpoints.view.js.map +1 -1
  30. package/lib/browser/view/configuration/debug-toolbar.view.d.ts.map +1 -1
  31. package/lib/browser/view/configuration/debug-toolbar.view.js +27 -25
  32. package/lib/browser/view/configuration/debug-toolbar.view.js.map +1 -1
  33. package/lib/browser/view/console/debug-console.service.js +2 -2
  34. package/lib/browser/view/console/debug-console.service.js.map +1 -1
  35. package/lib/browser/view/debug-view-model.d.ts.map +1 -1
  36. package/lib/browser/view/debug-view-model.js.map +1 -1
  37. package/lib/browser/view/frames/debug-call-stack-frame.view.d.ts +1 -0
  38. package/lib/browser/view/frames/debug-call-stack-frame.view.d.ts.map +1 -1
  39. package/lib/browser/view/frames/debug-call-stack-frame.view.js +101 -26
  40. package/lib/browser/view/frames/debug-call-stack-frame.view.js.map +1 -1
  41. package/lib/browser/view/frames/debug-call-stack-session.view.d.ts.map +1 -1
  42. package/lib/browser/view/frames/debug-call-stack-session.view.js +4 -4
  43. package/lib/browser/view/frames/debug-call-stack-session.view.js.map +1 -1
  44. package/lib/browser/view/frames/debug-call-stack-thread.view.d.ts +1 -0
  45. package/lib/browser/view/frames/debug-call-stack-thread.view.d.ts.map +1 -1
  46. package/lib/browser/view/frames/debug-call-stack-thread.view.js +3 -3
  47. package/lib/browser/view/frames/debug-call-stack-thread.view.js.map +1 -1
  48. package/lib/common/debug-service.d.ts +1 -6
  49. package/lib/common/debug-service.d.ts.map +1 -1
  50. package/lib/common/debug-service.js +1 -9
  51. package/lib/common/debug-service.js.map +1 -1
  52. package/lib/common/inline-values.d.ts +1 -0
  53. package/lib/common/inline-values.d.ts.map +1 -1
  54. package/package.json +23 -23
  55. package/src/browser/breakpoint/breakpoint-manager.ts +6 -0
  56. package/src/browser/contextkeys/debug-contextkey.service.ts +2 -2
  57. package/src/browser/debug-session-manager.ts +1 -7
  58. package/src/browser/debug-session.ts +3 -3
  59. package/src/browser/editor/debug-editor-contribution.ts +1 -1
  60. package/src/browser/editor/debug-model.ts +4 -3
  61. package/src/browser/model/debug-stack-frame.ts +27 -2
  62. package/src/browser/view/breakpoints/debug-breakpoints.service.ts +4 -4
  63. package/src/browser/view/breakpoints/debug-breakpoints.view.tsx +1 -7
  64. package/src/browser/view/configuration/debug-toolbar.view.tsx +112 -94
  65. package/src/browser/view/console/debug-console.service.ts +2 -2
  66. package/src/browser/view/debug-view-model.ts +6 -2
  67. package/src/browser/view/frames/debug-call-stack-frame.view.tsx +139 -50
  68. package/src/browser/view/frames/debug-call-stack-session.view.tsx +10 -4
  69. package/src/browser/view/frames/debug-call-stack-thread.view.tsx +7 -2
  70. package/src/common/debug-service.ts +1 -15
@@ -15,7 +15,7 @@ import {
15
15
  import { IDebugSessionManager } from '../../../common';
16
16
  import { DebugSession } from '../../debug-session';
17
17
  import { DebugSessionManager } from '../../debug-session-manager';
18
- import { DebugStackFrame } from '../../model';
18
+ import { DebugStackFrame, ShowMoreDebugStackFrame } from '../../model';
19
19
  import { DebugThread } from '../../model/debug-thread';
20
20
 
21
21
  import styles from './debug-call-stack.module.less';
@@ -27,13 +27,14 @@ export interface DebugStackSessionViewProps {
27
27
  thread: DebugThread;
28
28
  viewState: ViewState;
29
29
  indent?: number;
30
+ isBottom?: boolean;
30
31
  }
31
32
 
32
33
  export const DebugStackFramesView = observer((props: DebugStackSessionViewProps) => {
33
- const { viewState, frames: rawFrames, thread, indent = 0, session } = props;
34
+ const { viewState, frames: rawFrames, thread, indent = 0, session, isBottom } = props;
34
35
  const [selected, setSelected] = useState<number | undefined>();
35
36
  const [isLoading, setIsLoading] = useState<boolean>(false);
36
- const [frames, setFrames] = useState<DebugStackFrame[]>([]);
37
+ const [frames, setFrames] = useState<(DebugStackFrame | ShowMoreDebugStackFrame)[]>([]);
37
38
  const [framesErrorMessage, setFramesErrorMessage] = useState<string>('');
38
39
  const [canLoadMore, setCanLoadMore] = useState<boolean>(false);
39
40
  const manager = useInjectable<DebugSessionManager>(IDebugSessionManager);
@@ -57,11 +58,62 @@ export const DebugStackFramesView = observer((props: DebugStackSessionViewProps)
57
58
  }
58
59
  };
59
60
 
61
+ const expandFrame = useCallback(
62
+ (frame: ShowMoreDebugStackFrame) => {
63
+ const expanedFrames = frames.slice(0);
64
+ expanedFrames.splice(frame.startIndex, frame.frames.length, ...frame.frames);
65
+ setFrames(expanedFrames);
66
+ },
67
+ [frames],
68
+ );
69
+
70
+ const mergeFrames = useCallback((frames: DebugStackFrame[]) => {
71
+ const len = frames.length;
72
+ const results: (DebugStackFrame | ShowMoreDebugStackFrame)[] = [];
73
+ let showMoreFrames: DebugStackFrame[] = [];
74
+ let showMoreOrigin;
75
+ let showMoreIndex = -1;
76
+ let hasOrigin = false;
77
+ for (let i = 0; i < len; i++) {
78
+ if (frames[i].source?.raw.origin) {
79
+ if (hasOrigin) {
80
+ if (showMoreOrigin === frames[i].source?.raw.origin) {
81
+ showMoreFrames.push(frames[i]);
82
+ continue;
83
+ } else {
84
+ results.push(new ShowMoreDebugStackFrame(i, showMoreFrames, session, showMoreOrigin, expandFrame));
85
+ showMoreFrames = [];
86
+ showMoreIndex = i;
87
+ showMoreOrigin = frames[i].source?.raw.origin;
88
+ showMoreFrames.push(frames[i]);
89
+ }
90
+ } else {
91
+ hasOrigin = true;
92
+ showMoreFrames.push(frames[i]);
93
+ showMoreIndex = i;
94
+ showMoreOrigin = frames[i].source?.raw.origin;
95
+ }
96
+ } else {
97
+ if (hasOrigin && showMoreFrames.length > 0) {
98
+ results.push(new ShowMoreDebugStackFrame(i, showMoreFrames, session, showMoreOrigin, expandFrame));
99
+ showMoreFrames = [];
100
+ showMoreIndex = -1;
101
+ hasOrigin = false;
102
+ }
103
+ results.push(frames[i]);
104
+ }
105
+ }
106
+ if (hasOrigin && showMoreFrames.length > 0) {
107
+ results.push(new ShowMoreDebugStackFrame(showMoreIndex, showMoreFrames, session, showMoreOrigin, expandFrame));
108
+ }
109
+ return results;
110
+ }, []);
111
+
60
112
  const updateFrames = useCallback(
61
113
  (frames: DebugStackFrame[]) => {
62
- setFrames(frames);
114
+ setFrames(mergeFrames(frames));
63
115
  },
64
- [frames],
116
+ [frames, mergeFrames],
65
117
  );
66
118
 
67
119
  const updateSelected = useCallback(
@@ -118,13 +170,17 @@ export const DebugStackFramesView = observer((props: DebugStackSessionViewProps)
118
170
  }, [frames]);
119
171
 
120
172
  const template = ({ data }) => {
121
- const frame: DebugStackFrame = data;
122
- const isLabel = frame.raw.presentationHint === 'label';
123
- const isSubtle = frame.raw.presentationHint === 'subtle';
124
- const clickHandler = useCallback(() => {
173
+ const frame: DebugStackFrame | ShowMoreDebugStackFrame = data;
174
+ const isLabel = DebugStackFrame.is(frame) && frame.raw.presentationHint === 'label';
175
+ const isSubtle = DebugStackFrame.is(frame) && frame.raw.presentationHint === 'subtle';
176
+ const onClickHandler = useCallback(() => {
125
177
  if (isLabel || isSubtle) {
126
178
  return;
127
179
  }
180
+ if (!DebugStackFrame.is(frame)) {
181
+ frame.open();
182
+ return;
183
+ }
128
184
  manager.updateCurrentSession(frame.session);
129
185
 
130
186
  frame.session.currentThread = frame.thread;
@@ -135,86 +191,120 @@ export const DebugStackFramesView = observer((props: DebugStackSessionViewProps)
135
191
  const restartFrame = (event: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => {
136
192
  event.preventDefault();
137
193
  event.stopPropagation();
138
-
194
+ if (!DebugStackFrame.is(frame)) {
195
+ return;
196
+ }
139
197
  if (frame.canRestart) {
140
198
  frame.restart();
141
199
  }
142
200
  };
143
201
 
202
+ const frameItemStyle = {
203
+ paddingLeft: `${indent}px`,
204
+ };
205
+
206
+ if (DebugStackFrame.is(frame) && frame.raw?.source?.presentationHint === 'deemphasize') {
207
+ frameItemStyle['color'] = 'var(--list-deemphasizedForeground)';
208
+ }
209
+
210
+ const renderFrame = useCallback((frame) => {
211
+ if (DebugStackFrame.is(frame)) {
212
+ return (
213
+ <>
214
+ <span
215
+ className={cls(styles.debug_stack_frames_item_label, isLabel && styles.label, isSubtle && styles.subtle)}
216
+ >
217
+ {frame.raw && frame.raw.name}
218
+ </span>
219
+ <span className={styles.debug_stack_frames_item_description}>
220
+ {(frame.raw && frame.raw.source && frame.raw.source.name) || localize('debug.stack.frame.noSource')}
221
+ </span>
222
+ <>
223
+ {frame.canRestart && (
224
+ <a
225
+ title=''
226
+ onClick={(event) => restartFrame(event)}
227
+ className={cls(styles.debug_restart_frame_icon, getIcon('debug-restart-frame'))}
228
+ ></a>
229
+ )}
230
+ <div className={cls(!isUndefined(frame.raw.line) && styles.debug_stack_frames_item_badge)}>
231
+ {frame.raw && frame.raw.line}
232
+ {!isUndefined(frame.raw.line) && ':'}
233
+ {frame.raw && frame.raw.column}
234
+ </div>
235
+ </>
236
+ </>
237
+ );
238
+ } else {
239
+ return <span className={styles.debug_stack_frames_load_more}>{frame.name}</span>;
240
+ }
241
+ }, []);
242
+
144
243
  return (
145
244
  <div
146
- style={{ paddingLeft: `${indent}px` }}
245
+ style={frameItemStyle}
147
246
  className={cls(
148
247
  styles.debug_stack_frames_item,
149
- selected === frame.raw.id && styles.selected,
150
- !(frame.raw && frame.raw.source && frame.raw.source.name) && styles.debug_stack_frames_item_hidden,
248
+ DebugStackFrame.is(frame) && selected === frame.raw.id && styles.selected,
249
+ DebugStackFrame.is(frame) &&
250
+ !(frame.raw && frame.raw.source && frame.raw.source.name) &&
251
+ styles.debug_stack_frames_item_hidden,
151
252
  )}
152
- onClick={clickHandler}
253
+ onClick={onClickHandler}
153
254
  onContextMenu={(event: React.MouseEvent<HTMLDivElement, MouseEvent>) =>
154
255
  debugCallStackService.handleContextMenu(event, data)
155
256
  }
156
257
  >
157
- <span className={cls(styles.debug_stack_frames_item_label, isLabel && styles.label, isSubtle && styles.subtle)}>
158
- {frame.raw && frame.raw.name}
159
- </span>
160
- <span className={styles.debug_stack_frames_item_description}>
161
- {(frame.raw && frame.raw.source && frame.raw.source.name) || localize('debug.stack.frame.noSource')}
162
- </span>
163
- <>
164
- <a
165
- title=''
166
- onClick={(event) => restartFrame(event)}
167
- className={cls(styles.debug_restart_frame_icon, getIcon('debug-restart-frame'))}
168
- ></a>
169
- <div className={cls(!isUndefined(frame.raw.line) && styles.debug_stack_frames_item_badge)}>
170
- {frame.raw && frame.raw.line}
171
- {!isUndefined(frame.raw.line) && ':'}
172
- {frame.raw && frame.raw.column}
173
- </div>
174
- </>
258
+ {renderFrame(frame)}
175
259
  </div>
176
260
  );
177
261
  };
178
262
 
179
- const renderLoadMoreStackFrames = () => {
180
- const clickHandler = async () => {
263
+ const renderLoadMoreStackFrames = useCallback(() => {
264
+ const onClickHandler = async () => {
181
265
  setIsLoading(true);
182
266
  await loadMore();
183
267
  setIsLoading(false);
184
268
  };
185
269
  return (
186
- <div className={styles.debug_stack_frames_item} onClick={clickHandler}>
270
+ <div className={styles.debug_stack_frames_item} onClick={onClickHandler}>
187
271
  <span className={styles.debug_stack_frames_load_more}>{localize('debug.stack.loadMore')}</span>
188
272
  </div>
189
273
  );
190
- };
274
+ }, [isLoading, loadMore]);
191
275
 
192
- const renderLoading = () => (
193
- <div className={styles.debug_stack_frames_item}>
194
- <span className={styles.debug_stack_frames_load_more}>{localize('debug.stack.loading')}</span>
195
- </div>
276
+ const renderLoading = useCallback(
277
+ () => (
278
+ <div className={styles.debug_stack_frames_item}>
279
+ <span className={styles.debug_stack_frames_load_more}>{localize('debug.stack.loading')}</span>
280
+ </div>
281
+ ),
282
+ [],
196
283
  );
197
284
 
198
- const renderFramesErrorMessage = (message: string) => (
199
- <div className={styles.debug_stack_frames_item}>
200
- <span className={styles.debug_stack_frames_error_message} title={message}>
201
- {message}
202
- </span>
203
- </div>
285
+ const renderFramesErrorMessage = useCallback(
286
+ (message: string) => (
287
+ <div className={styles.debug_stack_frames_item}>
288
+ <span className={styles.debug_stack_frames_error_message} title={message}>
289
+ {message}
290
+ </span>
291
+ </div>
292
+ ),
293
+ [],
204
294
  );
205
295
 
206
296
  if (framesErrorMessage) {
207
297
  return <div className={styles.debug_stack_frames}>{renderFramesErrorMessage(framesErrorMessage)}</div>;
208
298
  }
209
299
 
210
- const footer = () => {
300
+ const footer = useCallback(() => {
211
301
  if (isLoading) {
212
302
  return renderLoading();
213
303
  } else if (canLoadMore) {
214
304
  return renderLoadMoreStackFrames();
215
305
  }
216
306
  return null;
217
- };
307
+ }, [isLoading, canLoadMore]);
218
308
 
219
309
  return (
220
310
  <RecycleList
@@ -222,8 +312,7 @@ export const DebugStackFramesView = observer((props: DebugStackSessionViewProps)
222
312
  template={template}
223
313
  itemHeight={22}
224
314
  width={viewState.width}
225
- paddingBottomSize={0}
226
- height={isLoading || canLoadMore ? (frames.length + 1) * 22 : frames.length * 22}
315
+ height={(isLoading || canLoadMore ? (frames.length + 1) * 22 : frames.length * 22) + (isBottom ? 10 : 0)}
227
316
  footer={isLoading || canLoadMore ? footer : undefined}
228
317
  />
229
318
  );
@@ -153,7 +153,7 @@ export const DebugStackSessionView = (props: DebugStackSessionViewProps) => {
153
153
  </div>
154
154
  ) : (
155
155
  otherThreads.map(
156
- (thread) =>
156
+ (thread: DebugThread, index: number) =>
157
157
  !session.hasInMultipleThreadPaused(thread.raw.id) && (
158
158
  <DebugStackThreadView
159
159
  key={thread.id}
@@ -161,6 +161,7 @@ export const DebugStackSessionView = (props: DebugStackSessionViewProps) => {
161
161
  viewState={viewState}
162
162
  thread={thread}
163
163
  session={session}
164
+ isBottom={index === otherThreads.length - 1}
164
165
  />
165
166
  ),
166
167
  )
@@ -211,7 +212,10 @@ export const DebugStackSessionView = (props: DebugStackSessionViewProps) => {
211
212
  >
212
213
  {supportsThreadIdCorrespond || threads.length > 0 ? (
213
214
  <>
214
- <div className={unfold ? getIcon('down') : getIcon('right')} onClick={() => setUnfold(!unfold)}></div>
215
+ <div
216
+ className={unfold ? getIcon('arrow-down') : getIcon('arrow-right')}
217
+ onClick={() => setUnfold(!unfold)}
218
+ ></div>
215
219
  <div className={cls([getIcon('debug'), styles.debug_session_icon])}></div>
216
220
  </>
217
221
  ) : (
@@ -222,25 +226,27 @@ export const DebugStackSessionView = (props: DebugStackSessionViewProps) => {
222
226
  </div>
223
227
  )}
224
228
  {supportsThreadIdCorrespond && unfold
225
- ? multipleThreadPaused.map((t) => (
229
+ ? multipleThreadPaused.map((t: DebugThread, index: number) => (
226
230
  <DebugStackThreadView
227
231
  key={t.id}
228
232
  indent={mutipleSession ? 16 : 0}
229
233
  viewState={viewState}
230
234
  thread={t}
231
235
  session={session}
236
+ isBottom={index === multipleThreadPaused.length - 1}
232
237
  />
233
238
  ))
234
239
  : null}
235
240
  {!supportsThreadIdCorrespond &&
236
241
  (!mutipleSession || unfold) &&
237
- threads.map((thread) => (
242
+ threads.map((thread: DebugThread, index: number) => (
238
243
  <DebugStackThreadView
239
244
  key={thread.id}
240
245
  indent={mutipleSession ? 16 : 0}
241
246
  viewState={viewState}
242
247
  thread={thread}
243
248
  session={session}
249
+ isBottom={index === threads.length - 1}
244
250
  />
245
251
  ))}
246
252
  {subSession.length > 0 &&
@@ -18,10 +18,11 @@ export interface DebugStackThreadViewProps {
18
18
  viewState: ViewState;
19
19
  thread: DebugThread;
20
20
  indent?: number;
21
+ isBottom?: boolean;
21
22
  }
22
23
 
23
24
  export const DebugStackThreadView = (props: DebugStackThreadViewProps) => {
24
- const { thread, viewState, indent, session } = props;
25
+ const { thread, viewState, indent, session, isBottom } = props;
25
26
  const manager = useInjectable<DebugSessionManager>(IDebugSessionManager);
26
27
  const debugCallStackService = useInjectable<DebugCallStackService>(DebugCallStackService);
27
28
  const [expanded, setExpanded] = useState<boolean>(true);
@@ -68,7 +69,10 @@ export const DebugStackThreadView = (props: DebugStackThreadViewProps) => {
68
69
  {mutiple && (
69
70
  <div style={{ paddingLeft: `${indent}px` }} className={styles.debug_stack_item_label}>
70
71
  {thread.frames.length > 0 ? (
71
- <div className={expanded ? getIcon('down') : getIcon('right')} onClick={() => setExpanded(!expanded)}></div>
72
+ <div
73
+ className={expanded ? getIcon('arrow-down') : getIcon('arrow-right')}
74
+ onClick={() => setExpanded(!expanded)}
75
+ ></div>
72
76
  ) : (
73
77
  <div style={{ width: 14 }}></div>
74
78
  )}
@@ -92,6 +96,7 @@ export const DebugStackThreadView = (props: DebugStackThreadViewProps) => {
92
96
  {(!mutiple || expanded) && thread.frames.length > 0 && (
93
97
  <DebugStackFramesView
94
98
  indent={mutiple ? (mutipleS ? 24 + 14 : 16 + 14) : 8}
99
+ isBottom={isBottom}
95
100
  viewState={viewState}
96
101
  thread={thread}
97
102
  frames={frames}
@@ -1,11 +1,4 @@
1
- import {
2
- IDisposable,
3
- IJSONSchema,
4
- IJSONSchemaSnippet,
5
- ApplicationError,
6
- Event,
7
- BinaryBuffer,
8
- } from '@opensumi/ide-core-common';
1
+ import { IDisposable, IJSONSchema, IJSONSchemaSnippet, Event, BinaryBuffer } from '@opensumi/ide-core-common';
9
2
 
10
3
  import { DebugConfiguration } from './debug-configuration';
11
4
  import { IDebugSessionDTO } from './debug-session-options';
@@ -167,10 +160,3 @@ export interface IDebugServiceContributionPoint {
167
160
  contributions: IJSONSchema[];
168
161
  removed?: boolean;
169
162
  }
170
-
171
- export namespace DebugError {
172
- export const NotFound = ApplicationError.declare(-41000, (type: string) => ({
173
- message: `'${type}' debugger type is not supported.`,
174
- data: { type },
175
- }));
176
- }