monaco-editor-core 0.54.0 → 0.55.0-dev-20251008
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm/nls.messages.de.js +1 -1
- package/esm/nls.messages.es.js +1 -1
- package/esm/nls.messages.fr.js +1 -1
- package/esm/nls.messages.it.js +1 -1
- package/esm/nls.messages.ja.js +1 -1
- package/esm/nls.messages.ko.js +1 -1
- package/esm/nls.messages.ru.js +1 -1
- package/esm/nls.messages.zh-cn.js +1 -1
- package/esm/nls.messages.zh-tw.js +1 -1
- package/esm/vs/base/browser/canIUse.js +1 -0
- package/esm/vs/base/browser/canIUse.js.map +1 -1
- package/esm/vs/base/browser/dom.js +9 -0
- package/esm/vs/base/browser/dom.js.map +1 -1
- package/esm/vs/base/browser/fastDomNode.js.map +1 -1
- package/esm/vs/base/browser/mouseEvent.js +3 -0
- package/esm/vs/base/browser/mouseEvent.js.map +1 -1
- package/esm/vs/base/browser/trustedTypes.js +2 -0
- package/esm/vs/base/browser/trustedTypes.js.map +1 -1
- package/esm/vs/base/browser/ui/list/listWidget.js +5 -5
- package/esm/vs/base/browser/ui/list/listWidget.js.map +1 -1
- package/esm/vs/base/browser/ui/sash/sash.css +1 -1
- package/esm/vs/base/browser/ui/sash/sash.js +4 -0
- package/esm/vs/base/browser/ui/sash/sash.js.map +1 -1
- package/esm/vs/base/browser/ui/scrollbar/scrollableElement.js +1 -1
- package/esm/vs/base/browser/ui/scrollbar/scrollableElement.js.map +1 -1
- package/esm/vs/base/browser/ui/table/table.css +2 -2
- package/esm/vs/base/browser/ui/tree/abstractTree.js +5 -4
- package/esm/vs/base/browser/ui/tree/abstractTree.js.map +1 -1
- package/esm/vs/base/browser/ui/tree/asyncDataTree.js +6 -4
- package/esm/vs/base/browser/ui/tree/asyncDataTree.js.map +1 -1
- package/esm/vs/base/browser/ui/tree/dataTree.js.map +1 -1
- package/esm/vs/base/browser/ui/tree/indexTreeModel.js +1 -1
- package/esm/vs/base/browser/ui/tree/indexTreeModel.js.map +1 -1
- package/esm/vs/base/browser/ui/tree/media/tree.css +2 -2
- package/esm/vs/base/browser/ui/tree/objectTree.js.map +1 -1
- package/esm/vs/base/browser/webWorkerFactory.js +3 -0
- package/esm/vs/base/browser/webWorkerFactory.js.map +1 -1
- package/esm/vs/base/common/buffer.js.map +1 -1
- package/esm/vs/base/common/decorators.js +1 -0
- package/esm/vs/base/common/decorators.js.map +1 -1
- package/esm/vs/base/common/errors.js +1 -0
- package/esm/vs/base/common/errors.js.map +1 -1
- package/esm/vs/base/common/glob.js +1 -1
- package/esm/vs/base/common/glob.js.map +1 -1
- package/esm/vs/base/common/hash.js.map +1 -1
- package/esm/vs/base/common/hotReload.js +2 -0
- package/esm/vs/base/common/hotReload.js.map +1 -1
- package/esm/vs/base/common/hotReloadHelpers.js +1 -0
- package/esm/vs/base/common/hotReloadHelpers.js.map +1 -1
- package/esm/vs/base/common/lifecycle.js +19 -0
- package/esm/vs/base/common/lifecycle.js.map +1 -1
- package/esm/vs/base/common/map.js.map +1 -1
- package/esm/vs/base/common/marshalling.js +4 -0
- package/esm/vs/base/common/marshalling.js.map +1 -1
- package/esm/vs/base/common/network.js +1 -0
- package/esm/vs/base/common/network.js.map +1 -1
- package/esm/vs/base/common/normalization.js +39 -0
- package/esm/vs/base/common/normalization.js.map +1 -0
- package/esm/vs/base/common/objects.js +1 -0
- package/esm/vs/base/common/objects.js.map +1 -1
- package/esm/vs/base/common/observableInternal/changeTracker.js +4 -0
- package/esm/vs/base/common/observableInternal/changeTracker.js.map +1 -1
- package/esm/vs/base/common/observableInternal/debugLocation.js +1 -0
- package/esm/vs/base/common/observableInternal/debugLocation.js.map +1 -1
- package/esm/vs/base/common/observableInternal/debugName.js +1 -0
- package/esm/vs/base/common/observableInternal/debugName.js.map +1 -1
- package/esm/vs/base/common/observableInternal/logging/consoleObservableLogger.js +1 -0
- package/esm/vs/base/common/observableInternal/logging/consoleObservableLogger.js.map +1 -1
- package/esm/vs/base/common/observableInternal/logging/debugger/debuggerRpc.js +1 -0
- package/esm/vs/base/common/observableInternal/logging/debugger/debuggerRpc.js.map +1 -1
- package/esm/vs/base/common/observableInternal/logging/debugger/rpc.js +1 -0
- package/esm/vs/base/common/observableInternal/logging/debugger/rpc.js.map +1 -1
- package/esm/vs/base/common/observableInternal/observables/derived.js +7 -1
- package/esm/vs/base/common/observableInternal/observables/derived.js.map +1 -1
- package/esm/vs/base/common/observableInternal/observables/derivedImpl.js +2 -0
- package/esm/vs/base/common/observableInternal/observables/derivedImpl.js.map +1 -1
- package/esm/vs/base/common/observableInternal/observables/observableFromEvent.js +1 -0
- package/esm/vs/base/common/observableInternal/observables/observableFromEvent.js.map +1 -1
- package/esm/vs/base/common/observableInternal/reactions/autorunImpl.js +1 -0
- package/esm/vs/base/common/observableInternal/reactions/autorunImpl.js.map +1 -1
- package/esm/vs/base/common/process.js.map +1 -1
- package/esm/vs/base/common/product.js.map +1 -1
- package/esm/vs/base/common/types.js +2 -0
- package/esm/vs/base/common/types.js.map +1 -1
- package/esm/vs/base/common/worker/webWorker.js +26 -14
- package/esm/vs/base/common/worker/webWorker.js.map +1 -1
- package/esm/vs/base/parts/sandbox/common/sandboxTypes.js +2 -0
- package/esm/vs/base/parts/sandbox/common/sandboxTypes.js.map +1 -0
- package/esm/vs/editor/browser/config/editorConfiguration.js +3 -2
- package/esm/vs/editor/browser/config/editorConfiguration.js.map +1 -1
- package/esm/vs/editor/browser/config/migrateOptions.js +1 -1
- package/esm/vs/editor/browser/config/migrateOptions.js.map +1 -1
- package/esm/vs/editor/browser/controller/editContext/native/editContextFactory.js.map +1 -1
- package/esm/vs/editor/browser/controller/editContext/native/nativeEditContextUtils.js +2 -0
- package/esm/vs/editor/browser/controller/editContext/native/nativeEditContextUtils.js.map +1 -1
- package/esm/vs/editor/browser/controller/mouseHandler.js +2 -1
- package/esm/vs/editor/browser/controller/mouseHandler.js.map +1 -1
- package/esm/vs/editor/browser/controller/mouseTarget.js +7 -0
- package/esm/vs/editor/browser/controller/mouseTarget.js.map +1 -1
- package/esm/vs/editor/browser/controller/pointerHandler.js.map +1 -1
- package/esm/vs/editor/browser/coreCommands.js.map +1 -1
- package/esm/vs/editor/browser/editorBrowser.js.map +1 -1
- package/esm/vs/editor/browser/editorDom.js.map +1 -1
- package/esm/vs/editor/browser/editorExtensions.js.map +1 -1
- package/esm/vs/editor/browser/gpu/gpuUtils.js +1 -0
- package/esm/vs/editor/browser/gpu/gpuUtils.js.map +1 -1
- package/esm/vs/editor/browser/gpu/viewGpuContext.js +1 -0
- package/esm/vs/editor/browser/gpu/viewGpuContext.js.map +1 -1
- package/esm/vs/editor/browser/services/abstractCodeEditorService.js.map +1 -1
- package/esm/vs/editor/browser/services/bulkEditService.js.map +1 -1
- package/esm/vs/editor/browser/services/codeEditorService.js.map +1 -1
- package/esm/vs/editor/browser/services/editorWorkerService.js.map +1 -1
- package/esm/vs/editor/browser/services/hoverService/hover.css +2 -0
- package/esm/vs/editor/browser/services/hoverService/hoverService.js.map +1 -1
- package/esm/vs/editor/browser/services/hoverService/hoverWidget.js +1 -1
- package/esm/vs/editor/browser/services/hoverService/hoverWidget.js.map +1 -1
- package/esm/vs/editor/browser/services/inlineCompletionsService.js +8 -8
- package/esm/vs/editor/browser/services/inlineCompletionsService.js.map +1 -1
- package/esm/vs/editor/browser/services/openerService.js.map +1 -1
- package/esm/vs/editor/browser/view/viewLayer.js +1 -1
- package/esm/vs/editor/browser/view/viewLayer.js.map +1 -1
- package/esm/vs/editor/browser/view.js.map +1 -1
- package/esm/vs/editor/browser/viewParts/contentWidgets/contentWidgets.js +1 -0
- package/esm/vs/editor/browser/viewParts/contentWidgets/contentWidgets.js.map +1 -1
- package/esm/vs/editor/browser/viewParts/viewZones/viewZones.js +1 -0
- package/esm/vs/editor/browser/viewParts/viewZones/viewZones.js.map +1 -1
- package/esm/vs/editor/browser/widget/codeEditor/codeEditorContributions.js.map +1 -1
- package/esm/vs/editor/browser/widget/codeEditor/codeEditorWidget.js +4 -1
- package/esm/vs/editor/browser/widget/codeEditor/codeEditorWidget.js.map +1 -1
- package/esm/vs/editor/browser/widget/diffEditor/components/diffEditorEditors.js +1 -0
- package/esm/vs/editor/browser/widget/diffEditor/components/diffEditorEditors.js.map +1 -1
- package/esm/vs/editor/browser/widget/diffEditor/delegatingEditorImpl.js.map +1 -1
- package/esm/vs/editor/browser/widget/diffEditor/diffEditorOptions.js +1 -0
- package/esm/vs/editor/browser/widget/diffEditor/diffEditorOptions.js.map +1 -1
- package/esm/vs/editor/browser/widget/diffEditor/diffEditorWidget.js +1 -0
- package/esm/vs/editor/browser/widget/diffEditor/diffEditorWidget.js.map +1 -1
- package/esm/vs/editor/browser/widget/diffEditor/utils.js +2 -0
- package/esm/vs/editor/browser/widget/diffEditor/utils.js.map +1 -1
- package/esm/vs/editor/browser/widget/multiDiffEditor/diffEditorItemTemplate.js +2 -0
- package/esm/vs/editor/browser/widget/multiDiffEditor/diffEditorItemTemplate.js.map +1 -1
- package/esm/vs/editor/common/config/editorOptions.js +122 -68
- package/esm/vs/editor/common/config/editorOptions.js.map +1 -1
- package/esm/vs/editor/common/config/fontInfo.js +32 -16
- package/esm/vs/editor/common/config/fontInfo.js.map +1 -1
- package/esm/vs/editor/common/config/fontInfoFromSettings.js +16 -0
- package/esm/vs/editor/common/config/fontInfoFromSettings.js.map +1 -0
- package/esm/vs/editor/common/core/edits/edit.js +1 -0
- package/esm/vs/editor/common/core/edits/edit.js.map +1 -1
- package/esm/vs/editor/common/core/edits/stringEdit.js +2 -0
- package/esm/vs/editor/common/core/edits/stringEdit.js.map +1 -1
- package/esm/vs/editor/common/core/position.js +1 -1
- package/esm/vs/editor/common/core/position.js.map +1 -1
- package/esm/vs/editor/common/core/range.js +1 -1
- package/esm/vs/editor/common/core/range.js.map +1 -1
- package/esm/vs/editor/common/core/selection.js +1 -1
- package/esm/vs/editor/common/core/selection.js.map +1 -1
- package/esm/vs/editor/common/cursor/cursorMoveCommands.js.map +1 -1
- package/esm/vs/editor/common/editorCommon.js.map +1 -1
- package/esm/vs/editor/common/languages.js +1 -1
- package/esm/vs/editor/common/languages.js.map +1 -1
- package/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/length.js +14 -0
- package/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/length.js.map +1 -1
- package/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/smallImmutableSet.js +2 -0
- package/esm/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/smallImmutableSet.js.map +1 -1
- package/esm/vs/editor/common/model/textModel.js +1 -1
- package/esm/vs/editor/common/model/textModel.js.map +1 -1
- package/esm/vs/editor/common/model.js +1 -1
- package/esm/vs/editor/common/model.js.map +1 -1
- package/esm/vs/editor/common/services/editorBaseApi.js.map +1 -1
- package/esm/vs/editor/common/services/editorWebWorker.js +1 -0
- package/esm/vs/editor/common/services/editorWebWorker.js.map +1 -1
- package/esm/vs/editor/common/services/editorWorkerHost.js.map +1 -1
- package/esm/vs/editor/common/services/modelService.js +14 -21
- package/esm/vs/editor/common/services/modelService.js.map +1 -1
- package/esm/vs/editor/common/textModelEditSource.js +2 -0
- package/esm/vs/editor/common/textModelEditSource.js.map +1 -1
- package/esm/vs/editor/common/viewLayout/viewLineRenderer.js +40 -1
- package/esm/vs/editor/common/viewLayout/viewLineRenderer.js.map +1 -1
- package/esm/vs/editor/common/viewModel/viewModelImpl.js +2 -1
- package/esm/vs/editor/common/viewModel/viewModelImpl.js.map +1 -1
- package/esm/vs/editor/contrib/codeAction/browser/codeActionController.js +1 -1
- package/esm/vs/editor/contrib/codeAction/browser/codeActionController.js.map +1 -1
- package/esm/vs/editor/contrib/codelens/browser/codelensController.js +1 -1
- package/esm/vs/editor/contrib/codelens/browser/codelensController.js.map +1 -1
- package/esm/vs/editor/contrib/colorPicker/browser/colorDetector.js +1 -0
- package/esm/vs/editor/contrib/colorPicker/browser/colorDetector.js.map +1 -1
- package/esm/vs/editor/contrib/contextmenu/browser/contextmenu.js +1 -0
- package/esm/vs/editor/contrib/contextmenu/browser/contextmenu.js.map +1 -1
- package/esm/vs/editor/contrib/find/browser/findModel.js +1 -0
- package/esm/vs/editor/contrib/find/browser/findModel.js.map +1 -1
- package/esm/vs/editor/contrib/find/browser/findWidget.css +5 -5
- package/esm/vs/editor/contrib/folding/browser/folding.css +4 -4
- package/esm/vs/editor/contrib/folding/browser/foldingDecorations.js.map +1 -1
- package/esm/vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.js +1 -1
- package/esm/vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.js.map +1 -1
- package/esm/vs/editor/contrib/inlayHints/browser/inlayHintsController.js +30 -14
- package/esm/vs/editor/contrib/inlayHints/browser/inlayHintsController.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsModel.js +5 -3
- package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsModel.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsSource.js +56 -7
- package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsSource.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/structuredLogger.js +1 -0
- package/esm/vs/editor/contrib/inlineCompletions/browser/structuredLogger.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/ghostText/ghostTextView.js +2 -0
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/ghostText/ghostTextView.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorView.js +1 -0
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorView.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditWithChanges.js +2 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditWithChanges.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 +27 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.js.map +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewProducer.js +1 -1
- package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewProducer.js.map +1 -1
- package/esm/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.js +1 -1
- package/esm/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.js.map +1 -1
- package/esm/vs/editor/contrib/rename/browser/renameWidget.js.map +1 -1
- package/esm/vs/editor/contrib/symbolIcons/browser/symbolIcons.css +2 -0
- package/esm/vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.js +2 -0
- package/esm/vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.js.map +1 -1
- package/esm/vs/editor/contrib/unusualLineTerminators/browser/unusualLineTerminators.js.map +1 -1
- package/esm/vs/editor/editor.api.d.ts +8 -8
- package/esm/vs/editor/editor.api.js +4 -0
- package/esm/vs/editor/editor.api.js.map +1 -1
- package/esm/vs/editor/standalone/browser/standaloneCodeEditor.js.map +1 -1
- package/esm/vs/editor/standalone/browser/standaloneEditor.js +37 -0
- package/esm/vs/editor/standalone/browser/standaloneEditor.js.map +1 -1
- package/esm/vs/editor/standalone/browser/standaloneLanguages.js +37 -0
- package/esm/vs/editor/standalone/browser/standaloneLanguages.js.map +1 -1
- package/esm/vs/editor/standalone/browser/standaloneServices.js.map +1 -1
- package/esm/vs/editor/standalone/browser/standaloneWebWorker.js.map +1 -1
- package/esm/vs/editor/standalone/common/monarch/monarchCompile.js +3 -0
- package/esm/vs/editor/standalone/common/monarch/monarchCompile.js.map +1 -1
- package/esm/vs/platform/accessibility/browser/accessibilityService.js +2 -2
- package/esm/vs/platform/accessibility/browser/accessibilityService.js.map +1 -1
- package/esm/vs/platform/actions/common/actions.js.map +1 -1
- package/esm/vs/platform/commands/common/commands.js.map +1 -1
- package/esm/vs/platform/contextkey/common/contextkey.js +5 -0
- package/esm/vs/platform/contextkey/common/contextkey.js.map +1 -1
- package/esm/vs/platform/dataChannel/browser/forwardingTelemetryService.js +1 -1
- package/esm/vs/platform/dataChannel/browser/forwardingTelemetryService.js.map +1 -1
- package/esm/vs/platform/dnd/browser/dnd.js +1 -1
- package/esm/vs/platform/dnd/browser/dnd.js.map +1 -1
- package/esm/vs/platform/instantiation/common/descriptors.js.map +1 -1
- package/esm/vs/platform/instantiation/common/instantiation.js.map +1 -1
- package/esm/vs/platform/instantiation/common/instantiationService.js +1 -0
- package/esm/vs/platform/instantiation/common/instantiationService.js.map +1 -1
- package/esm/vs/platform/list/browser/listService.js +5 -0
- package/esm/vs/platform/list/browser/listService.js.map +1 -1
- package/esm/vs/platform/log/common/log.js.map +1 -1
- package/esm/vs/platform/log/common/logService.js.map +1 -1
- package/esm/vs/platform/observable/common/wrapInHotClass.js +2 -0
- package/esm/vs/platform/observable/common/wrapInHotClass.js.map +1 -1
- package/esm/vs/platform/observable/common/wrapInReloadableClass.js +3 -0
- package/esm/vs/platform/observable/common/wrapInReloadableClass.js.map +1 -1
- package/esm/vs/platform/product/common/product.js +68 -0
- package/esm/vs/platform/product/common/product.js.map +1 -0
- package/esm/vs/platform/quickinput/browser/commandsQuickAccess.js +26 -2
- package/esm/vs/platform/quickinput/browser/commandsQuickAccess.js.map +1 -1
- package/esm/vs/platform/quickinput/browser/quickInput.js +1 -1
- package/esm/vs/platform/quickinput/browser/quickInput.js.map +1 -1
- package/monaco.d.ts +8 -8
- 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 { equalsIfDefined, itemEquals } from '../../../../../../base/common/equals.js';\nimport { BugIndicatingError } from '../../../../../../base/common/errors.js';\nimport { Event } from '../../../../../../base/common/event.js';\nimport { Disposable } from '../../../../../../base/common/lifecycle.js';\nimport { autorun, autorunWithStore, derived, derivedOpts, IObservable, IReader, ISettableObservable, mapObservableArrayCached, observableValue } from '../../../../../../base/common/observable.js';\nimport { IInstantiationService } from '../../../../../../platform/instantiation/common/instantiation.js';\nimport { ICodeEditor } from '../../../../../browser/editorBrowser.js';\nimport { ObservableCodeEditor, observableCodeEditor } from '../../../../../browser/observableCodeEditor.js';\nimport { EditorOption } from '../../../../../common/config/editorOptions.js';\nimport { LineRange } from '../../../../../common/core/ranges/lineRange.js';\nimport { Position } from '../../../../../common/core/position.js';\nimport { Range } from '../../../../../common/core/range.js';\nimport { TextReplacement } from '../../../../../common/core/edits/textEdit.js';\nimport { AbstractText, StringText } from '../../../../../common/core/text/abstractText.js';\nimport { TextLength } from '../../../../../common/core/text/textLength.js';\nimport { DetailedLineRangeMapping, lineRangeMappingFromRangeMappings, RangeMapping } from '../../../../../common/diff/rangeMapping.js';\nimport { TextModel } from '../../../../../common/model/textModel.js';\nimport { InlineEditsGutterIndicator } from './components/gutterIndicatorView.js';\nimport { InlineEditWithChanges } from './inlineEditWithChanges.js';\nimport { GhostTextIndicator, InlineEditHost, InlineEditModel } from './inlineEditsModel.js';\nimport { InlineEditsOnboardingExperience } from './inlineEditsNewUsers.js';\nimport { IInlineEditModel, InlineCompletionViewData, InlineCompletionViewKind, InlineEditTabAction } from './inlineEditsViewInterface.js';\nimport { InlineEditsCollapsedView } from './inlineEditsViews/inlineEditsCollapsedView.js';\nimport { InlineEditsCustomView } from './inlineEditsViews/inlineEditsCustomView.js';\nimport { InlineEditsDeletionView } from './inlineEditsViews/inlineEditsDeletionView.js';\nimport { InlineEditsInsertionView } from './inlineEditsViews/inlineEditsInsertionView.js';\nimport { InlineEditsLineReplacementView } from './inlineEditsViews/inlineEditsLineReplacementView.js';\nimport { InlineEditsSideBySideView } from './inlineEditsViews/inlineEditsSideBySideView.js';\nimport { InlineEditsWordReplacementView } from './inlineEditsViews/inlineEditsWordReplacementView.js';\nimport { IOriginalEditorInlineDiffViewState, OriginalEditorInlineDiffView } from './inlineEditsViews/originalEditorInlineDiffView.js';\nimport { applyEditToModifiedRangeMappings, createReindentEdit } from './utils/utils.js';\nimport './view.css';\nimport { $ } from '../../../../../../base/browser/dom.js';\n\n\nexport class InlineEditsView extends Disposable {\n\tprivate readonly _editorObs: ObservableCodeEditor;\n\n\tprivate readonly _useCodeShifting;\n\tprivate readonly _renderSideBySide;\n\n\tprivate readonly _tabAction;\n\n\tprivate _previousView: {\n\t\tid: string;\n\t\tview: ReturnType<typeof InlineEditsView.prototype.determineView>;\n\t\teditorWidth: number;\n\t\ttimestamp: number;\n\t} | undefined;\n\n\tconstructor(\n\t\tprivate readonly _editor: ICodeEditor,\n\t\tprivate readonly _host: IObservable<InlineEditHost | undefined>,\n\t\tprivate readonly _model: IObservable<InlineEditModel | undefined>,\n\t\tprivate readonly _ghostTextIndicator: IObservable<GhostTextIndicator | undefined>,\n\t\tprivate readonly _focusIsInMenu: ISettableObservable<boolean>,\n\t\t@IInstantiationService private readonly _instantiationService: IInstantiationService,\n\t) {\n\t\tsuper();\n\t\tthis._editorObs = observableCodeEditor(this._editor);\n\t\tthis._tabAction = derived<InlineEditTabAction>(reader => this._model.read(reader)?.tabAction.read(reader) ?? InlineEditTabAction.Inactive);\n\t\tthis._constructorDone = observableValue(this, false);\n\t\tthis._uiState = derived<{\n\t\t\tstate: ReturnType<typeof InlineEditsView.prototype.determineRenderState>;\n\t\t\tdiff: DetailedLineRangeMapping[];\n\t\t\tedit: InlineEditWithChanges;\n\t\t\tnewText: string;\n\t\t\tnewTextLineCount: number;\n\t\t\tisInDiffEditor: boolean;\n\t\t} | undefined>(this, reader => {\n\t\t\tconst model = this._model.read(reader);\n\t\t\tif (!model || !this._constructorDone.read(reader)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst inlineEdit = model.inlineEdit;\n\t\t\tlet mappings = RangeMapping.fromEdit(inlineEdit.edit);\n\t\t\tlet newText = inlineEdit.edit.apply(inlineEdit.originalText);\n\t\t\tlet diff = lineRangeMappingFromRangeMappings(mappings, inlineEdit.originalText, new StringText(newText));\n\n\t\t\tlet state = this.determineRenderState(model, reader, diff, new StringText(newText));\n\t\t\tif (!state) {\n\t\t\t\tmodel.abort(`unable to determine view: tried to render ${this._previousView?.view}`);\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tif (state.kind === InlineCompletionViewKind.SideBySide) {\n\t\t\t\tconst indentationAdjustmentEdit = createReindentEdit(newText, inlineEdit.modifiedLineRange, textModel.getOptions().tabSize);\n\t\t\t\tnewText = indentationAdjustmentEdit.applyToString(newText);\n\n\t\t\t\tmappings = applyEditToModifiedRangeMappings(mappings, indentationAdjustmentEdit);\n\t\t\t\tdiff = lineRangeMappingFromRangeMappings(mappings, inlineEdit.originalText, new StringText(newText));\n\t\t\t}\n\n\t\t\tthis._previewTextModel.setLanguage(this._editor.getModel()!.getLanguageId());\n\n\t\t\tconst previousNewText = this._previewTextModel.getValue();\n\t\t\tif (previousNewText !== newText) {\n\t\t\t\t// Only update the model if the text has changed to avoid flickering\n\t\t\t\tthis._previewTextModel.setValue(newText);\n\t\t\t}\n\n\t\t\tif (model.showCollapsed.read(reader) && !this._indicator.read(reader)?.isHoverVisible.read(reader)) {\n\t\t\t\tstate = { kind: InlineCompletionViewKind.Collapsed as const, viewData: state.viewData };\n\t\t\t}\n\n\t\t\tmodel.handleInlineEditShown(state.kind, state.viewData);\n\n\t\t\treturn {\n\t\t\t\tstate,\n\t\t\t\tdiff,\n\t\t\t\tedit: inlineEdit,\n\t\t\t\tnewText,\n\t\t\t\tnewTextLineCount: inlineEdit.modifiedLineRange.length,\n\t\t\t\tisInDiffEditor: model.isInDiffEditor,\n\t\t\t};\n\t\t});\n\t\tthis._previewTextModel = this._register(this._instantiationService.createInstance(\n\t\t\tTextModel,\n\t\t\t'',\n\t\t\tthis._editor.getModel()!.getLanguageId(),\n\t\t\t{ ...TextModel.DEFAULT_CREATION_OPTIONS, bracketPairColorizationOptions: { enabled: true, independentColorPoolPerBracketType: false } },\n\t\t\tnull\n\t\t));\n\t\tthis._indicatorCyclicDependencyCircuitBreaker = observableValue(this, false);\n\t\tthis._indicator = derived<InlineEditsGutterIndicator | undefined>(this, (reader) => {\n\t\t\tif (!this._indicatorCyclicDependencyCircuitBreaker.read(reader)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst indicatorDisplayRange = derivedOpts({ owner: this, equalsFn: equalsIfDefined(itemEquals()) }, reader => {\n\t\t\t\t/** @description indicatorDisplayRange */\n\t\t\t\tconst ghostTextIndicator = this._ghostTextIndicator.read(reader);\n\t\t\t\tif (ghostTextIndicator) {\n\t\t\t\t\treturn ghostTextIndicator.lineRange;\n\t\t\t\t}\n\n\t\t\t\tconst state = this._uiState.read(reader);\n\t\t\t\tif (!state) { return undefined; }\n\n\t\t\t\tif (state.state?.kind === 'custom') {\n\t\t\t\t\tconst range = state.state.displayLocation?.range;\n\t\t\t\t\tif (!range) {\n\t\t\t\t\t\tthrow new BugIndicatingError('custom view should have a range');\n\t\t\t\t\t}\n\t\t\t\t\treturn new LineRange(range.startLineNumber, range.endLineNumber);\n\t\t\t\t}\n\n\t\t\t\tif (state.state?.kind === 'insertionMultiLine') {\n\t\t\t\t\treturn this._insertion.originalLines.read(reader);\n\t\t\t\t}\n\n\t\t\t\treturn state.edit.displayRange;\n\t\t\t});\n\n\t\t\tconst modelWithGhostTextSupport = derived<InlineEditModel | undefined>(this, reader => {\n\t\t\t\t/** @description modelWithGhostTextSupport */\n\t\t\t\tconst model = this._model.read(reader);\n\t\t\t\tif (model) {\n\t\t\t\t\treturn model;\n\t\t\t\t}\n\n\t\t\t\tconst ghostTextIndicator = this._ghostTextIndicator.read(reader);\n\t\t\t\tif (ghostTextIndicator) {\n\t\t\t\t\treturn ghostTextIndicator.model;\n\t\t\t\t}\n\n\t\t\t\treturn model;\n\t\t\t});\n\n\t\t\treturn reader.store.add(this._instantiationService.createInstance(\n\t\t\t\tInlineEditsGutterIndicator,\n\t\t\t\tthis._editorObs,\n\t\t\t\tindicatorDisplayRange,\n\t\t\t\tthis._gutterIndicatorOffset,\n\t\t\t\tmodelWithGhostTextSupport,\n\t\t\t\tthis._inlineEditsIsHovered,\n\t\t\t\tthis._focusIsInMenu,\n\t\t\t));\n\t\t});\n\t\tthis._inlineEditsIsHovered = derived(this, reader => {\n\t\t\treturn this._sideBySide.isHovered.read(reader)\n\t\t\t\t|| this._wordReplacementViews.read(reader).some(v => v.isHovered.read(reader))\n\t\t\t\t|| this._deletion.isHovered.read(reader)\n\t\t\t\t|| this._inlineDiffView.isHovered.read(reader)\n\t\t\t\t|| this._lineReplacementView.isHovered.read(reader)\n\t\t\t\t|| this._insertion.isHovered.read(reader)\n\t\t\t\t|| this._customView.isHovered.read(reader);\n\t\t});\n\t\tthis._gutterIndicatorOffset = derived<number>(this, reader => {\n\t\t\t// TODO: have a better way to tell the gutter indicator view where the edit is inside a viewzone\n\t\t\tif (this._uiState.read(reader)?.state?.kind === 'insertionMultiLine') {\n\t\t\t\treturn this._insertion.startLineOffset.read(reader);\n\t\t\t}\n\n\t\t\tconst ghostTextIndicator = this._ghostTextIndicator.read(reader);\n\t\t\tif (ghostTextIndicator) {\n\t\t\t\treturn getGhostTextTopOffset(ghostTextIndicator, this._editor);\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t});\n\t\tthis._sideBySide = this._register(this._instantiationService.createInstance(InlineEditsSideBySideView,\n\t\t\tthis._editor,\n\t\t\tthis._model.map(m => m?.inlineEdit),\n\t\t\tthis._previewTextModel,\n\t\t\tthis._uiState.map(s => s && s.state?.kind === InlineCompletionViewKind.SideBySide ? ({\n\t\t\t\tnewTextLineCount: s.newTextLineCount,\n\t\t\t\tisInDiffEditor: s.isInDiffEditor,\n\t\t\t}) : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\t\tthis._deletion = this._register(this._instantiationService.createInstance(InlineEditsDeletionView,\n\t\t\tthis._editor,\n\t\t\tthis._model.map(m => m?.inlineEdit),\n\t\t\tthis._uiState.map(s => s && s.state?.kind === InlineCompletionViewKind.Deletion ? ({\n\t\t\t\toriginalRange: s.state.originalRange,\n\t\t\t\tdeletions: s.state.deletions,\n\t\t\t\tinDiffEditor: s.isInDiffEditor,\n\t\t\t}) : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\t\tthis._insertion = this._register(this._instantiationService.createInstance(InlineEditsInsertionView,\n\t\t\tthis._editor,\n\t\t\tthis._uiState.map(s => s && s.state?.kind === InlineCompletionViewKind.InsertionMultiLine ? ({\n\t\t\t\tlineNumber: s.state.lineNumber,\n\t\t\t\tstartColumn: s.state.column,\n\t\t\t\ttext: s.state.text,\n\t\t\t\tinDiffEditor: s.isInDiffEditor,\n\t\t\t}) : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\t\tthis._inlineDiffViewState = derived<IOriginalEditorInlineDiffViewState | undefined>(this, reader => {\n\t\t\tconst e = this._uiState.read(reader);\n\t\t\tif (!e || !e.state) { return undefined; }\n\t\t\tif (e.state.kind === 'wordReplacements' || e.state.kind === 'insertionMultiLine' || e.state.kind === 'collapsed' || e.state.kind === 'custom') {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tmodifiedText: new StringText(e.newText),\n\t\t\t\tdiff: e.diff,\n\t\t\t\tmode: e.state.kind,\n\t\t\t\tmodifiedCodeEditor: this._sideBySide.previewEditor,\n\t\t\t\tisInDiffEditor: e.isInDiffEditor,\n\t\t\t};\n\t\t});\n\t\tthis._inlineCollapsedView = this._register(this._instantiationService.createInstance(InlineEditsCollapsedView,\n\t\t\tthis._editor,\n\t\t\tthis._model.map((m, reader) => this._uiState.read(reader)?.state?.kind === 'collapsed' ? m?.inlineEdit : undefined)\n\t\t));\n\t\tthis._customView = this._register(this._instantiationService.createInstance(InlineEditsCustomView,\n\t\t\tthis._editor,\n\t\t\tthis._model.map((m, reader) => this._uiState.read(reader)?.state?.kind === 'custom' ? m?.displayLocation : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\t\tthis._inlineDiffView = this._register(new OriginalEditorInlineDiffView(this._editor, this._inlineDiffViewState, this._previewTextModel));\n\t\tthis._wordReplacementViews = mapObservableArrayCached(this, this._uiState.map(s => s?.state?.kind === 'wordReplacements' ? s.state.replacements : []), (e, store) => {\n\t\t\treturn store.add(this._instantiationService.createInstance(InlineEditsWordReplacementView, this._editorObs, e, this._tabAction));\n\t\t});\n\t\tthis._lineReplacementView = this._register(this._instantiationService.createInstance(InlineEditsLineReplacementView,\n\t\t\tthis._editorObs,\n\t\t\tthis._uiState.map(s => s?.state?.kind === InlineCompletionViewKind.LineReplacement ? ({\n\t\t\t\toriginalRange: s.state.originalRange,\n\t\t\t\tmodifiedRange: s.state.modifiedRange,\n\t\t\t\tmodifiedLines: s.state.modifiedLines,\n\t\t\t\treplacements: s.state.replacements,\n\t\t\t}) : undefined),\n\t\t\tthis._uiState.map(s => s?.isInDiffEditor ?? false),\n\t\t\tthis._tabAction,\n\t\t));\n\n\t\tthis._useCodeShifting = this._editorObs.getOption(EditorOption.inlineSuggest).map(s => s.edits.allowCodeShifting);\n\t\tthis._renderSideBySide = this._editorObs.getOption(EditorOption.inlineSuggest).map(s => s.edits.renderSideBySide);\n\n\t\tthis._register(autorunWithStore((reader, store) => {\n\t\t\tconst model = this._model.read(reader);\n\t\t\tif (!model) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tstore.add(\n\t\t\t\tEvent.any(\n\t\t\t\t\tthis._sideBySide.onDidClick,\n\t\t\t\t\tthis._deletion.onDidClick,\n\t\t\t\t\tthis._lineReplacementView.onDidClick,\n\t\t\t\t\tthis._insertion.onDidClick,\n\t\t\t\t\t...this._wordReplacementViews.read(reader).map(w => w.onDidClick),\n\t\t\t\t\tthis._inlineDiffView.onDidClick,\n\t\t\t\t\tthis._customView.onDidClick,\n\t\t\t\t)(e => {\n\t\t\t\t\tif (this._viewHasBeenShownLongerThan(350)) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tmodel.accept();\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t);\n\t\t}));\n\n\t\tthis._indicator.recomputeInitiallyAndOnChange(this._store);\n\t\tthis._wordReplacementViews.recomputeInitiallyAndOnChange(this._store);\n\n\t\tthis._indicatorCyclicDependencyCircuitBreaker.set(true, undefined);\n\n\t\tthis._register(this._instantiationService.createInstance(InlineEditsOnboardingExperience, this._host, this._model, this._indicator, this._inlineCollapsedView));\n\n\t\tconst minEditorScrollHeight = derived(this, reader => {\n\t\t\treturn Math.max(\n\t\t\t\t...this._wordReplacementViews.read(reader).map(v => v.minEditorScrollHeight.read(reader)),\n\t\t\t\tthis._lineReplacementView.minEditorScrollHeight.read(reader),\n\t\t\t\tthis._customView.minEditorScrollHeight.read(reader)\n\t\t\t);\n\t\t}).recomputeInitiallyAndOnChange(this._store);\n\n\t\tconst textModel = this._editor.getModel()!;\n\n\t\tlet viewZoneId: string | undefined;\n\t\tthis._register(autorun(reader => {\n\t\t\tconst minScrollHeight = minEditorScrollHeight.read(reader);\n\t\t\tthis._editor.changeViewZones(accessor => {\n\t\t\t\tconst scrollHeight = this._editor.getScrollHeight();\n\t\t\t\tconst viewZoneHeight = minScrollHeight - scrollHeight + 1 /* Add 1px so there is a small gap */;\n\n\t\t\t\tif (viewZoneHeight !== 0 && viewZoneId) {\n\t\t\t\t\taccessor.removeZone(viewZoneId);\n\t\t\t\t\tviewZoneId = undefined;\n\t\t\t\t}\n\n\t\t\t\tif (viewZoneHeight <= 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tviewZoneId = accessor.addZone({\n\t\t\t\t\tafterLineNumber: textModel.getLineCount(),\n\t\t\t\t\theightInPx: viewZoneHeight,\n\t\t\t\t\tdomNode: $('div.minScrollHeightViewZone'),\n\t\t\t\t});\n\t\t\t});\n\t\t}));\n\n\t\tthis._constructorDone.set(true, undefined); // TODO: remove and use correct initialization order\n\t}\n\n\tprivate readonly _constructorDone;\n\n\tprivate readonly _uiState;\n\n\tprivate readonly _previewTextModel;\n\n\tprivate readonly _indicatorCyclicDependencyCircuitBreaker;\n\n\tprotected readonly _indicator;\n\n\tprivate readonly _inlineEditsIsHovered;\n\n\tprivate readonly _gutterIndicatorOffset;\n\n\tprivate readonly _sideBySide;\n\n\tprotected readonly _deletion;\n\n\tprotected readonly _insertion;\n\n\tprivate readonly _inlineDiffViewState;\n\n\tprotected readonly _inlineCollapsedView;\n\n\tprotected readonly _customView;\n\n\tprotected readonly _inlineDiffView;\n\n\tprotected readonly _wordReplacementViews;\n\n\tprotected readonly _lineReplacementView;\n\n\tprivate getCacheId(model: IInlineEditModel) {\n\t\treturn model.inlineEdit.inlineCompletion.identity.id;\n\t}\n\n\tprivate determineView(model: IInlineEditModel, reader: IReader, diff: DetailedLineRangeMapping[], newText: StringText): InlineCompletionViewKind {\n\t\t// Check if we can use the previous view if it is the same InlineCompletion as previously shown\n\t\tconst inlineEdit = model.inlineEdit;\n\t\tconst canUseCache = this._previousView?.id === this.getCacheId(model);\n\t\tconst reconsiderViewEditorWidthChange = this._previousView?.editorWidth !== this._editorObs.layoutInfoWidth.read(reader) &&\n\t\t\t(\n\t\t\t\tthis._previousView?.view === InlineCompletionViewKind.SideBySide ||\n\t\t\t\tthis._previousView?.view === InlineCompletionViewKind.LineReplacement\n\t\t\t);\n\n\t\tif (canUseCache && !reconsiderViewEditorWidthChange) {\n\t\t\treturn this._previousView!.view;\n\t\t}\n\n\t\tif (model.displayLocation) {\n\t\t\treturn InlineCompletionViewKind.Custom;\n\t\t}\n\n\t\t// Determine the view based on the edit / diff\n\n\t\tconst numOriginalLines = inlineEdit.originalLineRange.length;\n\t\tconst numModifiedLines = inlineEdit.modifiedLineRange.length;\n\t\tconst inner = diff.flatMap(d => d.innerChanges ?? []);\n\t\tconst isSingleInnerEdit = inner.length === 1;\n\n\t\tif (!model.isInDiffEditor) {\n\t\t\tif (\n\t\t\t\tisSingleInnerEdit\n\t\t\t\t&& this._useCodeShifting.read(reader) !== 'never'\n\t\t\t\t&& isSingleLineInsertion(diff)\n\t\t\t) {\n\t\t\t\tif (isSingleLineInsertionAfterPosition(diff, inlineEdit.cursorPosition)) {\n\t\t\t\t\treturn InlineCompletionViewKind.InsertionInline;\n\t\t\t\t}\n\n\t\t\t\t// If we have a single line insertion before the cursor position, we do not want to move the cursor by inserting\n\t\t\t\t// the suggestion inline. Use a line replacement view instead. Do not use word replacement view.\n\t\t\t\treturn InlineCompletionViewKind.LineReplacement;\n\t\t\t}\n\n\t\t\tif (isDeletion(inner, inlineEdit, newText)) {\n\t\t\t\treturn InlineCompletionViewKind.Deletion;\n\t\t\t}\n\n\t\t\tif (isSingleMultiLineInsertion(diff) && this._useCodeShifting.read(reader) === 'always') {\n\t\t\t\treturn InlineCompletionViewKind.InsertionMultiLine;\n\t\t\t}\n\n\t\t\tconst allInnerChangesNotTooLong = inner.every(m => TextLength.ofRange(m.originalRange).columnCount < InlineEditsWordReplacementView.MAX_LENGTH && TextLength.ofRange(m.modifiedRange).columnCount < InlineEditsWordReplacementView.MAX_LENGTH);\n\t\t\tif (allInnerChangesNotTooLong && isSingleInnerEdit && numOriginalLines === 1 && numModifiedLines === 1) {\n\t\t\t\t// Do not show indentation changes with word replacement view\n\t\t\t\tconst modifiedText = inner.map(m => newText.getValueOfRange(m.modifiedRange));\n\t\t\t\tconst originalText = inner.map(m => model.inlineEdit.originalText.getValueOfRange(m.originalRange));\n\t\t\t\tif (!modifiedText.some(v => v.includes('\\t')) && !originalText.some(v => v.includes('\\t'))) {\n\t\t\t\t\t// Make sure there is no insertion, even if we grow them\n\t\t\t\t\tif (\n\t\t\t\t\t\t!inner.some(m => m.originalRange.isEmpty()) ||\n\t\t\t\t\t\t!growEditsUntilWhitespace(inner.map(m => new TextReplacement(m.originalRange, '')), inlineEdit.originalText).some(e => e.range.isEmpty() && TextLength.ofRange(e.range).columnCount < InlineEditsWordReplacementView.MAX_LENGTH)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn InlineCompletionViewKind.WordReplacements;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (numOriginalLines > 0 && numModifiedLines > 0) {\n\t\t\tif (numOriginalLines === 1 && numModifiedLines === 1 && !model.isInDiffEditor /* prefer side by side in diff editor */) {\n\t\t\t\treturn InlineCompletionViewKind.LineReplacement;\n\t\t\t}\n\n\t\t\tif (this._renderSideBySide.read(reader) !== 'never' && InlineEditsSideBySideView.fitsInsideViewport(this._editor, this._previewTextModel, inlineEdit, reader)) {\n\t\t\t\treturn InlineCompletionViewKind.SideBySide;\n\t\t\t}\n\n\t\t\treturn InlineCompletionViewKind.LineReplacement;\n\t\t}\n\n\t\tif (model.isInDiffEditor) {\n\t\t\tif (isDeletion(inner, inlineEdit, newText)) {\n\t\t\t\treturn InlineCompletionViewKind.Deletion;\n\t\t\t}\n\n\t\t\tif (isSingleMultiLineInsertion(diff) && this._useCodeShifting.read(reader) === 'always') {\n\t\t\t\treturn InlineCompletionViewKind.InsertionMultiLine;\n\t\t\t}\n\t\t}\n\n\t\treturn InlineCompletionViewKind.SideBySide;\n\t}\n\n\tprivate determineRenderState(model: IInlineEditModel, reader: IReader, diff: DetailedLineRangeMapping[], newText: StringText) {\n\t\tconst inlineEdit = model.inlineEdit;\n\n\t\tconst view = this.determineView(model, reader, diff, newText);\n\n\t\tthis._previousView = { id: this.getCacheId(model), view, editorWidth: this._editor.getLayoutInfo().width, timestamp: Date.now() };\n\n\t\tconst inner = diff.flatMap(d => d.innerChanges ?? []);\n\t\tconst textModel = this._editor.getModel()!;\n\t\tconst stringChanges = inner.map(m => ({\n\t\t\toriginalRange: m.originalRange,\n\t\t\tmodifiedRange: m.modifiedRange,\n\t\t\toriginal: textModel.getValueInRange(m.originalRange),\n\t\t\tmodified: newText.getValueOfRange(m.modifiedRange)\n\t\t}));\n\n\t\tconst cursorPosition = inlineEdit.cursorPosition;\n\t\tconst startsWithEOL = stringChanges[0].modified.startsWith(textModel.getEOL());\n\t\tconst viewData: InlineCompletionViewData = {\n\t\t\tcursorColumnDistance: inlineEdit.edit.replacements[0].range.getStartPosition().column - cursorPosition.column,\n\t\t\tcursorLineDistance: inlineEdit.lineEdit.lineRange.startLineNumber - cursorPosition.lineNumber + (startsWithEOL && inlineEdit.lineEdit.lineRange.startLineNumber >= cursorPosition.lineNumber ? 1 : 0),\n\t\t\tlineCountOriginal: inlineEdit.lineEdit.lineRange.length,\n\t\t\tlineCountModified: inlineEdit.lineEdit.newLines.length,\n\t\t\tcharacterCountOriginal: stringChanges.reduce((acc, r) => acc + r.original.length, 0),\n\t\t\tcharacterCountModified: stringChanges.reduce((acc, r) => acc + r.modified.length, 0),\n\t\t\tdisjointReplacements: stringChanges.length,\n\t\t\tsameShapeReplacements: stringChanges.every(r => r.original === stringChanges[0].original && r.modified === stringChanges[0].modified),\n\t\t};\n\n\t\tswitch (view) {\n\t\t\tcase InlineCompletionViewKind.InsertionInline: return { kind: InlineCompletionViewKind.InsertionInline as const, viewData };\n\t\t\tcase InlineCompletionViewKind.SideBySide: return { kind: InlineCompletionViewKind.SideBySide as const, viewData };\n\t\t\tcase InlineCompletionViewKind.Collapsed: return { kind: InlineCompletionViewKind.Collapsed as const, viewData };\n\t\t\tcase InlineCompletionViewKind.Custom: return { kind: InlineCompletionViewKind.Custom as const, displayLocation: model.displayLocation, viewData };\n\t\t}\n\n\t\tif (view === InlineCompletionViewKind.Deletion) {\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.Deletion as const,\n\t\t\t\toriginalRange: inlineEdit.originalLineRange,\n\t\t\t\tdeletions: inner.map(m => m.originalRange),\n\t\t\t\tviewData,\n\t\t\t};\n\t\t}\n\n\t\tif (view === InlineCompletionViewKind.InsertionMultiLine) {\n\t\t\tconst change = inner[0];\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.InsertionMultiLine as const,\n\t\t\t\tlineNumber: change.originalRange.startLineNumber,\n\t\t\t\tcolumn: change.originalRange.startColumn,\n\t\t\t\ttext: newText.getValueOfRange(change.modifiedRange),\n\t\t\t\tviewData,\n\t\t\t};\n\t\t}\n\n\t\tconst replacements = stringChanges.map(m => new TextReplacement(m.originalRange, m.modified));\n\t\tif (replacements.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (view === InlineCompletionViewKind.WordReplacements) {\n\t\t\tlet grownEdits = growEditsToEntireWord(replacements, inlineEdit.originalText);\n\n\t\t\tif (grownEdits.some(e => e.range.isEmpty())) {\n\t\t\t\tgrownEdits = growEditsUntilWhitespace(replacements, inlineEdit.originalText);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.WordReplacements as const,\n\t\t\t\treplacements: grownEdits,\n\t\t\t\tviewData,\n\t\t\t};\n\t\t}\n\n\t\tif (view === InlineCompletionViewKind.LineReplacement) {\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.LineReplacement as const,\n\t\t\t\toriginalRange: inlineEdit.originalLineRange,\n\t\t\t\tmodifiedRange: inlineEdit.modifiedLineRange,\n\t\t\t\tmodifiedLines: inlineEdit.modifiedLineRange.mapToLineArray(line => newText.getLineAt(line)),\n\t\t\t\treplacements: inner.map(m => ({ originalRange: m.originalRange, modifiedRange: m.modifiedRange })),\n\t\t\t\tviewData,\n\t\t\t};\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tprivate _viewHasBeenShownLongerThan(durationMs: number): boolean {\n\t\tconst viewCreationTime = this._previousView?.timestamp;\n\t\tif (!viewCreationTime) {\n\t\t\tthrow new BugIndicatingError('viewHasBeenShownLongThan called before a view has been shown');\n\t\t}\n\n\t\tconst currentTime = Date.now();\n\t\treturn (currentTime - viewCreationTime) >= durationMs;\n\t}\n}\n\nfunction isSingleLineInsertion(diff: DetailedLineRangeMapping[]) {\n\treturn diff.every(m => m.innerChanges!.every(r => isWordInsertion(r)));\n\n\tfunction isWordInsertion(r: RangeMapping) {\n\t\tif (!r.originalRange.isEmpty()) {\n\t\t\treturn false;\n\t\t}\n\t\tconst isInsertionWithinLine = r.modifiedRange.startLineNumber === r.modifiedRange.endLineNumber;\n\t\tif (!isInsertionWithinLine) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n}\n\nfunction isSingleLineInsertionAfterPosition(diff: DetailedLineRangeMapping[], position: Position | null) {\n\tif (!position) {\n\t\treturn false;\n\t}\n\n\tif (!isSingleLineInsertion(diff)) {\n\t\treturn false;\n\t}\n\n\tconst pos = position;\n\n\treturn diff.every(m => m.innerChanges!.every(r => isStableWordInsertion(r)));\n\n\tfunction isStableWordInsertion(r: RangeMapping) {\n\t\tconst insertPosition = r.originalRange.getStartPosition();\n\t\tif (pos.isBeforeOrEqual(insertPosition)) {\n\t\t\treturn true;\n\t\t}\n\t\tif (insertPosition.lineNumber < pos.lineNumber) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n}\n\nfunction isSingleMultiLineInsertion(diff: DetailedLineRangeMapping[]) {\n\tconst inner = diff.flatMap(d => d.innerChanges ?? []);\n\tif (inner.length !== 1) {\n\t\treturn false;\n\t}\n\n\tconst change = inner[0];\n\tif (!change.originalRange.isEmpty()) {\n\t\treturn false;\n\t}\n\n\tif (change.modifiedRange.startLineNumber === change.modifiedRange.endLineNumber) {\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nfunction isDeletion(inner: RangeMapping[], inlineEdit: InlineEditWithChanges, newText: StringText) {\n\tconst innerValues = inner.map(m => ({ original: inlineEdit.originalText.getValueOfRange(m.originalRange), modified: newText.getValueOfRange(m.modifiedRange) }));\n\treturn innerValues.every(({ original, modified }) => modified.trim() === '' && original.length > 0 && (original.length > modified.length || original.trim() !== ''));\n}\n\nfunction growEditsToEntireWord(replacements: TextReplacement[], originalText: AbstractText): TextReplacement[] {\n\treturn _growEdits(replacements, originalText, (char) => /^[a-zA-Z]$/.test(char));\n}\n\nfunction growEditsUntilWhitespace(replacements: TextReplacement[], originalText: AbstractText): TextReplacement[] {\n\treturn _growEdits(replacements, originalText, (char) => !(/^\\s$/.test(char)));\n}\n\nfunction _growEdits(replacements: TextReplacement[], originalText: AbstractText, fn: (c: string) => boolean): TextReplacement[] {\n\tconst result: TextReplacement[] = [];\n\n\treplacements.sort((a, b) => Range.compareRangesUsingStarts(a.range, b.range));\n\n\tfor (const edit of replacements) {\n\t\tlet startIndex = edit.range.startColumn - 1;\n\t\tlet endIndex = edit.range.endColumn - 2;\n\t\tlet prefix = '';\n\t\tlet suffix = '';\n\t\tconst startLineContent = originalText.getLineAt(edit.range.startLineNumber);\n\t\tconst endLineContent = originalText.getLineAt(edit.range.endLineNumber);\n\n\t\tif (isIncluded(startLineContent[startIndex])) {\n\t\t\t// grow to the left\n\t\t\twhile (isIncluded(startLineContent[startIndex - 1])) {\n\t\t\t\tprefix = startLineContent[startIndex - 1] + prefix;\n\t\t\t\tstartIndex--;\n\t\t\t}\n\t\t}\n\n\t\tif (isIncluded(endLineContent[endIndex]) || endIndex < startIndex) {\n\t\t\t// grow to the right\n\t\t\twhile (isIncluded(endLineContent[endIndex + 1])) {\n\t\t\t\tsuffix += endLineContent[endIndex + 1];\n\t\t\t\tendIndex++;\n\t\t\t}\n\t\t}\n\n\t\t// create new edit and merge together if they are touching\n\t\tlet newEdit = new TextReplacement(new Range(edit.range.startLineNumber, startIndex + 1, edit.range.endLineNumber, endIndex + 2), prefix + edit.text + suffix);\n\t\tif (result.length > 0 && Range.areIntersectingOrTouching(result[result.length - 1].range, newEdit.range)) {\n\t\t\tnewEdit = TextReplacement.joinReplacements([result.pop()!, newEdit], originalText);\n\t\t}\n\n\t\tresult.push(newEdit);\n\t}\n\n\tfunction isIncluded(c: string | undefined) {\n\t\tif (c === undefined) {\n\t\t\treturn false;\n\t\t}\n\t\treturn fn(c);\n\t}\n\n\treturn result;\n}\n\nfunction getGhostTextTopOffset(ghostTextIndicator: GhostTextIndicator, editor: ICodeEditor): number {\n\tconst replacements = ghostTextIndicator.model.inlineEdit.edit.replacements;\n\tif (replacements.length !== 1) {\n\t\treturn 0;\n\t}\n\n\tconst textModel = editor.getModel();\n\tif (!textModel) {\n\t\treturn 0;\n\t}\n\n\tconst EOL = textModel.getEOL();\n\tconst replacement = replacements[0];\n\tif (replacement.range.isEmpty() && replacement.text.startsWith(EOL)) {\n\t\tconst lineHeight = editor.getLineHeightForPosition(replacement.range.getStartPosition());\n\t\treturn countPrefixRepeats(replacement.text, EOL) * lineHeight;\n\t}\n\n\treturn 0;\n}\n\nfunction countPrefixRepeats(str: string, prefix: string): number {\n\tif (!prefix.length) {\n\t\treturn 0;\n\t}\n\tlet count = 0;\n\tlet i = 0;\n\twhile (str.startsWith(prefix, i)) {\n\t\tcount++;\n\t\ti += prefix.length;\n\t}\n\treturn count;\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { equalsIfDefined, itemEquals } from '../../../../../../base/common/equals.js';\nimport { BugIndicatingError } from '../../../../../../base/common/errors.js';\nimport { Event } from '../../../../../../base/common/event.js';\nimport { Disposable } from '../../../../../../base/common/lifecycle.js';\nimport { autorun, autorunWithStore, derived, derivedOpts, IObservable, IReader, ISettableObservable, mapObservableArrayCached, observableValue } from '../../../../../../base/common/observable.js';\nimport { IInstantiationService } from '../../../../../../platform/instantiation/common/instantiation.js';\nimport { ICodeEditor } from '../../../../../browser/editorBrowser.js';\nimport { ObservableCodeEditor, observableCodeEditor } from '../../../../../browser/observableCodeEditor.js';\nimport { EditorOption } from '../../../../../common/config/editorOptions.js';\nimport { LineRange } from '../../../../../common/core/ranges/lineRange.js';\nimport { Position } from '../../../../../common/core/position.js';\nimport { Range } from '../../../../../common/core/range.js';\nimport { TextReplacement } from '../../../../../common/core/edits/textEdit.js';\nimport { AbstractText, StringText } from '../../../../../common/core/text/abstractText.js';\nimport { TextLength } from '../../../../../common/core/text/textLength.js';\nimport { DetailedLineRangeMapping, lineRangeMappingFromRangeMappings, RangeMapping } from '../../../../../common/diff/rangeMapping.js';\nimport { TextModel } from '../../../../../common/model/textModel.js';\nimport { InlineEditsGutterIndicator } from './components/gutterIndicatorView.js';\nimport { InlineEditWithChanges } from './inlineEditWithChanges.js';\nimport { GhostTextIndicator, InlineEditHost, InlineEditModel } from './inlineEditsModel.js';\nimport { InlineEditsOnboardingExperience } from './inlineEditsNewUsers.js';\nimport { IInlineEditModel, InlineCompletionViewData, InlineCompletionViewKind, InlineEditTabAction } from './inlineEditsViewInterface.js';\nimport { InlineEditsCollapsedView } from './inlineEditsViews/inlineEditsCollapsedView.js';\nimport { InlineEditsCustomView } from './inlineEditsViews/inlineEditsCustomView.js';\nimport { InlineEditsDeletionView } from './inlineEditsViews/inlineEditsDeletionView.js';\nimport { InlineEditsInsertionView } from './inlineEditsViews/inlineEditsInsertionView.js';\nimport { InlineEditsLineReplacementView } from './inlineEditsViews/inlineEditsLineReplacementView.js';\nimport { InlineEditsSideBySideView } from './inlineEditsViews/inlineEditsSideBySideView.js';\nimport { InlineEditsWordReplacementView } from './inlineEditsViews/inlineEditsWordReplacementView.js';\nimport { IOriginalEditorInlineDiffViewState, OriginalEditorInlineDiffView } from './inlineEditsViews/originalEditorInlineDiffView.js';\nimport { applyEditToModifiedRangeMappings, createReindentEdit } from './utils/utils.js';\nimport './view.css';\nimport { $ } from '../../../../../../base/browser/dom.js';\n\n\nexport class InlineEditsView extends Disposable {\n\tprivate readonly _editorObs: ObservableCodeEditor;\n\n\tprivate readonly _useCodeShifting;\n\tprivate readonly _renderSideBySide;\n\n\tprivate readonly _tabAction;\n\n\tprivate _previousView: {\n\t\tid: string;\n\t\tview: ReturnType<typeof InlineEditsView.prototype.determineView>;\n\t\teditorWidth: number;\n\t\ttimestamp: number;\n\t} | undefined;\n\n\tconstructor(\n\t\tprivate readonly _editor: ICodeEditor,\n\t\tprivate readonly _host: IObservable<InlineEditHost | undefined>,\n\t\tprivate readonly _model: IObservable<InlineEditModel | undefined>,\n\t\tprivate readonly _ghostTextIndicator: IObservable<GhostTextIndicator | undefined>,\n\t\tprivate readonly _focusIsInMenu: ISettableObservable<boolean>,\n\t\t@IInstantiationService private readonly _instantiationService: IInstantiationService,\n\t) {\n\t\tsuper();\n\t\tthis._editorObs = observableCodeEditor(this._editor);\n\t\tthis._tabAction = derived<InlineEditTabAction>(reader => this._model.read(reader)?.tabAction.read(reader) ?? InlineEditTabAction.Inactive);\n\t\tthis._constructorDone = observableValue(this, false);\n\t\tthis._uiState = derived<{\n\t\t\tstate: ReturnType<typeof InlineEditsView.prototype.determineRenderState>;\n\t\t\tdiff: DetailedLineRangeMapping[];\n\t\t\tedit: InlineEditWithChanges;\n\t\t\tnewText: string;\n\t\t\tnewTextLineCount: number;\n\t\t\tisInDiffEditor: boolean;\n\t\t} | undefined>(this, reader => {\n\t\t\tconst model = this._model.read(reader);\n\t\t\tif (!model || !this._constructorDone.read(reader)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst inlineEdit = model.inlineEdit;\n\t\t\tlet mappings = RangeMapping.fromEdit(inlineEdit.edit);\n\t\t\tlet newText = inlineEdit.edit.apply(inlineEdit.originalText);\n\t\t\tlet diff = lineRangeMappingFromRangeMappings(mappings, inlineEdit.originalText, new StringText(newText));\n\n\t\t\tlet state = this.determineRenderState(model, reader, diff, new StringText(newText));\n\t\t\tif (!state) {\n\t\t\t\tmodel.abort(`unable to determine view: tried to render ${this._previousView?.view}`);\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tif (state.kind === InlineCompletionViewKind.SideBySide) {\n\t\t\t\tconst indentationAdjustmentEdit = createReindentEdit(newText, inlineEdit.modifiedLineRange, textModel.getOptions().tabSize);\n\t\t\t\tnewText = indentationAdjustmentEdit.applyToString(newText);\n\n\t\t\t\tmappings = applyEditToModifiedRangeMappings(mappings, indentationAdjustmentEdit);\n\t\t\t\tdiff = lineRangeMappingFromRangeMappings(mappings, inlineEdit.originalText, new StringText(newText));\n\t\t\t}\n\n\t\t\tthis._previewTextModel.setLanguage(this._editor.getModel()!.getLanguageId());\n\n\t\t\tconst previousNewText = this._previewTextModel.getValue();\n\t\t\tif (previousNewText !== newText) {\n\t\t\t\t// Only update the model if the text has changed to avoid flickering\n\t\t\t\tthis._previewTextModel.setValue(newText);\n\t\t\t}\n\n\t\t\tif (model.showCollapsed.read(reader) && !this._indicator.read(reader)?.isHoverVisible.read(reader)) {\n\t\t\t\tstate = { kind: InlineCompletionViewKind.Collapsed as const, viewData: state.viewData };\n\t\t\t}\n\n\t\t\tmodel.handleInlineEditShown(state.kind, state.viewData);\n\n\t\t\treturn {\n\t\t\t\tstate,\n\t\t\t\tdiff,\n\t\t\t\tedit: inlineEdit,\n\t\t\t\tnewText,\n\t\t\t\tnewTextLineCount: inlineEdit.modifiedLineRange.length,\n\t\t\t\tisInDiffEditor: model.isInDiffEditor,\n\t\t\t};\n\t\t});\n\t\tthis._previewTextModel = this._register(this._instantiationService.createInstance(\n\t\t\tTextModel,\n\t\t\t'',\n\t\t\tthis._editor.getModel()!.getLanguageId(),\n\t\t\t{ ...TextModel.DEFAULT_CREATION_OPTIONS, bracketPairColorizationOptions: { enabled: true, independentColorPoolPerBracketType: false } },\n\t\t\tnull\n\t\t));\n\t\tthis._indicatorCyclicDependencyCircuitBreaker = observableValue(this, false);\n\t\tthis._indicator = derived<InlineEditsGutterIndicator | undefined>(this, (reader) => {\n\t\t\tif (!this._indicatorCyclicDependencyCircuitBreaker.read(reader)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst indicatorDisplayRange = derivedOpts({ owner: this, equalsFn: equalsIfDefined(itemEquals()) }, reader => {\n\t\t\t\t/** @description indicatorDisplayRange */\n\t\t\t\tconst ghostTextIndicator = this._ghostTextIndicator.read(reader);\n\t\t\t\tif (ghostTextIndicator) {\n\t\t\t\t\treturn ghostTextIndicator.lineRange;\n\t\t\t\t}\n\n\t\t\t\tconst state = this._uiState.read(reader);\n\t\t\t\tif (!state) { return undefined; }\n\n\t\t\t\tif (state.state?.kind === 'custom') {\n\t\t\t\t\tconst range = state.state.displayLocation?.range;\n\t\t\t\t\tif (!range) {\n\t\t\t\t\t\tthrow new BugIndicatingError('custom view should have a range');\n\t\t\t\t\t}\n\t\t\t\t\treturn new LineRange(range.startLineNumber, range.endLineNumber);\n\t\t\t\t}\n\n\t\t\t\tif (state.state?.kind === 'insertionMultiLine') {\n\t\t\t\t\treturn this._insertion.originalLines.read(reader);\n\t\t\t\t}\n\n\t\t\t\treturn state.edit.displayRange;\n\t\t\t});\n\n\t\t\tconst modelWithGhostTextSupport = derived<InlineEditModel | undefined>(this, reader => {\n\t\t\t\t/** @description modelWithGhostTextSupport */\n\t\t\t\tconst model = this._model.read(reader);\n\t\t\t\tif (model) {\n\t\t\t\t\treturn model;\n\t\t\t\t}\n\n\t\t\t\tconst ghostTextIndicator = this._ghostTextIndicator.read(reader);\n\t\t\t\tif (ghostTextIndicator) {\n\t\t\t\t\treturn ghostTextIndicator.model;\n\t\t\t\t}\n\n\t\t\t\treturn model;\n\t\t\t});\n\n\t\t\treturn reader.store.add(this._instantiationService.createInstance(\n\t\t\t\tInlineEditsGutterIndicator,\n\t\t\t\tthis._editorObs,\n\t\t\t\tindicatorDisplayRange,\n\t\t\t\tthis._gutterIndicatorOffset,\n\t\t\t\tmodelWithGhostTextSupport,\n\t\t\t\tthis._inlineEditsIsHovered,\n\t\t\t\tthis._focusIsInMenu,\n\t\t\t));\n\t\t});\n\t\tthis._inlineEditsIsHovered = derived(this, reader => {\n\t\t\treturn this._sideBySide.isHovered.read(reader)\n\t\t\t\t|| this._wordReplacementViews.read(reader).some(v => v.isHovered.read(reader))\n\t\t\t\t|| this._deletion.isHovered.read(reader)\n\t\t\t\t|| this._inlineDiffView.isHovered.read(reader)\n\t\t\t\t|| this._lineReplacementView.isHovered.read(reader)\n\t\t\t\t|| this._insertion.isHovered.read(reader)\n\t\t\t\t|| this._customView.isHovered.read(reader);\n\t\t});\n\t\tthis._gutterIndicatorOffset = derived<number>(this, reader => {\n\t\t\t// TODO: have a better way to tell the gutter indicator view where the edit is inside a viewzone\n\t\t\tif (this._uiState.read(reader)?.state?.kind === 'insertionMultiLine') {\n\t\t\t\treturn this._insertion.startLineOffset.read(reader);\n\t\t\t}\n\n\t\t\tconst ghostTextIndicator = this._ghostTextIndicator.read(reader);\n\t\t\tif (ghostTextIndicator) {\n\t\t\t\treturn getGhostTextTopOffset(ghostTextIndicator, this._editor);\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t});\n\t\tthis._sideBySide = this._register(this._instantiationService.createInstance(InlineEditsSideBySideView,\n\t\t\tthis._editor,\n\t\t\tthis._model.map(m => m?.inlineEdit),\n\t\t\tthis._previewTextModel,\n\t\t\tthis._uiState.map(s => s && s.state?.kind === InlineCompletionViewKind.SideBySide ? ({\n\t\t\t\tnewTextLineCount: s.newTextLineCount,\n\t\t\t\tisInDiffEditor: s.isInDiffEditor,\n\t\t\t}) : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\t\tthis._deletion = this._register(this._instantiationService.createInstance(InlineEditsDeletionView,\n\t\t\tthis._editor,\n\t\t\tthis._model.map(m => m?.inlineEdit),\n\t\t\tthis._uiState.map(s => s && s.state?.kind === InlineCompletionViewKind.Deletion ? ({\n\t\t\t\toriginalRange: s.state.originalRange,\n\t\t\t\tdeletions: s.state.deletions,\n\t\t\t\tinDiffEditor: s.isInDiffEditor,\n\t\t\t}) : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\t\tthis._insertion = this._register(this._instantiationService.createInstance(InlineEditsInsertionView,\n\t\t\tthis._editor,\n\t\t\tthis._uiState.map(s => s && s.state?.kind === InlineCompletionViewKind.InsertionMultiLine ? ({\n\t\t\t\tlineNumber: s.state.lineNumber,\n\t\t\t\tstartColumn: s.state.column,\n\t\t\t\ttext: s.state.text,\n\t\t\t\tinDiffEditor: s.isInDiffEditor,\n\t\t\t}) : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\t\tthis._inlineDiffViewState = derived<IOriginalEditorInlineDiffViewState | undefined>(this, reader => {\n\t\t\tconst e = this._uiState.read(reader);\n\t\t\tif (!e || !e.state) { return undefined; }\n\t\t\tif (e.state.kind === 'wordReplacements' || e.state.kind === 'insertionMultiLine' || e.state.kind === 'collapsed' || e.state.kind === 'custom') {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tmodifiedText: new StringText(e.newText),\n\t\t\t\tdiff: e.diff,\n\t\t\t\tmode: e.state.kind,\n\t\t\t\tmodifiedCodeEditor: this._sideBySide.previewEditor,\n\t\t\t\tisInDiffEditor: e.isInDiffEditor,\n\t\t\t};\n\t\t});\n\t\tthis._inlineCollapsedView = this._register(this._instantiationService.createInstance(InlineEditsCollapsedView,\n\t\t\tthis._editor,\n\t\t\tthis._model.map((m, reader) => this._uiState.read(reader)?.state?.kind === 'collapsed' ? m?.inlineEdit : undefined)\n\t\t));\n\t\tthis._customView = this._register(this._instantiationService.createInstance(InlineEditsCustomView,\n\t\t\tthis._editor,\n\t\t\tthis._model.map((m, reader) => this._uiState.read(reader)?.state?.kind === 'custom' ? m?.displayLocation : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\t\tthis._inlineDiffView = this._register(new OriginalEditorInlineDiffView(this._editor, this._inlineDiffViewState, this._previewTextModel));\n\t\tthis._wordReplacementViews = mapObservableArrayCached(this, this._uiState.map(s => s?.state?.kind === 'wordReplacements' ? s.state.replacements : []), (e, store) => {\n\t\t\treturn store.add(this._instantiationService.createInstance(InlineEditsWordReplacementView, this._editorObs, e, this._tabAction));\n\t\t});\n\t\tthis._lineReplacementView = this._register(this._instantiationService.createInstance(InlineEditsLineReplacementView,\n\t\t\tthis._editorObs,\n\t\t\tthis._uiState.map(s => s?.state?.kind === InlineCompletionViewKind.LineReplacement ? ({\n\t\t\t\toriginalRange: s.state.originalRange,\n\t\t\t\tmodifiedRange: s.state.modifiedRange,\n\t\t\t\tmodifiedLines: s.state.modifiedLines,\n\t\t\t\treplacements: s.state.replacements,\n\t\t\t}) : undefined),\n\t\t\tthis._uiState.map(s => s?.isInDiffEditor ?? false),\n\t\t\tthis._tabAction,\n\t\t));\n\n\t\tthis._useCodeShifting = this._editorObs.getOption(EditorOption.inlineSuggest).map(s => s.edits.allowCodeShifting);\n\t\tthis._renderSideBySide = this._editorObs.getOption(EditorOption.inlineSuggest).map(s => s.edits.renderSideBySide);\n\n\t\tthis._register(autorunWithStore((reader, store) => {\n\t\t\tconst model = this._model.read(reader);\n\t\t\tif (!model) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tstore.add(\n\t\t\t\tEvent.any(\n\t\t\t\t\tthis._sideBySide.onDidClick,\n\t\t\t\t\tthis._deletion.onDidClick,\n\t\t\t\t\tthis._lineReplacementView.onDidClick,\n\t\t\t\t\tthis._insertion.onDidClick,\n\t\t\t\t\t...this._wordReplacementViews.read(reader).map(w => w.onDidClick),\n\t\t\t\t\tthis._inlineDiffView.onDidClick,\n\t\t\t\t\tthis._customView.onDidClick,\n\t\t\t\t)(e => {\n\t\t\t\t\tif (this._viewHasBeenShownLongerThan(350)) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tmodel.accept();\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t);\n\t\t}));\n\n\t\tthis._indicator.recomputeInitiallyAndOnChange(this._store);\n\t\tthis._wordReplacementViews.recomputeInitiallyAndOnChange(this._store);\n\n\t\tthis._indicatorCyclicDependencyCircuitBreaker.set(true, undefined);\n\n\t\tthis._register(this._instantiationService.createInstance(InlineEditsOnboardingExperience, this._host, this._model, this._indicator, this._inlineCollapsedView));\n\n\t\tconst minEditorScrollHeight = derived(this, reader => {\n\t\t\treturn Math.max(\n\t\t\t\t...this._wordReplacementViews.read(reader).map(v => v.minEditorScrollHeight.read(reader)),\n\t\t\t\tthis._lineReplacementView.minEditorScrollHeight.read(reader),\n\t\t\t\tthis._customView.minEditorScrollHeight.read(reader)\n\t\t\t);\n\t\t}).recomputeInitiallyAndOnChange(this._store);\n\n\t\tconst textModel = this._editor.getModel()!;\n\n\t\tlet viewZoneId: string | undefined;\n\t\tthis._register(autorun(reader => {\n\t\t\tconst minScrollHeight = minEditorScrollHeight.read(reader);\n\t\t\tthis._editor.changeViewZones(accessor => {\n\t\t\t\tconst scrollHeight = this._editor.getScrollHeight();\n\t\t\t\tconst viewZoneHeight = minScrollHeight - scrollHeight + 1 /* Add 1px so there is a small gap */;\n\n\t\t\t\tif (viewZoneHeight !== 0 && viewZoneId) {\n\t\t\t\t\taccessor.removeZone(viewZoneId);\n\t\t\t\t\tviewZoneId = undefined;\n\t\t\t\t}\n\n\t\t\t\tif (viewZoneHeight <= 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tviewZoneId = accessor.addZone({\n\t\t\t\t\tafterLineNumber: textModel.getLineCount(),\n\t\t\t\t\theightInPx: viewZoneHeight,\n\t\t\t\t\tdomNode: $('div.minScrollHeightViewZone'),\n\t\t\t\t});\n\t\t\t});\n\t\t}));\n\n\t\tthis._constructorDone.set(true, undefined); // TODO: remove and use correct initialization order\n\t}\n\n\tprivate readonly _constructorDone;\n\n\tprivate readonly _uiState;\n\n\tprivate readonly _previewTextModel;\n\n\tprivate readonly _indicatorCyclicDependencyCircuitBreaker;\n\n\tprotected readonly _indicator;\n\n\tprivate readonly _inlineEditsIsHovered;\n\n\tprivate readonly _gutterIndicatorOffset;\n\n\tprivate readonly _sideBySide;\n\n\tprotected readonly _deletion;\n\n\tprotected readonly _insertion;\n\n\tprivate readonly _inlineDiffViewState;\n\n\tprotected readonly _inlineCollapsedView;\n\n\tprotected readonly _customView;\n\n\tprotected readonly _inlineDiffView;\n\n\tprotected readonly _wordReplacementViews;\n\n\tprotected readonly _lineReplacementView;\n\n\tprivate getCacheId(model: IInlineEditModel) {\n\t\treturn model.inlineEdit.inlineCompletion.identity.id;\n\t}\n\n\tprivate determineView(model: IInlineEditModel, reader: IReader, diff: DetailedLineRangeMapping[], newText: StringText): InlineCompletionViewKind {\n\t\t// Check if we can use the previous view if it is the same InlineCompletion as previously shown\n\t\tconst inlineEdit = model.inlineEdit;\n\t\tconst canUseCache = this._previousView?.id === this.getCacheId(model);\n\t\tconst reconsiderViewEditorWidthChange = this._previousView?.editorWidth !== this._editorObs.layoutInfoWidth.read(reader) &&\n\t\t\t(\n\t\t\t\tthis._previousView?.view === InlineCompletionViewKind.SideBySide ||\n\t\t\t\tthis._previousView?.view === InlineCompletionViewKind.LineReplacement\n\t\t\t);\n\n\t\tif (canUseCache && !reconsiderViewEditorWidthChange) {\n\t\t\treturn this._previousView!.view;\n\t\t}\n\n\t\tif (model.displayLocation) {\n\t\t\treturn InlineCompletionViewKind.Custom;\n\t\t}\n\n\t\t// Determine the view based on the edit / diff\n\n\t\tconst numOriginalLines = inlineEdit.originalLineRange.length;\n\t\tconst numModifiedLines = inlineEdit.modifiedLineRange.length;\n\t\tconst inner = diff.flatMap(d => d.innerChanges ?? []);\n\t\tconst isSingleInnerEdit = inner.length === 1;\n\n\t\tif (!model.isInDiffEditor) {\n\t\t\tif (\n\t\t\t\tisSingleInnerEdit\n\t\t\t\t&& this._useCodeShifting.read(reader) !== 'never'\n\t\t\t\t&& isSingleLineInsertion(diff)\n\t\t\t) {\n\t\t\t\tif (isSingleLineInsertionAfterPosition(diff, inlineEdit.cursorPosition)) {\n\t\t\t\t\treturn InlineCompletionViewKind.InsertionInline;\n\t\t\t\t}\n\n\t\t\t\t// If we have a single line insertion before the cursor position, we do not want to move the cursor by inserting\n\t\t\t\t// the suggestion inline. Use a line replacement view instead. Do not use word replacement view.\n\t\t\t\treturn InlineCompletionViewKind.LineReplacement;\n\t\t\t}\n\n\t\t\tif (isDeletion(inner, inlineEdit, newText)) {\n\t\t\t\treturn InlineCompletionViewKind.Deletion;\n\t\t\t}\n\n\t\t\tif (isSingleMultiLineInsertion(diff) && this._useCodeShifting.read(reader) === 'always') {\n\t\t\t\treturn InlineCompletionViewKind.InsertionMultiLine;\n\t\t\t}\n\n\t\t\tconst allInnerChangesNotTooLong = inner.every(m => TextLength.ofRange(m.originalRange).columnCount < InlineEditsWordReplacementView.MAX_LENGTH && TextLength.ofRange(m.modifiedRange).columnCount < InlineEditsWordReplacementView.MAX_LENGTH);\n\t\t\tif (allInnerChangesNotTooLong && isSingleInnerEdit && numOriginalLines === 1 && numModifiedLines === 1) {\n\t\t\t\t// Do not show indentation changes with word replacement view\n\t\t\t\tconst modifiedText = inner.map(m => newText.getValueOfRange(m.modifiedRange));\n\t\t\t\tconst originalText = inner.map(m => model.inlineEdit.originalText.getValueOfRange(m.originalRange));\n\t\t\t\tif (!modifiedText.some(v => v.includes('\\t')) && !originalText.some(v => v.includes('\\t'))) {\n\t\t\t\t\t// Make sure there is no insertion, even if we grow them\n\t\t\t\t\tif (\n\t\t\t\t\t\t!inner.some(m => m.originalRange.isEmpty()) ||\n\t\t\t\t\t\t!growEditsUntilWhitespace(inner.map(m => new TextReplacement(m.originalRange, '')), inlineEdit.originalText).some(e => e.range.isEmpty() && TextLength.ofRange(e.range).columnCount < InlineEditsWordReplacementView.MAX_LENGTH)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn InlineCompletionViewKind.WordReplacements;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (numOriginalLines > 0 && numModifiedLines > 0) {\n\t\t\tif (numOriginalLines === 1 && numModifiedLines === 1 && !model.isInDiffEditor /* prefer side by side in diff editor */) {\n\t\t\t\treturn InlineCompletionViewKind.LineReplacement;\n\t\t\t}\n\n\t\t\tif (this._renderSideBySide.read(reader) !== 'never' && InlineEditsSideBySideView.fitsInsideViewport(this._editor, this._previewTextModel, inlineEdit, reader)) {\n\t\t\t\treturn InlineCompletionViewKind.SideBySide;\n\t\t\t}\n\n\t\t\treturn InlineCompletionViewKind.LineReplacement;\n\t\t}\n\n\t\tif (model.isInDiffEditor) {\n\t\t\tif (isDeletion(inner, inlineEdit, newText)) {\n\t\t\t\treturn InlineCompletionViewKind.Deletion;\n\t\t\t}\n\n\t\t\tif (isSingleMultiLineInsertion(diff) && this._useCodeShifting.read(reader) === 'always') {\n\t\t\t\treturn InlineCompletionViewKind.InsertionMultiLine;\n\t\t\t}\n\t\t}\n\n\t\treturn InlineCompletionViewKind.SideBySide;\n\t}\n\n\tprivate determineRenderState(model: IInlineEditModel, reader: IReader, diff: DetailedLineRangeMapping[], newText: StringText) {\n\t\tconst inlineEdit = model.inlineEdit;\n\n\t\tconst view = this.determineView(model, reader, diff, newText);\n\n\t\tthis._previousView = { id: this.getCacheId(model), view, editorWidth: this._editor.getLayoutInfo().width, timestamp: Date.now() };\n\n\t\tconst inner = diff.flatMap(d => d.innerChanges ?? []);\n\t\tconst textModel = this._editor.getModel()!;\n\t\tconst stringChanges = inner.map(m => ({\n\t\t\toriginalRange: m.originalRange,\n\t\t\tmodifiedRange: m.modifiedRange,\n\t\t\toriginal: textModel.getValueInRange(m.originalRange),\n\t\t\tmodified: newText.getValueOfRange(m.modifiedRange)\n\t\t}));\n\n\t\tconst cursorPosition = inlineEdit.cursorPosition;\n\t\tconst startsWithEOL = stringChanges[0].modified.startsWith(textModel.getEOL());\n\t\tconst viewData: InlineCompletionViewData = {\n\t\t\tcursorColumnDistance: inlineEdit.edit.replacements[0].range.getStartPosition().column - cursorPosition.column,\n\t\t\tcursorLineDistance: inlineEdit.lineEdit.lineRange.startLineNumber - cursorPosition.lineNumber + (startsWithEOL && inlineEdit.lineEdit.lineRange.startLineNumber >= cursorPosition.lineNumber ? 1 : 0),\n\t\t\tlineCountOriginal: inlineEdit.lineEdit.lineRange.length,\n\t\t\tlineCountModified: inlineEdit.lineEdit.newLines.length,\n\t\t\tcharacterCountOriginal: stringChanges.reduce((acc, r) => acc + r.original.length, 0),\n\t\t\tcharacterCountModified: stringChanges.reduce((acc, r) => acc + r.modified.length, 0),\n\t\t\tdisjointReplacements: stringChanges.length,\n\t\t\tsameShapeReplacements: stringChanges.every(r => r.original === stringChanges[0].original && r.modified === stringChanges[0].modified),\n\t\t};\n\n\t\tswitch (view) {\n\t\t\tcase InlineCompletionViewKind.InsertionInline: return { kind: InlineCompletionViewKind.InsertionInline as const, viewData };\n\t\t\tcase InlineCompletionViewKind.SideBySide: return { kind: InlineCompletionViewKind.SideBySide as const, viewData };\n\t\t\tcase InlineCompletionViewKind.Collapsed: return { kind: InlineCompletionViewKind.Collapsed as const, viewData };\n\t\t\tcase InlineCompletionViewKind.Custom: return { kind: InlineCompletionViewKind.Custom as const, displayLocation: model.displayLocation, viewData };\n\t\t}\n\n\t\tif (view === InlineCompletionViewKind.Deletion) {\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.Deletion as const,\n\t\t\t\toriginalRange: inlineEdit.originalLineRange,\n\t\t\t\tdeletions: inner.map(m => m.originalRange),\n\t\t\t\tviewData,\n\t\t\t};\n\t\t}\n\n\t\tif (view === InlineCompletionViewKind.InsertionMultiLine) {\n\t\t\tconst change = inner[0];\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.InsertionMultiLine as const,\n\t\t\t\tlineNumber: change.originalRange.startLineNumber,\n\t\t\t\tcolumn: change.originalRange.startColumn,\n\t\t\t\ttext: newText.getValueOfRange(change.modifiedRange),\n\t\t\t\tviewData,\n\t\t\t};\n\t\t}\n\n\t\tconst replacements = stringChanges.map(m => new TextReplacement(m.originalRange, m.modified));\n\t\tif (replacements.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (view === InlineCompletionViewKind.WordReplacements) {\n\t\t\tlet grownEdits = growEditsToEntireWord(replacements, inlineEdit.originalText);\n\n\t\t\tif (grownEdits.some(e => e.range.isEmpty())) {\n\t\t\t\tgrownEdits = growEditsUntilWhitespace(replacements, inlineEdit.originalText);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.WordReplacements as const,\n\t\t\t\treplacements: grownEdits,\n\t\t\t\tviewData,\n\t\t\t};\n\t\t}\n\n\t\tif (view === InlineCompletionViewKind.LineReplacement) {\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.LineReplacement as const,\n\t\t\t\toriginalRange: inlineEdit.originalLineRange,\n\t\t\t\tmodifiedRange: inlineEdit.modifiedLineRange,\n\t\t\t\tmodifiedLines: inlineEdit.modifiedLineRange.mapToLineArray(line => newText.getLineAt(line)),\n\t\t\t\treplacements: inner.map(m => ({ originalRange: m.originalRange, modifiedRange: m.modifiedRange })),\n\t\t\t\tviewData,\n\t\t\t};\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tprivate _viewHasBeenShownLongerThan(durationMs: number): boolean {\n\t\tconst viewCreationTime = this._previousView?.timestamp;\n\t\tif (!viewCreationTime) {\n\t\t\tthrow new BugIndicatingError('viewHasBeenShownLongThan called before a view has been shown');\n\t\t}\n\n\t\tconst currentTime = Date.now();\n\t\treturn (currentTime - viewCreationTime) >= durationMs;\n\t}\n}\n\nfunction isSingleLineInsertion(diff: DetailedLineRangeMapping[]) {\n\treturn diff.every(m => m.innerChanges!.every(r => isWordInsertion(r)));\n\n\tfunction isWordInsertion(r: RangeMapping) {\n\t\tif (!r.originalRange.isEmpty()) {\n\t\t\treturn false;\n\t\t}\n\t\tconst isInsertionWithinLine = r.modifiedRange.startLineNumber === r.modifiedRange.endLineNumber;\n\t\tif (!isInsertionWithinLine) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n}\n\nfunction isSingleLineInsertionAfterPosition(diff: DetailedLineRangeMapping[], position: Position | null) {\n\tif (!position) {\n\t\treturn false;\n\t}\n\n\tif (!isSingleLineInsertion(diff)) {\n\t\treturn false;\n\t}\n\n\tconst pos = position;\n\n\treturn diff.every(m => m.innerChanges!.every(r => isStableWordInsertion(r)));\n\n\tfunction isStableWordInsertion(r: RangeMapping) {\n\t\tconst insertPosition = r.originalRange.getStartPosition();\n\t\tif (pos.isBeforeOrEqual(insertPosition)) {\n\t\t\treturn true;\n\t\t}\n\t\tif (insertPosition.lineNumber < pos.lineNumber) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n}\n\nfunction isSingleMultiLineInsertion(diff: DetailedLineRangeMapping[]) {\n\tconst inner = diff.flatMap(d => d.innerChanges ?? []);\n\tif (inner.length !== 1) {\n\t\treturn false;\n\t}\n\n\tconst change = inner[0];\n\tif (!change.originalRange.isEmpty()) {\n\t\treturn false;\n\t}\n\n\tif (change.modifiedRange.startLineNumber === change.modifiedRange.endLineNumber) {\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nfunction isDeletion(inner: RangeMapping[], inlineEdit: InlineEditWithChanges, newText: StringText) {\n\tconst innerValues = inner.map(m => ({ original: inlineEdit.originalText.getValueOfRange(m.originalRange), modified: newText.getValueOfRange(m.modifiedRange) }));\n\treturn innerValues.every(({ original, modified }) => modified.trim() === '' && original.length > 0 && (original.length > modified.length || original.trim() !== ''));\n}\n\nfunction growEditsToEntireWord(replacements: TextReplacement[], originalText: AbstractText): TextReplacement[] {\n\treturn _growEdits(replacements, originalText, (char) => /^[a-zA-Z]$/.test(char));\n}\n\nfunction growEditsUntilWhitespace(replacements: TextReplacement[], originalText: AbstractText): TextReplacement[] {\n\treturn _growEdits(replacements, originalText, (char) => !(/^\\s$/.test(char)));\n}\n\nfunction _growEdits(replacements: TextReplacement[], originalText: AbstractText, fn: (c: string) => boolean): TextReplacement[] {\n\tconst result: TextReplacement[] = [];\n\n\treplacements.sort((a, b) => Range.compareRangesUsingStarts(a.range, b.range));\n\n\tfor (const edit of replacements) {\n\t\tlet startIndex = edit.range.startColumn - 1;\n\t\tlet endIndex = edit.range.endColumn - 2;\n\t\tlet prefix = '';\n\t\tlet suffix = '';\n\t\tconst startLineContent = originalText.getLineAt(edit.range.startLineNumber);\n\t\tconst endLineContent = originalText.getLineAt(edit.range.endLineNumber);\n\n\t\tif (isIncluded(startLineContent[startIndex])) {\n\t\t\t// grow to the left\n\t\t\twhile (isIncluded(startLineContent[startIndex - 1])) {\n\t\t\t\tprefix = startLineContent[startIndex - 1] + prefix;\n\t\t\t\tstartIndex--;\n\t\t\t}\n\t\t}\n\n\t\tif (isIncluded(endLineContent[endIndex]) || endIndex < startIndex) {\n\t\t\t// grow to the right\n\t\t\twhile (isIncluded(endLineContent[endIndex + 1])) {\n\t\t\t\tsuffix += endLineContent[endIndex + 1];\n\t\t\t\tendIndex++;\n\t\t\t}\n\t\t}\n\n\t\t// create new edit and merge together if they are touching\n\t\tlet newEdit = new TextReplacement(new Range(edit.range.startLineNumber, startIndex + 1, edit.range.endLineNumber, endIndex + 2), prefix + edit.text + suffix);\n\t\tif (result.length > 0 && Range.areIntersectingOrTouching(result[result.length - 1].range, newEdit.range)) {\n\t\t\tnewEdit = TextReplacement.joinReplacements([result.pop()!, newEdit], originalText);\n\t\t}\n\n\t\tresult.push(newEdit);\n\t}\n\n\tfunction isIncluded(c: string | undefined) {\n\t\tif (c === undefined) {\n\t\t\treturn false;\n\t\t}\n\t\treturn fn(c);\n\t}\n\n\treturn result;\n}\n\nfunction getGhostTextTopOffset(ghostTextIndicator: GhostTextIndicator, editor: ICodeEditor): number {\n\tconst replacements = ghostTextIndicator.model.inlineEdit.edit.replacements;\n\tif (replacements.length !== 1) {\n\t\treturn 0;\n\t}\n\n\tconst textModel = editor.getModel();\n\tif (!textModel) {\n\t\treturn 0;\n\t}\n\n\tconst EOL = textModel.getEOL();\n\tconst replacement = replacements[0];\n\tif (replacement.range.isEmpty() && replacement.text.startsWith(EOL)) {\n\t\tconst lineHeight = editor.getLineHeightForPosition(replacement.range.getStartPosition());\n\t\treturn countPrefixRepeats(replacement.text, EOL) * lineHeight;\n\t}\n\n\treturn 0;\n}\n\nfunction countPrefixRepeats(str: string, prefix: string): number {\n\tif (!prefix.length) {\n\t\treturn 0;\n\t}\n\tlet count = 0;\n\tlet i = 0;\n\twhile (str.startsWith(prefix, i)) {\n\t\tcount++;\n\t\ti += prefix.length;\n\t}\n\treturn count;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.ts","vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.ts"],"names":[],"mappings":"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","file":"inlineEditsView.js","sourceRoot":"file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src","sourcesContent":["/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { equalsIfDefined, itemEquals } from '../../../../../../base/common/equals.js';\nimport { BugIndicatingError } from '../../../../../../base/common/errors.js';\nimport { Event } from '../../../../../../base/common/event.js';\nimport { Disposable } from '../../../../../../base/common/lifecycle.js';\nimport { autorun, autorunWithStore, derived, derivedOpts, IObservable, IReader, ISettableObservable, mapObservableArrayCached, observableValue } from '../../../../../../base/common/observable.js';\nimport { IInstantiationService } from '../../../../../../platform/instantiation/common/instantiation.js';\nimport { ICodeEditor } from '../../../../../browser/editorBrowser.js';\nimport { ObservableCodeEditor, observableCodeEditor } from '../../../../../browser/observableCodeEditor.js';\nimport { EditorOption } from '../../../../../common/config/editorOptions.js';\nimport { LineRange } from '../../../../../common/core/ranges/lineRange.js';\nimport { Position } from '../../../../../common/core/position.js';\nimport { Range } from '../../../../../common/core/range.js';\nimport { TextReplacement } from '../../../../../common/core/edits/textEdit.js';\nimport { AbstractText, StringText } from '../../../../../common/core/text/abstractText.js';\nimport { TextLength } from '../../../../../common/core/text/textLength.js';\nimport { DetailedLineRangeMapping, lineRangeMappingFromRangeMappings, RangeMapping } from '../../../../../common/diff/rangeMapping.js';\nimport { TextModel } from '../../../../../common/model/textModel.js';\nimport { InlineEditsGutterIndicator } from './components/gutterIndicatorView.js';\nimport { InlineEditWithChanges } from './inlineEditWithChanges.js';\nimport { GhostTextIndicator, InlineEditHost, InlineEditModel } from './inlineEditsModel.js';\nimport { InlineEditsOnboardingExperience } from './inlineEditsNewUsers.js';\nimport { IInlineEditModel, InlineCompletionViewData, InlineCompletionViewKind, InlineEditTabAction } from './inlineEditsViewInterface.js';\nimport { InlineEditsCollapsedView } from './inlineEditsViews/inlineEditsCollapsedView.js';\nimport { InlineEditsCustomView } from './inlineEditsViews/inlineEditsCustomView.js';\nimport { InlineEditsDeletionView } from './inlineEditsViews/inlineEditsDeletionView.js';\nimport { InlineEditsInsertionView } from './inlineEditsViews/inlineEditsInsertionView.js';\nimport { InlineEditsLineReplacementView } from './inlineEditsViews/inlineEditsLineReplacementView.js';\nimport { InlineEditsSideBySideView } from './inlineEditsViews/inlineEditsSideBySideView.js';\nimport { InlineEditsWordReplacementView } from './inlineEditsViews/inlineEditsWordReplacementView.js';\nimport { IOriginalEditorInlineDiffViewState, OriginalEditorInlineDiffView } from './inlineEditsViews/originalEditorInlineDiffView.js';\nimport { applyEditToModifiedRangeMappings, createReindentEdit } from './utils/utils.js';\nimport './view.css';\nimport { $ } from '../../../../../../base/browser/dom.js';\n\n\nexport class InlineEditsView extends Disposable {\n\tprivate readonly _editorObs: ObservableCodeEditor;\n\n\tprivate readonly _useCodeShifting;\n\tprivate readonly _renderSideBySide;\n\n\tprivate readonly _tabAction;\n\n\tprivate _previousView: {\n\t\tid: string;\n\t\tview: ReturnType<typeof InlineEditsView.prototype.determineView>;\n\t\teditorWidth: number;\n\t\ttimestamp: number;\n\t} | undefined;\n\n\tconstructor(\n\t\tprivate readonly _editor: ICodeEditor,\n\t\tprivate readonly _host: IObservable<InlineEditHost | undefined>,\n\t\tprivate readonly _model: IObservable<InlineEditModel | undefined>,\n\t\tprivate readonly _ghostTextIndicator: IObservable<GhostTextIndicator | undefined>,\n\t\tprivate readonly _focusIsInMenu: ISettableObservable<boolean>,\n\t\t@IInstantiationService private readonly _instantiationService: IInstantiationService,\n\t) {\n\t\tsuper();\n\t\tthis._editorObs = observableCodeEditor(this._editor);\n\t\tthis._tabAction = derived<InlineEditTabAction>(reader => this._model.read(reader)?.tabAction.read(reader) ?? InlineEditTabAction.Inactive);\n\t\tthis._constructorDone = observableValue(this, false);\n\t\tthis._uiState = derived<{\n\t\t\tstate: ReturnType<typeof InlineEditsView.prototype.determineRenderState>;\n\t\t\tdiff: DetailedLineRangeMapping[];\n\t\t\tedit: InlineEditWithChanges;\n\t\t\tnewText: string;\n\t\t\tnewTextLineCount: number;\n\t\t\tisInDiffEditor: boolean;\n\t\t} | undefined>(this, reader => {\n\t\t\tconst model = this._model.read(reader);\n\t\t\tif (!model || !this._constructorDone.read(reader)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst inlineEdit = model.inlineEdit;\n\t\t\tlet mappings = RangeMapping.fromEdit(inlineEdit.edit);\n\t\t\tlet newText = inlineEdit.edit.apply(inlineEdit.originalText);\n\t\t\tlet diff = lineRangeMappingFromRangeMappings(mappings, inlineEdit.originalText, new StringText(newText));\n\n\t\t\tlet state = this.determineRenderState(model, reader, diff, new StringText(newText));\n\t\t\tif (!state) {\n\t\t\t\tmodel.abort(`unable to determine view: tried to render ${this._previousView?.view}`);\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tif (state.kind === InlineCompletionViewKind.SideBySide) {\n\t\t\t\tconst indentationAdjustmentEdit = createReindentEdit(newText, inlineEdit.modifiedLineRange, textModel.getOptions().tabSize);\n\t\t\t\tnewText = indentationAdjustmentEdit.applyToString(newText);\n\n\t\t\t\tmappings = applyEditToModifiedRangeMappings(mappings, indentationAdjustmentEdit);\n\t\t\t\tdiff = lineRangeMappingFromRangeMappings(mappings, inlineEdit.originalText, new StringText(newText));\n\t\t\t}\n\n\t\t\tthis._previewTextModel.setLanguage(this._editor.getModel()!.getLanguageId());\n\n\t\t\tconst previousNewText = this._previewTextModel.getValue();\n\t\t\tif (previousNewText !== newText) {\n\t\t\t\t// Only update the model if the text has changed to avoid flickering\n\t\t\t\tthis._previewTextModel.setValue(newText);\n\t\t\t}\n\n\t\t\tif (model.showCollapsed.read(reader) && !this._indicator.read(reader)?.isHoverVisible.read(reader)) {\n\t\t\t\tstate = { kind: InlineCompletionViewKind.Collapsed as const, viewData: state.viewData };\n\t\t\t}\n\n\t\t\tmodel.handleInlineEditShown(state.kind, state.viewData);\n\n\t\t\treturn {\n\t\t\t\tstate,\n\t\t\t\tdiff,\n\t\t\t\tedit: inlineEdit,\n\t\t\t\tnewText,\n\t\t\t\tnewTextLineCount: inlineEdit.modifiedLineRange.length,\n\t\t\t\tisInDiffEditor: model.isInDiffEditor,\n\t\t\t};\n\t\t});\n\t\tthis._previewTextModel = this._register(this._instantiationService.createInstance(\n\t\t\tTextModel,\n\t\t\t'',\n\t\t\tthis._editor.getModel()!.getLanguageId(),\n\t\t\t{ ...TextModel.DEFAULT_CREATION_OPTIONS, bracketPairColorizationOptions: { enabled: true, independentColorPoolPerBracketType: false } },\n\t\t\tnull\n\t\t));\n\t\tthis._indicatorCyclicDependencyCircuitBreaker = observableValue(this, false);\n\t\tthis._indicator = derived<InlineEditsGutterIndicator | undefined>(this, (reader) => {\n\t\t\tif (!this._indicatorCyclicDependencyCircuitBreaker.read(reader)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst indicatorDisplayRange = derivedOpts({ owner: this, equalsFn: equalsIfDefined(itemEquals()) }, reader => {\n\t\t\t\t/** @description indicatorDisplayRange */\n\t\t\t\tconst ghostTextIndicator = this._ghostTextIndicator.read(reader);\n\t\t\t\tif (ghostTextIndicator) {\n\t\t\t\t\treturn ghostTextIndicator.lineRange;\n\t\t\t\t}\n\n\t\t\t\tconst state = this._uiState.read(reader);\n\t\t\t\tif (!state) { return undefined; }\n\n\t\t\t\tif (state.state?.kind === 'custom') {\n\t\t\t\t\tconst range = state.state.displayLocation?.range;\n\t\t\t\t\tif (!range) {\n\t\t\t\t\t\tthrow new BugIndicatingError('custom view should have a range');\n\t\t\t\t\t}\n\t\t\t\t\treturn new LineRange(range.startLineNumber, range.endLineNumber);\n\t\t\t\t}\n\n\t\t\t\tif (state.state?.kind === 'insertionMultiLine') {\n\t\t\t\t\treturn this._insertion.originalLines.read(reader);\n\t\t\t\t}\n\n\t\t\t\treturn state.edit.displayRange;\n\t\t\t});\n\n\t\t\tconst modelWithGhostTextSupport = derived<InlineEditModel | undefined>(this, reader => {\n\t\t\t\t/** @description modelWithGhostTextSupport */\n\t\t\t\tconst model = this._model.read(reader);\n\t\t\t\tif (model) {\n\t\t\t\t\treturn model;\n\t\t\t\t}\n\n\t\t\t\tconst ghostTextIndicator = this._ghostTextIndicator.read(reader);\n\t\t\t\tif (ghostTextIndicator) {\n\t\t\t\t\treturn ghostTextIndicator.model;\n\t\t\t\t}\n\n\t\t\t\treturn model;\n\t\t\t});\n\n\t\t\treturn reader.store.add(this._instantiationService.createInstance(\n\t\t\t\tInlineEditsGutterIndicator,\n\t\t\t\tthis._editorObs,\n\t\t\t\tindicatorDisplayRange,\n\t\t\t\tthis._gutterIndicatorOffset,\n\t\t\t\tmodelWithGhostTextSupport,\n\t\t\t\tthis._inlineEditsIsHovered,\n\t\t\t\tthis._focusIsInMenu,\n\t\t\t));\n\t\t});\n\t\tthis._inlineEditsIsHovered = derived(this, reader => {\n\t\t\treturn this._sideBySide.isHovered.read(reader)\n\t\t\t\t|| this._wordReplacementViews.read(reader).some(v => v.isHovered.read(reader))\n\t\t\t\t|| this._deletion.isHovered.read(reader)\n\t\t\t\t|| this._inlineDiffView.isHovered.read(reader)\n\t\t\t\t|| this._lineReplacementView.isHovered.read(reader)\n\t\t\t\t|| this._insertion.isHovered.read(reader)\n\t\t\t\t|| this._customView.isHovered.read(reader);\n\t\t});\n\t\tthis._gutterIndicatorOffset = derived<number>(this, reader => {\n\t\t\t// TODO: have a better way to tell the gutter indicator view where the edit is inside a viewzone\n\t\t\tif (this._uiState.read(reader)?.state?.kind === 'insertionMultiLine') {\n\t\t\t\treturn this._insertion.startLineOffset.read(reader);\n\t\t\t}\n\n\t\t\tconst ghostTextIndicator = this._ghostTextIndicator.read(reader);\n\t\t\tif (ghostTextIndicator) {\n\t\t\t\treturn getGhostTextTopOffset(ghostTextIndicator, this._editor);\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t});\n\t\tthis._sideBySide = this._register(this._instantiationService.createInstance(InlineEditsSideBySideView,\n\t\t\tthis._editor,\n\t\t\tthis._model.map(m => m?.inlineEdit),\n\t\t\tthis._previewTextModel,\n\t\t\tthis._uiState.map(s => s && s.state?.kind === InlineCompletionViewKind.SideBySide ? ({\n\t\t\t\tnewTextLineCount: s.newTextLineCount,\n\t\t\t\tisInDiffEditor: s.isInDiffEditor,\n\t\t\t}) : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\t\tthis._deletion = this._register(this._instantiationService.createInstance(InlineEditsDeletionView,\n\t\t\tthis._editor,\n\t\t\tthis._model.map(m => m?.inlineEdit),\n\t\t\tthis._uiState.map(s => s && s.state?.kind === InlineCompletionViewKind.Deletion ? ({\n\t\t\t\toriginalRange: s.state.originalRange,\n\t\t\t\tdeletions: s.state.deletions,\n\t\t\t\tinDiffEditor: s.isInDiffEditor,\n\t\t\t}) : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\t\tthis._insertion = this._register(this._instantiationService.createInstance(InlineEditsInsertionView,\n\t\t\tthis._editor,\n\t\t\tthis._uiState.map(s => s && s.state?.kind === InlineCompletionViewKind.InsertionMultiLine ? ({\n\t\t\t\tlineNumber: s.state.lineNumber,\n\t\t\t\tstartColumn: s.state.column,\n\t\t\t\ttext: s.state.text,\n\t\t\t\tinDiffEditor: s.isInDiffEditor,\n\t\t\t}) : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\t\tthis._inlineDiffViewState = derived<IOriginalEditorInlineDiffViewState | undefined>(this, reader => {\n\t\t\tconst e = this._uiState.read(reader);\n\t\t\tif (!e || !e.state) { return undefined; }\n\t\t\tif (e.state.kind === 'wordReplacements' || e.state.kind === 'insertionMultiLine' || e.state.kind === 'collapsed' || e.state.kind === 'custom') {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tmodifiedText: new StringText(e.newText),\n\t\t\t\tdiff: e.diff,\n\t\t\t\tmode: e.state.kind,\n\t\t\t\tmodifiedCodeEditor: this._sideBySide.previewEditor,\n\t\t\t\tisInDiffEditor: e.isInDiffEditor,\n\t\t\t};\n\t\t});\n\t\tthis._inlineCollapsedView = this._register(this._instantiationService.createInstance(InlineEditsCollapsedView,\n\t\t\tthis._editor,\n\t\t\tthis._model.map((m, reader) => this._uiState.read(reader)?.state?.kind === 'collapsed' ? m?.inlineEdit : undefined)\n\t\t));\n\t\tthis._customView = this._register(this._instantiationService.createInstance(InlineEditsCustomView,\n\t\t\tthis._editor,\n\t\t\tthis._model.map((m, reader) => this._uiState.read(reader)?.state?.kind === 'custom' ? m?.displayLocation : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\t\tthis._inlineDiffView = this._register(new OriginalEditorInlineDiffView(this._editor, this._inlineDiffViewState, this._previewTextModel));\n\t\tthis._wordReplacementViews = mapObservableArrayCached(this, this._uiState.map(s => s?.state?.kind === 'wordReplacements' ? s.state.replacements : []), (e, store) => {\n\t\t\treturn store.add(this._instantiationService.createInstance(InlineEditsWordReplacementView, this._editorObs, e, this._tabAction));\n\t\t});\n\t\tthis._lineReplacementView = this._register(this._instantiationService.createInstance(InlineEditsLineReplacementView,\n\t\t\tthis._editorObs,\n\t\t\tthis._uiState.map(s => s?.state?.kind === InlineCompletionViewKind.LineReplacement ? ({\n\t\t\t\toriginalRange: s.state.originalRange,\n\t\t\t\tmodifiedRange: s.state.modifiedRange,\n\t\t\t\tmodifiedLines: s.state.modifiedLines,\n\t\t\t\treplacements: s.state.replacements,\n\t\t\t}) : undefined),\n\t\t\tthis._uiState.map(s => s?.isInDiffEditor ?? false),\n\t\t\tthis._tabAction,\n\t\t));\n\n\t\tthis._useCodeShifting = this._editorObs.getOption(EditorOption.inlineSuggest).map(s => s.edits.allowCodeShifting);\n\t\tthis._renderSideBySide = this._editorObs.getOption(EditorOption.inlineSuggest).map(s => s.edits.renderSideBySide);\n\n\t\tthis._register(autorunWithStore((reader, store) => {\n\t\t\tconst model = this._model.read(reader);\n\t\t\tif (!model) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tstore.add(\n\t\t\t\tEvent.any(\n\t\t\t\t\tthis._sideBySide.onDidClick,\n\t\t\t\t\tthis._deletion.onDidClick,\n\t\t\t\t\tthis._lineReplacementView.onDidClick,\n\t\t\t\t\tthis._insertion.onDidClick,\n\t\t\t\t\t...this._wordReplacementViews.read(reader).map(w => w.onDidClick),\n\t\t\t\t\tthis._inlineDiffView.onDidClick,\n\t\t\t\t\tthis._customView.onDidClick,\n\t\t\t\t)(e => {\n\t\t\t\t\tif (this._viewHasBeenShownLongerThan(350)) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tmodel.accept();\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t);\n\t\t}));\n\n\t\tthis._indicator.recomputeInitiallyAndOnChange(this._store);\n\t\tthis._wordReplacementViews.recomputeInitiallyAndOnChange(this._store);\n\n\t\tthis._indicatorCyclicDependencyCircuitBreaker.set(true, undefined);\n\n\t\tthis._register(this._instantiationService.createInstance(InlineEditsOnboardingExperience, this._host, this._model, this._indicator, this._inlineCollapsedView));\n\n\t\tconst minEditorScrollHeight = derived(this, reader => {\n\t\t\treturn Math.max(\n\t\t\t\t...this._wordReplacementViews.read(reader).map(v => v.minEditorScrollHeight.read(reader)),\n\t\t\t\tthis._lineReplacementView.minEditorScrollHeight.read(reader),\n\t\t\t\tthis._customView.minEditorScrollHeight.read(reader)\n\t\t\t);\n\t\t}).recomputeInitiallyAndOnChange(this._store);\n\n\t\tconst textModel = this._editor.getModel()!;\n\n\t\tlet viewZoneId: string | undefined;\n\t\tthis._register(autorun(reader => {\n\t\t\tconst minScrollHeight = minEditorScrollHeight.read(reader);\n\t\t\tthis._editor.changeViewZones(accessor => {\n\t\t\t\tconst scrollHeight = this._editor.getScrollHeight();\n\t\t\t\tconst viewZoneHeight = minScrollHeight - scrollHeight + 1 /* Add 1px so there is a small gap */;\n\n\t\t\t\tif (viewZoneHeight !== 0 && viewZoneId) {\n\t\t\t\t\taccessor.removeZone(viewZoneId);\n\t\t\t\t\tviewZoneId = undefined;\n\t\t\t\t}\n\n\t\t\t\tif (viewZoneHeight <= 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tviewZoneId = accessor.addZone({\n\t\t\t\t\tafterLineNumber: textModel.getLineCount(),\n\t\t\t\t\theightInPx: viewZoneHeight,\n\t\t\t\t\tdomNode: $('div.minScrollHeightViewZone'),\n\t\t\t\t});\n\t\t\t});\n\t\t}));\n\n\t\tthis._constructorDone.set(true, undefined); // TODO: remove and use correct initialization order\n\t}\n\n\tprivate readonly _constructorDone;\n\n\tprivate readonly _uiState;\n\n\tprivate readonly _previewTextModel;\n\n\tprivate readonly _indicatorCyclicDependencyCircuitBreaker;\n\n\tprotected readonly _indicator;\n\n\tprivate readonly _inlineEditsIsHovered;\n\n\tprivate readonly _gutterIndicatorOffset;\n\n\tprivate readonly _sideBySide;\n\n\tprotected readonly _deletion;\n\n\tprotected readonly _insertion;\n\n\tprivate readonly _inlineDiffViewState;\n\n\tprotected readonly _inlineCollapsedView;\n\n\tprotected readonly _customView;\n\n\tprotected readonly _inlineDiffView;\n\n\tprotected readonly _wordReplacementViews;\n\n\tprotected readonly _lineReplacementView;\n\n\tprivate getCacheId(model: IInlineEditModel) {\n\t\treturn model.inlineEdit.inlineCompletion.identity.id;\n\t}\n\n\tprivate determineView(model: IInlineEditModel, reader: IReader, diff: DetailedLineRangeMapping[], newText: StringText): InlineCompletionViewKind {\n\t\t// Check if we can use the previous view if it is the same InlineCompletion as previously shown\n\t\tconst inlineEdit = model.inlineEdit;\n\t\tconst canUseCache = this._previousView?.id === this.getCacheId(model);\n\t\tconst reconsiderViewEditorWidthChange = this._previousView?.editorWidth !== this._editorObs.layoutInfoWidth.read(reader) &&\n\t\t\t(\n\t\t\t\tthis._previousView?.view === InlineCompletionViewKind.SideBySide ||\n\t\t\t\tthis._previousView?.view === InlineCompletionViewKind.LineReplacement\n\t\t\t);\n\n\t\tif (canUseCache && !reconsiderViewEditorWidthChange) {\n\t\t\treturn this._previousView!.view;\n\t\t}\n\n\t\tif (model.displayLocation) {\n\t\t\treturn InlineCompletionViewKind.Custom;\n\t\t}\n\n\t\t// Determine the view based on the edit / diff\n\n\t\tconst numOriginalLines = inlineEdit.originalLineRange.length;\n\t\tconst numModifiedLines = inlineEdit.modifiedLineRange.length;\n\t\tconst inner = diff.flatMap(d => d.innerChanges ?? []);\n\t\tconst isSingleInnerEdit = inner.length === 1;\n\n\t\tif (!model.isInDiffEditor) {\n\t\t\tif (\n\t\t\t\tisSingleInnerEdit\n\t\t\t\t&& this._useCodeShifting.read(reader) !== 'never'\n\t\t\t\t&& isSingleLineInsertion(diff)\n\t\t\t) {\n\t\t\t\tif (isSingleLineInsertionAfterPosition(diff, inlineEdit.cursorPosition)) {\n\t\t\t\t\treturn InlineCompletionViewKind.InsertionInline;\n\t\t\t\t}\n\n\t\t\t\t// If we have a single line insertion before the cursor position, we do not want to move the cursor by inserting\n\t\t\t\t// the suggestion inline. Use a line replacement view instead. Do not use word replacement view.\n\t\t\t\treturn InlineCompletionViewKind.LineReplacement;\n\t\t\t}\n\n\t\t\tif (isDeletion(inner, inlineEdit, newText)) {\n\t\t\t\treturn InlineCompletionViewKind.Deletion;\n\t\t\t}\n\n\t\t\tif (isSingleMultiLineInsertion(diff) && this._useCodeShifting.read(reader) === 'always') {\n\t\t\t\treturn InlineCompletionViewKind.InsertionMultiLine;\n\t\t\t}\n\n\t\t\tconst allInnerChangesNotTooLong = inner.every(m => TextLength.ofRange(m.originalRange).columnCount < InlineEditsWordReplacementView.MAX_LENGTH && TextLength.ofRange(m.modifiedRange).columnCount < InlineEditsWordReplacementView.MAX_LENGTH);\n\t\t\tif (allInnerChangesNotTooLong && isSingleInnerEdit && numOriginalLines === 1 && numModifiedLines === 1) {\n\t\t\t\t// Do not show indentation changes with word replacement view\n\t\t\t\tconst modifiedText = inner.map(m => newText.getValueOfRange(m.modifiedRange));\n\t\t\t\tconst originalText = inner.map(m => model.inlineEdit.originalText.getValueOfRange(m.originalRange));\n\t\t\t\tif (!modifiedText.some(v => v.includes('\\t')) && !originalText.some(v => v.includes('\\t'))) {\n\t\t\t\t\t// Make sure there is no insertion, even if we grow them\n\t\t\t\t\tif (\n\t\t\t\t\t\t!inner.some(m => m.originalRange.isEmpty()) ||\n\t\t\t\t\t\t!growEditsUntilWhitespace(inner.map(m => new TextReplacement(m.originalRange, '')), inlineEdit.originalText).some(e => e.range.isEmpty() && TextLength.ofRange(e.range).columnCount < InlineEditsWordReplacementView.MAX_LENGTH)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn InlineCompletionViewKind.WordReplacements;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (numOriginalLines > 0 && numModifiedLines > 0) {\n\t\t\tif (numOriginalLines === 1 && numModifiedLines === 1 && !model.isInDiffEditor /* prefer side by side in diff editor */) {\n\t\t\t\treturn InlineCompletionViewKind.LineReplacement;\n\t\t\t}\n\n\t\t\tif (this._renderSideBySide.read(reader) !== 'never' && InlineEditsSideBySideView.fitsInsideViewport(this._editor, this._previewTextModel, inlineEdit, reader)) {\n\t\t\t\treturn InlineCompletionViewKind.SideBySide;\n\t\t\t}\n\n\t\t\treturn InlineCompletionViewKind.LineReplacement;\n\t\t}\n\n\t\tif (model.isInDiffEditor) {\n\t\t\tif (isDeletion(inner, inlineEdit, newText)) {\n\t\t\t\treturn InlineCompletionViewKind.Deletion;\n\t\t\t}\n\n\t\t\tif (isSingleMultiLineInsertion(diff) && this._useCodeShifting.read(reader) === 'always') {\n\t\t\t\treturn InlineCompletionViewKind.InsertionMultiLine;\n\t\t\t}\n\t\t}\n\n\t\treturn InlineCompletionViewKind.SideBySide;\n\t}\n\n\tprivate determineRenderState(model: IInlineEditModel, reader: IReader, diff: DetailedLineRangeMapping[], newText: StringText) {\n\t\tconst inlineEdit = model.inlineEdit;\n\n\t\tlet view = this.determineView(model, reader, diff, newText);\n\n\t\tif (this._willRenderAboveCursor(reader, inlineEdit, view)) {\n\t\t\tswitch (view) {\n\t\t\t\tcase InlineCompletionViewKind.LineReplacement:\n\t\t\t\tcase InlineCompletionViewKind.WordReplacements:\n\t\t\t\t\tview = InlineCompletionViewKind.SideBySide;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tthis._previousView = { id: this.getCacheId(model), view, editorWidth: this._editor.getLayoutInfo().width, timestamp: Date.now() };\n\n\t\tconst inner = diff.flatMap(d => d.innerChanges ?? []);\n\t\tconst textModel = this._editor.getModel()!;\n\t\tconst stringChanges = inner.map(m => ({\n\t\t\toriginalRange: m.originalRange,\n\t\t\tmodifiedRange: m.modifiedRange,\n\t\t\toriginal: textModel.getValueInRange(m.originalRange),\n\t\t\tmodified: newText.getValueOfRange(m.modifiedRange)\n\t\t}));\n\n\t\tconst cursorPosition = inlineEdit.cursorPosition;\n\t\tconst startsWithEOL = stringChanges[0].modified.startsWith(textModel.getEOL());\n\t\tconst viewData: InlineCompletionViewData = {\n\t\t\tcursorColumnDistance: inlineEdit.edit.replacements[0].range.getStartPosition().column - cursorPosition.column,\n\t\t\tcursorLineDistance: inlineEdit.lineEdit.lineRange.startLineNumber - cursorPosition.lineNumber + (startsWithEOL && inlineEdit.lineEdit.lineRange.startLineNumber >= cursorPosition.lineNumber ? 1 : 0),\n\t\t\tlineCountOriginal: inlineEdit.lineEdit.lineRange.length,\n\t\t\tlineCountModified: inlineEdit.lineEdit.newLines.length,\n\t\t\tcharacterCountOriginal: stringChanges.reduce((acc, r) => acc + r.original.length, 0),\n\t\t\tcharacterCountModified: stringChanges.reduce((acc, r) => acc + r.modified.length, 0),\n\t\t\tdisjointReplacements: stringChanges.length,\n\t\t\tsameShapeReplacements: stringChanges.every(r => r.original === stringChanges[0].original && r.modified === stringChanges[0].modified),\n\t\t};\n\n\t\tswitch (view) {\n\t\t\tcase InlineCompletionViewKind.InsertionInline: return { kind: InlineCompletionViewKind.InsertionInline as const, viewData };\n\t\t\tcase InlineCompletionViewKind.SideBySide: return { kind: InlineCompletionViewKind.SideBySide as const, viewData };\n\t\t\tcase InlineCompletionViewKind.Collapsed: return { kind: InlineCompletionViewKind.Collapsed as const, viewData };\n\t\t\tcase InlineCompletionViewKind.Custom: return { kind: InlineCompletionViewKind.Custom as const, displayLocation: model.displayLocation, viewData };\n\t\t}\n\n\t\tif (view === InlineCompletionViewKind.Deletion) {\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.Deletion as const,\n\t\t\t\toriginalRange: inlineEdit.originalLineRange,\n\t\t\t\tdeletions: inner.map(m => m.originalRange),\n\t\t\t\tviewData,\n\t\t\t};\n\t\t}\n\n\t\tif (view === InlineCompletionViewKind.InsertionMultiLine) {\n\t\t\tconst change = inner[0];\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.InsertionMultiLine as const,\n\t\t\t\tlineNumber: change.originalRange.startLineNumber,\n\t\t\t\tcolumn: change.originalRange.startColumn,\n\t\t\t\ttext: newText.getValueOfRange(change.modifiedRange),\n\t\t\t\tviewData,\n\t\t\t};\n\t\t}\n\n\t\tconst replacements = stringChanges.map(m => new TextReplacement(m.originalRange, m.modified));\n\t\tif (replacements.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (view === InlineCompletionViewKind.WordReplacements) {\n\t\t\tlet grownEdits = growEditsToEntireWord(replacements, inlineEdit.originalText);\n\n\t\t\tif (grownEdits.some(e => e.range.isEmpty())) {\n\t\t\t\tgrownEdits = growEditsUntilWhitespace(replacements, inlineEdit.originalText);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.WordReplacements as const,\n\t\t\t\treplacements: grownEdits,\n\t\t\t\tviewData,\n\t\t\t};\n\t\t}\n\n\t\tif (view === InlineCompletionViewKind.LineReplacement) {\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.LineReplacement as const,\n\t\t\t\toriginalRange: inlineEdit.originalLineRange,\n\t\t\t\tmodifiedRange: inlineEdit.modifiedLineRange,\n\t\t\t\tmodifiedLines: inlineEdit.modifiedLineRange.mapToLineArray(line => newText.getLineAt(line)),\n\t\t\t\treplacements: inner.map(m => ({ originalRange: m.originalRange, modifiedRange: m.modifiedRange })),\n\t\t\t\tviewData,\n\t\t\t};\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tprivate _willRenderAboveCursor(reader: IReader, inlineEdit: InlineEditWithChanges, view: InlineCompletionViewKind): boolean {\n\t\tconst useCodeShifting = this._useCodeShifting.read(reader);\n\t\tif (useCodeShifting === 'always') {\n\t\t\treturn false;\n\t\t}\n\n\t\tfor (const cursorPosition of inlineEdit.multiCursorPositions) {\n\t\t\tif (view === InlineCompletionViewKind.WordReplacements &&\n\t\t\t\tcursorPosition.lineNumber === inlineEdit.originalLineRange.startLineNumber + 1\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (view === InlineCompletionViewKind.LineReplacement &&\n\t\t\t\tcursorPosition.lineNumber >= inlineEdit.originalLineRange.endLineNumberExclusive &&\n\t\t\t\tcursorPosition.lineNumber < inlineEdit.modifiedLineRange.endLineNumberExclusive + inlineEdit.modifiedLineRange.length\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tprivate _viewHasBeenShownLongerThan(durationMs: number): boolean {\n\t\tconst viewCreationTime = this._previousView?.timestamp;\n\t\tif (!viewCreationTime) {\n\t\t\tthrow new BugIndicatingError('viewHasBeenShownLongThan called before a view has been shown');\n\t\t}\n\n\t\tconst currentTime = Date.now();\n\t\treturn (currentTime - viewCreationTime) >= durationMs;\n\t}\n}\n\nfunction isSingleLineInsertion(diff: DetailedLineRangeMapping[]) {\n\treturn diff.every(m => m.innerChanges!.every(r => isWordInsertion(r)));\n\n\tfunction isWordInsertion(r: RangeMapping) {\n\t\tif (!r.originalRange.isEmpty()) {\n\t\t\treturn false;\n\t\t}\n\t\tconst isInsertionWithinLine = r.modifiedRange.startLineNumber === r.modifiedRange.endLineNumber;\n\t\tif (!isInsertionWithinLine) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n}\n\nfunction isSingleLineInsertionAfterPosition(diff: DetailedLineRangeMapping[], position: Position | null) {\n\tif (!position) {\n\t\treturn false;\n\t}\n\n\tif (!isSingleLineInsertion(diff)) {\n\t\treturn false;\n\t}\n\n\tconst pos = position;\n\n\treturn diff.every(m => m.innerChanges!.every(r => isStableWordInsertion(r)));\n\n\tfunction isStableWordInsertion(r: RangeMapping) {\n\t\tconst insertPosition = r.originalRange.getStartPosition();\n\t\tif (pos.isBeforeOrEqual(insertPosition)) {\n\t\t\treturn true;\n\t\t}\n\t\tif (insertPosition.lineNumber < pos.lineNumber) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n}\n\nfunction isSingleMultiLineInsertion(diff: DetailedLineRangeMapping[]) {\n\tconst inner = diff.flatMap(d => d.innerChanges ?? []);\n\tif (inner.length !== 1) {\n\t\treturn false;\n\t}\n\n\tconst change = inner[0];\n\tif (!change.originalRange.isEmpty()) {\n\t\treturn false;\n\t}\n\n\tif (change.modifiedRange.startLineNumber === change.modifiedRange.endLineNumber) {\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nfunction isDeletion(inner: RangeMapping[], inlineEdit: InlineEditWithChanges, newText: StringText) {\n\tconst innerValues = inner.map(m => ({ original: inlineEdit.originalText.getValueOfRange(m.originalRange), modified: newText.getValueOfRange(m.modifiedRange) }));\n\treturn innerValues.every(({ original, modified }) => modified.trim() === '' && original.length > 0 && (original.length > modified.length || original.trim() !== ''));\n}\n\nfunction growEditsToEntireWord(replacements: TextReplacement[], originalText: AbstractText): TextReplacement[] {\n\treturn _growEdits(replacements, originalText, (char) => /^[a-zA-Z]$/.test(char));\n}\n\nfunction growEditsUntilWhitespace(replacements: TextReplacement[], originalText: AbstractText): TextReplacement[] {\n\treturn _growEdits(replacements, originalText, (char) => !(/^\\s$/.test(char)));\n}\n\nfunction _growEdits(replacements: TextReplacement[], originalText: AbstractText, fn: (c: string) => boolean): TextReplacement[] {\n\tconst result: TextReplacement[] = [];\n\n\treplacements.sort((a, b) => Range.compareRangesUsingStarts(a.range, b.range));\n\n\tfor (const edit of replacements) {\n\t\tlet startIndex = edit.range.startColumn - 1;\n\t\tlet endIndex = edit.range.endColumn - 2;\n\t\tlet prefix = '';\n\t\tlet suffix = '';\n\t\tconst startLineContent = originalText.getLineAt(edit.range.startLineNumber);\n\t\tconst endLineContent = originalText.getLineAt(edit.range.endLineNumber);\n\n\t\tif (isIncluded(startLineContent[startIndex])) {\n\t\t\t// grow to the left\n\t\t\twhile (isIncluded(startLineContent[startIndex - 1])) {\n\t\t\t\tprefix = startLineContent[startIndex - 1] + prefix;\n\t\t\t\tstartIndex--;\n\t\t\t}\n\t\t}\n\n\t\tif (isIncluded(endLineContent[endIndex]) || endIndex < startIndex) {\n\t\t\t// grow to the right\n\t\t\twhile (isIncluded(endLineContent[endIndex + 1])) {\n\t\t\t\tsuffix += endLineContent[endIndex + 1];\n\t\t\t\tendIndex++;\n\t\t\t}\n\t\t}\n\n\t\t// create new edit and merge together if they are touching\n\t\tlet newEdit = new TextReplacement(new Range(edit.range.startLineNumber, startIndex + 1, edit.range.endLineNumber, endIndex + 2), prefix + edit.text + suffix);\n\t\tif (result.length > 0 && Range.areIntersectingOrTouching(result[result.length - 1].range, newEdit.range)) {\n\t\t\tnewEdit = TextReplacement.joinReplacements([result.pop()!, newEdit], originalText);\n\t\t}\n\n\t\tresult.push(newEdit);\n\t}\n\n\tfunction isIncluded(c: string | undefined) {\n\t\tif (c === undefined) {\n\t\t\treturn false;\n\t\t}\n\t\treturn fn(c);\n\t}\n\n\treturn result;\n}\n\nfunction getGhostTextTopOffset(ghostTextIndicator: GhostTextIndicator, editor: ICodeEditor): number {\n\tconst replacements = ghostTextIndicator.model.inlineEdit.edit.replacements;\n\tif (replacements.length !== 1) {\n\t\treturn 0;\n\t}\n\n\tconst textModel = editor.getModel();\n\tif (!textModel) {\n\t\treturn 0;\n\t}\n\n\tconst EOL = textModel.getEOL();\n\tconst replacement = replacements[0];\n\tif (replacement.range.isEmpty() && replacement.text.startsWith(EOL)) {\n\t\tconst lineHeight = editor.getLineHeightForPosition(replacement.range.getStartPosition());\n\t\treturn countPrefixRepeats(replacement.text, EOL) * lineHeight;\n\t}\n\n\treturn 0;\n}\n\nfunction countPrefixRepeats(str: string, prefix: string): number {\n\tif (!prefix.length) {\n\t\treturn 0;\n\t}\n\tlet count = 0;\n\tlet i = 0;\n\twhile (str.startsWith(prefix, i)) {\n\t\tcount++;\n\t\ti += prefix.length;\n\t}\n\treturn count;\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { equalsIfDefined, itemEquals } from '../../../../../../base/common/equals.js';\nimport { BugIndicatingError } from '../../../../../../base/common/errors.js';\nimport { Event } from '../../../../../../base/common/event.js';\nimport { Disposable } from '../../../../../../base/common/lifecycle.js';\nimport { autorun, autorunWithStore, derived, derivedOpts, IObservable, IReader, ISettableObservable, mapObservableArrayCached, observableValue } from '../../../../../../base/common/observable.js';\nimport { IInstantiationService } from '../../../../../../platform/instantiation/common/instantiation.js';\nimport { ICodeEditor } from '../../../../../browser/editorBrowser.js';\nimport { ObservableCodeEditor, observableCodeEditor } from '../../../../../browser/observableCodeEditor.js';\nimport { EditorOption } from '../../../../../common/config/editorOptions.js';\nimport { LineRange } from '../../../../../common/core/ranges/lineRange.js';\nimport { Position } from '../../../../../common/core/position.js';\nimport { Range } from '../../../../../common/core/range.js';\nimport { TextReplacement } from '../../../../../common/core/edits/textEdit.js';\nimport { AbstractText, StringText } from '../../../../../common/core/text/abstractText.js';\nimport { TextLength } from '../../../../../common/core/text/textLength.js';\nimport { DetailedLineRangeMapping, lineRangeMappingFromRangeMappings, RangeMapping } from '../../../../../common/diff/rangeMapping.js';\nimport { TextModel } from '../../../../../common/model/textModel.js';\nimport { InlineEditsGutterIndicator } from './components/gutterIndicatorView.js';\nimport { InlineEditWithChanges } from './inlineEditWithChanges.js';\nimport { GhostTextIndicator, InlineEditHost, InlineEditModel } from './inlineEditsModel.js';\nimport { InlineEditsOnboardingExperience } from './inlineEditsNewUsers.js';\nimport { IInlineEditModel, InlineCompletionViewData, InlineCompletionViewKind, InlineEditTabAction } from './inlineEditsViewInterface.js';\nimport { InlineEditsCollapsedView } from './inlineEditsViews/inlineEditsCollapsedView.js';\nimport { InlineEditsCustomView } from './inlineEditsViews/inlineEditsCustomView.js';\nimport { InlineEditsDeletionView } from './inlineEditsViews/inlineEditsDeletionView.js';\nimport { InlineEditsInsertionView } from './inlineEditsViews/inlineEditsInsertionView.js';\nimport { InlineEditsLineReplacementView } from './inlineEditsViews/inlineEditsLineReplacementView.js';\nimport { InlineEditsSideBySideView } from './inlineEditsViews/inlineEditsSideBySideView.js';\nimport { InlineEditsWordReplacementView } from './inlineEditsViews/inlineEditsWordReplacementView.js';\nimport { IOriginalEditorInlineDiffViewState, OriginalEditorInlineDiffView } from './inlineEditsViews/originalEditorInlineDiffView.js';\nimport { applyEditToModifiedRangeMappings, createReindentEdit } from './utils/utils.js';\nimport './view.css';\nimport { $ } from '../../../../../../base/browser/dom.js';\n\n\nexport class InlineEditsView extends Disposable {\n\tprivate readonly _editorObs: ObservableCodeEditor;\n\n\tprivate readonly _useCodeShifting;\n\tprivate readonly _renderSideBySide;\n\n\tprivate readonly _tabAction;\n\n\tprivate _previousView: {\n\t\tid: string;\n\t\tview: ReturnType<typeof InlineEditsView.prototype.determineView>;\n\t\teditorWidth: number;\n\t\ttimestamp: number;\n\t} | undefined;\n\n\tconstructor(\n\t\tprivate readonly _editor: ICodeEditor,\n\t\tprivate readonly _host: IObservable<InlineEditHost | undefined>,\n\t\tprivate readonly _model: IObservable<InlineEditModel | undefined>,\n\t\tprivate readonly _ghostTextIndicator: IObservable<GhostTextIndicator | undefined>,\n\t\tprivate readonly _focusIsInMenu: ISettableObservable<boolean>,\n\t\t@IInstantiationService private readonly _instantiationService: IInstantiationService,\n\t) {\n\t\tsuper();\n\t\tthis._editorObs = observableCodeEditor(this._editor);\n\t\tthis._tabAction = derived<InlineEditTabAction>(reader => this._model.read(reader)?.tabAction.read(reader) ?? InlineEditTabAction.Inactive);\n\t\tthis._constructorDone = observableValue(this, false);\n\t\tthis._uiState = derived<{\n\t\t\tstate: ReturnType<typeof InlineEditsView.prototype.determineRenderState>;\n\t\t\tdiff: DetailedLineRangeMapping[];\n\t\t\tedit: InlineEditWithChanges;\n\t\t\tnewText: string;\n\t\t\tnewTextLineCount: number;\n\t\t\tisInDiffEditor: boolean;\n\t\t} | undefined>(this, reader => {\n\t\t\tconst model = this._model.read(reader);\n\t\t\tif (!model || !this._constructorDone.read(reader)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst inlineEdit = model.inlineEdit;\n\t\t\tlet mappings = RangeMapping.fromEdit(inlineEdit.edit);\n\t\t\tlet newText = inlineEdit.edit.apply(inlineEdit.originalText);\n\t\t\tlet diff = lineRangeMappingFromRangeMappings(mappings, inlineEdit.originalText, new StringText(newText));\n\n\t\t\tlet state = this.determineRenderState(model, reader, diff, new StringText(newText));\n\t\t\tif (!state) {\n\t\t\t\tmodel.abort(`unable to determine view: tried to render ${this._previousView?.view}`);\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tif (state.kind === InlineCompletionViewKind.SideBySide) {\n\t\t\t\tconst indentationAdjustmentEdit = createReindentEdit(newText, inlineEdit.modifiedLineRange, textModel.getOptions().tabSize);\n\t\t\t\tnewText = indentationAdjustmentEdit.applyToString(newText);\n\n\t\t\t\tmappings = applyEditToModifiedRangeMappings(mappings, indentationAdjustmentEdit);\n\t\t\t\tdiff = lineRangeMappingFromRangeMappings(mappings, inlineEdit.originalText, new StringText(newText));\n\t\t\t}\n\n\t\t\tthis._previewTextModel.setLanguage(this._editor.getModel()!.getLanguageId());\n\n\t\t\tconst previousNewText = this._previewTextModel.getValue();\n\t\t\tif (previousNewText !== newText) {\n\t\t\t\t// Only update the model if the text has changed to avoid flickering\n\t\t\t\tthis._previewTextModel.setValue(newText);\n\t\t\t}\n\n\t\t\tif (model.showCollapsed.read(reader) && !this._indicator.read(reader)?.isHoverVisible.read(reader)) {\n\t\t\t\tstate = { kind: InlineCompletionViewKind.Collapsed as const, viewData: state.viewData };\n\t\t\t}\n\n\t\t\tmodel.handleInlineEditShown(state.kind, state.viewData);\n\n\t\t\treturn {\n\t\t\t\tstate,\n\t\t\t\tdiff,\n\t\t\t\tedit: inlineEdit,\n\t\t\t\tnewText,\n\t\t\t\tnewTextLineCount: inlineEdit.modifiedLineRange.length,\n\t\t\t\tisInDiffEditor: model.isInDiffEditor,\n\t\t\t};\n\t\t});\n\t\tthis._previewTextModel = this._register(this._instantiationService.createInstance(\n\t\t\tTextModel,\n\t\t\t'',\n\t\t\tthis._editor.getModel()!.getLanguageId(),\n\t\t\t{ ...TextModel.DEFAULT_CREATION_OPTIONS, bracketPairColorizationOptions: { enabled: true, independentColorPoolPerBracketType: false } },\n\t\t\tnull\n\t\t));\n\t\tthis._indicatorCyclicDependencyCircuitBreaker = observableValue(this, false);\n\t\tthis._indicator = derived<InlineEditsGutterIndicator | undefined>(this, (reader) => {\n\t\t\tif (!this._indicatorCyclicDependencyCircuitBreaker.read(reader)) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst indicatorDisplayRange = derivedOpts({ owner: this, equalsFn: equalsIfDefined(itemEquals()) }, reader => {\n\t\t\t\t/** @description indicatorDisplayRange */\n\t\t\t\tconst ghostTextIndicator = this._ghostTextIndicator.read(reader);\n\t\t\t\tif (ghostTextIndicator) {\n\t\t\t\t\treturn ghostTextIndicator.lineRange;\n\t\t\t\t}\n\n\t\t\t\tconst state = this._uiState.read(reader);\n\t\t\t\tif (!state) { return undefined; }\n\n\t\t\t\tif (state.state?.kind === 'custom') {\n\t\t\t\t\tconst range = state.state.displayLocation?.range;\n\t\t\t\t\tif (!range) {\n\t\t\t\t\t\tthrow new BugIndicatingError('custom view should have a range');\n\t\t\t\t\t}\n\t\t\t\t\treturn new LineRange(range.startLineNumber, range.endLineNumber);\n\t\t\t\t}\n\n\t\t\t\tif (state.state?.kind === 'insertionMultiLine') {\n\t\t\t\t\treturn this._insertion.originalLines.read(reader);\n\t\t\t\t}\n\n\t\t\t\treturn state.edit.displayRange;\n\t\t\t});\n\n\t\t\tconst modelWithGhostTextSupport = derived<InlineEditModel | undefined>(this, reader => {\n\t\t\t\t/** @description modelWithGhostTextSupport */\n\t\t\t\tconst model = this._model.read(reader);\n\t\t\t\tif (model) {\n\t\t\t\t\treturn model;\n\t\t\t\t}\n\n\t\t\t\tconst ghostTextIndicator = this._ghostTextIndicator.read(reader);\n\t\t\t\tif (ghostTextIndicator) {\n\t\t\t\t\treturn ghostTextIndicator.model;\n\t\t\t\t}\n\n\t\t\t\treturn model;\n\t\t\t});\n\n\t\t\treturn reader.store.add(this._instantiationService.createInstance(\n\t\t\t\tInlineEditsGutterIndicator,\n\t\t\t\tthis._editorObs,\n\t\t\t\tindicatorDisplayRange,\n\t\t\t\tthis._gutterIndicatorOffset,\n\t\t\t\tmodelWithGhostTextSupport,\n\t\t\t\tthis._inlineEditsIsHovered,\n\t\t\t\tthis._focusIsInMenu,\n\t\t\t));\n\t\t});\n\t\tthis._inlineEditsIsHovered = derived(this, reader => {\n\t\t\treturn this._sideBySide.isHovered.read(reader)\n\t\t\t\t|| this._wordReplacementViews.read(reader).some(v => v.isHovered.read(reader))\n\t\t\t\t|| this._deletion.isHovered.read(reader)\n\t\t\t\t|| this._inlineDiffView.isHovered.read(reader)\n\t\t\t\t|| this._lineReplacementView.isHovered.read(reader)\n\t\t\t\t|| this._insertion.isHovered.read(reader)\n\t\t\t\t|| this._customView.isHovered.read(reader);\n\t\t});\n\t\tthis._gutterIndicatorOffset = derived<number>(this, reader => {\n\t\t\t// TODO: have a better way to tell the gutter indicator view where the edit is inside a viewzone\n\t\t\tif (this._uiState.read(reader)?.state?.kind === 'insertionMultiLine') {\n\t\t\t\treturn this._insertion.startLineOffset.read(reader);\n\t\t\t}\n\n\t\t\tconst ghostTextIndicator = this._ghostTextIndicator.read(reader);\n\t\t\tif (ghostTextIndicator) {\n\t\t\t\treturn getGhostTextTopOffset(ghostTextIndicator, this._editor);\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t});\n\t\tthis._sideBySide = this._register(this._instantiationService.createInstance(InlineEditsSideBySideView,\n\t\t\tthis._editor,\n\t\t\tthis._model.map(m => m?.inlineEdit),\n\t\t\tthis._previewTextModel,\n\t\t\tthis._uiState.map(s => s && s.state?.kind === InlineCompletionViewKind.SideBySide ? ({\n\t\t\t\tnewTextLineCount: s.newTextLineCount,\n\t\t\t\tisInDiffEditor: s.isInDiffEditor,\n\t\t\t}) : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\t\tthis._deletion = this._register(this._instantiationService.createInstance(InlineEditsDeletionView,\n\t\t\tthis._editor,\n\t\t\tthis._model.map(m => m?.inlineEdit),\n\t\t\tthis._uiState.map(s => s && s.state?.kind === InlineCompletionViewKind.Deletion ? ({\n\t\t\t\toriginalRange: s.state.originalRange,\n\t\t\t\tdeletions: s.state.deletions,\n\t\t\t\tinDiffEditor: s.isInDiffEditor,\n\t\t\t}) : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\t\tthis._insertion = this._register(this._instantiationService.createInstance(InlineEditsInsertionView,\n\t\t\tthis._editor,\n\t\t\tthis._uiState.map(s => s && s.state?.kind === InlineCompletionViewKind.InsertionMultiLine ? ({\n\t\t\t\tlineNumber: s.state.lineNumber,\n\t\t\t\tstartColumn: s.state.column,\n\t\t\t\ttext: s.state.text,\n\t\t\t\tinDiffEditor: s.isInDiffEditor,\n\t\t\t}) : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\t\tthis._inlineDiffViewState = derived<IOriginalEditorInlineDiffViewState | undefined>(this, reader => {\n\t\t\tconst e = this._uiState.read(reader);\n\t\t\tif (!e || !e.state) { return undefined; }\n\t\t\tif (e.state.kind === 'wordReplacements' || e.state.kind === 'insertionMultiLine' || e.state.kind === 'collapsed' || e.state.kind === 'custom') {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\treturn {\n\t\t\t\tmodifiedText: new StringText(e.newText),\n\t\t\t\tdiff: e.diff,\n\t\t\t\tmode: e.state.kind,\n\t\t\t\tmodifiedCodeEditor: this._sideBySide.previewEditor,\n\t\t\t\tisInDiffEditor: e.isInDiffEditor,\n\t\t\t};\n\t\t});\n\t\tthis._inlineCollapsedView = this._register(this._instantiationService.createInstance(InlineEditsCollapsedView,\n\t\t\tthis._editor,\n\t\t\tthis._model.map((m, reader) => this._uiState.read(reader)?.state?.kind === 'collapsed' ? m?.inlineEdit : undefined)\n\t\t));\n\t\tthis._customView = this._register(this._instantiationService.createInstance(InlineEditsCustomView,\n\t\t\tthis._editor,\n\t\t\tthis._model.map((m, reader) => this._uiState.read(reader)?.state?.kind === 'custom' ? m?.displayLocation : undefined),\n\t\t\tthis._tabAction,\n\t\t));\n\t\tthis._inlineDiffView = this._register(new OriginalEditorInlineDiffView(this._editor, this._inlineDiffViewState, this._previewTextModel));\n\t\tthis._wordReplacementViews = mapObservableArrayCached(this, this._uiState.map(s => s?.state?.kind === 'wordReplacements' ? s.state.replacements : []), (e, store) => {\n\t\t\treturn store.add(this._instantiationService.createInstance(InlineEditsWordReplacementView, this._editorObs, e, this._tabAction));\n\t\t});\n\t\tthis._lineReplacementView = this._register(this._instantiationService.createInstance(InlineEditsLineReplacementView,\n\t\t\tthis._editorObs,\n\t\t\tthis._uiState.map(s => s?.state?.kind === InlineCompletionViewKind.LineReplacement ? ({\n\t\t\t\toriginalRange: s.state.originalRange,\n\t\t\t\tmodifiedRange: s.state.modifiedRange,\n\t\t\t\tmodifiedLines: s.state.modifiedLines,\n\t\t\t\treplacements: s.state.replacements,\n\t\t\t}) : undefined),\n\t\t\tthis._uiState.map(s => s?.isInDiffEditor ?? false),\n\t\t\tthis._tabAction,\n\t\t));\n\n\t\tthis._useCodeShifting = this._editorObs.getOption(EditorOption.inlineSuggest).map(s => s.edits.allowCodeShifting);\n\t\tthis._renderSideBySide = this._editorObs.getOption(EditorOption.inlineSuggest).map(s => s.edits.renderSideBySide);\n\n\t\tthis._register(autorunWithStore((reader, store) => {\n\t\t\tconst model = this._model.read(reader);\n\t\t\tif (!model) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tstore.add(\n\t\t\t\tEvent.any(\n\t\t\t\t\tthis._sideBySide.onDidClick,\n\t\t\t\t\tthis._deletion.onDidClick,\n\t\t\t\t\tthis._lineReplacementView.onDidClick,\n\t\t\t\t\tthis._insertion.onDidClick,\n\t\t\t\t\t...this._wordReplacementViews.read(reader).map(w => w.onDidClick),\n\t\t\t\t\tthis._inlineDiffView.onDidClick,\n\t\t\t\t\tthis._customView.onDidClick,\n\t\t\t\t)(e => {\n\t\t\t\t\tif (this._viewHasBeenShownLongerThan(350)) {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tmodel.accept();\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t);\n\t\t}));\n\n\t\tthis._indicator.recomputeInitiallyAndOnChange(this._store);\n\t\tthis._wordReplacementViews.recomputeInitiallyAndOnChange(this._store);\n\n\t\tthis._indicatorCyclicDependencyCircuitBreaker.set(true, undefined);\n\n\t\tthis._register(this._instantiationService.createInstance(InlineEditsOnboardingExperience, this._host, this._model, this._indicator, this._inlineCollapsedView));\n\n\t\tconst minEditorScrollHeight = derived(this, reader => {\n\t\t\treturn Math.max(\n\t\t\t\t...this._wordReplacementViews.read(reader).map(v => v.minEditorScrollHeight.read(reader)),\n\t\t\t\tthis._lineReplacementView.minEditorScrollHeight.read(reader),\n\t\t\t\tthis._customView.minEditorScrollHeight.read(reader)\n\t\t\t);\n\t\t}).recomputeInitiallyAndOnChange(this._store);\n\n\t\tconst textModel = this._editor.getModel()!;\n\n\t\tlet viewZoneId: string | undefined;\n\t\tthis._register(autorun(reader => {\n\t\t\tconst minScrollHeight = minEditorScrollHeight.read(reader);\n\t\t\tthis._editor.changeViewZones(accessor => {\n\t\t\t\tconst scrollHeight = this._editor.getScrollHeight();\n\t\t\t\tconst viewZoneHeight = minScrollHeight - scrollHeight + 1 /* Add 1px so there is a small gap */;\n\n\t\t\t\tif (viewZoneHeight !== 0 && viewZoneId) {\n\t\t\t\t\taccessor.removeZone(viewZoneId);\n\t\t\t\t\tviewZoneId = undefined;\n\t\t\t\t}\n\n\t\t\t\tif (viewZoneHeight <= 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tviewZoneId = accessor.addZone({\n\t\t\t\t\tafterLineNumber: textModel.getLineCount(),\n\t\t\t\t\theightInPx: viewZoneHeight,\n\t\t\t\t\tdomNode: $('div.minScrollHeightViewZone'),\n\t\t\t\t});\n\t\t\t});\n\t\t}));\n\n\t\tthis._constructorDone.set(true, undefined); // TODO: remove and use correct initialization order\n\t}\n\n\tprivate readonly _constructorDone;\n\n\tprivate readonly _uiState;\n\n\tprivate readonly _previewTextModel;\n\n\tprivate readonly _indicatorCyclicDependencyCircuitBreaker;\n\n\tprotected readonly _indicator;\n\n\tprivate readonly _inlineEditsIsHovered;\n\n\tprivate readonly _gutterIndicatorOffset;\n\n\tprivate readonly _sideBySide;\n\n\tprotected readonly _deletion;\n\n\tprotected readonly _insertion;\n\n\tprivate readonly _inlineDiffViewState;\n\n\tprotected readonly _inlineCollapsedView;\n\n\tprotected readonly _customView;\n\n\tprotected readonly _inlineDiffView;\n\n\tprotected readonly _wordReplacementViews;\n\n\tprotected readonly _lineReplacementView;\n\n\tprivate getCacheId(model: IInlineEditModel) {\n\t\treturn model.inlineEdit.inlineCompletion.identity.id;\n\t}\n\n\tprivate determineView(model: IInlineEditModel, reader: IReader, diff: DetailedLineRangeMapping[], newText: StringText): InlineCompletionViewKind {\n\t\t// Check if we can use the previous view if it is the same InlineCompletion as previously shown\n\t\tconst inlineEdit = model.inlineEdit;\n\t\tconst canUseCache = this._previousView?.id === this.getCacheId(model);\n\t\tconst reconsiderViewEditorWidthChange = this._previousView?.editorWidth !== this._editorObs.layoutInfoWidth.read(reader) &&\n\t\t\t(\n\t\t\t\tthis._previousView?.view === InlineCompletionViewKind.SideBySide ||\n\t\t\t\tthis._previousView?.view === InlineCompletionViewKind.LineReplacement\n\t\t\t);\n\n\t\tif (canUseCache && !reconsiderViewEditorWidthChange) {\n\t\t\treturn this._previousView!.view;\n\t\t}\n\n\t\tif (model.displayLocation) {\n\t\t\treturn InlineCompletionViewKind.Custom;\n\t\t}\n\n\t\t// Determine the view based on the edit / diff\n\n\t\tconst numOriginalLines = inlineEdit.originalLineRange.length;\n\t\tconst numModifiedLines = inlineEdit.modifiedLineRange.length;\n\t\tconst inner = diff.flatMap(d => d.innerChanges ?? []);\n\t\tconst isSingleInnerEdit = inner.length === 1;\n\n\t\tif (!model.isInDiffEditor) {\n\t\t\tif (\n\t\t\t\tisSingleInnerEdit\n\t\t\t\t&& this._useCodeShifting.read(reader) !== 'never'\n\t\t\t\t&& isSingleLineInsertion(diff)\n\t\t\t) {\n\t\t\t\tif (isSingleLineInsertionAfterPosition(diff, inlineEdit.cursorPosition)) {\n\t\t\t\t\treturn InlineCompletionViewKind.InsertionInline;\n\t\t\t\t}\n\n\t\t\t\t// If we have a single line insertion before the cursor position, we do not want to move the cursor by inserting\n\t\t\t\t// the suggestion inline. Use a line replacement view instead. Do not use word replacement view.\n\t\t\t\treturn InlineCompletionViewKind.LineReplacement;\n\t\t\t}\n\n\t\t\tif (isDeletion(inner, inlineEdit, newText)) {\n\t\t\t\treturn InlineCompletionViewKind.Deletion;\n\t\t\t}\n\n\t\t\tif (isSingleMultiLineInsertion(diff) && this._useCodeShifting.read(reader) === 'always') {\n\t\t\t\treturn InlineCompletionViewKind.InsertionMultiLine;\n\t\t\t}\n\n\t\t\tconst allInnerChangesNotTooLong = inner.every(m => TextLength.ofRange(m.originalRange).columnCount < InlineEditsWordReplacementView.MAX_LENGTH && TextLength.ofRange(m.modifiedRange).columnCount < InlineEditsWordReplacementView.MAX_LENGTH);\n\t\t\tif (allInnerChangesNotTooLong && isSingleInnerEdit && numOriginalLines === 1 && numModifiedLines === 1) {\n\t\t\t\t// Do not show indentation changes with word replacement view\n\t\t\t\tconst modifiedText = inner.map(m => newText.getValueOfRange(m.modifiedRange));\n\t\t\t\tconst originalText = inner.map(m => model.inlineEdit.originalText.getValueOfRange(m.originalRange));\n\t\t\t\tif (!modifiedText.some(v => v.includes('\\t')) && !originalText.some(v => v.includes('\\t'))) {\n\t\t\t\t\t// Make sure there is no insertion, even if we grow them\n\t\t\t\t\tif (\n\t\t\t\t\t\t!inner.some(m => m.originalRange.isEmpty()) ||\n\t\t\t\t\t\t!growEditsUntilWhitespace(inner.map(m => new TextReplacement(m.originalRange, '')), inlineEdit.originalText).some(e => e.range.isEmpty() && TextLength.ofRange(e.range).columnCount < InlineEditsWordReplacementView.MAX_LENGTH)\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn InlineCompletionViewKind.WordReplacements;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (numOriginalLines > 0 && numModifiedLines > 0) {\n\t\t\tif (numOriginalLines === 1 && numModifiedLines === 1 && !model.isInDiffEditor /* prefer side by side in diff editor */) {\n\t\t\t\treturn InlineCompletionViewKind.LineReplacement;\n\t\t\t}\n\n\t\t\tif (this._renderSideBySide.read(reader) !== 'never' && InlineEditsSideBySideView.fitsInsideViewport(this._editor, this._previewTextModel, inlineEdit, reader)) {\n\t\t\t\treturn InlineCompletionViewKind.SideBySide;\n\t\t\t}\n\n\t\t\treturn InlineCompletionViewKind.LineReplacement;\n\t\t}\n\n\t\tif (model.isInDiffEditor) {\n\t\t\tif (isDeletion(inner, inlineEdit, newText)) {\n\t\t\t\treturn InlineCompletionViewKind.Deletion;\n\t\t\t}\n\n\t\t\tif (isSingleMultiLineInsertion(diff) && this._useCodeShifting.read(reader) === 'always') {\n\t\t\t\treturn InlineCompletionViewKind.InsertionMultiLine;\n\t\t\t}\n\t\t}\n\n\t\treturn InlineCompletionViewKind.SideBySide;\n\t}\n\n\tprivate determineRenderState(model: IInlineEditModel, reader: IReader, diff: DetailedLineRangeMapping[], newText: StringText) {\n\t\tconst inlineEdit = model.inlineEdit;\n\n\t\tlet view = this.determineView(model, reader, diff, newText);\n\n\t\tif (this._willRenderAboveCursor(reader, inlineEdit, view)) {\n\t\t\tswitch (view) {\n\t\t\t\tcase InlineCompletionViewKind.LineReplacement:\n\t\t\t\tcase InlineCompletionViewKind.WordReplacements:\n\t\t\t\t\tview = InlineCompletionViewKind.SideBySide;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tthis._previousView = { id: this.getCacheId(model), view, editorWidth: this._editor.getLayoutInfo().width, timestamp: Date.now() };\n\n\t\tconst inner = diff.flatMap(d => d.innerChanges ?? []);\n\t\tconst textModel = this._editor.getModel()!;\n\t\tconst stringChanges = inner.map(m => ({\n\t\t\toriginalRange: m.originalRange,\n\t\t\tmodifiedRange: m.modifiedRange,\n\t\t\toriginal: textModel.getValueInRange(m.originalRange),\n\t\t\tmodified: newText.getValueOfRange(m.modifiedRange)\n\t\t}));\n\n\t\tconst cursorPosition = inlineEdit.cursorPosition;\n\t\tconst startsWithEOL = stringChanges[0].modified.startsWith(textModel.getEOL());\n\t\tconst viewData: InlineCompletionViewData = {\n\t\t\tcursorColumnDistance: inlineEdit.edit.replacements[0].range.getStartPosition().column - cursorPosition.column,\n\t\t\tcursorLineDistance: inlineEdit.lineEdit.lineRange.startLineNumber - cursorPosition.lineNumber + (startsWithEOL && inlineEdit.lineEdit.lineRange.startLineNumber >= cursorPosition.lineNumber ? 1 : 0),\n\t\t\tlineCountOriginal: inlineEdit.lineEdit.lineRange.length,\n\t\t\tlineCountModified: inlineEdit.lineEdit.newLines.length,\n\t\t\tcharacterCountOriginal: stringChanges.reduce((acc, r) => acc + r.original.length, 0),\n\t\t\tcharacterCountModified: stringChanges.reduce((acc, r) => acc + r.modified.length, 0),\n\t\t\tdisjointReplacements: stringChanges.length,\n\t\t\tsameShapeReplacements: stringChanges.every(r => r.original === stringChanges[0].original && r.modified === stringChanges[0].modified),\n\t\t};\n\n\t\tswitch (view) {\n\t\t\tcase InlineCompletionViewKind.InsertionInline: return { kind: InlineCompletionViewKind.InsertionInline as const, viewData };\n\t\t\tcase InlineCompletionViewKind.SideBySide: return { kind: InlineCompletionViewKind.SideBySide as const, viewData };\n\t\t\tcase InlineCompletionViewKind.Collapsed: return { kind: InlineCompletionViewKind.Collapsed as const, viewData };\n\t\t\tcase InlineCompletionViewKind.Custom: return { kind: InlineCompletionViewKind.Custom as const, displayLocation: model.displayLocation, viewData };\n\t\t}\n\n\t\tif (view === InlineCompletionViewKind.Deletion) {\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.Deletion as const,\n\t\t\t\toriginalRange: inlineEdit.originalLineRange,\n\t\t\t\tdeletions: inner.map(m => m.originalRange),\n\t\t\t\tviewData,\n\t\t\t};\n\t\t}\n\n\t\tif (view === InlineCompletionViewKind.InsertionMultiLine) {\n\t\t\tconst change = inner[0];\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.InsertionMultiLine as const,\n\t\t\t\tlineNumber: change.originalRange.startLineNumber,\n\t\t\t\tcolumn: change.originalRange.startColumn,\n\t\t\t\ttext: newText.getValueOfRange(change.modifiedRange),\n\t\t\t\tviewData,\n\t\t\t};\n\t\t}\n\n\t\tconst replacements = stringChanges.map(m => new TextReplacement(m.originalRange, m.modified));\n\t\tif (replacements.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (view === InlineCompletionViewKind.WordReplacements) {\n\t\t\tlet grownEdits = growEditsToEntireWord(replacements, inlineEdit.originalText);\n\n\t\t\tif (grownEdits.some(e => e.range.isEmpty())) {\n\t\t\t\tgrownEdits = growEditsUntilWhitespace(replacements, inlineEdit.originalText);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.WordReplacements as const,\n\t\t\t\treplacements: grownEdits,\n\t\t\t\tviewData,\n\t\t\t};\n\t\t}\n\n\t\tif (view === InlineCompletionViewKind.LineReplacement) {\n\t\t\treturn {\n\t\t\t\tkind: InlineCompletionViewKind.LineReplacement as const,\n\t\t\t\toriginalRange: inlineEdit.originalLineRange,\n\t\t\t\tmodifiedRange: inlineEdit.modifiedLineRange,\n\t\t\t\tmodifiedLines: inlineEdit.modifiedLineRange.mapToLineArray(line => newText.getLineAt(line)),\n\t\t\t\treplacements: inner.map(m => ({ originalRange: m.originalRange, modifiedRange: m.modifiedRange })),\n\t\t\t\tviewData,\n\t\t\t};\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\tprivate _willRenderAboveCursor(reader: IReader, inlineEdit: InlineEditWithChanges, view: InlineCompletionViewKind): boolean {\n\t\tconst useCodeShifting = this._useCodeShifting.read(reader);\n\t\tif (useCodeShifting === 'always') {\n\t\t\treturn false;\n\t\t}\n\n\t\tfor (const cursorPosition of inlineEdit.multiCursorPositions) {\n\t\t\tif (view === InlineCompletionViewKind.WordReplacements &&\n\t\t\t\tcursorPosition.lineNumber === inlineEdit.originalLineRange.startLineNumber + 1\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (view === InlineCompletionViewKind.LineReplacement &&\n\t\t\t\tcursorPosition.lineNumber >= inlineEdit.originalLineRange.endLineNumberExclusive &&\n\t\t\t\tcursorPosition.lineNumber < inlineEdit.modifiedLineRange.endLineNumberExclusive + inlineEdit.modifiedLineRange.length\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tprivate _viewHasBeenShownLongerThan(durationMs: number): boolean {\n\t\tconst viewCreationTime = this._previousView?.timestamp;\n\t\tif (!viewCreationTime) {\n\t\t\tthrow new BugIndicatingError('viewHasBeenShownLongThan called before a view has been shown');\n\t\t}\n\n\t\tconst currentTime = Date.now();\n\t\treturn (currentTime - viewCreationTime) >= durationMs;\n\t}\n}\n\nfunction isSingleLineInsertion(diff: DetailedLineRangeMapping[]) {\n\treturn diff.every(m => m.innerChanges!.every(r => isWordInsertion(r)));\n\n\tfunction isWordInsertion(r: RangeMapping) {\n\t\tif (!r.originalRange.isEmpty()) {\n\t\t\treturn false;\n\t\t}\n\t\tconst isInsertionWithinLine = r.modifiedRange.startLineNumber === r.modifiedRange.endLineNumber;\n\t\tif (!isInsertionWithinLine) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t}\n}\n\nfunction isSingleLineInsertionAfterPosition(diff: DetailedLineRangeMapping[], position: Position | null) {\n\tif (!position) {\n\t\treturn false;\n\t}\n\n\tif (!isSingleLineInsertion(diff)) {\n\t\treturn false;\n\t}\n\n\tconst pos = position;\n\n\treturn diff.every(m => m.innerChanges!.every(r => isStableWordInsertion(r)));\n\n\tfunction isStableWordInsertion(r: RangeMapping) {\n\t\tconst insertPosition = r.originalRange.getStartPosition();\n\t\tif (pos.isBeforeOrEqual(insertPosition)) {\n\t\t\treturn true;\n\t\t}\n\t\tif (insertPosition.lineNumber < pos.lineNumber) {\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n}\n\nfunction isSingleMultiLineInsertion(diff: DetailedLineRangeMapping[]) {\n\tconst inner = diff.flatMap(d => d.innerChanges ?? []);\n\tif (inner.length !== 1) {\n\t\treturn false;\n\t}\n\n\tconst change = inner[0];\n\tif (!change.originalRange.isEmpty()) {\n\t\treturn false;\n\t}\n\n\tif (change.modifiedRange.startLineNumber === change.modifiedRange.endLineNumber) {\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nfunction isDeletion(inner: RangeMapping[], inlineEdit: InlineEditWithChanges, newText: StringText) {\n\tconst innerValues = inner.map(m => ({ original: inlineEdit.originalText.getValueOfRange(m.originalRange), modified: newText.getValueOfRange(m.modifiedRange) }));\n\treturn innerValues.every(({ original, modified }) => modified.trim() === '' && original.length > 0 && (original.length > modified.length || original.trim() !== ''));\n}\n\nfunction growEditsToEntireWord(replacements: TextReplacement[], originalText: AbstractText): TextReplacement[] {\n\treturn _growEdits(replacements, originalText, (char) => /^[a-zA-Z]$/.test(char));\n}\n\nfunction growEditsUntilWhitespace(replacements: TextReplacement[], originalText: AbstractText): TextReplacement[] {\n\treturn _growEdits(replacements, originalText, (char) => !(/^\\s$/.test(char)));\n}\n\nfunction _growEdits(replacements: TextReplacement[], originalText: AbstractText, fn: (c: string) => boolean): TextReplacement[] {\n\tconst result: TextReplacement[] = [];\n\n\treplacements.sort((a, b) => Range.compareRangesUsingStarts(a.range, b.range));\n\n\tfor (const edit of replacements) {\n\t\tlet startIndex = edit.range.startColumn - 1;\n\t\tlet endIndex = edit.range.endColumn - 2;\n\t\tlet prefix = '';\n\t\tlet suffix = '';\n\t\tconst startLineContent = originalText.getLineAt(edit.range.startLineNumber);\n\t\tconst endLineContent = originalText.getLineAt(edit.range.endLineNumber);\n\n\t\tif (isIncluded(startLineContent[startIndex])) {\n\t\t\t// grow to the left\n\t\t\twhile (isIncluded(startLineContent[startIndex - 1])) {\n\t\t\t\tprefix = startLineContent[startIndex - 1] + prefix;\n\t\t\t\tstartIndex--;\n\t\t\t}\n\t\t}\n\n\t\tif (isIncluded(endLineContent[endIndex]) || endIndex < startIndex) {\n\t\t\t// grow to the right\n\t\t\twhile (isIncluded(endLineContent[endIndex + 1])) {\n\t\t\t\tsuffix += endLineContent[endIndex + 1];\n\t\t\t\tendIndex++;\n\t\t\t}\n\t\t}\n\n\t\t// create new edit and merge together if they are touching\n\t\tlet newEdit = new TextReplacement(new Range(edit.range.startLineNumber, startIndex + 1, edit.range.endLineNumber, endIndex + 2), prefix + edit.text + suffix);\n\t\tif (result.length > 0 && Range.areIntersectingOrTouching(result[result.length - 1].range, newEdit.range)) {\n\t\t\tnewEdit = TextReplacement.joinReplacements([result.pop()!, newEdit], originalText);\n\t\t}\n\n\t\tresult.push(newEdit);\n\t}\n\n\tfunction isIncluded(c: string | undefined) {\n\t\tif (c === undefined) {\n\t\t\treturn false;\n\t\t}\n\t\treturn fn(c);\n\t}\n\n\treturn result;\n}\n\nfunction getGhostTextTopOffset(ghostTextIndicator: GhostTextIndicator, editor: ICodeEditor): number {\n\tconst replacements = ghostTextIndicator.model.inlineEdit.edit.replacements;\n\tif (replacements.length !== 1) {\n\t\treturn 0;\n\t}\n\n\tconst textModel = editor.getModel();\n\tif (!textModel) {\n\t\treturn 0;\n\t}\n\n\tconst EOL = textModel.getEOL();\n\tconst replacement = replacements[0];\n\tif (replacement.range.isEmpty() && replacement.text.startsWith(EOL)) {\n\t\tconst lineHeight = editor.getLineHeightForPosition(replacement.range.getStartPosition());\n\t\treturn countPrefixRepeats(replacement.text, EOL) * lineHeight;\n\t}\n\n\treturn 0;\n}\n\nfunction countPrefixRepeats(str: string, prefix: string): number {\n\tif (!prefix.length) {\n\t\treturn 0;\n\t}\n\tlet count = 0;\n\tlet i = 0;\n\twhile (str.startsWith(prefix, i)) {\n\t\tcount++;\n\t\ti += prefix.length;\n\t}\n\treturn count;\n}\n"]}
|
package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewProducer.js
CHANGED
|
@@ -57,7 +57,7 @@ let InlineEditsViewAndDiffProducer = class InlineEditsViewAndDiffProducer extend
|
|
|
57
57
|
});
|
|
58
58
|
const diffEdits = new TextEdit(edits);
|
|
59
59
|
const text = new TextModelText(textModel);
|
|
60
|
-
return new InlineEditWithChanges(text, diffEdits, model.primaryPosition.read(undefined), inlineEdit.commands, inlineEdit.inlineCompletion);
|
|
60
|
+
return new InlineEditWithChanges(text, diffEdits, model.primaryPosition.read(undefined), model.allPositions.read(undefined), inlineEdit.commands, inlineEdit.inlineCompletion);
|
|
61
61
|
});
|
|
62
62
|
this._inlineEditModel = derived(this, reader => {
|
|
63
63
|
const model = this._model.read(reader);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewProducer.ts","vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewProducer.ts"],"names":[],"mappings":"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","file":"inlineEditsViewProducer.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 { createHotClass } from '../../../../../../base/common/hotReloadHelpers.js';\nimport { Disposable } from '../../../../../../base/common/lifecycle.js';\nimport { derived, IObservable, ISettableObservable } 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 { LineRange } from '../../../../../common/core/ranges/lineRange.js';\nimport { Range } from '../../../../../common/core/range.js';\nimport { TextReplacement, TextEdit } from '../../../../../common/core/edits/textEdit.js';\nimport { TextModelText } from '../../../../../common/model/textModelText.js';\nimport { InlineCompletionsModel } from '../../model/inlineCompletionsModel.js';\nimport { InlineEdit } from '../../model/inlineEdit.js';\nimport { InlineEditWithChanges } from './inlineEditWithChanges.js';\nimport { GhostTextIndicator, InlineEditHost, InlineEditModel } from './inlineEditsModel.js';\nimport { InlineEditsView } from './inlineEditsView.js';\nimport { InlineEditTabAction } from './inlineEditsViewInterface.js';\n\nexport class InlineEditsViewAndDiffProducer extends Disposable { // TODO: This class is no longer a diff producer. Rename it or get rid of it\n\tpublic static readonly hot = createHotClass(InlineEditsViewAndDiffProducer);\n\n\tprivate readonly _editorObs: ObservableCodeEditor;\n\n\tprivate readonly _inlineEdit = derived<InlineEditWithChanges | undefined>(this, (reader) => {\n\t\tconst model = this._model.read(reader);\n\t\tif (!model) { return undefined; }\n\t\tconst inlineEdit = this._edit.read(reader);\n\t\tif (!inlineEdit) { return undefined; }\n\t\tconst textModel = this._editor.getModel();\n\t\tif (!textModel) { return undefined; }\n\n\t\tconst editOffset = model.inlineEditState.read(undefined)?.inlineCompletion.updatedEdit;\n\t\tif (!editOffset) { return undefined; }\n\n\t\tconst edits = editOffset.replacements.map(e => {\n\t\t\tconst innerEditRange = Range.fromPositions(\n\t\t\t\ttextModel.getPositionAt(e.replaceRange.start),\n\t\t\t\ttextModel.getPositionAt(e.replaceRange.endExclusive)\n\t\t\t);\n\t\t\treturn new TextReplacement(innerEditRange, e.newText);\n\t\t});\n\n\t\tconst diffEdits = new TextEdit(edits);\n\t\tconst text = new TextModelText(textModel);\n\n\t\treturn new InlineEditWithChanges(text, diffEdits, model.primaryPosition.read(undefined), inlineEdit.commands, inlineEdit.inlineCompletion);\n\t});\n\n\tprivate readonly _inlineEditModel = derived<InlineEditModel | undefined>(this, reader => {\n\t\tconst model = this._model.read(reader);\n\t\tif (!model) { return undefined; }\n\t\tconst edit = this._inlineEdit.read(reader);\n\t\tif (!edit) { return undefined; }\n\n\t\tconst tabAction = derived<InlineEditTabAction>(this, reader => {\n\t\t\t/** @description tabAction */\n\t\t\tif (this._editorObs.isFocused.read(reader)) {\n\t\t\t\tif (model.tabShouldJumpToInlineEdit.read(reader)) { return InlineEditTabAction.Jump; }\n\t\t\t\tif (model.tabShouldAcceptInlineEdit.read(reader)) { return InlineEditTabAction.Accept; }\n\t\t\t}\n\t\t\treturn InlineEditTabAction.Inactive;\n\t\t});\n\n\t\treturn new InlineEditModel(model, edit, tabAction);\n\t});\n\n\tprivate readonly _inlineEditHost = derived<InlineEditHost | undefined>(this, reader => {\n\t\tconst model = this._model.read(reader);\n\t\tif (!model) { return undefined; }\n\t\treturn new InlineEditHost(model);\n\t});\n\n\tprivate readonly _ghostTextIndicator = derived<GhostTextIndicator | undefined>(this, reader => {\n\t\tconst model = this._model.read(reader);\n\t\tif (!model) { return undefined; }\n\t\tconst state = model.inlineCompletionState.read(reader);\n\t\tif (!state) { return undefined; }\n\t\tconst inlineCompletion = state.inlineCompletion;\n\t\tif (!inlineCompletion) { return undefined; }\n\n\t\tif (!inlineCompletion.showInlineEditMenu) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst lineRange = LineRange.ofLength(state.primaryGhostText.lineNumber, 1);\n\n\t\treturn new GhostTextIndicator(this._editor, model, lineRange, inlineCompletion);\n\t});\n\n\tconstructor(\n\t\tprivate readonly _editor: ICodeEditor,\n\t\tprivate readonly _edit: IObservable<InlineEdit | undefined>,\n\t\tprivate readonly _model: IObservable<InlineCompletionsModel | undefined>,\n\t\tprivate readonly _focusIsInMenu: ISettableObservable<boolean>,\n\t\t@IInstantiationService instantiationService: IInstantiationService,\n\t) {\n\t\tsuper();\n\n\t\tthis._editorObs = observableCodeEditor(this._editor);\n\n\t\tthis._register(instantiationService.createInstance(InlineEditsView, this._editor, this._inlineEditHost, this._inlineEditModel, this._ghostTextIndicator, this._focusIsInMenu));\n\t}\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { createHotClass } from '../../../../../../base/common/hotReloadHelpers.js';\nimport { Disposable } from '../../../../../../base/common/lifecycle.js';\nimport { derived, IObservable, ISettableObservable } 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 { LineRange } from '../../../../../common/core/ranges/lineRange.js';\nimport { Range } from '../../../../../common/core/range.js';\nimport { TextReplacement, TextEdit } from '../../../../../common/core/edits/textEdit.js';\nimport { TextModelText } from '../../../../../common/model/textModelText.js';\nimport { InlineCompletionsModel } from '../../model/inlineCompletionsModel.js';\nimport { InlineEdit } from '../../model/inlineEdit.js';\nimport { InlineEditWithChanges } from './inlineEditWithChanges.js';\nimport { GhostTextIndicator, InlineEditHost, InlineEditModel } from './inlineEditsModel.js';\nimport { InlineEditsView } from './inlineEditsView.js';\nimport { InlineEditTabAction } from './inlineEditsViewInterface.js';\n\nexport class InlineEditsViewAndDiffProducer extends Disposable { // TODO: This class is no longer a diff producer. Rename it or get rid of it\n\tpublic static readonly hot = createHotClass(InlineEditsViewAndDiffProducer);\n\n\tprivate readonly _editorObs: ObservableCodeEditor;\n\n\tprivate readonly _inlineEdit = derived<InlineEditWithChanges | undefined>(this, (reader) => {\n\t\tconst model = this._model.read(reader);\n\t\tif (!model) { return undefined; }\n\t\tconst inlineEdit = this._edit.read(reader);\n\t\tif (!inlineEdit) { return undefined; }\n\t\tconst textModel = this._editor.getModel();\n\t\tif (!textModel) { return undefined; }\n\n\t\tconst editOffset = model.inlineEditState.read(undefined)?.inlineCompletion.updatedEdit;\n\t\tif (!editOffset) { return undefined; }\n\n\t\tconst edits = editOffset.replacements.map(e => {\n\t\t\tconst innerEditRange = Range.fromPositions(\n\t\t\t\ttextModel.getPositionAt(e.replaceRange.start),\n\t\t\t\ttextModel.getPositionAt(e.replaceRange.endExclusive)\n\t\t\t);\n\t\t\treturn new TextReplacement(innerEditRange, e.newText);\n\t\t});\n\n\t\tconst diffEdits = new TextEdit(edits);\n\t\tconst text = new TextModelText(textModel);\n\n\t\treturn new InlineEditWithChanges(text, diffEdits, model.primaryPosition.read(undefined), inlineEdit.commands, inlineEdit.inlineCompletion);\n\t});\n\n\tprivate readonly _inlineEditModel = derived<InlineEditModel | undefined>(this, reader => {\n\t\tconst model = this._model.read(reader);\n\t\tif (!model) { return undefined; }\n\t\tconst edit = this._inlineEdit.read(reader);\n\t\tif (!edit) { return undefined; }\n\n\t\tconst tabAction = derived<InlineEditTabAction>(this, reader => {\n\t\t\t/** @description tabAction */\n\t\t\tif (this._editorObs.isFocused.read(reader)) {\n\t\t\t\tif (model.tabShouldJumpToInlineEdit.read(reader)) { return InlineEditTabAction.Jump; }\n\t\t\t\tif (model.tabShouldAcceptInlineEdit.read(reader)) { return InlineEditTabAction.Accept; }\n\t\t\t}\n\t\t\treturn InlineEditTabAction.Inactive;\n\t\t});\n\n\t\treturn new InlineEditModel(model, edit, tabAction);\n\t});\n\n\tprivate readonly _inlineEditHost = derived<InlineEditHost | undefined>(this, reader => {\n\t\tconst model = this._model.read(reader);\n\t\tif (!model) { return undefined; }\n\t\treturn new InlineEditHost(model);\n\t});\n\n\tprivate readonly _ghostTextIndicator = derived<GhostTextIndicator | undefined>(this, reader => {\n\t\tconst model = this._model.read(reader);\n\t\tif (!model) { return undefined; }\n\t\tconst state = model.inlineCompletionState.read(reader);\n\t\tif (!state) { return undefined; }\n\t\tconst inlineCompletion = state.inlineCompletion;\n\t\tif (!inlineCompletion) { return undefined; }\n\n\t\tif (!inlineCompletion.showInlineEditMenu) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst lineRange = LineRange.ofLength(state.primaryGhostText.lineNumber, 1);\n\n\t\treturn new GhostTextIndicator(this._editor, model, lineRange, inlineCompletion);\n\t});\n\n\tconstructor(\n\t\tprivate readonly _editor: ICodeEditor,\n\t\tprivate readonly _edit: IObservable<InlineEdit | undefined>,\n\t\tprivate readonly _model: IObservable<InlineCompletionsModel | undefined>,\n\t\tprivate readonly _focusIsInMenu: ISettableObservable<boolean>,\n\t\t@IInstantiationService instantiationService: IInstantiationService,\n\t) {\n\t\tsuper();\n\n\t\tthis._editorObs = observableCodeEditor(this._editor);\n\n\t\tthis._register(instantiationService.createInstance(InlineEditsView, this._editor, this._inlineEditHost, this._inlineEditModel, this._ghostTextIndicator, this._focusIsInMenu));\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewProducer.ts","vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewProducer.ts"],"names":[],"mappings":"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","file":"inlineEditsViewProducer.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 { createHotClass } from '../../../../../../base/common/hotReloadHelpers.js';\nimport { Disposable } from '../../../../../../base/common/lifecycle.js';\nimport { derived, IObservable, ISettableObservable } 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 { LineRange } from '../../../../../common/core/ranges/lineRange.js';\nimport { Range } from '../../../../../common/core/range.js';\nimport { TextReplacement, TextEdit } from '../../../../../common/core/edits/textEdit.js';\nimport { TextModelText } from '../../../../../common/model/textModelText.js';\nimport { InlineCompletionsModel } from '../../model/inlineCompletionsModel.js';\nimport { InlineEdit } from '../../model/inlineEdit.js';\nimport { InlineEditWithChanges } from './inlineEditWithChanges.js';\nimport { GhostTextIndicator, InlineEditHost, InlineEditModel } from './inlineEditsModel.js';\nimport { InlineEditsView } from './inlineEditsView.js';\nimport { InlineEditTabAction } from './inlineEditsViewInterface.js';\n\nexport class InlineEditsViewAndDiffProducer extends Disposable { // TODO: This class is no longer a diff producer. Rename it or get rid of it\n\tpublic static readonly hot = createHotClass(InlineEditsViewAndDiffProducer);\n\n\tprivate readonly _editorObs: ObservableCodeEditor;\n\n\tprivate readonly _inlineEdit = derived<InlineEditWithChanges | undefined>(this, (reader) => {\n\t\tconst model = this._model.read(reader);\n\t\tif (!model) { return undefined; }\n\t\tconst inlineEdit = this._edit.read(reader);\n\t\tif (!inlineEdit) { return undefined; }\n\t\tconst textModel = this._editor.getModel();\n\t\tif (!textModel) { return undefined; }\n\n\t\tconst editOffset = model.inlineEditState.read(undefined)?.inlineCompletion.updatedEdit;\n\t\tif (!editOffset) { return undefined; }\n\n\t\tconst edits = editOffset.replacements.map(e => {\n\t\t\tconst innerEditRange = Range.fromPositions(\n\t\t\t\ttextModel.getPositionAt(e.replaceRange.start),\n\t\t\t\ttextModel.getPositionAt(e.replaceRange.endExclusive)\n\t\t\t);\n\t\t\treturn new TextReplacement(innerEditRange, e.newText);\n\t\t});\n\n\t\tconst diffEdits = new TextEdit(edits);\n\t\tconst text = new TextModelText(textModel);\n\n\t\treturn new InlineEditWithChanges(text, diffEdits, model.primaryPosition.read(undefined), model.allPositions.read(undefined), inlineEdit.commands, inlineEdit.inlineCompletion);\n\t});\n\n\tprivate readonly _inlineEditModel = derived<InlineEditModel | undefined>(this, reader => {\n\t\tconst model = this._model.read(reader);\n\t\tif (!model) { return undefined; }\n\t\tconst edit = this._inlineEdit.read(reader);\n\t\tif (!edit) { return undefined; }\n\n\t\tconst tabAction = derived<InlineEditTabAction>(this, reader => {\n\t\t\t/** @description tabAction */\n\t\t\tif (this._editorObs.isFocused.read(reader)) {\n\t\t\t\tif (model.tabShouldJumpToInlineEdit.read(reader)) { return InlineEditTabAction.Jump; }\n\t\t\t\tif (model.tabShouldAcceptInlineEdit.read(reader)) { return InlineEditTabAction.Accept; }\n\t\t\t}\n\t\t\treturn InlineEditTabAction.Inactive;\n\t\t});\n\n\t\treturn new InlineEditModel(model, edit, tabAction);\n\t});\n\n\tprivate readonly _inlineEditHost = derived<InlineEditHost | undefined>(this, reader => {\n\t\tconst model = this._model.read(reader);\n\t\tif (!model) { return undefined; }\n\t\treturn new InlineEditHost(model);\n\t});\n\n\tprivate readonly _ghostTextIndicator = derived<GhostTextIndicator | undefined>(this, reader => {\n\t\tconst model = this._model.read(reader);\n\t\tif (!model) { return undefined; }\n\t\tconst state = model.inlineCompletionState.read(reader);\n\t\tif (!state) { return undefined; }\n\t\tconst inlineCompletion = state.inlineCompletion;\n\t\tif (!inlineCompletion) { return undefined; }\n\n\t\tif (!inlineCompletion.showInlineEditMenu) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst lineRange = LineRange.ofLength(state.primaryGhostText.lineNumber, 1);\n\n\t\treturn new GhostTextIndicator(this._editor, model, lineRange, inlineCompletion);\n\t});\n\n\tconstructor(\n\t\tprivate readonly _editor: ICodeEditor,\n\t\tprivate readonly _edit: IObservable<InlineEdit | undefined>,\n\t\tprivate readonly _model: IObservable<InlineCompletionsModel | undefined>,\n\t\tprivate readonly _focusIsInMenu: ISettableObservable<boolean>,\n\t\t@IInstantiationService instantiationService: IInstantiationService,\n\t) {\n\t\tsuper();\n\n\t\tthis._editorObs = observableCodeEditor(this._editor);\n\n\t\tthis._register(instantiationService.createInstance(InlineEditsView, this._editor, this._inlineEditHost, this._inlineEditModel, this._ghostTextIndicator, this._focusIsInMenu));\n\t}\n}\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { createHotClass } from '../../../../../../base/common/hotReloadHelpers.js';\nimport { Disposable } from '../../../../../../base/common/lifecycle.js';\nimport { derived, IObservable, ISettableObservable } 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 { LineRange } from '../../../../../common/core/ranges/lineRange.js';\nimport { Range } from '../../../../../common/core/range.js';\nimport { TextReplacement, TextEdit } from '../../../../../common/core/edits/textEdit.js';\nimport { TextModelText } from '../../../../../common/model/textModelText.js';\nimport { InlineCompletionsModel } from '../../model/inlineCompletionsModel.js';\nimport { InlineEdit } from '../../model/inlineEdit.js';\nimport { InlineEditWithChanges } from './inlineEditWithChanges.js';\nimport { GhostTextIndicator, InlineEditHost, InlineEditModel } from './inlineEditsModel.js';\nimport { InlineEditsView } from './inlineEditsView.js';\nimport { InlineEditTabAction } from './inlineEditsViewInterface.js';\n\nexport class InlineEditsViewAndDiffProducer extends Disposable { // TODO: This class is no longer a diff producer. Rename it or get rid of it\n\tpublic static readonly hot = createHotClass(InlineEditsViewAndDiffProducer);\n\n\tprivate readonly _editorObs: ObservableCodeEditor;\n\n\tprivate readonly _inlineEdit = derived<InlineEditWithChanges | undefined>(this, (reader) => {\n\t\tconst model = this._model.read(reader);\n\t\tif (!model) { return undefined; }\n\t\tconst inlineEdit = this._edit.read(reader);\n\t\tif (!inlineEdit) { return undefined; }\n\t\tconst textModel = this._editor.getModel();\n\t\tif (!textModel) { return undefined; }\n\n\t\tconst editOffset = model.inlineEditState.read(undefined)?.inlineCompletion.updatedEdit;\n\t\tif (!editOffset) { return undefined; }\n\n\t\tconst edits = editOffset.replacements.map(e => {\n\t\t\tconst innerEditRange = Range.fromPositions(\n\t\t\t\ttextModel.getPositionAt(e.replaceRange.start),\n\t\t\t\ttextModel.getPositionAt(e.replaceRange.endExclusive)\n\t\t\t);\n\t\t\treturn new TextReplacement(innerEditRange, e.newText);\n\t\t});\n\n\t\tconst diffEdits = new TextEdit(edits);\n\t\tconst text = new TextModelText(textModel);\n\n\t\treturn new InlineEditWithChanges(text, diffEdits, model.primaryPosition.read(undefined), model.allPositions.read(undefined), inlineEdit.commands, inlineEdit.inlineCompletion);\n\t});\n\n\tprivate readonly _inlineEditModel = derived<InlineEditModel | undefined>(this, reader => {\n\t\tconst model = this._model.read(reader);\n\t\tif (!model) { return undefined; }\n\t\tconst edit = this._inlineEdit.read(reader);\n\t\tif (!edit) { return undefined; }\n\n\t\tconst tabAction = derived<InlineEditTabAction>(this, reader => {\n\t\t\t/** @description tabAction */\n\t\t\tif (this._editorObs.isFocused.read(reader)) {\n\t\t\t\tif (model.tabShouldJumpToInlineEdit.read(reader)) { return InlineEditTabAction.Jump; }\n\t\t\t\tif (model.tabShouldAcceptInlineEdit.read(reader)) { return InlineEditTabAction.Accept; }\n\t\t\t}\n\t\t\treturn InlineEditTabAction.Inactive;\n\t\t});\n\n\t\treturn new InlineEditModel(model, edit, tabAction);\n\t});\n\n\tprivate readonly _inlineEditHost = derived<InlineEditHost | undefined>(this, reader => {\n\t\tconst model = this._model.read(reader);\n\t\tif (!model) { return undefined; }\n\t\treturn new InlineEditHost(model);\n\t});\n\n\tprivate readonly _ghostTextIndicator = derived<GhostTextIndicator | undefined>(this, reader => {\n\t\tconst model = this._model.read(reader);\n\t\tif (!model) { return undefined; }\n\t\tconst state = model.inlineCompletionState.read(reader);\n\t\tif (!state) { return undefined; }\n\t\tconst inlineCompletion = state.inlineCompletion;\n\t\tif (!inlineCompletion) { return undefined; }\n\n\t\tif (!inlineCompletion.showInlineEditMenu) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst lineRange = LineRange.ofLength(state.primaryGhostText.lineNumber, 1);\n\n\t\treturn new GhostTextIndicator(this._editor, model, lineRange, inlineCompletion);\n\t});\n\n\tconstructor(\n\t\tprivate readonly _editor: ICodeEditor,\n\t\tprivate readonly _edit: IObservable<InlineEdit | undefined>,\n\t\tprivate readonly _model: IObservable<InlineCompletionsModel | undefined>,\n\t\tprivate readonly _focusIsInMenu: ISettableObservable<boolean>,\n\t\t@IInstantiationService instantiationService: IInstantiationService,\n\t) {\n\t\tsuper();\n\n\t\tthis._editorObs = observableCodeEditor(this._editor);\n\n\t\tthis._register(instantiationService.createInstance(InlineEditsView, this._editor, this._inlineEditHost, this._inlineEditModel, this._ghostTextIndicator, this._focusIsInMenu));\n\t}\n}\n"]}
|
|
@@ -21,7 +21,7 @@ import { Disposable, DisposableStore } from '../../../../base/common/lifecycle.j
|
|
|
21
21
|
import { escapeRegExpCharacters } from '../../../../base/common/strings.js';
|
|
22
22
|
import { assertReturnsDefined } from '../../../../base/common/types.js';
|
|
23
23
|
import './parameterHints.css';
|
|
24
|
-
import { EDITOR_FONT_DEFAULTS } from '../../../common/config/
|
|
24
|
+
import { EDITOR_FONT_DEFAULTS } from '../../../common/config/fontInfo.js';
|
|
25
25
|
import { ILanguageService } from '../../../common/languages/language.js';
|
|
26
26
|
import { MarkdownRenderer } from '../../../browser/widget/markdownRenderer/browser/markdownRenderer.js';
|
|
27
27
|
import { Context } from './provideSignatureHelp.js';
|