monaco-editor-core 0.55.0-dev-20251007 → 0.55.0-dev-20251008

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 (40) hide show
  1. package/esm/nls.messages.de.js +1 -1
  2. package/esm/nls.messages.es.js +1 -1
  3. package/esm/nls.messages.fr.js +1 -1
  4. package/esm/nls.messages.it.js +1 -1
  5. package/esm/nls.messages.ja.js +1 -1
  6. package/esm/nls.messages.ko.js +1 -1
  7. package/esm/nls.messages.ru.js +1 -1
  8. package/esm/nls.messages.zh-cn.js +1 -1
  9. package/esm/nls.messages.zh-tw.js +1 -1
  10. package/esm/vs/base/browser/ui/tree/abstractTree.js +2 -5
  11. package/esm/vs/base/browser/ui/tree/abstractTree.js.map +1 -1
  12. package/esm/vs/base/browser/ui/tree/asyncDataTree.js +6 -8
  13. package/esm/vs/base/browser/ui/tree/asyncDataTree.js.map +1 -1
  14. package/esm/vs/base/browser/ui/tree/dataTree.js.map +1 -1
  15. package/esm/vs/base/browser/ui/tree/indexTreeModel.js +1 -2
  16. package/esm/vs/base/browser/ui/tree/indexTreeModel.js.map +1 -1
  17. package/esm/vs/base/browser/ui/tree/objectTree.js.map +1 -1
  18. package/esm/vs/base/common/normalization.js +39 -0
  19. package/esm/vs/base/common/normalization.js.map +1 -0
  20. package/esm/vs/base/common/process.js +0 -1
  21. package/esm/vs/base/common/process.js.map +1 -1
  22. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsModel.js +1 -0
  23. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsModel.js.map +1 -1
  24. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditWithChanges.js +2 -1
  25. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditWithChanges.js.map +1 -1
  26. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsModel.js +1 -1
  27. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsModel.js.map +1 -1
  28. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.js +27 -1
  29. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.js.map +1 -1
  30. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewProducer.js +1 -1
  31. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewProducer.js.map +1 -1
  32. package/esm/vs/platform/dataChannel/browser/forwardingTelemetryService.js +1 -2
  33. package/esm/vs/platform/dataChannel/browser/forwardingTelemetryService.js.map +1 -1
  34. package/esm/vs/platform/dnd/browser/dnd.js +1 -3
  35. package/esm/vs/platform/dnd/browser/dnd.js.map +1 -1
  36. package/esm/vs/platform/product/common/product.js +1 -2
  37. package/esm/vs/platform/product/common/product.js.map +1 -1
  38. package/esm/vs/platform/quickinput/browser/commandsQuickAccess.js +26 -2
  39. package/esm/vs/platform/quickinput/browser/commandsQuickAccess.js.map +1 -1
  40. package/package.json +2 -2
@@ -13,10 +13,11 @@ export class InlineEditWithChanges {
13
13
  get displayRange() {
14
14
  return this.originalText.lineRange.intersect(this.originalLineRange.join(LineRange.ofLength(this.originalLineRange.startLineNumber, this.lineEdit.newLines.length)));
15
15
  }
16
- constructor(originalText, edit, cursorPosition, commands, inlineCompletion) {
16
+ constructor(originalText, edit, cursorPosition, multiCursorPositions, commands, inlineCompletion) {
17
17
  this.originalText = originalText;
18
18
  this.edit = edit;
19
19
  this.cursorPosition = cursorPosition;
20
+ this.multiCursorPositions = multiCursorPositions;
20
21
  this.commands = commands;
21
22
  this.inlineCompletion = inlineCompletion;
22
23
  }
@@ -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,QAA4C,EAC5C,gBAAsC;QAJtC,iBAAY,GAAZ,YAAY,CAAc;QAC1B,SAAI,GAAJ,IAAI,CAAU;QACd,mBAAc,GAAd,cAAc,CAAU;QACxB,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 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 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;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"]}
@@ -55,7 +55,7 @@ export class GhostTextIndicator {
55
55
  }
56
56
  return InlineEditTabAction.Inactive;
57
57
  });
58
- this.model = new InlineEditModel(model, new InlineEditWithChanges(new StringText(''), new TextEdit([inlineCompletion.getSingleTextEdit()]), model.primaryPosition.get(), inlineCompletion.source.inlineSuggestions.commands ?? [], inlineCompletion), tabAction);
58
+ this.model = new InlineEditModel(model, new InlineEditWithChanges(new StringText(''), new TextEdit([inlineCompletion.getSingleTextEdit()]), model.primaryPosition.get(), model.allPositions.get(), inlineCompletion.source.inlineSuggestions.commands ?? [], inlineCompletion), tabAction);
59
59
  }
