@opensumi/ide-editor 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.
Files changed (238) hide show
  1. package/lib/browser/breadcrumb/default.js.map +1 -1
  2. package/lib/browser/breadcrumb/document-symbol.js.map +1 -1
  3. package/lib/browser/breadcrumb/index.js.map +1 -1
  4. package/lib/browser/component.js.map +1 -1
  5. package/lib/browser/decoration-applier.js.map +1 -1
  6. package/lib/browser/diff/compare.js.map +1 -1
  7. package/lib/browser/diff/index.d.ts.map +1 -1
  8. package/lib/browser/diff/index.js +1 -1
  9. package/lib/browser/diff/index.js.map +1 -1
  10. package/lib/browser/doc-cache/empty-doc-cache.js.map +1 -1
  11. package/lib/browser/doc-cache/local-storage-cache.js.map +1 -1
  12. package/lib/browser/doc-model/editor-document-model-service.js +3 -3
  13. package/lib/browser/doc-model/editor-document-model-service.js.map +1 -1
  14. package/lib/browser/doc-model/editor-document-model.d.ts +8 -0
  15. package/lib/browser/doc-model/editor-document-model.d.ts.map +1 -1
  16. package/lib/browser/doc-model/editor-document-model.js +61 -11
  17. package/lib/browser/doc-model/editor-document-model.js.map +1 -1
  18. package/lib/browser/doc-model/editor-document-registry.js.map +1 -1
  19. package/lib/browser/doc-model/override.js.map +1 -1
  20. package/lib/browser/doc-model/save-task.js +1 -1
  21. package/lib/browser/doc-model/save-task.js.map +1 -1
  22. package/lib/browser/doc-model/saveParticipants.d.ts +7 -7
  23. package/lib/browser/doc-model/saveParticipants.d.ts.map +1 -1
  24. package/lib/browser/doc-model/saveParticipants.js +69 -38
  25. package/lib/browser/doc-model/saveParticipants.js.map +1 -1
  26. package/lib/browser/doc-model/types.d.ts +1 -1
  27. package/lib/browser/doc-model/types.d.ts.map +1 -1
  28. package/lib/browser/editor-collection.service.d.ts +8 -3
  29. package/lib/browser/editor-collection.service.d.ts.map +1 -1
  30. package/lib/browser/editor-collection.service.js +75 -66
  31. package/lib/browser/editor-collection.service.js.map +1 -1
  32. package/lib/browser/editor-opener.js.map +1 -1
  33. package/lib/browser/editor.contribution.d.ts.map +1 -1
  34. package/lib/browser/editor.contribution.js +31 -3
  35. package/lib/browser/editor.contribution.js.map +1 -1
  36. package/lib/browser/editor.decoration.service.d.ts +5 -6
  37. package/lib/browser/editor.decoration.service.d.ts.map +1 -1
  38. package/lib/browser/editor.decoration.service.js +9 -1
  39. package/lib/browser/editor.decoration.service.js.map +1 -1
  40. package/lib/browser/editor.override.js +2 -2
  41. package/lib/browser/editor.override.js.map +1 -1
  42. package/lib/browser/editor.status-bar.service.js.map +1 -1
  43. package/lib/browser/editor.view.d.ts.map +1 -1
  44. package/lib/browser/editor.view.js +20 -23
  45. package/lib/browser/editor.view.js.map +1 -1
  46. package/lib/browser/error.d.ts +1 -1
  47. package/lib/browser/error.d.ts.map +1 -1
  48. package/lib/browser/feature.js.map +1 -1
  49. package/lib/browser/format/format.service.js.map +1 -1
  50. package/lib/browser/format/formatterSelect.js.map +1 -1
  51. package/lib/browser/fs-resource/file-tree-set.js +6 -6
  52. package/lib/browser/fs-resource/file-tree-set.js.map +1 -1
  53. package/lib/browser/fs-resource/fs-editor-doc.js +1 -1
  54. package/lib/browser/fs-resource/fs-editor-doc.js.map +1 -1
  55. package/lib/browser/fs-resource/fs-resource.js.map +1 -1
  56. package/lib/browser/fs-resource/index.js.map +1 -1
  57. package/lib/browser/history/index.d.ts.map +1 -1
  58. package/lib/browser/history/index.js +2 -1
  59. package/lib/browser/history/index.js.map +1 -1
  60. package/lib/browser/index.d.ts.map +1 -1
  61. package/lib/browser/index.js +2 -0
  62. package/lib/browser/index.js.map +1 -1
  63. package/lib/browser/language/diagnostic-collection.d.ts +5 -5
  64. package/lib/browser/language/diagnostic-collection.d.ts.map +1 -1
  65. package/lib/browser/language/diagnostic-collection.js +1 -1
  66. package/lib/browser/language/diagnostic-collection.js.map +1 -1
  67. package/lib/browser/language/language-status.contribution.js.map +1 -1
  68. package/lib/browser/language/language-status.service.js.map +1 -1
  69. package/lib/browser/language/language.service.d.ts +4 -3
  70. package/lib/browser/language/language.service.d.ts.map +1 -1
  71. package/lib/browser/language/language.service.js +8 -2
  72. package/lib/browser/language/language.service.js.map +1 -1
  73. package/lib/browser/menu/editor.context.js +3 -3
  74. package/lib/browser/menu/editor.context.js.map +1 -1
  75. package/lib/browser/menu/editor.menu.d.ts +2 -2
  76. package/lib/browser/menu/editor.menu.d.ts.map +1 -1
  77. package/lib/browser/menu/editor.menu.js +6 -8
  78. package/lib/browser/menu/editor.menu.js.map +1 -1
  79. package/lib/browser/menu/open-type-menu.contribution.js +9 -9
  80. package/lib/browser/menu/open-type-menu.contribution.js.map +1 -1
  81. package/lib/browser/menu/title-context.menu.js.map +1 -1
  82. package/lib/browser/merge-editor/merge-editor.contribution.d.ts +8 -0
  83. package/lib/browser/merge-editor/merge-editor.contribution.d.ts.map +1 -0
  84. package/lib/browser/merge-editor/merge-editor.contribution.js +29 -0
  85. package/lib/browser/merge-editor/merge-editor.contribution.js.map +1 -0
  86. package/lib/browser/merge-editor/merge-editor.provider.d.ts +8 -0
  87. package/lib/browser/merge-editor/merge-editor.provider.d.ts.map +1 -0
  88. package/lib/browser/merge-editor/merge-editor.provider.js +44 -0
  89. package/lib/browser/merge-editor/merge-editor.provider.js.map +1 -0
  90. package/lib/browser/monaco-contrib/callHierarchy/callHierarchy.contribution.js.map +1 -1
  91. package/lib/browser/monaco-contrib/callHierarchy/callHierarchy.service.js +7 -7
  92. package/lib/browser/monaco-contrib/callHierarchy/callHierarchy.service.js.map +1 -1
  93. package/lib/browser/monaco-contrib/command/command.service.d.ts +1 -1
  94. package/lib/browser/monaco-contrib/command/command.service.d.ts.map +1 -1
  95. package/lib/browser/monaco-contrib/command/command.service.js.map +1 -1
  96. package/lib/browser/monaco-contrib/tokenizer/textmate-registry.js.map +1 -1
  97. package/lib/browser/monaco-contrib/tokenizer/textmate.service.d.ts +2 -1
  98. package/lib/browser/monaco-contrib/tokenizer/textmate.service.d.ts.map +1 -1
  99. package/lib/browser/monaco-contrib/tokenizer/textmate.service.js +5 -2
  100. package/lib/browser/monaco-contrib/tokenizer/textmate.service.js.map +1 -1
  101. package/lib/browser/monaco-contrib/typeHierarchy/typeHierarchy.contribution.js.map +1 -1
  102. package/lib/browser/monaco-contrib/typeHierarchy/typeHierarchy.service.js +7 -7
  103. package/lib/browser/monaco-contrib/typeHierarchy/typeHierarchy.service.js.map +1 -1
  104. package/lib/browser/navigation.module.less +1 -1
  105. package/lib/browser/navigation.view.d.ts.map +1 -1
  106. package/lib/browser/navigation.view.js +26 -15
  107. package/lib/browser/navigation.view.js.map +1 -1
  108. package/lib/browser/preference/contribution.js.map +1 -1
  109. package/lib/browser/preference/converter.d.ts +3 -3
  110. package/lib/browser/preference/converter.d.ts.map +1 -1
  111. package/lib/browser/preference/schema.d.ts +1 -1
  112. package/lib/browser/preference/schema.d.ts.map +1 -1
  113. package/lib/browser/preference/schema.js +8 -8
  114. package/lib/browser/preference/schema.js.map +1 -1
  115. package/lib/browser/quick-open/go-to-line.js.map +1 -1
  116. package/lib/browser/quick-open/workspace-symbol-quickopen.d.ts.map +1 -1
  117. package/lib/browser/quick-open/workspace-symbol-quickopen.js +2 -2
  118. package/lib/browser/quick-open/workspace-symbol-quickopen.js.map +1 -1
  119. package/lib/browser/resource.service.js.map +1 -1
  120. package/lib/browser/tab.view.d.ts +1 -1
  121. package/lib/browser/tab.view.d.ts.map +1 -1
  122. package/lib/browser/tab.view.js +2 -2
  123. package/lib/browser/tab.view.js.map +1 -1
  124. package/lib/browser/types.d.ts +5 -5
  125. package/lib/browser/types.d.ts.map +1 -1
  126. package/lib/browser/untitled-resource.js +1 -1
  127. package/lib/browser/untitled-resource.js.map +1 -1
  128. package/lib/browser/view/suggest-widget.js.map +1 -1
  129. package/lib/browser/workbench-editor.service.d.ts +17 -0
  130. package/lib/browser/workbench-editor.service.d.ts.map +1 -1
  131. package/lib/browser/workbench-editor.service.js +259 -176
  132. package/lib/browser/workbench-editor.service.js.map +1 -1
  133. package/lib/common/doc-cache.d.ts +2 -2
  134. package/lib/common/doc-cache.d.ts.map +1 -1
  135. package/lib/common/editor.d.ts +20 -6
  136. package/lib/common/editor.d.ts.map +1 -1
  137. package/lib/common/editor.js +12 -1
  138. package/lib/common/editor.js.map +1 -1
  139. package/lib/common/language.d.ts +18 -7
  140. package/lib/common/language.d.ts.map +1 -1
  141. package/lib/common/language.js +15 -7
  142. package/lib/common/language.js.map +1 -1
  143. package/lib/common/mocks/workbench-editor.service.js.map +1 -1
  144. package/lib/common/resource.d.ts +8 -2
  145. package/lib/common/resource.d.ts.map +1 -1
  146. package/lib/common/resource.js +1 -0
  147. package/lib/common/resource.js.map +1 -1
  148. package/package.json +17 -16
  149. package/src/browser/breadcrumb/default.ts +299 -0
  150. package/src/browser/breadcrumb/document-symbol.ts +187 -0
  151. package/src/browser/breadcrumb/index.ts +96 -0
  152. package/src/browser/component.ts +204 -0
  153. package/src/browser/decoration-applier.ts +256 -0
  154. package/src/browser/diff/compare.ts +99 -0
  155. package/src/browser/diff/index.ts +81 -0
  156. package/src/browser/doc-cache/empty-doc-cache.ts +26 -0
  157. package/src/browser/doc-cache/index.ts +2 -0
  158. package/src/browser/doc-cache/local-storage-cache.ts +67 -0
  159. package/src/browser/doc-model/editor-document-error.ts +10 -0
  160. package/src/browser/doc-model/editor-document-model-service.ts +346 -0
  161. package/src/browser/doc-model/editor-document-model.ts +690 -0
  162. package/src/browser/doc-model/editor-document-registry.ts +119 -0
  163. package/src/browser/doc-model/editor-is-fn.ts +9 -0
  164. package/src/browser/doc-model/main.ts +4 -0
  165. package/src/browser/doc-model/override.ts +49 -0
  166. package/src/browser/doc-model/save-task.ts +88 -0
  167. package/src/browser/doc-model/saveParticipants.ts +227 -0
  168. package/src/browser/doc-model/types.ts +350 -0
  169. package/src/browser/editor-collection.service.ts +790 -0
  170. package/src/browser/editor-opener.ts +44 -0
  171. package/src/browser/editor.contribution.ts +1438 -0
  172. package/src/browser/editor.decoration.service.ts +247 -0
  173. package/src/browser/editor.less +4 -0
  174. package/src/browser/editor.module.less +548 -0
  175. package/src/browser/editor.override.ts +133 -0
  176. package/src/browser/editor.status-bar.service.ts +116 -0
  177. package/src/browser/editor.view.tsx +623 -0
  178. package/src/browser/error.ts +21 -0
  179. package/src/browser/feature.ts +63 -0
  180. package/src/browser/format/format.service.ts +95 -0
  181. package/src/browser/format/formatterSelect.ts +82 -0
  182. package/src/browser/fs-resource/file-tree-set.ts +126 -0
  183. package/src/browser/fs-resource/fs-editor-doc.ts +213 -0
  184. package/src/browser/fs-resource/fs-resource.ts +247 -0
  185. package/src/browser/fs-resource/index.ts +27 -0
  186. package/src/browser/grid/grid.service.ts +288 -0
  187. package/src/browser/history/index.ts +228 -0
  188. package/src/browser/index.ts +236 -0
  189. package/src/browser/language/diagnostic-collection.ts +83 -0
  190. package/src/browser/language/language-status.contribution.ts +81 -0
  191. package/src/browser/language/language-status.service.ts +32 -0
  192. package/src/browser/language/language.service.ts +185 -0
  193. package/src/browser/menu/editor.context.ts +186 -0
  194. package/src/browser/menu/editor.menu.ts +45 -0
  195. package/src/browser/menu/open-type-menu.contribution.ts +90 -0
  196. package/src/browser/menu/title-context.menu.ts +54 -0
  197. package/src/browser/merge-editor/merge-editor.contribution.ts +25 -0
  198. package/src/browser/merge-editor/merge-editor.provider.ts +36 -0
  199. package/src/browser/monaco-contrib/callHierarchy/callHierarchy.contribution.ts +78 -0
  200. package/src/browser/monaco-contrib/callHierarchy/callHierarchy.service.ts +160 -0
  201. package/src/browser/monaco-contrib/command/command.service.ts +438 -0
  202. package/src/browser/monaco-contrib/index.ts +4 -0
  203. package/src/browser/monaco-contrib/tokenizer/textmate-registry.ts +107 -0
  204. package/src/browser/monaco-contrib/tokenizer/textmate-tokenizer.ts +104 -0
  205. package/src/browser/monaco-contrib/tokenizer/textmate.service.ts +925 -0
  206. package/src/browser/monaco-contrib/typeHierarchy/typeHierarchy.contribution.ts +78 -0
  207. package/src/browser/monaco-contrib/typeHierarchy/typeHierarchy.service.ts +154 -0
  208. package/src/browser/navigation.module.less +96 -0
  209. package/src/browser/navigation.view.tsx +254 -0
  210. package/src/browser/preference/contribution.ts +8 -0
  211. package/src/browser/preference/converter.ts +793 -0
  212. package/src/browser/preference/schema.ts +1896 -0
  213. package/src/browser/preference/util.ts +14 -0
  214. package/src/browser/quick-open/go-to-line.ts +164 -0
  215. package/src/browser/quick-open/workspace-symbol-quickopen.ts +276 -0
  216. package/src/browser/resource.service.ts +263 -0
  217. package/src/browser/tab.view.tsx +514 -0
  218. package/src/browser/types.ts +467 -0
  219. package/src/browser/untitled-resource.ts +223 -0
  220. package/src/browser/view/editor.react.tsx +82 -0
  221. package/src/browser/view/react-hook.tsx +7 -0
  222. package/src/browser/view/suggest-widget.ts +77 -0
  223. package/src/browser/view/topPadding.ts +18 -0
  224. package/src/browser/workbench-editor.service.ts +2291 -0
  225. package/src/common/doc-cache.ts +117 -0
  226. package/src/common/editor.ts +799 -0
  227. package/src/common/index.ts +6 -0
  228. package/src/common/language-status.ts +33 -0
  229. package/src/common/language.ts +206 -0
  230. package/src/common/mocks/workbench-editor.service.ts +52 -0
  231. package/src/common/resource.ts +147 -0
  232. package/src/common/utils.ts +10 -0
  233. package/src/index.ts +1 -0
  234. package/lib/browser/component/scroll/scroll.d.ts +0 -2
  235. package/lib/browser/component/scroll/scroll.d.ts.map +0 -1
  236. package/lib/browser/component/scroll/scroll.js +0 -5
  237. package/lib/browser/component/scroll/scroll.js.map +0 -1
  238. package/lib/browser/component/scroll/scroll.module.less +0 -86
