@opensumi/ide-debug 2.21.6 → 2.21.7-rc-1669780664.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 (166) hide show
  1. package/lib/browser/index.d.ts.map +1 -1
  2. package/lib/browser/index.js +2 -9
  3. package/lib/browser/index.js.map +1 -1
  4. package/lib/browser/preferences/launch-folder-preference-provider.d.ts +2 -2
  5. package/lib/browser/preferences/launch-folder-preference-provider.d.ts.map +1 -1
  6. package/lib/browser/preferences/launch-folder-preference-provider.js +2 -2
  7. package/lib/browser/preferences/launch-folder-preference-provider.js.map +1 -1
  8. package/lib/browser/view/configuration/debug-configuration.module.less +5 -5
  9. package/lib/browser/view/configuration/debug-configuration.view.d.ts.map +1 -1
  10. package/lib/browser/view/configuration/debug-configuration.view.js +1 -1
  11. package/lib/browser/view/configuration/debug-configuration.view.js.map +1 -1
  12. package/lib/browser/view/configuration/debug-toolbar.view.js +2 -2
  13. package/lib/browser/view/configuration/debug-toolbar.view.js.map +1 -1
  14. package/lib/browser/view/console/debug-console.module.less +2 -1
  15. package/lib/browser/view/console/debug-console.view.js +2 -2
  16. package/lib/browser/view/console/debug-console.view.js.map +1 -1
  17. package/lib/browser/view/variables/debug-variables.module.less +2 -1
  18. package/lib/browser/view/variables/debug-variables.view.js +1 -1
  19. package/lib/browser/view/variables/debug-variables.view.js.map +1 -1
  20. package/lib/browser/view/watch/debug-watch.module.less +2 -1
  21. package/lib/browser/view/watch/debug-watch.view.js +1 -1
  22. package/lib/browser/view/watch/debug-watch.view.js.map +1 -1
  23. package/package.json +25 -24
  24. package/src/browser/assets/breakpoint-conditional-disabled.svg +4 -0
  25. package/src/browser/assets/breakpoint-conditional-unverified.svg +4 -0
  26. package/src/browser/assets/breakpoint-conditional.svg +4 -0
  27. package/src/browser/assets/breakpoint-disabled.svg +4 -0
  28. package/src/browser/assets/breakpoint-hint.svg +4 -0
  29. package/src/browser/assets/breakpoint-log-disabled.svg +4 -0
  30. package/src/browser/assets/breakpoint-log-unverified.svg +4 -0
  31. package/src/browser/assets/breakpoint-log.svg +4 -0
  32. package/src/browser/assets/breakpoint-unsupported.svg +4 -0
  33. package/src/browser/assets/breakpoint-unverified.svg +4 -0
  34. package/src/browser/assets/breakpoint.svg +4 -0
  35. package/src/browser/assets/breakpoints-activate-inverse.svg +4 -0
  36. package/src/browser/assets/breakpoints-activate.svg +4 -0
  37. package/src/browser/assets/configure-inverse.svg +4 -0
  38. package/src/browser/assets/configure.svg +4 -0
  39. package/src/browser/assets/continue-inverse.svg +4 -0
  40. package/src/browser/assets/current-and-breakpoint.svg +4 -0
  41. package/src/browser/assets/current-arrow.svg +4 -0
  42. package/src/browser/assets/remove-all-inverse.svg +4 -0
  43. package/src/browser/assets/remove-all.svg +4 -0
  44. package/src/browser/assets/repl-inverse.svg +4 -0
  45. package/src/browser/assets/repl.svg +4 -0
  46. package/src/browser/assets/restart-inverse.svg +4 -0
  47. package/src/browser/assets/stackframe-and-breakpoint.svg +4 -0
  48. package/src/browser/assets/stackframe-arrow.svg +4 -0
  49. package/src/browser/assets/start-inverse.svg +4 -0
  50. package/src/browser/breakpoint/breakpoint-decoration.ts +57 -0
  51. package/src/browser/breakpoint/breakpoint-manager.ts +348 -0
  52. package/src/browser/breakpoint/breakpoint-marker.ts +70 -0
  53. package/src/browser/breakpoint/index.ts +3 -0
  54. package/src/browser/components/debug-action/index.module.less +73 -0
  55. package/src/browser/components/debug-action/index.tsx +40 -0
  56. package/src/browser/components/debug-exception-widget.less +42 -0
  57. package/src/browser/components/floating-click-widget/index.module.less +5 -0
  58. package/src/browser/components/floating-click-widget/index.tsx +21 -0
  59. package/src/browser/components/index.ts +1 -0
  60. package/src/browser/contextkeys/debug-call-stack-item-type-key.ts +4 -0
  61. package/src/browser/contextkeys/debug-contextkey.service.ts +54 -0
  62. package/src/browser/contextkeys/index.ts +1 -0
  63. package/src/browser/debug-ansi-handle.ts +521 -0
  64. package/src/browser/debug-configuration-manager.ts +513 -0
  65. package/src/browser/debug-configuration-model.ts +66 -0
  66. package/src/browser/debug-contribution.ts +904 -0
  67. package/src/browser/debug-exception-widget.tsx +89 -0
  68. package/src/browser/debug-link-detector.ts +234 -0
  69. package/src/browser/debug-memory.ts +220 -0
  70. package/src/browser/debug-preferences.ts +70 -0
  71. package/src/browser/debug-progress.service.ts +122 -0
  72. package/src/browser/debug-schema-updater.ts +67 -0
  73. package/src/browser/debug-service.ts +42 -0
  74. package/src/browser/debug-session-connection.ts +333 -0
  75. package/src/browser/debug-session-contribution.ts +57 -0
  76. package/src/browser/debug-session-manager.ts +622 -0
  77. package/src/browser/debug-session.ts +1179 -0
  78. package/src/browser/debug-style.less +128 -0
  79. package/src/browser/debugUtils.ts +110 -0
  80. package/src/browser/editor/debug-breakpoint-widget.ts +99 -0
  81. package/src/browser/editor/debug-breakpoint-zone-widget.tsx +262 -0
  82. package/src/browser/editor/debug-breakpoint.module.less +31 -0
  83. package/src/browser/editor/debug-editor-contribution.ts +590 -0
  84. package/src/browser/editor/debug-expression-provider.ts +101 -0
  85. package/src/browser/editor/debug-hover-model.ts +38 -0
  86. package/src/browser/editor/debug-hover-source.ts +107 -0
  87. package/src/browser/editor/debug-hover-tree.model.service.ts +332 -0
  88. package/src/browser/editor/debug-hover-widget.tsx +200 -0
  89. package/src/browser/editor/debug-hover.module.less +29 -0
  90. package/src/browser/editor/debug-hover.view.tsx +147 -0
  91. package/src/browser/editor/debug-model-manager.ts +220 -0
  92. package/src/browser/editor/debug-model.ts +853 -0
  93. package/src/browser/editor/debug-run-to-cursor.service.ts +180 -0
  94. package/src/browser/editor/debug-styles.ts +66 -0
  95. package/src/browser/editor/evaluatable-expression.ts +47 -0
  96. package/src/browser/editor/index.ts +6 -0
  97. package/src/browser/index.ts +121 -0
  98. package/src/browser/markers/index.ts +2 -0
  99. package/src/browser/markers/marker-manager.ts +201 -0
  100. package/src/browser/markers/marker.ts +20 -0
  101. package/src/browser/model/debug-source.ts +144 -0
  102. package/src/browser/model/debug-stack-frame.ts +111 -0
  103. package/src/browser/model/debug-thread.ts +186 -0
  104. package/src/browser/model/debug-watch.ts +130 -0
  105. package/src/browser/model/index.ts +4 -0
  106. package/src/browser/preferences/launch-folder-preference-provider.ts +23 -0
  107. package/src/browser/preferences/launch-preferences-contribution.ts +9 -0
  108. package/src/browser/preferences/launch-preferences.ts +16 -0
  109. package/src/browser/tree/debug-console-tree-node.define.tsx +76 -0
  110. package/src/browser/tree/debug-tree-node.define.ts +768 -0
  111. package/src/browser/tree/index.ts +2 -0
  112. package/src/browser/view/breakpoints/debug-breakpoints.module.less +72 -0
  113. package/src/browser/view/breakpoints/debug-breakpoints.service.ts +217 -0
  114. package/src/browser/view/breakpoints/debug-breakpoints.view.tsx +174 -0
  115. package/src/browser/view/configuration/debug-configuration.module.less +110 -0
  116. package/src/browser/view/configuration/debug-configuration.service.ts +170 -0
  117. package/src/browser/view/configuration/debug-configuration.view.tsx +252 -0
  118. package/src/browser/view/configuration/debug-toolbar.service.ts +167 -0
  119. package/src/browser/view/configuration/debug-toolbar.view.tsx +335 -0
  120. package/src/browser/view/console/debug-console-filter.model.ts +49 -0
  121. package/src/browser/view/console/debug-console-filter.service.ts +81 -0
  122. package/src/browser/view/console/debug-console-filter.view.tsx +78 -0
  123. package/src/browser/view/console/debug-console-model.ts +48 -0
  124. package/src/browser/view/console/debug-console-session.ts +164 -0
  125. package/src/browser/view/console/debug-console-toolbar.view.tsx +28 -0
  126. package/src/browser/view/console/debug-console-tree.model.service.ts +550 -0
  127. package/src/browser/view/console/debug-console.contribution.ts +181 -0
  128. package/src/browser/view/console/debug-console.module.less +373 -0
  129. package/src/browser/view/console/debug-console.service.ts +433 -0
  130. package/src/browser/view/console/debug-console.view.tsx +500 -0
  131. package/src/browser/view/debug-view-model.ts +182 -0
  132. package/src/browser/view/frames/debug-call-stack-frame.view.tsx +224 -0
  133. package/src/browser/view/frames/debug-call-stack-session.view.tsx +237 -0
  134. package/src/browser/view/frames/debug-call-stack-thread.view.tsx +93 -0
  135. package/src/browser/view/frames/debug-call-stack.contribution.ts +88 -0
  136. package/src/browser/view/frames/debug-call-stack.module.less +193 -0
  137. package/src/browser/view/frames/debug-call-stack.operation.tsx +97 -0
  138. package/src/browser/view/frames/debug-call-stack.service.ts +105 -0
  139. package/src/browser/view/frames/debug-call-stack.view.tsx +43 -0
  140. package/src/browser/view/variables/debug-variables-model.ts +38 -0
  141. package/src/browser/view/variables/debug-variables-tree.model.service.ts +467 -0
  142. package/src/browser/view/variables/debug-variables.contribution.ts +244 -0
  143. package/src/browser/view/variables/debug-variables.module.less +149 -0
  144. package/src/browser/view/variables/debug-variables.view.tsx +303 -0
  145. package/src/browser/view/watch/debug-watch-model.ts +38 -0
  146. package/src/browser/view/watch/debug-watch-tree.model.service.ts +567 -0
  147. package/src/browser/view/watch/debug-watch.contribution.ts +167 -0
  148. package/src/browser/view/watch/debug-watch.module.less +189 -0
  149. package/src/browser/view/watch/debug-watch.view.tsx +337 -0
  150. package/src/common/constants.ts +81 -0
  151. package/src/common/debug-breakpoint.ts +43 -0
  152. package/src/common/debug-configuration.ts +68 -0
  153. package/src/common/debug-editor.ts +4 -0
  154. package/src/common/debug-hover.ts +31 -0
  155. package/src/common/debug-model.ts +247 -0
  156. package/src/common/debug-progress.ts +8 -0
  157. package/src/common/debug-schema-updater.ts +1 -0
  158. package/src/common/debug-service.ts +176 -0
  159. package/src/common/debug-session-options.ts +19 -0
  160. package/src/common/debug-session.ts +200 -0
  161. package/src/common/evaluatable-expression.ts +43 -0
  162. package/src/common/index.ts +14 -0
  163. package/src/common/inline-values.ts +77 -0
  164. package/src/common/terminal.ts +163 -0
  165. package/src/common/types.ts +86 -0
  166. package/src/index.ts +1 -0