60
60
  }
61
61
  //# sourceMappingURL=inlineEditsModel.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsModel.ts"],"names":[],"mappings":"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","file":"inlineEditsModel.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 { Event } from '../../../../../../base/common/event.js';\nimport { derived, IObservable } from '../../../../../../base/common/observable.js';\nimport { localize } from '../../../../../../nls.js';\nimport { ICodeEditor } from '../../../../../browser/editorBrowser.js';\nimport { observableCodeEditor } from '../../../../../browser/observableCodeEditor.js';\nimport { LineRange } from '../../../../../common/core/ranges/lineRange.js';\nimport { TextEdit } from '../../../../../common/core/edits/textEdit.js';\nimport { StringText } from '../../../../../common/core/text/abstractText.js';\nimport { Command, InlineCompletionCommand, InlineCompletionDisplayLocation } from '../../../../../common/languages.js';\nimport { InlineCompletionsModel } from '../../model/inlineCompletionsModel.js';\nimport { InlineCompletionItem } from '../../model/inlineSuggestionItem.js';\nimport { IInlineEditHost, IInlineEditModel, InlineCompletionViewData, InlineCompletionViewKind, InlineEditTabAction } from './inlineEditsViewInterface.js';\nimport { InlineEditWithChanges } from './inlineEditWithChanges.js';\n\nexport class InlineEditModel implements IInlineEditModel {\n\n\treadonly action: Command | undefined;\n\treadonly displayName: string;\n\treadonly extensionCommands: InlineCompletionCommand[];\n\treadonly isInDiffEditor: boolean;\n\n\treadonly displayLocation: InlineCompletionDisplayLocation | undefined;\n\treadonly showCollapsed: IObservable<boolean>;\n\n\tconstructor(\n\t\tprivate readonly _model: InlineCompletionsModel,\n\t\treadonly inlineEdit: InlineEditWithChanges,\n\t\treadonly tabAction: IObservable<InlineEditTabAction>,\n\t) {\n\t\tthis.action = this.inlineEdit.inlineCompletion.action;\n\t\tthis.displayName = this.inlineEdit.inlineCompletion.source.provider.displayName ?? localize('inlineEdit', \"Inline Edit\");\n\t\tthis.extensionCommands = this.inlineEdit.inlineCompletion.source.inlineSuggestions.commands ?? [];\n\t\tthis.isInDiffEditor = this._model.isInDiffEditor;\n\n\t\tthis.displayLocation = this.inlineEdit.inlineCompletion.displayLocation;\n\t\tthis.showCollapsed = this._model.showCollapsed;\n\t}\n\n\taccept() {\n\t\tthis._model.accept();\n\t}\n\n\tjump() {\n\t\tthis._model.jump();\n\t}\n\n\tabort(reason: string) {\n\t\tconsole.error(reason);\n\t\tthis.inlineEdit.inlineCompletion.reportInlineEditError(reason);\n\t\tthis._model.stop();\n\t}\n\n\thandleInlineEditShown(viewKind: InlineCompletionViewKind, viewData: InlineCompletionViewData) {\n\t\tthis._model.handleInlineSuggestionShown(this.inlineEdit.inlineCompletion, viewKind, viewData);\n\t}\n}\n\nexport class InlineEditHost implements IInlineEditHost {\n\treadonly onDidAccept: Event<void>;\n\treadonly inAcceptFlow: IObservable<boolean>;\n\n\tconstructor(\n\t\tprivate readonly _model: InlineCompletionsModel,\n\t) {\n\t\tthis.onDidAccept = this._model.onDidAccept;\n\t\tthis.inAcceptFlow = this._model.inAcceptFlow;\n\t}\n}\n\nexport class GhostTextIndicator {\n\n\treadonly model: InlineEditModel;\n\n\tconstructor(\n\t\teditor: ICodeEditor,\n\t\tmodel: InlineCompletionsModel,\n\t\treadonly lineRange: LineRange,\n\t\tinlineCompletion: InlineCompletionItem,\n\t) {\n\t\tconst editorObs = observableCodeEditor(editor);\n\t\tconst tabAction = derived<InlineEditTabAction>(this, reader => {\n\t\t\tif (editorObs.isFocused.read(reader)) {\n\t\t\t\tif (inlineCompletion.showInlineEditMenu) {\n\t\t\t\t\treturn InlineEditTabAction.Accept;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn InlineEditTabAction.Inactive;\n\t\t});\n\n\t\tthis.model = new InlineEditModel(\n\t\t\tmodel,\n\t\t\tnew InlineEditWithChanges(\n\t\t\t\tnew StringText(''),\n\t\t\t\tnew TextEdit([inlineCompletion.getSingleTextEdit()]),\n\t\t\t\tmodel.primaryPosition.get(),\n\t\t\t\tinlineCompletion.source.inlineSuggestions.commands ?? [],\n\t\t\t\tinlineCompletion\n\t\t\t),\n\t\t\ttabAction,\n\t\t);\n\t}\n}\n"]}
