monaco-editor-core 0.55.0-dev-20251021 → 0.55.0-dev-20251023

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 (226) hide show
  1. package/esm/nls.keys.json +1 -1
  2. package/esm/nls.messages.cs.js +2 -2
  3. package/esm/nls.messages.de.js +2 -2
  4. package/esm/nls.messages.es.js +2 -2
  5. package/esm/nls.messages.fr.js +2 -2
  6. package/esm/nls.messages.it.js +2 -2
  7. package/esm/nls.messages.ja.js +2 -2
  8. package/esm/nls.messages.js +1 -1
  9. package/esm/nls.messages.json +1 -1
  10. package/esm/nls.messages.ko.js +2 -2
  11. package/esm/nls.messages.pl.js +2 -2
  12. package/esm/nls.messages.pt-br.js +2 -2
  13. package/esm/nls.messages.ru.js +2 -2
  14. package/esm/nls.messages.tr.js +2 -2
  15. package/esm/nls.messages.zh-cn.js +2 -2
  16. package/esm/nls.messages.zh-tw.js +2 -2
  17. package/esm/nls.metadata.json +23 -5
  18. package/esm/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
  19. package/esm/vs/base/browser/ui/iconLabel/iconlabel.css +2 -3
  20. package/esm/vs/base/browser/ui/list/listPaging.js +5 -1
  21. package/esm/vs/base/browser/ui/list/listPaging.js.map +1 -1
  22. package/esm/vs/base/browser/ui/list/listView.js +4 -3
  23. package/esm/vs/base/browser/ui/list/listView.js.map +1 -1
  24. package/esm/vs/base/common/arrays.js +10 -0
  25. package/esm/vs/base/common/arrays.js.map +1 -1
  26. package/esm/vs/base/common/codiconsLibrary.js +1 -0
  27. package/esm/vs/base/common/codiconsLibrary.js.map +1 -1
  28. package/esm/vs/base/common/paging.js.map +1 -1
  29. package/esm/vs/base/common/platform.js +1 -0
  30. package/esm/vs/base/common/platform.js.map +1 -1
  31. package/esm/vs/base/common/policy.js +40 -1
  32. package/esm/vs/base/common/policy.js.map +1 -1
  33. package/esm/vs/base/common/validation.js +157 -0
  34. package/esm/vs/base/common/validation.js.map +1 -0
  35. package/esm/vs/editor/browser/controller/editContext/native/screenReaderSupport.js +1 -1
  36. package/esm/vs/editor/browser/controller/editContext/screenReaderUtils.js +4 -4
  37. package/esm/vs/editor/browser/controller/editContext/textArea/textAreaEditContext.js +1 -1
  38. package/esm/vs/editor/browser/coreCommands.js +3 -3
  39. package/esm/vs/editor/browser/editorExtensions.js +9 -9
  40. package/esm/vs/editor/browser/gpu/viewGpuContext.js +1 -1
  41. package/esm/vs/editor/browser/services/hoverService/hoverWidget.js +1 -1
  42. package/esm/vs/editor/browser/services/hoverService/updatableHoverWidget.js +1 -1
  43. package/esm/vs/editor/browser/services/inlineCompletionsService.js +4 -4
  44. package/esm/vs/editor/browser/services/inlineCompletionsService.js.map +1 -1
  45. package/esm/vs/editor/browser/widget/codeEditor/codeEditorWidget.js +2 -2
  46. package/esm/vs/editor/browser/widget/diffEditor/commands.js +12 -12
  47. package/esm/vs/editor/browser/widget/diffEditor/components/accessibleDiffViewer.js +14 -14
  48. package/esm/vs/editor/browser/widget/diffEditor/components/accessibleDiffViewer.js.map +1 -1
  49. package/esm/vs/editor/browser/widget/diffEditor/components/diffEditorEditors.js +1 -1
  50. package/esm/vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/copySelection.js +1 -1
  51. package/esm/vs/editor/browser/widget/diffEditor/components/diffEditorViewZones/inlineDiffDeletedCodeMargin.js +7 -7
  52. package/esm/vs/editor/browser/widget/diffEditor/diffEditor.contribution.js +5 -5
  53. package/esm/vs/editor/browser/widget/diffEditor/features/hideUnchangedRegionsFeature.js +7 -7
  54. package/esm/vs/editor/browser/widget/diffEditor/features/movedBlocksLinesFeature.js +2 -2
  55. package/esm/vs/editor/browser/widget/diffEditor/features/revertButtonsFeature.js +2 -2
  56. package/esm/vs/editor/browser/widget/diffEditor/registrations.contribution.js +5 -5
  57. package/esm/vs/editor/browser/widget/multiDiffEditor/colors.js +3 -3
  58. package/esm/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidgetImpl.js +2 -2
  59. package/esm/vs/editor/common/config/editorConfigurationSchema.js +54 -54
  60. package/esm/vs/editor/common/config/editorOptions.js +406 -406
  61. package/esm/vs/editor/common/core/editorColorRegistry.js +68 -68
  62. package/esm/vs/editor/common/editorContextKeys.js +46 -46
  63. package/esm/vs/editor/common/languages/modesRegistry.js +1 -1
  64. package/esm/vs/editor/common/languages.js +66 -56
  65. package/esm/vs/editor/common/languages.js.map +1 -1
  66. package/esm/vs/editor/common/model/editStack.js +1 -1
  67. package/esm/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase.js.map +1 -1
  68. package/esm/vs/editor/common/model/tokens/treeSitter/treeSitterSyntaxTokenBackend.js +1 -1
  69. package/esm/vs/editor/common/model/tokens/treeSitter/treeSitterSyntaxTokenBackend.js.map +1 -1
  70. package/esm/vs/editor/common/services/treeSitter/treeSitterLibraryService.js.map +1 -1
  71. package/esm/vs/editor/common/standaloneStrings.js +10 -10
  72. package/esm/vs/editor/common/viewLayout/viewLineRenderer.js +2 -2
  73. package/esm/vs/editor/common/viewModel/viewModelLines.js.map +1 -1
  74. package/esm/vs/editor/contrib/anchorSelect/browser/anchorSelect.js +6 -6
  75. package/esm/vs/editor/contrib/bracketMatching/browser/bracketMatching.js +6 -6
  76. package/esm/vs/editor/contrib/caretOperations/browser/caretOperations.js +2 -2
  77. package/esm/vs/editor/contrib/caretOperations/browser/transpose.js +1 -1
  78. package/esm/vs/editor/contrib/clipboard/browser/clipboard.js +17 -17
  79. package/esm/vs/editor/contrib/codeAction/browser/codeAction.js +1 -1
  80. package/esm/vs/editor/contrib/codeAction/browser/codeActionCommands.js +29 -29
  81. package/esm/vs/editor/contrib/codeAction/browser/codeActionContributions.js +3 -3
  82. package/esm/vs/editor/contrib/codeAction/browser/codeActionController.js +3 -3
  83. package/esm/vs/editor/contrib/codeAction/browser/codeActionMenu.js +8 -8
  84. package/esm/vs/editor/contrib/codeAction/browser/lightBulbWidget.js +9 -9
  85. package/esm/vs/editor/contrib/codelens/browser/codelensController.js +2 -2
  86. package/esm/vs/editor/contrib/colorPicker/browser/colorPickerParts/colorPickerCloseButton.js +1 -1
  87. package/esm/vs/editor/contrib/colorPicker/browser/colorPickerParts/colorPickerHeader.js +1 -1
  88. package/esm/vs/editor/contrib/colorPicker/browser/standaloneColorPicker/standaloneColorPickerActions.js +7 -7
  89. package/esm/vs/editor/contrib/comment/browser/comment.js +6 -6
  90. package/esm/vs/editor/contrib/contextmenu/browser/contextmenu.js +10 -10
  91. package/esm/vs/editor/contrib/cursorUndo/browser/cursorUndo.js +2 -2
  92. package/esm/vs/editor/contrib/dropOrPasteInto/browser/copyPasteContribution.js +4 -4
  93. package/esm/vs/editor/contrib/dropOrPasteInto/browser/copyPasteController.js +9 -9
  94. package/esm/vs/editor/contrib/dropOrPasteInto/browser/defaultProviders.js +8 -8
  95. package/esm/vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorController.js +3 -3
  96. package/esm/vs/editor/contrib/dropOrPasteInto/browser/postEditWidget.js +2 -2
  97. package/esm/vs/editor/contrib/editorState/browser/keybindingCancellation.js +1 -1
  98. package/esm/vs/editor/contrib/find/browser/findController.js +16 -16
  99. package/esm/vs/editor/contrib/find/browser/findWidget.js +26 -26
  100. package/esm/vs/editor/contrib/folding/browser/folding.js +20 -20
  101. package/esm/vs/editor/contrib/folding/browser/folding.js.map +1 -1
  102. package/esm/vs/editor/contrib/folding/browser/foldingDecorations.js +9 -9
  103. package/esm/vs/editor/contrib/folding/browser/foldingDecorations.js.map +1 -1
  104. package/esm/vs/editor/contrib/fontZoom/browser/fontZoom.js +3 -3
  105. package/esm/vs/editor/contrib/format/browser/formatActions.js +2 -2
  106. package/esm/vs/editor/contrib/gotoError/browser/gotoError.js +8 -8
  107. package/esm/vs/editor/contrib/gotoError/browser/gotoErrorWidget.js +14 -14
  108. package/esm/vs/editor/contrib/gotoSymbol/browser/goToCommands.js +39 -39
  109. package/esm/vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.js +1 -1
  110. package/esm/vs/editor/contrib/gotoSymbol/browser/peek/referencesController.js +3 -3
  111. package/esm/vs/editor/contrib/gotoSymbol/browser/peek/referencesTree.js +3 -3
  112. package/esm/vs/editor/contrib/gotoSymbol/browser/peek/referencesWidget.js +3 -3
  113. package/esm/vs/editor/contrib/gotoSymbol/browser/referencesModel.js +8 -8
  114. package/esm/vs/editor/contrib/gotoSymbol/browser/symbolNavigation.js +3 -3
  115. package/esm/vs/editor/contrib/gpu/browser/gpuActions.js +4 -4
  116. package/esm/vs/editor/contrib/hover/browser/hoverActionIds.js +2 -2
  117. package/esm/vs/editor/contrib/hover/browser/hoverActions.js +24 -24
  118. package/esm/vs/editor/contrib/hover/browser/markdownHoverParticipant.js +9 -9
  119. package/esm/vs/editor/contrib/hover/browser/markerHoverParticipant.js +5 -5
  120. package/esm/vs/editor/contrib/inPlaceReplace/browser/inPlaceReplace.js +2 -2
  121. package/esm/vs/editor/contrib/indentation/browser/indentation.js +20 -20
  122. package/esm/vs/editor/contrib/inlayHints/browser/inlayHintsHover.js +8 -8
  123. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/commands.js +63 -52
  124. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/commands.js.map +1 -1
  125. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionContextKeys.js +12 -12
  126. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionsController.js +1 -1
  127. package/esm/vs/editor/contrib/inlineCompletions/browser/hintsWidget/hoverParticipant.js +1 -1
  128. package/esm/vs/editor/contrib/inlineCompletions/browser/hintsWidget/inlineCompletionsHintsWidget.js +5 -5
  129. package/esm/vs/editor/contrib/inlineCompletions/browser/inlineCompletions.contribution.js +2 -4
  130. package/esm/vs/editor/contrib/inlineCompletions/browser/inlineCompletions.contribution.js.map +1 -1
  131. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsModel.js +11 -12
  132. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsModel.js.map +1 -1
  133. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineSuggestionItem.js +4 -4
  134. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineSuggestionItem.js.map +1 -1
  135. package/esm/vs/editor/contrib/inlineCompletions/browser/model/suggestWidgetAdapter.js.map +1 -1
  136. package/esm/vs/editor/contrib/inlineCompletions/browser/telemetry.js.map +1 -1
  137. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorMenu.js +6 -6
  138. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditWithChanges.js +3 -0
  139. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditWithChanges.js.map +1 -1
  140. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsModel.js +1 -1
  141. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.js +5 -5
  142. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.js.map +1 -1
  143. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/theme.js +20 -20
  144. package/esm/vs/editor/contrib/insertFinalNewLine/browser/insertFinalNewLine.js +1 -1
  145. package/esm/vs/editor/contrib/lineSelection/browser/lineSelection.js +1 -1
  146. package/esm/vs/editor/contrib/linesOperations/browser/linesOperations.js +31 -31
  147. package/esm/vs/editor/contrib/linkedEditing/browser/linkedEditing.js +2 -2
  148. package/esm/vs/editor/contrib/links/browser/links.js +10 -10
  149. package/esm/vs/editor/contrib/message/browser/messageController.js +1 -1
  150. package/esm/vs/editor/contrib/multicursor/browser/multicursor.js +22 -22
  151. package/esm/vs/editor/contrib/parameterHints/browser/parameterHints.js +1 -1
  152. package/esm/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.js +4 -4
  153. package/esm/vs/editor/contrib/peekView/browser/peekView.js +18 -18
  154. package/esm/vs/editor/contrib/placeholderText/browser/placeholderText.contribution.js +1 -1
  155. package/esm/vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess.js +35 -28
  156. package/esm/vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess.js.map +1 -1
  157. package/esm/vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess.js +32 -32
  158. package/esm/vs/editor/contrib/readOnlyMessage/browser/contribution.js +2 -2
  159. package/esm/vs/editor/contrib/rename/browser/rename.js +11 -11
  160. package/esm/vs/editor/contrib/rename/browser/renameWidget.js +7 -7
  161. package/esm/vs/editor/contrib/smartSelect/browser/smartSelect.js +4 -4
  162. package/esm/vs/editor/contrib/snippet/browser/snippetController2.js +4 -4
  163. package/esm/vs/editor/contrib/snippet/browser/snippetVariables.js +4 -4
  164. package/esm/vs/editor/contrib/stickyScroll/browser/stickyScrollActions.js +11 -11
  165. package/esm/vs/editor/contrib/suggest/browser/suggest.js +8 -8
  166. package/esm/vs/editor/contrib/suggest/browser/suggestController.js +10 -10
  167. package/esm/vs/editor/contrib/suggest/browser/suggestWidget.js +17 -17
  168. package/esm/vs/editor/contrib/suggest/browser/suggestWidgetDetails.js +2 -2
  169. package/esm/vs/editor/contrib/suggest/browser/suggestWidgetRenderer.js +2 -2
  170. package/esm/vs/editor/contrib/suggest/browser/wordContextKey.js +1 -1
  171. package/esm/vs/editor/contrib/symbolIcons/browser/symbolIcons.js +33 -33
  172. package/esm/vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.js +4 -4
  173. package/esm/vs/editor/contrib/tokenization/browser/tokenization.js +1 -1
  174. package/esm/vs/editor/contrib/unicodeHighlighter/browser/bannerController.js +1 -1
  175. package/esm/vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.js +24 -24
  176. package/esm/vs/editor/contrib/unusualLineTerminators/browser/unusualLineTerminators.js +5 -5
  177. package/esm/vs/editor/contrib/wordHighlighter/browser/highlightDecorations.js +9 -9
  178. package/esm/vs/editor/contrib/wordHighlighter/browser/wordHighlighter.js +3 -3
  179. package/esm/vs/editor/contrib/wordOperations/browser/wordOperations.js +1 -1
  180. package/esm/vs/editor/standalone/browser/standaloneTreeSitterLibraryService.js +2 -12
  181. package/esm/vs/editor/standalone/browser/standaloneTreeSitterLibraryService.js.map +1 -1
  182. package/esm/vs/platform/accessibilitySignal/browser/accessibilitySignalService.js +62 -62
  183. package/esm/vs/platform/action/common/actionCommonCategories.js +6 -6
  184. package/esm/vs/platform/actionWidget/browser/actionList.js +4 -4
  185. package/esm/vs/platform/actionWidget/browser/actionWidget.js +7 -7
  186. package/esm/vs/platform/actions/browser/menuEntryActionViewItem.js +5 -5
  187. package/esm/vs/platform/actions/browser/toolbar.js +2 -2
  188. package/esm/vs/platform/actions/common/actions.js +1 -0
  189. package/esm/vs/platform/actions/common/actions.js.map +1 -1
  190. package/esm/vs/platform/actions/common/menuService.js +2 -2
  191. package/esm/vs/platform/configuration/common/configurationRegistry.js +10 -10
  192. package/esm/vs/platform/contextkey/browser/contextKeyService.js +1 -1
  193. package/esm/vs/platform/contextkey/common/contextkey.js +9 -9
  194. package/esm/vs/platform/contextkey/common/contextkeys.js +9 -9
  195. package/esm/vs/platform/contextkey/common/scanner.js +5 -5
  196. package/esm/vs/platform/history/browser/contextScopedHistoryWidget.js +1 -1
  197. package/esm/vs/platform/keybinding/common/abstractKeybindingService.js +4 -4
  198. package/esm/vs/platform/list/browser/listService.js +27 -27
  199. package/esm/vs/platform/markers/common/markerService.js +2 -2
  200. package/esm/vs/platform/markers/common/markers.js +6 -6
  201. package/esm/vs/platform/quickinput/browser/commandsQuickAccess.js +19 -9
  202. package/esm/vs/platform/quickinput/browser/commandsQuickAccess.js.map +1 -1
  203. package/esm/vs/platform/quickinput/browser/helpQuickAccess.js +1 -1
  204. package/esm/vs/platform/quickinput/browser/quickInput.js +10 -10
  205. package/esm/vs/platform/quickinput/browser/quickInputActions.js +5 -5
  206. package/esm/vs/platform/quickinput/browser/quickInputController.js +6 -6
  207. package/esm/vs/platform/quickinput/browser/quickInputList.js +1 -1
  208. package/esm/vs/platform/quickinput/browser/quickInputUtils.js +1 -1
  209. package/esm/vs/platform/quickinput/browser/tree/quickInputTreeAccessibilityProvider.js +2 -2
  210. package/esm/vs/platform/quickinput/browser/tree/quickInputTreeAccessibilityProvider.js.map +1 -1
  211. package/esm/vs/platform/theme/common/colorUtils.js +2 -2
  212. package/esm/vs/platform/theme/common/colors/baseColors.js +17 -17
  213. package/esm/vs/platform/theme/common/colors/chartsColors.js +8 -8
  214. package/esm/vs/platform/theme/common/colors/editorColors.js +95 -95
  215. package/esm/vs/platform/theme/common/colors/inputColors.js +47 -47
  216. package/esm/vs/platform/theme/common/colors/listColors.js +36 -36
  217. package/esm/vs/platform/theme/common/colors/menuColors.js +7 -7
  218. package/esm/vs/platform/theme/common/colors/minimapColors.js +11 -11
  219. package/esm/vs/platform/theme/common/colors/miscColors.js +15 -15
  220. package/esm/vs/platform/theme/common/colors/quickpickColors.js +9 -9
  221. package/esm/vs/platform/theme/common/colors/searchColors.js +3 -3
  222. package/esm/vs/platform/theme/common/iconRegistry.js +6 -6
  223. package/esm/vs/platform/undoRedo/common/undoRedoService.js +20 -20
  224. package/esm/vs/platform/workspace/common/workspace.js +1 -1
  225. package/package.json +2 -2
  226. package/version.txt +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.ts","vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.ts"],"names":[],"mappings":"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","file":"inlineEditsView.js","sourceRoot":"file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { equalsIfDefined, itemEquals } from '../../../../../../base/common/equals.js';\nimport { BugIndicatingError } from '../../../../../../base/common/errors.js';\nimport { Event } from '../../../../../../base/common/event.js';\nimport { Disposable } from '../../../../../../base/common/lifecycle.js';\nimport { autorun, autorunWithStore, derived, derivedOpts, IObservable, IReader, ISettableObservable, mapObservableArrayCached, observableValue } from '../../../../../../base/common/observable.js';\nimport { IInstantiationService } from '../../../../../../platform/instantiation/common/instantiation.js';\nimport { ICodeEditor } from '../../../../../browser/editorBrowser.js';\nimport { ObservableCodeEditor, observableCodeEditor } from '../../../../../browser/observableCodeEditor.js';\nimport { EditorOption } from '../../../../../common/config/editorOptions.js';\nimport { LineRange } from '../../../../../common/core/ranges/lineRange.js';\nimport { Position } from '../../../../../common/core/position.js';\nimport { Range } from '../../../../../common/core/range.js';\nimport { TextReplacement } from '../../../../../common/core/edits/textEdit.js';\nimport { AbstractText, StringText } from '../../../../../common/core/text/abstractText.js';\nimport { TextLength } from '../../../../../common/core/text/textLength.js';\nimport { DetailedLineRangeMapping, lineRangeMappingFromRangeMappings, RangeMapping } from '../../../../../common/diff/rangeMapping.js';\nimport { TextModel } from '../../../../../common/model/textModel.js';\nimport { InlineEditsGutterIndicator } from './components/gutterIndicatorView.js';\nimport { InlineEditWithChanges } from './inlineEditWithChanges.js';\nimport { GhostTextIndicator, InlineEditHost, InlineEditModel } from './inlineEditsModel.js';\nimport { InlineEditsOnboardingExperience } from './inlineEditsNewUsers.js';\nimport { IInlineEditModel, InlineCompletionViewData, InlineCompletionViewKind, InlineEditTabAction } from './inlineEditsViewInterface.js';\nimport { InlineEditsCollapsedView } from './inlineEditsViews/inlineEditsCollapsedView.js';\nimport { InlineEditsCustomView } from './inlineEditsViews/inlineEditsCustomView.js';\nimport { InlineEditsDeletionView } from './inlineEditsViews/inlineEditsDeletionView.js';\nimport { InlineEditsInsertionView } from './inlineEditsViews/inlineEditsInsertionView.js';\nimport { InlineEditsLineReplacementView } from './inlineEditsViews/inlineEditsLineReplacementView.js';\nimport { InlineEditsSideBySideView } from './inlineEditsViews/inlineEditsSideBySideView.js';\nimport { InlineEditsWordReplacementView } from './inlineEditsViews/inlineEditsWordReplacementView.js';\nimport { IOriginalEditorInlineDiffViewState, OriginalEditorInlineDiffView } from './inlineEditsViews/originalEditorInlineDiffView.js';\nimport { applyEditToModifiedRangeMappings, createReindentEdit } from './utils/utils.js';\nimport './view.css';\nimport { $ } from '../../../../../../base/browser/dom.js';\n\n\nexport class InlineEditsView extends Disposable {\n\tprivate readonly _editorObs: ObservableCodeEditor;\n\n\tprivate readonly _useCodeShifting;\n\tprivate readonly _renderSideBySide;\n\n\tprivate readonly _tabAction;\n\n\tprivate _previousView: {\n\t\tid: string;\n\t\tview: ReturnType<typeof InlineEditsView.prototype.determineView>;\n\t\teditorWidth: number;\n\t\ttimestamp: number;\n\t} | undefined;\n\n\tconstructor(\n\t\tprivate readonly _editor: ICodeEditor,\n\t\tprivate readonly _host: IObservable<InlineEditHost | undefined>,\n\t\tprivate readonly _model: IObservable<InlineEditModel | undefined>,\n\t\tprivate readonly _ghostTextIndicator: IObservable<GhostTextIndicator | undefined>,\n\t\tprivate readonly _focusIsInMenu: ISettableObservable<boolean>,\n\t\t@IInstantiationService private readonly _instantiationService: IInstantiationService,\n\t) {\n\t\tsuper();\n\t\tthis._editorObs = observableCodeEditor(this._editor);\n\t\tthis._tabAction = derived<InlineEditTabAction>(reader => this._model.read(reader)?.tabAction.read(reader) ?? InlineEditTabAction.Inactive);\n\t\tthis._constructorDone = observableValue(this, false);\n\t\tthis._uiState = derived<{\n\t\t\tstate: ReturnType<typeof InlineEditsView.prototype.determineRenderState>;\n\t\t\tdiff: DetailedLineRangeMapping[];\n\t\t\tedit: InlineEditWithChanges;\n\t\t\tnewText: string;\n\t\t\tnewTextLineCount: number;\n\t\t\tisInDiffEditor: boolean;\n\t\t} | undefined>(this, reader => {\n\t\t\tconst model = this._model.read(reader);\n\t\t\tif (!model || !this._constructorDone.read(reader)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst inlineEdit = model.inlineEdit;\n\t\t\tlet mappings = RangeMapping.fromEdit(inlineEdit.edit);\n\t\t\tlet newText = inlineEdit.edit.apply(inlineEdit.originalText);\n\t\t\tlet diff = lineRangeMappingFromRangeMappings(mappings, inlineEdit.originalText, new StringText(newText));\n\n\t\t\tlet state = this.determineRenderState(model, reader, diff, new StringText(newText));\n\t\t\tif (!state) {\n\t\t\t\tmodel.abort(`unable to determine view: tried to render ${this._previousView?.view}`);\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tif (state.kind === InlineCompletionViewKind.SideBySide) {\n\t\t\t\tconst indentationAdjustmentEdit = createReindentEdit(newText, inlineEdit.modifiedLineRange, textModel.getOptions().tabSize);\n\t\t\t\tnewText = indentationAdjustmentEdit.applyToString(newText);\n\n\t\t\t\tmappings = applyEditToModifiedRangeMappings(mappings, indentationAdjustmentEdit);\n\t\t\t\tdiff = lineRangeMappingFromRangeMappings(mappings, inlineEdit.originalText, new StringText(newText));\n\t\t\t}\n\n\t\t\tthis._previewTextModel.setLanguage(this._editor.getModel()!.getLanguageId());\n\n\t\t\tconst previousNewText = this._previewTextModel.getValue();\n\t\t\tif (previousNewText !== newText) {\n\t\t\t\t// Only update the model if the text has changed to avoid flickering\n\t\t\t\tthis._previewTextModel.setValue(newText);\n\t\t\t}\n\n\t\t\tif (model.showCollapsed.read(reader) && !this._indicator.read(reader)?.isHoverVisible.read(reader)) {\n\t\t\t\tstate = { kind: InlineCompletionViewKind.Collapsed as const, viewData: state.viewData };\n\t\t\t}\n\n\t\t\tmodel.handleInlineEditShown(state.kind, state.viewData);\n\n\t\t\treturn {\n\t\t\t\tstate,\n\t\t\t\tdiff,\n\t\t\t\tedit: inlineEdit,\n\t\t\t\tnewText,\n\t\t\t\tnewTextLineCount: inlineEdit.modifiedLineRange.length,\n\t\t\t\tisInDiffEditor: model.isInDiffEditor,\n\t\t\t};\n\t\t});\n\t\tthis._previewTextModel = this._register(this._instantiationService.createInstance(\n\t\t\tTextModel,\n\t\t\t'',\n\t\t\tthis._editor.getModel()!.getLanguageId(),\n\t\t\t{ ...TextModel.DEFAULT_CREATION_OPTIONS, bracketPairColorizationOptions: { enabled: true, independentColorPoolPerBracketType: false } },\n\t\t\tnull\n\t\t));\n\t\tthis._indicatorCyclicDependencyCircuitBreaker = observableValue(this, false);\n\t\tthis._indicator = derived<InlineEditsGutterIndicator | undefined>(this, (reader) => {\n\t\t\tif (!this._indicatorCyclicDependencyCircuitBreaker.read(reader)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst indicatorDisplayRange = derivedOpts({ owner: this, equalsFn: equalsIfDefined(itemEquals()) }, reader => {\n\t\t\t\t/** @description indicatorDisplayRange */\n\t\t\t\tconst ghostTextIndicator = this._ghostTextIndicator.read(reader);\n\t\t\t\tif (ghostTextIndicator) {\n\t\t\t\t\treturn ghostTextIndicator.lineRange;\n\t\t\t\t}\n\n\t\t\t\tconst state = this._uiState.read(reader);\n\t\t\t\tif (!state) { return undefined; }\n\n\t\t\t\tif (state.state?.kind === 'custom') {\n\t\t\t\t\tconst range = state.state.displayLocation?.range;\n\t\t\t\t\tif (!range) {\n\t\t\t\t\t\tthrow new BugIndicatingError('custom view should have a range');\n\t\t\t\t\t}\n\t\t\t\t\treturn new LineRange(range.startLineNumber, range.endLineNumber);\n\t\t\t\t}\n\n\t\t\t\tif (state.state?.kind === 'insertionMultiLine') {\n\t\t\t\t\treturn this._insertion.originalLines.read(reader);\n\t\t\t\t}\n\n\t\t\t\treturn state.edit.displayRange;\n\t\t\t});\n\n\t\t\tconst modelWithGhostTextSupport = derived<InlineEditModel | undefined>(this, reader => {\n\t\t\t\t/** @description modelWithGhostTextSupport */\n\t\t\t\tconst model = this._model.read(reader);\n\t\t\t\tif (model) {\n\t\t\t\t\treturn model;\n\t\t\t\t}\n\n\t\t\t\tconst ghostTextIndicator = this._ghostTextIndicator.read(reader);\n\t\t\t\tif (ghostTextIndicator) {\n\t\t\t\t\treturn ghostTextIndicator.model;\n\t\t\t\t}\n\n\t\t\t\treturn model;\n\t\t\t});\n\n\t\t\treturn reader.store.add(this._instantiationService.createInstance(\n\t\t\t\tInlineEditsGutterIndicator,\n\t\t\t\tthis._editorObs,\n\t\t\t\tindicatorDisplayRange,\n\t\t\t\tthis._gutterIndicatorOffset,\n\t\t\t\tmodelWithGhostTextSupport,\n\t\t\t\tthis._inlineEditsIsHovered,\n\t\t\t\tthis._focusIsInMenu,\n\t\t\t));\n\t\t});\n\t\tthis._inlineEditsIsHovered = derived(this, reader => {\n\t\t\treturn this._sideBySide.isHovered.read(reader)\n\t\t\t\t|| this._wordReplacementViews.read(reader).some(v => v.isHovered.read(reader))\n\t\t\t\t|| this._deletion.isHovered.read(reader)\n\t\t\t\t|| this._inlineDiffView.isHovered.read(reader)\n\t\t\t\t|| this._lineReplacementView.isHovered.read(reader)\n\t\t\t\t|| this._insertion.isHovered.read(reader)\n\t\t\t\t|| this._customView.isHovered.read(reader);\n\t\t});\n\t\tthis._gutterIndicatorOffset = derived<number>(this, reader => {\n\t\t\t// TODO: have a better way to tell the gutter indicator view where the edit is inside a viewzone\n\t\t\tif (this._uiState.read(reader)?.state?.kind === 'insertionMultiLine') {\n\t\t\t\treturn this._insertion.startLineOffset.read(reader);\n\t\t\t}\n\n\t\t\tconst ghostTextIndicator = this._ghostTextIndicator.read(reader);\n\t\t\tif (ghostTextIndicator) {\n\t\t\t\treturn getGhostTextTopOffset(ghostTextIndicator, this._editor);\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t});\n\t\tthis._sideBySide = this._register(this._instantiationService.createInstance(InlineEditsSideBySideView,\n\t\t\tthis._editor,\n\t\t\tthis._model.map(m => m?.inlineEdit),\n\t\t\tthis._previewTextModel,\n\t\t\tthis._uiState.map(s => s && s.state?.kind === InlineCompletionViewKind.SideBySide ? ({\n\t\t\t\tnewTextLineCount: s.newTextLineCount,\n\t\t\t\tisInDiffEditor: s.isInDiffEditor,\n\t\t\t}) : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\t\tthis._deletion = this._register(this._instantiationService.createInstance(InlineEditsDeletionView,\n\t\t\tthis._editor,\n\t\t\tthis._model.map(m => m?.inlineEdit),\n\t\t\tthis._uiState.map(s => s && s.state?.kind === InlineCompletionViewKind.Deletion ? ({\n\t\t\t\toriginalRange: s.state.originalRange,\n\t\t\t\tdeletions: s.state.deletions,\n\t\t\t\tinDiffEditor: s.isInDiffEditor,\n\t\t\t}) : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\t\tthis._insertion = this._register(this._instantiationService.createInstance(InlineEditsInsertionView,\n\t\t\tthis._editor,\n\t\t\tthis._uiState.map(s => s && s.state?.kind === InlineCompletionViewKind.InsertionMultiLine ? ({\n\t\t\t\tlineNumber: s.state.lineNumber,\n\t\t\t\tstartColumn: s.state.column,\n\t\t\t\ttext: s.state.text,\n\t\t\t\tinDiffEditor: s.isInDiffEditor,\n\t\t\t}) : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\t\tthis._inlineDiffViewState = derived<IOriginalEditorInlineDiffViewState | undefined>(this, reader => {\n\t\t\tconst e = this._uiState.read(reader);\n\t\t\tif (!e || !e.state) { return undefined; }\n\t\t\tif (e.state.kind === 'wordReplacements' || e.state.kind === 'insertionMultiLine' || e.state.kind === 'collapsed' || e.state.kind === 'custom') {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tmodifiedText: new StringText(e.newText),\n\t\t\t\tdiff: e.diff,\n\t\t\t\tmode: e.state.kind,\n\t\t\t\tmodifiedCodeEditor: this._sideBySide.previewEditor,\n\t\t\t\tisInDiffEditor: e.isInDiffEditor,\n\t\t\t};\n\t\t});\n\t\tthis._inlineCollapsedView = this._register(this._instantiationService.createInstance(InlineEditsCollapsedView,\n\t\t\tthis._editor,\n\t\t\tthis._model.map((m, reader) => this._uiState.read(reader)?.state?.kind === 'collapsed' ? m?.inlineEdit : undefined)\n\t\t));\n\t\tthis._customView = this._register(this._instantiationService.createInstance(InlineEditsCustomView,\n\t\t\tthis._editor,\n\t\t\tthis._model.map((m, reader) => this._uiState.read(reader)?.state?.kind === 'custom' ? m?.displayLocation : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\t\tthis._inlineDiffView = this._register(new OriginalEditorInlineDiffView(this._editor, this._inlineDiffViewState, this._previewTextModel));\n\t\tthis._wordReplacementViews = mapObservableArrayCached(this, this._uiState.map(s => s?.state?.kind === 'wordReplacements' ? s.state.replacements : []), (e, store) => {\n\t\t\treturn store.add(this._instantiationService.createInstance(InlineEditsWordReplacementView, this._editorObs, e, this._tabAction));\n\t\t});\n\t\tthis._lineReplacementView = this._register(this._instantiationService.createInstance(InlineEditsLineReplacementView,\n\t\t\tthis._editorObs,\n\t\t\tthis._uiState.map(s => s?.state?.kind === InlineCompletionViewKind.LineReplacement ? ({\n\t\t\t\toriginalRange: s.state.originalRange,\n\t\t\t\tmodifiedRange: s.state.modifiedRange,\n\t\t\t\tmodifiedLines: s.state.modifiedLines,\n\t\t\t\treplacements: s.state.replacements,\n\t\t\t}) : undefined),\n\t\t\tthis._uiState.map(s => s?.isInDiffEditor ?? false),\n\t\t\tthis._tabAction,\n\t\t));\n\n\t\tthis._useCodeShifting = this._editorObs.getOption(EditorOption.inlineSuggest).map(s => s.edits.allowCodeShifting);\n\t\tthis._renderSideBySide = this._editorObs.getOption(EditorOption.inlineSuggest).map(s => s.edits.renderSideBySide);\n\n\t\tthis._register(autorunWithStore((reader, store) => {\n\t\t\tconst model = this._model.read(reader);\n\t\t\tif (!model) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tstore.add(\n\t\t\t\tEvent.any(\n\t\t\t\t\tthis._sideBySide.onDidClick,\n\t\t\t\t\tthis._deletion.onDidClick,\n\t\t\t\t\tthis._lineReplacementView.onDidClick,\n\t\t\t\t\tthis._insertion.onDidClick,\n\t\t\t\t\t...this._wordReplacementViews.read(reader).map(w => w.onDidClick),\n\t\t\t\t\tthis._inlineDiffView.onDidClick,\n\t\t\t\t\tthis._customView.onDidClick,\n\t\t\t\t)(e => {\n\t\t\t\t\tif (this._viewHasBeenShownLongerThan(350)) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tmodel.accept();\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t);\n\t\t}));\n\n\t\tthis._indicator.recomputeInitiallyAndOnChange(this._store);\n\t\tthis._wordReplacementViews.recomputeInitiallyAndOnChange(this._store);\n\n\t\tthis._indicatorCyclicDependencyCircuitBreaker.set(true, undefined);\n\n\t\tthis._register(this._instantiationService.createInstance(InlineEditsOnboardingExperience, this._host, this._model, this._indicator, this._inlineCollapsedView));\n\n\t\tconst minEditorScrollHeight = derived(this, reader => {\n\t\t\treturn Math.max(\n\t\t\t\t...this._wordReplacementViews.read(reader).map(v => v.minEditorScrollHeight.read(reader)),\n\t\t\t\tthis._lineReplacementView.minEditorScrollHeight.read(reader),\n\t\t\t\tthis._customView.minEditorScrollHeight.read(reader)\n\t\t\t);\n\t\t}).recomputeInitiallyAndOnChange(this._store);\n\n\t\tconst textModel = this._editor.getModel()!;\n\n\t\tlet viewZoneId: string | undefined;\n\t\tthis._register(autorun(reader => {\n\t\t\tconst minScrollHeight = minEditorScrollHeight.read(reader);\n\t\t\tthis._editor.changeViewZones(accessor => {\n\t\t\t\tconst scrollHeight = this._editor.getScrollHeight();\n\t\t\t\tconst viewZoneHeight = minScrollHeight - scrollHeight + 1 /* Add 1px so there is a small gap */;\n\n\t\t\t\tif (viewZoneHeight !== 0 && viewZoneId) {\n\t\t\t\t\taccessor.removeZone(viewZoneId);\n\t\t\t\t\tviewZoneId = undefined;\n\t\t\t\t}\n\n\t\t\t\tif (viewZoneHeight <= 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tviewZoneId = accessor.addZone({\n\t\t\t\t\tafterLineNumber: textModel.getLineCount(),\n\t\t\t\t\theightInPx: viewZoneHeight,\n\t\t\t\t\tdomNode: $('div.minScrollHeightViewZone'),\n\t\t\t\t});\n\t\t\t});\n\t\t}));\n\n\t\tthis._constructorDone.set(true, undefined); // TODO: remove and use correct initialization order\n\t}\n\n\tprivate readonly _constructorDone;\n\n\tprivate readonly _uiState;\n\n\tprivate readonly _previewTextModel;\n\n\tprivate readonly _indicatorCyclicDependencyCircuitBreaker;\n\n\tprotected readonly _indicator;\n\n\tprivate readonly _inlineEditsIsHovered;\n\n\tprivate readonly _gutterIndicatorOffset;\n\n\tprivate readonly _sideBySide;\n\n\tprotected readonly _deletion;\n\n\tprotected readonly _insertion;\n\n\tprivate readonly _inlineDiffViewState;\n\n\tprotected readonly _inlineCollapsedView;\n\n\tprotected readonly _customView;\n\n\tprotected readonly _inlineDiffView;\n\n\tprotected readonly _wordReplacementViews;\n\n\tprotected readonly _lineReplacementView;\n\n\tprivate getCacheId(model: IInlineEditModel) {\n\t\treturn model.inlineEdit.inlineCompletion.identity.id;\n\t}\n\n\tprivate determineView(model: IInlineEditModel, reader: IReader, diff: DetailedLineRangeMapping[], newText: StringText): InlineCompletionViewKind {\n\t\t// Check if we can use the previous view if it is the same InlineCompletion as previously shown\n\t\tconst inlineEdit = model.inlineEdit;\n\t\tconst canUseCache = this._previousView?.id === this.getCacheId(model);\n\t\tconst reconsiderViewEditorWidthChange = this._previousView?.editorWidth !== this._editorObs.layoutInfoWidth.read(reader) &&\n\t\t\t(\n\t\t\t\tthis._previousView?.view === InlineCompletionViewKind.SideBySide ||\n\t\t\t\tthis._previousView?.view === InlineCompletionViewKind.LineReplacement\n\t\t\t);\n\n\t\tif (canUseCache && !reconsiderViewEditorWidthChange) {\n\t\t\treturn this._previousView!.view;\n\t\t}\n\n\t\tif (model.displayLocation) {\n\t\t\treturn InlineCompletionViewKind.Custom;\n\t\t}\n\n\t\t// Determine the view based on the edit / diff\n\n\t\tconst numOriginalLines = inlineEdit.originalLineRange.length;\n\t\tconst numModifiedLines = inlineEdit.modifiedLineRange.length;\n\t\tconst inner = diff.flatMap(d => d.innerChanges ?? []);\n\t\tconst isSingleInnerEdit = inner.length === 1;\n\n\t\tif (!model.isInDiffEditor) {\n\t\t\tif (\n\t\t\t\tisSingleInnerEdit\n\t\t\t\t&& this._useCodeShifting.read(reader) !== 'never'\n\t\t\t\t&& isSingleLineInsertion(diff)\n\t\t\t) {\n\t\t\t\tif (isSingleLineInsertionAfterPosition(diff, inlineEdit.cursorPosition)) {\n\t\t\t\t\treturn InlineCompletionViewKind.InsertionInline;\n\t\t\t\t}\n\n\t\t\t\t// If we have a single line insertion before the cursor position, we do not want to move the cursor by inserting\n\t\t\t\t// the suggestion inline. Use a line replacement view instead. Do not use word replacement view.\n\t\t\t\treturn InlineCompletionViewKind.LineReplacement;\n\t\t\t}\n\n\t\t\tif (isDeletion(inner, inlineEdit, newText)) {\n\t\t\t\treturn InlineCompletionViewKind.Deletion;\n\t\t\t}\n\n\t\t\tif (isSingleMultiLineInsertion(diff) && this._useCodeShifting.read(reader) === 'always') {\n\t\t\t\treturn InlineCompletionViewKind.InsertionMultiLine;\n\t\t\t}\n\n\t\t\tconst allInnerChangesNotTooLong = inner.every(m => TextLength.ofRange(m.originalRange).columnCount < InlineEditsWordReplacementView.MAX_LENGTH && TextLength.ofRange(m.modifiedRange).columnCount < InlineEditsWordReplacementView.MAX_LENGTH);\n\t\t\tif (allInnerChangesNotTooLong && isSingleInnerEdit && numOriginalLines === 1 && numModifiedLines === 1) {\n\t\t\t\t// Do not show indentation changes with word replacement view\n\t\t\t\tconst modifiedText = inner.map(m => newText.getValueOfRange(m.modifiedRange));\n\t\t\t\tconst originalText = inner.map(m => model.inlineEdit.originalText.getValueOfRange(m.originalRange));\n\t\t\t\tif (!modifiedText.some(v => v.includes('\\t')) && !originalText.some(v => v.includes('\\t'))) {\n\t\t\t\t\t// Make sure there is no insertion, even if we grow them\n\t\t\t\t\tif (\n\t\t\t\t\t\t!inner.some(m => m.originalRange.isEmpty()) ||\n\t\t\t\t\t\t!growEditsUntilWhitespace(inner.map(m => new TextReplacement(m.originalRange, '')), inlineEdit.originalText).some(e => e.range.isEmpty() && TextLength.ofRange(e.range).columnCount < InlineEditsWordReplacementView.MAX_LENGTH)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn InlineCompletionViewKind.WordReplacements;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (numOriginalLines > 0 && numModifiedLines > 0) {\n\t\t\tif (numOriginalLines === 1 && numModifiedLines === 1 && !model.isInDiffEditor /* prefer side by side in diff editor */) {\n\t\t\t\treturn InlineCompletionViewKind.LineReplacement;\n\t\t\t}\n\n\t\t\tif (this._renderSideBySide.read(reader) !== 'never' && InlineEditsSideBySideView.fitsInsideViewport(this._editor, this._previewTextModel, inlineEdit, reader)) {\n\t\t\t\treturn InlineCompletionViewKind.SideBySide;\n\t\t\t}\n\n\t\t\treturn InlineCompletionViewKind.LineReplacement;\n\t\t}\n\n\t\tif (model.isInDiffEditor) {\n\t\t\tif (isDeletion(inner, inlineEdit, newText)) {\n\t\t\t\treturn InlineCompletionViewKind.Deletion;\n\t\t\t}\n\n\t\t\tif (isSingleMultiLineInsertion(diff) && this._useCodeShifting.read(reader) === 'always') {\n\t\t\t\treturn InlineCompletionViewKind.InsertionMultiLine;\n\t\t\t}\n\t\t}\n\n\t\treturn InlineCompletionViewKind.SideBySide;\n\t}\n\n\tprivate determineRenderState(model: IInlineEditModel, reader: IReader, diff: DetailedLineRangeMapping[], newText: StringText) {\n\t\tconst inlineEdit = model.inlineEdit;\n\n\t\tlet view = this.determineView(model, reader, diff, newText);\n\n\t\tif (this._willRenderAboveCursor(reader, inlineEdit, view)) {\n\t\t\tswitch (view) {\n\t\t\t\tcase InlineCompletionViewKind.LineReplacement:\n\t\t\t\tcase InlineCompletionViewKind.WordReplacements:\n\t\t\t\t\tview = InlineCompletionViewKind.SideBySide;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tthis._previousView = { id: this.getCacheId(model), view, editorWidth: this._editor.getLayoutInfo().width, timestamp: Date.now() };\n\n\t\tconst inner = diff.flatMap(d => d.innerChanges ?? []);\n\t\tconst textModel = this._editor.getModel()!;\n\t\tconst stringChanges = inner.map(m => ({\n\t\t\toriginalRange: m.originalRange,\n\t\t\tmodifiedRange: m.modifiedRange,\n\t\t\toriginal: textModel.getValueInRange(m.originalRange),\n\t\t\tmodified: newText.getValueOfRange(m.modifiedRange)\n\t\t}));\n\n\t\tconst cursorPosition = inlineEdit.cursorPosition;\n\t\tconst startsWithEOL = stringChanges[0].modified.startsWith(textModel.getEOL());\n\t\tconst viewData: InlineCompletionViewData = {\n\t\t\tcursorColumnDistance: inlineEdit.edit.replacements[0].range.getStartPosition().column - cursorPosition.column,\n\t\t\tcursorLineDistance: inlineEdit.lineEdit.lineRange.startLineNumber - cursorPosition.lineNumber + (startsWithEOL && inlineEdit.lineEdit.lineRange.startLineNumber >= cursorPosition.lineNumber ? 1 : 0),\n\t\t\tlineCountOriginal: inlineEdit.lineEdit.lineRange.length,\n\t\t\tlineCountModified: inlineEdit.lineEdit.newLines.length,\n\t\t\tcharacterCountOriginal: stringChanges.reduce((acc, r) => acc + r.original.length, 0),\n\t\t\tcharacterCountModified: stringChanges.reduce((acc, r) => acc + r.modified.length, 0),\n\t\t\tdisjointReplacements: stringChanges.length,\n\t\t\tsameShapeReplacements: stringChanges.every(r => r.original === stringChanges[0].original && r.modified === stringChanges[0].modified),\n\t\t};\n\n\t\tswitch (view) {\n\t\t\tcase InlineCompletionViewKind.InsertionInline: return { kind: InlineCompletionViewKind.InsertionInline as const, viewData };\n\t\t\tcase InlineCompletionViewKind.SideBySide: return { kind: InlineCompletionViewKind.SideBySide as const, viewData };\n\t\t\tcase InlineCompletionViewKind.Collapsed: return { kind: InlineCompletionViewKind.Collapsed as const, viewData };\n\t\t\tcase InlineCompletionViewKind.Custom: return { kind: InlineCompletionViewKind.Custom as const, displayLocation: model.displayLocation, viewData };\n\t\t}\n\n\t\tif (view === InlineCompletionViewKind.Deletion) {\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.Deletion as const,\n\t\t\t\toriginalRange: inlineEdit.originalLineRange,\n\t\t\t\tdeletions: inner.map(m => m.originalRange),\n\t\t\t\tviewData,\n\t\t\t};\n\t\t}\n\n\t\tif (view === InlineCompletionViewKind.InsertionMultiLine) {\n\t\t\tconst change = inner[0];\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.InsertionMultiLine as const,\n\t\t\t\tlineNumber: change.originalRange.startLineNumber,\n\t\t\t\tcolumn: change.originalRange.startColumn,\n\t\t\t\ttext: newText.getValueOfRange(change.modifiedRange),\n\t\t\t\tviewData,\n\t\t\t};\n\t\t}\n\n\t\tconst replacements = stringChanges.map(m => new TextReplacement(m.originalRange, m.modified));\n\t\tif (replacements.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (view === InlineCompletionViewKind.WordReplacements) {\n\t\t\tlet grownEdits = growEditsToEntireWord(replacements, inlineEdit.originalText);\n\n\t\t\tif (grownEdits.some(e => e.range.isEmpty())) {\n\t\t\t\tgrownEdits = growEditsUntilWhitespace(replacements, inlineEdit.originalText);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.WordReplacements as const,\n\t\t\t\treplacements: grownEdits,\n\t\t\t\tviewData,\n\t\t\t};\n\t\t}\n\n\t\tif (view === InlineCompletionViewKind.LineReplacement) {\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.LineReplacement as const,\n\t\t\t\toriginalRange: inlineEdit.originalLineRange,\n\t\t\t\tmodifiedRange: inlineEdit.modifiedLineRange,\n\t\t\t\tmodifiedLines: inlineEdit.modifiedLineRange.mapToLineArray(line => newText.getLineAt(line)),\n\t\t\t\treplacements: inner.map(m => ({ originalRange: m.originalRange, modifiedRange: m.modifiedRange })),\n\t\t\t\tviewData,\n\t\t\t};\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tprivate _willRenderAboveCursor(reader: IReader, inlineEdit: InlineEditWithChanges, view: InlineCompletionViewKind): boolean {\n\t\tconst useCodeShifting = this._useCodeShifting.read(reader);\n\t\tif (useCodeShifting === 'always') {\n\t\t\treturn false;\n\t\t}\n\n\t\tfor (const cursorPosition of inlineEdit.multiCursorPositions) {\n\t\t\tif (view === InlineCompletionViewKind.WordReplacements &&\n\t\t\t\tcursorPosition.lineNumber === inlineEdit.originalLineRange.startLineNumber + 1\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (view === InlineCompletionViewKind.LineReplacement &&\n\t\t\t\tcursorPosition.lineNumber >= inlineEdit.originalLineRange.endLineNumberExclusive &&\n\t\t\t\tcursorPosition.lineNumber < inlineEdit.modifiedLineRange.endLineNumberExclusive + inlineEdit.modifiedLineRange.length\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tprivate _viewHasBeenShownLongerThan(durationMs: number): boolean {\n\t\tconst viewCreationTime = this._previousView?.timestamp;\n\t\tif (!viewCreationTime) {\n\t\t\tthrow new BugIndicatingError('viewHasBeenShownLongThan called before a view has been shown');\n\t\t}\n\n\t\tconst currentTime = Date.now();\n\t\treturn (currentTime - viewCreationTime) >= durationMs;\n\t}\n}\n\nfunction isSingleLineInsertion(diff: DetailedLineRangeMapping[]) {\n\treturn diff.every(m => m.innerChanges!.every(r => isWordInsertion(r)));\n\n\tfunction isWordInsertion(r: RangeMapping) {\n\t\tif (!r.originalRange.isEmpty()) {\n\t\t\treturn false;\n\t\t}\n\t\tconst isInsertionWithinLine = r.modifiedRange.startLineNumber === r.modifiedRange.endLineNumber;\n\t\tif (!isInsertionWithinLine) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n}\n\nfunction isSingleLineInsertionAfterPosition(diff: DetailedLineRangeMapping[], position: Position | null) {\n\tif (!position) {\n\t\treturn false;\n\t}\n\n\tif (!isSingleLineInsertion(diff)) {\n\t\treturn false;\n\t}\n\n\tconst pos = position;\n\n\treturn diff.every(m => m.innerChanges!.every(r => isStableWordInsertion(r)));\n\n\tfunction isStableWordInsertion(r: RangeMapping) {\n\t\tconst insertPosition = r.originalRange.getStartPosition();\n\t\tif (pos.isBeforeOrEqual(insertPosition)) {\n\t\t\treturn true;\n\t\t}\n\t\tif (insertPosition.lineNumber < pos.lineNumber) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n}\n\nfunction isSingleMultiLineInsertion(diff: DetailedLineRangeMapping[]) {\n\tconst inner = diff.flatMap(d => d.innerChanges ?? []);\n\tif (inner.length !== 1) {\n\t\treturn false;\n\t}\n\n\tconst change = inner[0];\n\tif (!change.originalRange.isEmpty()) {\n\t\treturn false;\n\t}\n\n\tif (change.modifiedRange.startLineNumber === change.modifiedRange.endLineNumber) {\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nfunction isDeletion(inner: RangeMapping[], inlineEdit: InlineEditWithChanges, newText: StringText) {\n\tconst innerValues = inner.map(m => ({ original: inlineEdit.originalText.getValueOfRange(m.originalRange), modified: newText.getValueOfRange(m.modifiedRange) }));\n\treturn innerValues.every(({ original, modified }) => modified.trim() === '' && original.length > 0 && (original.length > modified.length || original.trim() !== ''));\n}\n\nfunction growEditsToEntireWord(replacements: TextReplacement[], originalText: AbstractText): TextReplacement[] {\n\treturn _growEdits(replacements, originalText, (char) => /^[a-zA-Z]$/.test(char));\n}\n\nfunction growEditsUntilWhitespace(replacements: TextReplacement[], originalText: AbstractText): TextReplacement[] {\n\treturn _growEdits(replacements, originalText, (char) => !(/^\\s$/.test(char)));\n}\n\nfunction _growEdits(replacements: TextReplacement[], originalText: AbstractText, fn: (c: string) => boolean): TextReplacement[] {\n\tconst result: TextReplacement[] = [];\n\n\treplacements.sort((a, b) => Range.compareRangesUsingStarts(a.range, b.range));\n\n\tfor (const edit of replacements) {\n\t\tlet startIndex = edit.range.startColumn - 1;\n\t\tlet endIndex = edit.range.endColumn - 2;\n\t\tlet prefix = '';\n\t\tlet suffix = '';\n\t\tconst startLineContent = originalText.getLineAt(edit.range.startLineNumber);\n\t\tconst endLineContent = originalText.getLineAt(edit.range.endLineNumber);\n\n\t\tif (isIncluded(startLineContent[startIndex])) {\n\t\t\t// grow to the left\n\t\t\twhile (isIncluded(startLineContent[startIndex - 1])) {\n\t\t\t\tprefix = startLineContent[startIndex - 1] + prefix;\n\t\t\t\tstartIndex--;\n\t\t\t}\n\t\t}\n\n\t\tif (isIncluded(endLineContent[endIndex]) || endIndex < startIndex) {\n\t\t\t// grow to the right\n\t\t\twhile (isIncluded(endLineContent[endIndex + 1])) {\n\t\t\t\tsuffix += endLineContent[endIndex + 1];\n\t\t\t\tendIndex++;\n\t\t\t}\n\t\t}\n\n\t\t// create new edit and merge together if they are touching\n\t\tlet newEdit = new TextReplacement(new Range(edit.range.startLineNumber, startIndex + 1, edit.range.endLineNumber, endIndex + 2), prefix + edit.text + suffix);\n\t\tif (result.length > 0 && Range.areIntersectingOrTouching(result[result.length - 1].range, newEdit.range)) {\n\t\t\tnewEdit = TextReplacement.joinReplacements([result.pop()!, newEdit], originalText);\n\t\t}\n\n\t\tresult.push(newEdit);\n\t}\n\n\tfunction isIncluded(c: string | undefined) {\n\t\tif (c === undefined) {\n\t\t\treturn false;\n\t\t}\n\t\treturn fn(c);\n\t}\n\n\treturn result;\n}\n\nfunction getGhostTextTopOffset(ghostTextIndicator: GhostTextIndicator, editor: ICodeEditor): number {\n\tconst replacements = ghostTextIndicator.model.inlineEdit.edit.replacements;\n\tif (replacements.length !== 1) {\n\t\treturn 0;\n\t}\n\n\tconst textModel = editor.getModel();\n\tif (!textModel) {\n\t\treturn 0;\n\t}\n\n\tconst EOL = textModel.getEOL();\n\tconst replacement = replacements[0];\n\tif (replacement.range.isEmpty() && replacement.text.startsWith(EOL)) {\n\t\tconst lineHeight = editor.getLineHeightForPosition(replacement.range.getStartPosition());\n\t\treturn countPrefixRepeats(replacement.text, EOL) * lineHeight;\n\t}\n\n\treturn 0;\n}\n\nfunction countPrefixRepeats(str: string, prefix: string): number {\n\tif (!prefix.length) {\n\t\treturn 0;\n\t}\n\tlet count = 0;\n\tlet i = 0;\n\twhile (str.startsWith(prefix, i)) {\n\t\tcount++;\n\t\ti += prefix.length;\n\t}\n\treturn count;\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { equalsIfDefined, itemEquals } from '../../../../../../base/common/equals.js';\nimport { BugIndicatingError } from '../../../../../../base/common/errors.js';\nimport { Event } from '../../../../../../base/common/event.js';\nimport { Disposable } from '../../../../../../base/common/lifecycle.js';\nimport { autorun, autorunWithStore, derived, derivedOpts, IObservable, IReader, ISettableObservable, mapObservableArrayCached, observableValue } from '../../../../../../base/common/observable.js';\nimport { IInstantiationService } from '../../../../../../platform/instantiation/common/instantiation.js';\nimport { ICodeEditor } from '../../../../../browser/editorBrowser.js';\nimport { ObservableCodeEditor, observableCodeEditor } from '../../../../../browser/observableCodeEditor.js';\nimport { EditorOption } from '../../../../../common/config/editorOptions.js';\nimport { LineRange } from '../../../../../common/core/ranges/lineRange.js';\nimport { Position } from '../../../../../common/core/position.js';\nimport { Range } from '../../../../../common/core/range.js';\nimport { TextReplacement } from '../../../../../common/core/edits/textEdit.js';\nimport { AbstractText, StringText } from '../../../../../common/core/text/abstractText.js';\nimport { TextLength } from '../../../../../common/core/text/textLength.js';\nimport { DetailedLineRangeMapping, lineRangeMappingFromRangeMappings, RangeMapping } from '../../../../../common/diff/rangeMapping.js';\nimport { TextModel } from '../../../../../common/model/textModel.js';\nimport { InlineEditsGutterIndicator } from './components/gutterIndicatorView.js';\nimport { InlineEditWithChanges } from './inlineEditWithChanges.js';\nimport { GhostTextIndicator, InlineEditHost, InlineEditModel } from './inlineEditsModel.js';\nimport { InlineEditsOnboardingExperience } from './inlineEditsNewUsers.js';\nimport { IInlineEditModel, InlineCompletionViewData, InlineCompletionViewKind, InlineEditTabAction } from './inlineEditsViewInterface.js';\nimport { InlineEditsCollapsedView } from './inlineEditsViews/inlineEditsCollapsedView.js';\nimport { InlineEditsCustomView } from './inlineEditsViews/inlineEditsCustomView.js';\nimport { InlineEditsDeletionView } from './inlineEditsViews/inlineEditsDeletionView.js';\nimport { InlineEditsInsertionView } from './inlineEditsViews/inlineEditsInsertionView.js';\nimport { InlineEditsLineReplacementView } from './inlineEditsViews/inlineEditsLineReplacementView.js';\nimport { InlineEditsSideBySideView } from './inlineEditsViews/inlineEditsSideBySideView.js';\nimport { InlineEditsWordReplacementView } from './inlineEditsViews/inlineEditsWordReplacementView.js';\nimport { IOriginalEditorInlineDiffViewState, OriginalEditorInlineDiffView } from './inlineEditsViews/originalEditorInlineDiffView.js';\nimport { applyEditToModifiedRangeMappings, createReindentEdit } from './utils/utils.js';\nimport './view.css';\nimport { $ } from '../../../../../../base/browser/dom.js';\n\n\nexport class InlineEditsView extends Disposable {\n\tprivate readonly _editorObs: ObservableCodeEditor;\n\n\tprivate readonly _useCodeShifting;\n\tprivate readonly _renderSideBySide;\n\n\tprivate readonly _tabAction;\n\n\tprivate _previousView: {\n\t\tid: string;\n\t\tview: ReturnType<typeof InlineEditsView.prototype.determineView>;\n\t\teditorWidth: number;\n\t\ttimestamp: number;\n\t} | undefined;\n\n\tconstructor(\n\t\tprivate readonly _editor: ICodeEditor,\n\t\tprivate readonly _host: IObservable<InlineEditHost | undefined>,\n\t\tprivate readonly _model: IObservable<InlineEditModel | undefined>,\n\t\tprivate readonly _ghostTextIndicator: IObservable<GhostTextIndicator | undefined>,\n\t\tprivate readonly _focusIsInMenu: ISettableObservable<boolean>,\n\t\t@IInstantiationService private readonly _instantiationService: IInstantiationService,\n\t) {\n\t\tsuper();\n\t\tthis._editorObs = observableCodeEditor(this._editor);\n\t\tthis._tabAction = derived<InlineEditTabAction>(reader => this._model.read(reader)?.tabAction.read(reader) ?? InlineEditTabAction.Inactive);\n\t\tthis._constructorDone = observableValue(this, false);\n\t\tthis._uiState = derived<{\n\t\t\tstate: ReturnType<typeof InlineEditsView.prototype.determineRenderState>;\n\t\t\tdiff: DetailedLineRangeMapping[];\n\t\t\tedit: InlineEditWithChanges;\n\t\t\tnewText: string;\n\t\t\tnewTextLineCount: number;\n\t\t\tisInDiffEditor: boolean;\n\t\t} | undefined>(this, reader => {\n\t\t\tconst model = this._model.read(reader);\n\t\t\tif (!model || !this._constructorDone.read(reader)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst inlineEdit = model.inlineEdit;\n\t\t\tlet mappings = RangeMapping.fromEdit(inlineEdit.edit);\n\t\t\tlet newText = inlineEdit.edit.apply(inlineEdit.originalText);\n\t\t\tlet diff = lineRangeMappingFromRangeMappings(mappings, inlineEdit.originalText, new StringText(newText));\n\n\t\t\tlet state = this.determineRenderState(model, reader, diff, new StringText(newText));\n\t\t\tif (!state) {\n\t\t\t\tmodel.abort(`unable to determine view: tried to render ${this._previousView?.view}`);\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tif (state.kind === InlineCompletionViewKind.SideBySide) {\n\t\t\t\tconst indentationAdjustmentEdit = createReindentEdit(newText, inlineEdit.modifiedLineRange, textModel.getOptions().tabSize);\n\t\t\t\tnewText = indentationAdjustmentEdit.applyToString(newText);\n\n\t\t\t\tmappings = applyEditToModifiedRangeMappings(mappings, indentationAdjustmentEdit);\n\t\t\t\tdiff = lineRangeMappingFromRangeMappings(mappings, inlineEdit.originalText, new StringText(newText));\n\t\t\t}\n\n\t\t\tthis._previewTextModel.setLanguage(this._editor.getModel()!.getLanguageId());\n\n\t\t\tconst previousNewText = this._previewTextModel.getValue();\n\t\t\tif (previousNewText !== newText) {\n\t\t\t\t// Only update the model if the text has changed to avoid flickering\n\t\t\t\tthis._previewTextModel.setValue(newText);\n\t\t\t}\n\n\t\t\tif (model.showCollapsed.read(reader) && !this._indicator.read(reader)?.isHoverVisible.read(reader)) {\n\t\t\t\tstate = { kind: InlineCompletionViewKind.Collapsed as const, viewData: state.viewData };\n\t\t\t}\n\n\t\t\tmodel.handleInlineEditShown(state.kind, state.viewData);\n\n\t\t\treturn {\n\t\t\t\tstate,\n\t\t\t\tdiff,\n\t\t\t\tedit: inlineEdit,\n\t\t\t\tnewText,\n\t\t\t\tnewTextLineCount: inlineEdit.modifiedLineRange.length,\n\t\t\t\tisInDiffEditor: model.isInDiffEditor,\n\t\t\t};\n\t\t});\n\t\tthis._previewTextModel = this._register(this._instantiationService.createInstance(\n\t\t\tTextModel,\n\t\t\t'',\n\t\t\tthis._editor.getModel()!.getLanguageId(),\n\t\t\t{ ...TextModel.DEFAULT_CREATION_OPTIONS, bracketPairColorizationOptions: { enabled: true, independentColorPoolPerBracketType: false } },\n\t\t\tnull\n\t\t));\n\t\tthis._indicatorCyclicDependencyCircuitBreaker = observableValue(this, false);\n\t\tthis._indicator = derived<InlineEditsGutterIndicator | undefined>(this, (reader) => {\n\t\t\tif (!this._indicatorCyclicDependencyCircuitBreaker.read(reader)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst indicatorDisplayRange = derivedOpts({ owner: this, equalsFn: equalsIfDefined(itemEquals()) }, reader => {\n\t\t\t\t/** @description indicatorDisplayRange */\n\t\t\t\tconst ghostTextIndicator = this._ghostTextIndicator.read(reader);\n\t\t\t\tif (ghostTextIndicator) {\n\t\t\t\t\treturn ghostTextIndicator.lineRange;\n\t\t\t\t}\n\n\t\t\t\tconst state = this._uiState.read(reader);\n\t\t\t\tif (!state) { return undefined; }\n\n\t\t\t\tif (state.state?.kind === 'custom') {\n\t\t\t\t\tconst range = state.state.displayLocation?.range;\n\t\t\t\t\tif (!range) {\n\t\t\t\t\t\tthrow new BugIndicatingError('custom view should have a range');\n\t\t\t\t\t}\n\t\t\t\t\treturn new LineRange(range.startLineNumber, range.endLineNumber);\n\t\t\t\t}\n\n\t\t\t\tif (state.state?.kind === 'insertionMultiLine') {\n\t\t\t\t\treturn this._insertion.originalLines.read(reader);\n\t\t\t\t}\n\n\t\t\t\treturn state.edit.displayRange;\n\t\t\t});\n\n\t\t\tconst modelWithGhostTextSupport = derived<InlineEditModel | undefined>(this, reader => {\n\t\t\t\t/** @description modelWithGhostTextSupport */\n\t\t\t\tconst model = this._model.read(reader);\n\t\t\t\tif (model) {\n\t\t\t\t\treturn model;\n\t\t\t\t}\n\n\t\t\t\tconst ghostTextIndicator = this._ghostTextIndicator.read(reader);\n\t\t\t\tif (ghostTextIndicator) {\n\t\t\t\t\treturn ghostTextIndicator.model;\n\t\t\t\t}\n\n\t\t\t\treturn model;\n\t\t\t});\n\n\t\t\treturn reader.store.add(this._instantiationService.createInstance(\n\t\t\t\tInlineEditsGutterIndicator,\n\t\t\t\tthis._editorObs,\n\t\t\t\tindicatorDisplayRange,\n\t\t\t\tthis._gutterIndicatorOffset,\n\t\t\t\tmodelWithGhostTextSupport,\n\t\t\t\tthis._inlineEditsIsHovered,\n\t\t\t\tthis._focusIsInMenu,\n\t\t\t));\n\t\t});\n\t\tthis._inlineEditsIsHovered = derived(this, reader => {\n\t\t\treturn this._sideBySide.isHovered.read(reader)\n\t\t\t\t|| this._wordReplacementViews.read(reader).some(v => v.isHovered.read(reader))\n\t\t\t\t|| this._deletion.isHovered.read(reader)\n\t\t\t\t|| this._inlineDiffView.isHovered.read(reader)\n\t\t\t\t|| this._lineReplacementView.isHovered.read(reader)\n\t\t\t\t|| this._insertion.isHovered.read(reader)\n\t\t\t\t|| this._customView.isHovered.read(reader);\n\t\t});\n\t\tthis._gutterIndicatorOffset = derived<number>(this, reader => {\n\t\t\t// TODO: have a better way to tell the gutter indicator view where the edit is inside a viewzone\n\t\t\tif (this._uiState.read(reader)?.state?.kind === 'insertionMultiLine') {\n\t\t\t\treturn this._insertion.startLineOffset.read(reader);\n\t\t\t}\n\n\t\t\tconst ghostTextIndicator = this._ghostTextIndicator.read(reader);\n\t\t\tif (ghostTextIndicator) {\n\t\t\t\treturn getGhostTextTopOffset(ghostTextIndicator, this._editor);\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t});\n\t\tthis._sideBySide = this._register(this._instantiationService.createInstance(InlineEditsSideBySideView,\n\t\t\tthis._editor,\n\t\t\tthis._model.map(m => m?.inlineEdit),\n\t\t\tthis._previewTextModel,\n\t\t\tthis._uiState.map(s => s && s.state?.kind === InlineCompletionViewKind.SideBySide ? ({\n\t\t\t\tnewTextLineCount: s.newTextLineCount,\n\t\t\t\tisInDiffEditor: s.isInDiffEditor,\n\t\t\t}) : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\t\tthis._deletion = this._register(this._instantiationService.createInstance(InlineEditsDeletionView,\n\t\t\tthis._editor,\n\t\t\tthis._model.map(m => m?.inlineEdit),\n\t\t\tthis._uiState.map(s => s && s.state?.kind === InlineCompletionViewKind.Deletion ? ({\n\t\t\t\toriginalRange: s.state.originalRange,\n\t\t\t\tdeletions: s.state.deletions,\n\t\t\t\tinDiffEditor: s.isInDiffEditor,\n\t\t\t}) : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\t\tthis._insertion = this._register(this._instantiationService.createInstance(InlineEditsInsertionView,\n\t\t\tthis._editor,\n\t\t\tthis._uiState.map(s => s && s.state?.kind === InlineCompletionViewKind.InsertionMultiLine ? ({\n\t\t\t\tlineNumber: s.state.lineNumber,\n\t\t\t\tstartColumn: s.state.column,\n\t\t\t\ttext: s.state.text,\n\t\t\t\tinDiffEditor: s.isInDiffEditor,\n\t\t\t}) : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\t\tthis._inlineDiffViewState = derived<IOriginalEditorInlineDiffViewState | undefined>(this, reader => {\n\t\t\tconst e = this._uiState.read(reader);\n\t\t\tif (!e || !e.state) { return undefined; }\n\t\t\tif (e.state.kind === 'wordReplacements' || e.state.kind === 'insertionMultiLine' || e.state.kind === 'collapsed' || e.state.kind === 'custom') {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tmodifiedText: new StringText(e.newText),\n\t\t\t\tdiff: e.diff,\n\t\t\t\tmode: e.state.kind,\n\t\t\t\tmodifiedCodeEditor: this._sideBySide.previewEditor,\n\t\t\t\tisInDiffEditor: e.isInDiffEditor,\n\t\t\t};\n\t\t});\n\t\tthis._inlineCollapsedView = this._register(this._instantiationService.createInstance(InlineEditsCollapsedView,\n\t\t\tthis._editor,\n\t\t\tthis._model.map((m, reader) => this._uiState.read(reader)?.state?.kind === 'collapsed' ? m?.inlineEdit : undefined)\n\t\t));\n\t\tthis._customView = this._register(this._instantiationService.createInstance(InlineEditsCustomView,\n\t\t\tthis._editor,\n\t\t\tthis._model.map((m, reader) => this._uiState.read(reader)?.state?.kind === 'custom' ? m?.displayLocation : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\t\tthis._inlineDiffView = this._register(new OriginalEditorInlineDiffView(this._editor, this._inlineDiffViewState, this._previewTextModel));\n\t\tthis._wordReplacementViews = mapObservableArrayCached(this, this._uiState.map(s => s?.state?.kind === 'wordReplacements' ? s.state.replacements : []), (e, store) => {\n\t\t\treturn store.add(this._instantiationService.createInstance(InlineEditsWordReplacementView, this._editorObs, e, this._tabAction));\n\t\t});\n\t\tthis._lineReplacementView = this._register(this._instantiationService.createInstance(InlineEditsLineReplacementView,\n\t\t\tthis._editorObs,\n\t\t\tthis._uiState.map(s => s?.state?.kind === InlineCompletionViewKind.LineReplacement ? ({\n\t\t\t\toriginalRange: s.state.originalRange,\n\t\t\t\tmodifiedRange: s.state.modifiedRange,\n\t\t\t\tmodifiedLines: s.state.modifiedLines,\n\t\t\t\treplacements: s.state.replacements,\n\t\t\t}) : undefined),\n\t\t\tthis._uiState.map(s => s?.isInDiffEditor ?? false),\n\t\t\tthis._tabAction,\n\t\t));\n\n\t\tthis._useCodeShifting = this._editorObs.getOption(EditorOption.inlineSuggest).map(s => s.edits.allowCodeShifting);\n\t\tthis._renderSideBySide = this._editorObs.getOption(EditorOption.inlineSuggest).map(s => s.edits.renderSideBySide);\n\n\t\tthis._register(autorunWithStore((reader, store) => {\n\t\t\tconst model = this._model.read(reader);\n\t\t\tif (!model) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tstore.add(\n\t\t\t\tEvent.any(\n\t\t\t\t\tthis._sideBySide.onDidClick,\n\t\t\t\t\tthis._deletion.onDidClick,\n\t\t\t\t\tthis._lineReplacementView.onDidClick,\n\t\t\t\t\tthis._insertion.onDidClick,\n\t\t\t\t\t...this._wordReplacementViews.read(reader).map(w => w.onDidClick),\n\t\t\t\t\tthis._inlineDiffView.onDidClick,\n\t\t\t\t\tthis._customView.onDidClick,\n\t\t\t\t)(e => {\n\t\t\t\t\tif (this._viewHasBeenShownLongerThan(350)) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tmodel.accept();\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t);\n\t\t}));\n\n\t\tthis._indicator.recomputeInitiallyAndOnChange(this._store);\n\t\tthis._wordReplacementViews.recomputeInitiallyAndOnChange(this._store);\n\n\t\tthis._indicatorCyclicDependencyCircuitBreaker.set(true, undefined);\n\n\t\tthis._register(this._instantiationService.createInstance(InlineEditsOnboardingExperience, this._host, this._model, this._indicator, this._inlineCollapsedView));\n\n\t\tconst minEditorScrollHeight = derived(this, reader => {\n\t\t\treturn Math.max(\n\t\t\t\t...this._wordReplacementViews.read(reader).map(v => v.minEditorScrollHeight.read(reader)),\n\t\t\t\tthis._lineReplacementView.minEditorScrollHeight.read(reader),\n\t\t\t\tthis._customView.minEditorScrollHeight.read(reader)\n\t\t\t);\n\t\t}).recomputeInitiallyAndOnChange(this._store);\n\n\t\tconst textModel = this._editor.getModel()!;\n\n\t\tlet viewZoneId: string | undefined;\n\t\tthis._register(autorun(reader => {\n\t\t\tconst minScrollHeight = minEditorScrollHeight.read(reader);\n\t\t\tthis._editor.changeViewZones(accessor => {\n\t\t\t\tconst scrollHeight = this._editor.getScrollHeight();\n\t\t\t\tconst viewZoneHeight = minScrollHeight - scrollHeight + 1 /* Add 1px so there is a small gap */;\n\n\t\t\t\tif (viewZoneHeight !== 0 && viewZoneId) {\n\t\t\t\t\taccessor.removeZone(viewZoneId);\n\t\t\t\t\tviewZoneId = undefined;\n\t\t\t\t}\n\n\t\t\t\tif (viewZoneHeight <= 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tviewZoneId = accessor.addZone({\n\t\t\t\t\tafterLineNumber: textModel.getLineCount(),\n\t\t\t\t\theightInPx: viewZoneHeight,\n\t\t\t\t\tdomNode: $('div.minScrollHeightViewZone'),\n\t\t\t\t});\n\t\t\t});\n\t\t}));\n\n\t\tthis._constructorDone.set(true, undefined); // TODO: remove and use correct initialization order\n\t}\n\n\tprivate readonly _constructorDone;\n\n\tprivate readonly _uiState;\n\n\tprivate readonly _previewTextModel;\n\n\tprivate readonly _indicatorCyclicDependencyCircuitBreaker;\n\n\tprotected readonly _indicator;\n\n\tprivate readonly _inlineEditsIsHovered;\n\n\tprivate readonly _gutterIndicatorOffset;\n\n\tprivate readonly _sideBySide;\n\n\tprotected readonly _deletion;\n\n\tprotected readonly _insertion;\n\n\tprivate readonly _inlineDiffViewState;\n\n\tprotected readonly _inlineCollapsedView;\n\n\tprotected readonly _customView;\n\n\tprotected readonly _inlineDiffView;\n\n\tprotected readonly _wordReplacementViews;\n\n\tprotected readonly _lineReplacementView;\n\n\tprivate getCacheId(model: IInlineEditModel) {\n\t\treturn model.inlineEdit.inlineCompletion.identity.id;\n\t}\n\n\tprivate determineView(model: IInlineEditModel, reader: IReader, diff: DetailedLineRangeMapping[], newText: StringText): InlineCompletionViewKind {\n\t\t// Check if we can use the previous view if it is the same InlineCompletion as previously shown\n\t\tconst inlineEdit = model.inlineEdit;\n\t\tconst canUseCache = this._previousView?.id === this.getCacheId(model);\n\t\tconst reconsiderViewEditorWidthChange = this._previousView?.editorWidth !== this._editorObs.layoutInfoWidth.read(reader) &&\n\t\t\t(\n\t\t\t\tthis._previousView?.view === InlineCompletionViewKind.SideBySide ||\n\t\t\t\tthis._previousView?.view === InlineCompletionViewKind.LineReplacement\n\t\t\t);\n\n\t\tif (canUseCache && !reconsiderViewEditorWidthChange) {\n\t\t\treturn this._previousView!.view;\n\t\t}\n\n\t\tif (model.displayLocation) {\n\t\t\treturn InlineCompletionViewKind.Custom;\n\t\t}\n\n\t\t// Determine the view based on the edit / diff\n\n\t\tconst numOriginalLines = inlineEdit.originalLineRange.length;\n\t\tconst numModifiedLines = inlineEdit.modifiedLineRange.length;\n\t\tconst inner = diff.flatMap(d => d.innerChanges ?? []);\n\t\tconst isSingleInnerEdit = inner.length === 1;\n\n\t\tif (!model.isInDiffEditor) {\n\t\t\tif (\n\t\t\t\tisSingleInnerEdit\n\t\t\t\t&& this._useCodeShifting.read(reader) !== 'never'\n\t\t\t\t&& isSingleLineInsertion(diff)\n\t\t\t) {\n\t\t\t\tif (isSingleLineInsertionAfterPosition(diff, inlineEdit.cursorPosition)) {\n\t\t\t\t\treturn InlineCompletionViewKind.InsertionInline;\n\t\t\t\t}\n\n\t\t\t\t// If we have a single line insertion before the cursor position, we do not want to move the cursor by inserting\n\t\t\t\t// the suggestion inline. Use a line replacement view instead. Do not use word replacement view.\n\t\t\t\treturn InlineCompletionViewKind.LineReplacement;\n\t\t\t}\n\n\t\t\tif (isDeletion(inner, inlineEdit, newText)) {\n\t\t\t\treturn InlineCompletionViewKind.Deletion;\n\t\t\t}\n\n\t\t\tif (isSingleMultiLineInsertion(diff) && this._useCodeShifting.read(reader) === 'always') {\n\t\t\t\treturn InlineCompletionViewKind.InsertionMultiLine;\n\t\t\t}\n\n\t\t\tconst allInnerChangesNotTooLong = inner.every(m => TextLength.ofRange(m.originalRange).columnCount < InlineEditsWordReplacementView.MAX_LENGTH && TextLength.ofRange(m.modifiedRange).columnCount < InlineEditsWordReplacementView.MAX_LENGTH);\n\t\t\tif (allInnerChangesNotTooLong && isSingleInnerEdit && numOriginalLines === 1 && numModifiedLines === 1) {\n\t\t\t\t// Do not show indentation changes with word replacement view\n\t\t\t\tconst modifiedText = inner.map(m => newText.getValueOfRange(m.modifiedRange));\n\t\t\t\tconst originalText = inner.map(m => model.inlineEdit.originalText.getValueOfRange(m.originalRange));\n\t\t\t\tif (!modifiedText.some(v => v.includes('\\t')) && !originalText.some(v => v.includes('\\t'))) {\n\t\t\t\t\t// Make sure there is no insertion, even if we grow them\n\t\t\t\t\tif (\n\t\t\t\t\t\t!inner.some(m => m.originalRange.isEmpty()) ||\n\t\t\t\t\t\t!growEditsUntilWhitespace(inner.map(m => new TextReplacement(m.originalRange, '')), inlineEdit.originalText).some(e => e.range.isEmpty() && TextLength.ofRange(e.range).columnCount < InlineEditsWordReplacementView.MAX_LENGTH)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn InlineCompletionViewKind.WordReplacements;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (numOriginalLines > 0 && numModifiedLines > 0) {\n\t\t\tif (numOriginalLines === 1 && numModifiedLines === 1 && !model.isInDiffEditor /* prefer side by side in diff editor */) {\n\t\t\t\treturn InlineCompletionViewKind.LineReplacement;\n\t\t\t}\n\n\t\t\tif (this._renderSideBySide.read(reader) !== 'never' && InlineEditsSideBySideView.fitsInsideViewport(this._editor, this._previewTextModel, inlineEdit, reader)) {\n\t\t\t\treturn InlineCompletionViewKind.SideBySide;\n\t\t\t}\n\n\t\t\treturn InlineCompletionViewKind.LineReplacement;\n\t\t}\n\n\t\tif (model.isInDiffEditor) {\n\t\t\tif (isDeletion(inner, inlineEdit, newText)) {\n\t\t\t\treturn InlineCompletionViewKind.Deletion;\n\t\t\t}\n\n\t\t\tif (isSingleMultiLineInsertion(diff) && this._useCodeShifting.read(reader) === 'always') {\n\t\t\t\treturn InlineCompletionViewKind.InsertionMultiLine;\n\t\t\t}\n\t\t}\n\n\t\treturn InlineCompletionViewKind.SideBySide;\n\t}\n\n\tprivate determineRenderState(model: IInlineEditModel, reader: IReader, diff: DetailedLineRangeMapping[], newText: StringText) {\n\t\tconst inlineEdit = model.inlineEdit;\n\n\t\tlet view = this.determineView(model, reader, diff, newText);\n\n\t\tif (this._willRenderAboveCursor(reader, inlineEdit, view)) {\n\t\t\tswitch (view) {\n\t\t\t\tcase InlineCompletionViewKind.LineReplacement:\n\t\t\t\tcase InlineCompletionViewKind.WordReplacements:\n\t\t\t\t\tview = InlineCompletionViewKind.SideBySide;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tthis._previousView = { id: this.getCacheId(model), view, editorWidth: this._editor.getLayoutInfo().width, timestamp: Date.now() };\n\n\t\tconst inner = diff.flatMap(d => d.innerChanges ?? []);\n\t\tconst textModel = this._editor.getModel()!;\n\t\tconst stringChanges = inner.map(m => ({\n\t\t\toriginalRange: m.originalRange,\n\t\t\tmodifiedRange: m.modifiedRange,\n\t\t\toriginal: textModel.getValueInRange(m.originalRange),\n\t\t\tmodified: newText.getValueOfRange(m.modifiedRange)\n\t\t}));\n\n\t\tconst cursorPosition = inlineEdit.cursorPosition;\n\t\tconst startsWithEOL = stringChanges[0].modified.startsWith(textModel.getEOL());\n\t\tconst viewData: InlineCompletionViewData = {\n\t\t\tcursorColumnDistance: inlineEdit.edit.replacements[0].range.getStartPosition().column - cursorPosition.column,\n\t\t\tcursorLineDistance: inlineEdit.lineEdit.lineRange.startLineNumber - cursorPosition.lineNumber + (startsWithEOL && inlineEdit.lineEdit.lineRange.startLineNumber >= cursorPosition.lineNumber ? 1 : 0),\n\t\t\tlineCountOriginal: inlineEdit.lineEdit.lineRange.length,\n\t\t\tlineCountModified: inlineEdit.lineEdit.newLines.length,\n\t\t\tcharacterCountOriginal: stringChanges.reduce((acc, r) => acc + r.original.length, 0),\n\t\t\tcharacterCountModified: stringChanges.reduce((acc, r) => acc + r.modified.length, 0),\n\t\t\tdisjointReplacements: stringChanges.length,\n\t\t\tsameShapeReplacements: stringChanges.every(r => r.original === stringChanges[0].original && r.modified === stringChanges[0].modified),\n\t\t};\n\n\t\tswitch (view) {\n\t\t\tcase InlineCompletionViewKind.InsertionInline: return { kind: InlineCompletionViewKind.InsertionInline as const, viewData };\n\t\t\tcase InlineCompletionViewKind.SideBySide: return { kind: InlineCompletionViewKind.SideBySide as const, viewData };\n\t\t\tcase InlineCompletionViewKind.Collapsed: return { kind: InlineCompletionViewKind.Collapsed as const, viewData };\n\t\t\tcase InlineCompletionViewKind.Custom: return { kind: InlineCompletionViewKind.Custom as const, displayLocation: model.displayLocation, viewData };\n\t\t}\n\n\t\tif (view === InlineCompletionViewKind.Deletion) {\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.Deletion as const,\n\t\t\t\toriginalRange: inlineEdit.originalLineRange,\n\t\t\t\tdeletions: inner.map(m => m.originalRange),\n\t\t\t\tviewData,\n\t\t\t};\n\t\t}\n\n\t\tif (view === InlineCompletionViewKind.InsertionMultiLine) {\n\t\t\tconst change = inner[0];\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.InsertionMultiLine as const,\n\t\t\t\tlineNumber: change.originalRange.startLineNumber,\n\t\t\t\tcolumn: change.originalRange.startColumn,\n\t\t\t\ttext: newText.getValueOfRange(change.modifiedRange),\n\t\t\t\tviewData,\n\t\t\t};\n\t\t}\n\n\t\tconst replacements = stringChanges.map(m => new TextReplacement(m.originalRange, m.modified));\n\t\tif (replacements.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (view === InlineCompletionViewKind.WordReplacements) {\n\t\t\tlet grownEdits = growEditsToEntireWord(replacements, inlineEdit.originalText);\n\n\t\t\tif (grownEdits.some(e => e.range.isEmpty())) {\n\t\t\t\tgrownEdits = growEditsUntilWhitespace(replacements, inlineEdit.originalText);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.WordReplacements as const,\n\t\t\t\treplacements: grownEdits,\n\t\t\t\tviewData,\n\t\t\t};\n\t\t}\n\n\t\tif (view === InlineCompletionViewKind.LineReplacement) {\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.LineReplacement as const,\n\t\t\t\toriginalRange: inlineEdit.originalLineRange,\n\t\t\t\tmodifiedRange: inlineEdit.modifiedLineRange,\n\t\t\t\tmodifiedLines: inlineEdit.modifiedLineRange.mapToLineArray(line => newText.getLineAt(line)),\n\t\t\t\treplacements: inner.map(m => ({ originalRange: m.originalRange, modifiedRange: m.modifiedRange })),\n\t\t\t\tviewData,\n\t\t\t};\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tprivate _willRenderAboveCursor(reader: IReader, inlineEdit: InlineEditWithChanges, view: InlineCompletionViewKind): boolean {\n\t\tconst useCodeShifting = this._useCodeShifting.read(reader);\n\t\tif (useCodeShifting === 'always') {\n\t\t\treturn false;\n\t\t}\n\n\t\tfor (const cursorPosition of inlineEdit.multiCursorPositions) {\n\t\t\tif (view === InlineCompletionViewKind.WordReplacements &&\n\t\t\t\tcursorPosition.lineNumber === inlineEdit.originalLineRange.startLineNumber + 1\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (view === InlineCompletionViewKind.LineReplacement &&\n\t\t\t\tcursorPosition.lineNumber >= inlineEdit.originalLineRange.endLineNumberExclusive &&\n\t\t\t\tcursorPosition.lineNumber < inlineEdit.modifiedLineRange.endLineNumberExclusive + inlineEdit.modifiedLineRange.length\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tprivate _viewHasBeenShownLongerThan(durationMs: number): boolean {\n\t\tconst viewCreationTime = this._previousView?.timestamp;\n\t\tif (!viewCreationTime) {\n\t\t\tthrow new BugIndicatingError('viewHasBeenShownLongThan called before a view has been shown');\n\t\t}\n\n\t\tconst currentTime = Date.now();\n\t\treturn (currentTime - viewCreationTime) >= durationMs;\n\t}\n}\n\nfunction isSingleLineInsertion(diff: DetailedLineRangeMapping[]) {\n\treturn diff.every(m => m.innerChanges!.every(r => isWordInsertion(r)));\n\n\tfunction isWordInsertion(r: RangeMapping) {\n\t\tif (!r.originalRange.isEmpty()) {\n\t\t\treturn false;\n\t\t}\n\t\tconst isInsertionWithinLine = r.modifiedRange.startLineNumber === r.modifiedRange.endLineNumber;\n\t\tif (!isInsertionWithinLine) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n}\n\nfunction isSingleLineInsertionAfterPosition(diff: DetailedLineRangeMapping[], position: Position | null) {\n\tif (!position) {\n\t\treturn false;\n\t}\n\n\tif (!isSingleLineInsertion(diff)) {\n\t\treturn false;\n\t}\n\n\tconst pos = position;\n\n\treturn diff.every(m => m.innerChanges!.every(r => isStableWordInsertion(r)));\n\n\tfunction isStableWordInsertion(r: RangeMapping) {\n\t\tconst insertPosition = r.originalRange.getStartPosition();\n\t\tif (pos.isBeforeOrEqual(insertPosition)) {\n\t\t\treturn true;\n\t\t}\n\t\tif (insertPosition.lineNumber < pos.lineNumber) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n}\n\nfunction isSingleMultiLineInsertion(diff: DetailedLineRangeMapping[]) {\n\tconst inner = diff.flatMap(d => d.innerChanges ?? []);\n\tif (inner.length !== 1) {\n\t\treturn false;\n\t}\n\n\tconst change = inner[0];\n\tif (!change.originalRange.isEmpty()) {\n\t\treturn false;\n\t}\n\n\tif (change.modifiedRange.startLineNumber === change.modifiedRange.endLineNumber) {\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nfunction isDeletion(inner: RangeMapping[], inlineEdit: InlineEditWithChanges, newText: StringText) {\n\tconst innerValues = inner.map(m => ({ original: inlineEdit.originalText.getValueOfRange(m.originalRange), modified: newText.getValueOfRange(m.modifiedRange) }));\n\treturn innerValues.every(({ original, modified }) => modified.trim() === '' && original.length > 0 && (original.length > modified.length || original.trim() !== ''));\n}\n\nfunction growEditsToEntireWord(replacements: TextReplacement[], originalText: AbstractText): TextReplacement[] {\n\treturn _growEdits(replacements, originalText, (char) => /^[a-zA-Z]$/.test(char));\n}\n\nfunction growEditsUntilWhitespace(replacements: TextReplacement[], originalText: AbstractText): TextReplacement[] {\n\treturn _growEdits(replacements, originalText, (char) => !(/^\\s$/.test(char)));\n}\n\nfunction _growEdits(replacements: TextReplacement[], originalText: AbstractText, fn: (c: string) => boolean): TextReplacement[] {\n\tconst result: TextReplacement[] = [];\n\n\treplacements.sort((a, b) => Range.compareRangesUsingStarts(a.range, b.range));\n\n\tfor (const edit of replacements) {\n\t\tlet startIndex = edit.range.startColumn - 1;\n\t\tlet endIndex = edit.range.endColumn - 2;\n\t\tlet prefix = '';\n\t\tlet suffix = '';\n\t\tconst startLineContent = originalText.getLineAt(edit.range.startLineNumber);\n\t\tconst endLineContent = originalText.getLineAt(edit.range.endLineNumber);\n\n\t\tif (isIncluded(startLineContent[startIndex])) {\n\t\t\t// grow to the left\n\t\t\twhile (isIncluded(startLineContent[startIndex - 1])) {\n\t\t\t\tprefix = startLineContent[startIndex - 1] + prefix;\n\t\t\t\tstartIndex--;\n\t\t\t}\n\t\t}\n\n\t\tif (isIncluded(endLineContent[endIndex]) || endIndex < startIndex) {\n\t\t\t// grow to the right\n\t\t\twhile (isIncluded(endLineContent[endIndex + 1])) {\n\t\t\t\tsuffix += endLineContent[endIndex + 1];\n\t\t\t\tendIndex++;\n\t\t\t}\n\t\t}\n\n\t\t// create new edit and merge together if they are touching\n\t\tlet newEdit = new TextReplacement(new Range(edit.range.startLineNumber, startIndex + 1, edit.range.endLineNumber, endIndex + 2), prefix + edit.text + suffix);\n\t\tif (result.length > 0 && Range.areIntersectingOrTouching(result[result.length - 1].range, newEdit.range)) {\n\t\t\tnewEdit = TextReplacement.joinReplacements([result.pop()!, newEdit], originalText);\n\t\t}\n\n\t\tresult.push(newEdit);\n\t}\n\n\tfunction isIncluded(c: string | undefined) {\n\t\tif (c === undefined) {\n\t\t\treturn false;\n\t\t}\n\t\treturn fn(c);\n\t}\n\n\treturn result;\n}\n\nfunction getGhostTextTopOffset(ghostTextIndicator: GhostTextIndicator, editor: ICodeEditor): number {\n\tconst replacements = ghostTextIndicator.model.inlineEdit.edit.replacements;\n\tif (replacements.length !== 1) {\n\t\treturn 0;\n\t}\n\n\tconst textModel = editor.getModel();\n\tif (!textModel) {\n\t\treturn 0;\n\t}\n\n\tconst EOL = textModel.getEOL();\n\tconst replacement = replacements[0];\n\tif (replacement.range.isEmpty() && replacement.text.startsWith(EOL)) {\n\t\tconst lineHeight = editor.getLineHeightForPosition(replacement.range.getStartPosition());\n\t\treturn countPrefixRepeats(replacement.text, EOL) * lineHeight;\n\t}\n\n\treturn 0;\n}\n\nfunction countPrefixRepeats(str: string, prefix: string): number {\n\tif (!prefix.length) {\n\t\treturn 0;\n\t}\n\tlet count = 0;\n\tlet i = 0;\n\twhile (str.startsWith(prefix, i)) {\n\t\tcount++;\n\t\ti += prefix.length;\n\t}\n\treturn count;\n}\n"]}
1
+ {"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.ts","vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.ts"],"names":[],"mappings":"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","file":"inlineEditsView.js","sourceRoot":"file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { $ } from '../../../../../../base/browser/dom.js';\nimport { equalsIfDefined, itemEquals } from '../../../../../../base/common/equals.js';\nimport { BugIndicatingError } from '../../../../../../base/common/errors.js';\nimport { Event } from '../../../../../../base/common/event.js';\nimport { Disposable } from '../../../../../../base/common/lifecycle.js';\nimport { autorun, autorunWithStore, derived, derivedOpts, IObservable, IReader, ISettableObservable, mapObservableArrayCached, observableValue } from '../../../../../../base/common/observable.js';\nimport { IInstantiationService } from '../../../../../../platform/instantiation/common/instantiation.js';\nimport { ICodeEditor } from '../../../../../browser/editorBrowser.js';\nimport { ObservableCodeEditor, observableCodeEditor } from '../../../../../browser/observableCodeEditor.js';\nimport { EditorOption } from '../../../../../common/config/editorOptions.js';\nimport { TextReplacement } from '../../../../../common/core/edits/textEdit.js';\nimport { Position } from '../../../../../common/core/position.js';\nimport { Range } from '../../../../../common/core/range.js';\nimport { LineRange } from '../../../../../common/core/ranges/lineRange.js';\nimport { AbstractText, StringText } from '../../../../../common/core/text/abstractText.js';\nimport { TextLength } from '../../../../../common/core/text/textLength.js';\nimport { DetailedLineRangeMapping, lineRangeMappingFromRangeMappings, RangeMapping } from '../../../../../common/diff/rangeMapping.js';\nimport { TextModel } from '../../../../../common/model/textModel.js';\nimport { InlineEditsGutterIndicator } from './components/gutterIndicatorView.js';\nimport { InlineEditWithChanges } from './inlineEditWithChanges.js';\nimport { GhostTextIndicator, InlineEditHost, InlineEditModel } from './inlineEditsModel.js';\nimport { InlineEditsOnboardingExperience } from './inlineEditsNewUsers.js';\nimport { IInlineEditModel, InlineCompletionViewData, InlineCompletionViewKind, InlineEditTabAction } from './inlineEditsViewInterface.js';\nimport { InlineEditsCollapsedView } from './inlineEditsViews/inlineEditsCollapsedView.js';\nimport { InlineEditsCustomView } from './inlineEditsViews/inlineEditsCustomView.js';\nimport { InlineEditsDeletionView } from './inlineEditsViews/inlineEditsDeletionView.js';\nimport { InlineEditsInsertionView } from './inlineEditsViews/inlineEditsInsertionView.js';\nimport { InlineEditsLineReplacementView } from './inlineEditsViews/inlineEditsLineReplacementView.js';\nimport { InlineEditsSideBySideView } from './inlineEditsViews/inlineEditsSideBySideView.js';\nimport { InlineEditsWordReplacementView } from './inlineEditsViews/inlineEditsWordReplacementView.js';\nimport { IOriginalEditorInlineDiffViewState, OriginalEditorInlineDiffView } from './inlineEditsViews/originalEditorInlineDiffView.js';\nimport { applyEditToModifiedRangeMappings, createReindentEdit } from './utils/utils.js';\nimport './view.css';\n\n\nexport class InlineEditsView extends Disposable {\n\tprivate readonly _editorObs: ObservableCodeEditor;\n\n\tprivate readonly _useCodeShifting;\n\tprivate readonly _renderSideBySide;\n\n\tprivate readonly _tabAction;\n\n\tprivate _previousView: {\n\t\tid: string;\n\t\tview: ReturnType<typeof InlineEditsView.prototype.determineView>;\n\t\teditorWidth: number;\n\t\ttimestamp: number;\n\t} | undefined;\n\n\tconstructor(\n\t\tprivate readonly _editor: ICodeEditor,\n\t\tprivate readonly _host: IObservable<InlineEditHost | undefined>,\n\t\tprivate readonly _model: IObservable<InlineEditModel | undefined>,\n\t\tprivate readonly _ghostTextIndicator: IObservable<GhostTextIndicator | undefined>,\n\t\tprivate readonly _focusIsInMenu: ISettableObservable<boolean>,\n\t\t@IInstantiationService private readonly _instantiationService: IInstantiationService,\n\t) {\n\t\tsuper();\n\t\tthis._editorObs = observableCodeEditor(this._editor);\n\t\tthis._tabAction = derived<InlineEditTabAction>(reader => this._model.read(reader)?.tabAction.read(reader) ?? InlineEditTabAction.Inactive);\n\t\tthis._constructorDone = observableValue(this, false);\n\t\tthis._uiState = derived<{\n\t\t\tstate: ReturnType<typeof InlineEditsView.prototype.determineRenderState>;\n\t\t\tdiff: DetailedLineRangeMapping[];\n\t\t\tedit: InlineEditWithChanges;\n\t\t\tnewText: string;\n\t\t\tnewTextLineCount: number;\n\t\t\tisInDiffEditor: boolean;\n\t\t} | undefined>(this, reader => {\n\t\t\tconst model = this._model.read(reader);\n\t\t\tif (!model || !this._constructorDone.read(reader)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst inlineEdit = model.inlineEdit;\n\t\t\tlet mappings = RangeMapping.fromEdit(inlineEdit.edit);\n\t\t\tlet newText = inlineEdit.edit.apply(inlineEdit.originalText);\n\t\t\tlet diff = lineRangeMappingFromRangeMappings(mappings, inlineEdit.originalText, new StringText(newText));\n\n\t\t\tlet state = this.determineRenderState(model, reader, diff, new StringText(newText));\n\t\t\tif (!state) {\n\t\t\t\tmodel.abort(`unable to determine view: tried to render ${this._previousView?.view}`);\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tif (state.kind === InlineCompletionViewKind.SideBySide) {\n\t\t\t\tconst indentationAdjustmentEdit = createReindentEdit(newText, inlineEdit.modifiedLineRange, textModel.getOptions().tabSize);\n\t\t\t\tnewText = indentationAdjustmentEdit.applyToString(newText);\n\n\t\t\t\tmappings = applyEditToModifiedRangeMappings(mappings, indentationAdjustmentEdit);\n\t\t\t\tdiff = lineRangeMappingFromRangeMappings(mappings, inlineEdit.originalText, new StringText(newText));\n\t\t\t}\n\n\t\t\tthis._previewTextModel.setLanguage(this._editor.getModel()!.getLanguageId());\n\n\t\t\tconst previousNewText = this._previewTextModel.getValue();\n\t\t\tif (previousNewText !== newText) {\n\t\t\t\t// Only update the model if the text has changed to avoid flickering\n\t\t\t\tthis._previewTextModel.setValue(newText);\n\t\t\t}\n\n\t\t\tif (model.showCollapsed.read(reader) && !this._indicator.read(reader)?.isHoverVisible.read(reader)) {\n\t\t\t\tstate = { kind: InlineCompletionViewKind.Collapsed as const, viewData: state.viewData };\n\t\t\t}\n\n\t\t\tmodel.handleInlineEditShown(state.kind, state.viewData);\n\n\t\t\treturn {\n\t\t\t\tstate,\n\t\t\t\tdiff,\n\t\t\t\tedit: inlineEdit,\n\t\t\t\tnewText,\n\t\t\t\tnewTextLineCount: inlineEdit.modifiedLineRange.length,\n\t\t\t\tisInDiffEditor: model.isInDiffEditor,\n\t\t\t};\n\t\t});\n\t\tthis._previewTextModel = this._register(this._instantiationService.createInstance(\n\t\t\tTextModel,\n\t\t\t'',\n\t\t\tthis._editor.getModel()!.getLanguageId(),\n\t\t\t{ ...TextModel.DEFAULT_CREATION_OPTIONS, bracketPairColorizationOptions: { enabled: true, independentColorPoolPerBracketType: false } },\n\t\t\tnull\n\t\t));\n\t\tthis._indicatorCyclicDependencyCircuitBreaker = observableValue(this, false);\n\t\tthis._indicator = derived<InlineEditsGutterIndicator | undefined>(this, (reader) => {\n\t\t\tif (!this._indicatorCyclicDependencyCircuitBreaker.read(reader)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst indicatorDisplayRange = derivedOpts({ owner: this, equalsFn: equalsIfDefined(itemEquals()) }, reader => {\n\t\t\t\t/** @description indicatorDisplayRange */\n\t\t\t\tconst ghostTextIndicator = this._ghostTextIndicator.read(reader);\n\t\t\t\tif (ghostTextIndicator) {\n\t\t\t\t\treturn ghostTextIndicator.lineRange;\n\t\t\t\t}\n\n\t\t\t\tconst state = this._uiState.read(reader);\n\t\t\t\tif (!state) { return undefined; }\n\n\t\t\t\tif (state.state?.kind === 'custom') {\n\t\t\t\t\tconst range = state.state.displayLocation?.range;\n\t\t\t\t\tif (!range) {\n\t\t\t\t\t\tthrow new BugIndicatingError('custom view should have a range');\n\t\t\t\t\t}\n\t\t\t\t\treturn new LineRange(range.startLineNumber, range.endLineNumber);\n\t\t\t\t}\n\n\t\t\t\tif (state.state?.kind === 'insertionMultiLine') {\n\t\t\t\t\treturn this._insertion.originalLines.read(reader);\n\t\t\t\t}\n\n\t\t\t\treturn state.edit.displayRange;\n\t\t\t});\n\n\t\t\tconst modelWithGhostTextSupport = derived<InlineEditModel | undefined>(this, reader => {\n\t\t\t\t/** @description modelWithGhostTextSupport */\n\t\t\t\tconst model = this._model.read(reader);\n\t\t\t\tif (model) {\n\t\t\t\t\treturn model;\n\t\t\t\t}\n\n\t\t\t\tconst ghostTextIndicator = this._ghostTextIndicator.read(reader);\n\t\t\t\tif (ghostTextIndicator) {\n\t\t\t\t\treturn ghostTextIndicator.model;\n\t\t\t\t}\n\n\t\t\t\treturn model;\n\t\t\t});\n\n\t\t\treturn reader.store.add(this._instantiationService.createInstance(\n\t\t\t\tInlineEditsGutterIndicator,\n\t\t\t\tthis._editorObs,\n\t\t\t\tindicatorDisplayRange,\n\t\t\t\tthis._gutterIndicatorOffset,\n\t\t\t\tmodelWithGhostTextSupport,\n\t\t\t\tthis._inlineEditsIsHovered,\n\t\t\t\tthis._focusIsInMenu,\n\t\t\t));\n\t\t});\n\t\tthis._inlineEditsIsHovered = derived(this, reader => {\n\t\t\treturn this._sideBySide.isHovered.read(reader)\n\t\t\t\t|| this._wordReplacementViews.read(reader).some(v => v.isHovered.read(reader))\n\t\t\t\t|| this._deletion.isHovered.read(reader)\n\t\t\t\t|| this._inlineDiffView.isHovered.read(reader)\n\t\t\t\t|| this._lineReplacementView.isHovered.read(reader)\n\t\t\t\t|| this._insertion.isHovered.read(reader)\n\t\t\t\t|| this._customView.isHovered.read(reader);\n\t\t});\n\t\tthis._gutterIndicatorOffset = derived<number>(this, reader => {\n\t\t\t// TODO: have a better way to tell the gutter indicator view where the edit is inside a viewzone\n\t\t\tif (this._uiState.read(reader)?.state?.kind === 'insertionMultiLine') {\n\t\t\t\treturn this._insertion.startLineOffset.read(reader);\n\t\t\t}\n\n\t\t\tconst ghostTextIndicator = this._ghostTextIndicator.read(reader);\n\t\t\tif (ghostTextIndicator) {\n\t\t\t\treturn getGhostTextTopOffset(ghostTextIndicator, this._editor);\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t});\n\t\tthis._sideBySide = this._register(this._instantiationService.createInstance(InlineEditsSideBySideView,\n\t\t\tthis._editor,\n\t\t\tthis._model.map(m => m?.inlineEdit),\n\t\t\tthis._previewTextModel,\n\t\t\tthis._uiState.map(s => s && s.state?.kind === InlineCompletionViewKind.SideBySide ? ({\n\t\t\t\tnewTextLineCount: s.newTextLineCount,\n\t\t\t\tisInDiffEditor: s.isInDiffEditor,\n\t\t\t}) : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\t\tthis._deletion = this._register(this._instantiationService.createInstance(InlineEditsDeletionView,\n\t\t\tthis._editor,\n\t\t\tthis._model.map(m => m?.inlineEdit),\n\t\t\tthis._uiState.map(s => s && s.state?.kind === InlineCompletionViewKind.Deletion ? ({\n\t\t\t\toriginalRange: s.state.originalRange,\n\t\t\t\tdeletions: s.state.deletions,\n\t\t\t\tinDiffEditor: s.isInDiffEditor,\n\t\t\t}) : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\t\tthis._insertion = this._register(this._instantiationService.createInstance(InlineEditsInsertionView,\n\t\t\tthis._editor,\n\t\t\tthis._uiState.map(s => s && s.state?.kind === InlineCompletionViewKind.InsertionMultiLine ? ({\n\t\t\t\tlineNumber: s.state.lineNumber,\n\t\t\t\tstartColumn: s.state.column,\n\t\t\t\ttext: s.state.text,\n\t\t\t\tinDiffEditor: s.isInDiffEditor,\n\t\t\t}) : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\t\tthis._inlineDiffViewState = derived<IOriginalEditorInlineDiffViewState | undefined>(this, reader => {\n\t\t\tconst e = this._uiState.read(reader);\n\t\t\tif (!e || !e.state) { return undefined; }\n\t\t\tif (e.state.kind === 'wordReplacements' || e.state.kind === 'insertionMultiLine' || e.state.kind === 'collapsed' || e.state.kind === 'custom') {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tmodifiedText: new StringText(e.newText),\n\t\t\t\tdiff: e.diff,\n\t\t\t\tmode: e.state.kind,\n\t\t\t\tmodifiedCodeEditor: this._sideBySide.previewEditor,\n\t\t\t\tisInDiffEditor: e.isInDiffEditor,\n\t\t\t};\n\t\t});\n\t\tthis._inlineCollapsedView = this._register(this._instantiationService.createInstance(InlineEditsCollapsedView,\n\t\t\tthis._editor,\n\t\t\tthis._model.map((m, reader) => this._uiState.read(reader)?.state?.kind === 'collapsed' ? m?.inlineEdit : undefined)\n\t\t));\n\t\tthis._customView = this._register(this._instantiationService.createInstance(InlineEditsCustomView,\n\t\t\tthis._editor,\n\t\t\tthis._model.map((m, reader) => this._uiState.read(reader)?.state?.kind === 'custom' ? m?.displayLocation : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\t\tthis._inlineDiffView = this._register(new OriginalEditorInlineDiffView(this._editor, this._inlineDiffViewState, this._previewTextModel));\n\t\tthis._wordReplacementViews = mapObservableArrayCached(this, this._uiState.map(s => s?.state?.kind === 'wordReplacements' ? s.state.replacements : []), (e, store) => {\n\t\t\treturn store.add(this._instantiationService.createInstance(InlineEditsWordReplacementView, this._editorObs, e, this._tabAction));\n\t\t});\n\t\tthis._lineReplacementView = this._register(this._instantiationService.createInstance(InlineEditsLineReplacementView,\n\t\t\tthis._editorObs,\n\t\t\tthis._uiState.map(s => s?.state?.kind === InlineCompletionViewKind.LineReplacement ? ({\n\t\t\t\toriginalRange: s.state.originalRange,\n\t\t\t\tmodifiedRange: s.state.modifiedRange,\n\t\t\t\tmodifiedLines: s.state.modifiedLines,\n\t\t\t\treplacements: s.state.replacements,\n\t\t\t}) : undefined),\n\t\t\tthis._uiState.map(s => s?.isInDiffEditor ?? false),\n\t\t\tthis._tabAction,\n\t\t));\n\n\t\tthis._useCodeShifting = this._editorObs.getOption(EditorOption.inlineSuggest).map(s => s.edits.allowCodeShifting);\n\t\tthis._renderSideBySide = this._editorObs.getOption(EditorOption.inlineSuggest).map(s => s.edits.renderSideBySide);\n\n\t\tthis._register(autorunWithStore((reader, store) => {\n\t\t\tconst model = this._model.read(reader);\n\t\t\tif (!model) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tstore.add(\n\t\t\t\tEvent.any(\n\t\t\t\t\tthis._sideBySide.onDidClick,\n\t\t\t\t\tthis._deletion.onDidClick,\n\t\t\t\t\tthis._lineReplacementView.onDidClick,\n\t\t\t\t\tthis._insertion.onDidClick,\n\t\t\t\t\t...this._wordReplacementViews.read(reader).map(w => w.onDidClick),\n\t\t\t\t\tthis._inlineDiffView.onDidClick,\n\t\t\t\t\tthis._customView.onDidClick,\n\t\t\t\t)(e => {\n\t\t\t\t\tif (this._viewHasBeenShownLongerThan(350)) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tmodel.accept();\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t);\n\t\t}));\n\n\t\tthis._indicator.recomputeInitiallyAndOnChange(this._store);\n\t\tthis._wordReplacementViews.recomputeInitiallyAndOnChange(this._store);\n\n\t\tthis._indicatorCyclicDependencyCircuitBreaker.set(true, undefined);\n\n\t\tthis._register(this._instantiationService.createInstance(InlineEditsOnboardingExperience, this._host, this._model, this._indicator, this._inlineCollapsedView));\n\n\t\tconst minEditorScrollHeight = derived(this, reader => {\n\t\t\treturn Math.max(\n\t\t\t\t...this._wordReplacementViews.read(reader).map(v => v.minEditorScrollHeight.read(reader)),\n\t\t\t\tthis._lineReplacementView.minEditorScrollHeight.read(reader),\n\t\t\t\tthis._customView.minEditorScrollHeight.read(reader)\n\t\t\t);\n\t\t}).recomputeInitiallyAndOnChange(this._store);\n\n\t\tconst textModel = this._editor.getModel()!;\n\n\t\tlet viewZoneId: string | undefined;\n\t\tthis._register(autorun(reader => {\n\t\t\tconst minScrollHeight = minEditorScrollHeight.read(reader);\n\t\t\tthis._editor.changeViewZones(accessor => {\n\t\t\t\tconst scrollHeight = this._editor.getScrollHeight();\n\t\t\t\tconst viewZoneHeight = minScrollHeight - scrollHeight + 1 /* Add 1px so there is a small gap */;\n\n\t\t\t\tif (viewZoneHeight !== 0 && viewZoneId) {\n\t\t\t\t\taccessor.removeZone(viewZoneId);\n\t\t\t\t\tviewZoneId = undefined;\n\t\t\t\t}\n\n\t\t\t\tif (viewZoneHeight <= 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tviewZoneId = accessor.addZone({\n\t\t\t\t\tafterLineNumber: textModel.getLineCount(),\n\t\t\t\t\theightInPx: viewZoneHeight,\n\t\t\t\t\tdomNode: $('div.minScrollHeightViewZone'),\n\t\t\t\t});\n\t\t\t});\n\t\t}));\n\n\t\tthis._constructorDone.set(true, undefined); // TODO: remove and use correct initialization order\n\t}\n\n\tprivate readonly _constructorDone;\n\n\tprivate readonly _uiState;\n\n\tprivate readonly _previewTextModel;\n\n\tprivate readonly _indicatorCyclicDependencyCircuitBreaker;\n\n\tprotected readonly _indicator;\n\n\tprivate readonly _inlineEditsIsHovered;\n\n\tprivate readonly _gutterIndicatorOffset;\n\n\tprivate readonly _sideBySide;\n\n\tprotected readonly _deletion;\n\n\tprotected readonly _insertion;\n\n\tprivate readonly _inlineDiffViewState;\n\n\tprotected readonly _inlineCollapsedView;\n\n\tprotected readonly _customView;\n\n\tprotected readonly _inlineDiffView;\n\n\tprotected readonly _wordReplacementViews;\n\n\tprotected readonly _lineReplacementView;\n\n\tprivate getCacheId(model: IInlineEditModel) {\n\t\treturn model.inlineEdit.inlineCompletion.identity.id;\n\t}\n\n\tprivate determineView(model: IInlineEditModel, reader: IReader, diff: DetailedLineRangeMapping[], newText: StringText): InlineCompletionViewKind {\n\t\t// Check if we can use the previous view if it is the same InlineCompletion as previously shown\n\t\tconst inlineEdit = model.inlineEdit;\n\t\tconst canUseCache = this._previousView?.id === this.getCacheId(model);\n\t\tconst reconsiderViewEditorWidthChange = this._previousView?.editorWidth !== this._editorObs.layoutInfoWidth.read(reader) &&\n\t\t\t(\n\t\t\t\tthis._previousView?.view === InlineCompletionViewKind.SideBySide ||\n\t\t\t\tthis._previousView?.view === InlineCompletionViewKind.LineReplacement\n\t\t\t);\n\n\t\tif (canUseCache && !reconsiderViewEditorWidthChange) {\n\t\t\treturn this._previousView!.view;\n\t\t}\n\n\t\tif (model.displayLocation) {\n\t\t\treturn InlineCompletionViewKind.Custom;\n\t\t}\n\n\t\t// Determine the view based on the edit / diff\n\n\t\tconst numOriginalLines = inlineEdit.originalLineRange.length;\n\t\tconst numModifiedLines = inlineEdit.modifiedLineRange.length;\n\t\tconst inner = diff.flatMap(d => d.innerChanges ?? []);\n\t\tconst isSingleInnerEdit = inner.length === 1;\n\n\t\tif (!model.isInDiffEditor) {\n\t\t\tif (\n\t\t\t\tisSingleInnerEdit\n\t\t\t\t&& this._useCodeShifting.read(reader) !== 'never'\n\t\t\t\t&& isSingleLineInsertion(diff)\n\t\t\t) {\n\t\t\t\tif (isSingleLineInsertionAfterPosition(diff, inlineEdit.cursorPosition)) {\n\t\t\t\t\treturn InlineCompletionViewKind.InsertionInline;\n\t\t\t\t}\n\n\t\t\t\t// If we have a single line insertion before the cursor position, we do not want to move the cursor by inserting\n\t\t\t\t// the suggestion inline. Use a line replacement view instead. Do not use word replacement view.\n\t\t\t\treturn InlineCompletionViewKind.LineReplacement;\n\t\t\t}\n\n\t\t\tif (isDeletion(inner, inlineEdit, newText)) {\n\t\t\t\treturn InlineCompletionViewKind.Deletion;\n\t\t\t}\n\n\t\t\tif (isSingleMultiLineInsertion(diff) && this._useCodeShifting.read(reader) === 'always') {\n\t\t\t\treturn InlineCompletionViewKind.InsertionMultiLine;\n\t\t\t}\n\n\t\t\tconst allInnerChangesNotTooLong = inner.every(m => TextLength.ofRange(m.originalRange).columnCount < InlineEditsWordReplacementView.MAX_LENGTH && TextLength.ofRange(m.modifiedRange).columnCount < InlineEditsWordReplacementView.MAX_LENGTH);\n\t\t\tif (allInnerChangesNotTooLong && isSingleInnerEdit && numOriginalLines === 1 && numModifiedLines === 1) {\n\t\t\t\t// Do not show indentation changes with word replacement view\n\t\t\t\tconst modifiedText = inner.map(m => newText.getValueOfRange(m.modifiedRange));\n\t\t\t\tconst originalText = inner.map(m => model.inlineEdit.originalText.getValueOfRange(m.originalRange));\n\t\t\t\tif (!modifiedText.some(v => v.includes('\\t')) && !originalText.some(v => v.includes('\\t'))) {\n\t\t\t\t\t// Make sure there is no insertion, even if we grow them\n\t\t\t\t\tif (\n\t\t\t\t\t\t!inner.some(m => m.originalRange.isEmpty()) ||\n\t\t\t\t\t\t!growEditsUntilWhitespace(inner.map(m => new TextReplacement(m.originalRange, '')), inlineEdit.originalText).some(e => e.range.isEmpty() && TextLength.ofRange(e.range).columnCount < InlineEditsWordReplacementView.MAX_LENGTH)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn InlineCompletionViewKind.WordReplacements;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (numOriginalLines > 0 && numModifiedLines > 0) {\n\t\t\tif (numOriginalLines === 1 && numModifiedLines === 1 && !model.isInDiffEditor /* prefer side by side in diff editor */) {\n\t\t\t\treturn InlineCompletionViewKind.LineReplacement;\n\t\t\t}\n\n\t\t\tif (this._renderSideBySide.read(reader) !== 'never' && InlineEditsSideBySideView.fitsInsideViewport(this._editor, this._previewTextModel, inlineEdit, reader)) {\n\t\t\t\treturn InlineCompletionViewKind.SideBySide;\n\t\t\t}\n\n\t\t\treturn InlineCompletionViewKind.LineReplacement;\n\t\t}\n\n\t\tif (model.isInDiffEditor) {\n\t\t\tif (isDeletion(inner, inlineEdit, newText)) {\n\t\t\t\treturn InlineCompletionViewKind.Deletion;\n\t\t\t}\n\n\t\t\tif (isSingleMultiLineInsertion(diff) && this._useCodeShifting.read(reader) === 'always') {\n\t\t\t\treturn InlineCompletionViewKind.InsertionMultiLine;\n\t\t\t}\n\t\t}\n\n\t\treturn InlineCompletionViewKind.SideBySide;\n\t}\n\n\tprivate determineRenderState(model: IInlineEditModel, reader: IReader, diff: DetailedLineRangeMapping[], newText: StringText) {\n\t\tconst inlineEdit = model.inlineEdit;\n\n\t\tlet view = this.determineView(model, reader, diff, newText);\n\n\t\tif (this._willRenderAboveCursor(reader, inlineEdit, view)) {\n\t\t\tswitch (view) {\n\t\t\t\tcase InlineCompletionViewKind.LineReplacement:\n\t\t\t\tcase InlineCompletionViewKind.WordReplacements:\n\t\t\t\t\tview = InlineCompletionViewKind.SideBySide;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tthis._previousView = { id: this.getCacheId(model), view, editorWidth: this._editor.getLayoutInfo().width, timestamp: Date.now() };\n\n\t\tconst inner = diff.flatMap(d => d.innerChanges ?? []);\n\t\tconst textModel = this._editor.getModel()!;\n\t\tconst stringChanges = inner.map(m => ({\n\t\t\toriginalRange: m.originalRange,\n\t\t\tmodifiedRange: m.modifiedRange,\n\t\t\toriginal: textModel.getValueInRange(m.originalRange),\n\t\t\tmodified: newText.getValueOfRange(m.modifiedRange)\n\t\t}));\n\n\t\tconst cursorPosition = inlineEdit.cursorPosition;\n\t\tconst startsWithEOL = stringChanges.length === 0 ? false : stringChanges[0].modified.startsWith(textModel.getEOL());\n\t\tconst viewData: InlineCompletionViewData = {\n\t\t\tcursorColumnDistance: inlineEdit.edit.replacements.length === 0 ? 0 : inlineEdit.edit.replacements[0].range.getStartPosition().column - cursorPosition.column,\n\t\t\tcursorLineDistance: inlineEdit.lineEdit.lineRange.startLineNumber - cursorPosition.lineNumber + (startsWithEOL && inlineEdit.lineEdit.lineRange.startLineNumber >= cursorPosition.lineNumber ? 1 : 0),\n\t\t\tlineCountOriginal: inlineEdit.lineEdit.lineRange.length,\n\t\t\tlineCountModified: inlineEdit.lineEdit.newLines.length,\n\t\t\tcharacterCountOriginal: stringChanges.reduce((acc, r) => acc + r.original.length, 0),\n\t\t\tcharacterCountModified: stringChanges.reduce((acc, r) => acc + r.modified.length, 0),\n\t\t\tdisjointReplacements: stringChanges.length,\n\t\t\tsameShapeReplacements: stringChanges.every(r => r.original === stringChanges[0].original && r.modified === stringChanges[0].modified),\n\t\t};\n\n\t\tswitch (view) {\n\t\t\tcase InlineCompletionViewKind.InsertionInline: return { kind: InlineCompletionViewKind.InsertionInline as const, viewData };\n\t\t\tcase InlineCompletionViewKind.SideBySide: return { kind: InlineCompletionViewKind.SideBySide as const, viewData };\n\t\t\tcase InlineCompletionViewKind.Collapsed: return { kind: InlineCompletionViewKind.Collapsed as const, viewData };\n\t\t\tcase InlineCompletionViewKind.Custom: return { kind: InlineCompletionViewKind.Custom as const, displayLocation: model.displayLocation, viewData };\n\t\t}\n\n\t\tif (view === InlineCompletionViewKind.Deletion) {\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.Deletion as const,\n\t\t\t\toriginalRange: inlineEdit.originalLineRange,\n\t\t\t\tdeletions: inner.map(m => m.originalRange),\n\t\t\t\tviewData,\n\t\t\t};\n\t\t}\n\n\t\tif (view === InlineCompletionViewKind.InsertionMultiLine) {\n\t\t\tconst change = inner[0];\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.InsertionMultiLine as const,\n\t\t\t\tlineNumber: change.originalRange.startLineNumber,\n\t\t\t\tcolumn: change.originalRange.startColumn,\n\t\t\t\ttext: newText.getValueOfRange(change.modifiedRange),\n\t\t\t\tviewData,\n\t\t\t};\n\t\t}\n\n\t\tconst replacements = stringChanges.map(m => new TextReplacement(m.originalRange, m.modified));\n\t\tif (replacements.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (view === InlineCompletionViewKind.WordReplacements) {\n\t\t\tlet grownEdits = growEditsToEntireWord(replacements, inlineEdit.originalText);\n\n\t\t\tif (grownEdits.some(e => e.range.isEmpty())) {\n\t\t\t\tgrownEdits = growEditsUntilWhitespace(replacements, inlineEdit.originalText);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.WordReplacements as const,\n\t\t\t\treplacements: grownEdits,\n\t\t\t\tviewData,\n\t\t\t};\n\t\t}\n\n\t\tif (view === InlineCompletionViewKind.LineReplacement) {\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.LineReplacement as const,\n\t\t\t\toriginalRange: inlineEdit.originalLineRange,\n\t\t\t\tmodifiedRange: inlineEdit.modifiedLineRange,\n\t\t\t\tmodifiedLines: inlineEdit.modifiedLineRange.mapToLineArray(line => newText.getLineAt(line)),\n\t\t\t\treplacements: inner.map(m => ({ originalRange: m.originalRange, modifiedRange: m.modifiedRange })),\n\t\t\t\tviewData,\n\t\t\t};\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tprivate _willRenderAboveCursor(reader: IReader, inlineEdit: InlineEditWithChanges, view: InlineCompletionViewKind): boolean {\n\t\tconst useCodeShifting = this._useCodeShifting.read(reader);\n\t\tif (useCodeShifting === 'always') {\n\t\t\treturn false;\n\t\t}\n\n\t\tfor (const cursorPosition of inlineEdit.multiCursorPositions) {\n\t\t\tif (view === InlineCompletionViewKind.WordReplacements &&\n\t\t\t\tcursorPosition.lineNumber === inlineEdit.originalLineRange.startLineNumber + 1\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (view === InlineCompletionViewKind.LineReplacement &&\n\t\t\t\tcursorPosition.lineNumber >= inlineEdit.originalLineRange.endLineNumberExclusive &&\n\t\t\t\tcursorPosition.lineNumber < inlineEdit.modifiedLineRange.endLineNumberExclusive + inlineEdit.modifiedLineRange.length\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tprivate _viewHasBeenShownLongerThan(durationMs: number): boolean {\n\t\tconst viewCreationTime = this._previousView?.timestamp;\n\t\tif (!viewCreationTime) {\n\t\t\tthrow new BugIndicatingError('viewHasBeenShownLongThan called before a view has been shown');\n\t\t}\n\n\t\tconst currentTime = Date.now();\n\t\treturn (currentTime - viewCreationTime) >= durationMs;\n\t}\n}\n\nfunction isSingleLineInsertion(diff: DetailedLineRangeMapping[]) {\n\treturn diff.every(m => m.innerChanges!.every(r => isWordInsertion(r)));\n\n\tfunction isWordInsertion(r: RangeMapping) {\n\t\tif (!r.originalRange.isEmpty()) {\n\t\t\treturn false;\n\t\t}\n\t\tconst isInsertionWithinLine = r.modifiedRange.startLineNumber === r.modifiedRange.endLineNumber;\n\t\tif (!isInsertionWithinLine) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n}\n\nfunction isSingleLineInsertionAfterPosition(diff: DetailedLineRangeMapping[], position: Position | null) {\n\tif (!position) {\n\t\treturn false;\n\t}\n\n\tif (!isSingleLineInsertion(diff)) {\n\t\treturn false;\n\t}\n\n\tconst pos = position;\n\n\treturn diff.every(m => m.innerChanges!.every(r => isStableWordInsertion(r)));\n\n\tfunction isStableWordInsertion(r: RangeMapping) {\n\t\tconst insertPosition = r.originalRange.getStartPosition();\n\t\tif (pos.isBeforeOrEqual(insertPosition)) {\n\t\t\treturn true;\n\t\t}\n\t\tif (insertPosition.lineNumber < pos.lineNumber) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n}\n\nfunction isSingleMultiLineInsertion(diff: DetailedLineRangeMapping[]) {\n\tconst inner = diff.flatMap(d => d.innerChanges ?? []);\n\tif (inner.length !== 1) {\n\t\treturn false;\n\t}\n\n\tconst change = inner[0];\n\tif (!change.originalRange.isEmpty()) {\n\t\treturn false;\n\t}\n\n\tif (change.modifiedRange.startLineNumber === change.modifiedRange.endLineNumber) {\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nfunction isDeletion(inner: RangeMapping[], inlineEdit: InlineEditWithChanges, newText: StringText) {\n\tconst innerValues = inner.map(m => ({ original: inlineEdit.originalText.getValueOfRange(m.originalRange), modified: newText.getValueOfRange(m.modifiedRange) }));\n\treturn innerValues.every(({ original, modified }) => modified.trim() === '' && original.length > 0 && (original.length > modified.length || original.trim() !== ''));\n}\n\nfunction growEditsToEntireWord(replacements: TextReplacement[], originalText: AbstractText): TextReplacement[] {\n\treturn _growEdits(replacements, originalText, (char) => /^[a-zA-Z]$/.test(char));\n}\n\nfunction growEditsUntilWhitespace(replacements: TextReplacement[], originalText: AbstractText): TextReplacement[] {\n\treturn _growEdits(replacements, originalText, (char) => !(/^\\s$/.test(char)));\n}\n\nfunction _growEdits(replacements: TextReplacement[], originalText: AbstractText, fn: (c: string) => boolean): TextReplacement[] {\n\tconst result: TextReplacement[] = [];\n\n\treplacements.sort((a, b) => Range.compareRangesUsingStarts(a.range, b.range));\n\n\tfor (const edit of replacements) {\n\t\tlet startIndex = edit.range.startColumn - 1;\n\t\tlet endIndex = edit.range.endColumn - 2;\n\t\tlet prefix = '';\n\t\tlet suffix = '';\n\t\tconst startLineContent = originalText.getLineAt(edit.range.startLineNumber);\n\t\tconst endLineContent = originalText.getLineAt(edit.range.endLineNumber);\n\n\t\tif (isIncluded(startLineContent[startIndex])) {\n\t\t\t// grow to the left\n\t\t\twhile (isIncluded(startLineContent[startIndex - 1])) {\n\t\t\t\tprefix = startLineContent[startIndex - 1] + prefix;\n\t\t\t\tstartIndex--;\n\t\t\t}\n\t\t}\n\n\t\tif (isIncluded(endLineContent[endIndex]) || endIndex < startIndex) {\n\t\t\t// grow to the right\n\t\t\twhile (isIncluded(endLineContent[endIndex + 1])) {\n\t\t\t\tsuffix += endLineContent[endIndex + 1];\n\t\t\t\tendIndex++;\n\t\t\t}\n\t\t}\n\n\t\t// create new edit and merge together if they are touching\n\t\tlet newEdit = new TextReplacement(new Range(edit.range.startLineNumber, startIndex + 1, edit.range.endLineNumber, endIndex + 2), prefix + edit.text + suffix);\n\t\tif (result.length > 0 && Range.areIntersectingOrTouching(result[result.length - 1].range, newEdit.range)) {\n\t\t\tnewEdit = TextReplacement.joinReplacements([result.pop()!, newEdit], originalText);\n\t\t}\n\n\t\tresult.push(newEdit);\n\t}\n\n\tfunction isIncluded(c: string | undefined) {\n\t\tif (c === undefined) {\n\t\t\treturn false;\n\t\t}\n\t\treturn fn(c);\n\t}\n\n\treturn result;\n}\n\nfunction getGhostTextTopOffset(ghostTextIndicator: GhostTextIndicator, editor: ICodeEditor): number {\n\tconst replacements = ghostTextIndicator.model.inlineEdit.edit.replacements;\n\tif (replacements.length !== 1) {\n\t\treturn 0;\n\t}\n\n\tconst textModel = editor.getModel();\n\tif (!textModel) {\n\t\treturn 0;\n\t}\n\n\tconst EOL = textModel.getEOL();\n\tconst replacement = replacements[0];\n\tif (replacement.range.isEmpty() && replacement.text.startsWith(EOL)) {\n\t\tconst lineHeight = editor.getLineHeightForPosition(replacement.range.getStartPosition());\n\t\treturn countPrefixRepeats(replacement.text, EOL) * lineHeight;\n\t}\n\n\treturn 0;\n}\n\nfunction countPrefixRepeats(str: string, prefix: string): number {\n\tif (!prefix.length) {\n\t\treturn 0;\n\t}\n\tlet count = 0;\n\tlet i = 0;\n\twhile (str.startsWith(prefix, i)) {\n\t\tcount++;\n\t\ti += prefix.length;\n\t}\n\treturn count;\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { $ } from '../../../../../../base/browser/dom.js';\nimport { equalsIfDefined, itemEquals } from '../../../../../../base/common/equals.js';\nimport { BugIndicatingError } from '../../../../../../base/common/errors.js';\nimport { Event } from '../../../../../../base/common/event.js';\nimport { Disposable } from '../../../../../../base/common/lifecycle.js';\nimport { autorun, autorunWithStore, derived, derivedOpts, IObservable, IReader, ISettableObservable, mapObservableArrayCached, observableValue } from '../../../../../../base/common/observable.js';\nimport { IInstantiationService } from '../../../../../../platform/instantiation/common/instantiation.js';\nimport { ICodeEditor } from '../../../../../browser/editorBrowser.js';\nimport { ObservableCodeEditor, observableCodeEditor } from '../../../../../browser/observableCodeEditor.js';\nimport { EditorOption } from '../../../../../common/config/editorOptions.js';\nimport { TextReplacement } from '../../../../../common/core/edits/textEdit.js';\nimport { Position } from '../../../../../common/core/position.js';\nimport { Range } from '../../../../../common/core/range.js';\nimport { LineRange } from '../../../../../common/core/ranges/lineRange.js';\nimport { AbstractText, StringText } from '../../../../../common/core/text/abstractText.js';\nimport { TextLength } from '../../../../../common/core/text/textLength.js';\nimport { DetailedLineRangeMapping, lineRangeMappingFromRangeMappings, RangeMapping } from '../../../../../common/diff/rangeMapping.js';\nimport { TextModel } from '../../../../../common/model/textModel.js';\nimport { InlineEditsGutterIndicator } from './components/gutterIndicatorView.js';\nimport { InlineEditWithChanges } from './inlineEditWithChanges.js';\nimport { GhostTextIndicator, InlineEditHost, InlineEditModel } from './inlineEditsModel.js';\nimport { InlineEditsOnboardingExperience } from './inlineEditsNewUsers.js';\nimport { IInlineEditModel, InlineCompletionViewData, InlineCompletionViewKind, InlineEditTabAction } from './inlineEditsViewInterface.js';\nimport { InlineEditsCollapsedView } from './inlineEditsViews/inlineEditsCollapsedView.js';\nimport { InlineEditsCustomView } from './inlineEditsViews/inlineEditsCustomView.js';\nimport { InlineEditsDeletionView } from './inlineEditsViews/inlineEditsDeletionView.js';\nimport { InlineEditsInsertionView } from './inlineEditsViews/inlineEditsInsertionView.js';\nimport { InlineEditsLineReplacementView } from './inlineEditsViews/inlineEditsLineReplacementView.js';\nimport { InlineEditsSideBySideView } from './inlineEditsViews/inlineEditsSideBySideView.js';\nimport { InlineEditsWordReplacementView } from './inlineEditsViews/inlineEditsWordReplacementView.js';\nimport { IOriginalEditorInlineDiffViewState, OriginalEditorInlineDiffView } from './inlineEditsViews/originalEditorInlineDiffView.js';\nimport { applyEditToModifiedRangeMappings, createReindentEdit } from './utils/utils.js';\nimport './view.css';\n\n\nexport class InlineEditsView extends Disposable {\n\tprivate readonly _editorObs: ObservableCodeEditor;\n\n\tprivate readonly _useCodeShifting;\n\tprivate readonly _renderSideBySide;\n\n\tprivate readonly _tabAction;\n\n\tprivate _previousView: {\n\t\tid: string;\n\t\tview: ReturnType<typeof InlineEditsView.prototype.determineView>;\n\t\teditorWidth: number;\n\t\ttimestamp: number;\n\t} | undefined;\n\n\tconstructor(\n\t\tprivate readonly _editor: ICodeEditor,\n\t\tprivate readonly _host: IObservable<InlineEditHost | undefined>,\n\t\tprivate readonly _model: IObservable<InlineEditModel | undefined>,\n\t\tprivate readonly _ghostTextIndicator: IObservable<GhostTextIndicator | undefined>,\n\t\tprivate readonly _focusIsInMenu: ISettableObservable<boolean>,\n\t\t@IInstantiationService private readonly _instantiationService: IInstantiationService,\n\t) {\n\t\tsuper();\n\t\tthis._editorObs = observableCodeEditor(this._editor);\n\t\tthis._tabAction = derived<InlineEditTabAction>(reader => this._model.read(reader)?.tabAction.read(reader) ?? InlineEditTabAction.Inactive);\n\t\tthis._constructorDone = observableValue(this, false);\n\t\tthis._uiState = derived<{\n\t\t\tstate: ReturnType<typeof InlineEditsView.prototype.determineRenderState>;\n\t\t\tdiff: DetailedLineRangeMapping[];\n\t\t\tedit: InlineEditWithChanges;\n\t\t\tnewText: string;\n\t\t\tnewTextLineCount: number;\n\t\t\tisInDiffEditor: boolean;\n\t\t} | undefined>(this, reader => {\n\t\t\tconst model = this._model.read(reader);\n\t\t\tif (!model || !this._constructorDone.read(reader)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst inlineEdit = model.inlineEdit;\n\t\t\tlet mappings = RangeMapping.fromEdit(inlineEdit.edit);\n\t\t\tlet newText = inlineEdit.edit.apply(inlineEdit.originalText);\n\t\t\tlet diff = lineRangeMappingFromRangeMappings(mappings, inlineEdit.originalText, new StringText(newText));\n\n\t\t\tlet state = this.determineRenderState(model, reader, diff, new StringText(newText));\n\t\t\tif (!state) {\n\t\t\t\tmodel.abort(`unable to determine view: tried to render ${this._previousView?.view}`);\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tif (state.kind === InlineCompletionViewKind.SideBySide) {\n\t\t\t\tconst indentationAdjustmentEdit = createReindentEdit(newText, inlineEdit.modifiedLineRange, textModel.getOptions().tabSize);\n\t\t\t\tnewText = indentationAdjustmentEdit.applyToString(newText);\n\n\t\t\t\tmappings = applyEditToModifiedRangeMappings(mappings, indentationAdjustmentEdit);\n\t\t\t\tdiff = lineRangeMappingFromRangeMappings(mappings, inlineEdit.originalText, new StringText(newText));\n\t\t\t}\n\n\t\t\tthis._previewTextModel.setLanguage(this._editor.getModel()!.getLanguageId());\n\n\t\t\tconst previousNewText = this._previewTextModel.getValue();\n\t\t\tif (previousNewText !== newText) {\n\t\t\t\t// Only update the model if the text has changed to avoid flickering\n\t\t\t\tthis._previewTextModel.setValue(newText);\n\t\t\t}\n\n\t\t\tif (model.showCollapsed.read(reader) && !this._indicator.read(reader)?.isHoverVisible.read(reader)) {\n\t\t\t\tstate = { kind: InlineCompletionViewKind.Collapsed as const, viewData: state.viewData };\n\t\t\t}\n\n\t\t\tmodel.handleInlineEditShown(state.kind, state.viewData);\n\n\t\t\treturn {\n\t\t\t\tstate,\n\t\t\t\tdiff,\n\t\t\t\tedit: inlineEdit,\n\t\t\t\tnewText,\n\t\t\t\tnewTextLineCount: inlineEdit.modifiedLineRange.length,\n\t\t\t\tisInDiffEditor: model.isInDiffEditor,\n\t\t\t};\n\t\t});\n\t\tthis._previewTextModel = this._register(this._instantiationService.createInstance(\n\t\t\tTextModel,\n\t\t\t'',\n\t\t\tthis._editor.getModel()!.getLanguageId(),\n\t\t\t{ ...TextModel.DEFAULT_CREATION_OPTIONS, bracketPairColorizationOptions: { enabled: true, independentColorPoolPerBracketType: false } },\n\t\t\tnull\n\t\t));\n\t\tthis._indicatorCyclicDependencyCircuitBreaker = observableValue(this, false);\n\t\tthis._indicator = derived<InlineEditsGutterIndicator | undefined>(this, (reader) => {\n\t\t\tif (!this._indicatorCyclicDependencyCircuitBreaker.read(reader)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst indicatorDisplayRange = derivedOpts({ owner: this, equalsFn: equalsIfDefined(itemEquals()) }, reader => {\n\t\t\t\t/** @description indicatorDisplayRange */\n\t\t\t\tconst ghostTextIndicator = this._ghostTextIndicator.read(reader);\n\t\t\t\tif (ghostTextIndicator) {\n\t\t\t\t\treturn ghostTextIndicator.lineRange;\n\t\t\t\t}\n\n\t\t\t\tconst state = this._uiState.read(reader);\n\t\t\t\tif (!state) { return undefined; }\n\n\t\t\t\tif (state.state?.kind === 'custom') {\n\t\t\t\t\tconst range = state.state.displayLocation?.range;\n\t\t\t\t\tif (!range) {\n\t\t\t\t\t\tthrow new BugIndicatingError('custom view should have a range');\n\t\t\t\t\t}\n\t\t\t\t\treturn new LineRange(range.startLineNumber, range.endLineNumber);\n\t\t\t\t}\n\n\t\t\t\tif (state.state?.kind === 'insertionMultiLine') {\n\t\t\t\t\treturn this._insertion.originalLines.read(reader);\n\t\t\t\t}\n\n\t\t\t\treturn state.edit.displayRange;\n\t\t\t});\n\n\t\t\tconst modelWithGhostTextSupport = derived<InlineEditModel | undefined>(this, reader => {\n\t\t\t\t/** @description modelWithGhostTextSupport */\n\t\t\t\tconst model = this._model.read(reader);\n\t\t\t\tif (model) {\n\t\t\t\t\treturn model;\n\t\t\t\t}\n\n\t\t\t\tconst ghostTextIndicator = this._ghostTextIndicator.read(reader);\n\t\t\t\tif (ghostTextIndicator) {\n\t\t\t\t\treturn ghostTextIndicator.model;\n\t\t\t\t}\n\n\t\t\t\treturn model;\n\t\t\t});\n\n\t\t\treturn reader.store.add(this._instantiationService.createInstance(\n\t\t\t\tInlineEditsGutterIndicator,\n\t\t\t\tthis._editorObs,\n\t\t\t\tindicatorDisplayRange,\n\t\t\t\tthis._gutterIndicatorOffset,\n\t\t\t\tmodelWithGhostTextSupport,\n\t\t\t\tthis._inlineEditsIsHovered,\n\t\t\t\tthis._focusIsInMenu,\n\t\t\t));\n\t\t});\n\t\tthis._inlineEditsIsHovered = derived(this, reader => {\n\t\t\treturn this._sideBySide.isHovered.read(reader)\n\t\t\t\t|| this._wordReplacementViews.read(reader).some(v => v.isHovered.read(reader))\n\t\t\t\t|| this._deletion.isHovered.read(reader)\n\t\t\t\t|| this._inlineDiffView.isHovered.read(reader)\n\t\t\t\t|| this._lineReplacementView.isHovered.read(reader)\n\t\t\t\t|| this._insertion.isHovered.read(reader)\n\t\t\t\t|| this._customView.isHovered.read(reader);\n\t\t});\n\t\tthis._gutterIndicatorOffset = derived<number>(this, reader => {\n\t\t\t// TODO: have a better way to tell the gutter indicator view where the edit is inside a viewzone\n\t\t\tif (this._uiState.read(reader)?.state?.kind === 'insertionMultiLine') {\n\t\t\t\treturn this._insertion.startLineOffset.read(reader);\n\t\t\t}\n\n\t\t\tconst ghostTextIndicator = this._ghostTextIndicator.read(reader);\n\t\t\tif (ghostTextIndicator) {\n\t\t\t\treturn getGhostTextTopOffset(ghostTextIndicator, this._editor);\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t});\n\t\tthis._sideBySide = this._register(this._instantiationService.createInstance(InlineEditsSideBySideView,\n\t\t\tthis._editor,\n\t\t\tthis._model.map(m => m?.inlineEdit),\n\t\t\tthis._previewTextModel,\n\t\t\tthis._uiState.map(s => s && s.state?.kind === InlineCompletionViewKind.SideBySide ? ({\n\t\t\t\tnewTextLineCount: s.newTextLineCount,\n\t\t\t\tisInDiffEditor: s.isInDiffEditor,\n\t\t\t}) : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\t\tthis._deletion = this._register(this._instantiationService.createInstance(InlineEditsDeletionView,\n\t\t\tthis._editor,\n\t\t\tthis._model.map(m => m?.inlineEdit),\n\t\t\tthis._uiState.map(s => s && s.state?.kind === InlineCompletionViewKind.Deletion ? ({\n\t\t\t\toriginalRange: s.state.originalRange,\n\t\t\t\tdeletions: s.state.deletions,\n\t\t\t\tinDiffEditor: s.isInDiffEditor,\n\t\t\t}) : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\t\tthis._insertion = this._register(this._instantiationService.createInstance(InlineEditsInsertionView,\n\t\t\tthis._editor,\n\t\t\tthis._uiState.map(s => s && s.state?.kind === InlineCompletionViewKind.InsertionMultiLine ? ({\n\t\t\t\tlineNumber: s.state.lineNumber,\n\t\t\t\tstartColumn: s.state.column,\n\t\t\t\ttext: s.state.text,\n\t\t\t\tinDiffEditor: s.isInDiffEditor,\n\t\t\t}) : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\t\tthis._inlineDiffViewState = derived<IOriginalEditorInlineDiffViewState | undefined>(this, reader => {\n\t\t\tconst e = this._uiState.read(reader);\n\t\t\tif (!e || !e.state) { return undefined; }\n\t\t\tif (e.state.kind === 'wordReplacements' || e.state.kind === 'insertionMultiLine' || e.state.kind === 'collapsed' || e.state.kind === 'custom') {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tmodifiedText: new StringText(e.newText),\n\t\t\t\tdiff: e.diff,\n\t\t\t\tmode: e.state.kind,\n\t\t\t\tmodifiedCodeEditor: this._sideBySide.previewEditor,\n\t\t\t\tisInDiffEditor: e.isInDiffEditor,\n\t\t\t};\n\t\t});\n\t\tthis._inlineCollapsedView = this._register(this._instantiationService.createInstance(InlineEditsCollapsedView,\n\t\t\tthis._editor,\n\t\t\tthis._model.map((m, reader) => this._uiState.read(reader)?.state?.kind === 'collapsed' ? m?.inlineEdit : undefined)\n\t\t));\n\t\tthis._customView = this._register(this._instantiationService.createInstance(InlineEditsCustomView,\n\t\t\tthis._editor,\n\t\t\tthis._model.map((m, reader) => this._uiState.read(reader)?.state?.kind === 'custom' ? m?.displayLocation : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\t\tthis._inlineDiffView = this._register(new OriginalEditorInlineDiffView(this._editor, this._inlineDiffViewState, this._previewTextModel));\n\t\tthis._wordReplacementViews = mapObservableArrayCached(this, this._uiState.map(s => s?.state?.kind === 'wordReplacements' ? s.state.replacements : []), (e, store) => {\n\t\t\treturn store.add(this._instantiationService.createInstance(InlineEditsWordReplacementView, this._editorObs, e, this._tabAction));\n\t\t});\n\t\tthis._lineReplacementView = this._register(this._instantiationService.createInstance(InlineEditsLineReplacementView,\n\t\t\tthis._editorObs,\n\t\t\tthis._uiState.map(s => s?.state?.kind === InlineCompletionViewKind.LineReplacement ? ({\n\t\t\t\toriginalRange: s.state.originalRange,\n\t\t\t\tmodifiedRange: s.state.modifiedRange,\n\t\t\t\tmodifiedLines: s.state.modifiedLines,\n\t\t\t\treplacements: s.state.replacements,\n\t\t\t}) : undefined),\n\t\t\tthis._uiState.map(s => s?.isInDiffEditor ?? false),\n\t\t\tthis._tabAction,\n\t\t));\n\n\t\tthis._useCodeShifting = this._editorObs.getOption(EditorOption.inlineSuggest).map(s => s.edits.allowCodeShifting);\n\t\tthis._renderSideBySide = this._editorObs.getOption(EditorOption.inlineSuggest).map(s => s.edits.renderSideBySide);\n\n\t\tthis._register(autorunWithStore((reader, store) => {\n\t\t\tconst model = this._model.read(reader);\n\t\t\tif (!model) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tstore.add(\n\t\t\t\tEvent.any(\n\t\t\t\t\tthis._sideBySide.onDidClick,\n\t\t\t\t\tthis._deletion.onDidClick,\n\t\t\t\t\tthis._lineReplacementView.onDidClick,\n\t\t\t\t\tthis._insertion.onDidClick,\n\t\t\t\t\t...this._wordReplacementViews.read(reader).map(w => w.onDidClick),\n\t\t\t\t\tthis._inlineDiffView.onDidClick,\n\t\t\t\t\tthis._customView.onDidClick,\n\t\t\t\t)(e => {\n\t\t\t\t\tif (this._viewHasBeenShownLongerThan(350)) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tmodel.accept();\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t);\n\t\t}));\n\n\t\tthis._indicator.recomputeInitiallyAndOnChange(this._store);\n\t\tthis._wordReplacementViews.recomputeInitiallyAndOnChange(this._store);\n\n\t\tthis._indicatorCyclicDependencyCircuitBreaker.set(true, undefined);\n\n\t\tthis._register(this._instantiationService.createInstance(InlineEditsOnboardingExperience, this._host, this._model, this._indicator, this._inlineCollapsedView));\n\n\t\tconst minEditorScrollHeight = derived(this, reader => {\n\t\t\treturn Math.max(\n\t\t\t\t...this._wordReplacementViews.read(reader).map(v => v.minEditorScrollHeight.read(reader)),\n\t\t\t\tthis._lineReplacementView.minEditorScrollHeight.read(reader),\n\t\t\t\tthis._customView.minEditorScrollHeight.read(reader)\n\t\t\t);\n\t\t}).recomputeInitiallyAndOnChange(this._store);\n\n\t\tconst textModel = this._editor.getModel()!;\n\n\t\tlet viewZoneId: string | undefined;\n\t\tthis._register(autorun(reader => {\n\t\t\tconst minScrollHeight = minEditorScrollHeight.read(reader);\n\t\t\tthis._editor.changeViewZones(accessor => {\n\t\t\t\tconst scrollHeight = this._editor.getScrollHeight();\n\t\t\t\tconst viewZoneHeight = minScrollHeight - scrollHeight + 1 /* Add 1px so there is a small gap */;\n\n\t\t\t\tif (viewZoneHeight !== 0 && viewZoneId) {\n\t\t\t\t\taccessor.removeZone(viewZoneId);\n\t\t\t\t\tviewZoneId = undefined;\n\t\t\t\t}\n\n\t\t\t\tif (viewZoneHeight <= 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tviewZoneId = accessor.addZone({\n\t\t\t\t\tafterLineNumber: textModel.getLineCount(),\n\t\t\t\t\theightInPx: viewZoneHeight,\n\t\t\t\t\tdomNode: $('div.minScrollHeightViewZone'),\n\t\t\t\t});\n\t\t\t});\n\t\t}));\n\n\t\tthis._constructorDone.set(true, undefined); // TODO: remove and use correct initialization order\n\t}\n\n\tprivate readonly _constructorDone;\n\n\tprivate readonly _uiState;\n\n\tprivate readonly _previewTextModel;\n\n\tprivate readonly _indicatorCyclicDependencyCircuitBreaker;\n\n\tprotected readonly _indicator;\n\n\tprivate readonly _inlineEditsIsHovered;\n\n\tprivate readonly _gutterIndicatorOffset;\n\n\tprivate readonly _sideBySide;\n\n\tprotected readonly _deletion;\n\n\tprotected readonly _insertion;\n\n\tprivate readonly _inlineDiffViewState;\n\n\tprotected readonly _inlineCollapsedView;\n\n\tprotected readonly _customView;\n\n\tprotected readonly _inlineDiffView;\n\n\tprotected readonly _wordReplacementViews;\n\n\tprotected readonly _lineReplacementView;\n\n\tprivate getCacheId(model: IInlineEditModel) {\n\t\treturn model.inlineEdit.inlineCompletion.identity.id;\n\t}\n\n\tprivate determineView(model: IInlineEditModel, reader: IReader, diff: DetailedLineRangeMapping[], newText: StringText): InlineCompletionViewKind {\n\t\t// Check if we can use the previous view if it is the same InlineCompletion as previously shown\n\t\tconst inlineEdit = model.inlineEdit;\n\t\tconst canUseCache = this._previousView?.id === this.getCacheId(model);\n\t\tconst reconsiderViewEditorWidthChange = this._previousView?.editorWidth !== this._editorObs.layoutInfoWidth.read(reader) &&\n\t\t\t(\n\t\t\t\tthis._previousView?.view === InlineCompletionViewKind.SideBySide ||\n\t\t\t\tthis._previousView?.view === InlineCompletionViewKind.LineReplacement\n\t\t\t);\n\n\t\tif (canUseCache && !reconsiderViewEditorWidthChange) {\n\t\t\treturn this._previousView!.view;\n\t\t}\n\n\t\tif (model.displayLocation) {\n\t\t\treturn InlineCompletionViewKind.Custom;\n\t\t}\n\n\t\t// Determine the view based on the edit / diff\n\n\t\tconst numOriginalLines = inlineEdit.originalLineRange.length;\n\t\tconst numModifiedLines = inlineEdit.modifiedLineRange.length;\n\t\tconst inner = diff.flatMap(d => d.innerChanges ?? []);\n\t\tconst isSingleInnerEdit = inner.length === 1;\n\n\t\tif (!model.isInDiffEditor) {\n\t\t\tif (\n\t\t\t\tisSingleInnerEdit\n\t\t\t\t&& this._useCodeShifting.read(reader) !== 'never'\n\t\t\t\t&& isSingleLineInsertion(diff)\n\t\t\t) {\n\t\t\t\tif (isSingleLineInsertionAfterPosition(diff, inlineEdit.cursorPosition)) {\n\t\t\t\t\treturn InlineCompletionViewKind.InsertionInline;\n\t\t\t\t}\n\n\t\t\t\t// If we have a single line insertion before the cursor position, we do not want to move the cursor by inserting\n\t\t\t\t// the suggestion inline. Use a line replacement view instead. Do not use word replacement view.\n\t\t\t\treturn InlineCompletionViewKind.LineReplacement;\n\t\t\t}\n\n\t\t\tif (isDeletion(inner, inlineEdit, newText)) {\n\t\t\t\treturn InlineCompletionViewKind.Deletion;\n\t\t\t}\n\n\t\t\tif (isSingleMultiLineInsertion(diff) && this._useCodeShifting.read(reader) === 'always') {\n\t\t\t\treturn InlineCompletionViewKind.InsertionMultiLine;\n\t\t\t}\n\n\t\t\tconst allInnerChangesNotTooLong = inner.every(m => TextLength.ofRange(m.originalRange).columnCount < InlineEditsWordReplacementView.MAX_LENGTH && TextLength.ofRange(m.modifiedRange).columnCount < InlineEditsWordReplacementView.MAX_LENGTH);\n\t\t\tif (allInnerChangesNotTooLong && isSingleInnerEdit && numOriginalLines === 1 && numModifiedLines === 1) {\n\t\t\t\t// Do not show indentation changes with word replacement view\n\t\t\t\tconst modifiedText = inner.map(m => newText.getValueOfRange(m.modifiedRange));\n\t\t\t\tconst originalText = inner.map(m => model.inlineEdit.originalText.getValueOfRange(m.originalRange));\n\t\t\t\tif (!modifiedText.some(v => v.includes('\\t')) && !originalText.some(v => v.includes('\\t'))) {\n\t\t\t\t\t// Make sure there is no insertion, even if we grow them\n\t\t\t\t\tif (\n\t\t\t\t\t\t!inner.some(m => m.originalRange.isEmpty()) ||\n\t\t\t\t\t\t!growEditsUntilWhitespace(inner.map(m => new TextReplacement(m.originalRange, '')), inlineEdit.originalText).some(e => e.range.isEmpty() && TextLength.ofRange(e.range).columnCount < InlineEditsWordReplacementView.MAX_LENGTH)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn InlineCompletionViewKind.WordReplacements;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (numOriginalLines > 0 && numModifiedLines > 0) {\n\t\t\tif (numOriginalLines === 1 && numModifiedLines === 1 && !model.isInDiffEditor /* prefer side by side in diff editor */) {\n\t\t\t\treturn InlineCompletionViewKind.LineReplacement;\n\t\t\t}\n\n\t\t\tif (this._renderSideBySide.read(reader) !== 'never' && InlineEditsSideBySideView.fitsInsideViewport(this._editor, this._previewTextModel, inlineEdit, reader)) {\n\t\t\t\treturn InlineCompletionViewKind.SideBySide;\n\t\t\t}\n\n\t\t\treturn InlineCompletionViewKind.LineReplacement;\n\t\t}\n\n\t\tif (model.isInDiffEditor) {\n\t\t\tif (isDeletion(inner, inlineEdit, newText)) {\n\t\t\t\treturn InlineCompletionViewKind.Deletion;\n\t\t\t}\n\n\t\t\tif (isSingleMultiLineInsertion(diff) && this._useCodeShifting.read(reader) === 'always') {\n\t\t\t\treturn InlineCompletionViewKind.InsertionMultiLine;\n\t\t\t}\n\t\t}\n\n\t\treturn InlineCompletionViewKind.SideBySide;\n\t}\n\n\tprivate determineRenderState(model: IInlineEditModel, reader: IReader, diff: DetailedLineRangeMapping[], newText: StringText) {\n\t\tconst inlineEdit = model.inlineEdit;\n\n\t\tlet view = this.determineView(model, reader, diff, newText);\n\n\t\tif (this._willRenderAboveCursor(reader, inlineEdit, view)) {\n\t\t\tswitch (view) {\n\t\t\t\tcase InlineCompletionViewKind.LineReplacement:\n\t\t\t\tcase InlineCompletionViewKind.WordReplacements:\n\t\t\t\t\tview = InlineCompletionViewKind.SideBySide;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tthis._previousView = { id: this.getCacheId(model), view, editorWidth: this._editor.getLayoutInfo().width, timestamp: Date.now() };\n\n\t\tconst inner = diff.flatMap(d => d.innerChanges ?? []);\n\t\tconst textModel = this._editor.getModel()!;\n\t\tconst stringChanges = inner.map(m => ({\n\t\t\toriginalRange: m.originalRange,\n\t\t\tmodifiedRange: m.modifiedRange,\n\t\t\toriginal: textModel.getValueInRange(m.originalRange),\n\t\t\tmodified: newText.getValueOfRange(m.modifiedRange)\n\t\t}));\n\n\t\tconst cursorPosition = inlineEdit.cursorPosition;\n\t\tconst startsWithEOL = stringChanges.length === 0 ? false : stringChanges[0].modified.startsWith(textModel.getEOL());\n\t\tconst viewData: InlineCompletionViewData = {\n\t\t\tcursorColumnDistance: inlineEdit.edit.replacements.length === 0 ? 0 : inlineEdit.edit.replacements[0].range.getStartPosition().column - cursorPosition.column,\n\t\t\tcursorLineDistance: inlineEdit.lineEdit.lineRange.startLineNumber - cursorPosition.lineNumber + (startsWithEOL && inlineEdit.lineEdit.lineRange.startLineNumber >= cursorPosition.lineNumber ? 1 : 0),\n\t\t\tlineCountOriginal: inlineEdit.lineEdit.lineRange.length,\n\t\t\tlineCountModified: inlineEdit.lineEdit.newLines.length,\n\t\t\tcharacterCountOriginal: stringChanges.reduce((acc, r) => acc + r.original.length, 0),\n\t\t\tcharacterCountModified: stringChanges.reduce((acc, r) => acc + r.modified.length, 0),\n\t\t\tdisjointReplacements: stringChanges.length,\n\t\t\tsameShapeReplacements: stringChanges.every(r => r.original === stringChanges[0].original && r.modified === stringChanges[0].modified),\n\t\t};\n\n\t\tswitch (view) {\n\t\t\tcase InlineCompletionViewKind.InsertionInline: return { kind: InlineCompletionViewKind.InsertionInline as const, viewData };\n\t\t\tcase InlineCompletionViewKind.SideBySide: return { kind: InlineCompletionViewKind.SideBySide as const, viewData };\n\t\t\tcase InlineCompletionViewKind.Collapsed: return { kind: InlineCompletionViewKind.Collapsed as const, viewData };\n\t\t\tcase InlineCompletionViewKind.Custom: return { kind: InlineCompletionViewKind.Custom as const, displayLocation: model.displayLocation, viewData };\n\t\t}\n\n\t\tif (view === InlineCompletionViewKind.Deletion) {\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.Deletion as const,\n\t\t\t\toriginalRange: inlineEdit.originalLineRange,\n\t\t\t\tdeletions: inner.map(m => m.originalRange),\n\t\t\t\tviewData,\n\t\t\t};\n\t\t}\n\n\t\tif (view === InlineCompletionViewKind.InsertionMultiLine) {\n\t\t\tconst change = inner[0];\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.InsertionMultiLine as const,\n\t\t\t\tlineNumber: change.originalRange.startLineNumber,\n\t\t\t\tcolumn: change.originalRange.startColumn,\n\t\t\t\ttext: newText.getValueOfRange(change.modifiedRange),\n\t\t\t\tviewData,\n\t\t\t};\n\t\t}\n\n\t\tconst replacements = stringChanges.map(m => new TextReplacement(m.originalRange, m.modified));\n\t\tif (replacements.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (view === InlineCompletionViewKind.WordReplacements) {\n\t\t\tlet grownEdits = growEditsToEntireWord(replacements, inlineEdit.originalText);\n\n\t\t\tif (grownEdits.some(e => e.range.isEmpty())) {\n\t\t\t\tgrownEdits = growEditsUntilWhitespace(replacements, inlineEdit.originalText);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.WordReplacements as const,\n\t\t\t\treplacements: grownEdits,\n\t\t\t\tviewData,\n\t\t\t};\n\t\t}\n\n\t\tif (view === InlineCompletionViewKind.LineReplacement) {\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.LineReplacement as const,\n\t\t\t\toriginalRange: inlineEdit.originalLineRange,\n\t\t\t\tmodifiedRange: inlineEdit.modifiedLineRange,\n\t\t\t\tmodifiedLines: inlineEdit.modifiedLineRange.mapToLineArray(line => newText.getLineAt(line)),\n\t\t\t\treplacements: inner.map(m => ({ originalRange: m.originalRange, modifiedRange: m.modifiedRange })),\n\t\t\t\tviewData,\n\t\t\t};\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tprivate _willRenderAboveCursor(reader: IReader, inlineEdit: InlineEditWithChanges, view: InlineCompletionViewKind): boolean {\n\t\tconst useCodeShifting = this._useCodeShifting.read(reader);\n\t\tif (useCodeShifting === 'always') {\n\t\t\treturn false;\n\t\t}\n\n\t\tfor (const cursorPosition of inlineEdit.multiCursorPositions) {\n\t\t\tif (view === InlineCompletionViewKind.WordReplacements &&\n\t\t\t\tcursorPosition.lineNumber === inlineEdit.originalLineRange.startLineNumber + 1\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (view === InlineCompletionViewKind.LineReplacement &&\n\t\t\t\tcursorPosition.lineNumber >= inlineEdit.originalLineRange.endLineNumberExclusive &&\n\t\t\t\tcursorPosition.lineNumber < inlineEdit.modifiedLineRange.endLineNumberExclusive + inlineEdit.modifiedLineRange.length\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tprivate _viewHasBeenShownLongerThan(durationMs: number): boolean {\n\t\tconst viewCreationTime = this._previousView?.timestamp;\n\t\tif (!viewCreationTime) {\n\t\t\tthrow new BugIndicatingError('viewHasBeenShownLongThan called before a view has been shown');\n\t\t}\n\n\t\tconst currentTime = Date.now();\n\t\treturn (currentTime - viewCreationTime) >= durationMs;\n\t}\n}\n\nfunction isSingleLineInsertion(diff: DetailedLineRangeMapping[]) {\n\treturn diff.every(m => m.innerChanges!.every(r => isWordInsertion(r)));\n\n\tfunction isWordInsertion(r: RangeMapping) {\n\t\tif (!r.originalRange.isEmpty()) {\n\t\t\treturn false;\n\t\t}\n\t\tconst isInsertionWithinLine = r.modifiedRange.startLineNumber === r.modifiedRange.endLineNumber;\n\t\tif (!isInsertionWithinLine) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n}\n\nfunction isSingleLineInsertionAfterPosition(diff: DetailedLineRangeMapping[], position: Position | null) {\n\tif (!position) {\n\t\treturn false;\n\t}\n\n\tif (!isSingleLineInsertion(diff)) {\n\t\treturn false;\n\t}\n\n\tconst pos = position;\n\n\treturn diff.every(m => m.innerChanges!.every(r => isStableWordInsertion(r)));\n\n\tfunction isStableWordInsertion(r: RangeMapping) {\n\t\tconst insertPosition = r.originalRange.getStartPosition();\n\t\tif (pos.isBeforeOrEqual(insertPosition)) {\n\t\t\treturn true;\n\t\t}\n\t\tif (insertPosition.lineNumber < pos.lineNumber) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n}\n\nfunction isSingleMultiLineInsertion(diff: DetailedLineRangeMapping[]) {\n\tconst inner = diff.flatMap(d => d.innerChanges ?? []);\n\tif (inner.length !== 1) {\n\t\treturn false;\n\t}\n\n\tconst change = inner[0];\n\tif (!change.originalRange.isEmpty()) {\n\t\treturn false;\n\t}\n\n\tif (change.modifiedRange.startLineNumber === change.modifiedRange.endLineNumber) {\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nfunction isDeletion(inner: RangeMapping[], inlineEdit: InlineEditWithChanges, newText: StringText) {\n\tconst innerValues = inner.map(m => ({ original: inlineEdit.originalText.getValueOfRange(m.originalRange), modified: newText.getValueOfRange(m.modifiedRange) }));\n\treturn innerValues.every(({ original, modified }) => modified.trim() === '' && original.length > 0 && (original.length > modified.length || original.trim() !== ''));\n}\n\nfunction growEditsToEntireWord(replacements: TextReplacement[], originalText: AbstractText): TextReplacement[] {\n\treturn _growEdits(replacements, originalText, (char) => /^[a-zA-Z]$/.test(char));\n}\n\nfunction growEditsUntilWhitespace(replacements: TextReplacement[], originalText: AbstractText): TextReplacement[] {\n\treturn _growEdits(replacements, originalText, (char) => !(/^\\s$/.test(char)));\n}\n\nfunction _growEdits(replacements: TextReplacement[], originalText: AbstractText, fn: (c: string) => boolean): TextReplacement[] {\n\tconst result: TextReplacement[] = [];\n\n\treplacements.sort((a, b) => Range.compareRangesUsingStarts(a.range, b.range));\n\n\tfor (const edit of replacements) {\n\t\tlet startIndex = edit.range.startColumn - 1;\n\t\tlet endIndex = edit.range.endColumn - 2;\n\t\tlet prefix = '';\n\t\tlet suffix = '';\n\t\tconst startLineContent = originalText.getLineAt(edit.range.startLineNumber);\n\t\tconst endLineContent = originalText.getLineAt(edit.range.endLineNumber);\n\n\t\tif (isIncluded(startLineContent[startIndex])) {\n\t\t\t// grow to the left\n\t\t\twhile (isIncluded(startLineContent[startIndex - 1])) {\n\t\t\t\tprefix = startLineContent[startIndex - 1] + prefix;\n\t\t\t\tstartIndex--;\n\t\t\t}\n\t\t}\n\n\t\tif (isIncluded(endLineContent[endIndex]) || endIndex < startIndex) {\n\t\t\t// grow to the right\n\t\t\twhile (isIncluded(endLineContent[endIndex + 1])) {\n\t\t\t\tsuffix += endLineContent[endIndex + 1];\n\t\t\t\tendIndex++;\n\t\t\t}\n\t\t}\n\n\t\t// create new edit and merge together if they are touching\n\t\tlet newEdit = new TextReplacement(new Range(edit.range.startLineNumber, startIndex + 1, edit.range.endLineNumber, endIndex + 2), prefix + edit.text + suffix);\n\t\tif (result.length > 0 && Range.areIntersectingOrTouching(result[result.length - 1].range, newEdit.range)) {\n\t\t\tnewEdit = TextReplacement.joinReplacements([result.pop()!, newEdit], originalText);\n\t\t}\n\n\t\tresult.push(newEdit);\n\t}\n\n\tfunction isIncluded(c: string | undefined) {\n\t\tif (c === undefined) {\n\t\t\treturn false;\n\t\t}\n\t\treturn fn(c);\n\t}\n\n\treturn result;\n}\n\nfunction getGhostTextTopOffset(ghostTextIndicator: GhostTextIndicator, editor: ICodeEditor): number {\n\tconst replacements = ghostTextIndicator.model.inlineEdit.edit.replacements;\n\tif (replacements.length !== 1) {\n\t\treturn 0;\n\t}\n\n\tconst textModel = editor.getModel();\n\tif (!textModel) {\n\t\treturn 0;\n\t}\n\n\tconst EOL = textModel.getEOL();\n\tconst replacement = replacements[0];\n\tif (replacement.range.isEmpty() && replacement.text.startsWith(EOL)) {\n\t\tconst lineHeight = editor.getLineHeightForPosition(replacement.range.getStartPosition());\n\t\treturn countPrefixRepeats(replacement.text, EOL) * lineHeight;\n\t}\n\n\treturn 0;\n}\n\nfunction countPrefixRepeats(str: string, prefix: string): number {\n\tif (!prefix.length) {\n\t\treturn 0;\n\t}\n\tlet count = 0;\n\tlet i = 0;\n\twhile (str.startsWith(prefix, i)) {\n\t\tcount++;\n\t\ti += prefix.length;\n\t}\n\treturn count;\n}\n"]}
@@ -8,63 +8,63 @@ import { localize } from '../../../../../../nls.js';
8
8
  import { buttonBackground, buttonForeground, buttonSecondaryBackground, buttonSecondaryForeground, diffInserted, diffInsertedLine, diffRemoved, editorBackground } from '../../../../../../platform/theme/common/colorRegistry.js';
9
9
  import { darken, registerColor, transparent } from '../../../../../../platform/theme/common/colorUtils.js';
10
10
  import { InlineEditTabAction } from './inlineEditsViewInterface.js';
11
- export const originalBackgroundColor = registerColor('inlineEdit.originalBackground', transparent(diffRemoved, 0.2), localize(1212, 'Background color for the original text in inline edits.'), true);
12
- export const modifiedBackgroundColor = registerColor('inlineEdit.modifiedBackground', transparent(diffInserted, 0.3), localize(1213, 'Background color for the modified text in inline edits.'), true);
13
- export const originalChangedLineBackgroundColor = registerColor('inlineEdit.originalChangedLineBackground', transparent(diffRemoved, 0.8), localize(1214, 'Background color for the changed lines in the original text of inline edits.'), true);
14
- export const originalChangedTextOverlayColor = registerColor('inlineEdit.originalChangedTextBackground', transparent(diffRemoved, 0.8), localize(1215, 'Overlay color for the changed text in the original text of inline edits.'), true);
11
+ export const originalBackgroundColor = registerColor('inlineEdit.originalBackground', transparent(diffRemoved, 0.2), localize(1218, 'Background color for the original text in inline edits.'), true);
12
+ export const modifiedBackgroundColor = registerColor('inlineEdit.modifiedBackground', transparent(diffInserted, 0.3), localize(1219, 'Background color for the modified text in inline edits.'), true);
13
+ export const originalChangedLineBackgroundColor = registerColor('inlineEdit.originalChangedLineBackground', transparent(diffRemoved, 0.8), localize(1220, 'Background color for the changed lines in the original text of inline edits.'), true);
14
+ export const originalChangedTextOverlayColor = registerColor('inlineEdit.originalChangedTextBackground', transparent(diffRemoved, 0.8), localize(1221, 'Overlay color for the changed text in the original text of inline edits.'), true);
15
15
  export const modifiedChangedLineBackgroundColor = registerColor('inlineEdit.modifiedChangedLineBackground', {
16
16
  light: transparent(diffInsertedLine, 0.7),
17
17
  dark: transparent(diffInsertedLine, 0.7),
18
18
  hcDark: diffInsertedLine,
19
19
  hcLight: diffInsertedLine
20
- }, localize(1216, 'Background color for the changed lines in the modified text of inline edits.'), true);
21
- export const modifiedChangedTextOverlayColor = registerColor('inlineEdit.modifiedChangedTextBackground', transparent(diffInserted, 0.7), localize(1217, 'Overlay color for the changed text in the modified text of inline edits.'), true);
20
+ }, localize(1222, 'Background color for the changed lines in the modified text of inline edits.'), true);
21
+ export const modifiedChangedTextOverlayColor = registerColor('inlineEdit.modifiedChangedTextBackground', transparent(diffInserted, 0.7), localize(1223, 'Overlay color for the changed text in the modified text of inline edits.'), true);
22
22
  // ------- GUTTER INDICATOR -------
23
- export const inlineEditIndicatorPrimaryForeground = registerColor('inlineEdit.gutterIndicator.primaryForeground', buttonForeground, localize(1218, 'Foreground color for the primary inline edit gutter indicator.'));
24
- export const inlineEditIndicatorPrimaryBorder = registerColor('inlineEdit.gutterIndicator.primaryBorder', buttonBackground, localize(1219, 'Border color for the primary inline edit gutter indicator.'));
23
+ export const inlineEditIndicatorPrimaryForeground = registerColor('inlineEdit.gutterIndicator.primaryForeground', buttonForeground, localize(1224, 'Foreground color for the primary inline edit gutter indicator.'));
24
+ export const inlineEditIndicatorPrimaryBorder = registerColor('inlineEdit.gutterIndicator.primaryBorder', buttonBackground, localize(1225, 'Border color for the primary inline edit gutter indicator.'));
25
25
  export const inlineEditIndicatorPrimaryBackground = registerColor('inlineEdit.gutterIndicator.primaryBackground', {
26
26
  light: transparent(inlineEditIndicatorPrimaryBorder, 0.5),
27
27
  dark: transparent(inlineEditIndicatorPrimaryBorder, 0.4),
28
28
  hcDark: transparent(inlineEditIndicatorPrimaryBorder, 0.4),
29
29
  hcLight: transparent(inlineEditIndicatorPrimaryBorder, 0.5),
30
- }, localize(1220, 'Background color for the primary inline edit gutter indicator.'));
31
- export const inlineEditIndicatorSecondaryForeground = registerColor('inlineEdit.gutterIndicator.secondaryForeground', buttonSecondaryForeground, localize(1221, 'Foreground color for the secondary inline edit gutter indicator.'));
32
- export const inlineEditIndicatorSecondaryBorder = registerColor('inlineEdit.gutterIndicator.secondaryBorder', buttonSecondaryBackground, localize(1222, 'Border color for the secondary inline edit gutter indicator.'));
33
- export const inlineEditIndicatorSecondaryBackground = registerColor('inlineEdit.gutterIndicator.secondaryBackground', inlineEditIndicatorSecondaryBorder, localize(1223, 'Background color for the secondary inline edit gutter indicator.'));
34
- export const inlineEditIndicatorsuccessfulForeground = registerColor('inlineEdit.gutterIndicator.successfulForeground', buttonForeground, localize(1224, 'Foreground color for the successful inline edit gutter indicator.'));
35
- export const inlineEditIndicatorsuccessfulBorder = registerColor('inlineEdit.gutterIndicator.successfulBorder', buttonBackground, localize(1225, 'Border color for the successful inline edit gutter indicator.'));
36
- export const inlineEditIndicatorsuccessfulBackground = registerColor('inlineEdit.gutterIndicator.successfulBackground', inlineEditIndicatorsuccessfulBorder, localize(1226, 'Background color for the successful inline edit gutter indicator.'));
30
+ }, localize(1226, 'Background color for the primary inline edit gutter indicator.'));
31
+ export const inlineEditIndicatorSecondaryForeground = registerColor('inlineEdit.gutterIndicator.secondaryForeground', buttonSecondaryForeground, localize(1227, 'Foreground color for the secondary inline edit gutter indicator.'));
32
+ export const inlineEditIndicatorSecondaryBorder = registerColor('inlineEdit.gutterIndicator.secondaryBorder', buttonSecondaryBackground, localize(1228, 'Border color for the secondary inline edit gutter indicator.'));
33
+ export const inlineEditIndicatorSecondaryBackground = registerColor('inlineEdit.gutterIndicator.secondaryBackground', inlineEditIndicatorSecondaryBorder, localize(1229, 'Background color for the secondary inline edit gutter indicator.'));
34
+ export const inlineEditIndicatorsuccessfulForeground = registerColor('inlineEdit.gutterIndicator.successfulForeground', buttonForeground, localize(1230, 'Foreground color for the successful inline edit gutter indicator.'));
35
+ export const inlineEditIndicatorsuccessfulBorder = registerColor('inlineEdit.gutterIndicator.successfulBorder', buttonBackground, localize(1231, 'Border color for the successful inline edit gutter indicator.'));
36
+ export const inlineEditIndicatorsuccessfulBackground = registerColor('inlineEdit.gutterIndicator.successfulBackground', inlineEditIndicatorsuccessfulBorder, localize(1232, 'Background color for the successful inline edit gutter indicator.'));
37
37
  export const inlineEditIndicatorBackground = registerColor('inlineEdit.gutterIndicator.background', {
38
38
  hcDark: transparent('tab.inactiveBackground', 0.5),
39
39
  hcLight: transparent('tab.inactiveBackground', 0.5),
40
40
  dark: transparent('tab.inactiveBackground', 0.5),
41
41
  light: '#5f5f5f18',
42
- }, localize(1227, 'Background color for the inline edit gutter indicator.'));
42
+ }, localize(1233, 'Background color for the inline edit gutter indicator.'));
43
43
  // ------- BORDER COLORS -------
