monaco-editor-core 0.56.0-dev-20251219 → 0.56.0-dev-20251220
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.
- package/esm/nls.keys.json +1 -1
- package/esm/nls.messages.cs.js +2 -2
- package/esm/nls.messages.de.js +2 -2
- package/esm/nls.messages.es.js +2 -2
- package/esm/nls.messages.fr.js +2 -2
- package/esm/nls.messages.it.js +2 -2
- package/esm/nls.messages.ja.js +2 -2
- package/esm/nls.messages.js +1 -1
- package/esm/nls.messages.json +1 -1
- package/esm/nls.messages.ko.js +2 -2
- package/esm/nls.messages.pl.js +2 -2
- package/esm/nls.messages.pt-br.js +2 -2
- package/esm/nls.messages.ru.js +2 -2
- package/esm/nls.messages.tr.js +2 -2
- package/esm/nls.messages.zh-cn.js +2 -2
- package/esm/nls.messages.zh-tw.js +2 -2
- package/esm/nls.metadata.json +0 -2
- package/esm/vs/editor/common/core/editorColorRegistry.js +33 -34
- package/esm/vs/editor/common/core/editorColorRegistry.js.map +1 -1
- package/esm/vs/editor/common/editorContextKeys.js +47 -47
- package/esm/vs/editor/common/languages/modesRegistry.js +1 -1
- package/esm/vs/editor/common/languages.js +56 -56
- package/esm/vs/editor/common/model/editStack.js +1 -1
- package/esm/vs/editor/common/standaloneStrings.js +11 -11
- package/esm/vs/editor/common/viewLayout/viewLineRenderer.js +2 -2
- package/esm/vs/editor/contrib/anchorSelect/browser/anchorSelect.js +6 -6
- package/esm/vs/editor/contrib/bracketMatching/browser/bracketMatching.js +9 -18
- package/esm/vs/editor/contrib/bracketMatching/browser/bracketMatching.js.map +1 -1
- package/esm/vs/editor/contrib/caretOperations/browser/caretOperations.js +2 -2
- package/esm/vs/editor/contrib/caretOperations/browser/transpose.js +1 -1
- package/esm/vs/editor/contrib/clipboard/browser/clipboard.js +17 -17
- package/esm/vs/editor/contrib/codeAction/browser/codeAction.js +1 -1
- package/esm/vs/editor/contrib/codeAction/browser/codeActionCommands.js +29 -29
- package/esm/vs/editor/contrib/codeAction/browser/codeActionContributions.js +3 -3
- package/esm/vs/editor/contrib/codeAction/browser/codeActionController.js +3 -3
- package/esm/vs/editor/contrib/codeAction/browser/codeActionMenu.js +8 -8
- package/esm/vs/editor/contrib/codeAction/browser/lightBulbWidget.js +9 -9
- package/esm/vs/editor/contrib/codelens/browser/codelensController.js +2 -2
- package/esm/vs/editor/contrib/colorPicker/browser/colorPickerParts/colorPickerCloseButton.js +1 -1
- package/esm/vs/editor/contrib/colorPicker/browser/colorPickerParts/colorPickerHeader.js +1 -1
- package/esm/vs/editor/contrib/colorPicker/browser/hoverColorPicker/hoverColorPickerParticipant.js +1 -1
- package/esm/vs/editor/contrib/colorPicker/browser/standaloneColorPicker/standaloneColorPickerActions.js +7 -7
- package/esm/vs/editor/contrib/comment/browser/comment.js +6 -6
- package/esm/vs/editor/contrib/contextmenu/browser/contextmenu.js +10 -10
- package/esm/vs/editor/contrib/cursorUndo/browser/cursorUndo.js +2 -2
- package/esm/vs/editor/contrib/dropOrPasteInto/browser/copyPasteContribution.js +4 -4
- package/esm/vs/editor/contrib/dropOrPasteInto/browser/copyPasteController.js +9 -9
- package/esm/vs/editor/contrib/dropOrPasteInto/browser/defaultProviders.js +8 -8
- package/esm/vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorController.js +3 -3
- package/esm/vs/editor/contrib/dropOrPasteInto/browser/postEditWidget.js +2 -2
- package/esm/vs/editor/contrib/editorState/browser/keybindingCancellation.js +1 -1
- package/esm/vs/editor/contrib/find/browser/findController.js +16 -16
- package/esm/vs/editor/contrib/find/browser/findWidget.js +26 -26
- package/esm/vs/editor/contrib/folding/browser/folding.js +20 -20
- package/esm/vs/editor/contrib/folding/browser/folding.js.map +1 -1
- package/esm/vs/editor/contrib/folding/browser/foldingDecorations.js +9 -9
- package/esm/vs/editor/contrib/fontZoom/browser/fontZoom.js +3 -3
- package/esm/vs/editor/contrib/format/browser/formatActions.js +2 -2
- package/esm/vs/editor/contrib/gotoError/browser/gotoError.js +8 -8
- package/esm/vs/editor/contrib/gotoError/browser/gotoErrorWidget.js +14 -14
- package/esm/vs/editor/contrib/gotoSymbol/browser/goToCommands.js +39 -39
- package/esm/vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.js +1 -1
- package/esm/vs/editor/contrib/gotoSymbol/browser/peek/referencesController.js +3 -3
- package/esm/vs/editor/contrib/gotoSymbol/browser/peek/referencesTree.js +3 -3
- package/esm/vs/editor/contrib/gotoSymbol/browser/peek/referencesWidget.js +3 -3
- package/esm/vs/editor/contrib/gotoSymbol/browser/referencesModel.js +8 -8
- package/esm/vs/editor/contrib/gotoSymbol/browser/symbolNavigation.js +3 -3
- package/esm/vs/editor/contrib/gpu/browser/gpuActions.js +4 -4
- package/esm/vs/editor/contrib/hover/browser/hoverActionIds.js +2 -2
- package/esm/vs/editor/contrib/hover/browser/hoverActions.js +24 -24
- package/esm/vs/editor/contrib/hover/browser/hoverCopyButton.js +2 -2
- package/esm/vs/editor/contrib/hover/browser/markdownHoverParticipant.js +9 -9
- package/esm/vs/editor/contrib/hover/browser/markerHoverParticipant.js +5 -5
- package/esm/vs/editor/contrib/inPlaceReplace/browser/inPlaceReplace.js +2 -2
- package/esm/vs/editor/contrib/indentation/browser/indentation.js +20 -20
- package/esm/vs/editor/contrib/inlayHints/browser/inlayHintsHover.js +8 -8
- package/esm/vs/editor/contrib/inlineCompletions/browser/controller/commands.js +21 -21
- package/esm/vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionContextKeys.js +13 -13
- package/esm/vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionsController.js +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/hintsWidget/hoverParticipant.js +2 -2
- package/esm/vs/editor/contrib/inlineCompletions/browser/hintsWidget/inlineCompletionsHintsWidget.js +5 -5
- package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsModel.js +2 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsModel.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/model/renameSymbolProcessor.js +2 -2
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorMenu.js +6 -6
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorView.js +7 -7
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorView.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsModel.js +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsModel.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.js +13 -11
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsCustomView.js +5 -7
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsCustomView.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsDeletionView.js +6 -5
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsDeletionView.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsInsertionView.js +6 -5
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsInsertionView.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsLineReplacementView.js +9 -7
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsLineReplacementView.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsSideBySideView.js +14 -9
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsSideBySideView.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsWordReplacementView.js +12 -10
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsWordReplacementView.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/longDistanceHint/inlineEditsLongDistanceHint.js +5 -4
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/longDistanceHint/inlineEditsLongDistanceHint.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/originalEditorInlineDiffView.js +2 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/originalEditorInlineDiffView.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/theme.js +40 -21
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/theme.js.map +1 -1
- package/esm/vs/editor/contrib/insertFinalNewLine/browser/insertFinalNewLine.js +1 -1
- package/esm/vs/editor/contrib/lineSelection/browser/lineSelection.js +1 -1
- package/esm/vs/editor/contrib/linesOperations/browser/linesOperations.js +31 -31
- package/esm/vs/editor/contrib/linkedEditing/browser/linkedEditing.js +2 -2
- package/esm/vs/editor/contrib/links/browser/links.js +10 -10
- package/esm/vs/editor/contrib/message/browser/messageController.js +1 -1
- package/esm/vs/editor/contrib/multicursor/browser/multicursor.js +22 -22
- package/esm/vs/editor/contrib/parameterHints/browser/parameterHints.js +1 -1
- package/esm/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.js +4 -4
- package/esm/vs/editor/contrib/peekView/browser/peekView.js +18 -18
- package/esm/vs/editor/contrib/placeholderText/browser/placeholderText.contribution.js +1 -1
- package/esm/vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess.js +11 -11
- package/esm/vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess.js +32 -32
- package/esm/vs/editor/contrib/readOnlyMessage/browser/contribution.js +2 -2
- package/esm/vs/editor/contrib/rename/browser/rename.js +11 -11
- package/esm/vs/editor/contrib/rename/browser/renameWidget.js +7 -7
- package/esm/vs/editor/contrib/smartSelect/browser/smartSelect.js +4 -4
- package/esm/vs/editor/contrib/snippet/browser/snippetController2.js +4 -4
- package/esm/vs/editor/contrib/snippet/browser/snippetVariables.js +4 -4
- package/esm/vs/editor/contrib/stickyScroll/browser/stickyScrollActions.js +11 -11
- package/esm/vs/editor/contrib/suggest/browser/suggest.js +9 -9
- package/esm/vs/editor/contrib/suggest/browser/suggestController.js +11 -11
- package/esm/vs/editor/contrib/suggest/browser/suggestWidget.js +17 -17
- package/esm/vs/editor/contrib/suggest/browser/suggestWidgetDetails.js +2 -2
- package/esm/vs/editor/contrib/suggest/browser/suggestWidgetRenderer.js +2 -2
- package/esm/vs/editor/contrib/suggest/browser/wordContextKey.js +1 -1
- package/esm/vs/editor/contrib/symbolIcons/browser/symbolIcons.js +33 -33
- package/esm/vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.js +4 -4
- package/esm/vs/editor/contrib/tokenization/browser/tokenization.js +1 -1
- package/esm/vs/editor/contrib/unicodeHighlighter/browser/bannerController.js +1 -1
- package/esm/vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.js +24 -24
- package/esm/vs/editor/contrib/unusualLineTerminators/browser/unusualLineTerminators.js +5 -5
- package/esm/vs/editor/contrib/wordHighlighter/browser/highlightDecorations.js +9 -9
- package/esm/vs/editor/contrib/wordHighlighter/browser/wordHighlighter.js +3 -3
- package/esm/vs/editor/contrib/wordOperations/browser/wordOperations.js +3 -3
- package/esm/vs/platform/accessibilitySignal/browser/accessibilitySignalService.js +62 -62
- package/esm/vs/platform/action/common/actionCommonCategories.js +6 -6
- package/esm/vs/platform/actionWidget/browser/actionList.js +4 -4
- package/esm/vs/platform/actionWidget/browser/actionWidget.js +7 -7
- package/esm/vs/platform/actions/browser/menuEntryActionViewItem.js +5 -5
- package/esm/vs/platform/actions/browser/toolbar.js +2 -2
- package/esm/vs/platform/actions/common/menuService.js +2 -2
- package/esm/vs/platform/configuration/common/configurationRegistry.js +10 -10
- package/esm/vs/platform/contextkey/browser/contextKeyService.js +1 -1
- package/esm/vs/platform/contextkey/common/contextkey.js +9 -9
- package/esm/vs/platform/contextkey/common/contextkeys.js +9 -9
- package/esm/vs/platform/contextkey/common/scanner.js +5 -5
- package/esm/vs/platform/history/browser/contextScopedHistoryWidget.js +1 -1
- package/esm/vs/platform/hover/browser/hoverWidget.js +1 -1
- package/esm/vs/platform/hover/browser/updatableHoverWidget.js +1 -1
- package/esm/vs/platform/keybinding/common/abstractKeybindingService.js +4 -4
- package/esm/vs/platform/list/browser/listService.js +27 -27
- package/esm/vs/platform/markers/common/markerService.js +2 -2
- package/esm/vs/platform/markers/common/markers.js +6 -6
- package/esm/vs/platform/quickinput/browser/commandsQuickAccess.js +8 -8
- package/esm/vs/platform/quickinput/browser/helpQuickAccess.js +1 -1
- package/esm/vs/platform/quickinput/browser/quickInput.js +13 -47
- package/esm/vs/platform/quickinput/browser/quickInput.js.map +1 -1
- package/esm/vs/platform/quickinput/browser/quickInputActions.js +5 -5
- package/esm/vs/platform/quickinput/browser/quickInputController.js +7 -6
- package/esm/vs/platform/quickinput/browser/quickInputController.js.map +1 -1
- package/esm/vs/platform/quickinput/browser/quickInputList.js +1 -1
- package/esm/vs/platform/quickinput/browser/quickInputUtils.js +1 -1
- package/esm/vs/platform/quickinput/browser/tree/quickInputTreeAccessibilityProvider.js +1 -1
- package/esm/vs/platform/quickinput/common/quickInput.js.map +1 -1
- package/esm/vs/platform/theme/common/colorUtils.js +2 -2
- package/esm/vs/platform/theme/common/colors/baseColors.js +18 -18
- package/esm/vs/platform/theme/common/colors/chartsColors.js +8 -8
- package/esm/vs/platform/theme/common/colors/editorColors.js +95 -95
- package/esm/vs/platform/theme/common/colors/inputColors.js +47 -47
- package/esm/vs/platform/theme/common/colors/listColors.js +36 -36
- package/esm/vs/platform/theme/common/colors/menuColors.js +7 -7
- package/esm/vs/platform/theme/common/colors/minimapColors.js +11 -11
- package/esm/vs/platform/theme/common/colors/miscColors.js +16 -16
- package/esm/vs/platform/theme/common/colors/quickpickColors.js +9 -9
- package/esm/vs/platform/theme/common/colors/searchColors.js +3 -3
- package/esm/vs/platform/theme/common/iconRegistry.js +6 -6
- package/esm/vs/platform/undoRedo/common/undoRedoService.js +20 -20
- package/esm/vs/platform/workspace/common/workspace.js +1 -1
- package/package.json +2 -2
package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.js.map
CHANGED
|
@@ -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 { $ } from '../../../../../../base/browser/dom.js';\nimport { equals } from '../../../../../../base/common/equals.js';\nimport { BugIndicatingError, onUnexpectedError } from '../../../../../../base/common/errors.js';\nimport { Event } from '../../../../../../base/common/event.js';\nimport { Disposable } from '../../../../../../base/common/lifecycle.js';\nimport { autorun, derived, derivedOpts, IObservable, IReader, mapObservableArrayCached, observableValue } from '../../../../../../base/common/observable.js';\nimport { IInstantiationService } from '../../../../../../platform/instantiation/common/instantiation.js';\nimport { ICodeEditor } from '../../../../../browser/editorBrowser.js';\nimport { ObservableCodeEditor, observableCodeEditor } from '../../../../../browser/observableCodeEditor.js';\nimport { EditorOption } from '../../../../../common/config/editorOptions.js';\nimport { TextReplacement } from '../../../../../common/core/edits/textEdit.js';\nimport { Position } from '../../../../../common/core/position.js';\nimport { Range } from '../../../../../common/core/range.js';\nimport { LineRange } from '../../../../../common/core/ranges/lineRange.js';\nimport { AbstractText, StringText } from '../../../../../common/core/text/abstractText.js';\nimport { TextLength } from '../../../../../common/core/text/textLength.js';\nimport { DetailedLineRangeMapping, lineRangeMappingFromRangeMappings, RangeMapping } from '../../../../../common/diff/rangeMapping.js';\nimport { ITextModel } from '../../../../../common/model.js';\nimport { TextModel } from '../../../../../common/model/textModel.js';\nimport { InlineSuggestionIdentity } from '../../model/inlineSuggestionItem.js';\nimport { InlineSuggestionGutterMenuData, SimpleInlineSuggestModel } from './components/gutterIndicatorView.js';\nimport { InlineEditWithChanges } from './inlineEditWithChanges.js';\nimport { ModelPerInlineEdit } from './inlineEditsModel.js';\nimport { 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 { ILongDistanceHint, ILongDistanceViewState, InlineEditsLongDistanceHint } from './inlineEditsViews/longDistanceHint/inlineEditsLongDistanceHint.js';\nimport { InlineEditsSideBySideView } from './inlineEditsViews/inlineEditsSideBySideView.js';\nimport { InlineEditsWordReplacementView, WordReplacementsViewData } from './inlineEditsViews/inlineEditsWordReplacementView.js';\nimport { IOriginalEditorInlineDiffViewState, OriginalEditorInlineDiffView } from './inlineEditsViews/originalEditorInlineDiffView.js';\nimport { applyEditToModifiedRangeMappings, createReindentEdit } from './utils/utils.js';\nimport './view.css';\nimport { JumpToView } from './inlineEditsViews/jumpToView.js';\nimport { StringEdit } from '../../../../../common/core/edits/stringEdit.js';\nimport { OffsetRange } from '../../../../../common/core/ranges/offsetRange.js';\nimport { getPositionOffsetTransformerFromTextModel } from '../../../../../common/core/text/getPositionOffsetTransformerFromTextModel.js';\n\nexport class InlineEditsView extends Disposable {\n\tprivate readonly _editorObs: ObservableCodeEditor;\n\n\tprivate readonly _useCodeShifting;\n\tprivate readonly _renderSideBySide;\n\tprivate readonly _tabAction = derived<InlineEditTabAction>(reader => this._model.read(reader)?.tabAction.read(reader) ?? InlineEditTabAction.Inactive);\n\n\tprivate _previousView: { // TODO, move into identity\n\t\tid: string;\n\t\tview: ReturnType<typeof InlineEditsView.prototype._determineView>;\n\t\teditorWidth: number;\n\t\ttimestamp: number;\n\t} | undefined;\n\tprivate readonly _showLongDistanceHint: IObservable<boolean>;\n\n\tconstructor(\n\t\tprivate readonly _editor: ICodeEditor,\n\t\tprivate readonly _model: IObservable<ModelPerInlineEdit | undefined>,\n\t\tprivate readonly _simpleModel: IObservable<SimpleInlineSuggestModel | undefined>,\n\t\tprivate readonly _inlineSuggestInfo: IObservable<InlineSuggestionGutterMenuData | undefined>,\n\t\tprivate readonly _showCollapsed: IObservable<boolean>,\n\n\t\t@IInstantiationService private readonly _instantiationService: IInstantiationService\n\t) {\n\t\tsuper();\n\t\tthis._editorObs = observableCodeEditor(this._editor);\n\t\tthis._constructorDone = observableValue(this, false);\n\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\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\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 === InlineCompletionViewKind.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 === InlineCompletionViewKind.Custom ? m?.displayLocation : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\n\t\tthis._showLongDistanceHint = this._editorObs.getOption(EditorOption.inlineSuggest).map(this, s => s.edits.showLongDistanceHint);\n\t\tthis._longDistanceHint = derived(this, reader => {\n\t\t\tif (!this._showLongDistanceHint.read(reader)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn reader.store.add(this._instantiationService.createInstance(InlineEditsLongDistanceHint,\n\t\t\t\tthis._editor,\n\t\t\t\tthis._uiState.map<ILongDistanceViewState | undefined>((s, reader) => s?.longDistanceHint ? ({\n\t\t\t\t\thint: s.longDistanceHint,\n\t\t\t\t\tnewTextLineCount: s.newTextLineCount,\n\t\t\t\t\tedit: s.edit,\n\t\t\t\t\tdiff: s.diff,\n\t\t\t\t\tmodel: this._simpleModel.read(reader)!,\n\t\t\t\t\tinlineSuggestInfo: this._inlineSuggestInfo.read(reader)!,\n\t\t\t\t\tnextCursorPosition: s.nextCursorPosition,\n\t\t\t\t}) : undefined),\n\t\t\t\tthis._previewTextModel,\n\t\t\t\tthis._tabAction,\n\t\t\t));\n\t\t}).recomputeInitiallyAndOnChange(this._store);\n\n\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' || e.state.kind === 'jumpTo') {\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._inlineDiffView = this._register(new OriginalEditorInlineDiffView(this._editor, this._inlineDiffViewState, this._previewTextModel));\n\t\tthis._jumpToView = this._register(this._instantiationService.createInstance(JumpToView, this._editorObs, { style: 'label' }, derived(reader => {\n\t\t\tconst s = this._uiState.read(reader);\n\t\t\tif (s?.state?.kind === InlineCompletionViewKind.JumpTo) {\n\t\t\t\treturn { jumpToPosition: s.state.position };\n\t\t\t}\n\t\t\treturn undefined;\n\t\t})));\n\t\tconst wordReplacements = derivedOpts({\n\t\t\tequalsFn: equals.arrayC(equals.thisC())\n\t\t}, reader => {\n\t\t\tconst s = this._uiState.read(reader);\n\t\t\treturn s?.state?.kind === InlineCompletionViewKind.WordReplacements ? s.state.replacements.map(replacement => new WordReplacementsViewData(replacement, s.state?.alternativeAction)) : [];\n\t\t});\n\t\tthis._wordReplacementViews = mapObservableArrayCached(this, wordReplacements, (viewData, store) => {\n\t\t\treturn store.add(this._instantiationService.createInstance(InlineEditsWordReplacementView, this._editorObs, viewData, 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(autorun((reader) => {\n\t\t\tconst model = this._model.read(reader);\n\t\t\tif (!model) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treader.store.add(\n\t\t\t\tEvent.any(\n\t\t\t\t\tthis._sideBySide.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)(clickEvent => {\n\t\t\t\t\tif (this._viewHasBeenShownLongerThan(350)) {\n\t\t\t\t\t\tclickEvent.event.preventDefault();\n\t\t\t\t\t\tmodel.accept(clickEvent.alternativeAction);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t);\n\t\t}));\n\n\t\tthis._wordReplacementViews.recomputeInitiallyAndOnChange(this._store);\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\tlet viewZoneId: string | undefined;\n\t\tthis._register(autorun(reader => {\n\t\t\tconst minScrollHeight = minEditorScrollHeight.read(reader);\n\t\t\tconst textModel = this._editorObs.model.read(reader);\n\t\t\tif (!textModel) { return; }\n\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 !== undefined) {\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\tpublic readonly displayRange = derived<LineRange | undefined>(this, reader => {\n\t\tconst state = this._uiState.read(reader);\n\t\tif (!state) { return undefined; }\n\t\tif (state.state?.kind === 'custom') {\n\t\t\tconst range = state.state.displayLocation?.range;\n\t\t\tif (!range) {\n\t\t\t\tthrow new BugIndicatingError('custom view should have a range');\n\t\t\t}\n\t\t\treturn new LineRange(range.startLineNumber, range.endLineNumber);\n\t\t}\n\n\t\tif (state.state?.kind === 'insertionMultiLine') {\n\t\t\treturn this._insertion.originalLines.read(reader);\n\t\t}\n\n\t\treturn state.edit.displayRange;\n\t});\n\n\n\tprivate _currentInlineEditCache: {\n\t\tinlineSuggestionIdentity: InlineSuggestionIdentity;\n\t\tfirstCursorLineNumber: number;\n\t} | undefined = undefined;\n\n\tprivate _getLongDistanceHintState(model: ModelPerInlineEdit, reader: IReader): ILongDistanceHint | undefined {\n\t\tif (model.inlineEdit.inlineCompletion.identity.jumpedTo.read(reader)) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (model.inlineEdit.action === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (this._currentInlineEditCache?.inlineSuggestionIdentity !== model.inlineEdit.inlineCompletion.identity) {\n\t\t\tthis._currentInlineEditCache = {\n\t\t\t\tinlineSuggestionIdentity: model.inlineEdit.inlineCompletion.identity,\n\t\t\t\tfirstCursorLineNumber: model.inlineEdit.cursorPosition.lineNumber,\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tlineNumber: this._currentInlineEditCache.firstCursorLineNumber,\n\t\t\tisVisible: !model.inViewPort.read(reader),\n\t\t};\n\t}\n\n\tprivate readonly _constructorDone;\n\n\tprivate readonly _uiState = derived<{\n\t\tstate: ReturnType<typeof InlineEditsView.prototype._determineRenderState>;\n\t\tdiff: DetailedLineRangeMapping[];\n\t\tedit: InlineEditWithChanges;\n\t\tnewText: string;\n\t\tnewTextLineCount: number;\n\t\tisInDiffEditor: boolean;\n\t\tlongDistanceHint: ILongDistanceHint | undefined;\n\t\tnextCursorPosition: Position | null;\n\t} | undefined>(this, reader => {\n\t\tconst model = this._model.read(reader);\n\t\tconst textModel = this._editorObs.model.read(reader);\n\t\tif (!model || !textModel || !this._constructorDone.read(reader)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst inlineEdit = model.inlineEdit;\n\t\tlet diff: DetailedLineRangeMapping[];\n\t\tlet mappings: RangeMapping[];\n\n\t\tlet newText: AbstractText | undefined = undefined;\n\n\t\tif (inlineEdit.edit) {\n\t\t\tmappings = RangeMapping.fromEdit(inlineEdit.edit);\n\t\t\tnewText = new StringText(inlineEdit.edit.apply(inlineEdit.originalText));\n\t\t\tdiff = lineRangeMappingFromRangeMappings(mappings, inlineEdit.originalText, newText);\n\t\t} else {\n\t\t\tmappings = [];\n\t\t\tdiff = [];\n\t\t\tnewText = inlineEdit.originalText;\n\t\t}\n\n\n\t\tlet state = this._determineRenderState(model, reader, diff, newText);\n\t\tif (!state) {\n\t\t\tonUnexpectedError(new Error(`unable to determine view: tried to render ${this._previousView?.view}`));\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst longDistanceHint = this._getLongDistanceHintState(model, reader);\n\n\t\tif (longDistanceHint && longDistanceHint.isVisible) {\n\t\t\tstate.viewData.setLongDistanceViewData(longDistanceHint.lineNumber, inlineEdit.lineEdit.lineRange.startLineNumber);\n\t\t}\n\n\t\tif (state.kind === InlineCompletionViewKind.SideBySide) {\n\t\t\tconst indentationAdjustmentEdit = createReindentEdit(newText.getValue(), inlineEdit.modifiedLineRange, textModel.getOptions().tabSize);\n\t\t\tnewText = new StringText(indentationAdjustmentEdit.applyToString(newText.getValue()));\n\n\t\t\tmappings = applyEditToModifiedRangeMappings(mappings, indentationAdjustmentEdit);\n\t\t\tdiff = lineRangeMappingFromRangeMappings(mappings, inlineEdit.originalText, newText);\n\t\t}\n\n\t\tthis._previewTextModel.setLanguage(textModel.getLanguageId());\n\n\t\tconst previousNewText = this._previewTextModel.getValue();\n\t\tif (previousNewText !== newText.getValue()) {\n\t\t\tthis._previewTextModel.setEOL(textModel.getEndOfLineSequence());\n\t\t\tconst updateOldValueEdit = StringEdit.replace(new OffsetRange(0, previousNewText.length), newText.getValue());\n\t\t\tconst updateOldValueEditSmall = updateOldValueEdit.removeCommonSuffixPrefix(previousNewText);\n\n\t\t\tconst textEdit = getPositionOffsetTransformerFromTextModel(this._previewTextModel).getTextEdit(updateOldValueEditSmall);\n\t\t\tthis._previewTextModel.edit(textEdit);\n\t\t}\n\n\t\tif (this._showCollapsed.read(reader)) {\n\t\t\tstate = { kind: InlineCompletionViewKind.Collapsed as const, viewData: state.viewData };\n\t\t}\n\n\t\tmodel.handleInlineEditShownNextFrame(state.kind, state.viewData);\n\n\t\tconst nextCursorPosition = inlineEdit.action?.kind === 'jumpTo' ? inlineEdit.action.position : null;\n\n\t\treturn {\n\t\t\tstate,\n\t\t\tdiff,\n\t\t\tedit: inlineEdit,\n\t\t\tnewText: newText.getValue(),\n\t\t\tnewTextLineCount: inlineEdit.modifiedLineRange.length,\n\t\t\tisInDiffEditor: model.isInDiffEditor,\n\t\t\tlongDistanceHint,\n\t\t\tnextCursorPosition: nextCursorPosition,\n\t\t};\n\t});\n\n\tprivate readonly _previewTextModel;\n\n\n\tpublic readonly inlineEditsIsHovered = derived(this, reader => {\n\t\treturn this._sideBySide.isHovered.read(reader)\n\t\t\t|| this._wordReplacementViews.read(reader).some(v => v.isHovered.read(reader))\n\t\t\t|| this._deletion.isHovered.read(reader)\n\t\t\t|| this._inlineDiffView.isHovered.read(reader)\n\t\t\t|| this._lineReplacementView.isHovered.read(reader)\n\t\t\t|| this._insertion.isHovered.read(reader)\n\t\t\t|| this._customView.isHovered.read(reader)\n\t\t\t|| this._longDistanceHint.map((v, r) => v?.isHovered.read(r) ?? false).read(reader);\n\t});\n\n\tprivate readonly _sideBySide;\n\n\tprotected readonly _deletion;\n\n\tprotected readonly _insertion;\n\n\tprivate readonly _inlineDiffViewState;\n\n\tpublic readonly _inlineCollapsedView;\n\n\tprivate readonly _customView;\n\tprotected readonly _longDistanceHint;\n\n\tprotected readonly _inlineDiffView;\n\n\tprotected readonly _wordReplacementViews;\n\n\tprotected readonly _lineReplacementView;\n\n\tprotected readonly _jumpToView;\n\n\tpublic readonly gutterIndicatorOffset = derived<number>(this, reader => {\n\t\t// TODO: have a better way to tell the gutter indicator view where the edit is inside a viewzone\n\t\tif (this._uiState.read(reader)?.state?.kind === 'insertionMultiLine') {\n\t\t\treturn this._insertion.startLineOffset.read(reader);\n\t\t}\n\t\treturn 0;\n\t});\n\n\tprivate _getCacheId(model: ModelPerInlineEdit) {\n\t\treturn model.inlineEdit.inlineCompletion.identity.id;\n\t}\n\n\tprivate _determineView(model: ModelPerInlineEdit, reader: IReader, diff: DetailedLineRangeMapping[], newText: AbstractText): 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\tconst action = model.inlineEdit.inlineCompletion.action;\n\t\tif (action?.kind === 'edit' && action.alternativeAction) {\n\t\t\treturn InlineCompletionViewKind.WordReplacements;\n\t\t}\n\n\t\tconst uri = action?.kind === 'edit' ? action.uri : undefined;\n\t\tif (uri !== undefined) {\n\t\t\treturn InlineCompletionViewKind.Custom;\n\t\t}\n\n\t\tif (model.displayLocation && !model.inlineEdit.inlineCompletion.identity.jumpedTo.read(reader)) {\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: ModelPerInlineEdit, reader: IReader, diff: DetailedLineRangeMapping[], newText: AbstractText) {\n\t\tif (model.inlineEdit.action?.kind === 'jumpTo') {\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.JumpTo as const,\n\t\t\t\tposition: model.inlineEdit.action.position,\n\t\t\t\tviewData: emptyViewData,\n\t\t\t};\n\t\t}\n\n\t\tconst inlineEdit = model.inlineEdit;\n\n\t\tlet view = this._determineView(model, reader, diff, newText);\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\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 viewData = getViewData(inlineEdit, stringChanges, textModel);\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\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\talternativeAction: model.inlineEdit.action?.alternativeAction,\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\nconst emptyViewData = new InlineCompletionViewData(-1, -1, -1, -1, -1, -1, -1, true);\nfunction getViewData(inlineEdit: InlineEditWithChanges, stringChanges: { originalRange: Range; modifiedRange: Range; original: string; modified: string }[], textModel: ITextModel) {\n\tif (!inlineEdit.edit) {\n\t\treturn emptyViewData;\n\t}\n\n\tconst cursorPosition = inlineEdit.cursorPosition;\n\tconst startsWithEOL = stringChanges.length === 0 ? false : stringChanges[0].modified.startsWith(textModel.getEOL());\n\tconst viewData = new InlineCompletionViewData(\n\t\tinlineEdit.edit.replacements.length === 0 ? 0 : inlineEdit.edit.replacements[0].range.getStartPosition().column - cursorPosition.column,\n\t\tinlineEdit.lineEdit.lineRange.startLineNumber - cursorPosition.lineNumber + (startsWithEOL && inlineEdit.lineEdit.lineRange.startLineNumber >= cursorPosition.lineNumber ? 1 : 0),\n\t\tinlineEdit.lineEdit.lineRange.length,\n\t\tinlineEdit.lineEdit.newLines.length,\n\t\tstringChanges.reduce((acc, r) => acc + r.original.length, 0),\n\t\tstringChanges.reduce((acc, r) => acc + r.modified.length, 0),\n\t\tstringChanges.length,\n\t\tstringChanges.every(r => r.original === stringChanges[0].original && r.modified === stringChanges[0].modified)\n\t);\n\treturn viewData;\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: AbstractText) {\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","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { $ } from '../../../../../../base/browser/dom.js';\nimport { equals } from '../../../../../../base/common/equals.js';\nimport { BugIndicatingError, onUnexpectedError } from '../../../../../../base/common/errors.js';\nimport { Event } from '../../../../../../base/common/event.js';\nimport { Disposable } from '../../../../../../base/common/lifecycle.js';\nimport { autorun, derived, derivedOpts, IObservable, IReader, mapObservableArrayCached, observableValue } from '../../../../../../base/common/observable.js';\nimport { IInstantiationService } from '../../../../../../platform/instantiation/common/instantiation.js';\nimport { ICodeEditor } from '../../../../../browser/editorBrowser.js';\nimport { ObservableCodeEditor, observableCodeEditor } from '../../../../../browser/observableCodeEditor.js';\nimport { EditorOption } from '../../../../../common/config/editorOptions.js';\nimport { TextReplacement } from '../../../../../common/core/edits/textEdit.js';\nimport { Position } from '../../../../../common/core/position.js';\nimport { Range } from '../../../../../common/core/range.js';\nimport { LineRange } from '../../../../../common/core/ranges/lineRange.js';\nimport { AbstractText, StringText } from '../../../../../common/core/text/abstractText.js';\nimport { TextLength } from '../../../../../common/core/text/textLength.js';\nimport { DetailedLineRangeMapping, lineRangeMappingFromRangeMappings, RangeMapping } from '../../../../../common/diff/rangeMapping.js';\nimport { ITextModel } from '../../../../../common/model.js';\nimport { TextModel } from '../../../../../common/model/textModel.js';\nimport { InlineSuggestionIdentity } from '../../model/inlineSuggestionItem.js';\nimport { InlineSuggestionGutterMenuData, SimpleInlineSuggestModel } from './components/gutterIndicatorView.js';\nimport { InlineEditWithChanges } from './inlineEditWithChanges.js';\nimport { ModelPerInlineEdit } from './inlineEditsModel.js';\nimport { 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 { ILongDistanceHint, ILongDistanceViewState, InlineEditsLongDistanceHint } from './inlineEditsViews/longDistanceHint/inlineEditsLongDistanceHint.js';\nimport { InlineEditsSideBySideView } from './inlineEditsViews/inlineEditsSideBySideView.js';\nimport { InlineEditsWordReplacementView, WordReplacementsViewData } from './inlineEditsViews/inlineEditsWordReplacementView.js';\nimport { IOriginalEditorInlineDiffViewState, OriginalEditorInlineDiffView } from './inlineEditsViews/originalEditorInlineDiffView.js';\nimport { applyEditToModifiedRangeMappings, createReindentEdit } from './utils/utils.js';\nimport './view.css';\nimport { JumpToView } from './inlineEditsViews/jumpToView.js';\nimport { StringEdit } from '../../../../../common/core/edits/stringEdit.js';\nimport { OffsetRange } from '../../../../../common/core/ranges/offsetRange.js';\nimport { getPositionOffsetTransformerFromTextModel } from '../../../../../common/core/text/getPositionOffsetTransformerFromTextModel.js';\n\nexport class InlineEditsView extends Disposable {\n\tprivate readonly _editorObs: ObservableCodeEditor;\n\n\tprivate readonly _useCodeShifting;\n\tprivate readonly _renderSideBySide;\n\tprivate readonly _tabAction = derived<InlineEditTabAction>(reader => this._model.read(reader)?.tabAction.read(reader) ?? InlineEditTabAction.Inactive);\n\n\tprivate _previousView: { // TODO, move into identity\n\t\tid: string;\n\t\tview: ReturnType<typeof InlineEditsView.prototype._determineView>;\n\t\teditorWidth: number;\n\t\ttimestamp: number;\n\t} | undefined;\n\tprivate readonly _showLongDistanceHint: IObservable<boolean>;\n\n\tconstructor(\n\t\tprivate readonly _editor: ICodeEditor,\n\t\tprivate readonly _model: IObservable<ModelPerInlineEdit | undefined>,\n\t\tprivate readonly _simpleModel: IObservable<SimpleInlineSuggestModel | undefined>,\n\t\tprivate readonly _inlineSuggestInfo: IObservable<InlineSuggestionGutterMenuData | undefined>,\n\t\tprivate readonly _showCollapsed: IObservable<boolean>,\n\n\t\t@IInstantiationService private readonly _instantiationService: IInstantiationService\n\t) {\n\t\tsuper();\n\t\tthis._editorObs = observableCodeEditor(this._editor);\n\t\tthis._constructorDone = observableValue(this, false);\n\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\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\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 === InlineCompletionViewKind.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 === InlineCompletionViewKind.Custom ? m?.displayLocation : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\n\t\tthis._showLongDistanceHint = this._editorObs.getOption(EditorOption.inlineSuggest).map(this, s => s.edits.showLongDistanceHint);\n\t\tthis._longDistanceHint = derived(this, reader => {\n\t\t\tif (!this._showLongDistanceHint.read(reader)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn reader.store.add(this._instantiationService.createInstance(InlineEditsLongDistanceHint,\n\t\t\t\tthis._editor,\n\t\t\t\tthis._uiState.map<ILongDistanceViewState | undefined>((s, reader) => s?.longDistanceHint ? ({\n\t\t\t\t\thint: s.longDistanceHint,\n\t\t\t\t\tnewTextLineCount: s.newTextLineCount,\n\t\t\t\t\tedit: s.edit,\n\t\t\t\t\tdiff: s.diff,\n\t\t\t\t\tmodel: this._simpleModel.read(reader)!,\n\t\t\t\t\tinlineSuggestInfo: this._inlineSuggestInfo.read(reader)!,\n\t\t\t\t\tnextCursorPosition: s.nextCursorPosition,\n\t\t\t\t}) : undefined),\n\t\t\t\tthis._previewTextModel,\n\t\t\t\tthis._tabAction,\n\t\t\t));\n\t\t}).recomputeInitiallyAndOnChange(this._store);\n\n\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' || e.state.kind === 'jumpTo') {\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._inlineDiffView = this._register(new OriginalEditorInlineDiffView(this._editor, this._inlineDiffViewState, this._previewTextModel));\n\t\tthis._jumpToView = this._register(this._instantiationService.createInstance(JumpToView, this._editorObs, { style: 'label' }, derived(reader => {\n\t\t\tconst s = this._uiState.read(reader);\n\t\t\tif (s?.state?.kind === InlineCompletionViewKind.JumpTo) {\n\t\t\t\treturn { jumpToPosition: s.state.position };\n\t\t\t}\n\t\t\treturn undefined;\n\t\t})));\n\t\tconst wordReplacements = derivedOpts({\n\t\t\tequalsFn: equals.arrayC(equals.thisC())\n\t\t}, reader => {\n\t\t\tconst s = this._uiState.read(reader);\n\t\t\treturn s?.state?.kind === InlineCompletionViewKind.WordReplacements ? s.state.replacements.map(replacement => new WordReplacementsViewData(replacement, s.state?.alternativeAction)) : [];\n\t\t});\n\t\tthis._wordReplacementViews = mapObservableArrayCached(this, wordReplacements, (viewData, store) => {\n\t\t\treturn store.add(this._instantiationService.createInstance(InlineEditsWordReplacementView, this._editorObs, viewData, 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(autorun((reader) => {\n\t\t\tconst model = this._model.read(reader);\n\t\t\tif (!model) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treader.store.add(\n\t\t\t\tEvent.any(\n\t\t\t\t\tthis._sideBySide.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)(clickEvent => {\n\t\t\t\t\tif (this._viewHasBeenShownLongerThan(350)) {\n\t\t\t\t\t\tclickEvent.event.preventDefault();\n\t\t\t\t\t\tmodel.accept(clickEvent.alternativeAction);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t);\n\t\t}));\n\n\t\tthis._wordReplacementViews.recomputeInitiallyAndOnChange(this._store);\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\tlet viewZoneId: string | undefined;\n\t\tthis._register(autorun(reader => {\n\t\t\tconst minScrollHeight = minEditorScrollHeight.read(reader);\n\t\t\tconst textModel = this._editorObs.model.read(reader);\n\t\t\tif (!textModel) { return; }\n\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 !== undefined) {\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\tpublic readonly displayRange = derived<LineRange | undefined>(this, reader => {\n\t\tconst state = this._uiState.read(reader);\n\t\tif (!state) { return undefined; }\n\t\tif (state.state?.kind === 'custom') {\n\t\t\tconst range = state.state.displayLocation?.range;\n\t\t\tif (!range) {\n\t\t\t\tthrow new BugIndicatingError('custom view should have a range');\n\t\t\t}\n\t\t\treturn new LineRange(range.startLineNumber, range.endLineNumber);\n\t\t}\n\n\t\tif (state.state?.kind === 'insertionMultiLine') {\n\t\t\treturn this._insertion.originalLines.read(reader);\n\t\t}\n\n\t\treturn state.edit.displayRange;\n\t});\n\n\n\tprivate _currentInlineEditCache: {\n\t\tinlineSuggestionIdentity: InlineSuggestionIdentity;\n\t\tfirstCursorLineNumber: number;\n\t} | undefined = undefined;\n\n\tprivate _getLongDistanceHintState(model: ModelPerInlineEdit, reader: IReader): ILongDistanceHint | undefined {\n\t\tif (model.inlineEdit.inlineCompletion.identity.jumpedTo.read(reader)) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (model.inlineEdit.action === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (this._currentInlineEditCache?.inlineSuggestionIdentity !== model.inlineEdit.inlineCompletion.identity) {\n\t\t\tthis._currentInlineEditCache = {\n\t\t\t\tinlineSuggestionIdentity: model.inlineEdit.inlineCompletion.identity,\n\t\t\t\tfirstCursorLineNumber: model.inlineEdit.cursorPosition.lineNumber,\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tlineNumber: this._currentInlineEditCache.firstCursorLineNumber,\n\t\t\tisVisible: !model.inViewPort.read(reader),\n\t\t};\n\t}\n\n\tprivate readonly _constructorDone;\n\n\tprivate readonly _uiState = derived<{\n\t\tstate: ReturnType<typeof InlineEditsView.prototype._determineRenderState>;\n\t\tdiff: DetailedLineRangeMapping[];\n\t\tedit: InlineEditWithChanges;\n\t\tnewText: string;\n\t\tnewTextLineCount: number;\n\t\tisInDiffEditor: boolean;\n\t\tlongDistanceHint: ILongDistanceHint | undefined;\n\t\tnextCursorPosition: Position | null;\n\t} | undefined>(this, reader => {\n\t\tconst model = this._model.read(reader);\n\t\tconst textModel = this._editorObs.model.read(reader);\n\t\tif (!model || !textModel || !this._constructorDone.read(reader)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst inlineEdit = model.inlineEdit;\n\t\tlet diff: DetailedLineRangeMapping[];\n\t\tlet mappings: RangeMapping[];\n\n\t\tlet newText: AbstractText | undefined = undefined;\n\n\t\tif (inlineEdit.edit) {\n\t\t\tmappings = RangeMapping.fromEdit(inlineEdit.edit);\n\t\t\tnewText = new StringText(inlineEdit.edit.apply(inlineEdit.originalText));\n\t\t\tdiff = lineRangeMappingFromRangeMappings(mappings, inlineEdit.originalText, newText);\n\t\t} else {\n\t\t\tmappings = [];\n\t\t\tdiff = [];\n\t\t\tnewText = inlineEdit.originalText;\n\t\t}\n\n\n\t\tlet state = this._determineRenderState(model, reader, diff, newText);\n\t\tif (!state) {\n\t\t\tonUnexpectedError(new Error(`unable to determine view: tried to render ${this._previousView?.view}`));\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst longDistanceHint = this._getLongDistanceHintState(model, reader);\n\n\t\tif (longDistanceHint && longDistanceHint.isVisible) {\n\t\t\tstate.viewData.setLongDistanceViewData(longDistanceHint.lineNumber, inlineEdit.lineEdit.lineRange.startLineNumber);\n\t\t}\n\n\t\tif (state.kind === InlineCompletionViewKind.SideBySide) {\n\t\t\tconst indentationAdjustmentEdit = createReindentEdit(newText.getValue(), inlineEdit.modifiedLineRange, textModel.getOptions().tabSize);\n\t\t\tnewText = new StringText(indentationAdjustmentEdit.applyToString(newText.getValue()));\n\n\t\t\tmappings = applyEditToModifiedRangeMappings(mappings, indentationAdjustmentEdit);\n\t\t\tdiff = lineRangeMappingFromRangeMappings(mappings, inlineEdit.originalText, newText);\n\t\t}\n\n\t\tthis._previewTextModel.setLanguage(textModel.getLanguageId());\n\n\t\tconst previousNewText = this._previewTextModel.getValue();\n\t\tif (previousNewText !== newText.getValue()) {\n\t\t\tthis._previewTextModel.setEOL(textModel.getEndOfLineSequence());\n\t\t\tconst updateOldValueEdit = StringEdit.replace(new OffsetRange(0, previousNewText.length), newText.getValue());\n\t\t\tconst updateOldValueEditSmall = updateOldValueEdit.removeCommonSuffixPrefix(previousNewText);\n\n\t\t\tconst textEdit = getPositionOffsetTransformerFromTextModel(this._previewTextModel).getTextEdit(updateOldValueEditSmall);\n\t\t\tthis._previewTextModel.edit(textEdit);\n\t\t}\n\n\t\tif (this._showCollapsed.read(reader)) {\n\t\t\tstate = { kind: InlineCompletionViewKind.Collapsed as const, viewData: state.viewData };\n\t\t}\n\n\t\tmodel.handleInlineEditShownNextFrame(state.kind, state.viewData);\n\n\t\tconst nextCursorPosition = inlineEdit.action?.kind === 'jumpTo' ? inlineEdit.action.position : null;\n\n\t\treturn {\n\t\t\tstate,\n\t\t\tdiff,\n\t\t\tedit: inlineEdit,\n\t\t\tnewText: newText.getValue(),\n\t\t\tnewTextLineCount: inlineEdit.modifiedLineRange.length,\n\t\t\tisInDiffEditor: model.isInDiffEditor,\n\t\t\tlongDistanceHint,\n\t\t\tnextCursorPosition: nextCursorPosition,\n\t\t};\n\t});\n\n\tprivate readonly _previewTextModel;\n\n\n\tpublic readonly inlineEditsIsHovered = derived(this, reader => {\n\t\treturn this._sideBySide.isHovered.read(reader)\n\t\t\t|| this._wordReplacementViews.read(reader).some(v => v.isHovered.read(reader))\n\t\t\t|| this._deletion.isHovered.read(reader)\n\t\t\t|| this._inlineDiffView.isHovered.read(reader)\n\t\t\t|| this._lineReplacementView.isHovered.read(reader)\n\t\t\t|| this._insertion.isHovered.read(reader)\n\t\t\t|| this._customView.isHovered.read(reader)\n\t\t\t|| this._longDistanceHint.map((v, r) => v?.isHovered.read(r) ?? false).read(reader);\n\t});\n\n\tprivate readonly _sideBySide;\n\n\tprotected readonly _deletion;\n\n\tprotected readonly _insertion;\n\n\tprivate readonly _inlineDiffViewState;\n\n\tpublic readonly _inlineCollapsedView;\n\n\tprivate readonly _customView;\n\tprotected readonly _longDistanceHint;\n\n\tprotected readonly _inlineDiffView;\n\n\tprotected readonly _wordReplacementViews;\n\n\tprotected readonly _lineReplacementView;\n\n\tprotected readonly _jumpToView;\n\n\tpublic readonly gutterIndicatorOffset = derived<number>(this, reader => {\n\t\t// TODO: have a better way to tell the gutter indicator view where the edit is inside a viewzone\n\t\tif (this._uiState.read(reader)?.state?.kind === 'insertionMultiLine') {\n\t\t\treturn this._insertion.startLineOffset.read(reader);\n\t\t}\n\t\treturn 0;\n\t});\n\n\tprivate _getCacheId(model: ModelPerInlineEdit) {\n\t\treturn model.inlineEdit.inlineCompletion.identity.id;\n\t}\n\n\tprivate _determineView(model: ModelPerInlineEdit, reader: IReader, diff: DetailedLineRangeMapping[], newText: AbstractText): 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\tconst action = model.inlineEdit.inlineCompletion.action;\n\t\tif (action?.kind === 'edit' && action.alternativeAction) {\n\t\t\treturn InlineCompletionViewKind.WordReplacements;\n\t\t}\n\n\t\tconst uri = action?.kind === 'edit' ? action.uri : undefined;\n\t\tif (uri !== undefined) {\n\t\t\treturn InlineCompletionViewKind.Custom;\n\t\t}\n\n\t\tif (model.displayLocation && !model.inlineEdit.inlineCompletion.identity.jumpedTo.read(reader)) {\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: ModelPerInlineEdit, reader: IReader, diff: DetailedLineRangeMapping[], newText: AbstractText) {\n\t\tif (model.inlineEdit.action?.kind === 'jumpTo') {\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.JumpTo as const,\n\t\t\t\tposition: model.inlineEdit.action.position,\n\t\t\t\tviewData: emptyViewData,\n\t\t\t};\n\t\t}\n\n\t\tconst inlineEdit = model.inlineEdit;\n\n\t\tlet view = this._determineView(model, reader, diff, newText);\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\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 viewData = getViewData(inlineEdit, stringChanges, textModel);\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\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\talternativeAction: model.inlineEdit.action?.alternativeAction,\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\nconst emptyViewData = new InlineCompletionViewData(-1, -1, -1, -1, -1, -1, -1, true);\nfunction getViewData(inlineEdit: InlineEditWithChanges, stringChanges: { originalRange: Range; modifiedRange: Range; original: string; modified: string }[], textModel: ITextModel) {\n\tif (!inlineEdit.edit) {\n\t\treturn emptyViewData;\n\t}\n\n\tconst cursorPosition = inlineEdit.cursorPosition;\n\tconst startsWithEOL = stringChanges.length === 0 ? false : stringChanges[0].modified.startsWith(textModel.getEOL());\n\tconst viewData = new InlineCompletionViewData(\n\t\tinlineEdit.edit.replacements.length === 0 ? 0 : inlineEdit.edit.replacements[0].range.getStartPosition().column - cursorPosition.column,\n\t\tinlineEdit.lineEdit.lineRange.startLineNumber - cursorPosition.lineNumber + (startsWithEOL && inlineEdit.lineEdit.lineRange.startLineNumber >= cursorPosition.lineNumber ? 1 : 0),\n\t\tinlineEdit.lineEdit.lineRange.length,\n\t\tinlineEdit.lineEdit.newLines.length,\n\t\tstringChanges.reduce((acc, r) => acc + r.original.length, 0),\n\t\tstringChanges.reduce((acc, r) => acc + r.modified.length, 0),\n\t\tstringChanges.length,\n\t\tstringChanges.every(r => r.original === stringChanges[0].original && r.modified === stringChanges[0].modified)\n\t);\n\treturn viewData;\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: AbstractText) {\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"]}
|
|
1
|
+
{"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.ts","vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.ts"],"names":[],"mappings":"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","file":"inlineEditsView.js","sourceRoot":"file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { $ } from '../../../../../../base/browser/dom.js';\nimport { equals } from '../../../../../../base/common/equals.js';\nimport { BugIndicatingError, onUnexpectedError } from '../../../../../../base/common/errors.js';\nimport { Event } from '../../../../../../base/common/event.js';\nimport { Disposable } from '../../../../../../base/common/lifecycle.js';\nimport { autorun, derived, derivedOpts, IObservable, IReader, mapObservableArrayCached, observableValue } from '../../../../../../base/common/observable.js';\nimport { IInstantiationService } from '../../../../../../platform/instantiation/common/instantiation.js';\nimport { ICodeEditor } from '../../../../../browser/editorBrowser.js';\nimport { ObservableCodeEditor, observableCodeEditor } from '../../../../../browser/observableCodeEditor.js';\nimport { EditorOption } from '../../../../../common/config/editorOptions.js';\nimport { TextReplacement } from '../../../../../common/core/edits/textEdit.js';\nimport { Position } from '../../../../../common/core/position.js';\nimport { Range } from '../../../../../common/core/range.js';\nimport { LineRange } from '../../../../../common/core/ranges/lineRange.js';\nimport { AbstractText, StringText } from '../../../../../common/core/text/abstractText.js';\nimport { TextLength } from '../../../../../common/core/text/textLength.js';\nimport { DetailedLineRangeMapping, lineRangeMappingFromRangeMappings, RangeMapping } from '../../../../../common/diff/rangeMapping.js';\nimport { ITextModel } from '../../../../../common/model.js';\nimport { TextModel } from '../../../../../common/model/textModel.js';\nimport { InlineSuggestionIdentity } from '../../model/inlineSuggestionItem.js';\nimport { InlineSuggestionGutterMenuData, SimpleInlineSuggestModel } from './components/gutterIndicatorView.js';\nimport { InlineEditWithChanges } from './inlineEditWithChanges.js';\nimport { ModelPerInlineEdit } from './inlineEditsModel.js';\nimport { 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 { ILongDistanceHint, ILongDistanceViewState, InlineEditsLongDistanceHint } from './inlineEditsViews/longDistanceHint/inlineEditsLongDistanceHint.js';\nimport { InlineEditsSideBySideView } from './inlineEditsViews/inlineEditsSideBySideView.js';\nimport { InlineEditsWordReplacementView, WordReplacementsViewData } from './inlineEditsViews/inlineEditsWordReplacementView.js';\nimport { IOriginalEditorInlineDiffViewState, OriginalEditorInlineDiffView } from './inlineEditsViews/originalEditorInlineDiffView.js';\nimport { applyEditToModifiedRangeMappings, createReindentEdit } from './utils/utils.js';\nimport './view.css';\nimport { JumpToView } from './inlineEditsViews/jumpToView.js';\nimport { StringEdit } from '../../../../../common/core/edits/stringEdit.js';\nimport { OffsetRange } from '../../../../../common/core/ranges/offsetRange.js';\nimport { getPositionOffsetTransformerFromTextModel } from '../../../../../common/core/text/getPositionOffsetTransformerFromTextModel.js';\nimport { InlineCompletionEditorType } from '../../model/provideInlineCompletions.js';\n\nexport class InlineEditsView extends Disposable {\n\tprivate readonly _editorObs: ObservableCodeEditor;\n\n\tprivate readonly _useCodeShifting;\n\tprivate readonly _renderSideBySide;\n\tprivate readonly _tabAction = derived<InlineEditTabAction>(reader => this._model.read(reader)?.tabAction.read(reader) ?? InlineEditTabAction.Inactive);\n\n\tprivate _previousView: { // TODO, move into identity\n\t\tid: string;\n\t\tview: ReturnType<typeof InlineEditsView.prototype._determineView>;\n\t\teditorWidth: number;\n\t\ttimestamp: number;\n\t} | undefined;\n\tprivate readonly _showLongDistanceHint: IObservable<boolean>;\n\n\tconstructor(\n\t\tprivate readonly _editor: ICodeEditor,\n\t\tprivate readonly _model: IObservable<ModelPerInlineEdit | undefined>,\n\t\tprivate readonly _simpleModel: IObservable<SimpleInlineSuggestModel | undefined>,\n\t\tprivate readonly _inlineSuggestInfo: IObservable<InlineSuggestionGutterMenuData | undefined>,\n\t\tprivate readonly _showCollapsed: IObservable<boolean>,\n\n\t\t@IInstantiationService private readonly _instantiationService: IInstantiationService\n\t) {\n\t\tsuper();\n\t\tthis._editorObs = observableCodeEditor(this._editor);\n\t\tthis._constructorDone = observableValue(this, false);\n\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\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\teditorType: s.editorType,\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\teditorType: s.editorType,\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\teditorType: s.editorType,\n\t\t\t}) : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\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 === InlineCompletionViewKind.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 === InlineCompletionViewKind.Custom ? m?.displayLocation : undefined),\n\t\t\tthis._tabAction,\n\t\t\tthis._uiState.map(s => s?.editorType ?? InlineCompletionEditorType.TextEditor),\n\t\t));\n\n\t\tthis._showLongDistanceHint = this._editorObs.getOption(EditorOption.inlineSuggest).map(this, s => s.edits.showLongDistanceHint);\n\t\tthis._longDistanceHint = derived(this, reader => {\n\t\t\tif (!this._showLongDistanceHint.read(reader)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn reader.store.add(this._instantiationService.createInstance(InlineEditsLongDistanceHint,\n\t\t\t\tthis._editor,\n\t\t\t\tthis._uiState.map<ILongDistanceViewState | undefined>((s, reader) => s?.longDistanceHint ? ({\n\t\t\t\t\thint: s.longDistanceHint,\n\t\t\t\t\tnewTextLineCount: s.newTextLineCount,\n\t\t\t\t\tedit: s.edit,\n\t\t\t\t\tdiff: s.diff,\n\t\t\t\t\teditorType: s.editorType,\n\t\t\t\t\tmodel: this._simpleModel.read(reader)!,\n\t\t\t\t\tinlineSuggestInfo: this._inlineSuggestInfo.read(reader)!,\n\t\t\t\t\tnextCursorPosition: s.nextCursorPosition,\n\t\t\t\t}) : undefined),\n\t\t\t\tthis._previewTextModel,\n\t\t\t\tthis._tabAction,\n\t\t\t));\n\t\t}).recomputeInitiallyAndOnChange(this._store);\n\n\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' || e.state.kind === 'jumpTo') {\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\teditorType: e.editorType,\n\t\t\t};\n\t\t});\n\t\tthis._inlineDiffView = this._register(new OriginalEditorInlineDiffView(this._editor, this._inlineDiffViewState, this._previewTextModel));\n\t\tthis._jumpToView = this._register(this._instantiationService.createInstance(JumpToView, this._editorObs, { style: 'label' }, derived(reader => {\n\t\t\tconst s = this._uiState.read(reader);\n\t\t\tif (s?.state?.kind === InlineCompletionViewKind.JumpTo) {\n\t\t\t\treturn { jumpToPosition: s.state.position };\n\t\t\t}\n\t\t\treturn undefined;\n\t\t})));\n\t\tconst wordReplacements = derivedOpts({\n\t\t\tequalsFn: equals.arrayC(equals.thisC())\n\t\t}, reader => {\n\t\t\tconst s = this._uiState.read(reader);\n\t\t\treturn s?.state?.kind === InlineCompletionViewKind.WordReplacements ? s.state.replacements.map(replacement => new WordReplacementsViewData(replacement, s.editorType, s.state?.alternativeAction)) : [];\n\t\t});\n\t\tthis._wordReplacementViews = mapObservableArrayCached(this, wordReplacements, (viewData, store) => {\n\t\t\treturn store.add(this._instantiationService.createInstance(InlineEditsWordReplacementView, this._editorObs, viewData, 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?.editorType ?? InlineCompletionEditorType.TextEditor),\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(autorun((reader) => {\n\t\t\tconst model = this._model.read(reader);\n\t\t\tif (!model) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treader.store.add(\n\t\t\t\tEvent.any(\n\t\t\t\t\tthis._sideBySide.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)(clickEvent => {\n\t\t\t\t\tif (this._viewHasBeenShownLongerThan(350)) {\n\t\t\t\t\t\tclickEvent.event.preventDefault();\n\t\t\t\t\t\tmodel.accept(clickEvent.alternativeAction);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t);\n\t\t}));\n\n\t\tthis._wordReplacementViews.recomputeInitiallyAndOnChange(this._store);\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\tlet viewZoneId: string | undefined;\n\t\tthis._register(autorun(reader => {\n\t\t\tconst minScrollHeight = minEditorScrollHeight.read(reader);\n\t\t\tconst textModel = this._editorObs.model.read(reader);\n\t\t\tif (!textModel) { return; }\n\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 !== undefined) {\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\tpublic readonly displayRange = derived<LineRange | undefined>(this, reader => {\n\t\tconst state = this._uiState.read(reader);\n\t\tif (!state) { return undefined; }\n\t\tif (state.state?.kind === 'custom') {\n\t\t\tconst range = state.state.displayLocation?.range;\n\t\t\tif (!range) {\n\t\t\t\tthrow new BugIndicatingError('custom view should have a range');\n\t\t\t}\n\t\t\treturn new LineRange(range.startLineNumber, range.endLineNumber);\n\t\t}\n\n\t\tif (state.state?.kind === 'insertionMultiLine') {\n\t\t\treturn this._insertion.originalLines.read(reader);\n\t\t}\n\n\t\treturn state.edit.displayRange;\n\t});\n\n\n\tprivate _currentInlineEditCache: {\n\t\tinlineSuggestionIdentity: InlineSuggestionIdentity;\n\t\tfirstCursorLineNumber: number;\n\t} | undefined = undefined;\n\n\tprivate _getLongDistanceHintState(model: ModelPerInlineEdit, reader: IReader): ILongDistanceHint | undefined {\n\t\tif (model.inlineEdit.inlineCompletion.identity.jumpedTo.read(reader)) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (model.inlineEdit.action === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (this._currentInlineEditCache?.inlineSuggestionIdentity !== model.inlineEdit.inlineCompletion.identity) {\n\t\t\tthis._currentInlineEditCache = {\n\t\t\t\tinlineSuggestionIdentity: model.inlineEdit.inlineCompletion.identity,\n\t\t\t\tfirstCursorLineNumber: model.inlineEdit.cursorPosition.lineNumber,\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tlineNumber: this._currentInlineEditCache.firstCursorLineNumber,\n\t\t\tisVisible: !model.inViewPort.read(reader),\n\t\t};\n\t}\n\n\tprivate readonly _constructorDone;\n\n\tprivate readonly _uiState = derived<{\n\t\tstate: ReturnType<typeof InlineEditsView.prototype._determineRenderState>;\n\t\tdiff: DetailedLineRangeMapping[];\n\t\tedit: InlineEditWithChanges;\n\t\tnewText: string;\n\t\tnewTextLineCount: number;\n\t\teditorType: InlineCompletionEditorType;\n\t\tlongDistanceHint: ILongDistanceHint | undefined;\n\t\tnextCursorPosition: Position | null;\n\t} | undefined>(this, reader => {\n\t\tconst model = this._model.read(reader);\n\t\tconst textModel = this._editorObs.model.read(reader);\n\t\tif (!model || !textModel || !this._constructorDone.read(reader)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst inlineEdit = model.inlineEdit;\n\t\tlet diff: DetailedLineRangeMapping[];\n\t\tlet mappings: RangeMapping[];\n\n\t\tlet newText: AbstractText | undefined = undefined;\n\n\t\tif (inlineEdit.edit) {\n\t\t\tmappings = RangeMapping.fromEdit(inlineEdit.edit);\n\t\t\tnewText = new StringText(inlineEdit.edit.apply(inlineEdit.originalText));\n\t\t\tdiff = lineRangeMappingFromRangeMappings(mappings, inlineEdit.originalText, newText);\n\t\t} else {\n\t\t\tmappings = [];\n\t\t\tdiff = [];\n\t\t\tnewText = inlineEdit.originalText;\n\t\t}\n\n\n\t\tlet state = this._determineRenderState(model, reader, diff, newText);\n\t\tif (!state) {\n\t\t\tonUnexpectedError(new Error(`unable to determine view: tried to render ${this._previousView?.view}`));\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst longDistanceHint = this._getLongDistanceHintState(model, reader);\n\n\t\tif (longDistanceHint && longDistanceHint.isVisible) {\n\t\t\tstate.viewData.setLongDistanceViewData(longDistanceHint.lineNumber, inlineEdit.lineEdit.lineRange.startLineNumber);\n\t\t}\n\n\t\tif (state.kind === InlineCompletionViewKind.SideBySide) {\n\t\t\tconst indentationAdjustmentEdit = createReindentEdit(newText.getValue(), inlineEdit.modifiedLineRange, textModel.getOptions().tabSize);\n\t\t\tnewText = new StringText(indentationAdjustmentEdit.applyToString(newText.getValue()));\n\n\t\t\tmappings = applyEditToModifiedRangeMappings(mappings, indentationAdjustmentEdit);\n\t\t\tdiff = lineRangeMappingFromRangeMappings(mappings, inlineEdit.originalText, newText);\n\t\t}\n\n\t\tthis._previewTextModel.setLanguage(textModel.getLanguageId());\n\n\t\tconst previousNewText = this._previewTextModel.getValue();\n\t\tif (previousNewText !== newText.getValue()) {\n\t\t\tthis._previewTextModel.setEOL(textModel.getEndOfLineSequence());\n\t\t\tconst updateOldValueEdit = StringEdit.replace(new OffsetRange(0, previousNewText.length), newText.getValue());\n\t\t\tconst updateOldValueEditSmall = updateOldValueEdit.removeCommonSuffixPrefix(previousNewText);\n\n\t\t\tconst textEdit = getPositionOffsetTransformerFromTextModel(this._previewTextModel).getTextEdit(updateOldValueEditSmall);\n\t\t\tthis._previewTextModel.edit(textEdit);\n\t\t}\n\n\t\tif (this._showCollapsed.read(reader)) {\n\t\t\tstate = { kind: InlineCompletionViewKind.Collapsed as const, viewData: state.viewData };\n\t\t}\n\n\t\tmodel.handleInlineEditShownNextFrame(state.kind, state.viewData);\n\n\t\tconst nextCursorPosition = inlineEdit.action?.kind === 'jumpTo' ? inlineEdit.action.position : null;\n\n\t\treturn {\n\t\t\tstate,\n\t\t\tdiff,\n\t\t\tedit: inlineEdit,\n\t\t\tnewText: newText.getValue(),\n\t\t\tnewTextLineCount: inlineEdit.modifiedLineRange.length,\n\t\t\teditorType: model.editorType,\n\t\t\tlongDistanceHint,\n\t\t\tnextCursorPosition: nextCursorPosition,\n\t\t};\n\t});\n\n\tprivate readonly _previewTextModel;\n\n\n\tpublic readonly inlineEditsIsHovered = derived(this, reader => {\n\t\treturn this._sideBySide.isHovered.read(reader)\n\t\t\t|| this._wordReplacementViews.read(reader).some(v => v.isHovered.read(reader))\n\t\t\t|| this._deletion.isHovered.read(reader)\n\t\t\t|| this._inlineDiffView.isHovered.read(reader)\n\t\t\t|| this._lineReplacementView.isHovered.read(reader)\n\t\t\t|| this._insertion.isHovered.read(reader)\n\t\t\t|| this._customView.isHovered.read(reader)\n\t\t\t|| this._longDistanceHint.map((v, r) => v?.isHovered.read(r) ?? false).read(reader);\n\t});\n\n\tprivate readonly _sideBySide;\n\n\tprotected readonly _deletion;\n\n\tprotected readonly _insertion;\n\n\tprivate readonly _inlineDiffViewState;\n\n\tpublic readonly _inlineCollapsedView;\n\n\tprivate readonly _customView;\n\tprotected readonly _longDistanceHint;\n\n\tprotected readonly _inlineDiffView;\n\n\tprotected readonly _wordReplacementViews;\n\n\tprotected readonly _lineReplacementView;\n\n\tprotected readonly _jumpToView;\n\n\tpublic readonly gutterIndicatorOffset = derived<number>(this, reader => {\n\t\t// TODO: have a better way to tell the gutter indicator view where the edit is inside a viewzone\n\t\tif (this._uiState.read(reader)?.state?.kind === 'insertionMultiLine') {\n\t\t\treturn this._insertion.startLineOffset.read(reader);\n\t\t}\n\t\treturn 0;\n\t});\n\n\tprivate _getCacheId(model: ModelPerInlineEdit) {\n\t\treturn model.inlineEdit.inlineCompletion.identity.id;\n\t}\n\n\tprivate _determineView(model: ModelPerInlineEdit, reader: IReader, diff: DetailedLineRangeMapping[], newText: AbstractText): 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\tconst action = model.inlineEdit.inlineCompletion.action;\n\t\tif (action?.kind === 'edit' && action.alternativeAction) {\n\t\t\treturn InlineCompletionViewKind.WordReplacements;\n\t\t}\n\n\t\tconst uri = action?.kind === 'edit' ? action.uri : undefined;\n\t\tif (uri !== undefined) {\n\t\t\treturn InlineCompletionViewKind.Custom;\n\t\t}\n\n\t\tif (model.displayLocation && !model.inlineEdit.inlineCompletion.identity.jumpedTo.read(reader)) {\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.editorType !== InlineCompletionEditorType.DiffEditor) {\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.editorType !== InlineCompletionEditorType.DiffEditor /* 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.editorType === InlineCompletionEditorType.DiffEditor) {\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: ModelPerInlineEdit, reader: IReader, diff: DetailedLineRangeMapping[], newText: AbstractText) {\n\t\tif (model.inlineEdit.action?.kind === 'jumpTo') {\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.JumpTo as const,\n\t\t\t\tposition: model.inlineEdit.action.position,\n\t\t\t\tviewData: emptyViewData,\n\t\t\t};\n\t\t}\n\n\t\tconst inlineEdit = model.inlineEdit;\n\n\t\tlet view = this._determineView(model, reader, diff, newText);\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\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 viewData = getViewData(inlineEdit, stringChanges, textModel);\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\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\talternativeAction: model.inlineEdit.action?.alternativeAction,\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\nconst emptyViewData = new InlineCompletionViewData(-1, -1, -1, -1, -1, -1, -1, true);\nfunction getViewData(inlineEdit: InlineEditWithChanges, stringChanges: { originalRange: Range; modifiedRange: Range; original: string; modified: string }[], textModel: ITextModel) {\n\tif (!inlineEdit.edit) {\n\t\treturn emptyViewData;\n\t}\n\n\tconst cursorPosition = inlineEdit.cursorPosition;\n\tconst startsWithEOL = stringChanges.length === 0 ? false : stringChanges[0].modified.startsWith(textModel.getEOL());\n\tconst viewData = new InlineCompletionViewData(\n\t\tinlineEdit.edit.replacements.length === 0 ? 0 : inlineEdit.edit.replacements[0].range.getStartPosition().column - cursorPosition.column,\n\t\tinlineEdit.lineEdit.lineRange.startLineNumber - cursorPosition.lineNumber + (startsWithEOL && inlineEdit.lineEdit.lineRange.startLineNumber >= cursorPosition.lineNumber ? 1 : 0),\n\t\tinlineEdit.lineEdit.lineRange.length,\n\t\tinlineEdit.lineEdit.newLines.length,\n\t\tstringChanges.reduce((acc, r) => acc + r.original.length, 0),\n\t\tstringChanges.reduce((acc, r) => acc + r.modified.length, 0),\n\t\tstringChanges.length,\n\t\tstringChanges.every(r => r.original === stringChanges[0].original && r.modified === stringChanges[0].modified)\n\t);\n\treturn viewData;\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: AbstractText) {\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","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { $ } from '../../../../../../base/browser/dom.js';\nimport { equals } from '../../../../../../base/common/equals.js';\nimport { BugIndicatingError, onUnexpectedError } from '../../../../../../base/common/errors.js';\nimport { Event } from '../../../../../../base/common/event.js';\nimport { Disposable } from '../../../../../../base/common/lifecycle.js';\nimport { autorun, derived, derivedOpts, IObservable, IReader, mapObservableArrayCached, observableValue } from '../../../../../../base/common/observable.js';\nimport { IInstantiationService } from '../../../../../../platform/instantiation/common/instantiation.js';\nimport { ICodeEditor } from '../../../../../browser/editorBrowser.js';\nimport { ObservableCodeEditor, observableCodeEditor } from '../../../../../browser/observableCodeEditor.js';\nimport { EditorOption } from '../../../../../common/config/editorOptions.js';\nimport { TextReplacement } from '../../../../../common/core/edits/textEdit.js';\nimport { Position } from '../../../../../common/core/position.js';\nimport { Range } from '../../../../../common/core/range.js';\nimport { LineRange } from '../../../../../common/core/ranges/lineRange.js';\nimport { AbstractText, StringText } from '../../../../../common/core/text/abstractText.js';\nimport { TextLength } from '../../../../../common/core/text/textLength.js';\nimport { DetailedLineRangeMapping, lineRangeMappingFromRangeMappings, RangeMapping } from '../../../../../common/diff/rangeMapping.js';\nimport { ITextModel } from '../../../../../common/model.js';\nimport { TextModel } from '../../../../../common/model/textModel.js';\nimport { InlineSuggestionIdentity } from '../../model/inlineSuggestionItem.js';\nimport { InlineSuggestionGutterMenuData, SimpleInlineSuggestModel } from './components/gutterIndicatorView.js';\nimport { InlineEditWithChanges } from './inlineEditWithChanges.js';\nimport { ModelPerInlineEdit } from './inlineEditsModel.js';\nimport { 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 { ILongDistanceHint, ILongDistanceViewState, InlineEditsLongDistanceHint } from './inlineEditsViews/longDistanceHint/inlineEditsLongDistanceHint.js';\nimport { InlineEditsSideBySideView } from './inlineEditsViews/inlineEditsSideBySideView.js';\nimport { InlineEditsWordReplacementView, WordReplacementsViewData } from './inlineEditsViews/inlineEditsWordReplacementView.js';\nimport { IOriginalEditorInlineDiffViewState, OriginalEditorInlineDiffView } from './inlineEditsViews/originalEditorInlineDiffView.js';\nimport { applyEditToModifiedRangeMappings, createReindentEdit } from './utils/utils.js';\nimport './view.css';\nimport { JumpToView } from './inlineEditsViews/jumpToView.js';\nimport { StringEdit } from '../../../../../common/core/edits/stringEdit.js';\nimport { OffsetRange } from '../../../../../common/core/ranges/offsetRange.js';\nimport { getPositionOffsetTransformerFromTextModel } from '../../../../../common/core/text/getPositionOffsetTransformerFromTextModel.js';\nimport { InlineCompletionEditorType } from '../../model/provideInlineCompletions.js';\n\nexport class InlineEditsView extends Disposable {\n\tprivate readonly _editorObs: ObservableCodeEditor;\n\n\tprivate readonly _useCodeShifting;\n\tprivate readonly _renderSideBySide;\n\tprivate readonly _tabAction = derived<InlineEditTabAction>(reader => this._model.read(reader)?.tabAction.read(reader) ?? InlineEditTabAction.Inactive);\n\n\tprivate _previousView: { // TODO, move into identity\n\t\tid: string;\n\t\tview: ReturnType<typeof InlineEditsView.prototype._determineView>;\n\t\teditorWidth: number;\n\t\ttimestamp: number;\n\t} | undefined;\n\tprivate readonly _showLongDistanceHint: IObservable<boolean>;\n\n\tconstructor(\n\t\tprivate readonly _editor: ICodeEditor,\n\t\tprivate readonly _model: IObservable<ModelPerInlineEdit | undefined>,\n\t\tprivate readonly _simpleModel: IObservable<SimpleInlineSuggestModel | undefined>,\n\t\tprivate readonly _inlineSuggestInfo: IObservable<InlineSuggestionGutterMenuData | undefined>,\n\t\tprivate readonly _showCollapsed: IObservable<boolean>,\n\n\t\t@IInstantiationService private readonly _instantiationService: IInstantiationService\n\t) {\n\t\tsuper();\n\t\tthis._editorObs = observableCodeEditor(this._editor);\n\t\tthis._constructorDone = observableValue(this, false);\n\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\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\teditorType: s.editorType,\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\teditorType: s.editorType,\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\teditorType: s.editorType,\n\t\t\t}) : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\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 === InlineCompletionViewKind.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 === InlineCompletionViewKind.Custom ? m?.displayLocation : undefined),\n\t\t\tthis._tabAction,\n\t\t\tthis._uiState.map(s => s?.editorType ?? InlineCompletionEditorType.TextEditor),\n\t\t));\n\n\t\tthis._showLongDistanceHint = this._editorObs.getOption(EditorOption.inlineSuggest).map(this, s => s.edits.showLongDistanceHint);\n\t\tthis._longDistanceHint = derived(this, reader => {\n\t\t\tif (!this._showLongDistanceHint.read(reader)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn reader.store.add(this._instantiationService.createInstance(InlineEditsLongDistanceHint,\n\t\t\t\tthis._editor,\n\t\t\t\tthis._uiState.map<ILongDistanceViewState | undefined>((s, reader) => s?.longDistanceHint ? ({\n\t\t\t\t\thint: s.longDistanceHint,\n\t\t\t\t\tnewTextLineCount: s.newTextLineCount,\n\t\t\t\t\tedit: s.edit,\n\t\t\t\t\tdiff: s.diff,\n\t\t\t\t\teditorType: s.editorType,\n\t\t\t\t\tmodel: this._simpleModel.read(reader)!,\n\t\t\t\t\tinlineSuggestInfo: this._inlineSuggestInfo.read(reader)!,\n\t\t\t\t\tnextCursorPosition: s.nextCursorPosition,\n\t\t\t\t}) : undefined),\n\t\t\t\tthis._previewTextModel,\n\t\t\t\tthis._tabAction,\n\t\t\t));\n\t\t}).recomputeInitiallyAndOnChange(this._store);\n\n\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' || e.state.kind === 'jumpTo') {\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\teditorType: e.editorType,\n\t\t\t};\n\t\t});\n\t\tthis._inlineDiffView = this._register(new OriginalEditorInlineDiffView(this._editor, this._inlineDiffViewState, this._previewTextModel));\n\t\tthis._jumpToView = this._register(this._instantiationService.createInstance(JumpToView, this._editorObs, { style: 'label' }, derived(reader => {\n\t\t\tconst s = this._uiState.read(reader);\n\t\t\tif (s?.state?.kind === InlineCompletionViewKind.JumpTo) {\n\t\t\t\treturn { jumpToPosition: s.state.position };\n\t\t\t}\n\t\t\treturn undefined;\n\t\t})));\n\t\tconst wordReplacements = derivedOpts({\n\t\t\tequalsFn: equals.arrayC(equals.thisC())\n\t\t}, reader => {\n\t\t\tconst s = this._uiState.read(reader);\n\t\t\treturn s?.state?.kind === InlineCompletionViewKind.WordReplacements ? s.state.replacements.map(replacement => new WordReplacementsViewData(replacement, s.editorType, s.state?.alternativeAction)) : [];\n\t\t});\n\t\tthis._wordReplacementViews = mapObservableArrayCached(this, wordReplacements, (viewData, store) => {\n\t\t\treturn store.add(this._instantiationService.createInstance(InlineEditsWordReplacementView, this._editorObs, viewData, 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?.editorType ?? InlineCompletionEditorType.TextEditor),\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(autorun((reader) => {\n\t\t\tconst model = this._model.read(reader);\n\t\t\tif (!model) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treader.store.add(\n\t\t\t\tEvent.any(\n\t\t\t\t\tthis._sideBySide.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)(clickEvent => {\n\t\t\t\t\tif (this._viewHasBeenShownLongerThan(350)) {\n\t\t\t\t\t\tclickEvent.event.preventDefault();\n\t\t\t\t\t\tmodel.accept(clickEvent.alternativeAction);\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t);\n\t\t}));\n\n\t\tthis._wordReplacementViews.recomputeInitiallyAndOnChange(this._store);\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\tlet viewZoneId: string | undefined;\n\t\tthis._register(autorun(reader => {\n\t\t\tconst minScrollHeight = minEditorScrollHeight.read(reader);\n\t\t\tconst textModel = this._editorObs.model.read(reader);\n\t\t\tif (!textModel) { return; }\n\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 !== undefined) {\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\tpublic readonly displayRange = derived<LineRange | undefined>(this, reader => {\n\t\tconst state = this._uiState.read(reader);\n\t\tif (!state) { return undefined; }\n\t\tif (state.state?.kind === 'custom') {\n\t\t\tconst range = state.state.displayLocation?.range;\n\t\t\tif (!range) {\n\t\t\t\tthrow new BugIndicatingError('custom view should have a range');\n\t\t\t}\n\t\t\treturn new LineRange(range.startLineNumber, range.endLineNumber);\n\t\t}\n\n\t\tif (state.state?.kind === 'insertionMultiLine') {\n\t\t\treturn this._insertion.originalLines.read(reader);\n\t\t}\n\n\t\treturn state.edit.displayRange;\n\t});\n\n\n\tprivate _currentInlineEditCache: {\n\t\tinlineSuggestionIdentity: InlineSuggestionIdentity;\n\t\tfirstCursorLineNumber: number;\n\t} | undefined = undefined;\n\n\tprivate _getLongDistanceHintState(model: ModelPerInlineEdit, reader: IReader): ILongDistanceHint | undefined {\n\t\tif (model.inlineEdit.inlineCompletion.identity.jumpedTo.read(reader)) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (model.inlineEdit.action === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\t\tif (this._currentInlineEditCache?.inlineSuggestionIdentity !== model.inlineEdit.inlineCompletion.identity) {\n\t\t\tthis._currentInlineEditCache = {\n\t\t\t\tinlineSuggestionIdentity: model.inlineEdit.inlineCompletion.identity,\n\t\t\t\tfirstCursorLineNumber: model.inlineEdit.cursorPosition.lineNumber,\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tlineNumber: this._currentInlineEditCache.firstCursorLineNumber,\n\t\t\tisVisible: !model.inViewPort.read(reader),\n\t\t};\n\t}\n\n\tprivate readonly _constructorDone;\n\n\tprivate readonly _uiState = derived<{\n\t\tstate: ReturnType<typeof InlineEditsView.prototype._determineRenderState>;\n\t\tdiff: DetailedLineRangeMapping[];\n\t\tedit: InlineEditWithChanges;\n\t\tnewText: string;\n\t\tnewTextLineCount: number;\n\t\teditorType: InlineCompletionEditorType;\n\t\tlongDistanceHint: ILongDistanceHint | undefined;\n\t\tnextCursorPosition: Position | null;\n\t} | undefined>(this, reader => {\n\t\tconst model = this._model.read(reader);\n\t\tconst textModel = this._editorObs.model.read(reader);\n\t\tif (!model || !textModel || !this._constructorDone.read(reader)) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst inlineEdit = model.inlineEdit;\n\t\tlet diff: DetailedLineRangeMapping[];\n\t\tlet mappings: RangeMapping[];\n\n\t\tlet newText: AbstractText | undefined = undefined;\n\n\t\tif (inlineEdit.edit) {\n\t\t\tmappings = RangeMapping.fromEdit(inlineEdit.edit);\n\t\t\tnewText = new StringText(inlineEdit.edit.apply(inlineEdit.originalText));\n\t\t\tdiff = lineRangeMappingFromRangeMappings(mappings, inlineEdit.originalText, newText);\n\t\t} else {\n\t\t\tmappings = [];\n\t\t\tdiff = [];\n\t\t\tnewText = inlineEdit.originalText;\n\t\t}\n\n\n\t\tlet state = this._determineRenderState(model, reader, diff, newText);\n\t\tif (!state) {\n\t\t\tonUnexpectedError(new Error(`unable to determine view: tried to render ${this._previousView?.view}`));\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst longDistanceHint = this._getLongDistanceHintState(model, reader);\n\n\t\tif (longDistanceHint && longDistanceHint.isVisible) {\n\t\t\tstate.viewData.setLongDistanceViewData(longDistanceHint.lineNumber, inlineEdit.lineEdit.lineRange.startLineNumber);\n\t\t}\n\n\t\tif (state.kind === InlineCompletionViewKind.SideBySide) {\n\t\t\tconst indentationAdjustmentEdit = createReindentEdit(newText.getValue(), inlineEdit.modifiedLineRange, textModel.getOptions().tabSize);\n\t\t\tnewText = new StringText(indentationAdjustmentEdit.applyToString(newText.getValue()));\n\n\t\t\tmappings = applyEditToModifiedRangeMappings(mappings, indentationAdjustmentEdit);\n\t\t\tdiff = lineRangeMappingFromRangeMappings(mappings, inlineEdit.originalText, newText);\n\t\t}\n\n\t\tthis._previewTextModel.setLanguage(textModel.getLanguageId());\n\n\t\tconst previousNewText = this._previewTextModel.getValue();\n\t\tif (previousNewText !== newText.getValue()) {\n\t\t\tthis._previewTextModel.setEOL(textModel.getEndOfLineSequence());\n\t\t\tconst updateOldValueEdit = StringEdit.replace(new OffsetRange(0, previousNewText.length), newText.getValue());\n\t\t\tconst updateOldValueEditSmall = updateOldValueEdit.removeCommonSuffixPrefix(previousNewText);\n\n\t\t\tconst textEdit = getPositionOffsetTransformerFromTextModel(this._previewTextModel).getTextEdit(updateOldValueEditSmall);\n\t\t\tthis._previewTextModel.edit(textEdit);\n\t\t}\n\n\t\tif (this._showCollapsed.read(reader)) {\n\t\t\tstate = { kind: InlineCompletionViewKind.Collapsed as const, viewData: state.viewData };\n\t\t}\n\n\t\tmodel.handleInlineEditShownNextFrame(state.kind, state.viewData);\n\n\t\tconst nextCursorPosition = inlineEdit.action?.kind === 'jumpTo' ? inlineEdit.action.position : null;\n\n\t\treturn {\n\t\t\tstate,\n\t\t\tdiff,\n\t\t\tedit: inlineEdit,\n\t\t\tnewText: newText.getValue(),\n\t\t\tnewTextLineCount: inlineEdit.modifiedLineRange.length,\n\t\t\teditorType: model.editorType,\n\t\t\tlongDistanceHint,\n\t\t\tnextCursorPosition: nextCursorPosition,\n\t\t};\n\t});\n\n\tprivate readonly _previewTextModel;\n\n\n\tpublic readonly inlineEditsIsHovered = derived(this, reader => {\n\t\treturn this._sideBySide.isHovered.read(reader)\n\t\t\t|| this._wordReplacementViews.read(reader).some(v => v.isHovered.read(reader))\n\t\t\t|| this._deletion.isHovered.read(reader)\n\t\t\t|| this._inlineDiffView.isHovered.read(reader)\n\t\t\t|| this._lineReplacementView.isHovered.read(reader)\n\t\t\t|| this._insertion.isHovered.read(reader)\n\t\t\t|| this._customView.isHovered.read(reader)\n\t\t\t|| this._longDistanceHint.map((v, r) => v?.isHovered.read(r) ?? false).read(reader);\n\t});\n\n\tprivate readonly _sideBySide;\n\n\tprotected readonly _deletion;\n\n\tprotected readonly _insertion;\n\n\tprivate readonly _inlineDiffViewState;\n\n\tpublic readonly _inlineCollapsedView;\n\n\tprivate readonly _customView;\n\tprotected readonly _longDistanceHint;\n\n\tprotected readonly _inlineDiffView;\n\n\tprotected readonly _wordReplacementViews;\n\n\tprotected readonly _lineReplacementView;\n\n\tprotected readonly _jumpToView;\n\n\tpublic readonly gutterIndicatorOffset = derived<number>(this, reader => {\n\t\t// TODO: have a better way to tell the gutter indicator view where the edit is inside a viewzone\n\t\tif (this._uiState.read(reader)?.state?.kind === 'insertionMultiLine') {\n\t\t\treturn this._insertion.startLineOffset.read(reader);\n\t\t}\n\t\treturn 0;\n\t});\n\n\tprivate _getCacheId(model: ModelPerInlineEdit) {\n\t\treturn model.inlineEdit.inlineCompletion.identity.id;\n\t}\n\n\tprivate _determineView(model: ModelPerInlineEdit, reader: IReader, diff: DetailedLineRangeMapping[], newText: AbstractText): 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\tconst action = model.inlineEdit.inlineCompletion.action;\n\t\tif (action?.kind === 'edit' && action.alternativeAction) {\n\t\t\treturn InlineCompletionViewKind.WordReplacements;\n\t\t}\n\n\t\tconst uri = action?.kind === 'edit' ? action.uri : undefined;\n\t\tif (uri !== undefined) {\n\t\t\treturn InlineCompletionViewKind.Custom;\n\t\t}\n\n\t\tif (model.displayLocation && !model.inlineEdit.inlineCompletion.identity.jumpedTo.read(reader)) {\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.editorType !== InlineCompletionEditorType.DiffEditor) {\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.editorType !== InlineCompletionEditorType.DiffEditor /* 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.editorType === InlineCompletionEditorType.DiffEditor) {\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: ModelPerInlineEdit, reader: IReader, diff: DetailedLineRangeMapping[], newText: AbstractText) {\n\t\tif (model.inlineEdit.action?.kind === 'jumpTo') {\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.JumpTo as const,\n\t\t\t\tposition: model.inlineEdit.action.position,\n\t\t\t\tviewData: emptyViewData,\n\t\t\t};\n\t\t}\n\n\t\tconst inlineEdit = model.inlineEdit;\n\n\t\tlet view = this._determineView(model, reader, diff, newText);\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\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 viewData = getViewData(inlineEdit, stringChanges, textModel);\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\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\talternativeAction: model.inlineEdit.action?.alternativeAction,\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\nconst emptyViewData = new InlineCompletionViewData(-1, -1, -1, -1, -1, -1, -1, true);\nfunction getViewData(inlineEdit: InlineEditWithChanges, stringChanges: { originalRange: Range; modifiedRange: Range; original: string; modified: string }[], textModel: ITextModel) {\n\tif (!inlineEdit.edit) {\n\t\treturn emptyViewData;\n\t}\n\n\tconst cursorPosition = inlineEdit.cursorPosition;\n\tconst startsWithEOL = stringChanges.length === 0 ? false : stringChanges[0].modified.startsWith(textModel.getEOL());\n\tconst viewData = new InlineCompletionViewData(\n\t\tinlineEdit.edit.replacements.length === 0 ? 0 : inlineEdit.edit.replacements[0].range.getStartPosition().column - cursorPosition.column,\n\t\tinlineEdit.lineEdit.lineRange.startLineNumber - cursorPosition.lineNumber + (startsWithEOL && inlineEdit.lineEdit.lineRange.startLineNumber >= cursorPosition.lineNumber ? 1 : 0),\n\t\tinlineEdit.lineEdit.lineRange.length,\n\t\tinlineEdit.lineEdit.newLines.length,\n\t\tstringChanges.reduce((acc, r) => acc + r.original.length, 0),\n\t\tstringChanges.reduce((acc, r) => acc + r.modified.length, 0),\n\t\tstringChanges.length,\n\t\tstringChanges.every(r => r.original === stringChanges[0].original && r.modified === stringChanges[0].modified)\n\t);\n\treturn viewData;\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: AbstractText) {\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"]}
|
|
@@ -15,8 +15,6 @@ import { n } from '../../../../../../../base/browser/dom.js';
|
|
|
15
15
|
import { Emitter } from '../../../../../../../base/common/event.js';
|
|
16
16
|
import { Disposable } from '../../../../../../../base/common/lifecycle.js';
|
|
17
17
|
import { autorun, constObservable, derived, derivedObservableWithCache, observableValue } from '../../../../../../../base/common/observable.js';
|
|
18
|
-
import { editorBackground } from '../../../../../../../platform/theme/common/colorRegistry.js';
|
|
19
|
-
import { asCssVariable } from '../../../../../../../platform/theme/common/colorUtils.js';
|
|
20
18
|
import { IThemeService } from '../../../../../../../platform/theme/common/themeService.js';
|
|
21
19
|
import { observableCodeEditor } from '../../../../../../browser/observableCodeEditor.js';
|
|
22
20
|
import { LineSource, renderLines, RenderOptions } from '../../../../../../browser/widget/diffEditor/components/diffEditorViewZones/renderLines.js';
|
|
@@ -26,7 +24,7 @@ import { InlineCompletionHintStyle } from '../../../../../../common/languages.js
|
|
|
26
24
|
import { ILanguageService } from '../../../../../../common/languages/language.js';
|
|
27
25
|
import { LineTokens, TokenArray } from '../../../../../../common/tokens/lineTokens.js';
|
|
28
26
|
import { InlineEditClickEvent, InlineEditTabAction } from '../inlineEditsViewInterface.js';
|
|
29
|
-
import { getEditorBlendedColor, INLINE_EDITS_BORDER_RADIUS, inlineEditIndicatorPrimaryBackground, inlineEditIndicatorSecondaryBackground, inlineEditIndicatorSuccessfulBackground } from '../theme.js';
|
|
27
|
+
import { getEditorBackgroundColor, getEditorBlendedColor, INLINE_EDITS_BORDER_RADIUS, inlineEditIndicatorPrimaryBackground, inlineEditIndicatorSecondaryBackground, inlineEditIndicatorSuccessfulBackground } from '../theme.js';
|
|
30
28
|
import { getContentRenderWidth, maxContentWidthInRange, rectToProps } from '../utils/utils.js';
|
|
31
29
|
const MIN_END_OF_LINE_PADDING = 14;
|
|
32
30
|
const PADDING_VERTICALLY = 0;
|
|
@@ -35,7 +33,7 @@ const HORIZONTAL_OFFSET_WHEN_ABOVE_BELOW = 4;
|
|
|
35
33
|
const VERTICAL_OFFSET_WHEN_ABOVE_BELOW = 2;
|
|
36
34
|
// !! minEndOfLinePadding should always be larger than paddingHorizontally + horizontalOffsetWhenAboveBelow
|
|
37
35
|
let InlineEditsCustomView = class InlineEditsCustomView extends Disposable {
|
|
38
|
-
constructor(_editor, displayLocation, tabAction, themeService, _languageService) {
|
|
36
|
+
constructor(_editor, displayLocation, tabAction, editorType, themeService, _languageService) {
|
|
39
37
|
super();
|
|
40
38
|
this._editor = _editor;
|
|
41
39
|
this._languageService = _languageService;
|
|
@@ -60,7 +58,7 @@ let InlineEditsCustomView = class InlineEditsCustomView extends Disposable {
|
|
|
60
58
|
}
|
|
61
59
|
return {
|
|
62
60
|
border: getEditorBlendedColor(border, themeService).read(reader).toString(),
|
|
63
|
-
background:
|
|
61
|
+
background: getEditorBackgroundColor(editorType.read(reader))
|
|
64
62
|
};
|
|
65
63
|
});
|
|
66
64
|
const state = displayLocation.map(dl => dl ? this.getState(dl) : undefined);
|
|
@@ -237,8 +235,8 @@ let InlineEditsCustomView = class InlineEditsCustomView extends Disposable {
|
|
|
237
235
|
}
|
|
238
236
|
};
|
|
239
237
|
InlineEditsCustomView = __decorate([
|
|
240
|
-
__param(
|
|
241
|
-
__param(
|
|
238
|
+
__param(4, IThemeService),
|
|
239
|
+
__param(5, ILanguageService)
|
|
242
240
|
], InlineEditsCustomView);
|
|
243
241
|
export { InlineEditsCustomView };
|
|
244
242
|
//# sourceMappingURL=inlineEditsCustomView.js.map
|