@adecore/editor-react 0.22.1 → 0.23.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. package/dist/CallHierarchyPanel.d.ts +6 -0
  2. package/dist/CallHierarchyPanel.js +92 -0
  3. package/dist/CompletionPopup.js +11 -3
  4. package/dist/DiffView.d.ts +22 -0
  5. package/dist/DiffView.js +203 -0
  6. package/dist/EditorContextMenu.js +1 -0
  7. package/dist/EditorView.js +18 -1
  8. package/dist/FindReplace.d.ts +1 -1
  9. package/dist/FindReplace.js +41 -11
  10. package/dist/HoverCard.js +2 -2
  11. package/dist/LanguagePopups.js +4 -1
  12. package/dist/Markdown.d.ts +2 -1
  13. package/dist/Markdown.js +8 -4
  14. package/dist/PanelResizeHandle.d.ts +8 -0
  15. package/dist/PanelResizeHandle.js +71 -0
  16. package/dist/PeekPanel.d.ts +3 -0
  17. package/dist/PeekPanel.js +7 -4
  18. package/dist/PickPopup.js +15 -2
  19. package/dist/RenameCard.js +10 -5
  20. package/dist/RenderedDocs.d.ts +9 -0
  21. package/dist/RenderedDocs.js +84 -0
  22. package/dist/SplitDiffView.d.ts +9 -0
  23. package/dist/SplitDiffView.js +276 -0
  24. package/dist/SymbolPicker.d.ts +3 -0
  25. package/dist/SymbolPicker.js +4 -3
  26. package/dist/call-hierarchy-model.d.ts +52 -0
  27. package/dist/call-hierarchy-model.js +93 -0
  28. package/dist/call-hierarchy.d.ts +42 -0
  29. package/dist/call-hierarchy.js +398 -0
  30. package/dist/code-actions-model.d.ts +2 -0
  31. package/dist/code-actions-model.js +12 -10
  32. package/dist/code-actions.js +3 -1
  33. package/dist/completion-model.d.ts +14 -4
  34. package/dist/completion-model.js +40 -33
  35. package/dist/completion.d.ts +4 -0
  36. package/dist/completion.js +257 -42
  37. package/dist/diagnostics.js +8 -6
  38. package/dist/diff-expansion.d.ts +9 -0
  39. package/dist/diff-expansion.js +41 -0
  40. package/dist/diff-overlays.d.ts +15 -0
  41. package/dist/diff-overlays.js +28 -0
  42. package/dist/diff-syntax.d.ts +16 -0
  43. package/dist/diff-syntax.js +49 -0
  44. package/dist/diff-wordmarks.d.ts +5 -0
  45. package/dist/diff-wordmarks.js +26 -0
  46. package/dist/doc-comment-model.d.ts +23 -0
  47. package/dist/doc-comment-model.js +291 -0
  48. package/dist/editor-language.d.ts +13 -1
  49. package/dist/editor-language.js +15 -5
  50. package/dist/editor-react.css +79 -0
  51. package/dist/format-on-type.d.ts +14 -0
  52. package/dist/format-on-type.js +96 -0
  53. package/dist/host-types.d.ts +19 -0
  54. package/dist/hover.d.ts +4 -0
  55. package/dist/hover.js +15 -2
  56. package/dist/index.d.ts +19 -5
  57. package/dist/index.js +9 -1
  58. package/dist/inlay-hints.d.ts +47 -2
  59. package/dist/inlay-hints.js +353 -16
  60. package/dist/language-ids.js +4 -2
  61. package/dist/locales/en.json +117 -3
  62. package/dist/locales/nl.json +117 -3
  63. package/dist/models.d.ts +6 -2
  64. package/dist/models.js +5 -1
  65. package/dist/panel-size.d.ts +6 -0
  66. package/dist/panel-size.js +25 -0
  67. package/dist/patch-decorations.d.ts +27 -0
  68. package/dist/patch-decorations.js +182 -0
  69. package/dist/patch-layout.d.ts +40 -0
  70. package/dist/patch-layout.js +304 -0
  71. package/dist/peek.d.ts +3 -1
  72. package/dist/peek.js +6 -1
  73. package/dist/pick.d.ts +1 -0
  74. package/dist/pick.js +11 -1
  75. package/dist/popups.d.ts +17 -0
  76. package/dist/popups.js +1 -0
  77. package/dist/project-language.d.ts +12 -0
  78. package/dist/project-language.js +52 -2
  79. package/dist/refresher.d.ts +1 -0
  80. package/dist/refresher.js +5 -0
  81. package/dist/rename-model.d.ts +1 -1
  82. package/dist/rename-model.js +3 -7
  83. package/dist/rename.js +5 -8
  84. package/dist/rendered-docs.d.ts +64 -0
  85. package/dist/rendered-docs.js +374 -0
  86. package/dist/row-host.d.ts +2 -0
  87. package/dist/row-host.js +11 -3
  88. package/dist/semantic-delta.d.ts +2 -0
  89. package/dist/semantic-delta.js +27 -0
  90. package/dist/semantic-model.js +16 -0
  91. package/dist/semantic-tokens.d.ts +26 -1
  92. package/dist/semantic-tokens.js +174 -14
  93. package/dist/shortcut-keys.d.ts +2 -0
  94. package/dist/shortcut-keys.js +6 -2
  95. package/dist/signature.js +1 -1
  96. package/dist/snippet-field-transforms.d.ts +30 -0
  97. package/dist/snippet-field-transforms.js +116 -0
  98. package/dist/snippet-indent.d.ts +2 -0
  99. package/dist/snippet-indent.js +49 -0
  100. package/dist/snippet-range-order.d.ts +3 -0
  101. package/dist/snippet-range-order.js +19 -0
  102. package/dist/snippet-session.d.ts +42 -6
  103. package/dist/snippet-session.js +650 -53
  104. package/dist/snippet-transform-client.d.ts +19 -0
  105. package/dist/snippet-transform-client.js +66 -0
  106. package/dist/snippet-transform-format.d.ts +15 -0
  107. package/dist/snippet-transform-format.js +302 -0
  108. package/dist/snippet-transform-protocol.d.ts +45 -0
  109. package/dist/snippet-transform-protocol.js +8 -0
  110. package/dist/snippet-transform-queue.d.ts +32 -0
  111. package/dist/snippet-transform-queue.js +173 -0
  112. package/dist/snippet-transform-worker.d.ts +10 -0
  113. package/dist/snippet-transform-worker.js +41 -0
  114. package/dist/snippet-variable-names.d.ts +1 -0
  115. package/dist/snippet-variable-names.js +36 -0
  116. package/dist/snippet-variables.d.ts +7 -0
  117. package/dist/snippet-variables.js +66 -0
  118. package/dist/snippet.d.ts +30 -3
  119. package/dist/snippet.js +402 -87
  120. package/dist/split-alignment.d.ts +6 -0
  121. package/dist/split-alignment.js +38 -0
  122. package/dist/split-scroll.d.ts +14 -0
  123. package/dist/split-scroll.js +45 -0
  124. package/dist/symbols.d.ts +2 -1
  125. package/dist/symbols.js +39 -7
  126. package/dist/testing.d.ts +5 -1
  127. package/dist/testing.js +12 -0
  128. package/dist/timers.d.ts +1 -0
  129. package/dist/timers.js +4 -0
  130. package/dist/use-panel-body.d.ts +6 -0
  131. package/dist/use-panel-body.js +13 -0
  132. package/dist/workspace-edit.d.ts +25 -3
  133. package/dist/workspace-edit.js +282 -143
  134. package/package.json +10 -5
  135. package/src/CallHierarchyPanel.tsx +244 -0
  136. package/src/CompletionPopup.tsx +12 -1
  137. package/src/DiffView.tsx +262 -0
  138. package/src/EditorContextMenu.tsx +1 -0
  139. package/src/EditorView.tsx +21 -2
  140. package/src/FindReplace.tsx +51 -13
  141. package/src/HoverCard.tsx +23 -21
  142. package/src/LanguagePopups.tsx +5 -0
  143. package/src/Markdown.tsx +10 -3
  144. package/src/PanelResizeHandle.tsx +104 -0
  145. package/src/PeekPanel.tsx +11 -6
  146. package/src/PickPopup.tsx +18 -2
  147. package/src/RenameCard.tsx +18 -0
  148. package/src/RenderedDocs.tsx +155 -0
  149. package/src/SplitDiffView.tsx +337 -0
  150. package/src/SymbolPicker.tsx +4 -3
  151. package/src/call-hierarchy-model.ts +151 -0
  152. package/src/call-hierarchy.ts +440 -0
  153. package/src/code-actions-model.ts +17 -11
  154. package/src/code-actions.ts +3 -1
  155. package/src/completion-model.ts +61 -35
  156. package/src/completion.ts +302 -42
  157. package/src/diagnostics.ts +8 -6
  158. package/src/diff-expansion.ts +49 -0
  159. package/src/diff-overlays.tsx +69 -0
  160. package/src/diff-syntax.ts +67 -0
  161. package/src/diff-wordmarks.ts +31 -0
  162. package/src/doc-comment-model.ts +336 -0
  163. package/src/editor-language.ts +22 -6
  164. package/src/editor-react.css +79 -0
  165. package/src/format-on-type.ts +111 -0
  166. package/src/host-types.ts +23 -0
  167. package/src/hover.ts +18 -3
  168. package/src/index.ts +27 -4
  169. package/src/inlay-hints.ts +394 -18
  170. package/src/language-ids.ts +4 -2
  171. package/src/locales/en.json +117 -3
  172. package/src/locales/nl.json +117 -3
  173. package/src/models.ts +40 -1
  174. package/src/panel-size.ts +28 -0
  175. package/src/patch-decorations.ts +224 -0
  176. package/src/patch-layout.ts +388 -0
  177. package/src/peek.ts +6 -1
  178. package/src/pick.ts +12 -1
  179. package/src/popups.ts +24 -0
  180. package/src/project-language.ts +63 -2
  181. package/src/refresher.ts +6 -0
  182. package/src/rename-model.ts +4 -8
  183. package/src/rename.ts +5 -8
  184. package/src/rendered-docs.ts +430 -0
  185. package/src/row-host.ts +12 -3
  186. package/src/semantic-delta.ts +29 -0
  187. package/src/semantic-model.ts +17 -0
  188. package/src/semantic-tokens.ts +202 -19
  189. package/src/shortcut-keys.ts +6 -2
  190. package/src/signature.ts +1 -1
  191. package/src/snippet-field-transforms.ts +144 -0
  192. package/src/snippet-indent.ts +53 -0
  193. package/src/snippet-range-order.ts +19 -0
  194. package/src/snippet-session.ts +797 -56
  195. package/src/snippet-transform-client.ts +84 -0
  196. package/src/snippet-transform-format.ts +325 -0
  197. package/src/snippet-transform-protocol.ts +24 -0
  198. package/src/snippet-transform-queue.ts +199 -0
  199. package/src/snippet-transform-worker.ts +58 -0
  200. package/src/snippet-variable-names.ts +36 -0
  201. package/src/snippet-variables.ts +74 -0
  202. package/src/snippet.ts +452 -89
  203. package/src/split-alignment.ts +45 -0
  204. package/src/split-scroll.ts +54 -0
  205. package/src/symbols.ts +43 -7
  206. package/src/testing.ts +25 -0
  207. package/src/timers.ts +5 -0
  208. package/src/use-panel-body.ts +17 -0
  209. package/src/workspace-edit.ts +347 -169