1
+ {"version":3,"sources":["vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsModel.ts"],"names":[],"mappings":"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","file":"inlineEditsModel.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 { Event } from '../../../../../../base/common/event.js';\nimport { derived, IObservable } from '../../../../../../base/common/observable.js';\nimport { localize } from '../../../../../../nls.js';\nimport { ICodeEditor } from '../../../../../browser/editorBrowser.js';\nimport { observableCodeEditor } from '../../../../../browser/observableCodeEditor.js';\nimport { LineRange } from '../../../../../common/core/ranges/lineRange.js';\nimport { TextEdit } from '../../../../../common/core/edits/textEdit.js';\nimport { StringText } from '../../../../../common/core/text/abstractText.js';\nimport { Command, InlineCompletionCommand, InlineCompletionDisplayLocation } from '../../../../../common/languages.js';\nimport { InlineCompletionsModel } from '../../model/inlineCompletionsModel.js';\nimport { InlineCompletionItem } from '../../model/inlineSuggestionItem.js';\nimport { IInlineEditHost, IInlineEditModel, InlineCompletionViewData, InlineCompletionViewKind, InlineEditTabAction } from './inlineEditsViewInterface.js';\nimport { InlineEditWithChanges } from './inlineEditWithChanges.js';\n\nexport class InlineEditModel implements IInlineEditModel {\n\n\treadonly action: Command | undefined;\n\treadonly displayName: string;\n\treadonly extensionCommands: InlineCompletionCommand[];\n\treadonly isInDiffEditor: boolean;\n\n\treadonly displayLocation: InlineCompletionDisplayLocation | undefined;\n\treadonly showCollapsed: IObservable<boolean>;\n\n\tconstructor(\n\t\tprivate readonly _model: InlineCompletionsModel,\n\t\treadonly inlineEdit: InlineEditWithChanges,\n\t\treadonly tabAction: IObservable<InlineEditTabAction>,\n\t) {\n\t\tthis.action = this.inlineEdit.inlineCompletion.action;\n\t\tthis.displayName = this.inlineEdit.inlineCompletion.source.provider.displayName ?? localize('inlineEdit', \"Inline Edit\");\n\t\tthis.extensionCommands = this.inlineEdit.inlineCompletion.source.inlineSuggestions.commands ?? [];\n\t\tthis.isInDiffEditor = this._model.isInDiffEditor;\n\n\t\tthis.displayLocation = this.inlineEdit.inlineCompletion.displayLocation;\n\t\tthis.showCollapsed = this._model.showCollapsed;\n\t}\n\n\taccept() {\n\t\tthis._model.accept();\n\t}\n\n\tjump() {\n\t\tthis._model.jump();\n\t}\n\n\tabort(reason: string) {\n\t\tconsole.error(reason);\n\t\tthis.inlineEdit.inlineCompletion.reportInlineEditError(reason);\n\t\tthis._model.stop();\n\t}\n\n\thandleInlineEditShown(viewKind: InlineCompletionViewKind, viewData: InlineCompletionViewData) {\n\t\tthis._model.handleInlineSuggestionShown(this.inlineEdit.inlineCompletion, viewKind, viewData);\n\t}\n}\n\nexport class InlineEditHost implements IInlineEditHost {\n\treadonly onDidAccept: Event<void>;\n\treadonly inAcceptFlow: IObservable<boolean>;\n\n\tconstructor(\n\t\tprivate readonly _model: InlineCompletionsModel,\n\t) {\n\t\tthis.onDidAccept = this._model.onDidAccept;\n\t\tthis.inAcceptFlow = this._model.inAcceptFlow;\n\t}\n}\n\nexport class GhostTextIndicator {\n\n\treadonly model: InlineEditModel;\n\n\tconstructor(\n\t\teditor: ICodeEditor,\n\t\tmodel: InlineCompletionsModel,\n\t\treadonly lineRange: LineRange,\n\t\tinlineCompletion: InlineCompletionItem,\n\t) {\n\t\tconst editorObs = observableCodeEditor(editor);\n\t\tconst tabAction = derived<InlineEditTabAction>(this, reader => {\n\t\t\tif (editorObs.isFocused.read(reader)) {\n\t\t\t\tif (inlineCompletion.showInlineEditMenu) {\n\t\t\t\t\treturn InlineEditTabAction.Accept;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn InlineEditTabAction.Inactive;\n\t\t});\n\n\t\tthis.model = new InlineEditModel(\n\t\t\tmodel,\n\t\t\tnew InlineEditWithChanges(\n\t\t\t\tnew StringText(''),\n\t\t\t\tnew TextEdit([inlineCompletion.getSingleTextEdit()]),\n\t\t\t\tmodel.primaryPosition.get(),\n\t\t\t\tmodel.allPositions.get(),\n\t\t\t\tinlineCompletion.source.inlineSuggestions.commands ?? [],\n\t\t\t\tinlineCompletion\n\t\t\t),\n\t\t\ttabAction,\n\t\t);\n\t}\n}\n"]}
@@ -313,7 +313,15 @@ let InlineEditsView = InlineEditsView_1 = class InlineEditsView extends Disposab
313
313
  }
