@opensumi/ide-debug 2.21.13 → 2.22.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.
- package/lib/browser/breakpoint/breakpoint-manager.js.map +1 -1
- package/lib/browser/breakpoint/breakpoint-marker.d.ts +1 -1
- package/lib/browser/breakpoint/breakpoint-marker.d.ts.map +1 -1
- package/lib/browser/breakpoint/breakpoint-marker.js +3 -2
- package/lib/browser/breakpoint/breakpoint-marker.js.map +1 -1
- package/lib/browser/contextkeys/debug-call-stack-item-type-key.d.ts +1 -1
- package/lib/browser/contextkeys/debug-call-stack-item-type-key.d.ts.map +1 -1
- package/lib/browser/contextkeys/debug-contextkey.service.js.map +1 -1
- package/lib/browser/debug-configuration-manager.d.ts +2 -2
- package/lib/browser/debug-configuration-manager.d.ts.map +1 -1
- package/lib/browser/debug-configuration-manager.js +2 -2
- package/lib/browser/debug-configuration-manager.js.map +1 -1
- package/lib/browser/debug-contribution.d.ts +2 -147
- package/lib/browser/debug-contribution.d.ts.map +1 -1
- package/lib/browser/debug-contribution.js +50 -200
- package/lib/browser/debug-contribution.js.map +1 -1
- package/lib/browser/debug-exception-widget.js.map +1 -1
- package/lib/browser/debug-link-detector.js.map +1 -1
- package/lib/browser/debug-memory.js +4 -4
- package/lib/browser/debug-memory.js.map +1 -1
- package/lib/browser/debug-preferences.d.ts +1 -1
- package/lib/browser/debug-preferences.d.ts.map +1 -1
- package/lib/browser/debug-progress.service.js.map +1 -1
- package/lib/browser/debug-schema-updater.js.map +1 -1
- package/lib/browser/debug-service.js.map +1 -1
- package/lib/browser/debug-session-connection.d.ts +2 -3
- package/lib/browser/debug-session-connection.d.ts.map +1 -1
- package/lib/browser/debug-session-connection.js.map +1 -1
- package/lib/browser/debug-session-contribution.js.map +1 -1
- package/lib/browser/debug-session-manager.d.ts +3 -4
- package/lib/browser/debug-session-manager.d.ts.map +1 -1
- package/lib/browser/debug-session-manager.js +7 -8
- package/lib/browser/debug-session-manager.js.map +1 -1
- package/lib/browser/debug-session.d.ts +3 -4
- package/lib/browser/debug-session.d.ts.map +1 -1
- package/lib/browser/debug-session.js +15 -11
- package/lib/browser/debug-session.js.map +1 -1
- package/lib/browser/debugUtils.js +4 -4
- package/lib/browser/debugUtils.js.map +1 -1
- package/lib/browser/editor/debug-breakpoint-widget.js.map +1 -1
- package/lib/browser/editor/debug-breakpoint-zone-widget.js +7 -7
- package/lib/browser/editor/debug-breakpoint-zone-widget.js.map +1 -1
- package/lib/browser/editor/debug-breakpoint.module.less +3 -4
- package/lib/browser/editor/debug-editor-contribution.d.ts +2 -2
- package/lib/browser/editor/debug-editor-contribution.d.ts.map +1 -1
- package/lib/browser/editor/debug-editor-contribution.js +3 -4
- package/lib/browser/editor/debug-editor-contribution.js.map +1 -1
- package/lib/browser/editor/debug-expression-provider.js.map +1 -1
- package/lib/browser/editor/debug-hover-model.js.map +1 -1
- package/lib/browser/editor/debug-hover-source.d.ts +1 -1
- package/lib/browser/editor/debug-hover-source.d.ts.map +1 -1
- package/lib/browser/editor/debug-hover-source.js.map +1 -1
- package/lib/browser/editor/debug-hover-tree.model.service.js.map +1 -1
- package/lib/browser/editor/debug-hover-widget.js.map +1 -1
- package/lib/browser/editor/debug-model-manager.d.ts +2 -9
- package/lib/browser/editor/debug-model-manager.d.ts.map +1 -1
- package/lib/browser/editor/debug-model-manager.js +8 -15
- package/lib/browser/editor/debug-model-manager.js.map +1 -1
- package/lib/browser/editor/debug-model.d.ts +2 -2
- package/lib/browser/editor/debug-model.d.ts.map +1 -1
- package/lib/browser/editor/debug-model.js +27 -27
- package/lib/browser/editor/debug-model.js.map +1 -1
- package/lib/browser/editor/debug-run-to-cursor.service.js +7 -7
- package/lib/browser/editor/debug-run-to-cursor.service.js.map +1 -1
- package/lib/browser/editor/evaluatable-expression.js.map +1 -1
- package/lib/browser/index.d.ts +0 -14
- package/lib/browser/index.d.ts.map +1 -1
- package/lib/browser/index.js +8 -24
- package/lib/browser/index.js.map +1 -1
- package/lib/browser/markers/marker-manager.js.map +1 -1
- package/lib/browser/model/debug-source.d.ts +3 -3
- package/lib/browser/model/debug-source.d.ts.map +1 -1
- package/lib/browser/model/debug-source.js.map +1 -1
- package/lib/browser/model/debug-thread.d.ts +1 -1
- package/lib/browser/model/debug-thread.d.ts.map +1 -1
- package/lib/browser/model/debug-watch.d.ts.map +1 -1
- package/lib/browser/model/debug-watch.js +1 -2
- package/lib/browser/model/debug-watch.js.map +1 -1
- package/lib/browser/preferences/launch-folder-preference-provider.d.ts +2 -2
- package/lib/browser/preferences/launch-folder-preference-provider.d.ts.map +1 -1
- package/lib/browser/preferences/launch-folder-preference-provider.js +2 -2
- package/lib/browser/preferences/launch-folder-preference-provider.js.map +1 -1
- package/lib/browser/preferences/launch-preferences-contribution.js.map +1 -1
- package/lib/browser/tree/debug-console-tree-node.define.js +6 -6
- package/lib/browser/tree/debug-console-tree-node.define.js.map +1 -1
- package/lib/browser/tree/debug-tree-node.define.js +18 -18
- package/lib/browser/tree/debug-tree-node.define.js.map +1 -1
- package/lib/browser/view/breakpoints/debug-breakpoints.service.js +3 -3
- package/lib/browser/view/breakpoints/debug-breakpoints.service.js.map +1 -1
- package/lib/browser/view/configuration/debug-configuration.module.less +5 -5
- package/lib/browser/view/configuration/debug-configuration.service.d.ts +1 -2
- package/lib/browser/view/configuration/debug-configuration.service.d.ts.map +1 -1
- package/lib/browser/view/configuration/debug-configuration.service.js.map +1 -1
- package/lib/browser/view/configuration/debug-configuration.view.d.ts.map +1 -1
- package/lib/browser/view/configuration/debug-configuration.view.js +1 -1
- package/lib/browser/view/configuration/debug-configuration.view.js.map +1 -1
- package/lib/browser/view/configuration/debug-toolbar.service.js.map +1 -1
- package/lib/browser/view/configuration/debug-toolbar.view.js +2 -2
- package/lib/browser/view/configuration/debug-toolbar.view.js.map +1 -1
- package/lib/browser/view/console/debug-console-filter.model.js.map +1 -1
- package/lib/browser/view/console/debug-console-filter.service.js.map +1 -1
- package/lib/browser/view/console/debug-console-model.js.map +1 -1
- package/lib/browser/view/console/debug-console-session.d.ts +3 -2
- package/lib/browser/view/console/debug-console-session.d.ts.map +1 -1
- package/lib/browser/view/console/debug-console-session.js.map +1 -1
- package/lib/browser/view/console/debug-console-tree.model.service.d.ts +1 -1
- package/lib/browser/view/console/debug-console-tree.model.service.d.ts.map +1 -1
- package/lib/browser/view/console/debug-console-tree.model.service.js +5 -3
- package/lib/browser/view/console/debug-console-tree.model.service.js.map +1 -1
- package/lib/browser/view/console/debug-console.contribution.d.ts.map +1 -1
- package/lib/browser/view/console/debug-console.contribution.js +21 -23
- package/lib/browser/view/console/debug-console.contribution.js.map +1 -1
- package/lib/browser/view/console/debug-console.module.less +2 -3
- package/lib/browser/view/console/debug-console.service.js +7 -7
- package/lib/browser/view/console/debug-console.service.js.map +1 -1
- package/lib/browser/view/console/debug-console.view.d.ts +1 -1
- package/lib/browser/view/console/debug-console.view.d.ts.map +1 -1
- package/lib/browser/view/console/debug-console.view.js +15 -3
- package/lib/browser/view/console/debug-console.view.js.map +1 -1
- package/lib/browser/view/debug-view-model.js.map +1 -1
- package/lib/browser/view/frames/debug-call-stack-frame.view.d.ts.map +1 -1
- package/lib/browser/view/frames/debug-call-stack-frame.view.js +25 -24
- package/lib/browser/view/frames/debug-call-stack-frame.view.js.map +1 -1
- package/lib/browser/view/frames/debug-call-stack-session.view.d.ts.map +1 -1
- package/lib/browser/view/frames/debug-call-stack-session.view.js +8 -5
- package/lib/browser/view/frames/debug-call-stack-session.view.js.map +1 -1
- package/lib/browser/view/frames/debug-call-stack-thread.view.d.ts.map +1 -1
- package/lib/browser/view/frames/debug-call-stack-thread.view.js +12 -7
- package/lib/browser/view/frames/debug-call-stack-thread.view.js.map +1 -1
- package/lib/browser/view/frames/debug-call-stack.contribution.js +5 -5
- package/lib/browser/view/frames/debug-call-stack.contribution.js.map +1 -1
- package/lib/browser/view/frames/debug-call-stack.service.js.map +1 -1
- package/lib/browser/view/variables/debug-variables-model.js.map +1 -1
- package/lib/browser/view/variables/debug-variables-tree.model.service.d.ts +1 -1
- package/lib/browser/view/variables/debug-variables-tree.model.service.d.ts.map +1 -1
- package/lib/browser/view/variables/debug-variables-tree.model.service.js +5 -3
- package/lib/browser/view/variables/debug-variables-tree.model.service.js.map +1 -1
- package/lib/browser/view/variables/debug-variables.contribution.d.ts.map +1 -1
- package/lib/browser/view/variables/debug-variables.contribution.js +13 -14
- package/lib/browser/view/variables/debug-variables.contribution.js.map +1 -1
- package/lib/browser/view/variables/debug-variables.module.less +2 -11
- package/lib/browser/view/variables/debug-variables.view.d.ts +1 -1
- package/lib/browser/view/variables/debug-variables.view.d.ts.map +1 -1
- package/lib/browser/view/variables/debug-variables.view.js +1 -1
- package/lib/browser/view/variables/debug-variables.view.js.map +1 -1
- package/lib/browser/view/watch/debug-watch-model.js.map +1 -1
- package/lib/browser/view/watch/debug-watch-tree.model.service.d.ts +2 -2
- package/lib/browser/view/watch/debug-watch-tree.model.service.d.ts.map +1 -1
- package/lib/browser/view/watch/debug-watch-tree.model.service.js +5 -3
- package/lib/browser/view/watch/debug-watch-tree.model.service.js.map +1 -1
- package/lib/browser/view/watch/debug-watch.contribution.d.ts.map +1 -1
- package/lib/browser/view/watch/debug-watch.contribution.js +21 -19
- package/lib/browser/view/watch/debug-watch.contribution.js.map +1 -1
- package/lib/browser/view/watch/debug-watch.module.less +2 -12
- package/lib/browser/view/watch/debug-watch.view.d.ts +1 -1
- package/lib/browser/view/watch/debug-watch.view.d.ts.map +1 -1
- package/lib/browser/view/watch/debug-watch.view.js +1 -1
- package/lib/browser/view/watch/debug-watch.view.js.map +1 -1
- package/lib/common/commands.d.ts +46 -0
- package/lib/common/commands.d.ts.map +1 -0
- package/lib/common/commands.js +149 -0
- package/lib/common/commands.js.map +1 -0
- package/lib/common/debug-breakpoint.d.ts +3 -3
- package/lib/common/debug-breakpoint.d.ts.map +1 -1
- package/lib/common/debug-configuration.d.ts +1 -1
- package/lib/common/debug-configuration.d.ts.map +1 -1
- package/lib/common/debug-console.d.ts +18 -0
- package/lib/common/debug-console.d.ts.map +1 -0
- package/lib/common/debug-console.js +5 -0
- package/lib/common/debug-console.js.map +1 -0
- package/lib/common/debug-editor.d.ts +1 -1
- package/lib/common/debug-editor.d.ts.map +1 -1
- package/lib/common/debug-model.d.ts +19 -4
- package/lib/common/debug-model.d.ts.map +1 -1
- package/lib/common/debug-model.js +14 -6
- package/lib/common/debug-model.js.map +1 -1
- package/lib/common/debug-schema-updater.d.ts +2 -1
- package/lib/common/debug-schema-updater.d.ts.map +1 -1
- package/lib/common/debug-schema-updater.js +1 -1
- package/lib/common/debug-schema-updater.js.map +1 -1
- package/lib/common/debug-service.d.ts +1 -1
- package/lib/common/debug-service.d.ts.map +1 -1
- package/lib/common/debug-session.d.ts +1 -1
- package/lib/common/debug-session.d.ts.map +1 -1
- package/lib/common/index.d.ts +2 -0
- package/lib/common/index.d.ts.map +1 -1
- package/lib/common/index.js +2 -0
- package/lib/common/index.js.map +1 -1
- package/lib/common/inline-values.d.ts +1 -1
- package/lib/common/inline-values.d.ts.map +1 -1
- package/lib/common/terminal.js +10 -10
- package/lib/common/terminal.js.map +1 -1
- package/package.json +27 -26
- package/src/browser/assets/breakpoint-conditional-disabled.svg +4 -0
- package/src/browser/assets/breakpoint-conditional-unverified.svg +4 -0
- package/src/browser/assets/breakpoint-conditional.svg +4 -0
- package/src/browser/assets/breakpoint-disabled.svg +4 -0
- package/src/browser/assets/breakpoint-hint.svg +4 -0
- package/src/browser/assets/breakpoint-log-disabled.svg +4 -0
- package/src/browser/assets/breakpoint-log-unverified.svg +4 -0
- package/src/browser/assets/breakpoint-log.svg +4 -0
- package/src/browser/assets/breakpoint-unsupported.svg +4 -0
- package/src/browser/assets/breakpoint-unverified.svg +4 -0
- package/src/browser/assets/breakpoint.svg +4 -0
- package/src/browser/assets/breakpoints-activate-inverse.svg +4 -0
- package/src/browser/assets/breakpoints-activate.svg +4 -0
- package/src/browser/assets/configure-inverse.svg +4 -0
- package/src/browser/assets/configure.svg +4 -0
- package/src/browser/assets/continue-inverse.svg +4 -0
- package/src/browser/assets/current-and-breakpoint.svg +4 -0
- package/src/browser/assets/current-arrow.svg +4 -0
- package/src/browser/assets/remove-all-inverse.svg +4 -0
- package/src/browser/assets/remove-all.svg +4 -0
- package/src/browser/assets/repl-inverse.svg +4 -0
- package/src/browser/assets/repl.svg +4 -0
- package/src/browser/assets/restart-inverse.svg +4 -0
- package/src/browser/assets/stackframe-and-breakpoint.svg +4 -0
- package/src/browser/assets/stackframe-arrow.svg +4 -0
- package/src/browser/assets/start-inverse.svg +4 -0
- package/src/browser/breakpoint/breakpoint-decoration.ts +57 -0
- package/src/browser/breakpoint/breakpoint-manager.ts +348 -0
- package/src/browser/breakpoint/breakpoint-marker.ts +70 -0
- package/src/browser/breakpoint/index.ts +3 -0
- package/src/browser/components/debug-action/index.module.less +73 -0
- package/src/browser/components/debug-action/index.tsx +40 -0
- package/src/browser/components/debug-exception-widget.less +42 -0
- package/src/browser/components/floating-click-widget/index.module.less +5 -0
- package/src/browser/components/floating-click-widget/index.tsx +21 -0
- package/src/browser/components/index.ts +1 -0
- package/src/browser/contextkeys/debug-call-stack-item-type-key.ts +4 -0
- package/src/browser/contextkeys/debug-contextkey.service.ts +54 -0
- package/src/browser/contextkeys/index.ts +1 -0
- package/src/browser/debug-ansi-handle.ts +521 -0
- package/src/browser/debug-configuration-manager.ts +514 -0
- package/src/browser/debug-configuration-model.ts +66 -0
- package/src/browser/debug-contribution.ts +756 -0
- package/src/browser/debug-exception-widget.tsx +89 -0
- package/src/browser/debug-link-detector.ts +234 -0
- package/src/browser/debug-memory.ts +220 -0
- package/src/browser/debug-preferences.ts +70 -0
- package/src/browser/debug-progress.service.ts +122 -0
- package/src/browser/debug-schema-updater.ts +67 -0
- package/src/browser/debug-service.ts +42 -0
- package/src/browser/debug-session-connection.ts +331 -0
- package/src/browser/debug-session-contribution.ts +57 -0
- package/src/browser/debug-session-manager.ts +622 -0
- package/src/browser/debug-session.ts +1181 -0
- package/src/browser/debug-style.less +128 -0
- package/src/browser/debugUtils.ts +110 -0
- package/src/browser/editor/debug-breakpoint-widget.ts +99 -0
- package/src/browser/editor/debug-breakpoint-zone-widget.tsx +262 -0
- package/src/browser/editor/debug-breakpoint.module.less +30 -0
- package/src/browser/editor/debug-editor-contribution.ts +589 -0
- package/src/browser/editor/debug-expression-provider.ts +101 -0
- package/src/browser/editor/debug-hover-model.ts +38 -0
- package/src/browser/editor/debug-hover-source.ts +107 -0
- package/src/browser/editor/debug-hover-tree.model.service.ts +332 -0
- package/src/browser/editor/debug-hover-widget.tsx +200 -0
- package/src/browser/editor/debug-hover.module.less +29 -0
- package/src/browser/editor/debug-hover.view.tsx +147 -0
- package/src/browser/editor/debug-model-manager.ts +219 -0
- package/src/browser/editor/debug-model.ts +853 -0
- package/src/browser/editor/debug-run-to-cursor.service.ts +180 -0
- package/src/browser/editor/debug-styles.ts +66 -0
- package/src/browser/editor/evaluatable-expression.ts +47 -0
- package/src/browser/editor/index.ts +6 -0
- package/src/browser/index.ts +119 -0
- package/src/browser/markers/index.ts +2 -0
- package/src/browser/markers/marker-manager.ts +201 -0
- package/src/browser/markers/marker.ts +20 -0
- package/src/browser/model/debug-source.ts +144 -0
- package/src/browser/model/debug-stack-frame.ts +111 -0
- package/src/browser/model/debug-thread.ts +186 -0
- package/src/browser/model/debug-watch.ts +129 -0
- package/src/browser/model/index.ts +4 -0
- package/src/browser/preferences/launch-folder-preference-provider.ts +23 -0
- package/src/browser/preferences/launch-preferences-contribution.ts +9 -0
- package/src/browser/preferences/launch-preferences.ts +16 -0
- package/src/browser/tree/debug-console-tree-node.define.tsx +76 -0
- package/src/browser/tree/debug-tree-node.define.ts +768 -0
- package/src/browser/tree/index.ts +2 -0
- package/src/browser/view/breakpoints/debug-breakpoints.module.less +72 -0
- package/src/browser/view/breakpoints/debug-breakpoints.service.ts +217 -0
- package/src/browser/view/breakpoints/debug-breakpoints.view.tsx +174 -0
- package/src/browser/view/configuration/debug-configuration.module.less +110 -0
- package/src/browser/view/configuration/debug-configuration.service.ts +170 -0
- package/src/browser/view/configuration/debug-configuration.view.tsx +252 -0
- package/src/browser/view/configuration/debug-toolbar.service.ts +167 -0
- package/src/browser/view/configuration/debug-toolbar.view.tsx +335 -0
- package/src/browser/view/console/debug-console-filter.model.ts +49 -0
- package/src/browser/view/console/debug-console-filter.service.ts +81 -0
- package/src/browser/view/console/debug-console-filter.view.tsx +78 -0
- package/src/browser/view/console/debug-console-model.ts +48 -0
- package/src/browser/view/console/debug-console-session.ts +165 -0
- package/src/browser/view/console/debug-console-toolbar.view.tsx +28 -0
- package/src/browser/view/console/debug-console-tree.model.service.ts +553 -0
- package/src/browser/view/console/debug-console.contribution.ts +179 -0
- package/src/browser/view/console/debug-console.module.less +371 -0
- package/src/browser/view/console/debug-console.service.ts +433 -0
- package/src/browser/view/console/debug-console.view.tsx +511 -0
- package/src/browser/view/debug-view-model.ts +182 -0
- package/src/browser/view/frames/debug-call-stack-frame.view.tsx +230 -0
- package/src/browser/view/frames/debug-call-stack-session.view.tsx +253 -0
- package/src/browser/view/frames/debug-call-stack-thread.view.tsx +103 -0
- package/src/browser/view/frames/debug-call-stack.contribution.ts +88 -0
- package/src/browser/view/frames/debug-call-stack.module.less +193 -0
- package/src/browser/view/frames/debug-call-stack.operation.tsx +97 -0
- package/src/browser/view/frames/debug-call-stack.service.ts +105 -0
- package/src/browser/view/frames/debug-call-stack.view.tsx +43 -0
- package/src/browser/view/variables/debug-variables-model.ts +38 -0
- package/src/browser/view/variables/debug-variables-tree.model.service.ts +470 -0
- package/src/browser/view/variables/debug-variables.contribution.ts +244 -0
- package/src/browser/view/variables/debug-variables.module.less +139 -0
- package/src/browser/view/variables/debug-variables.view.tsx +303 -0
- package/src/browser/view/watch/debug-watch-model.ts +38 -0
- package/src/browser/view/watch/debug-watch-tree.model.service.ts +570 -0
- package/src/browser/view/watch/debug-watch.contribution.ts +170 -0
- package/src/browser/view/watch/debug-watch.module.less +178 -0
- package/src/browser/view/watch/debug-watch.view.tsx +337 -0
- package/src/common/commands.ts +146 -0
- package/src/common/constants.ts +81 -0
- package/src/common/debug-breakpoint.ts +43 -0
- package/src/common/debug-configuration.ts +68 -0
- package/src/common/debug-console.ts +20 -0
- package/src/common/debug-editor.ts +4 -0
- package/src/common/debug-hover.ts +31 -0
- package/src/common/debug-model.ts +272 -0
- package/src/common/debug-progress.ts +8 -0
- package/src/common/debug-schema-updater.ts +3 -0
- package/src/common/debug-service.ts +176 -0
- package/src/common/debug-session-options.ts +19 -0
- package/src/common/debug-session.ts +200 -0
- package/src/common/evaluatable-expression.ts +43 -0
- package/src/common/index.ts +16 -0
- package/src/common/inline-values.ts +77 -0
- package/src/common/terminal.ts +163 -0
- package/src/common/types.ts +86 -0
- package/src/index.ts +1 -0
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import cls from 'classnames';
|
|
2
|
+
import { observer } from 'mobx-react-lite';
|
|
3
|
+
import React, { useCallback, useEffect, useState } from 'react';
|
|
4
|
+
|
|
5
|
+
import { RecycleList } from '@opensumi/ide-components';
|
|
6
|
+
import {
|
|
7
|
+
ViewState,
|
|
8
|
+
isUndefined,
|
|
9
|
+
useInjectable,
|
|
10
|
+
localize,
|
|
11
|
+
DisposableCollection,
|
|
12
|
+
getIcon,
|
|
13
|
+
} from '@opensumi/ide-core-browser';
|
|
14
|
+
|
|
15
|
+
import { IDebugSessionManager } from '../../../common';
|
|
16
|
+
import { DebugSession } from '../../debug-session';
|
|
17
|
+
import { DebugSessionManager } from '../../debug-session-manager';
|
|
18
|
+
import { DebugStackFrame } from '../../model';
|
|
19
|
+
import { DebugThread } from '../../model/debug-thread';
|
|
20
|
+
|
|
21
|
+
import styles from './debug-call-stack.module.less';
|
|
22
|
+
import { DebugCallStackService } from './debug-call-stack.service';
|
|
23
|
+
|
|
24
|
+
export interface DebugStackSessionViewProps {
|
|
25
|
+
frames: DebugStackFrame[];
|
|
26
|
+
session: DebugSession;
|
|
27
|
+
thread: DebugThread;
|
|
28
|
+
viewState: ViewState;
|
|
29
|
+
indent?: number;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export const DebugStackFramesView = observer((props: DebugStackSessionViewProps) => {
|
|
33
|
+
const { viewState, frames: rawFrames, thread, indent = 0, session } = props;
|
|
34
|
+
const [selected, setSelected] = useState<number | undefined>();
|
|
35
|
+
const [isLoading, setIsLoading] = useState<boolean>(false);
|
|
36
|
+
const [frames, setFrames] = useState<DebugStackFrame[]>([]);
|
|
37
|
+
const [framesErrorMessage, setFramesErrorMessage] = useState<string>('');
|
|
38
|
+
const [canLoadMore, setCanLoadMore] = useState<boolean>(false);
|
|
39
|
+
const manager = useInjectable<DebugSessionManager>(IDebugSessionManager);
|
|
40
|
+
const debugCallStackService = useInjectable<DebugCallStackService>(DebugCallStackService);
|
|
41
|
+
|
|
42
|
+
const loadMore = useCallback(async () => {
|
|
43
|
+
if (!thread) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const remainingFramesCount =
|
|
47
|
+
typeof thread.stoppedDetails?.totalFrames === 'number'
|
|
48
|
+
? thread.stoppedDetails?.totalFrames - thread.frameCount
|
|
49
|
+
: undefined;
|
|
50
|
+
const frames = await thread.fetchFrames(remainingFramesCount);
|
|
51
|
+
updateFrames(frames);
|
|
52
|
+
}, [frames]);
|
|
53
|
+
|
|
54
|
+
const frameOpenSource = (frame: DebugStackFrame) => {
|
|
55
|
+
if (frame && frame.source) {
|
|
56
|
+
frame.source.open({}, frame);
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const updateFrames = useCallback(
|
|
61
|
+
(frames: DebugStackFrame[]) => {
|
|
62
|
+
setFrames(frames);
|
|
63
|
+
},
|
|
64
|
+
[frames],
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
const updateSelected = useCallback(
|
|
68
|
+
(value: number | undefined) => {
|
|
69
|
+
setSelected(value);
|
|
70
|
+
},
|
|
71
|
+
[selected],
|
|
72
|
+
);
|
|
73
|
+
|
|
74
|
+
useEffect(() => {
|
|
75
|
+
updateFrames([...rawFrames]);
|
|
76
|
+
|
|
77
|
+
const disposable = new DisposableCollection();
|
|
78
|
+
|
|
79
|
+
disposable.push(
|
|
80
|
+
manager.onDidChangeActiveDebugSession(({ previous }) => {
|
|
81
|
+
if (previous && previous !== thread.session) {
|
|
82
|
+
updateSelected(undefined);
|
|
83
|
+
}
|
|
84
|
+
}),
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
return () => {
|
|
88
|
+
disposable.dispose();
|
|
89
|
+
};
|
|
90
|
+
}, []);
|
|
91
|
+
|
|
92
|
+
useEffect(() => {
|
|
93
|
+
if (thread) {
|
|
94
|
+
const hasSourceFrame = thread.frames.find((e: DebugStackFrame) => !!e.source);
|
|
95
|
+
if (hasSourceFrame) {
|
|
96
|
+
updateSelected(hasSourceFrame.raw.id);
|
|
97
|
+
frameOpenSource(hasSourceFrame);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}, [thread.frameCount]);
|
|
101
|
+
|
|
102
|
+
useEffect(() => {
|
|
103
|
+
if (thread) {
|
|
104
|
+
if (thread.stoppedDetails) {
|
|
105
|
+
const { framesErrorMessage, totalFrames } = thread.stoppedDetails;
|
|
106
|
+
setFramesErrorMessage(framesErrorMessage || '');
|
|
107
|
+
if (totalFrames && totalFrames > thread.frameCount) {
|
|
108
|
+
setCanLoadMore(true);
|
|
109
|
+
} else {
|
|
110
|
+
setCanLoadMore(false);
|
|
111
|
+
}
|
|
112
|
+
} else {
|
|
113
|
+
setCanLoadMore(false);
|
|
114
|
+
}
|
|
115
|
+
} else {
|
|
116
|
+
setCanLoadMore(false);
|
|
117
|
+
}
|
|
118
|
+
}, [frames]);
|
|
119
|
+
|
|
120
|
+
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(() => {
|
|
125
|
+
if (isLabel || isSubtle) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
manager.updateCurrentSession(frame.session);
|
|
129
|
+
|
|
130
|
+
frame.session.currentThread = frame.thread;
|
|
131
|
+
updateSelected(frame.raw.id);
|
|
132
|
+
frameOpenSource(frame);
|
|
133
|
+
}, [data]);
|
|
134
|
+
|
|
135
|
+
const restartFrame = (event: React.MouseEvent<HTMLAnchorElement, MouseEvent>) => {
|
|
136
|
+
event.preventDefault();
|
|
137
|
+
event.stopPropagation();
|
|
138
|
+
|
|
139
|
+
if (frame.canRestart) {
|
|
140
|
+
frame.restart();
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
return (
|
|
145
|
+
<div
|
|
146
|
+
style={{ paddingLeft: `${indent}px` }}
|
|
147
|
+
className={cls(
|
|
148
|
+
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,
|
|
151
|
+
)}
|
|
152
|
+
onClick={clickHandler}
|
|
153
|
+
onContextMenu={(event: React.MouseEvent<HTMLDivElement, MouseEvent>) =>
|
|
154
|
+
debugCallStackService.handleContextMenu(event, data)
|
|
155
|
+
}
|
|
156
|
+
>
|
|
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
|
+
</>
|
|
175
|
+
</div>
|
|
176
|
+
);
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
const renderLoadMoreStackFrames = () => {
|
|
180
|
+
const clickHandler = async () => {
|
|
181
|
+
setIsLoading(true);
|
|
182
|
+
await loadMore();
|
|
183
|
+
setIsLoading(false);
|
|
184
|
+
};
|
|
185
|
+
return (
|
|
186
|
+
<div className={styles.debug_stack_frames_item} onClick={clickHandler}>
|
|
187
|
+
<span className={styles.debug_stack_frames_load_more}>{localize('debug.stack.loadMore')}</span>
|
|
188
|
+
</div>
|
|
189
|
+
);
|
|
190
|
+
};
|
|
191
|
+
|
|
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>
|
|
196
|
+
);
|
|
197
|
+
|
|
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>
|
|
204
|
+
);
|
|
205
|
+
|
|
206
|
+
if (framesErrorMessage) {
|
|
207
|
+
return <div className={styles.debug_stack_frames}>{renderFramesErrorMessage(framesErrorMessage)}</div>;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
const footer = () => {
|
|
211
|
+
if (isLoading) {
|
|
212
|
+
return renderLoading();
|
|
213
|
+
} else if (canLoadMore) {
|
|
214
|
+
return renderLoadMoreStackFrames();
|
|
215
|
+
}
|
|
216
|
+
return null;
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
return (
|
|
220
|
+
<RecycleList
|
|
221
|
+
data={frames}
|
|
222
|
+
template={template}
|
|
223
|
+
itemHeight={22}
|
|
224
|
+
width={viewState.width}
|
|
225
|
+
paddingBottomSize={0}
|
|
226
|
+
height={isLoading || canLoadMore ? (frames.length + 1) * 22 : frames.length * 22}
|
|
227
|
+
footer={isLoading || canLoadMore ? footer : undefined}
|
|
228
|
+
/>
|
|
229
|
+
);
|
|
230
|
+
});
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import cls from 'classnames';
|
|
2
|
+
import React, { useCallback, useState, useEffect } from 'react';
|
|
3
|
+
|
|
4
|
+
import { ViewState, getIcon, useInjectable, DisposableCollection, localize } from '@opensumi/ide-core-browser';
|
|
5
|
+
|
|
6
|
+
import { DebugState, IDebugSessionManager } from '../../../common';
|
|
7
|
+
import { DebugSession } from '../../debug-session';
|
|
8
|
+
import { DebugSessionManager } from '../../debug-session-manager';
|
|
9
|
+
import { DebugThread } from '../../model/debug-thread';
|
|
10
|
+
|
|
11
|
+
import { DebugStackThreadView } from './debug-call-stack-thread.view';
|
|
12
|
+
import styles from './debug-call-stack.module.less';
|
|
13
|
+
import { DebugStackOperationView } from './debug-call-stack.operation';
|
|
14
|
+
import { DebugCallStackService } from './debug-call-stack.service';
|
|
15
|
+
|
|
16
|
+
export interface DebugStackSessionViewProps {
|
|
17
|
+
session: DebugSession;
|
|
18
|
+
viewState: ViewState;
|
|
19
|
+
indent: number;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export const DebugStackSessionView = (props: DebugStackSessionViewProps) => {
|
|
23
|
+
const { session, viewState } = props;
|
|
24
|
+
const manager = useInjectable<DebugSessionManager>(IDebugSessionManager);
|
|
25
|
+
const debugCallStackService = useInjectable<DebugCallStackService>(DebugCallStackService);
|
|
26
|
+
const [threads, setThreads] = useState<DebugThread[]>([]);
|
|
27
|
+
const [otherThreads, setOtherThreads] = useState<DebugThread[]>([]);
|
|
28
|
+
const [multipleThreadPaused, setMultipleThreadPaused] = useState<DebugThread[]>([]);
|
|
29
|
+
const [subSession, setSubSession] = useState<DebugSession[]>([]);
|
|
30
|
+
const [unfold, setUnfold] = useState<boolean>(true);
|
|
31
|
+
const [hover, setHover] = useState<boolean>(false);
|
|
32
|
+
const [loading, setLoading] = useState<boolean>(true);
|
|
33
|
+
// 多 session 调试
|
|
34
|
+
const mutipleSession = manager.sessions.length > 1;
|
|
35
|
+
const supportsThreadIdCorrespond = session.supportsThreadIdCorrespond;
|
|
36
|
+
|
|
37
|
+
// 从 manager.sessions 中找出 parentSession id 是当前 session id 的 session
|
|
38
|
+
const findSubSessions = () => {
|
|
39
|
+
const hasParentSessions = manager.sessions.filter((s) => s.parentSession);
|
|
40
|
+
const subSession: DebugSession[] = [];
|
|
41
|
+
while (hasParentSessions[0]) {
|
|
42
|
+
if (manager.getSession(hasParentSessions[0].parentSession?.id)?.id === session.id) {
|
|
43
|
+
subSession.push(hasParentSessions[0]);
|
|
44
|
+
}
|
|
45
|
+
hasParentSessions.shift();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return subSession;
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
// 加载更多线程信息
|
|
52
|
+
const fetchOtherThreads = async () => {
|
|
53
|
+
setLoading(true);
|
|
54
|
+
const _threads = await session.fetchThreads();
|
|
55
|
+
setLoading(false);
|
|
56
|
+
setOtherThreads(_threads);
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
useEffect(() => {
|
|
60
|
+
const createDispose = manager.onDidCreateDebugSession(() => {
|
|
61
|
+
const sub = findSubSessions();
|
|
62
|
+
setSubSession(sub);
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
const destroyDispose = manager.onDidDestroyDebugSession(() => {
|
|
66
|
+
const sub = findSubSessions();
|
|
67
|
+
setSubSession(sub);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
return () => {
|
|
71
|
+
createDispose.dispose();
|
|
72
|
+
destroyDispose.dispose();
|
|
73
|
+
setSubSession([]);
|
|
74
|
+
};
|
|
75
|
+
}, []);
|
|
76
|
+
|
|
77
|
+
const updateThreads = useCallback(
|
|
78
|
+
(threads: DebugThread[]) => {
|
|
79
|
+
setThreads(threads);
|
|
80
|
+
},
|
|
81
|
+
[threads],
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
const updateMultipleThreadPaused = useCallback(
|
|
85
|
+
(threads: DebugThread[]) => {
|
|
86
|
+
setMultipleThreadPaused(threads);
|
|
87
|
+
},
|
|
88
|
+
[multipleThreadPaused],
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
useEffect(() => {
|
|
92
|
+
updateThreads(Array.from(session.threads));
|
|
93
|
+
|
|
94
|
+
const disposable = new DisposableCollection();
|
|
95
|
+
|
|
96
|
+
disposable.push(
|
|
97
|
+
session.onDidChange(() => {
|
|
98
|
+
updateThreads([...session.threads]);
|
|
99
|
+
}),
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
disposable.push(
|
|
103
|
+
session.onDidThread(async ({ body: { reason } }) => {
|
|
104
|
+
if (!session.supportsThreadIdCorrespond) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (session.state === DebugState.Stopped && reason === 'started') {
|
|
109
|
+
await fetchOtherThreads();
|
|
110
|
+
}
|
|
111
|
+
}),
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
disposable.push(
|
|
115
|
+
session.onDidStop(async () => {
|
|
116
|
+
if (!session.supportsThreadIdCorrespond) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const multipleThreads = Array.from(session.multipleThreadPaused.values());
|
|
121
|
+
updateMultipleThreadPaused(multipleThreads);
|
|
122
|
+
|
|
123
|
+
await fetchOtherThreads();
|
|
124
|
+
}),
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
disposable.push(
|
|
128
|
+
session.onDidContinued(async () => {
|
|
129
|
+
if (!session.supportsThreadIdCorrespond) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const multipleThreads = Array.from(session.multipleThreadPaused.values());
|
|
134
|
+
updateMultipleThreadPaused(multipleThreads);
|
|
135
|
+
}),
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
return () => {
|
|
139
|
+
disposable.dispose();
|
|
140
|
+
};
|
|
141
|
+
}, []);
|
|
142
|
+
|
|
143
|
+
// 渲染 "加载更多线程"
|
|
144
|
+
const renderLoadMoreThread = () => {
|
|
145
|
+
if (session.state !== DebugState.Stopped) {
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
if (supportsThreadIdCorrespond && unfold) {
|
|
150
|
+
return loading ? (
|
|
151
|
+
<div className={styles.debug_stack_item_loading}>
|
|
152
|
+
<span>{localize('debug.stack.loading')}</span>
|
|
153
|
+
</div>
|
|
154
|
+
) : (
|
|
155
|
+
otherThreads.map(
|
|
156
|
+
(thread) =>
|
|
157
|
+
!session.hasInMultipleThreadPaused(thread.raw.id) && (
|
|
158
|
+
<DebugStackThreadView
|
|
159
|
+
key={thread.id}
|
|
160
|
+
indent={mutipleSession ? 16 : 0}
|
|
161
|
+
viewState={viewState}
|
|
162
|
+
thread={thread}
|
|
163
|
+
session={session}
|
|
164
|
+
/>
|
|
165
|
+
),
|
|
166
|
+
)
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
const isIncompressible = (stat: DebugSession) => {
|
|
172
|
+
if (stat.threads.some((t) => t.frameCount > 0)) {
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
const sub = findSubSessions();
|
|
177
|
+
if (sub.length !== 1) {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if (!sub[0].compact) {
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return true;
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
if (isIncompressible(session)) {
|
|
189
|
+
const sub = findSubSessions();
|
|
190
|
+
return (
|
|
191
|
+
<div className={styles.debug_stack_item}>
|
|
192
|
+
{sub.map((s) => (
|
|
193
|
+
<DebugStackSessionView key={s.id} viewState={viewState} session={s} indent={1} />
|
|
194
|
+
))}
|
|
195
|
+
</div>
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
return (
|
|
200
|
+
<div
|
|
201
|
+
className={styles.debug_stack_item}
|
|
202
|
+
onContextMenu={(event: React.MouseEvent<HTMLDivElement, MouseEvent>) =>
|
|
203
|
+
debugCallStackService.handleContextMenu(event, session)
|
|
204
|
+
}
|
|
205
|
+
>
|
|
206
|
+
{mutipleSession && (
|
|
207
|
+
<div
|
|
208
|
+
className={styles.debug_stack_item_label}
|
|
209
|
+
onMouseEnter={() => setHover(true)}
|
|
210
|
+
onMouseLeave={() => setHover(false)}
|
|
211
|
+
>
|
|
212
|
+
{supportsThreadIdCorrespond || threads.length > 0 ? (
|
|
213
|
+
<>
|
|
214
|
+
<div className={unfold ? getIcon('down') : getIcon('right')} onClick={() => setUnfold(!unfold)}></div>
|
|
215
|
+
<div className={cls([getIcon('debug'), styles.debug_session_icon])}></div>
|
|
216
|
+
</>
|
|
217
|
+
) : (
|
|
218
|
+
<div style={{ width: 30 }}></div>
|
|
219
|
+
)}
|
|
220
|
+
<div className={styles.debug_stack_item_label_title}>{session.label}</div>
|
|
221
|
+
{hover && <DebugStackOperationView session={session} />}
|
|
222
|
+
</div>
|
|
223
|
+
)}
|
|
224
|
+
{supportsThreadIdCorrespond && unfold
|
|
225
|
+
? multipleThreadPaused.map((t) => (
|
|
226
|
+
<DebugStackThreadView
|
|
227
|
+
key={t.id}
|
|
228
|
+
indent={mutipleSession ? 16 : 0}
|
|
229
|
+
viewState={viewState}
|
|
230
|
+
thread={t}
|
|
231
|
+
session={session}
|
|
232
|
+
/>
|
|
233
|
+
))
|
|
234
|
+
: null}
|
|
235
|
+
{!supportsThreadIdCorrespond &&
|
|
236
|
+
(!mutipleSession || unfold) &&
|
|
237
|
+
threads.map((thread) => (
|
|
238
|
+
<DebugStackThreadView
|
|
239
|
+
key={thread.id}
|
|
240
|
+
indent={mutipleSession ? 16 : 0}
|
|
241
|
+
viewState={viewState}
|
|
242
|
+
thread={thread}
|
|
243
|
+
session={session}
|
|
244
|
+
/>
|
|
245
|
+
))}
|
|
246
|
+
{subSession.length > 0 &&
|
|
247
|
+
subSession.map(
|
|
248
|
+
(s) => unfold && <DebugStackSessionView key={s.id} viewState={viewState} session={s} indent={1} />,
|
|
249
|
+
)}
|
|
250
|
+
{renderLoadMoreThread()}
|
|
251
|
+
</div>
|
|
252
|
+
);
|
|
253
|
+
};
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import React, { useCallback, useEffect, useState } from 'react';
|
|
2
|
+
|
|
3
|
+
import { ViewState, getIcon, useInjectable, localize, DisposableCollection } from '@opensumi/ide-core-browser';
|
|
4
|
+
|
|
5
|
+
import { IDebugSessionManager } from '../../../common';
|
|
6
|
+
import { DebugSession } from '../../debug-session';
|
|
7
|
+
import { DebugSessionManager } from '../../debug-session-manager';
|
|
8
|
+
import { DebugStackFrame } from '../../model';
|
|
9
|
+
import { DebugThread } from '../../model/debug-thread';
|
|
10
|
+
|
|
11
|
+
import { DebugStackFramesView } from './debug-call-stack-frame.view';
|
|
12
|
+
import styles from './debug-call-stack.module.less';
|
|
13
|
+
import { DebugStackOperationView } from './debug-call-stack.operation';
|
|
14
|
+
import { DebugCallStackService } from './debug-call-stack.service';
|
|
15
|
+
|
|
16
|
+
export interface DebugStackThreadViewProps {
|
|
17
|
+
session: DebugSession;
|
|
18
|
+
viewState: ViewState;
|
|
19
|
+
thread: DebugThread;
|
|
20
|
+
indent?: number;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export const DebugStackThreadView = (props: DebugStackThreadViewProps) => {
|
|
24
|
+
const { thread, viewState, indent, session } = props;
|
|
25
|
+
const manager = useInjectable<DebugSessionManager>(IDebugSessionManager);
|
|
26
|
+
const debugCallStackService = useInjectable<DebugCallStackService>(DebugCallStackService);
|
|
27
|
+
const [expanded, setExpanded] = useState<boolean>(true);
|
|
28
|
+
const [frames, setFrames] = useState<DebugStackFrame[]>(thread.frames);
|
|
29
|
+
|
|
30
|
+
const mutipleS = manager.sessions.length > 1;
|
|
31
|
+
const mutiple = manager.currentSession?.supportsThreadIdCorrespond
|
|
32
|
+
? true
|
|
33
|
+
: manager.sessions.length > 1 || (manager.sessions[0] && manager.sessions[0].threadCount > 1);
|
|
34
|
+
|
|
35
|
+
const updateExpanded = useCallback(
|
|
36
|
+
(value: boolean) => {
|
|
37
|
+
setExpanded(value);
|
|
38
|
+
},
|
|
39
|
+
[expanded],
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
const disposable = new DisposableCollection();
|
|
44
|
+
|
|
45
|
+
disposable.push(
|
|
46
|
+
session.onDidChangeCallStack(() => {
|
|
47
|
+
setFrames(thread.frames);
|
|
48
|
+
if (thread.stopped && manager.currentThread && manager.currentThread.id === thread.id) {
|
|
49
|
+
updateExpanded(true);
|
|
50
|
+
} else {
|
|
51
|
+
updateExpanded(false);
|
|
52
|
+
}
|
|
53
|
+
}),
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
return () => {
|
|
57
|
+
disposable.dispose();
|
|
58
|
+
};
|
|
59
|
+
}, []);
|
|
60
|
+
|
|
61
|
+
return (
|
|
62
|
+
<div
|
|
63
|
+
className={styles.debug_stack_item}
|
|
64
|
+
onContextMenu={(event: React.MouseEvent<HTMLDivElement, MouseEvent>) =>
|
|
65
|
+
debugCallStackService.handleContextMenu(event, thread)
|
|
66
|
+
}
|
|
67
|
+
>
|
|
68
|
+
{mutiple && (
|
|
69
|
+
<div style={{ paddingLeft: `${indent}px` }} className={styles.debug_stack_item_label}>
|
|
70
|
+
{thread.frames.length > 0 ? (
|
|
71
|
+
<div className={expanded ? getIcon('down') : getIcon('right')} onClick={() => setExpanded(!expanded)}></div>
|
|
72
|
+
) : (
|
|
73
|
+
<div style={{ width: 14 }}></div>
|
|
74
|
+
)}
|
|
75
|
+
<div className={styles.debug_threads_item}>{thread.raw.name}</div>
|
|
76
|
+
<>
|
|
77
|
+
<div className={styles.debug_threads_operation}>
|
|
78
|
+
<DebugStackOperationView thread={thread} />
|
|
79
|
+
</div>
|
|
80
|
+
<span className={styles.debug_threads_description}>
|
|
81
|
+
{thread.stopped && thread.stoppedDetails
|
|
82
|
+
? thread.raw.id === thread.stoppedDetails.threadId
|
|
83
|
+
? `${localize('debug.stack.frame.because')} ${thread.stoppedDetails.reason} ${localize(
|
|
84
|
+
'debug.stack.frame.stopped',
|
|
85
|
+
)}`
|
|
86
|
+
: localize('debug.stack.frame.stopped')
|
|
87
|
+
: localize('debug.stack.frame.running')}
|
|
88
|
+
</span>
|
|
89
|
+
</>
|
|
90
|
+
</div>
|
|
91
|
+
)}
|
|
92
|
+
{(!mutiple || expanded) && thread.frames.length > 0 && (
|
|
93
|
+
<DebugStackFramesView
|
|
94
|
+
indent={mutiple ? (mutipleS ? 24 + 14 : 16 + 14) : 8}
|
|
95
|
+
viewState={viewState}
|
|
96
|
+
thread={thread}
|
|
97
|
+
frames={frames}
|
|
98
|
+
session={session}
|
|
99
|
+
/>
|
|
100
|
+
)}
|
|
101
|
+
</div>
|
|
102
|
+
);
|
|
103
|
+
};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { Autowired } from '@opensumi/di';
|
|
2
|
+
import { Domain, CommandContribution, CommandRegistry, localize, IClipboardService } from '@opensumi/ide-core-browser';
|
|
3
|
+
import { MenuContribution, IMenuRegistry, MenuId } from '@opensumi/ide-core-browser/lib/menu/next';
|
|
4
|
+
|
|
5
|
+
import { DEBUG_COMMANDS } from '../../../common';
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
CONTEXT_CALLSTACK_ITEM_TYPE,
|
|
9
|
+
CONTEXT_RESTART_FRAME_SUPPORTED,
|
|
10
|
+
CONTEXT_STACK_FRAME_SUPPORTS_RESTART,
|
|
11
|
+
} from './../../../common/constants';
|
|
12
|
+
import { IDebugSessionManager } from './../../../common/debug-session';
|
|
13
|
+
import { CallStackContext } from './../../../common/types';
|
|
14
|
+
import { DebugSessionManager } from './../../debug-session-manager';
|
|
15
|
+
import { DebugStackFrame } from './../../model/debug-stack-frame';
|
|
16
|
+
import { DebugThread } from './../../model/debug-thread';
|
|
17
|
+
|
|
18
|
+
function isStackFrameContext(obj: any): obj is CallStackContext {
|
|
19
|
+
return (
|
|
20
|
+
obj && typeof obj.sessionId === 'string' && typeof obj.threadId === 'string' && typeof obj.frameId === 'string'
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function getFrame(debugService: DebugSessionManager, context: CallStackContext | unknown): DebugStackFrame | undefined {
|
|
25
|
+
if (isStackFrameContext(context)) {
|
|
26
|
+
const session = debugService.getSession(context.sessionId);
|
|
27
|
+
if (session) {
|
|
28
|
+
const thread = [session.currentThread, ...session.threads].find((t: DebugThread) => t.id === context.threadId);
|
|
29
|
+
if (thread) {
|
|
30
|
+
return thread.frames.find((sf: DebugStackFrame) => sf.id === context.frameId);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
@Domain(MenuContribution, CommandContribution)
|
|
39
|
+
export class DebugCallStackContribution implements MenuContribution, CommandContribution {
|
|
40
|
+
@Autowired(IDebugSessionManager)
|
|
41
|
+
protected readonly debugSessionManager: DebugSessionManager;
|
|
42
|
+
|
|
43
|
+
@Autowired(IClipboardService)
|
|
44
|
+
private readonly clipboardService: IClipboardService;
|
|
45
|
+
|
|
46
|
+
registerCommands(registry: CommandRegistry) {
|
|
47
|
+
registry.registerCommand(DEBUG_COMMANDS.RESTART_FRAME, {
|
|
48
|
+
execute: async (_: string, context: CallStackContext) => {
|
|
49
|
+
const frame = getFrame(this.debugSessionManager, context);
|
|
50
|
+
if (frame) {
|
|
51
|
+
await frame.restart();
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
registry.registerCommand(DEBUG_COMMANDS.COPY_STACK_TRACE, {
|
|
56
|
+
execute: async (_: string, context: CallStackContext) => {
|
|
57
|
+
const frame = getFrame(this.debugSessionManager, context);
|
|
58
|
+
if (frame) {
|
|
59
|
+
const callStacks = frame.thread.frames.map(
|
|
60
|
+
(e: DebugStackFrame) =>
|
|
61
|
+
`${e.raw && e.raw.name} (${e.raw && e.raw.source && e.raw.source.path}:${e.raw && e.raw.line})`,
|
|
62
|
+
);
|
|
63
|
+
this.clipboardService.writeText(callStacks.join('\n'));
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
registerMenus(registry: IMenuRegistry) {
|
|
70
|
+
registry.registerMenuItem(MenuId.DebugCallStackContext, {
|
|
71
|
+
command: {
|
|
72
|
+
id: DEBUG_COMMANDS.RESTART_FRAME.id,
|
|
73
|
+
label: localize('debugger.menu.restartFrame'),
|
|
74
|
+
},
|
|
75
|
+
when: `${CONTEXT_CALLSTACK_ITEM_TYPE.equalsTo('stackFrame')} && ${CONTEXT_RESTART_FRAME_SUPPORTED.raw}`,
|
|
76
|
+
enabledWhen: CONTEXT_STACK_FRAME_SUPPORTS_RESTART.raw,
|
|
77
|
+
order: 10,
|
|
78
|
+
});
|
|
79
|
+
registry.registerMenuItem(MenuId.DebugCallStackContext, {
|
|
80
|
+
command: {
|
|
81
|
+
id: DEBUG_COMMANDS.COPY_STACK_TRACE.id,
|
|
82
|
+
label: localize('debugger.menu.copyCallstack'),
|
|
83
|
+
},
|
|
84
|
+
when: CONTEXT_CALLSTACK_ITEM_TYPE.equalsTo('stackFrame'),
|
|
85
|
+
order: 20,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|