@@ -0,0 +1,111 @@
1
+ import type { TextEdit } from '@adecore/lsp';
2
+ import type { EditorTextChange } from '@adecore/editor';
3
+ import { comparePositions } from './diagnostics-model.ts';
4
+ import type { EditorLanguage } from './editor-language.ts';
5
+
6
+ const METHOD = 'textDocument/onTypeFormatting';
7
+ /* A line break with the indentation the editor put after it, which is how Enter reaches the server. */
8
+ const LINE_BREAK = /^\r?\n[ \t]*(\r?\n[ \t]*)?$/;
9
+ /* A closer with the whitespace the editor replaced in front of it when it moved the closer back to its opener's indentation. */
10
+ const DEDENTED = /^[ \t]+(\S)$/u;
11
+
12
+ /* The overlapping edits of a server answer have no single meaning, so an answer that has them is not applied. */
13
+ function overlaps(edits: readonly TextEdit[]): boolean {
14
+ const ordered = [...edits].sort((left, right) => comparePositions(left.range.start, right.range.start));
15
+ return ordered.some((edit, index) => index > 0 && comparePositions(ordered[index - 1]!.range.end, edit.range.start) > 0);
16
+ }
17
+
18
+ /*
19
+ * Formatting while typing: after a person types one of the characters the server named in
20
+ * `firstTriggerCharacter` and `moreTriggerCharacter`, the server is asked what to change around the caret, and its
21
+ * edits are applied.
22
+ *
23
+ * Only typing counts: one change that is the trigger character alone, the closer the editor moved back to its
24
+ * opener's indentation, or a line break with its indentation for `\n`, which the editor reports as typed though
25
+ * Enter runs as a command. A character the editor types over an existing closer changes no text and asks nothing. A paste, undo, a completion or an external change does not ask, and neither does a
26
+ * second caret, a read-only editor or a snippet session, whose tab stops an edit could move. An answer is applied
27
+ * only while the text is exactly what it was asked about, and the caret where it was.
28
+ *
29
+ * The edits join the undo step of the typed character, so one undo takes both back. On by default where the server offers it; `configure(false)`
30
+ * turns it off for a host that has a setting for it.
31
+ */
32
+ export class FormatOnTypeFeature {
33
+ private readonly language: EditorLanguage;
34
+ private enabled = true;
35
+ /* Raised by every change of the text, so an answer for an older text is told from the one for the text that is. */
36
+ private revision = 0;
37
+ private controller = new AbortController();
38
+
39
+ constructor(language: EditorLanguage) {
40
+ this.language = language;
41
+ const off = language.editor.onTextChange((change) => this.typed(change));
42
+ language.onDispose(() => {
43
+ off();
44
+ this.controller.abort();
45
+ });
46
+ }
47
+
48
+ get isEnabled(): boolean {
49
+ return this.enabled;
50
+ }
51
+
52
+ /* Whether the server of this document formats on type and the service can ask it. */
53
+ get supported(): boolean {
54
+ const { project, uri } = this.language;
55
+ return project.service.onTypeFormatting !== undefined && project.service.supports(METHOD, uri);
56
+ }
57
+
58
+ configure(enabled: boolean): void {
59
+ this.enabled = enabled;
60
+ if (!enabled) {
61
+ this.controller.abort();
62
+ }
63
+ }
64
+
65
+ /* The characters that ask the server, the first one and the more. */
66
+ triggerCharacters(): readonly string[] {
67
+ const options = this.language.project.service.providerOptions(METHOD, this.language.uri);
68
+ return options === undefined
69
+ ? []
70
+ : [...(options.firstTriggerCharacter === undefined ? [] : [options.firstTriggerCharacter]), ...(options.moreTriggerCharacter ?? [])];
71
+ }
72
+
73
+ private typed(change: EditorTextChange): void {
74
+ const revision = ++this.revision;
75
+ this.controller.abort();
76
+ if (!this.enabled || (change.source !== 'input' && change.typed !== true) || change.changes.length !== 1 || !this.supported) {
77
+ return;
78
+ }
79
+ const { editor, snippets } = this.language;
80
+ const { text } = change.changes[0]!;
81
+ const typed = LINE_BREAK.test(text) ? '\n' : Array.from(text).length === 1 ? text : (DEDENTED.exec(text)?.[1] ?? null);
82
+ if (typed === null || !this.triggerCharacters().includes(typed)) {
83
+ return;
84
+ }
85
+ if (snippets.isActive || editor.isReadOnly?.() === true || editor.getSelections().length !== 1) {
86
+ return;
87
+ }
88
+ this.controller = new AbortController();
89
+ void this.ask(revision, typed, editor.getCaret(), this.controller.signal);
90
+ }
91
+
92
+ private async ask(revision: number, typed: string, caret: { line: number; character: number }, signal: AbortSignal): Promise<void> {
93
+ const { editor, project, uri, document } = this.language;
94
+ try {
95
+ // The change of the typed character reaches the server before this question does.
96
+ await document.ready;
97
+ const edits = await project.service.onTypeFormatting!(uri, caret, typed, { ...editor.getIndentation() }, { signal });
98
+ const here = editor.getCaret();
99
+ const stale = revision !== this.revision || this.language.isDisposed || comparePositions(here, caret) !== 0;
100
+ if (stale || edits === null || edits.length === 0 || overlaps(edits)) {
101
+ return;
102
+ }
103
+ editor.applyEdits(
104
+ edits.map((edit) => ({ range: edit.range, text: edit.newText })),
105
+ { mergeUndo: true }
106
+ );
107
+ } catch {
108
+ // A refusal or a failing server is not worth a notice per keystroke; the next trigger character asks again.
109
+ }
110
+ }
111
+ }
package/src/host-types.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import type { WorkerRequestPort } from '@adecore/editor/worker-client';
2
+ import type { EditorPosition, EditorRange } from '@adecore/editor';
1
3
  import type { i18n } from 'i18next';