44
44
  const originalBorder = registerColor('inlineEdit.originalBorder', {
45
45
  light: diffRemoved,
46
46
  dark: diffRemoved,
47
47
  hcDark: diffRemoved,
48
48
  hcLight: diffRemoved
49
- }, localize(1228, 'Border color for the original text in inline edits.'));
49
+ }, localize(1234, 'Border color for the original text in inline edits.'));
50
50
  const modifiedBorder = registerColor('inlineEdit.modifiedBorder', {
51
51
  light: darken(diffInserted, 0.6),
52
52
  dark: diffInserted,
53
53
  hcDark: diffInserted,
54
54
  hcLight: diffInserted
55
- }, localize(1229, 'Border color for the modified text in inline edits.'));
55
+ }, localize(1235, 'Border color for the modified text in inline edits.'));
56
56
  const tabWillAcceptModifiedBorder = registerColor('inlineEdit.tabWillAcceptModifiedBorder', {
57
57
  light: darken(modifiedBorder, 0),
58
58
  dark: darken(modifiedBorder, 0),
59
59
  hcDark: darken(modifiedBorder, 0),
60
60
  hcLight: darken(modifiedBorder, 0)
61
- }, localize(1230, 'Modified border color for the inline edits widget when tab will accept it.'));
61
+ }, localize(1236, 'Modified border color for the inline edits widget when tab will accept it.'));
62
62
  const tabWillAcceptOriginalBorder = registerColor('inlineEdit.tabWillAcceptOriginalBorder', {
63
63
  light: darken(originalBorder, 0),
64
64
  dark: darken(originalBorder, 0),
65
65
  hcDark: darken(originalBorder, 0),
66
66
  hcLight: darken(originalBorder, 0)
67
- }, localize(1231, 'Original border color for the inline edits widget over the original text when tab will accept it.'));
67
+ }, localize(1237, 'Original border color for the inline edits widget over the original text when tab will accept it.'));
68
68
  export function getModifiedBorderColor(tabAction) {
69
69
  return tabAction.map(a => a === InlineEditTabAction.Accept ? tabWillAcceptModifiedBorder : modifiedBorder);
70
70
  }
@@ -11,7 +11,7 @@ export class InsertFinalNewLineAction extends EditorAction {
11
11
  constructor() {
12
12
  super({
13
13
  id: InsertFinalNewLineAction.ID,
14
- label: nls.localize2(1234, "Insert Final New Line"),
14
+ label: nls.localize2(1240, "Insert Final New Line"),
15
15
  precondition: EditorContextKeys.writable
16
16
  });
17
17
  }
@@ -10,7 +10,7 @@ export class ExpandLineSelectionAction extends EditorAction {
10
10
  constructor() {
11
11
  super({
12
12
  id: 'expandLineSelection',
13
- label: nls.localize2(1235, "Expand Line Selection"),
13
+ label: nls.localize2(1241, "Expand Line Selection"),
14
14
  precondition: undefined,
15
15
  kbOpts: {
16
16
  weight: 0 /* KeybindingWeight.EditorCore */,