314
314
  determineRenderState(model, reader, diff, newText) {
315
315
  const inlineEdit = model.inlineEdit;
316
- const view = this.determineView(model, reader, diff, newText);
316
+ let view = this.determineView(model, reader, diff, newText);
317
+ if (this._willRenderAboveCursor(reader, inlineEdit, view)) {
318
+ switch (view) {
319
+ case InlineCompletionViewKind.LineReplacement:
320
+ case InlineCompletionViewKind.WordReplacements:
321
+ view = InlineCompletionViewKind.SideBySide;
322
+ break;
323
+ }
324
+ }
317
325
  this._previousView = { id: this.getCacheId(model), view, editorWidth: this._editor.getLayoutInfo().width, timestamp: Date.now() };
318
326
  const inner = diff.flatMap(d => d.innerChanges ?? []);
319
327
  const textModel = this._editor.getModel();
@@ -386,6 +394,24 @@ let InlineEditsView = InlineEditsView_1 = class InlineEditsView extends Disposab
386
394
  }
387
395
  return undefined;
388
396
  }
397
+ _willRenderAboveCursor(reader, inlineEdit, view) {
398
+ const useCodeShifting = this._useCodeShifting.read(reader);
399
+ if (useCodeShifting === 'always') {
400
+ return false;
401
+ }
402
+ for (const cursorPosition of inlineEdit.multiCursorPositions) {
403
+ if (view === InlineCompletionViewKind.WordReplacements &&
404
+ cursorPosition.lineNumber === inlineEdit.originalLineRange.startLineNumber + 1) {
405
+ return true;
406
+ }
407
+ if (view === InlineCompletionViewKind.LineReplacement &&
408
+ cursorPosition.lineNumber >= inlineEdit.originalLineRange.endLineNumberExclusive &&
409
+ cursorPosition.lineNumber < inlineEdit.modifiedLineRange.endLineNumberExclusive + inlineEdit.modifiedLineRange.length) {
410
+ return true;
411
+ }
412
+ }
413
+ return false;
414
+ }
389
415
  _viewHasBeenShownLongerThan(durationMs) {
390
416
  const viewCreationTime = this._previousView?.timestamp;
391
417
  if (!viewCreationTime) {
@@ -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\tconst view = this.determineView(model, reader, diff, newText);\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 _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\tconst view = this.determineView(model, reader, diff, newText);\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 _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 { 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"]}
@@ -57,7 +57,7 @@ let InlineEditsViewAndDiffProducer = class InlineEditsViewAndDiffProducer extend
57
57
  });
58
58
  const diffEdits = new TextEdit(edits);
59
59
  const text = new TextModelText(textModel);
60
- return new InlineEditWithChanges(text, diffEdits, model.primaryPosition.read(undefined), inlineEdit.commands, inlineEdit.inlineCompletion);
60
+ return new InlineEditWithChanges(text, diffEdits, model.primaryPosition.read(undefined), model.allPositions.read(undefined), inlineEdit.commands, inlineEdit.inlineCompletion);
61
61
  });
62
62
  this._inlineEditModel = derived(this, reader => {
63
63
  const model = this._model.read(reader);