2
4
  import type { Keymap } from '@adecore/editor/keymap';
3
5
  import type { ProjectFiles } from './workspace-edit.ts';
@@ -37,16 +39,37 @@ export interface RenameSuggestionsRequest {
37
39
  uses: readonly string[];
38
40
  }
39
41
 
42
+ export interface SnippetVariableContext {
43
+ readonly uri: string;
44
+ readonly languageId: string;
45
+ readonly position: EditorPosition;
46
+ readonly selection: EditorRange;
47
+ readonly selectedText: string;
48
+ readonly currentLine: string;
49
+ readonly currentWord: string;
50
+ readonly cursorIndex: number;
51
+ readonly cursorCount: number;
52
+ readonly folder?: string;
53
+ readonly path?: string;
54
+ }
55
+
40
56
  export interface LanguageHost {
57
+ readonly snippetTransformWorker?: () => WorkerRequestPort;
41
58
  /* The instance the app hands `UIProvider`, which the features read their words from too; the default instance without one. */
42
59
  readonly i18n?: i18n;
43
60
  readonly folder?: string;
44
61
  readonly files?: ProjectFiles;
45
62
  readonly apple?: boolean;
46
63
  readonly keymap?: Keymap;
64
+ /* The height in pixels of the list-and-preview area of the peek and the call hierarchy, so a person's drag outlives the panel; 180 without one. */
65
+ readonly panelBodyHeight?: number;
66
+ /* A person finished resizing a peek or call hierarchy panel; the height is already within what the editor allows. */
67
+ onPanelResize?(height: number): void;
47
68
  openPlace?(place: Place): void;
48
69
  pathOfUri?(uri: string): string | null;
49
70
  serverNames?(uri: string): readonly string[];
50
71
  notify?(notification: EditorNotification): void;
72
+ /* Synchronous overrides; undefined delegates to built-ins or an editable unknown-variable placeholder. */
73
+ resolveSnippetVariable?(name: string, context: SnippetVariableContext): string | undefined;
51
74
  suggestNames?(request: RenameSuggestionsRequest, signal: AbortSignal): Promise<readonly string[]>;
52
75
  }