@@ -0,0 +1,433 @@
1
+ import { Injectable, Autowired, Injector, INJECTOR_TOKEN } from '@opensumi/di';
2
+ import {
3
+ IContextKeyService,
4
+ MonacoOverrideServiceRegistry,
5
+ ServiceNames,
6
+ localize,
7
+ StorageProvider,
8
+ } from '@opensumi/ide-core-browser';
9
+ import { Schemes, URI, CommandRegistry, Emitter, Event, STORAGE_NAMESPACE } from '@opensumi/ide-core-common';
10
+ import { EditorCollectionService, IDecorationApplyOptions } from '@opensumi/ide-editor';
11
+ import { IEditorDocumentModelService, ICodeEditor, getSimpleEditorOptions } from '@opensumi/ide-editor/lib/browser';
12
+ import { MonacoCodeService } from '@opensumi/ide-editor/lib/browser/editor.override';
13
+ import { IMainLayoutService } from '@opensumi/ide-main-layout';
14
+ import { transparent, editorForeground, IThemeService } from '@opensumi/ide-theme';
15
+ import { IHistoryNavigationWidget } from '@opensumi/monaco-editor-core/esm/vs/base/browser/history';
16
+ import { HistoryNavigator } from '@opensumi/monaco-editor-core/esm/vs/base/common/history';
17
+ import { ITextModel } from '@opensumi/monaco-editor-core/esm/vs/editor/common/model';
18
+ import * as monaco from '@opensumi/monaco-editor-core/esm/vs/editor/editor.api';
19
+
20
+ import {
21
+ DEBUG_CONSOLE_CONTAINER_ID,
22
+ IDebugSessionManager,
23
+ CONTEXT_IN_DEBUG_MODE_KEY,
24
+ DebugState,
25
+ } from '../../../common';
26
+ import { DebugSessionManager } from '../../debug-session-manager';
27
+
28
+ import { DebugContextKey } from './../../contextkeys/debug-contextkey.service';
29
+ import { DebugConsoleModelService } from './debug-console-tree.model.service';
30
+
31
+ const DECORATION_KEY = 'consoleinputdecoration';
32
+ const HISTORY_STORAGE_KEY = 'debug.console.history';
33
+ const DEBUG_CONSOLE_DEFAULT_HEIGHT = 18;
34
+
35
+ const firstUpperCase = (str: string) => str.replace(/^\S/, (s) => s.toUpperCase());
36
+
37
+ const consoleInputMonacoOptions: monaco.editor.IEditorOptions = {
38
+ ...getSimpleEditorOptions(),
39
+ scrollbar: {
40
+ horizontal: 'visible',
41
+ vertical: 'hidden',
42
+ handleMouseWheel: true,
43
+ },
44
+ acceptSuggestionOnEnter: 'on',
45
+ readOnly: true,
46
+ };
47
+
48
+ @Injectable()
49
+ export class DebugConsoleService implements IHistoryNavigationWidget {
50
+ @Autowired(DebugConsoleModelService)
51
+ protected readonly debugConsoleModelService: DebugConsoleModelService;
52
+
53
+ @Autowired(IMainLayoutService)
54
+ protected readonly mainLayoutService: IMainLayoutService;
55
+
56
+ @Autowired(IEditorDocumentModelService)
57
+ protected readonly documentService: IEditorDocumentModelService;
58
+
59
+ @Autowired(EditorCollectionService)
60
+ protected readonly editorService: EditorCollectionService;
61
+
62
+ @Autowired(CommandRegistry)
63
+ protected readonly commands: CommandRegistry;
64
+
65
+ @Autowired(IContextKeyService)
66
+ protected readonly contextKeyService: IContextKeyService;
67
+
68
+ @Autowired(IDebugSessionManager)
69
+ protected readonly manager: DebugSessionManager;
70
+
71
+ @Autowired(IThemeService)
72
+ protected readonly themeService: IThemeService;
73
+
74
+ @Autowired(MonacoOverrideServiceRegistry)
75
+ private readonly overrideServicesRegistry: MonacoOverrideServiceRegistry;
76
+
77
+ @Autowired(StorageProvider)
78
+ private readonly storageProvider: StorageProvider;
79
+
80
+ @Autowired(INJECTOR_TOKEN)
81
+ private readonly injector: Injector;
82
+
83
+ private debugContextKey: DebugContextKey;
84
+
85
+ protected history: HistoryNavigator<string>;
86
+ protected _consoleInputElement: HTMLDivElement | null = null;
87
+ protected _updateDisposable: monaco.IDisposable | null = null;
88
+ protected _consoleModel: ITextModel;
89
+ protected get _isReadonly(): boolean {
90
+ const session = this.manager.currentSession;
91
+ if (session && session.state !== DebugState.Inactive) {
92
+ return false;
93
+ }
94
+
95
+ return true;
96
+ }
97
+
98
+ private inputEditor?: ICodeEditor;
99
+
100
+ public static keySet = new Set([CONTEXT_IN_DEBUG_MODE_KEY]);
101
+
102
+ constructor() {
103
+ this.contextKeyService.onDidChangeContext((e) => {
104
+ if (e.payload.affectsSome(DebugConsoleService.keySet)) {
105
+ const inDebugMode = this.contextKeyService.match(CONTEXT_IN_DEBUG_MODE_KEY);
106
+ if (inDebugMode) {
107
+ this.updateReadOnly(false);
108
+ this.updateInputDecoration();
109
+ this.debugContextKey.contextInDdebugMode.set(true);
110
+ } else {
111
+ this.updateReadOnly(true);
112
+ if (this.debugContextKey) {
113
+ this.debugContextKey.contextInDdebugMode.set(false);
114
+ }
115
+ }
116
+ }
117
+ });
118
+ }
119
+
120
+ // FIXME: 需要实现新增的属性及事件
121
+ element: HTMLElement;
122
+ onDidFocus: Event<void>;
123
+ onDidBlur: Event<void>;
124
+
125
+ private _onConsoleInputValueChange = new Emitter<URI>();
126
+ public onConsoleInputValueChange: Event<URI> = this._onConsoleInputValueChange.event;
127
+
128
+ private _onInputHeightChange = new Emitter<number>();
129
+ public onInputHeightChange: Event<number> = this._onInputHeightChange.event;
130
+
131
+ public get isVisible() {
132
+ const bottomPanelHandler = this.mainLayoutService.getTabbarHandler(DEBUG_CONSOLE_CONTAINER_ID);
133
+ return bottomPanelHandler && bottomPanelHandler.isVisible;
134
+ }
135
+
136
+ public get consoleModel(): DebugConsoleModelService {
137
+ return this.debugConsoleModelService;
138
+ }
139
+
140
+ public activate() {
141
+ const bottomPanelHandler = this.mainLayoutService.getTabbarHandler(DEBUG_CONSOLE_CONTAINER_ID);
142
+ if (bottomPanelHandler && !bottomPanelHandler.isVisible) {
143
+ bottomPanelHandler.activate();
144
+ }
145
+ }
146
+
147
+ public focusInput(): void {
148
+ if (this.inputEditor) {
149
+ this.inputEditor.monacoEditor.focus();
150
+ }
151
+ }
152
+
153
+ public async init(e: HTMLDivElement | null) {
154
+ if (!e) {
155
+ return;
156
+ }
157
+
158
+ const storage = await this.storageProvider(STORAGE_NAMESPACE.DEBUG);
159
+ this.history = new HistoryNavigator(storage.get(HISTORY_STORAGE_KEY, []), 50);
160
+
161
+ this._consoleInputElement = e;
162
+ this.inputEditor = this.editorService.createCodeEditor(this._consoleInputElement!, {
163
+ ...consoleInputMonacoOptions,
164
+ });
165
+
166
+ this.debugContextKey = this.injector.get(DebugContextKey, [
167
+ (this.inputEditor.monacoEditor as any)._contextKeyService,
168
+ ]);
169
+
170
+ this.registerDecorationType();
171
+ await this.createConsoleInput();
172
+ this.setMode();
173
+ }
174
+
175
+ public get contextInDebugRepl() {
176
+ return this.debugContextKey.contextInDebugRepl;
177
+ }
178
+
179
+ public get consoleInputValue() {
180
+ return (this._consoleModel && this._consoleModel.getValue()) || '';
181
+ }
182
+
183
+ public showPreviousValue(): void {
184
+ if (!this._isReadonly) {
185
+ this.navigateHistory(true);
186
+ }
187
+ }
188
+
189
+ public showNextValue(): void {
190
+ if (!this._isReadonly) {
191
+ this.navigateHistory(false);
192
+ }
193
+ }
194
+
195
+ public async runExecute(): Promise<void> {
196
+ if (!this.inputEditor) {
197
+ return;
198
+ }
199
+
200
+ const editor = this.inputEditor.monacoEditor;
201
+ const value = editor.getValue();
202
+ await this.consoleModel.execute(value);
203
+ this.history.add(value);
204
+ editor.setValue('');
205
+ }
206
+
207
+ private navigateHistory(previous: boolean): void {
208
+ const historyInput = previous ? this.history.previous() : this.history.next();
209
+ if (historyInput && this.inputEditor && this.inputEditor.monacoEditor) {
210
+ const { monacoEditor } = this.inputEditor;
211
+ monacoEditor.setValue(historyInput);
212
+ monacoEditor.setPosition({ lineNumber: 1, column: historyInput.length + 1 });
213
+ }
214
+ }
215
+
216
+ private get consoleInputUri() {
217
+ return new URI('debug/console/input').withScheme(Schemes.walkThroughSnippet);
218
+ }
219
+
220
+ private async createConsoleInput() {
221
+ if (!this.inputEditor?.monacoEditor) {
222
+ return;
223
+ }
224
+
225
+ const { monacoEditor } = this.inputEditor;
226
+
227
+ const docModel = await this.documentService.createModelReference(this.consoleInputUri);
228
+ const model = docModel.instance.getMonacoModel();
229
+ model.updateOptions({ tabSize: 2 });
230
+ this._consoleModel = model;
231
+ monacoEditor.setModel(model);
232
+
233
+ setTimeout(() => {
234
+ this.layoutBody();
235
+ }, 0);
236
+
237
+ monacoEditor.onDidFocusEditorText(() => {
238
+ this.contextInDebugRepl.set(true);
239
+ this.updateInputDecoration();
240
+ });
241
+ monacoEditor.onDidBlurEditorText(() => {
242
+ this.contextInDebugRepl.set(false);
243
+ this.updateInputDecoration();
244
+ });
245
+ monacoEditor.onDidChangeModelContent(() => {
246
+ const lineNum = monacoEditor.getModel()!.getLineCount();
247
+ this.layoutBody(lineNum * 18);
248
+ });
249
+
250
+ this.manager.onDidChangeActiveDebugSession(() => {
251
+ this.registerCompletion();
252
+ this.setMode();
253
+ });
254
+
255
+ await this.updateInputDecoration();
256
+ }
257
+
258
+ private layoutBody(height?: number, width?: number): void {
259
+ if (!this.inputEditor) {
260
+ return;
261
+ }
262
+
263
+ const { monacoEditor } = this.inputEditor;
264
+
265
+ const h = Math.max(height || DEBUG_CONSOLE_DEFAULT_HEIGHT, monacoEditor.getContentHeight());
266
+
267
+ monacoEditor.layout({
268
+ width: width || this._consoleInputElement?.offsetWidth!,
269
+ height: h,
270
+ });
271
+
272
+ this._onInputHeightChange.fire(h);
273
+ }
274
+
275
+ private updateReadOnly(readOnly: boolean): void {
276
+ if (this.inputEditor) {
277
+ this.inputEditor.monacoEditor.updateOptions({ readOnly });
278
+ }
279
+ }
280
+
281
+ private async updateInputDecoration(): Promise<void> {
282
+ if (!this.inputEditor) {
283
+ return;
284
+ }
285
+
286
+ const decorations: IDecorationApplyOptions[] = [];
287
+ if (this._isReadonly && this.inputEditor.monacoEditor.hasTextFocus() && !this.inputEditor.monacoEditor.getValue()) {
288
+ const transparentForeground = transparent(editorForeground, 0.4)(await this.themeService.getCurrentTheme());
289
+ decorations.push({
290
+ range: {
291
+ startLineNumber: 0,
292
+ endLineNumber: 0,
293
+ startColumn: 0,
294
+ endColumn: 1,
295
+ },
296
+ renderOptions: {
297
+ after: {
298
+ contentText: localize('debug.console.input.placeholder'),
299
+ color: transparentForeground ? transparentForeground.toString() : undefined,
300
+ },
301
+ },
302
+ });
303
+ }
304
+
305
+ this.inputEditor.monacoEditor.setDecorationsByType('debug-console-input', DECORATION_KEY, decorations as any[]);
306
+ }
307
+
308
+ private setMode(): void {
309
+ if (!this.inputEditor) {
310
+ return;
311
+ }
312
+
313
+ const session = this.manager.currentSession;
314
+ if (!session) {
315
+ return;
316
+ }
317
+
318
+ const model = session.currentEditor();
319
+
320
+ if (model) {
321
+ this.inputEditor.monacoEditor.getModel()!.setMode(model.getModel()?.getLanguageId()!);
322
+ }
323
+ }
324
+
325
+ private registerDecorationType(): void {
326
+ const codeEditorService = this.overrideServicesRegistry.getRegisteredService(
327
+ ServiceNames.CODE_EDITOR_SERVICE,
328
+ ) as MonacoCodeService;
329
+ codeEditorService.registerDecorationType('console-input-decoration', DECORATION_KEY, {});
330
+ }
331
+
332
+ private registerCompletion(): void {
333
+ if (this._updateDisposable) {
334
+ this._updateDisposable.dispose();
335
+ this._updateDisposable = null;
336
+ }
337
+
338
+ const session = this.manager.currentSession;
339
+ if (!session) {
340
+ return;
341
+ }
342
+
343
+ const model = session.currentEditor();
344
+ if (!model) {
345
+ return;
346
+ }
347
+
348
+ this._updateDisposable = monaco.languages.registerCompletionItemProvider(model.getModel()?.getLanguageId()!, {
349
+ triggerCharacters: ['.'],
350
+ provideCompletionItems: async (model, position, ctx) => {
351
+ // 仅在支持自动补全查询的调试器中启用补全逻辑
352
+ if (!this.manager.currentSession?.capabilities.supportsCompletionsRequest) {
353
+ return;
354
+ }
355
+ if (model.uri.toString() !== this.consoleInputUri.toString()) {
356
+ return null;
357
+ }
358
+
359
+ const session = this.manager.currentSession;
360
+ const { triggerCharacter } = ctx;
361
+
362
+ /**
363
+ * 代码字符串处理
364
+ */
365
+ let value = model.getWordAtPosition(position);
366
+ if (value && session) {
367
+ const { word, startColumn, endColumn } = value;
368
+ const res = await session.sendRequest('completions', {
369
+ text: word,
370
+ column: endColumn,
371
+ frameId: session.currentFrame && session.currentFrame.raw.id,
372
+ });
373
+ return {
374
+ suggestions: res.body.targets.map((item) => ({
375
+ label: item.label,
376
+ insertText: item.text || item.label,
377
+ sortText: item.sortText,
378
+ kind: monaco.languages.CompletionItemKind[firstUpperCase(item.type || 'property')],
379
+ range: {
380
+ startLineNumber: position.lineNumber,
381
+ endLineNumber: position.lineNumber,
382
+ startColumn,
383
+ endColumn,
384
+ },
385
+ })),
386
+ } as monaco.languages.CompletionList;
387
+ }
388
+
389
+ /**
390
+ * 特殊字符处理
391
+ */
392
+ value = model.getWordAtPosition({
393
+ lineNumber: position.lineNumber,
394
+ column: position.column - 1,
395
+ });
396
+ if (value && session && triggerCharacter) {
397
+ const { word, endColumn } = value;
398
+
399
+ const res = await session.sendRequest('completions', {
400
+ text: word + triggerCharacter,
401
+ column: endColumn + 1,
402
+ frameId: session.currentFrame && session.currentFrame.raw.id,
403
+ });
404
+ return {
405
+ suggestions: res.body.targets.map((item) => ({
406
+ label: item.label,
407
+ insertText: item.text || item.label,
408
+ sortText: item.sortText,
409
+ kind: monaco.languages.CompletionItemKind[firstUpperCase(item.type || 'property')],
410
+ range: {
411
+ startLineNumber: position.lineNumber,
412
+ endLineNumber: position.lineNumber,
413
+ startColumn: endColumn + 1,
414
+ endColumn: endColumn + 1,
415
+ },
416
+ })),
417
+ } as monaco.languages.CompletionList;
418
+ }
419
+
420
+ return null;
421
+ },
422
+ });
423
+ }
424
+
425
+ disable() {
426
+ if (this._updateDisposable) {
427
+ this._updateDisposable.dispose();
428
+ this._updateDisposable = null;
429
+ }
430
+ this.inputEditor?.monacoEditor.setValue('');
431
+ this.inputEditor?.monacoEditor.setModel(null);
432
+ }
433
+ }