@@ -0,0 +1,14 @@
1
+ import { PreferenceService, createPreferenceProxy } from '@opensumi/ide-core-browser';
2
+
3
+ import { editorPreferenceSchema, EditorPreferences } from './schema';
4
+
5
+ export function createEditorPreferenceProxy(
6
+ preferenceService: PreferenceService,
7
+ resourceUri: string,
8
+ overrideIdentifier: string,
9
+ ): EditorPreferences {
10
+ return createPreferenceProxy(preferenceService, editorPreferenceSchema, {
11
+ resourceUri,
12
+ overrideIdentifier,
13
+ });
14
+ }
@@ -0,0 +1,164 @@
1
+ import { Injectable, Autowired } from '@opensumi/di';
2
+ import {
3
+ CommandService,
4
+ formatLocalize,
5
+ localize,
6
+ QuickOpenHandler,
7
+ withNullAsUndefined,
8
+ } from '@opensumi/ide-core-browser';
9
+ import { QuickOpenItem, PrefixQuickOpenService, QuickOpenModel, Mode } from '@opensumi/ide-core-browser/lib/quick-open';
10
+ import { Event as MonacoEvent } from '@opensumi/ide-monaco/lib/browser/monaco-api/types';
11
+ import { IRange as IMonacoRange } from '@opensumi/monaco-editor-core/esm/vs/editor/common/core/range';
12
+ import { IEditor as IMonacoCodeEditor } from '@opensumi/monaco-editor-core/esm/vs/editor/common/editorCommon';
13
+ import { AbstractGotoLineQuickAccessProvider } from '@opensumi/monaco-editor-core/esm/vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess';
14
+ import * as monaco from '@opensumi/monaco-editor-core/esm/vs/editor/editor.api';
15
+
16
+ import { WorkbenchEditorService } from '../types';
17
+
18
+ class MonacoGoToLine extends AbstractGotoLineQuickAccessProvider {
19
+ activeTextEditorControl: IMonacoCodeEditor | undefined;
20
+ onDidActiveTextEditorControlChange: MonacoEvent<void>;
21
+ clearDecorations(editor: IMonacoCodeEditor) {
22
+ super.clearDecorations(editor);
23
+ }
24
+ preview(editor: IMonacoCodeEditor, range: IMonacoRange) {
25
+ editor.revealRangeInCenter(range, monaco.editor.ScrollType.Smooth);
26
+ this.addDecorations(editor, range);
27
+ }
28
+ goTo(editor: IMonacoCodeEditor, range: IMonacoRange, preserveFocus = true) {
29
+ this.gotoLocation(
30
+ { editor },
31
+ {
32
+ range,
33
+ preserveFocus,
34
+ // 该函数内部实现并没有用到这个属性
35
+ keyMods: {
36
+ alt: false,
37
+ ctrlCmd: false,
38
+ },
39
+ },
40
+ );
41
+ }
42
+ }
43
+
44
+ @Injectable()
45
+ export class GoToLineQuickOpenHandler implements QuickOpenHandler {
46
+ readonly prefix: string = ':';
47
+ readonly description: string = localize('quickopen.goToLine.desc');
48
+ protected items: QuickOpenItem[];
49
+
50
+ @Autowired(PrefixQuickOpenService)
51
+ protected readonly quickOpenService: PrefixQuickOpenService;
52
+
53
+ @Autowired(CommandService)
54
+ commandService: CommandService;
55
+
56
+ @Autowired(WorkbenchEditorService)
57
+ private readonly workbenchEditorService: WorkbenchEditorService;
58
+
59
+ quickAccess: MonacoGoToLine;
60
+ savedViewState?: monaco.editor.ICodeEditorViewState;
61
+
62
+ constructor() {
63
+ this.quickAccess = new MonacoGoToLine();
64
+ }
65
+
66
+ getFirstSelection() {
67
+ const editor = this.workbenchEditorService.currentEditor;
68
+ const selections = editor?.getSelections();
69
+ return selections?.[0];
70
+ }
71
+
72
+ getRange(line = 1, col = 1): monaco.IRange {
73
+ return {
74
+ startLineNumber: line,
75
+ endLineNumber: line,
76
+ startColumn: col,
77
+ endColumn: col,
78
+ };
79
+ }
80
+
81
+ init() {
82
+ // 保存打开时的状态
83
+ this.savedViewState = withNullAsUndefined(this.workbenchEditorService.currentEditor?.monacoEditor.saveViewState());
84
+ }
85
+
86
+ getModel(): QuickOpenModel {
87
+ const editor = this.workbenchEditorService.currentEditor;
88
+ const firstSelection = this.getFirstSelection();
89
+ if (!firstSelection || !editor) {
90
+ return {
91
+ onType: (lookFor: string, acceptor: (items: QuickOpenItem[]) => void) => {
92
+ acceptor([
93
+ new QuickOpenItem({
94
+ label: localize('quickopen.goToLine.notValid'),
95
+ run: () => false,
96
+ }),
97
+ ]);
98
+ },
99
+ };
100
+ }
101
+
102
+ const currentLine = firstSelection.positionLineNumber ?? 1;
103
+ const currentCol = firstSelection.positionColumn ?? 1;
104
+ const lineCount = editor.currentDocumentModel?.getMonacoModel()?.getLineCount() ?? 1;
105
+
106
+ return {
107
+ onType: (lookFor: string, acceptor: (items: QuickOpenItem[]) => void) => {
108
+ // https://github.com/microsoft/vscode/blob/1498d0f34053f854e75e1364adaca6f99e43de08/src/vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess.ts#L114
109
+ // Support different line-col formats
110
+ const numbers = lookFor
111
+ .split(/,|:|#|:|,/)
112
+ .map((part) => parseInt(part, 10))
113
+ .filter((part) => !isNaN(part));
114
+ const line = numbers[0];
115
+ const col = numbers[1];
116
+ if (line) {
117
+ let label = formatLocalize('quickopen.goToLine.lineInfo', line);
118
+ if (col) {
119
+ label += formatLocalize('quickopen.goToLine.colInfo', col);
120
+ }
121
+ const range = this.getRange(line, col);
122
+ acceptor([
123
+ new QuickOpenItem({
124
+ label,
125
+ run: (mode: Mode) => {
126
+ if (mode === Mode.PREVIEW) {
127
+ this.quickAccess.preview(editor.monacoEditor, range);
128
+ return false;
129
+ }
130
+ this.quickAccess.goTo(editor.monacoEditor, range, true);
131
+ return true;
132
+ },
133
+ }),
134
+ ]);
135
+ } else {
136
+ this.quickAccess.clearDecorations(editor.monacoEditor);
137
+ acceptor([
138
+ new QuickOpenItem({
139
+ label: formatLocalize('quickopen.goToLine.defaultMessage', currentLine, currentCol, lineCount),
140
+ run: () => false,
141
+ }),
142
+ ]);
143
+ }
144
+ },
145
+ };
146
+ }
147
+
148
+ getOptions() {
149
+ return {};
150
+ }
151
+
152
+ onClose(canceled) {
153
+ const editor = this.workbenchEditorService.currentEditor;
154
+ if (!editor) {
155
+ return;
156
+ }
157
+
158
+ editor.monacoEditor.focus();
159
+ this.quickAccess.clearDecorations(editor.monacoEditor);
160
+ if (canceled && this.savedViewState) {
161
+ editor.monacoEditor.restoreViewState(this.savedViewState);
162
+ }
163
+ }
164
+ }
@@ -0,0 +1,276 @@
1
+ import type { SymbolInformation, Range } from 'vscode-languageserver-types';
2
+
3
+ import { Injectable, Autowired } from '@opensumi/di';
4
+ import {
5
+ QuickOpenHandler,
6
+ QuickOpenModel,
7
+ CancellationTokenSource,
8
+ QuickOpenItem,
9
+ CancellationToken,
10
+ URI,
11
+ QuickOpenMode,
12
+ getSymbolIcon,
13
+ getIcon,
14
+ } from '@opensumi/ide-core-browser';
15
+ import { ILogger, localize, IReporterService, REPORT_NAME } from '@opensumi/ide-core-common';
16
+ import { QuickOpenBaseAction, QuickOpenActionProvider } from '@opensumi/ide-quick-open';
17
+ import { IWorkspaceService } from '@opensumi/ide-workspace';
18
+ import { SymbolKind as SymbolKindEnum } from '@opensumi/monaco-editor-core/esm/vs/editor/common/languages';
19
+
20
+ import {
21
+ WorkspaceSymbolProvider,
22
+ ILanguageService,
23
+ WorkspaceSymbolParams,
24
+ WorkbenchEditorService,
25
+ EditorGroupSplitAction,
26
+ } from '../../common';
27
+
28
+ @Injectable()
29
+ class WorkspaceSymbolOpenSideAction extends QuickOpenBaseAction {
30
+ constructor() {
31
+ super({
32
+ id: 'workspace-symbol:splitToRight',
33
+ tooltip: localize('quickOpen.openSide'),
34
+ class: getIcon('embed'),
35
+ });
36
+ }
37
+
38
+ async run(item: SymbolInformationQuickOpenItem): Promise<void> {
39
+ await item.openSide();
40
+ }
41
+ }
42
+
43
+ @Injectable()
44
+ class WorkspaceSymbolActionProvider implements QuickOpenActionProvider {
45
+ @Autowired()
46
+ workspaceSymbolOpenSideActionOpen: WorkspaceSymbolOpenSideAction;
47
+
48
+ hasActions(): boolean {
49
+ return true;
50
+ }
51
+
52
+ getActions() {
53
+ return [this.workspaceSymbolOpenSideActionOpen];
54
+ }
55
+ }
56
+
57
+ @Injectable()
58
+ export class WorkspaceSymbolQuickOpenHandler implements QuickOpenHandler {
59
+ @Autowired(ILanguageService)
60
+ private readonly languageService: ILanguageService;
61
+
62
+ @Autowired(IWorkspaceService)
63
+ private readonly workspaceService: IWorkspaceService;
64
+
65
+ @Autowired(ILogger)
66
+ private readonly logger: ILogger;
67
+
68
+ @Autowired(WorkbenchEditorService)
69
+ private readonly workbenchEditorService: WorkbenchEditorService;
70
+
71
+ @Autowired()
72
+ private readonly workspaceSymbolActionProvider: WorkspaceSymbolActionProvider;
73
+
74
+ @Autowired(IReporterService)
75
+ reporterService: IReporterService;
76
+
77
+ prefix = '#';
78
+
79
+ get description() {
80
+ return localize('editor.workspaceSymbol.description');
81
+ }
82
+
83
+ private cancellationSource = new CancellationTokenSource();
84
+
85
+ getModel(): QuickOpenModel {
86
+ return {
87
+ onType: (
88
+ lookFor: string,
89
+ acceptor: (items: QuickOpenItem[], actionProvider?: QuickOpenActionProvider | undefined) => void,
90
+ ) => {
91
+ if (lookFor === '') {
92
+ acceptor([
93
+ new QuickOpenItem({
94
+ label: localize('editor.workspaceSymbol.search'),
95
+ run: () => false,
96
+ }),
97
+ ]);
98
+ return;
99
+ }
100
+
101
+ if (lookFor === '#') {
102
+ return void acceptor([
103
+ new QuickOpenItem({
104
+ label: localize('editor.workspaceSymbolClass.search'),
105
+ run: () => false,
106
+ }),
107
+ ]);
108
+ }
109
+
110
+ if (this.languageService.workspaceSymbolProviders.length === 0) {
111
+ acceptor([
112
+ new QuickOpenItem({
113
+ label: localize('editor.workspaceSymbol.notfound'),
114
+ run: () => false,
115
+ }),
116
+ ]);
117
+ return;
118
+ }
119
+
120
+ const isSearchClass = lookFor[0] === '#';
121
+
122
+ const items: QuickOpenItem[] = [];
123
+ this.cancellationSource.cancel();
124
+ const newCancellationSource = new CancellationTokenSource();
125
+ this.cancellationSource = newCancellationSource;
126
+
127
+ const param: WorkspaceSymbolParams = {
128
+ query: isSearchClass ? lookFor.slice(1) : lookFor,
129
+ };
130
+ const timer = this.reporterService.time(REPORT_NAME.QUICK_OPEN_MEASURE);
131
+ Promise.all(
132
+ this.languageService.workspaceSymbolProviders.map(async (provider) => {
133
+ let symbols = await provider.provideWorkspaceSymbols(param, newCancellationSource.token);
134
+ if (isSearchClass) {
135
+ symbols = symbols?.filter((symbol) => symbol.kind === SymbolKindEnum.Class);
136
+ }
137
+ if (symbols && symbols.length && !newCancellationSource.token.isCancellationRequested) {
138
+ const quickOpenItems = await Promise.all(
139
+ symbols.map(async (symbol) => {
140
+ const relative = await this.workspaceService.asRelativePath(new URI(symbol.location.uri).parent);
141
+ return new SymbolInformationQuickOpenItem(
142
+ symbol,
143
+ provider,
144
+ this.workbenchEditorService,
145
+ newCancellationSource.token,
146
+ relative?.path || '',
147
+ );
148
+ }),
149
+ );
150
+ items.push(...quickOpenItems);
151
+ acceptor(items, this.workspaceSymbolActionProvider);
152
+ }
153
+ return symbols;
154
+ }),
155
+ )
156
+ .catch((e) => {
157
+ this.logger.log(e);
158
+ })
159
+ .finally(() => {
160
+ if (!newCancellationSource.token.isCancellationRequested) {
161
+ // 无数据清空历史数据
162
+ if (!items.length) {
163
+ acceptor([]);
164
+ }
165
+ timer.timeEnd(isSearchClass ? 'class' : 'symbol', {
166
+ lookFor,
167
+ stat: {
168
+ symbol: items.length,
169
+ },
170
+ });
171
+ }
172
+ });
173
+ },
174
+ };
175
+ }
176
+
177
+ getOptions() {
178
+ return {
179
+ fuzzyMatchLabel: {
180
+ enableSeparateSubstringMatching: true,
181
+ },
182
+ showItemsWithoutHighlight: true,
183
+ // 不搜索文件路径
184
+ fuzzyMatchDescription: false,
185
+ getPlaceholderItem: (lookFor: string, originLookFor: string) =>
186
+ new QuickOpenItem({
187
+ label: localize(
188
+ originLookFor.startsWith('##') ? 'editor.workspaceSymbolClass.notfound' : 'editor.workspaceSymbol.notfound',
189
+ ),
190
+ run: () => false,
191
+ }),
192
+ };
193
+ }
194
+
195
+ onClose() {
196
+ this.cancellationSource.cancel();
197
+ }
198
+
199
+ onToggle() {
200
+ this.cancellationSource.cancel();
201
+ }
202
+ }
203
+
204
+ export class SymbolInformationQuickOpenItem extends QuickOpenItem {
205
+ constructor(
206
+ protected readonly symbol: SymbolInformation,
207
+ private readonly provider: WorkspaceSymbolProvider,
208
+ private readonly workbenchEditorService: WorkbenchEditorService,
209
+ private readonly token: CancellationToken,
210
+ private relativePath: string,
211
+ ) {
212
+ super({});
213
+ }
214
+
215
+ getLabel(): string {
216
+ return this.symbol.name;
217
+ }
218
+
219
+ getUri() {
220
+ return new URI(this.symbol.location.uri);
221
+ }
222
+
223
+ getIconClass() {
224
+ return getSymbolIcon(this.symbol.kind);
225
+ }
226
+
227
+ getDescription() {
228
+ const containerName = this.symbol.containerName;
229
+ return `${containerName ? `${containerName} · ` : ''}${decodeURIComponent(this.relativePath)}`;
230
+ }
231
+
232
+ private fromRange(range: Range) {
233
+ if (!range) {
234
+ return undefined;
235
+ }
236
+ const { start, end } = range;
237
+ return {
238
+ startLineNumber: start.line + 1,
239
+ startColumn: start.character + 1,
240
+ endLineNumber: end.line + 1,
241
+ endColumn: end.character + 1,
242
+ };
243
+ }
244
+
245
+ private open(uri: URI, range: Range) {
246
+ this.workbenchEditorService.open(uri, {
247
+ range: this.fromRange(range),
248
+ });
249
+ }
250
+
251
+ run(mode: QuickOpenMode): boolean {
252
+ const uri = this.getUri();
253
+ if (mode === QuickOpenMode.OPEN) {
254
+ this.provider.resolveWorkspaceSymbol(this.symbol, this.token).then((resolvedSymbol) => {
255
+ if (resolvedSymbol) {
256
+ this.open(uri, resolvedSymbol.location.range);
257
+ } else {
258
+ this.open(uri, this.symbol.location.range);
259
+ }
260
+ });
261
+ }
262
+ return true;
263
+ }
264
+
265
+ openSide() {
266
+ const uri = this.getUri();
267
+ return this.provider.resolveWorkspaceSymbol(this.symbol, this.token).then((resolvedSymbol) => {
268
+ this.workbenchEditorService.open(uri, {
269
+ preview: false,
270
+ split: EditorGroupSplitAction.Right,
271
+ range: this.fromRange(resolvedSymbol ? resolvedSymbol.location.range : this.symbol.location.range),
272
+ focus: true,
273
+ });
274
+ });
275
+ }
276
+ }