package/src/hover.ts CHANGED
@@ -1,14 +1,14 @@
1
1
  import type { EditorHover, EditorPosition, EditorRange } from '@adecore/editor';
2
2
  import type { EditorLanguage } from './editor-language.ts';
3
3
  import { rangeHolds, type Problem } from './diagnostics-model.ts';
4
- import { hoverTextOf, isEmptyHover, locationsOf } from './hover-content.ts';
4
+ import { hoverTextOf, isEmptyHover, locationsOf, type HoverText } from './hover-content.ts';
5
5
  import { lineTextOf } from './line-text.ts';
6
6
  import { wordRangeAt } from './rename-model.ts';
7
7
  import type { HoverInfo } from './popups.ts';
8
8
  import { isShortcut } from './shortcut-keys.ts';
9
9
  import { realTimers, type Timers } from './timers.ts';
10
10
 
11
- const SHOW_DELAY_MS = 300;
11
+ export const SHOW_DELAY_MS = 300;
12
12
  const HIDE_DELAY_MS = 250;
13
13
  /* How long a card has to stay up before the references of its symbol are counted, which can be a request over the whole project. */
14
14
  const COUNT_DELAY_MS = 500;
@@ -67,7 +67,7 @@ export class HoverFeature {
67
67
  this.quickInfo();
68
68
  return true;
69
69
  }
