monaco-editor-core 0.55.0-dev-20251022 → 0.55.0-dev-20251024

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 (157) 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 +6 -0
  18. package/esm/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
  19. package/esm/vs/base/browser/ui/iconLabel/iconlabel.css +2 -0
  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/browser/ui/toggle/toggle.js +2 -2
  25. package/esm/vs/base/browser/ui/toggle/toggle.js.map +1 -1
  26. package/esm/vs/base/browser/ui/tree/compressedObjectTreeModel.js +7 -0
  27. package/esm/vs/base/browser/ui/tree/compressedObjectTreeModel.js.map +1 -1
  28. package/esm/vs/base/browser/ui/tree/objectTree.js +3 -0
  29. package/esm/vs/base/browser/ui/tree/objectTree.js.map +1 -1
  30. package/esm/vs/base/browser/ui/tree/objectTreeModel.js +20 -0
  31. package/esm/vs/base/browser/ui/tree/objectTreeModel.js.map +1 -1
  32. package/esm/vs/base/common/arrays.js +10 -0
  33. package/esm/vs/base/common/arrays.js.map +1 -1
  34. package/esm/vs/base/common/codiconsLibrary.js +2 -0
  35. package/esm/vs/base/common/codiconsLibrary.js.map +1 -1
  36. package/esm/vs/base/common/network.js +5 -1
  37. package/esm/vs/base/common/network.js.map +1 -1
  38. package/esm/vs/base/common/paging.js.map +1 -1
  39. package/esm/vs/base/common/validation.js +157 -0
  40. package/esm/vs/base/common/validation.js.map +1 -0
  41. package/esm/vs/editor/common/languages.js +10 -0
  42. package/esm/vs/editor/common/languages.js.map +1 -1
  43. package/esm/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeBase.js.map +1 -1
  44. package/esm/vs/editor/common/model/tokens/treeSitter/treeSitterSyntaxTokenBackend.js +1 -1
  45. package/esm/vs/editor/common/model/tokens/treeSitter/treeSitterSyntaxTokenBackend.js.map +1 -1
  46. package/esm/vs/editor/common/services/treeSitter/treeSitterLibraryService.js.map +1 -1
  47. package/esm/vs/editor/common/viewModel/viewModelLines.js.map +1 -1
  48. package/esm/vs/editor/contrib/inPlaceReplace/browser/inPlaceReplace.js +2 -2
  49. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/commands.js +64 -20
  50. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/commands.js.map +1 -1
  51. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionContextKeys.js +12 -12
  52. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionsController.js +1 -1
  53. package/esm/vs/editor/contrib/inlineCompletions/browser/hintsWidget/hoverParticipant.js +1 -1
  54. package/esm/vs/editor/contrib/inlineCompletions/browser/hintsWidget/inlineCompletionsHintsWidget.js +5 -5
  55. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsModel.js +11 -12
  56. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsModel.js.map +1 -1
  57. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineSuggestionItem.js +4 -4
  58. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineSuggestionItem.js.map +1 -1
  59. package/esm/vs/editor/contrib/inlineCompletions/browser/model/suggestWidgetAdapter.js.map +1 -1
  60. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorMenu.js +6 -6
  61. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditWithChanges.js +3 -0
  62. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditWithChanges.js.map +1 -1
  63. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsModel.js +1 -1
  64. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.js +5 -5
  65. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.js.map +1 -1
  66. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/theme.js +20 -20
  67. package/esm/vs/editor/contrib/insertFinalNewLine/browser/insertFinalNewLine.js +1 -1
  68. package/esm/vs/editor/contrib/lineSelection/browser/lineSelection.js +1 -1
  69. package/esm/vs/editor/contrib/linesOperations/browser/linesOperations.js +31 -31
  70. package/esm/vs/editor/contrib/linkedEditing/browser/linkedEditing.js +2 -2
  71. package/esm/vs/editor/contrib/links/browser/links.js +10 -10
  72. package/esm/vs/editor/contrib/message/browser/messageController.js +1 -1
  73. package/esm/vs/editor/contrib/multicursor/browser/multicursor.js +22 -22
  74. package/esm/vs/editor/contrib/parameterHints/browser/parameterHints.js +1 -1
  75. package/esm/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.js +4 -4
  76. package/esm/vs/editor/contrib/peekView/browser/peekView.js +18 -18
  77. package/esm/vs/editor/contrib/placeholderText/browser/placeholderText.contribution.js +1 -1
  78. package/esm/vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess.js +8 -8
  79. package/esm/vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess.js +32 -32
  80. package/esm/vs/editor/contrib/readOnlyMessage/browser/contribution.js +2 -2
  81. package/esm/vs/editor/contrib/rename/browser/rename.js +11 -11
  82. package/esm/vs/editor/contrib/rename/browser/renameWidget.js +7 -7
  83. package/esm/vs/editor/contrib/smartSelect/browser/smartSelect.js +4 -4
  84. package/esm/vs/editor/contrib/snippet/browser/snippetController2.js +4 -4
  85. package/esm/vs/editor/contrib/snippet/browser/snippetVariables.js +4 -4
  86. package/esm/vs/editor/contrib/stickyScroll/browser/stickyScrollActions.js +11 -11
  87. package/esm/vs/editor/contrib/suggest/browser/suggest.js +8 -8
  88. package/esm/vs/editor/contrib/suggest/browser/suggestController.js +10 -10
  89. package/esm/vs/editor/contrib/suggest/browser/suggestWidget.js +17 -17
  90. package/esm/vs/editor/contrib/suggest/browser/suggestWidgetDetails.js +2 -2
  91. package/esm/vs/editor/contrib/suggest/browser/suggestWidgetRenderer.js +2 -2
  92. package/esm/vs/editor/contrib/suggest/browser/wordContextKey.js +1 -1
  93. package/esm/vs/editor/contrib/symbolIcons/browser/symbolIcons.js +33 -33
  94. package/esm/vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.js +4 -4
  95. package/esm/vs/editor/contrib/tokenization/browser/tokenization.js +1 -1
  96. package/esm/vs/editor/contrib/unicodeHighlighter/browser/bannerController.js +1 -1
  97. package/esm/vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.js +24 -24
  98. package/esm/vs/editor/contrib/unusualLineTerminators/browser/unusualLineTerminators.js +5 -5
  99. package/esm/vs/editor/contrib/wordHighlighter/browser/highlightDecorations.js +9 -9
  100. package/esm/vs/editor/contrib/wordHighlighter/browser/wordHighlighter.js +3 -3
  101. package/esm/vs/editor/contrib/wordOperations/browser/wordOperations.js +1 -1
  102. package/esm/vs/editor/standalone/browser/standaloneTreeSitterLibraryService.js +2 -12
  103. package/esm/vs/editor/standalone/browser/standaloneTreeSitterLibraryService.js.map +1 -1
  104. package/esm/vs/platform/accessibilitySignal/browser/accessibilitySignalService.js +62 -62
  105. package/esm/vs/platform/action/common/actionCommonCategories.js +6 -6
  106. package/esm/vs/platform/actionWidget/browser/actionList.js +4 -4
  107. package/esm/vs/platform/actionWidget/browser/actionWidget.js +7 -7
  108. package/esm/vs/platform/actions/browser/menuEntryActionViewItem.js +5 -5
  109. package/esm/vs/platform/actions/browser/toolbar.js +2 -2
  110. package/esm/vs/platform/actions/common/actions.js +1 -0
  111. package/esm/vs/platform/actions/common/actions.js.map +1 -1
  112. package/esm/vs/platform/actions/common/menuService.js +2 -2
  113. package/esm/vs/platform/configuration/common/configurationRegistry.js +22 -10
  114. package/esm/vs/platform/configuration/common/configurationRegistry.js.map +1 -1
  115. package/esm/vs/platform/contextkey/browser/contextKeyService.js +1 -1
  116. package/esm/vs/platform/contextkey/common/contextkey.js +9 -9
  117. package/esm/vs/platform/contextkey/common/contextkeys.js +9 -9
  118. package/esm/vs/platform/contextkey/common/scanner.js +5 -5
  119. package/esm/vs/platform/history/browser/contextScopedHistoryWidget.js +1 -1
  120. package/esm/vs/platform/keybinding/common/abstractKeybindingService.js +4 -4
  121. package/esm/vs/platform/list/browser/listService.js +27 -27
  122. package/esm/vs/platform/markers/common/markerService.js +2 -2
  123. package/esm/vs/platform/markers/common/markers.js +6 -6
  124. package/esm/vs/platform/quickinput/browser/commandsQuickAccess.js +19 -9
  125. package/esm/vs/platform/quickinput/browser/commandsQuickAccess.js.map +1 -1
  126. package/esm/vs/platform/quickinput/browser/helpQuickAccess.js +1 -1
  127. package/esm/vs/platform/quickinput/browser/quickInput.js +12 -10
  128. package/esm/vs/platform/quickinput/browser/quickInput.js.map +1 -1
  129. package/esm/vs/platform/quickinput/browser/quickInputActions.js +5 -5
  130. package/esm/vs/platform/quickinput/browser/quickInputController.js +12 -6
  131. package/esm/vs/platform/quickinput/browser/quickInputController.js.map +1 -1
  132. package/esm/vs/platform/quickinput/browser/quickInputList.js +1 -1
  133. package/esm/vs/platform/quickinput/browser/quickInputUtils.js +1 -1
  134. package/esm/vs/platform/quickinput/browser/tree/quickInputTree.js +9 -9
  135. package/esm/vs/platform/quickinput/browser/tree/quickInputTree.js.map +1 -1
  136. package/esm/vs/platform/quickinput/browser/tree/quickInputTreeAccessibilityProvider.js +2 -2
  137. package/esm/vs/platform/quickinput/browser/tree/quickInputTreeAccessibilityProvider.js.map +1 -1
  138. package/esm/vs/platform/quickinput/browser/tree/quickInputTreeController.js +19 -26
  139. package/esm/vs/platform/quickinput/browser/tree/quickInputTreeController.js.map +1 -1
  140. package/esm/vs/platform/quickinput/browser/tree/quickInputTreeSorter.js +46 -0
  141. package/esm/vs/platform/quickinput/browser/tree/quickInputTreeSorter.js.map +1 -0
  142. package/esm/vs/platform/quickinput/common/quickInput.js.map +1 -1
  143. package/esm/vs/platform/theme/common/colorUtils.js +2 -2
  144. package/esm/vs/platform/theme/common/colors/baseColors.js +17 -17
  145. package/esm/vs/platform/theme/common/colors/chartsColors.js +8 -8
  146. package/esm/vs/platform/theme/common/colors/editorColors.js +95 -95
  147. package/esm/vs/platform/theme/common/colors/inputColors.js +47 -47
  148. package/esm/vs/platform/theme/common/colors/listColors.js +36 -36
  149. package/esm/vs/platform/theme/common/colors/menuColors.js +7 -7
  150. package/esm/vs/platform/theme/common/colors/minimapColors.js +11 -11
  151. package/esm/vs/platform/theme/common/colors/miscColors.js +15 -15
  152. package/esm/vs/platform/theme/common/colors/quickpickColors.js +9 -9
  153. package/esm/vs/platform/theme/common/colors/searchColors.js +3 -3
  154. package/esm/vs/platform/theme/common/iconRegistry.js +6 -6
  155. package/esm/vs/platform/undoRedo/common/undoRedoService.js +20 -20
  156. package/esm/vs/platform/workspace/common/workspace.js +1 -1
  157. package/package.json +2 -2