70
- if (event.key === 'Escape' && this.language.popups.getState().hover !== null) {
70
+ if (event.key === 'Escape' && this.language.popups.getState().hover !== null && this.language.popups.getState().callHierarchy == null) {
71
71
  this.hide();
72
72
  return true;
73
73
  }
@@ -125,6 +125,17 @@ export class HoverFeature {
125
125
  this.present(range.start, [], null, range);
126
126
  }
127
127
 
128
+ /* A card of text another feature brings, such as the tooltip of an inlay hint, which goes the way any hover card does. */
129
+ showText(position: EditorPosition, text: HoverText): void {
130
+ this.hide();
131
+ this.present(position, [], { text, definition: null, word: '', references: null, plain: true }, null);
132
+ }
133
+
134
+ /* The pointer left what a card was opened for: it closes unless the pointer reaches the card in time. */
135
+ release(): void {
136
+ this.scheduleHide();
137
+ }
138
+
128
139
  hide(): void {
129
140
  this.pinned = false;
130
141
  this.held = false;
@@ -214,6 +225,10 @@ export class HoverFeature {
214
225
  }
215
226
  if (problems.length === 0 && info === null) {
216
227
  this.hide();
228
+ if (pinned && (await this.language.inlayHints.showTooltipAt(position))) {
229
+ this.pinned = true;
230
+ return;
231
+ }
217
232
  if (pinned) {
218
233
  this.language.project.host.notify?.({ id: TOAST_ID, kind: 'error', title: this.language.project.i18n.t('editor:language.hover.none') });
219
234
  }
package/src/index.ts CHANGED
@@ -1,7 +1,16 @@
1
- export { EditorLanguage } from './editor-language.ts';
2
- export { ProjectLanguage } from './project-language.ts';
1
+ export { EditorLanguage, type EditorLanguageOptions } from './editor-language.ts';
2
+ export { DEFAULT_RANGE_LINES, DEFAULT_RANGE_CHARACTERS, type SemanticTokensOptions } from './semantic-tokens.ts';
3
+ export { ProjectLanguage, type FileOperationTarget } from './project-language.ts';
3
4
  export type { LanguageDocumentHandle } from './project-language.ts';
4
- export type { LanguageHost, DiskText, GitBlameCommit, GitBlameResult, EditorNotification, RenameSuggestionsRequest } from './host-types.ts';
5
+ export type {
6
+ SnippetVariableContext,
7
+ LanguageHost,
8
+ DiskText,
9
+ GitBlameCommit,
10
+ GitBlameResult,
11
+ EditorNotification,
12
+ RenameSuggestionsRequest
13
+ } from './host-types.ts';
5
14
  export { EditorView } from './EditorView.tsx';
6
15
  export { createHolder } from './holder.ts';
7
16
  export type { EditorViewProps } from './EditorView.tsx';
@@ -13,8 +22,14 @@ export { SignatureCard } from './SignatureCard.tsx';
13
22
  export { RenameCard } from './RenameCard.tsx';
14
23
  export { PickPopup } from './PickPopup.tsx';
15
24
  export { PeekPanel } from './PeekPanel.tsx';
25
+ export { CallHierarchyPanel } from './CallHierarchyPanel.tsx';
16
26
  export { SymbolPicker } from './SymbolPicker.tsx';
17
27
  export { CodeAuthorsCard } from './CodeAuthorsCard.tsx';
28
+ export { RenderedDocs } from './RenderedDocs.tsx';
29
+ export { RenderedDocsFeature } from './rendered-docs.ts';
30
+ export type { RenderedDocEntry, RenderedDocsSettings } from './rendered-docs.ts';
31
+ export { parseDocComment, sectionsOf, htmlToMarkdown, DOC_LINK_PREFIX } from './doc-comment-model.ts';
32
+ export type { DocTagEntry, DocTagSection, ParsedDocComment } from './doc-comment-model.ts';
18
33
  export { EditorContextMenu } from './EditorContextMenu.tsx';
19
34
  export { EditorRenderingProvider } from './rendering.tsx';
20
35
  export type { EditorRendering } from './rendering-context.ts';
@@ -23,7 +38,7 @@ export { ChangeReview } from './ChangeReview.tsx';
23
38
  export type { ChangeReviewProps } from './ChangeReview.tsx';
24
39
  export { ProjectProblems, countsOf, compareRows } from './project-problems.ts';
25
40
  export type { ProblemFile, ProblemRow } from './project-problems.ts';
26
- export { applyWorkspaceEdit } from './workspace-edit.ts';
41
+ export { applyWorkspaceEdit, supportedResourceOperations } from './workspace-edit.ts';
27
42
  export type { ProjectFiles, StagedFile, WorkspaceEditHost } from './workspace-edit.ts';
28
43
  export { useProblemCounts } from './use-problem-counts.ts';
29
44
  export type { ProblemCounts } from './diagnostics.ts';
@@ -41,6 +56,7 @@ export type {
41
56
  RenameView,
42
57
  RenameFileView,
43
58
  PeekView,
59
+ CallHierarchyView,
44
60
  PickView,
45
61
  PickGroup,
46
62
  PickRow,
@@ -61,3 +77,10 @@ export { AttributionCard } from './AttributionCard.tsx';
61
77
  export type { AttributionCardProps } from './AttributionCard.tsx';
62
78
  export { ReviewGroup, joinReviewGroup } from './review-group.ts';
63
79
  export type { ReviewMember } from './review-group.ts';
80
+ export { DiffView } from './DiffView.tsx';
81
+ export type { DiffViewProps } from './DiffView.tsx';
82
+ export type { DiffLimits } from './diff-expansion.ts';
83
+ export { diffSyntaxDocument } from './diff-syntax.ts';
84
+ export type { DiffSourceSide, DiffSourceTokens, DiffSyntaxSources } from './diff-syntax.ts';
85
+ export { decoratePatch, usePatchDecorations } from './patch-decorations.ts';
86
+ export type { PatchDecoration, PatchDecorationOptions, PatchLineLabels, PatchTimer } from './patch-decorations.ts';