@@ -62,13 +62,13 @@ let GutterIndicatorMenuContent = class GutterIndicatorMenuContent {
62
62
  const title = header(this._model.displayName);
63
63
  const gotoAndAccept = option(createOptionArgs({
64
64
  id: 'gotoAndAccept',
65
- title: `${localize(1207, "Go To")} / ${localize(1208, "Accept")}`,
65
+ title: `${localize(1210, "Go To")} / ${localize(1211, "Accept")}`,
66
66
  icon: Codicon.check,
67
67
  commandId: inlineSuggestCommitId
68
68
  }));
69
69
  const reject = option(createOptionArgs({
70
70
  id: 'reject',
71
- title: localize(1209, "Reject"),
71
+ title: localize(1212, "Reject"),
72
72
  icon: Codicon.close,
73
73
  commandId: hideInlineCompletionId
74
74
  }));
@@ -82,25 +82,25 @@ let GutterIndicatorMenuContent = class GutterIndicatorMenuContent {
82
82
  const toggleCollapsedMode = this._inlineEditsShowCollapsed.map(showCollapsed => showCollapsed ?
83
83
  option(createOptionArgs({
84
84
  id: 'showExpanded',
85
- title: localize(1210, "Show Expanded"),
85
+ title: localize(1213, "Show Expanded"),
86
86
  icon: Codicon.expandAll,
87
87
  commandId: toggleShowCollapsedId
88
88
  }))
89
89
  : option(createOptionArgs({
90
90
  id: 'showCollapsed',
91
- title: localize(1211, "Show Collapsed"),
91
+ title: localize(1214, "Show Collapsed"),
92
92
  icon: Codicon.collapseAll,
93
93
  commandId: toggleShowCollapsedId
94
94
  })));
95
95
  const snooze = option(createOptionArgs({
96
96
  id: 'snooze',
97
- title: localize(1212, "Snooze"),
97
+ title: localize(1215, "Snooze"),
98
98
  icon: Codicon.bellSlash,
99
99
  commandId: 'editor.action.inlineSuggest.snooze'
100
100
  }));
101
101
  const settings = option(createOptionArgs({
102
102
  id: 'settings',
103
- title: localize(1213, "Settings"),
103
+ title: localize(1216, "Settings"),
104
104
  icon: Codicon.gear,
105
105
  commandId: 'workbench.action.openSettings',
106
106
  commandArgs: ['@tag:nextEditSuggestions']
@@ -6,6 +6,9 @@ import { LineReplacement } from '../../../../../common/core/edits/lineEdit.js';
6
6
  import { LineRange } from '../../../../../common/core/ranges/lineRange.js';
7
7
  export class InlineEditWithChanges {
8
8
  get lineEdit() {
9
+ if (this.edit.replacements.length === 0) {
10
+ return new LineReplacement(new LineRange(1, 1), []);
11
+ }
9
12
  return LineReplacement.fromSingleTextEdit(this.edit.toReplacement(this.originalText), this.originalText);
10
13
  }
11
14
  get originalLineRange() { return this.lineEdit.lineRange; }
@@ -1 +1 @@
1
- {"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditWithChanges.ts","vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditWithChanges.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG,OAAO,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,gDAAgD,CAAC;AAO3E,MAAM,OAAO,qBAAqB;IACjC,IAAW,QAAQ;QAClB,OAAO,eAAe,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAC1G,CAAC;IAED,IAAW,iBAAiB,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAClE,IAAW,iBAAiB,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3F,IAAW,YAAY;QACtB,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,CAC3C,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAC1B,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CACzF,CACA,CAAC;IACJ,CAAC;IAED,YACiB,YAA0B,EAC1B,IAAc,EACd,cAAwB,EACxB,oBAAyC,EACzC,QAA4C,EAC5C,gBAAsC;QALtC,iBAAY,GAAZ,YAAY,CAAc;QAC1B,SAAI,GAAJ,IAAI,CAAU;QACd,mBAAc,GAAd,cAAc,CAAU;QACxB,yBAAoB,GAApB,oBAAoB,CAAqB;QACzC,aAAQ,GAAR,QAAQ,CAAoC;QAC5C,qBAAgB,GAAhB,gBAAgB,CAAsB;IAEvD,CAAC;CACD","file":"inlineEditWithChanges.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 { LineReplacement } from '../../../../../common/core/edits/lineEdit.js';\nimport { LineRange } from '../../../../../common/core/ranges/lineRange.js';\nimport { Position } from '../../../../../common/core/position.js';\nimport { TextEdit } from '../../../../../common/core/edits/textEdit.js';\nimport { AbstractText } from '../../../../../common/core/text/abstractText.js';\nimport { InlineCompletionCommand } from '../../../../../common/languages.js';\nimport { InlineSuggestionItem } from '../../model/inlineSuggestionItem.js';\n\nexport class InlineEditWithChanges {\n\tpublic get lineEdit() {\n\t\treturn LineReplacement.fromSingleTextEdit(this.edit.toReplacement(this.originalText), this.originalText);\n\t}\n\n\tpublic get originalLineRange() { return this.lineEdit.lineRange; }\n\tpublic get modifiedLineRange() { return this.lineEdit.toLineEdit().getNewLineRanges()[0]; }\n\n\tpublic get displayRange() {\n\t\treturn this.originalText.lineRange.intersect(\n\t\t\tthis.originalLineRange.join(\n\t\t\t\tLineRange.ofLength(this.originalLineRange.startLineNumber, this.lineEdit.newLines.length)\n\t\t\t)\n\t\t)!;\n\t}\n\n\tconstructor(\n\t\tpublic readonly originalText: AbstractText,\n\t\tpublic readonly edit: TextEdit,\n\t\tpublic readonly cursorPosition: Position,\n\t\tpublic readonly multiCursorPositions: readonly Position[],\n\t\tpublic readonly commands: readonly InlineCompletionCommand[],\n\t\tpublic readonly inlineCompletion: InlineSuggestionItem\n\t) {\n\t}\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 { LineReplacement } from '../../../../../common/core/edits/lineEdit.js';\nimport { LineRange } from '../../../../../common/core/ranges/lineRange.js';\nimport { Position } from '../../../../../common/core/position.js';\nimport { TextEdit } from '../../../../../common/core/edits/textEdit.js';\nimport { AbstractText } from '../../../../../common/core/text/abstractText.js';\nimport { InlineCompletionCommand } from '../../../../../common/languages.js';\nimport { InlineSuggestionItem } from '../../model/inlineSuggestionItem.js';\n\nexport class InlineEditWithChanges {\n\tpublic get lineEdit() {\n\t\treturn LineReplacement.fromSingleTextEdit(this.edit.toReplacement(this.originalText), this.originalText);\n\t}\n\n\tpublic get originalLineRange() { return this.lineEdit.lineRange; }\n\tpublic get modifiedLineRange() { return this.lineEdit.toLineEdit().getNewLineRanges()[0]; }\n\n\tpublic get displayRange() {\n\t\treturn this.originalText.lineRange.intersect(\n\t\t\tthis.originalLineRange.join(\n\t\t\t\tLineRange.ofLength(this.originalLineRange.startLineNumber, this.lineEdit.newLines.length)\n\t\t\t)\n\t\t)!;\n\t}\n\n\tconstructor(\n\t\tpublic readonly originalText: AbstractText,\n\t\tpublic readonly edit: TextEdit,\n\t\tpublic readonly cursorPosition: Position,\n\t\tpublic readonly multiCursorPositions: readonly Position[],\n\t\tpublic readonly commands: readonly InlineCompletionCommand[],\n\t\tpublic readonly inlineCompletion: InlineSuggestionItem\n\t) {\n\t}\n}\n"]}
1
+ {"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditWithChanges.ts","vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditWithChanges.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;AAEhG,OAAO,EAAE,eAAe,EAAE,MAAM,8CAA8C,CAAC;AAG/E,OAAO,EAAE,SAAS,EAAE,MAAM,gDAAgD,CAAC;AAK3E,MAAM,OAAO,qBAAqB;IACjC,IAAW,QAAQ;QAClB,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzC,OAAO,IAAI,eAAe,CAAC,IAAI,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,eAAe,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAC1G,CAAC;IAED,IAAW,iBAAiB,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAClE,IAAW,iBAAiB,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3F,IAAW,YAAY;QACtB,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,CAC3C,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAC1B,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CACzF,CACA,CAAC;IACJ,CAAC;IAED,YACiB,YAA0B,EAC1B,IAAc,EACd,cAAwB,EACxB,oBAAyC,EACzC,QAA4C,EAC5C,gBAAsC;QALtC,iBAAY,GAAZ,YAAY,CAAc;QAC1B,SAAI,GAAJ,IAAI,CAAU;QACd,mBAAc,GAAd,cAAc,CAAU;QACxB,yBAAoB,GAApB,oBAAoB,CAAqB;QACzC,aAAQ,GAAR,QAAQ,CAAoC;QAC5C,qBAAgB,GAAhB,gBAAgB,CAAsB;IAEvD,CAAC;CACD","file":"inlineEditWithChanges.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 { LineReplacement } from '../../../../../common/core/edits/lineEdit.js';\nimport { TextEdit } from '../../../../../common/core/edits/textEdit.js';\nimport { Position } from '../../../../../common/core/position.js';\nimport { LineRange } from '../../../../../common/core/ranges/lineRange.js';\nimport { AbstractText } from '../../../../../common/core/text/abstractText.js';\nimport { InlineCompletionCommand } from '../../../../../common/languages.js';\nimport { InlineSuggestionItem } from '../../model/inlineSuggestionItem.js';\n\nexport class InlineEditWithChanges {\n\tpublic get lineEdit() {\n\t\tif (this.edit.replacements.length === 0) {\n\t\t\treturn new LineReplacement(new LineRange(1, 1), []);\n\t\t}\n\t\treturn LineReplacement.fromSingleTextEdit(this.edit.toReplacement(this.originalText), this.originalText);\n\t}\n\n\tpublic get originalLineRange() { return this.lineEdit.lineRange; }\n\tpublic get modifiedLineRange() { return this.lineEdit.toLineEdit().getNewLineRanges()[0]; }\n\n\tpublic get displayRange() {\n\t\treturn this.originalText.lineRange.intersect(\n\t\t\tthis.originalLineRange.join(\n\t\t\t\tLineRange.ofLength(this.originalLineRange.startLineNumber, this.lineEdit.newLines.length)\n\t\t\t)\n\t\t)!;\n\t}\n\n\tconstructor(\n\t\tpublic readonly originalText: AbstractText,\n\t\tpublic readonly edit: TextEdit,\n\t\tpublic readonly cursorPosition: Position,\n\t\tpublic readonly multiCursorPositions: readonly Position[],\n\t\tpublic readonly commands: readonly InlineCompletionCommand[],\n\t\tpublic readonly inlineCompletion: InlineSuggestionItem\n\t) {\n\t}\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 { LineReplacement } from '../../../../../common/core/edits/lineEdit.js';\nimport { TextEdit } from '../../../../../common/core/edits/textEdit.js';\nimport { Position } from '../../../../../common/core/position.js';\nimport { LineRange } from '../../../../../common/core/ranges/lineRange.js';\nimport { AbstractText } from '../../../../../common/core/text/abstractText.js';\nimport { InlineCompletionCommand } from '../../../../../common/languages.js';\nimport { InlineSuggestionItem } from '../../model/inlineSuggestionItem.js';\n\nexport class InlineEditWithChanges {\n\tpublic get lineEdit() {\n\t\tif (this.edit.replacements.length === 0) {\n\t\t\treturn new LineReplacement(new LineRange(1, 1), []);\n\t\t}\n\t\treturn LineReplacement.fromSingleTextEdit(this.edit.toReplacement(this.originalText), this.originalText);\n\t}\n\n\tpublic get originalLineRange() { return this.lineEdit.lineRange; }\n\tpublic get modifiedLineRange() { return this.lineEdit.toLineEdit().getNewLineRanges()[0]; }\n\n\tpublic get displayRange() {\n\t\treturn this.originalText.lineRange.intersect(\n\t\t\tthis.originalLineRange.join(\n\t\t\t\tLineRange.ofLength(this.originalLineRange.startLineNumber, this.lineEdit.newLines.length)\n\t\t\t)\n\t\t)!;\n\t}\n\n\tconstructor(\n\t\tpublic readonly originalText: AbstractText,\n\t\tpublic readonly edit: TextEdit,\n\t\tpublic readonly cursorPosition: Position,\n\t\tpublic readonly multiCursorPositions: readonly Position[],\n\t\tpublic readonly commands: readonly InlineCompletionCommand[],\n\t\tpublic readonly inlineCompletion: InlineSuggestionItem\n\t) {\n\t}\n}\n"]}
@@ -15,7 +15,7 @@ export class InlineEditModel {
15
15
  this.inlineEdit = inlineEdit;
16
16
  this.tabAction = tabAction;
17
17
  this.action = this.inlineEdit.inlineCompletion.action;
18
- this.displayName = this.inlineEdit.inlineCompletion.source.provider.displayName ?? localize(1214, "Inline Edit");
18
+ this.displayName = this.inlineEdit.inlineCompletion.source.provider.displayName ?? localize(1217, "Inline Edit");
19
19
  this.extensionCommands = this.inlineEdit.inlineCompletion.source.inlineSuggestions.commands ?? [];
20
20
  this.isInDiffEditor = this._model.isInDiffEditor;
21
21
  this.displayLocation = this.inlineEdit.inlineCompletion.displayLocation;
@@ -12,6 +12,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
12
  return function (target, key) { decorator(target, key, paramIndex); }
13
13
  };
14
14
  var InlineEditsView_1;
15
+ import { $ } from '../../../../../../base/browser/dom.js';
15
16
  import { equalsIfDefined, itemEquals } from '../../../../../../base/common/equals.js';
16
17
  import { BugIndicatingError } from '../../../../../../base/common/errors.js';
17
18
  import { Event } from '../../../../../../base/common/event.js';
@@ -19,9 +20,9 @@ import { Disposable } from '../../../../../../base/common/lifecycle.js';
19
20
  import { autorun, autorunWithStore, derived, derivedOpts, mapObservableArrayCached, observableValue } from '../../../../../../base/common/observable.js';
20
21
  import { IInstantiationService } from '../../../../../../platform/instantiation/common/instantiation.js';
21
22
  import { observableCodeEditor } from '../../../../../browser/observableCodeEditor.js';
22
- import { LineRange } from '../../../../../common/core/ranges/lineRange.js';
23
- import { Range } from '../../../../../common/core/range.js';
24
23
  import { TextReplacement } from '../../../../../common/core/edits/textEdit.js';
24
+ import { Range } from '../../../../../common/core/range.js';
25
+ import { LineRange } from '../../../../../common/core/ranges/lineRange.js';
25
26
  import { StringText } from '../../../../../common/core/text/abstractText.js';
26
27
  import { TextLength } from '../../../../../common/core/text/textLength.js';
27
28
  import { lineRangeMappingFromRangeMappings, RangeMapping } from '../../../../../common/diff/rangeMapping.js';
@@ -39,7 +40,6 @@ import { InlineEditsWordReplacementView } from './inlineEditsViews/inlineEditsWo
39
40
  import { OriginalEditorInlineDiffView } from './inlineEditsViews/originalEditorInlineDiffView.js';
40
41
  import { applyEditToModifiedRangeMappings, createReindentEdit } from './utils/utils.js';
41
42
  import './view.css';
42
- import { $ } from '../../../../../../base/browser/dom.js';
43
43
  let InlineEditsView = InlineEditsView_1 = class InlineEditsView extends Disposable {
44
44
  constructor(_editor, _host, _model, _ghostTextIndicator, _focusIsInMenu, _instantiationService) {
45
45
  super();
@@ -332,9 +332,9 @@ let InlineEditsView = InlineEditsView_1 = class InlineEditsView extends Disposab
332
332
  modified: newText.getValueOfRange(m.modifiedRange)
333
333
  }));
334
334
  const cursorPosition = inlineEdit.cursorPosition;
335
- const startsWithEOL = stringChanges[0].modified.startsWith(textModel.getEOL());
335
+ const startsWithEOL = stringChanges.length === 0 ? false : stringChanges[0].modified.startsWith(textModel.getEOL());
336
336
  const viewData = {
337
- cursorColumnDistance: inlineEdit.edit.replacements[0].range.getStartPosition().column - cursorPosition.column,
337
+ cursorColumnDistance: inlineEdit.edit.replacements.length === 0 ? 0 : inlineEdit.edit.replacements[0].range.getStartPosition().column - cursorPosition.column,
338
338
  cursorLineDistance: inlineEdit.lineEdit.lineRange.startLineNumber - cursorPosition.lineNumber + (startsWithEOL && inlineEdit.lineEdit.lineRange.startLineNumber >= cursorPosition.lineNumber ? 1 : 0),
339
339
  lineCountOriginal: inlineEdit.lineEdit.lineRange.length,
340
340
  lineCountModified: inlineEdit.lineEdit.newLines.length,
@@ -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"]}