monaco-editor-core 0.53.0 → 0.54.0-dev-20250910

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/esm/nls.keys.json +1 -1
  2. package/esm/nls.messages.de.js +2 -2
  3. package/esm/nls.messages.es.js +2 -2
  4. package/esm/nls.messages.fr.js +2 -2
  5. package/esm/nls.messages.it.js +2 -2
  6. package/esm/nls.messages.ja.js +2 -2
  7. package/esm/nls.messages.js +1 -1
  8. package/esm/nls.messages.json +1 -1
  9. package/esm/nls.messages.ko.js +2 -2
  10. package/esm/nls.messages.ru.js +2 -2
  11. package/esm/nls.messages.zh-cn.js +2 -2
  12. package/esm/nls.messages.zh-tw.js +2 -2
  13. package/esm/nls.metadata.json +0 -2
  14. package/esm/vs/base/browser/domSanitize.js +18 -8
  15. package/esm/vs/base/browser/domSanitize.js.map +1 -1
  16. package/esm/vs/base/browser/domStylesheets.js +3 -0
  17. package/esm/vs/base/browser/domStylesheets.js.map +1 -1
  18. package/esm/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
  19. package/esm/vs/base/browser/ui/dropdown/dropdown.js +1 -2
  20. package/esm/vs/base/browser/ui/dropdown/dropdown.js.map +1 -1
  21. package/esm/vs/base/common/async.js +6 -173
  22. package/esm/vs/base/common/async.js.map +1 -1
  23. package/esm/vs/base/common/fuzzyScorer.js +6 -3
  24. package/esm/vs/base/common/fuzzyScorer.js.map +1 -1
  25. package/esm/vs/base/common/strings.js +0 -3
  26. package/esm/vs/base/common/strings.js.map +1 -1
  27. package/esm/vs/editor/browser/controller/editContext/native/screenReaderContentRich.js +23 -13
  28. package/esm/vs/editor/browser/controller/editContext/native/screenReaderContentRich.js.map +1 -1
  29. package/esm/vs/editor/browser/services/hoverService/hover.css +1 -1
  30. package/esm/vs/editor/common/config/editorOptions.js +1 -1
  31. package/esm/vs/editor/common/config/editorOptions.js.map +1 -1
  32. package/esm/vs/editor/common/viewModel/screenReaderSimpleModel.js.map +1 -1
  33. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionsController.js +9 -4
  34. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionsController.js.map +1 -1
  35. package/esm/vs/editor/contrib/inlineCompletions/browser/model/provideInlineCompletions.js +2 -2
  36. package/esm/vs/editor/contrib/inlineCompletions/browser/model/provideInlineCompletions.js.map +1 -1
  37. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorMenu.js +15 -10
  38. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorMenu.js.map +1 -1
  39. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/view.css +13 -4
  40. package/esm/vs/editor/contrib/linesOperations/browser/linesOperations.js +5 -4
  41. package/esm/vs/editor/contrib/linesOperations/browser/linesOperations.js.map +1 -1
  42. package/esm/vs/editor/standalone/browser/quickInput/standaloneQuickInputService.js +1 -1
  43. package/esm/vs/editor/standalone/browser/quickInput/standaloneQuickInputService.js.map +1 -1
  44. package/esm/vs/platform/actionWidget/browser/actionList.js +2 -2
  45. package/esm/vs/platform/actionWidget/browser/actionList.js.map +1 -1
  46. package/esm/vs/platform/actionWidget/browser/actionWidget.css +11 -12
  47. package/esm/vs/platform/actions/browser/actionViewItemService.js.map +1 -1
  48. package/esm/vs/platform/actions/browser/toolbar.js +3 -3
  49. package/esm/vs/platform/actions/browser/toolbar.js.map +1 -1
  50. package/esm/vs/platform/contextkey/common/contextkeys.js +1 -2
  51. package/esm/vs/platform/contextkey/common/contextkeys.js.map +1 -1
  52. package/esm/vs/platform/contextkey/common/scanner.js +5 -5
  53. package/esm/vs/platform/history/browser/contextScopedHistoryWidget.js +1 -1
  54. package/esm/vs/platform/keybinding/common/abstractKeybindingService.js +4 -4
  55. package/esm/vs/platform/list/browser/listService.js +27 -27
  56. package/esm/vs/platform/markers/common/markerService.js +2 -2
  57. package/esm/vs/platform/markers/common/markers.js +6 -6
  58. package/esm/vs/platform/quickinput/browser/commandsQuickAccess.js +7 -7
  59. package/esm/vs/platform/quickinput/browser/helpQuickAccess.js +1 -1
  60. package/esm/vs/platform/quickinput/browser/quickInput.js +10 -10
  61. package/esm/vs/platform/quickinput/browser/quickInputActions.js +3 -3
  62. package/esm/vs/platform/quickinput/browser/quickInputController.js +6 -6
  63. package/esm/vs/platform/quickinput/browser/quickInputList.js +1 -1
  64. package/esm/vs/platform/quickinput/browser/quickInputUtils.js +1 -1
  65. package/esm/vs/platform/quickinput/browser/tree/quickInputTreeAccessibilityProvider.js +1 -1
  66. package/esm/vs/platform/theme/common/colorUtils.js +2 -2
  67. package/esm/vs/platform/theme/common/colors/baseColors.js +17 -17
  68. package/esm/vs/platform/theme/common/colors/chartsColors.js +8 -8
  69. package/esm/vs/platform/theme/common/colors/editorColors.js +95 -95
  70. package/esm/vs/platform/theme/common/colors/inputColors.js +47 -47
  71. package/esm/vs/platform/theme/common/colors/listColors.js +36 -36
  72. package/esm/vs/platform/theme/common/colors/menuColors.js +7 -7
  73. package/esm/vs/platform/theme/common/colors/minimapColors.js +11 -11
  74. package/esm/vs/platform/theme/common/colors/miscColors.js +15 -15
  75. package/esm/vs/platform/theme/common/colors/quickpickColors.js +9 -9
  76. package/esm/vs/platform/theme/common/colors/searchColors.js +3 -3
  77. package/esm/vs/platform/theme/common/iconRegistry.js +6 -6
  78. package/esm/vs/platform/undoRedo/common/undoRedoService.js +20 -20
  79. package/esm/vs/platform/workspace/common/workspace.js +1 -1
  80. package/package.json +2 -2
  81. package/version.txt +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/editor/common/viewModel/screenReaderSimpleModel.ts","vs/editor/common/viewModel/screenReaderSimpleModel.ts"],"names":[],"mappings":"AAAA;;;gGAGgG","file":"screenReaderSimpleModel.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 { Position } from '../core/position.js';\nimport { Range } from '../core/range.js';\nimport { EndOfLinePreference } from '../model.js';\n\nexport interface ISimpleModel {\n\tgetLineCount(): number;\n\tgetLineMaxColumn(lineNumber: number): number;\n\tgetValueInRange(range: Range, eol: EndOfLinePreference): string;\n\tgetValueLengthInRange(range: Range, eol: EndOfLinePreference): number;\n\tmodifyPosition(position: Position, offset: number): Position;\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 { Position } from '../core/position.js';\nimport { Range } from '../core/range.js';\nimport { EndOfLinePreference } from '../model.js';\n\nexport interface ISimpleModel {\n\tgetLineCount(): number;\n\tgetLineMaxColumn(lineNumber: number): number;\n\tgetValueInRange(range: Range, eol: EndOfLinePreference): string;\n\tgetValueLengthInRange(range: Range, eol: EndOfLinePreference): number;\n\tmodifyPosition(position: Position, offset: number): Position;\n}\n"]}
1
+ {"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/editor/common/viewModel/screenReaderSimpleModel.ts","vs/editor/common/viewModel/screenReaderSimpleModel.ts"],"names":[],"mappings":"AAAA;;;gGAGgG","file":"screenReaderSimpleModel.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 { Position } from '../core/position.js';\nimport { Range } from '../core/range.js';\nimport { EndOfLinePreference } from '../model.js';\n\nexport interface ISimpleModel {\n\tgetLineContent(lineNumber: number): string;\n\tgetLineCount(): number;\n\tgetLineMaxColumn(lineNumber: number): number;\n\tgetValueInRange(range: Range, eol: EndOfLinePreference): string;\n\tgetValueLengthInRange(range: Range, eol: EndOfLinePreference): number;\n\tmodifyPosition(position: Position, offset: number): Position;\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 { Position } from '../core/position.js';\nimport { Range } from '../core/range.js';\nimport { EndOfLinePreference } from '../model.js';\n\nexport interface ISimpleModel {\n\tgetLineContent(lineNumber: number): string;\n\tgetLineCount(): number;\n\tgetLineMaxColumn(lineNumber: number): number;\n\tgetValueInRange(range: Range, eol: EndOfLinePreference): string;\n\tgetValueLengthInRange(range: Range, eol: EndOfLinePreference): number;\n\tmodifyPosition(position: Position, offset: number): Position;\n}\n"]}
@@ -278,15 +278,20 @@ let InlineCompletionsController = class InlineCompletionsController extends Disp
278
278
  return {};
279
279
  }), async (_value, _, _deltas, store) => {
280
280
  /** @description InlineCompletionsController.playAccessibilitySignalAndReadSuggestion */
281
- const model = this.model.get();
282
- const state = model?.state.get();
281
+ let model = this.model.get();
282
+ let state = model?.state.get();
283
283
  if (!state || !model) {
284
284
  return;
285
285
  }
286
- const lineText = state.kind === 'ghostText' ? model.textModel.getLineContent(state.primaryGhostText.lineNumber) : '';
287
286
  await timeout(50, cancelOnDispose(store));
288
287
  await waitForState(this._suggestWidgetAdapter.selectedItem, isUndefined, () => false, cancelOnDispose(store));
289
- await this._accessibilitySignalService.playSignal(state.kind === 'ghostText' ? AccessibilitySignal.inlineSuggestion : AccessibilitySignal.nextEditSuggestion);
288
+ model = this.model.get();
289
+ state = model?.state.get();
290
+ if (!state || !model) {
291
+ return;
292
+ }
293
+ const lineText = state.kind === 'ghostText' ? model.textModel.getLineContent(state.primaryGhostText.lineNumber) : '';
294
+ this._accessibilitySignalService.playSignal(state.kind === 'ghostText' ? AccessibilitySignal.inlineSuggestion : AccessibilitySignal.nextEditSuggestion);
290
295
  if (this.editor.getOption(12 /* EditorOption.screenReaderAnnounceInlineSuggestion */)) {
291
296
  if (state.kind === 'ghostText') {
292
297
  this._provideScreenReaderUpdate(state.primaryGhostText.renderForScreenReader(lineText));
@@ -1 +1 @@
1
- {"version":3,"sources":["vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionsController.ts"],"names":[],"mappings":"AAAA;;;gGAGgG;;;;;;;;;;;AAEhG,OAAO,EAAE,KAAK,EAAE,MAAM,6CAA6C,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAC7E,OAAO,EAAE,cAAc,EAAE,MAAM,gDAAgD,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,EAAgB,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,eAAe,EAAE,WAAW,EAAE,oBAAoB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,0CAA0C,CAAC;AAC/P,OAAO,EAAE,OAAO,EAAE,MAAM,yCAAyC,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+DAA+D,CAAC;AACtG,OAAO,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,mFAAmF,CAAC;AACrJ,OAAO,EAAE,eAAe,EAAE,MAAM,qDAAqD,CAAC;AACtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,+DAA+D,CAAC;AACtG,OAAO,EAAE,kBAAkB,EAAE,MAAM,yDAAyD,CAAC;AAC7F,OAAO,EAAE,qBAAqB,EAAoB,MAAM,+DAA+D,CAAC;AACxH,OAAO,EAAE,kBAAkB,EAAE,MAAM,yDAAyD,CAAC;AAC7F,OAAO,EAAE,2BAA2B,EAAE,MAAM,6DAA6D,CAAC;AAC1G,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE1E,OAAO,EAAE,oBAAoB,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,MAAM,mEAAmE,CAAC;AAEnG,OAAO,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAG/D,OAAO,EAAE,+BAA+B,EAAE,MAAM,wDAAwD,CAAC;AACzG,OAAO,EAAE,wBAAwB,EAAE,MAAM,iDAAiD,CAAC;AAC3F,OAAO,EAAE,kCAAkC,EAAE,MAAM,gDAAgD,CAAC;AACpG,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,EAAE,8BAA8B,EAAE,MAAM,kCAAkC,CAAC;AAClF,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAExE,IAAM,2BAA2B,GAAjC,MAAM,2BAA4B,SAAQ,UAAU;;aAClC,eAAU,GAAG,IAAI,GAAG,EAAV,AAAyC,CAAC;aAE9D,QAAG,GAAG,cAAc,CAAC,6BAA2B,CAA7C,AAA8C,CAAC;aAClD,OAAE,GAAG,4CAAH,AAA+C,CAAC;IAEhE;;OAEG;IACI,MAAM,CAAC,0BAA0B,CAAC,QAA0B;QAClE,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC7C,IAAI,CAAC,WAAW,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QACb,CAAC;QACD,OAAO,6BAA2B,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACrD,CAAC;IAEM,MAAM,CAAC,GAAG,CAAC,MAAmB;QACpC,OAAO,2BAA2B,CAAC,MAAM,CAAC,eAAe,CAA8B,6BAA2B,CAAC,EAAE,CAAC,CAAC,CAAC;IACzH,CAAC;IA2BD,YACiB,MAAmB,EACK,qBAA4C,EAC/C,kBAAsC,EACnC,qBAA4C,EAClD,eAAgC,EAChB,gBAAiD,EACxD,wBAAkD,EAC/C,2BAAwD,EACjE,kBAAsC,EACnC,qBAA4C;QAEpF,KAAK,EAAE,CAAC;QAXQ,WAAM,GAAN,MAAM,CAAa;QACK,0BAAqB,GAArB,qBAAqB,CAAuB;QAC/C,uBAAkB,GAAlB,kBAAkB,CAAoB;QACnC,0BAAqB,GAArB,qBAAqB,CAAuB;QAClD,oBAAe,GAAf,eAAe,CAAiB;QAChB,qBAAgB,GAAhB,gBAAgB,CAAiC;QACxD,6BAAwB,GAAxB,wBAAwB,CAA0B;QAC/C,gCAA2B,GAA3B,2BAA2B,CAA6B;QACjE,uBAAkB,GAAlB,kBAAkB,CAAoB;QACnC,0BAAqB,GAArB,qBAAqB,CAAuB;QAGpF,IAAI,CAAC,UAAU,GAAG,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACzI,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,8BAA8B,CAC7E,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,qBAAqB,CAAC,IAAI,CAAC,EACrD,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,wBAAwB,CAAC,GAAG,EAAE,EAAE,iBAAiB,EAAE,CAC3E,CAAC,CAAC;QACH,IAAI,CAAC,gBAAgB,GAAG,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,wBAAwB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,qCAA4B,CAAC,OAAO,CAAC,CAAC;QACzJ,IAAI,CAAC,sBAAsB,GAAG,mBAAmB,CAAC,IAAI,EAAE,IAAI,CAAC,qBAAqB,CAAC,gCAAgC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,uBAAuB,EAAE,CAAC,CAAC;QACjL,IAAI,CAAC,0BAA0B,GAAG,mBAAmB,CAAC,IAAI,EACzD,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,EAC1C,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,4BAA4B,CAAC,KAAK,IAAI,CAClH,CAAC;QACF,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC5K,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAC9C,IAAI,CAAC,wBAAwB,CAAC,yBAAyB,EACvD,2BAA2B,EAC3B,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CACpB,CAAC;QACF,IAAI,CAAC,cAAc,GAAG,eAAe,CAAU,IAAI,EAAE,KAAK,CAAC,CAAC;QAC5D,IAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE;YACpD,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC9D,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtD,OAAO,cAAc,IAAI,YAAY,CAAC;QACvC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE;YACpD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC9D,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;gBAAC,OAAO,KAAK,CAAC;YAAC,CAAC;YACzC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjD,IAAI,CAAC,KAAK,EAAE,CAAC;gBAAC,OAAO,KAAK,CAAC;YAAC,CAAC;YAC7B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvC,MAAM,eAAe,GAAG,KAAK,CAAC,mBAAmB,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YACxE,OAAO,SAAS,CAAC,MAAM,IAAI,eAAe,CAAC;QAC5C,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,iBAAiB,CAAqC,IAAI,EAAE,MAAM,CAAC,EAAE;YACjF,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAAC,OAAO,SAAS,CAAC;YAAC,CAAC;YAClE,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrD,IAAI,CAAC,SAAS,EAAE,CAAC;gBAAC,OAAO,SAAS,CAAC;YAAC,CAAC;YAErC,MAAM,KAAK,GAA2B,IAAI,CAAC,qBAAqB,CAAC,cAAc,CAC9E,sBAAsB,EACtB,SAAS,EACT,IAAI,CAAC,qBAAqB,CAAC,YAAY,EACvC,IAAI,CAAC,UAAU,CAAC,SAAS,EACzB,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,MAAM,CACX,CAAC;YACF,OAAO,KAAK,CAAC;QACd,CAAC,CAAC,CAAC,6BAA6B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9C,IAAI,CAAC,wBAAwB,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,gCAAgC,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,qCAA4B,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAC/G,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,qBAAqB,CAAC,cAAc,CAAC,qBAAqB,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;QAE5I,6BAA2B,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,6BAA2B,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAExF,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YAC/B,4DAA4D;YAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,CAAC,KAAK,EAAE,CAAC;gBAAC,OAAO;YAAC,CAAC;YACvB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvC,IAAI,CAAC,KAAK,EAAE,CAAC;gBAAC,OAAO;YAAC,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,GAAG,EAAE,EAAE,CAAC;gBAAC,OAAO;YAAC,CAAC;YAEnD,oDAAoD;YACpD,uGAAuG;YACvG,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;YAChF,KAAK,MAAM,IAAI,IAAI,6BAA2B,CAAC,UAAU,EAAE,CAAC;gBAC3D,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;oBACnB,SAAS;gBACV,CAAC;qBAAM,IAAI,WAAW,IAAI,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;oBAC7E,0EAA0E;oBAC1E,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC;gBAC7B,CAAC;qBAAM,CAAC;oBACP,IAAI,CAAC,MAAM,EAAE,CAAC;gBACf,CAAC;YACF,CAAC;QACF,CAAC,CAAC,CAAC,CAAC;QACJ,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YAC/B,4DAA4D;YAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC;YACxC,IAAI,CAAC,KAAK,IAAI,CAAC,GAAG,EAAE,CAAC;gBAAC,OAAO;YAAC,CAAC;YAE/B,kFAAkF;YAClF,oDAAoD;YACpD,kGAAkG;YAClG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;gBACvC,KAAK,MAAM,IAAI,IAAI,6BAA2B,CAAC,UAAU,EAAE,CAAC;oBAC3D,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;wBACnB,SAAS;oBACV,CAAC;oBACD,wDAAwD;oBACxD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;oBAC5C,IAAI,KAAK,EAAE,IAAI,KAAK,YAAY,IAAI,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,EAAE,CAAC;wBACrE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;oBACrC,CAAC;gBACF,CAAC;YACF,CAAC,CAAC,CAAC,CAAC;QAEL,CAAC,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;YAC1E,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC;gBACzB,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC;YAC7B,CAAC;QACF,CAAC,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;YAC3E,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC;gBACzB,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC;YAC7B,CAAC;QACF,CAAC,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,EAAE;YAC7D,0CAA0C;YAC1C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC;gBACxB,mBAAmB,CAAC,GAAG,CAAC,EAAE;gBAC1B,mBAAmB,CAAC,UAAU,CAAC,EAAE;gBACjC,mBAAmB,CAAC,WAAW,CAAC,EAAE;gBAClC,qBAAqB;gBACrB,0BAA0B;aAC1B,CAAC,CAAC;YACH,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC;gBAC/E,IAAI,OAAO,GAAG,KAAK,CAAC;gBACpB,IAAI,CAAC,CAAC,SAAS,KAAK,qBAAqB,EAAE,CAAC;oBAC3C,OAAO,GAAG,IAAI,CAAC;gBAChB,CAAC;gBACD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE;oBAChC,uCAAuC;oBACvC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC5C,CAAC,CAAC,CAAC;YACJ,CAAC;QACF,CAAC,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE;YAC7E,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,wCAAgC,IAAI,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,EAAE,CAAC;gBACvF,IAAI,CAAC,IAAI,CAAC,gCAAgC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,IAAI,KAAK,YAAY,EAAE,CAAC;oBAC1G,OAAO;gBACR,CAAC;gBACD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;gBAC3B,IAAI,CAAC,CAAC,EAAE,CAAC;oBAAC,OAAO;gBAAC,CAAC;gBACnB,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;oBACzC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC;gBAC1B,CAAC;YACF,CAAC;QACF,CAAC,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YAC/B,IAAI,SAAS,EAAE,CAAC;gBACf,wEAAwE;gBACxE,0BAA0B;gBAC1B,MAAM,KAAK,GAAG,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;gBAClC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;oBACjE,WAAW,CAAC,EAAE,CAAC,EAAE;wBAChB,KAAK,MAAM,IAAI,IAAI,6BAA2B,CAAC,UAAU,EAAE,CAAC;4BAC3D,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gCACnB,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;4BACzC,CAAC;wBACF,CAAC;oBACF,CAAC,CAAC,CAAC;gBACJ,CAAC;gBACD,OAAO;YACR,CAAC;YAED,qDAAqD;YACrD,IAAI,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,CAAU,uBAAuB,CAAC;mBAC5E,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,iCAAiC,CAAC;mBACtE,MAAM,CAAC,SAAS,qCAA4B,CAAC,UAAU;mBACvD,kCAAkC,CAAC,eAAe,EAAE,CAAC;gBACxD,OAAO;YACR,CAAC;YAED,IAAI,CAAC,KAAK,EAAE,CAAC;gBAAC,OAAO;YAAC,CAAC;YACvB,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,gBAAgB,EAAE,qBAAqB,IAAI,KAAK,CAAC,mBAAmB,CAAC,GAAG,EAAE,EAAE,CAAC;gBACnG,2DAA2D;gBAC3D,OAAO;YACR,CAAC;YAED,WAAW,CAAC,EAAE,CAAC,EAAE;gBAChB,qEAAqE;gBACrE,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YAC/B,mEAAmE;YACnE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC1E,IAAI,KAAK,EAAE,WAAW,EAAE,CAAC;gBACxB,IAAI,KAAK,CAAC,gBAAgB,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC;oBAC3C,IAAI,CAAC,qBAAqB,CAAC,mBAAmB,EAAE,CAAC;gBAClD,CAAC;YACF,CAAC;iBAAM,CAAC;gBACP,IAAI,CAAC,qBAAqB,CAAC,uBAAuB,EAAE,CAAC;YACtD,CAAC;QACF,CAAC,CAAC,CAAC,CAAC;QACJ,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE;YAChC,IAAI,CAAC,qBAAqB,CAAC,uBAAuB,EAAE,CAAC;QACtD,CAAC,CAAC,CAAC,CAAC;QAEJ,MAAM,mCAAmC,GAAG,0BAA0B,CAAqB,IAAI,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;YACjH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtC,MAAM,KAAK,GAAG,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC;gBACnD,OAAO,IAAI,CAAC;YACb,CAAC;YACD,OAAO,KAAK,EAAE,gBAAgB,EAAE,UAAU,CAAC;QAC5C,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YACpD,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3C,mCAAmC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjD,OAAO,EAAE,CAAC;QACX,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;YACvC,wFAAwF;YACxF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;YACjC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;gBAAC,OAAO;YAAC,CAAC;YACjC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAErH,MAAM,OAAO,CAAC,EAAE,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;YAC1C,MAAM,YAAY,CAAC,IAAI,CAAC,qBAAqB,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;YAC9G,MAAM,IAAI,CAAC,2BAA2B,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAAC,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;YAE9J,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,4DAAmD,EAAE,CAAC;gBAC9E,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;oBAChC,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACzF,CAAC;qBAAM,CAAC;oBACP,IAAI,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC,CAAC,uBAAuB;gBAC7D,CAAC;YACF,CAAC;QACF,CAAC,CAAC,CAAC,CAAC;QAEJ,cAAc;QACd,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,qBAAqB,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE;YACtE,IAAI,CAAC,CAAC,oBAAoB,CAAC,2CAA2C,CAAC,EAAE,CAAC;gBACzE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,qCAAqC,EAAE,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,2CAA2C,CAAC,EAAE,CAAC,CAAC;YACxJ,CAAC;QACF,CAAC,CAAC,CAAC,CAAC;QACJ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,qCAAqC,EAAE,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,2CAA2C,CAAC,EAAE,CAAC,CAAC;QAEvJ,MAAM,gBAAgB,GAAG,IAAI,2BAA2B,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAElF,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,2BAA2B,CAAC,mBAAmB,EAAE,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;QACpH,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,2BAA2B,CAAC,YAAY,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QACpJ,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,2BAA2B,CAAC,kBAAkB,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACxL,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,2BAA2B,CAAC,yBAAyB,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/J,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,2BAA2B,CAAC,yBAAyB,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/J,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,2BAA2B,CAAC,iBAAiB,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC;QACpK,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,2BAA2B,CAAC,8BAA8B,EAC9F,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC,MAAM,CAAC,EAAE,qBAAqB,CACpF,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,2BAA2B,CAAC,6CAA6C,EAC7G,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAC,MAAM,CAAC,EAAE,oCAAoC,CACnG,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,2BAA2B,CAAC,mBAAmB,EAAE,MAAM,CAAC,EAAE;YAC9F,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtC,MAAM,KAAK,GAAG,KAAK,EAAE,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxD,OAAO,KAAK,EAAE,gBAAgB,IAAI,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7I,CAAC,CAAC,CAAC,CAAC;QACJ,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,2BAA2B,CAAC,uBAAuB,EAAE,MAAM,CAAC,EAAE;YAClG,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtC,MAAM,KAAK,GAAG,KAAK,EAAE,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxD,OAAO,CAAC,CAAC,KAAK,EAAE,gBAAgB,IAAI,KAAK,EAAE,gBAAgB,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE,gBAAgB,CAAC,OAAO,EAAE,CAAC;QACjH,CAAC,CAAC,CAAC,CAAC;QACJ,MAAM,iBAAiB,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE;YAChD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtC,MAAM,KAAK,GAAG,KAAK,EAAE,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxD,MAAM,gBAAgB,GAAG,KAAK,EAAE,gBAAgB,CAAC;YACjD,IAAI,CAAC,gBAAgB,IAAI,gBAAgB,CAAC,OAAO,EAAE,EAAE,CAAC;gBACrD,OAAO,SAAS,CAAC;YAClB,CAAC;YACD,MAAM,YAAY,GAAG,IAAI,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACjG,OAAO,YAAY,CAAC;QACrB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,2BAA2B,CAAC,qBAAqB,EAAE,MAAM,CAAC,EAAE;YAChG,MAAM,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpD,IAAI,CAAC,YAAY,EAAE,CAAC;gBACnB,OAAO,KAAK,CAAC;YACd,CAAC;YACD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC9D,IAAI,CAAC,SAAS,EAAE,CAAC;gBAChB,OAAO,KAAK,CAAC;YACd,CAAC;YACD,OAAO,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC,CAAC;QAEJ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,qBAAqB,CAAC,cAAc,CAAC,uBAAuB,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACjG,CAAC;IAEM,uBAAuB,CAAC,EAAgB;QAC9C,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC;IAEO,0BAA0B,CAAC,OAAe;QACjD,MAAM,qBAAqB,GAAG,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,CAAU,uBAAuB,CAAC,CAAC;QAC3G,MAAM,wBAAwB,GAAG,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,8BAA8B,CAAC,CAAC;QAC1G,IAAI,IAAwB,CAAC;QAC7B,IAAI,CAAC,qBAAqB,IAAI,wBAAwB,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,8DAAoD,EAAE,CAAC;YACrI,IAAI,GAAG,QAAQ,CAAC,IAAwB,EAAE,2CAA2C,EAAE,wBAAwB,CAAC,YAAY,EAAE,CAAC,CAAC;QACjI,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC;IAEM,iBAAiB,CAAC,KAAY;QACpC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC,GAAG,EAAE,CAAC;QAC3D,IAAI,CAAC,SAAS,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC;QACd,CAAC;QACD,OAAO,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACxG,CAAC;IAEM,yBAAyB,CAAC,UAAkB;QAClD,OAAO,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,UAAU,CAAC,CAAC;IACzD,CAAC;IAEM,MAAM;QACZ,WAAW,CAAC,EAAE,CAAC,EAAE;YAChB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YAC3B,IAAI,CAAC,EAAE,CAAC;gBACP,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;gBAC7B,4DAA4D;gBAC5D,IAAI,IAAI,CAAC,sBAAsB,CAAC,GAAG,EAAE,EAAE,CAAC;oBACvC,KAAK,MAAM,IAAI,IAAI,6BAA2B,CAAC,UAAU,EAAE,CAAC;wBAC3D,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;4BACnB,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;wBACzC,CAAC;oBACF,CAAC;gBACF,CAAC;YACF,CAAC;QACF,CAAC,CAAC,CAAC;IACJ,CAAC;IAEM,IAAI;QACV,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC,EAAE,CAAC;YACP,CAAC,CAAC,IAAI,EAAE,CAAC;QACV,CAAC;IACF,CAAC;;AAhZW,2BAA2B;IAgDrC,WAAA,qBAAqB,CAAA;IACrB,WAAA,kBAAkB,CAAA;IAClB,WAAA,qBAAqB,CAAA;IACrB,WAAA,eAAe,CAAA;IACf,WAAA,+BAA+B,CAAA;IAC/B,WAAA,wBAAwB,CAAA;IACxB,WAAA,2BAA2B,CAAA;IAC3B,WAAA,kBAAkB,CAAA;IAClB,WAAA,qBAAqB,CAAA;GAxDX,2BAA2B,CAiZvC","file":"inlineCompletionsController.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 { alert } from '../../../../../base/browser/ui/aria/aria.js';\nimport { timeout } from '../../../../../base/common/async.js';\nimport { cancelOnDispose } from '../../../../../base/common/cancellation.js';\nimport { createHotClass } from '../../../../../base/common/hotReloadHelpers.js';\nimport { Disposable, toDisposable } from '../../../../../base/common/lifecycle.js';\nimport { ITransaction, autorun, derived, derivedDisposable, derivedObservableWithCache, observableFromEvent, observableSignal, observableValue, runOnChange, runOnChangeWithStore, transaction, waitForState } from '../../../../../base/common/observable.js';\nimport { isEqual } from '../../../../../base/common/resources.js';\nimport { isUndefined } from '../../../../../base/common/types.js';\nimport { localize } from '../../../../../nls.js';\nimport { IAccessibilityService } from '../../../../../platform/accessibility/common/accessibility.js';\nimport { AccessibilitySignal, IAccessibilitySignalService } from '../../../../../platform/accessibilitySignal/browser/accessibilitySignalService.js';\nimport { ICommandService } from '../../../../../platform/commands/common/commands.js';\nimport { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js';\nimport { IContextKeyService } from '../../../../../platform/contextkey/common/contextkey.js';\nimport { IInstantiationService, ServicesAccessor } from '../../../../../platform/instantiation/common/instantiation.js';\nimport { IKeybindingService } from '../../../../../platform/keybinding/common/keybinding.js';\nimport { hotClassGetOriginalInstance } from '../../../../../platform/observable/common/wrapInHotClass.js';\nimport { CoreEditingCommands } from '../../../../browser/coreCommands.js';\nimport { ICodeEditor } from '../../../../browser/editorBrowser.js';\nimport { observableCodeEditor } from '../../../../browser/observableCodeEditor.js';\nimport { getOuterEditor } from '../../../../browser/widget/codeEditor/embeddedCodeEditorWidget.js';\nimport { EditorOption } from '../../../../common/config/editorOptions.js';\nimport { Position } from '../../../../common/core/position.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { CursorChangeReason } from '../../../../common/cursorEvents.js';\nimport { ILanguageFeatureDebounceService } from '../../../../common/services/languageFeatureDebounce.js';\nimport { ILanguageFeaturesService } from '../../../../common/services/languageFeatures.js';\nimport { InlineSuggestionHintsContentWidget } from '../hintsWidget/inlineCompletionsHintsWidget.js';\nimport { TextModelChangeRecorder } from '../model/changeRecorder.js';\nimport { InlineCompletionsModel } from '../model/inlineCompletionsModel.js';\nimport { ObservableSuggestWidgetAdapter } from '../model/suggestWidgetAdapter.js';\nimport { ObservableContextKeyService } from '../utils.js';\nimport { InlineCompletionsView } from '../view/inlineCompletionsView.js';\nimport { inlineSuggestCommitId } from './commandIds.js';\nimport { InlineCompletionContextKeys } from './inlineCompletionContextKeys.js';\n\nexport class InlineCompletionsController extends Disposable {\n\tprivate static readonly _instances = new Set<InlineCompletionsController>();\n\n\tpublic static hot = createHotClass(InlineCompletionsController);\n\tpublic static ID = 'editor.contrib.inlineCompletionsController';\n\n\t/**\n\t * Find the controller in the focused editor or in the outer editor (if applicable)\n\t */\n\tpublic static getInFocusedEditorOrParent(accessor: ServicesAccessor): InlineCompletionsController | null {\n\t\tconst outerEditor = getOuterEditor(accessor);\n\t\tif (!outerEditor) {\n\t\t\treturn null;\n\t\t}\n\t\treturn InlineCompletionsController.get(outerEditor);\n\t}\n\n\tpublic static get(editor: ICodeEditor): InlineCompletionsController | null {\n\t\treturn hotClassGetOriginalInstance(editor.getContribution<InlineCompletionsController>(InlineCompletionsController.ID));\n\t}\n\n\tprivate readonly _editorObs;\n\tprivate readonly _positions;\n\n\tprivate readonly _suggestWidgetAdapter;\n\n\tprivate readonly _enabledInConfig;\n\tprivate readonly _isScreenReaderEnabled;\n\tprivate readonly _editorDictationInProgress;\n\tprivate readonly _enabled;\n\n\tprivate readonly _debounceValue;\n\n\tprivate readonly _focusIsInMenu;\n\tprivate readonly _focusIsInEditorOrMenu;\n\n\tprivate readonly _cursorIsInIndentation;\n\n\tpublic readonly model;\n\n\tprivate readonly _playAccessibilitySignal;\n\n\tprivate readonly _hideInlineEditOnSelectionChange;\n\n\tprotected readonly _view;\n\n\tconstructor(\n\t\tpublic readonly editor: ICodeEditor,\n\t\t@IInstantiationService private readonly _instantiationService: IInstantiationService,\n\t\t@IContextKeyService private readonly _contextKeyService: IContextKeyService,\n\t\t@IConfigurationService private readonly _configurationService: IConfigurationService,\n\t\t@ICommandService private readonly _commandService: ICommandService,\n\t\t@ILanguageFeatureDebounceService private readonly _debounceService: ILanguageFeatureDebounceService,\n\t\t@ILanguageFeaturesService private readonly _languageFeaturesService: ILanguageFeaturesService,\n\t\t@IAccessibilitySignalService private readonly _accessibilitySignalService: IAccessibilitySignalService,\n\t\t@IKeybindingService private readonly _keybindingService: IKeybindingService,\n\t\t@IAccessibilityService private readonly _accessibilityService: IAccessibilityService,\n\t) {\n\t\tsuper();\n\t\tthis._editorObs = observableCodeEditor(this.editor);\n\t\tthis._positions = derived(this, reader => this._editorObs.selections.read(reader)?.map(s => s.getEndPosition()) ?? [new Position(1, 1)]);\n\t\tthis._suggestWidgetAdapter = this._register(new ObservableSuggestWidgetAdapter(\n\t\t\tthis._editorObs,\n\t\t\titem => this.model.get()?.handleSuggestAccepted(item),\n\t\t\t() => this.model.get()?.selectedInlineCompletion.get()?.getSingleTextEdit(),\n\t\t));\n\t\tthis._enabledInConfig = observableFromEvent(this, this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.inlineSuggest).enabled);\n\t\tthis._isScreenReaderEnabled = observableFromEvent(this, this._accessibilityService.onDidChangeScreenReaderOptimized, () => this._accessibilityService.isScreenReaderOptimized());\n\t\tthis._editorDictationInProgress = observableFromEvent(this,\n\t\t\tthis._contextKeyService.onDidChangeContext,\n\t\t\t() => this._contextKeyService.getContext(this.editor.getDomNode()).getValue('editorDictation.inProgress') === true\n\t\t);\n\t\tthis._enabled = derived(this, reader => this._enabledInConfig.read(reader) && (!this._isScreenReaderEnabled.read(reader) || !this._editorDictationInProgress.read(reader)));\n\t\tthis._debounceValue = this._debounceService.for(\n\t\t\tthis._languageFeaturesService.inlineCompletionsProvider,\n\t\t\t'InlineCompletionsDebounce',\n\t\t\t{ min: 50, max: 50 }\n\t\t);\n\t\tthis._focusIsInMenu = observableValue<boolean>(this, false);\n\t\tthis._focusIsInEditorOrMenu = derived(this, reader => {\n\t\t\tconst editorHasFocus = this._editorObs.isFocused.read(reader);\n\t\t\tconst menuHasFocus = this._focusIsInMenu.read(reader);\n\t\t\treturn editorHasFocus || menuHasFocus;\n\t\t});\n\t\tthis._cursorIsInIndentation = derived(this, reader => {\n\t\t\tconst cursorPos = this._editorObs.cursorPosition.read(reader);\n\t\t\tif (cursorPos === null) { return false; }\n\t\t\tconst model = this._editorObs.model.read(reader);\n\t\t\tif (!model) { return false; }\n\t\t\tthis._editorObs.versionId.read(reader);\n\t\t\tconst indentMaxColumn = model.getLineIndentColumn(cursorPos.lineNumber);\n\t\t\treturn cursorPos.column <= indentMaxColumn;\n\t\t});\n\t\tthis.model = derivedDisposable<InlineCompletionsModel | undefined>(this, reader => {\n\t\t\tif (this._editorObs.isReadonly.read(reader)) { return undefined; }\n\t\t\tconst textModel = this._editorObs.model.read(reader);\n\t\t\tif (!textModel) { return undefined; }\n\n\t\t\tconst model: InlineCompletionsModel = this._instantiationService.createInstance(\n\t\t\t\tInlineCompletionsModel,\n\t\t\t\ttextModel,\n\t\t\t\tthis._suggestWidgetAdapter.selectedItem,\n\t\t\t\tthis._editorObs.versionId,\n\t\t\t\tthis._positions,\n\t\t\t\tthis._debounceValue,\n\t\t\t\tthis._enabled,\n\t\t\t\tthis.editor,\n\t\t\t);\n\t\t\treturn model;\n\t\t}).recomputeInitiallyAndOnChange(this._store);\n\t\tthis._playAccessibilitySignal = observableSignal(this);\n\t\tthis._hideInlineEditOnSelectionChange = this._editorObs.getOption(EditorOption.inlineSuggest).map(val => true);\n\t\tthis._view = this._register(this._instantiationService.createInstance(InlineCompletionsView, this.editor, this.model, this._focusIsInMenu));\n\n\t\tInlineCompletionsController._instances.add(this);\n\t\tthis._register(toDisposable(() => InlineCompletionsController._instances.delete(this)));\n\n\t\tthis._register(autorun(reader => {\n\t\t\t// Cancel all other inline completions when a new one starts\n\t\t\tconst model = this.model.read(reader);\n\t\t\tif (!model) { return; }\n\t\t\tconst state = model.state.read(reader);\n\t\t\tif (!state) { return; }\n\t\t\tif (!this._focusIsInEditorOrMenu.get()) { return; }\n\n\t\t\t// This controller is in focus, hence reject others.\n\t\t\t// However if we display a NES that relates to another edit then trigger NES on that related controller\n\t\t\tconst nextEditUri = state.kind === 'inlineEdit' ? state.nextEditUri : undefined;\n\t\t\tfor (const ctrl of InlineCompletionsController._instances) {\n\t\t\t\tif (ctrl === this) {\n\t\t\t\t\tcontinue;\n\t\t\t\t} else if (nextEditUri && isEqual(nextEditUri, ctrl.editor.getModel()?.uri)) {\n\t\t\t\t\t// The next edit in other edito is related to this controller, trigger it.\n\t\t\t\t\tctrl.model.get()?.trigger();\n\t\t\t\t} else {\n\t\t\t\t\tctrl.reject();\n\t\t\t\t}\n\t\t\t}\n\t\t}));\n\t\tthis._register(autorun(reader => {\n\t\t\t// Cancel all other inline completions when a new one starts\n\t\t\tconst model = this.model.read(reader);\n\t\t\tconst uri = this.editor.getModel()?.uri;\n\t\t\tif (!model || !uri) { return; }\n\n\t\t\t// This NES was accepted, its possible there is an NES that points to this editor.\n\t\t\t// I.e. there's an NES that reads `Go To Next Edit`,\n\t\t\t// If there is one that points to this editor, then we need to hide that as this NES was accepted.\n\t\t\treader.store.add(model.onDidAccept(() => {\n\t\t\t\tfor (const ctrl of InlineCompletionsController._instances) {\n\t\t\t\t\tif (ctrl === this) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\t// Find the nes from another editor that points to this.\n\t\t\t\t\tconst state = ctrl.model.get()?.state.get();\n\t\t\t\t\tif (state?.kind === 'inlineEdit' && isEqual(state.nextEditUri, uri)) {\n\t\t\t\t\t\tctrl.model.get()?.stop('automatic');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}));\n\n\t\t}));\n\n\t\tthis._register(runOnChange(this._editorObs.onDidType, (_value, _changes) => {\n\t\t\tif (this._enabled.get()) {\n\t\t\t\tthis.model.get()?.trigger();\n\t\t\t}\n\t\t}));\n\n\t\tthis._register(runOnChange(this._editorObs.onDidPaste, (_value, _changes) => {\n\t\t\tif (this._enabled.get()) {\n\t\t\t\tthis.model.get()?.trigger();\n\t\t\t}\n\t\t}));\n\n\t\tthis._register(this._commandService.onDidExecuteCommand((e) => {\n\t\t\t// These commands don't trigger onDidType.\n\t\t\tconst commands = new Set([\n\t\t\t\tCoreEditingCommands.Tab.id,\n\t\t\t\tCoreEditingCommands.DeleteLeft.id,\n\t\t\t\tCoreEditingCommands.DeleteRight.id,\n\t\t\t\tinlineSuggestCommitId,\n\t\t\t\t'acceptSelectedSuggestion',\n\t\t\t]);\n\t\t\tif (commands.has(e.commandId) && editor.hasTextFocus() && this._enabled.get()) {\n\t\t\t\tlet noDelay = false;\n\t\t\t\tif (e.commandId === inlineSuggestCommitId) {\n\t\t\t\t\tnoDelay = true;\n\t\t\t\t}\n\t\t\t\tthis._editorObs.forceUpdate(tx => {\n\t\t\t\t\t/** @description onDidExecuteCommand */\n\t\t\t\t\tthis.model.get()?.trigger(tx, { noDelay });\n\t\t\t\t});\n\t\t\t}\n\t\t}));\n\n\t\tthis._register(runOnChange(this._editorObs.selections, (_value, _, changes) => {\n\t\t\tif (changes.some(e => e.reason === CursorChangeReason.Explicit || e.source === 'api')) {\n\t\t\t\tif (!this._hideInlineEditOnSelectionChange.get() && this.model.get()?.state.get()?.kind === 'inlineEdit') {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst m = this.model.get();\n\t\t\t\tif (!m) { return; }\n\t\t\t\tif (m.state.get()?.kind === 'ghostText') {\n\t\t\t\t\tthis.model.get()?.stop();\n\t\t\t\t}\n\t\t\t}\n\t\t}));\n\n\t\tthis._register(autorun(reader => {\n\t\t\tconst isFocused = this._focusIsInEditorOrMenu.read(reader);\n\t\t\tconst model = this.model.get();\n\t\t\tif (isFocused) {\n\t\t\t\t// If this model already has an NES for another editor, then leave as is\n\t\t\t\t// Else stop other models.\n\t\t\t\tconst state = model?.state?.get();\n\t\t\t\tif (!state || state.kind !== 'inlineEdit' || !state.nextEditUri) {\n\t\t\t\t\ttransaction(tx => {\n\t\t\t\t\t\tfor (const ctrl of InlineCompletionsController._instances) {\n\t\t\t\t\t\t\tif (ctrl !== this) {\n\t\t\t\t\t\t\t\tctrl.model.get()?.stop('automatic', tx);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// This is a hidden setting very useful for debugging\n\t\t\tif (this._contextKeyService.getContextKeyValue<boolean>('accessibleViewIsShown')\n\t\t\t\t|| this._configurationService.getValue('editor.inlineSuggest.keepOnBlur')\n\t\t\t\t|| editor.getOption(EditorOption.inlineSuggest).keepOnBlur\n\t\t\t\t|| InlineSuggestionHintsContentWidget.dropDownVisible) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!model) { return; }\n\t\t\tif (model.state.get()?.inlineCompletion?.isFromExplicitRequest && model.inlineEditAvailable.get()) {\n\t\t\t\t// dont hide inline edits on blur when requested explicitly\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttransaction(tx => {\n\t\t\t\t/** @description InlineCompletionsController.onDidBlurEditorWidget */\n\t\t\t\tmodel.stop('automatic', tx);\n\t\t\t});\n\t\t}));\n\n\t\tthis._register(autorun(reader => {\n\t\t\t/** @description InlineCompletionsController.forceRenderingAbove */\n\t\t\tconst state = this.model.read(reader)?.inlineCompletionState.read(reader);\n\t\t\tif (state?.suggestItem) {\n\t\t\t\tif (state.primaryGhostText.lineCount >= 2) {\n\t\t\t\t\tthis._suggestWidgetAdapter.forceRenderingAbove();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis._suggestWidgetAdapter.stopForceRenderingAbove();\n\t\t\t}\n\t\t}));\n\t\tthis._register(toDisposable(() => {\n\t\t\tthis._suggestWidgetAdapter.stopForceRenderingAbove();\n\t\t}));\n\n\t\tconst currentInlineCompletionBySemanticId = derivedObservableWithCache<string | undefined>(this, (reader, last) => {\n\t\t\tconst model = this.model.read(reader);\n\t\t\tconst state = model?.state.read(reader);\n\t\t\tif (this._suggestWidgetAdapter.selectedItem.get()) {\n\t\t\t\treturn last;\n\t\t\t}\n\t\t\treturn state?.inlineCompletion?.semanticId;\n\t\t});\n\t\tthis._register(runOnChangeWithStore(derived(reader => {\n\t\t\tthis._playAccessibilitySignal.read(reader);\n\t\t\tcurrentInlineCompletionBySemanticId.read(reader);\n\t\t\treturn {};\n\t\t}), async (_value, _, _deltas, store) => {\n\t\t\t/** @description InlineCompletionsController.playAccessibilitySignalAndReadSuggestion */\n\t\t\tconst model = this.model.get();\n\t\t\tconst state = model?.state.get();\n\t\t\tif (!state || !model) { return; }\n\t\t\tconst lineText = state.kind === 'ghostText' ? model.textModel.getLineContent(state.primaryGhostText.lineNumber) : '';\n\n\t\t\tawait timeout(50, cancelOnDispose(store));\n\t\t\tawait waitForState(this._suggestWidgetAdapter.selectedItem, isUndefined, () => false, cancelOnDispose(store));\n\t\t\tawait this._accessibilitySignalService.playSignal(state.kind === 'ghostText' ? AccessibilitySignal.inlineSuggestion : AccessibilitySignal.nextEditSuggestion);\n\n\t\t\tif (this.editor.getOption(EditorOption.screenReaderAnnounceInlineSuggestion)) {\n\t\t\t\tif (state.kind === 'ghostText') {\n\t\t\t\t\tthis._provideScreenReaderUpdate(state.primaryGhostText.renderForScreenReader(lineText));\n\t\t\t\t} else {\n\t\t\t\t\tthis._provideScreenReaderUpdate(''); // Only announce Alt+F2\n\t\t\t\t}\n\t\t\t}\n\t\t}));\n\n\t\t// TODO@hediet\n\t\tthis._register(this._configurationService.onDidChangeConfiguration(e => {\n\t\t\tif (e.affectsConfiguration('accessibility.verbosity.inlineCompletions')) {\n\t\t\t\tthis.editor.updateOptions({ inlineCompletionsAccessibilityVerbose: this._configurationService.getValue('accessibility.verbosity.inlineCompletions') });\n\t\t\t}\n\t\t}));\n\t\tthis.editor.updateOptions({ inlineCompletionsAccessibilityVerbose: this._configurationService.getValue('accessibility.verbosity.inlineCompletions') });\n\n\t\tconst contextKeySvcObs = new ObservableContextKeyService(this._contextKeyService);\n\n\t\tthis._register(contextKeySvcObs.bind(InlineCompletionContextKeys.cursorInIndentation, this._cursorIsInIndentation));\n\t\tthis._register(contextKeySvcObs.bind(InlineCompletionContextKeys.hasSelection, reader => !this._editorObs.cursorSelection.read(reader)?.isEmpty()));\n\t\tthis._register(contextKeySvcObs.bind(InlineCompletionContextKeys.cursorAtInlineEdit, this.model.map((m, reader) => m?.inlineEditState?.read(reader)?.cursorAtInlineEdit.read(reader))));\n\t\tthis._register(contextKeySvcObs.bind(InlineCompletionContextKeys.tabShouldAcceptInlineEdit, this.model.map((m, r) => !!m?.tabShouldAcceptInlineEdit.read(r))));\n\t\tthis._register(contextKeySvcObs.bind(InlineCompletionContextKeys.tabShouldJumpToInlineEdit, this.model.map((m, r) => !!m?.tabShouldJumpToInlineEdit.read(r))));\n\t\tthis._register(contextKeySvcObs.bind(InlineCompletionContextKeys.inlineEditVisible, reader => this.model.read(reader)?.inlineEditState.read(reader) !== undefined));\n\t\tthis._register(contextKeySvcObs.bind(InlineCompletionContextKeys.inlineSuggestionHasIndentation,\n\t\t\treader => this.model.read(reader)?.getIndentationInfo(reader)?.startsWithIndentation\n\t\t));\n\t\tthis._register(contextKeySvcObs.bind(InlineCompletionContextKeys.inlineSuggestionHasIndentationLessThanTabSize,\n\t\t\treader => this.model.read(reader)?.getIndentationInfo(reader)?.startsWithIndentationLessThanTabSize\n\t\t));\n\t\tthis._register(contextKeySvcObs.bind(InlineCompletionContextKeys.suppressSuggestions, reader => {\n\t\t\tconst model = this.model.read(reader);\n\t\t\tconst state = model?.inlineCompletionState.read(reader);\n\t\t\treturn state?.primaryGhostText && state?.inlineCompletion ? state.inlineCompletion.source.inlineSuggestions.suppressSuggestions : undefined;\n\t\t}));\n\t\tthis._register(contextKeySvcObs.bind(InlineCompletionContextKeys.inlineSuggestionVisible, reader => {\n\t\t\tconst model = this.model.read(reader);\n\t\t\tconst state = model?.inlineCompletionState.read(reader);\n\t\t\treturn !!state?.inlineCompletion && state?.primaryGhostText !== undefined && !state?.primaryGhostText.isEmpty();\n\t\t}));\n\t\tconst firstGhostTextPos = derived(this, reader => {\n\t\t\tconst model = this.model.read(reader);\n\t\t\tconst state = model?.inlineCompletionState.read(reader);\n\t\t\tconst primaryGhostText = state?.primaryGhostText;\n\t\t\tif (!primaryGhostText || primaryGhostText.isEmpty()) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tconst firstPartPos = new Position(primaryGhostText.lineNumber, primaryGhostText.parts[0].column);\n\t\t\treturn firstPartPos;\n\t\t});\n\t\tthis._register(contextKeySvcObs.bind(InlineCompletionContextKeys.cursorBeforeGhostText, reader => {\n\t\t\tconst firstPartPos = firstGhostTextPos.read(reader);\n\t\t\tif (!firstPartPos) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst cursorPos = this._editorObs.cursorPosition.read(reader);\n\t\t\tif (!cursorPos) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn firstPartPos.equals(cursorPos);\n\t\t}));\n\n\t\tthis._register(this._instantiationService.createInstance(TextModelChangeRecorder, this.editor));\n\t}\n\n\tpublic playAccessibilitySignal(tx: ITransaction) {\n\t\tthis._playAccessibilitySignal.trigger(tx);\n\t}\n\n\tprivate _provideScreenReaderUpdate(content: string): void {\n\t\tconst accessibleViewShowing = this._contextKeyService.getContextKeyValue<boolean>('accessibleViewIsShown');\n\t\tconst accessibleViewKeybinding = this._keybindingService.lookupKeybinding('editor.action.accessibleView');\n\t\tlet hint: string | undefined;\n\t\tif (!accessibleViewShowing && accessibleViewKeybinding && this.editor.getOption(EditorOption.inlineCompletionsAccessibilityVerbose)) {\n\t\t\thint = localize('showAccessibleViewHint', \"Inspect this in the accessible view ({0})\", accessibleViewKeybinding.getAriaLabel());\n\t\t}\n\t\talert(hint ? content + ', ' + hint : content);\n\t}\n\n\tpublic shouldShowHoverAt(range: Range) {\n\t\tconst ghostText = this.model.get()?.primaryGhostText.get();\n\t\tif (!ghostText) {\n\t\t\treturn false;\n\t\t}\n\t\treturn ghostText.parts.some(p => range.containsPosition(new Position(ghostText.lineNumber, p.column)));\n\t}\n\n\tpublic shouldShowHoverAtViewZone(viewZoneId: string): boolean {\n\t\treturn this._view.shouldShowHoverAtViewZone(viewZoneId);\n\t}\n\n\tpublic reject(): void {\n\t\ttransaction(tx => {\n\t\t\tconst m = this.model.get();\n\t\t\tif (m) {\n\t\t\t\tm.stop('explicitCancel', tx);\n\t\t\t\t// Only if this controller is in focus can we cancel others.\n\t\t\t\tif (this._focusIsInEditorOrMenu.get()) {\n\t\t\t\t\tfor (const ctrl of InlineCompletionsController._instances) {\n\t\t\t\t\t\tif (ctrl !== this) {\n\t\t\t\t\t\t\tctrl.model.get()?.stop('automatic', tx);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic jump(): void {\n\t\tconst m = this.model.get();\n\t\tif (m) {\n\t\t\tm.jump();\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"sources":["vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionsController.ts"],"names":[],"mappings":"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","file":"inlineCompletionsController.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 { alert } from '../../../../../base/browser/ui/aria/aria.js';\nimport { timeout } from '../../../../../base/common/async.js';\nimport { cancelOnDispose } from '../../../../../base/common/cancellation.js';\nimport { createHotClass } from '../../../../../base/common/hotReloadHelpers.js';\nimport { Disposable, toDisposable } from '../../../../../base/common/lifecycle.js';\nimport { ITransaction, autorun, derived, derivedDisposable, derivedObservableWithCache, observableFromEvent, observableSignal, observableValue, runOnChange, runOnChangeWithStore, transaction, waitForState } from '../../../../../base/common/observable.js';\nimport { isEqual } from '../../../../../base/common/resources.js';\nimport { isUndefined } from '../../../../../base/common/types.js';\nimport { localize } from '../../../../../nls.js';\nimport { IAccessibilityService } from '../../../../../platform/accessibility/common/accessibility.js';\nimport { AccessibilitySignal, IAccessibilitySignalService } from '../../../../../platform/accessibilitySignal/browser/accessibilitySignalService.js';\nimport { ICommandService } from '../../../../../platform/commands/common/commands.js';\nimport { IConfigurationService } from '../../../../../platform/configuration/common/configuration.js';\nimport { IContextKeyService } from '../../../../../platform/contextkey/common/contextkey.js';\nimport { IInstantiationService, ServicesAccessor } from '../../../../../platform/instantiation/common/instantiation.js';\nimport { IKeybindingService } from '../../../../../platform/keybinding/common/keybinding.js';\nimport { hotClassGetOriginalInstance } from '../../../../../platform/observable/common/wrapInHotClass.js';\nimport { CoreEditingCommands } from '../../../../browser/coreCommands.js';\nimport { ICodeEditor } from '../../../../browser/editorBrowser.js';\nimport { observableCodeEditor } from '../../../../browser/observableCodeEditor.js';\nimport { getOuterEditor } from '../../../../browser/widget/codeEditor/embeddedCodeEditorWidget.js';\nimport { EditorOption } from '../../../../common/config/editorOptions.js';\nimport { Position } from '../../../../common/core/position.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { CursorChangeReason } from '../../../../common/cursorEvents.js';\nimport { ILanguageFeatureDebounceService } from '../../../../common/services/languageFeatureDebounce.js';\nimport { ILanguageFeaturesService } from '../../../../common/services/languageFeatures.js';\nimport { InlineSuggestionHintsContentWidget } from '../hintsWidget/inlineCompletionsHintsWidget.js';\nimport { TextModelChangeRecorder } from '../model/changeRecorder.js';\nimport { InlineCompletionsModel } from '../model/inlineCompletionsModel.js';\nimport { ObservableSuggestWidgetAdapter } from '../model/suggestWidgetAdapter.js';\nimport { ObservableContextKeyService } from '../utils.js';\nimport { InlineCompletionsView } from '../view/inlineCompletionsView.js';\nimport { inlineSuggestCommitId } from './commandIds.js';\nimport { InlineCompletionContextKeys } from './inlineCompletionContextKeys.js';\n\nexport class InlineCompletionsController extends Disposable {\n\tprivate static readonly _instances = new Set<InlineCompletionsController>();\n\n\tpublic static hot = createHotClass(InlineCompletionsController);\n\tpublic static ID = 'editor.contrib.inlineCompletionsController';\n\n\t/**\n\t * Find the controller in the focused editor or in the outer editor (if applicable)\n\t */\n\tpublic static getInFocusedEditorOrParent(accessor: ServicesAccessor): InlineCompletionsController | null {\n\t\tconst outerEditor = getOuterEditor(accessor);\n\t\tif (!outerEditor) {\n\t\t\treturn null;\n\t\t}\n\t\treturn InlineCompletionsController.get(outerEditor);\n\t}\n\n\tpublic static get(editor: ICodeEditor): InlineCompletionsController | null {\n\t\treturn hotClassGetOriginalInstance(editor.getContribution<InlineCompletionsController>(InlineCompletionsController.ID));\n\t}\n\n\tprivate readonly _editorObs;\n\tprivate readonly _positions;\n\n\tprivate readonly _suggestWidgetAdapter;\n\n\tprivate readonly _enabledInConfig;\n\tprivate readonly _isScreenReaderEnabled;\n\tprivate readonly _editorDictationInProgress;\n\tprivate readonly _enabled;\n\n\tprivate readonly _debounceValue;\n\n\tprivate readonly _focusIsInMenu;\n\tprivate readonly _focusIsInEditorOrMenu;\n\n\tprivate readonly _cursorIsInIndentation;\n\n\tpublic readonly model;\n\n\tprivate readonly _playAccessibilitySignal;\n\n\tprivate readonly _hideInlineEditOnSelectionChange;\n\n\tprotected readonly _view;\n\n\tconstructor(\n\t\tpublic readonly editor: ICodeEditor,\n\t\t@IInstantiationService private readonly _instantiationService: IInstantiationService,\n\t\t@IContextKeyService private readonly _contextKeyService: IContextKeyService,\n\t\t@IConfigurationService private readonly _configurationService: IConfigurationService,\n\t\t@ICommandService private readonly _commandService: ICommandService,\n\t\t@ILanguageFeatureDebounceService private readonly _debounceService: ILanguageFeatureDebounceService,\n\t\t@ILanguageFeaturesService private readonly _languageFeaturesService: ILanguageFeaturesService,\n\t\t@IAccessibilitySignalService private readonly _accessibilitySignalService: IAccessibilitySignalService,\n\t\t@IKeybindingService private readonly _keybindingService: IKeybindingService,\n\t\t@IAccessibilityService private readonly _accessibilityService: IAccessibilityService,\n\t) {\n\t\tsuper();\n\t\tthis._editorObs = observableCodeEditor(this.editor);\n\t\tthis._positions = derived(this, reader => this._editorObs.selections.read(reader)?.map(s => s.getEndPosition()) ?? [new Position(1, 1)]);\n\t\tthis._suggestWidgetAdapter = this._register(new ObservableSuggestWidgetAdapter(\n\t\t\tthis._editorObs,\n\t\t\titem => this.model.get()?.handleSuggestAccepted(item),\n\t\t\t() => this.model.get()?.selectedInlineCompletion.get()?.getSingleTextEdit(),\n\t\t));\n\t\tthis._enabledInConfig = observableFromEvent(this, this.editor.onDidChangeConfiguration, () => this.editor.getOption(EditorOption.inlineSuggest).enabled);\n\t\tthis._isScreenReaderEnabled = observableFromEvent(this, this._accessibilityService.onDidChangeScreenReaderOptimized, () => this._accessibilityService.isScreenReaderOptimized());\n\t\tthis._editorDictationInProgress = observableFromEvent(this,\n\t\t\tthis._contextKeyService.onDidChangeContext,\n\t\t\t() => this._contextKeyService.getContext(this.editor.getDomNode()).getValue('editorDictation.inProgress') === true\n\t\t);\n\t\tthis._enabled = derived(this, reader => this._enabledInConfig.read(reader) && (!this._isScreenReaderEnabled.read(reader) || !this._editorDictationInProgress.read(reader)));\n\t\tthis._debounceValue = this._debounceService.for(\n\t\t\tthis._languageFeaturesService.inlineCompletionsProvider,\n\t\t\t'InlineCompletionsDebounce',\n\t\t\t{ min: 50, max: 50 }\n\t\t);\n\t\tthis._focusIsInMenu = observableValue<boolean>(this, false);\n\t\tthis._focusIsInEditorOrMenu = derived(this, reader => {\n\t\t\tconst editorHasFocus = this._editorObs.isFocused.read(reader);\n\t\t\tconst menuHasFocus = this._focusIsInMenu.read(reader);\n\t\t\treturn editorHasFocus || menuHasFocus;\n\t\t});\n\t\tthis._cursorIsInIndentation = derived(this, reader => {\n\t\t\tconst cursorPos = this._editorObs.cursorPosition.read(reader);\n\t\t\tif (cursorPos === null) { return false; }\n\t\t\tconst model = this._editorObs.model.read(reader);\n\t\t\tif (!model) { return false; }\n\t\t\tthis._editorObs.versionId.read(reader);\n\t\t\tconst indentMaxColumn = model.getLineIndentColumn(cursorPos.lineNumber);\n\t\t\treturn cursorPos.column <= indentMaxColumn;\n\t\t});\n\t\tthis.model = derivedDisposable<InlineCompletionsModel | undefined>(this, reader => {\n\t\t\tif (this._editorObs.isReadonly.read(reader)) { return undefined; }\n\t\t\tconst textModel = this._editorObs.model.read(reader);\n\t\t\tif (!textModel) { return undefined; }\n\n\t\t\tconst model: InlineCompletionsModel = this._instantiationService.createInstance(\n\t\t\t\tInlineCompletionsModel,\n\t\t\t\ttextModel,\n\t\t\t\tthis._suggestWidgetAdapter.selectedItem,\n\t\t\t\tthis._editorObs.versionId,\n\t\t\t\tthis._positions,\n\t\t\t\tthis._debounceValue,\n\t\t\t\tthis._enabled,\n\t\t\t\tthis.editor,\n\t\t\t);\n\t\t\treturn model;\n\t\t}).recomputeInitiallyAndOnChange(this._store);\n\t\tthis._playAccessibilitySignal = observableSignal(this);\n\t\tthis._hideInlineEditOnSelectionChange = this._editorObs.getOption(EditorOption.inlineSuggest).map(val => true);\n\t\tthis._view = this._register(this._instantiationService.createInstance(InlineCompletionsView, this.editor, this.model, this._focusIsInMenu));\n\n\t\tInlineCompletionsController._instances.add(this);\n\t\tthis._register(toDisposable(() => InlineCompletionsController._instances.delete(this)));\n\n\t\tthis._register(autorun(reader => {\n\t\t\t// Cancel all other inline completions when a new one starts\n\t\t\tconst model = this.model.read(reader);\n\t\t\tif (!model) { return; }\n\t\t\tconst state = model.state.read(reader);\n\t\t\tif (!state) { return; }\n\t\t\tif (!this._focusIsInEditorOrMenu.get()) { return; }\n\n\t\t\t// This controller is in focus, hence reject others.\n\t\t\t// However if we display a NES that relates to another edit then trigger NES on that related controller\n\t\t\tconst nextEditUri = state.kind === 'inlineEdit' ? state.nextEditUri : undefined;\n\t\t\tfor (const ctrl of InlineCompletionsController._instances) {\n\t\t\t\tif (ctrl === this) {\n\t\t\t\t\tcontinue;\n\t\t\t\t} else if (nextEditUri && isEqual(nextEditUri, ctrl.editor.getModel()?.uri)) {\n\t\t\t\t\t// The next edit in other edito is related to this controller, trigger it.\n\t\t\t\t\tctrl.model.get()?.trigger();\n\t\t\t\t} else {\n\t\t\t\t\tctrl.reject();\n\t\t\t\t}\n\t\t\t}\n\t\t}));\n\t\tthis._register(autorun(reader => {\n\t\t\t// Cancel all other inline completions when a new one starts\n\t\t\tconst model = this.model.read(reader);\n\t\t\tconst uri = this.editor.getModel()?.uri;\n\t\t\tif (!model || !uri) { return; }\n\n\t\t\t// This NES was accepted, its possible there is an NES that points to this editor.\n\t\t\t// I.e. there's an NES that reads `Go To Next Edit`,\n\t\t\t// If there is one that points to this editor, then we need to hide that as this NES was accepted.\n\t\t\treader.store.add(model.onDidAccept(() => {\n\t\t\t\tfor (const ctrl of InlineCompletionsController._instances) {\n\t\t\t\t\tif (ctrl === this) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\t// Find the nes from another editor that points to this.\n\t\t\t\t\tconst state = ctrl.model.get()?.state.get();\n\t\t\t\t\tif (state?.kind === 'inlineEdit' && isEqual(state.nextEditUri, uri)) {\n\t\t\t\t\t\tctrl.model.get()?.stop('automatic');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}));\n\n\t\t}));\n\n\t\tthis._register(runOnChange(this._editorObs.onDidType, (_value, _changes) => {\n\t\t\tif (this._enabled.get()) {\n\t\t\t\tthis.model.get()?.trigger();\n\t\t\t}\n\t\t}));\n\n\t\tthis._register(runOnChange(this._editorObs.onDidPaste, (_value, _changes) => {\n\t\t\tif (this._enabled.get()) {\n\t\t\t\tthis.model.get()?.trigger();\n\t\t\t}\n\t\t}));\n\n\t\tthis._register(this._commandService.onDidExecuteCommand((e) => {\n\t\t\t// These commands don't trigger onDidType.\n\t\t\tconst commands = new Set([\n\t\t\t\tCoreEditingCommands.Tab.id,\n\t\t\t\tCoreEditingCommands.DeleteLeft.id,\n\t\t\t\tCoreEditingCommands.DeleteRight.id,\n\t\t\t\tinlineSuggestCommitId,\n\t\t\t\t'acceptSelectedSuggestion',\n\t\t\t]);\n\t\t\tif (commands.has(e.commandId) && editor.hasTextFocus() && this._enabled.get()) {\n\t\t\t\tlet noDelay = false;\n\t\t\t\tif (e.commandId === inlineSuggestCommitId) {\n\t\t\t\t\tnoDelay = true;\n\t\t\t\t}\n\t\t\t\tthis._editorObs.forceUpdate(tx => {\n\t\t\t\t\t/** @description onDidExecuteCommand */\n\t\t\t\t\tthis.model.get()?.trigger(tx, { noDelay });\n\t\t\t\t});\n\t\t\t}\n\t\t}));\n\n\t\tthis._register(runOnChange(this._editorObs.selections, (_value, _, changes) => {\n\t\t\tif (changes.some(e => e.reason === CursorChangeReason.Explicit || e.source === 'api')) {\n\t\t\t\tif (!this._hideInlineEditOnSelectionChange.get() && this.model.get()?.state.get()?.kind === 'inlineEdit') {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst m = this.model.get();\n\t\t\t\tif (!m) { return; }\n\t\t\t\tif (m.state.get()?.kind === 'ghostText') {\n\t\t\t\t\tthis.model.get()?.stop();\n\t\t\t\t}\n\t\t\t}\n\t\t}));\n\n\t\tthis._register(autorun(reader => {\n\t\t\tconst isFocused = this._focusIsInEditorOrMenu.read(reader);\n\t\t\tconst model = this.model.get();\n\t\t\tif (isFocused) {\n\t\t\t\t// If this model already has an NES for another editor, then leave as is\n\t\t\t\t// Else stop other models.\n\t\t\t\tconst state = model?.state?.get();\n\t\t\t\tif (!state || state.kind !== 'inlineEdit' || !state.nextEditUri) {\n\t\t\t\t\ttransaction(tx => {\n\t\t\t\t\t\tfor (const ctrl of InlineCompletionsController._instances) {\n\t\t\t\t\t\t\tif (ctrl !== this) {\n\t\t\t\t\t\t\t\tctrl.model.get()?.stop('automatic', tx);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// This is a hidden setting very useful for debugging\n\t\t\tif (this._contextKeyService.getContextKeyValue<boolean>('accessibleViewIsShown')\n\t\t\t\t|| this._configurationService.getValue('editor.inlineSuggest.keepOnBlur')\n\t\t\t\t|| editor.getOption(EditorOption.inlineSuggest).keepOnBlur\n\t\t\t\t|| InlineSuggestionHintsContentWidget.dropDownVisible) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!model) { return; }\n\t\t\tif (model.state.get()?.inlineCompletion?.isFromExplicitRequest && model.inlineEditAvailable.get()) {\n\t\t\t\t// dont hide inline edits on blur when requested explicitly\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttransaction(tx => {\n\t\t\t\t/** @description InlineCompletionsController.onDidBlurEditorWidget */\n\t\t\t\tmodel.stop('automatic', tx);\n\t\t\t});\n\t\t}));\n\n\t\tthis._register(autorun(reader => {\n\t\t\t/** @description InlineCompletionsController.forceRenderingAbove */\n\t\t\tconst state = this.model.read(reader)?.inlineCompletionState.read(reader);\n\t\t\tif (state?.suggestItem) {\n\t\t\t\tif (state.primaryGhostText.lineCount >= 2) {\n\t\t\t\t\tthis._suggestWidgetAdapter.forceRenderingAbove();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis._suggestWidgetAdapter.stopForceRenderingAbove();\n\t\t\t}\n\t\t}));\n\t\tthis._register(toDisposable(() => {\n\t\t\tthis._suggestWidgetAdapter.stopForceRenderingAbove();\n\t\t}));\n\n\t\tconst currentInlineCompletionBySemanticId = derivedObservableWithCache<string | undefined>(this, (reader, last) => {\n\t\t\tconst model = this.model.read(reader);\n\t\t\tconst state = model?.state.read(reader);\n\t\t\tif (this._suggestWidgetAdapter.selectedItem.get()) {\n\t\t\t\treturn last;\n\t\t\t}\n\t\t\treturn state?.inlineCompletion?.semanticId;\n\t\t});\n\t\tthis._register(runOnChangeWithStore(derived(reader => {\n\t\t\tthis._playAccessibilitySignal.read(reader);\n\t\t\tcurrentInlineCompletionBySemanticId.read(reader);\n\t\t\treturn {};\n\t\t}), async (_value, _, _deltas, store) => {\n\t\t\t/** @description InlineCompletionsController.playAccessibilitySignalAndReadSuggestion */\n\t\t\tlet model = this.model.get();\n\t\t\tlet state = model?.state.get();\n\t\t\tif (!state || !model) { return; }\n\n\t\t\tawait timeout(50, cancelOnDispose(store));\n\t\t\tawait waitForState(this._suggestWidgetAdapter.selectedItem, isUndefined, () => false, cancelOnDispose(store));\n\n\t\t\tmodel = this.model.get();\n\t\t\tstate = model?.state.get();\n\t\t\tif (!state || !model) { return; }\n\t\t\tconst lineText = state.kind === 'ghostText' ? model.textModel.getLineContent(state.primaryGhostText.lineNumber) : '';\n\t\t\tthis._accessibilitySignalService.playSignal(state.kind === 'ghostText' ? AccessibilitySignal.inlineSuggestion : AccessibilitySignal.nextEditSuggestion);\n\n\t\t\tif (this.editor.getOption(EditorOption.screenReaderAnnounceInlineSuggestion)) {\n\t\t\t\tif (state.kind === 'ghostText') {\n\t\t\t\t\tthis._provideScreenReaderUpdate(state.primaryGhostText.renderForScreenReader(lineText));\n\t\t\t\t} else {\n\t\t\t\t\tthis._provideScreenReaderUpdate(''); // Only announce Alt+F2\n\t\t\t\t}\n\t\t\t}\n\t\t}));\n\n\t\t// TODO@hediet\n\t\tthis._register(this._configurationService.onDidChangeConfiguration(e => {\n\t\t\tif (e.affectsConfiguration('accessibility.verbosity.inlineCompletions')) {\n\t\t\t\tthis.editor.updateOptions({ inlineCompletionsAccessibilityVerbose: this._configurationService.getValue('accessibility.verbosity.inlineCompletions') });\n\t\t\t}\n\t\t}));\n\t\tthis.editor.updateOptions({ inlineCompletionsAccessibilityVerbose: this._configurationService.getValue('accessibility.verbosity.inlineCompletions') });\n\n\t\tconst contextKeySvcObs = new ObservableContextKeyService(this._contextKeyService);\n\n\t\tthis._register(contextKeySvcObs.bind(InlineCompletionContextKeys.cursorInIndentation, this._cursorIsInIndentation));\n\t\tthis._register(contextKeySvcObs.bind(InlineCompletionContextKeys.hasSelection, reader => !this._editorObs.cursorSelection.read(reader)?.isEmpty()));\n\t\tthis._register(contextKeySvcObs.bind(InlineCompletionContextKeys.cursorAtInlineEdit, this.model.map((m, reader) => m?.inlineEditState?.read(reader)?.cursorAtInlineEdit.read(reader))));\n\t\tthis._register(contextKeySvcObs.bind(InlineCompletionContextKeys.tabShouldAcceptInlineEdit, this.model.map((m, r) => !!m?.tabShouldAcceptInlineEdit.read(r))));\n\t\tthis._register(contextKeySvcObs.bind(InlineCompletionContextKeys.tabShouldJumpToInlineEdit, this.model.map((m, r) => !!m?.tabShouldJumpToInlineEdit.read(r))));\n\t\tthis._register(contextKeySvcObs.bind(InlineCompletionContextKeys.inlineEditVisible, reader => this.model.read(reader)?.inlineEditState.read(reader) !== undefined));\n\t\tthis._register(contextKeySvcObs.bind(InlineCompletionContextKeys.inlineSuggestionHasIndentation,\n\t\t\treader => this.model.read(reader)?.getIndentationInfo(reader)?.startsWithIndentation\n\t\t));\n\t\tthis._register(contextKeySvcObs.bind(InlineCompletionContextKeys.inlineSuggestionHasIndentationLessThanTabSize,\n\t\t\treader => this.model.read(reader)?.getIndentationInfo(reader)?.startsWithIndentationLessThanTabSize\n\t\t));\n\t\tthis._register(contextKeySvcObs.bind(InlineCompletionContextKeys.suppressSuggestions, reader => {\n\t\t\tconst model = this.model.read(reader);\n\t\t\tconst state = model?.inlineCompletionState.read(reader);\n\t\t\treturn state?.primaryGhostText && state?.inlineCompletion ? state.inlineCompletion.source.inlineSuggestions.suppressSuggestions : undefined;\n\t\t}));\n\t\tthis._register(contextKeySvcObs.bind(InlineCompletionContextKeys.inlineSuggestionVisible, reader => {\n\t\t\tconst model = this.model.read(reader);\n\t\t\tconst state = model?.inlineCompletionState.read(reader);\n\t\t\treturn !!state?.inlineCompletion && state?.primaryGhostText !== undefined && !state?.primaryGhostText.isEmpty();\n\t\t}));\n\t\tconst firstGhostTextPos = derived(this, reader => {\n\t\t\tconst model = this.model.read(reader);\n\t\t\tconst state = model?.inlineCompletionState.read(reader);\n\t\t\tconst primaryGhostText = state?.primaryGhostText;\n\t\t\tif (!primaryGhostText || primaryGhostText.isEmpty()) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tconst firstPartPos = new Position(primaryGhostText.lineNumber, primaryGhostText.parts[0].column);\n\t\t\treturn firstPartPos;\n\t\t});\n\t\tthis._register(contextKeySvcObs.bind(InlineCompletionContextKeys.cursorBeforeGhostText, reader => {\n\t\t\tconst firstPartPos = firstGhostTextPos.read(reader);\n\t\t\tif (!firstPartPos) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconst cursorPos = this._editorObs.cursorPosition.read(reader);\n\t\t\tif (!cursorPos) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn firstPartPos.equals(cursorPos);\n\t\t}));\n\n\t\tthis._register(this._instantiationService.createInstance(TextModelChangeRecorder, this.editor));\n\t}\n\n\tpublic playAccessibilitySignal(tx: ITransaction) {\n\t\tthis._playAccessibilitySignal.trigger(tx);\n\t}\n\n\tprivate _provideScreenReaderUpdate(content: string): void {\n\t\tconst accessibleViewShowing = this._contextKeyService.getContextKeyValue<boolean>('accessibleViewIsShown');\n\t\tconst accessibleViewKeybinding = this._keybindingService.lookupKeybinding('editor.action.accessibleView');\n\t\tlet hint: string | undefined;\n\t\tif (!accessibleViewShowing && accessibleViewKeybinding && this.editor.getOption(EditorOption.inlineCompletionsAccessibilityVerbose)) {\n\t\t\thint = localize('showAccessibleViewHint', \"Inspect this in the accessible view ({0})\", accessibleViewKeybinding.getAriaLabel());\n\t\t}\n\t\talert(hint ? content + ', ' + hint : content);\n\t}\n\n\tpublic shouldShowHoverAt(range: Range) {\n\t\tconst ghostText = this.model.get()?.primaryGhostText.get();\n\t\tif (!ghostText) {\n\t\t\treturn false;\n\t\t}\n\t\treturn ghostText.parts.some(p => range.containsPosition(new Position(ghostText.lineNumber, p.column)));\n\t}\n\n\tpublic shouldShowHoverAtViewZone(viewZoneId: string): boolean {\n\t\treturn this._view.shouldShowHoverAtViewZone(viewZoneId);\n\t}\n\n\tpublic reject(): void {\n\t\ttransaction(tx => {\n\t\t\tconst m = this.model.get();\n\t\t\tif (m) {\n\t\t\t\tm.stop('explicitCancel', tx);\n\t\t\t\t// Only if this controller is in focus can we cancel others.\n\t\t\t\tif (this._focusIsInEditorOrMenu.get()) {\n\t\t\t\t\tfor (const ctrl of InlineCompletionsController._instances) {\n\t\t\t\t\t\tif (ctrl !== this) {\n\t\t\t\t\t\t\tctrl.model.get()?.stop('automatic', tx);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tpublic jump(): void {\n\t\tconst m = this.model.get();\n\t\tif (m) {\n\t\t\tm.jump();\n\t\t}\n\t}\n}\n"]}
@@ -3,7 +3,7 @@
3
3
  * Licensed under the MIT License. See License.txt in the project root for license information.
4
4
  *--------------------------------------------------------------------------------------------*/
5
5
  import { assertNever } from '../../../../../base/common/assert.js';
6
- import { AsyncIterableObject } from '../../../../../base/common/async.js';
6
+ import { AsyncIterableProducer } from '../../../../../base/common/async.js';
7
7
  import { CancellationTokenSource } from '../../../../../base/common/cancellation.js';
8
8
  import { onUnexpectedExternalError } from '../../../../../base/common/errors.js';
9
9
  import { Disposable } from '../../../../../base/common/lifecycle.js';
@@ -92,7 +92,7 @@ export function provideInlineCompletions(providers, position, model, context, re
92
92
  runningCount--;
93
93
  }
94
94
  });
95
- const inlineCompletionLists = AsyncIterableObject.fromPromisesResolveOrder(providers.map(p => queryProvider.get(p))).filter(isDefined);
95
+ const inlineCompletionLists = AsyncIterableProducer.fromPromisesResolveOrder(providers.map(p => queryProvider.get(p))).filter(isDefined);
96
96
  return {
97
97
  get didAllProvidersReturn() { return runningCount === 0; },
98
98
  lists: inlineCompletionLists,
@@ -1 +1 @@
1
- {"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/editor/contrib/inlineCompletions/browser/model/provideInlineCompletions.ts","vs/editor/contrib/inlineCompletions/browser/model/provideInlineCompletions.ts"],"names":[],"mappings":"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","file":"provideInlineCompletions.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 { assertNever } from '../../../../../base/common/assert.js';\nimport { AsyncIterableObject } from '../../../../../base/common/async.js';\nimport { CancellationToken, CancellationTokenSource } from '../../../../../base/common/cancellation.js';\nimport { onUnexpectedExternalError } from '../../../../../base/common/errors.js';\nimport { Disposable, IDisposable } from '../../../../../base/common/lifecycle.js';\nimport { prefixedUuid } from '../../../../../base/common/uuid.js';\nimport { ICommandService } from '../../../../../platform/commands/common/commands.js';\nimport { ISingleEditOperation } from '../../../../common/core/editOperation.js';\nimport { StringReplacement } from '../../../../common/core/edits/stringEdit.js';\nimport { OffsetRange } from '../../../../common/core/ranges/offsetRange.js';\nimport { Position } from '../../../../common/core/position.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { TextReplacement } from '../../../../common/core/edits/textEdit.js';\nimport { InlineCompletionEndOfLifeReason, InlineCompletionEndOfLifeReasonKind, InlineCompletionDisplayLocationKind, InlineCompletion, InlineCompletionContext, InlineCompletions, InlineCompletionsProvider, PartialAcceptInfo, InlineCompletionsDisposeReason, LifetimeSummary } from '../../../../common/languages.js';\nimport { ILanguageConfigurationService } from '../../../../common/languages/languageConfigurationRegistry.js';\nimport { ITextModel } from '../../../../common/model.js';\nimport { fixBracketsInLine } from '../../../../common/model/bracketPairsTextModelPart/fixBrackets.js';\nimport { SnippetParser, Text } from '../../../snippet/browser/snippetParser.js';\nimport { getReadonlyEmptyArray } from '../utils.js';\nimport { groupByMap } from '../../../../../base/common/collections.js';\nimport { DirectedGraph } from './graph.js';\nimport { CachedFunction } from '../../../../../base/common/cache.js';\nimport { InlineCompletionViewData, InlineCompletionViewKind } from '../view/inlineEdits/inlineEditsViewInterface.js';\nimport { isDefined } from '../../../../../base/common/types.js';\nimport { inlineCompletionIsVisible } from './inlineSuggestionItem.js';\n\nexport type InlineCompletionContextWithoutUuid = Omit<InlineCompletionContext, 'requestUuid'>;\n\nexport function provideInlineCompletions(\n\tproviders: InlineCompletionsProvider[],\n\tposition: Position,\n\tmodel: ITextModel,\n\tcontext: InlineCompletionContextWithoutUuid,\n\trequestInfo: InlineSuggestRequestInfo,\n\tlanguageConfigurationService?: ILanguageConfigurationService,\n): IInlineCompletionProviderResult {\n\tconst requestUuid = prefixedUuid('icr');\n\n\tconst cancellationTokenSource = new CancellationTokenSource();\n\tlet cancelReason: InlineCompletionsDisposeReason | undefined = undefined;\n\n\tconst contextWithUuid: InlineCompletionContext = { ...context, requestUuid: requestUuid };\n\n\tconst defaultReplaceRange = getDefaultRange(position, model);\n\n\tconst providersByGroupId = groupByMap(providers, p => p.groupId);\n\tconst yieldsToGraph = DirectedGraph.from(providers, p => {\n\t\treturn p.yieldsToGroupIds?.flatMap(groupId => providersByGroupId.get(groupId) ?? []) ?? [];\n\t});\n\tconst { foundCycles } = yieldsToGraph.removeCycles();\n\tif (foundCycles.length > 0) {\n\t\tonUnexpectedExternalError(new Error(`Inline completions: cyclic yield-to dependency detected.`\n\t\t\t+ ` Path: ${foundCycles.map(s => s.toString ? s.toString() : ('' + s)).join(' -> ')}`));\n\t}\n\n\tlet runningCount = 0;\n\n\tconst queryProvider = new CachedFunction(async (provider: InlineCompletionsProvider<InlineCompletions>): Promise<InlineSuggestionList | undefined> => {\n\t\ttry {\n\t\t\trunningCount++;\n\t\t\tif (cancellationTokenSource.token.isCancellationRequested) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst yieldsTo = yieldsToGraph.getOutgoing(provider);\n\t\t\tfor (const p of yieldsTo) {\n\t\t\t\t// We know there is no cycle, so no recursion here\n\t\t\t\tconst result = await queryProvider.get(p);\n\t\t\t\tif (result) {\n\t\t\t\t\tfor (const item of result.inlineSuggestions.items) {\n\t\t\t\t\t\tif (item.isInlineEdit || typeof item.insertText !== 'string') {\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst t = new TextReplacement(Range.lift(item.range) ?? defaultReplaceRange, item.insertText);\n\t\t\t\t\t\tif (inlineCompletionIsVisible(t, undefined, model, position)) {\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// else: inline completion is not visible, so lets not block\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet result: InlineCompletions | null | undefined;\n\t\t\tconst providerStartTime = Date.now();\n\t\t\ttry {\n\t\t\t\tresult = await provider.provideInlineCompletions(model, position, contextWithUuid, cancellationTokenSource.token);\n\t\t\t} catch (e) {\n\t\t\t\tonUnexpectedExternalError(e);\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tconst providerEndTime = Date.now();\n\n\t\t\tif (!result) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst data: InlineSuggestData[] = [];\n\t\t\tconst list = new InlineSuggestionList(result, data, provider);\n\t\t\tlist.addRef();\n\t\t\trunWhenCancelled(cancellationTokenSource.token, () => {\n\t\t\t\treturn list.removeRef(cancelReason);\n\t\t\t});\n\t\t\tif (cancellationTokenSource.token.isCancellationRequested) {\n\t\t\t\treturn undefined; // The list is disposed now, so we cannot return the items!\n\t\t\t}\n\n\t\t\tfor (const item of result.items) {\n\t\t\t\tdata.push(toInlineSuggestData(item, list, defaultReplaceRange, model, languageConfigurationService, contextWithUuid, requestInfo, { startTime: providerStartTime, endTime: providerEndTime }));\n\t\t\t}\n\n\t\t\treturn list;\n\t\t} finally {\n\t\t\trunningCount--;\n\t\t}\n\t});\n\n\tconst inlineCompletionLists = AsyncIterableObject.fromPromisesResolveOrder(providers.map(p => queryProvider.get(p))).filter(isDefined);\n\n\treturn {\n\t\tget didAllProvidersReturn() { return runningCount === 0; },\n\t\tlists: inlineCompletionLists,\n\t\tcancelAndDispose: reason => {\n\t\t\tif (cancelReason !== undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcancelReason = reason;\n\t\t\tcancellationTokenSource.dispose(true);\n\t\t}\n\t};\n}\n\n/** If the token is eventually cancelled, this will not leak either. */\nexport function runWhenCancelled(token: CancellationToken, callback: () => void): IDisposable {\n\tif (token.isCancellationRequested) {\n\t\tcallback();\n\t\treturn Disposable.None;\n\t} else {\n\t\tconst listener = token.onCancellationRequested(() => {\n\t\t\tlistener.dispose();\n\t\t\tcallback();\n\t\t});\n\t\treturn { dispose: () => listener.dispose() };\n\t}\n}\n\nexport interface IInlineCompletionProviderResult {\n\tget didAllProvidersReturn(): boolean;\n\n\tcancelAndDispose(reason: InlineCompletionsDisposeReason): void;\n\n\tlists: AsyncIterableObject<InlineSuggestionList>;\n}\n\nfunction toInlineSuggestData(\n\tinlineCompletion: InlineCompletion,\n\tsource: InlineSuggestionList,\n\tdefaultReplaceRange: Range,\n\ttextModel: ITextModel,\n\tlanguageConfigurationService: ILanguageConfigurationService | undefined,\n\tcontext: InlineCompletionContext,\n\trequestInfo: InlineSuggestRequestInfo,\n\tproviderRequestInfo: InlineSuggestProviderRequestInfo,\n): InlineSuggestData {\n\tlet insertText: string;\n\tlet snippetInfo: SnippetInfo | undefined;\n\tlet range = inlineCompletion.range ? Range.lift(inlineCompletion.range) : defaultReplaceRange;\n\n\tif (typeof inlineCompletion.insertText === 'string') {\n\t\tinsertText = inlineCompletion.insertText;\n\n\t\tif (languageConfigurationService && inlineCompletion.completeBracketPairs) {\n\t\t\tinsertText = closeBrackets(\n\t\t\t\tinsertText,\n\t\t\t\trange.getStartPosition(),\n\t\t\t\ttextModel,\n\t\t\t\tlanguageConfigurationService\n\t\t\t);\n\n\t\t\t// Modify range depending on if brackets are added or removed\n\t\t\tconst diff = insertText.length - inlineCompletion.insertText.length;\n\t\t\tif (diff !== 0) {\n\t\t\t\trange = new Range(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn + diff);\n\t\t\t}\n\t\t}\n\n\t\tsnippetInfo = undefined;\n\t} else if ('snippet' in inlineCompletion.insertText) {\n\t\tconst preBracketCompletionLength = inlineCompletion.insertText.snippet.length;\n\n\t\tif (languageConfigurationService && inlineCompletion.completeBracketPairs) {\n\t\t\tinlineCompletion.insertText.snippet = closeBrackets(\n\t\t\t\tinlineCompletion.insertText.snippet,\n\t\t\t\trange.getStartPosition(),\n\t\t\t\ttextModel,\n\t\t\t\tlanguageConfigurationService\n\t\t\t);\n\n\t\t\t// Modify range depending on if brackets are added or removed\n\t\t\tconst diff = inlineCompletion.insertText.snippet.length - preBracketCompletionLength;\n\t\t\tif (diff !== 0) {\n\t\t\t\trange = new Range(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn + diff);\n\t\t\t}\n\t\t}\n\n\t\tconst snippet = new SnippetParser().parse(inlineCompletion.insertText.snippet);\n\n\t\tif (snippet.children.length === 1 && snippet.children[0] instanceof Text) {\n\t\t\tinsertText = snippet.children[0].value;\n\t\t\tsnippetInfo = undefined;\n\t\t} else {\n\t\t\tinsertText = snippet.toString();\n\t\t\tsnippetInfo = {\n\t\t\t\tsnippet: inlineCompletion.insertText.snippet,\n\t\t\t\trange: range\n\t\t\t};\n\t\t}\n\t} else {\n\t\tassertNever(inlineCompletion.insertText);\n\t}\n\n\tconst displayLocation = inlineCompletion.displayLocation ? {\n\t\trange: Range.lift(inlineCompletion.displayLocation.range),\n\t\tlabel: inlineCompletion.displayLocation.label,\n\t\tkind: inlineCompletion.displayLocation.kind\n\t} : undefined;\n\n\treturn new InlineSuggestData(\n\t\trange,\n\t\tinsertText,\n\t\tsnippetInfo,\n\t\tdisplayLocation,\n\t\tinlineCompletion.additionalTextEdits || getReadonlyEmptyArray(),\n\t\tinlineCompletion,\n\t\tsource,\n\t\tcontext,\n\t\tinlineCompletion.isInlineEdit ?? false,\n\t\trequestInfo,\n\t\tproviderRequestInfo,\n\t\tinlineCompletion.correlationId,\n\t);\n}\n\nexport type InlineSuggestRequestInfo = {\n\tstartTime: number;\n\teditorType: InlineCompletionEditorType;\n\tlanguageId: string;\n\treason: string;\n\ttypingInterval: number;\n\ttypingIntervalCharacterCount: number;\n};\n\nexport type InlineSuggestProviderRequestInfo = {\n\tstartTime: number;\n\tendTime: number;\n};\n\nexport type PartialAcceptance = {\n\tcharacters: number;\n\tcount: number;\n\tratio: number;\n};\n\nexport type InlineSuggestViewData = {\n\teditorType: InlineCompletionEditorType;\n\trenderData?: InlineCompletionViewData;\n\tviewKind?: InlineCompletionViewKind;\n\terror?: string;\n};\n\nexport class InlineSuggestData {\n\tprivate _didShow = false;\n\tprivate _timeUntilShown: number | undefined = undefined;\n\tprivate _showStartTime: number | undefined = undefined;\n\tprivate _shownDuration: number = 0;\n\tprivate _showUncollapsedStartTime: number | undefined = undefined;\n\tprivate _showUncollapsedDuration: number = 0;\n\n\tprivate _viewData: InlineSuggestViewData;\n\tprivate _didReportEndOfLife = false;\n\tprivate _lastSetEndOfLifeReason: InlineCompletionEndOfLifeReason | undefined = undefined;\n\tprivate _isPreceeded = false;\n\tprivate _partiallyAcceptedCount = 0;\n\tprivate _partiallyAcceptedSinceOriginal: PartialAcceptance = { characters: 0, ratio: 0, count: 0 };\n\n\tconstructor(\n\t\tpublic readonly range: Range,\n\t\tpublic readonly insertText: string,\n\t\tpublic readonly snippetInfo: SnippetInfo | undefined,\n\t\tpublic readonly displayLocation: IDisplayLocation | undefined,\n\t\tpublic readonly additionalTextEdits: readonly ISingleEditOperation[],\n\n\t\tpublic readonly sourceInlineCompletion: InlineCompletion,\n\t\tpublic readonly source: InlineSuggestionList,\n\t\tpublic readonly context: InlineCompletionContext,\n\t\tpublic readonly isInlineEdit: boolean,\n\n\t\tprivate readonly _requestInfo: InlineSuggestRequestInfo,\n\t\tprivate readonly _providerRequestInfo: InlineSuggestProviderRequestInfo,\n\t\tprivate readonly _correlationId: string | undefined,\n\t) {\n\t\tthis._viewData = { editorType: _requestInfo.editorType };\n\t}\n\n\tpublic get showInlineEditMenu() { return this.sourceInlineCompletion.showInlineEditMenu ?? false; }\n\n\tpublic get partialAccepts(): PartialAcceptance { return this._partiallyAcceptedSinceOriginal; }\n\n\tpublic async reportInlineEditShown(commandService: ICommandService, updatedInsertText: string, viewKind: InlineCompletionViewKind, viewData: InlineCompletionViewData): Promise<void> {\n\t\tthis.updateShownDuration(viewKind);\n\n\t\tif (this._didShow) {\n\t\t\treturn;\n\t\t}\n\t\tthis._didShow = true;\n\t\tthis._viewData.viewKind = viewKind;\n\t\tthis._viewData.renderData = viewData;\n\t\tthis._timeUntilShown = Date.now() - this._requestInfo.startTime;\n\n\t\tthis.source.provider.handleItemDidShow?.(this.source.inlineSuggestions, this.sourceInlineCompletion, updatedInsertText);\n\n\t\tif (this.sourceInlineCompletion.shownCommand) {\n\t\t\tawait commandService.executeCommand(this.sourceInlineCompletion.shownCommand.id, ...(this.sourceInlineCompletion.shownCommand.arguments || []));\n\t\t}\n\t}\n\n\tpublic reportPartialAccept(acceptedCharacters: number, info: PartialAcceptInfo, partialAcceptance: PartialAcceptance) {\n\t\tthis._partiallyAcceptedCount++;\n\t\tthis._partiallyAcceptedSinceOriginal.characters += partialAcceptance.characters;\n\t\tthis._partiallyAcceptedSinceOriginal.ratio = Math.min(this._partiallyAcceptedSinceOriginal.ratio + (1 - this._partiallyAcceptedSinceOriginal.ratio) * partialAcceptance.ratio, 1);\n\t\tthis._partiallyAcceptedSinceOriginal.count += partialAcceptance.count;\n\n\t\tthis.source.provider.handlePartialAccept?.(\n\t\t\tthis.source.inlineSuggestions,\n\t\t\tthis.sourceInlineCompletion,\n\t\t\tacceptedCharacters,\n\t\t\tinfo\n\t\t);\n\t}\n\n\t/**\n\t * Sends the end of life event to the provider.\n\t * If no reason is provided, the last set reason is used.\n\t * If no reason was set, the default reason is used.\n\t*/\n\tpublic reportEndOfLife(reason?: InlineCompletionEndOfLifeReason): void {\n\t\tif (this._didReportEndOfLife) {\n\t\t\treturn;\n\t\t}\n\t\tthis._didReportEndOfLife = true;\n\t\tthis.reportInlineEditHidden();\n\n\t\tif (!reason) {\n\t\t\treason = this._lastSetEndOfLifeReason ?? { kind: InlineCompletionEndOfLifeReasonKind.Ignored, userTypingDisagreed: false, supersededBy: undefined };\n\t\t}\n\n\t\tif (reason.kind === InlineCompletionEndOfLifeReasonKind.Rejected && this.source.provider.handleRejection) {\n\t\t\tthis.source.provider.handleRejection(this.source.inlineSuggestions, this.sourceInlineCompletion);\n\t\t}\n\n\t\tif (this.source.provider.handleEndOfLifetime) {\n\t\t\tconst summary: LifetimeSummary = {\n\t\t\t\trequestUuid: this.context.requestUuid,\n\t\t\t\tcorrelationId: this._correlationId,\n\t\t\t\tpartiallyAccepted: this._partiallyAcceptedCount,\n\t\t\t\tpartiallyAcceptedCountSinceOriginal: this._partiallyAcceptedSinceOriginal.count,\n\t\t\t\tpartiallyAcceptedRatioSinceOriginal: this._partiallyAcceptedSinceOriginal.ratio,\n\t\t\t\tpartiallyAcceptedCharactersSinceOriginal: this._partiallyAcceptedSinceOriginal.characters,\n\t\t\t\tshown: this._didShow,\n\t\t\t\tshownDuration: this._shownDuration,\n\t\t\t\tshownDurationUncollapsed: this._showUncollapsedDuration,\n\t\t\t\tpreceeded: this._isPreceeded,\n\t\t\t\ttimeUntilShown: this._timeUntilShown,\n\t\t\t\ttimeUntilProviderRequest: this._providerRequestInfo.startTime - this._requestInfo.startTime,\n\t\t\t\ttimeUntilProviderResponse: this._providerRequestInfo.endTime - this._requestInfo.startTime,\n\t\t\t\teditorType: this._viewData.editorType,\n\t\t\t\tlanguageId: this._requestInfo.languageId,\n\t\t\t\trequestReason: this._requestInfo.reason,\n\t\t\t\tviewKind: this._viewData.viewKind,\n\t\t\t\terror: this._viewData.error,\n\t\t\t\ttypingInterval: this._requestInfo.typingInterval,\n\t\t\t\ttypingIntervalCharacterCount: this._requestInfo.typingIntervalCharacterCount,\n\t\t\t\t...this._viewData.renderData,\n\t\t\t};\n\t\t\tthis.source.provider.handleEndOfLifetime(this.source.inlineSuggestions, this.sourceInlineCompletion, reason, summary);\n\t\t}\n\t}\n\n\tpublic reportInlineEditError(message: string): void {\n\t\tif (this._viewData.error) {\n\t\t\tthis._viewData.error += `; ${message}`;\n\t\t} else {\n\t\t\tthis._viewData.error = message;\n\t\t}\n\t}\n\n\tpublic setIsPreceeded(partialAccepts: PartialAcceptance): void {\n\t\tthis._isPreceeded = true;\n\n\t\tif (this._partiallyAcceptedSinceOriginal.characters !== 0 || this._partiallyAcceptedSinceOriginal.ratio !== 0 || this._partiallyAcceptedSinceOriginal.count !== 0) {\n\t\t\tconsole.warn('Expected partiallyAcceptedCountSinceOriginal to be { characters: 0, rate: 0, partialAcceptances: 0 } before setIsPreceeded.');\n\t\t}\n\t\tthis._partiallyAcceptedSinceOriginal = partialAccepts;\n\t}\n\n\t/**\n\t * Sets the end of life reason, but does not send the event to the provider yet.\n\t*/\n\tpublic setEndOfLifeReason(reason: InlineCompletionEndOfLifeReason): void {\n\t\tthis.reportInlineEditHidden();\n\t\tthis._lastSetEndOfLifeReason = reason;\n\t}\n\n\tprivate updateShownDuration(viewKind: InlineCompletionViewKind) {\n\t\tconst timeNow = Date.now();\n\t\tif (!this._showStartTime) {\n\t\t\tthis._showStartTime = timeNow;\n\t\t}\n\n\t\tconst isCollapsed = viewKind === InlineCompletionViewKind.Collapsed;\n\t\tif (!isCollapsed && this._showUncollapsedStartTime === undefined) {\n\t\t\tthis._showUncollapsedStartTime = timeNow;\n\t\t}\n\n\t\tif (isCollapsed && this._showUncollapsedStartTime !== undefined) {\n\t\t\tthis._showUncollapsedDuration += timeNow - this._showUncollapsedStartTime;\n\t\t}\n\t}\n\n\tprivate reportInlineEditHidden() {\n\t\tif (this._showStartTime === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tconst timeNow = Date.now();\n\t\tthis._shownDuration += timeNow - this._showStartTime;\n\t\tthis._showStartTime = undefined;\n\n\t\tif (this._showUncollapsedStartTime === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tthis._showUncollapsedDuration += timeNow - this._showUncollapsedStartTime;\n\t\tthis._showUncollapsedStartTime = undefined;\n\t}\n}\n\nexport interface SnippetInfo {\n\tsnippet: string;\n\t/* Could be different than the main range */\n\trange: Range;\n}\n\nexport interface IDisplayLocation {\n\trange: Range;\n\tlabel: string;\n\tkind: InlineCompletionDisplayLocationKind;\n}\n\nexport enum InlineCompletionEditorType {\n\tTextEditor = 'textEditor',\n\tDiffEditor = 'diffEditor',\n\tNotebook = 'notebook',\n}\n\n/**\n * A ref counted pointer to the computed `InlineCompletions` and the `InlineCompletionsProvider` that\n * computed them.\n */\nexport class InlineSuggestionList {\n\tprivate refCount = 0;\n\tconstructor(\n\t\tpublic readonly inlineSuggestions: InlineCompletions,\n\t\tpublic readonly inlineSuggestionsData: readonly InlineSuggestData[],\n\t\tpublic readonly provider: InlineCompletionsProvider,\n\t) { }\n\n\taddRef(): void {\n\t\tthis.refCount++;\n\t}\n\n\tremoveRef(reason: InlineCompletionsDisposeReason = { kind: 'other' }): void {\n\t\tthis.refCount--;\n\t\tif (this.refCount === 0) {\n\t\t\tfor (const item of this.inlineSuggestionsData) {\n\t\t\t\t// Fallback if it has not been called before\n\t\t\t\titem.reportEndOfLife();\n\t\t\t}\n\t\t\tthis.provider.disposeInlineCompletions(this.inlineSuggestions, reason);\n\t\t}\n\t}\n}\n\nfunction getDefaultRange(position: Position, model: ITextModel): Range {\n\tconst word = model.getWordAtPosition(position);\n\tconst maxColumn = model.getLineMaxColumn(position.lineNumber);\n\t// By default, always replace up until the end of the current line.\n\t// This default might be subject to change!\n\treturn word\n\t\t? new Range(position.lineNumber, word.startColumn, position.lineNumber, maxColumn)\n\t\t: Range.fromPositions(position, position.with(undefined, maxColumn));\n}\n\nfunction closeBrackets(text: string, position: Position, model: ITextModel, languageConfigurationService: ILanguageConfigurationService): string {\n\tconst currentLine = model.getLineContent(position.lineNumber);\n\tconst edit = StringReplacement.replace(new OffsetRange(position.column - 1, currentLine.length), text);\n\n\tconst proposedLineTokens = model.tokenization.tokenizeLinesAt(position.lineNumber, [edit.replace(currentLine)]);\n\tconst textTokens = proposedLineTokens?.[0].sliceZeroCopy(edit.getRangeAfterReplace());\n\tif (!textTokens) {\n\t\treturn text;\n\t}\n\n\tconst fixedText = fixBracketsInLine(textTokens, languageConfigurationService);\n\treturn fixedText;\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 { assertNever } from '../../../../../base/common/assert.js';\nimport { AsyncIterableObject } from '../../../../../base/common/async.js';\nimport { CancellationToken, CancellationTokenSource } from '../../../../../base/common/cancellation.js';\nimport { onUnexpectedExternalError } from '../../../../../base/common/errors.js';\nimport { Disposable, IDisposable } from '../../../../../base/common/lifecycle.js';\nimport { prefixedUuid } from '../../../../../base/common/uuid.js';\nimport { ICommandService } from '../../../../../platform/commands/common/commands.js';\nimport { ISingleEditOperation } from '../../../../common/core/editOperation.js';\nimport { StringReplacement } from '../../../../common/core/edits/stringEdit.js';\nimport { OffsetRange } from '../../../../common/core/ranges/offsetRange.js';\nimport { Position } from '../../../../common/core/position.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { TextReplacement } from '../../../../common/core/edits/textEdit.js';\nimport { InlineCompletionEndOfLifeReason, InlineCompletionEndOfLifeReasonKind, InlineCompletionDisplayLocationKind, InlineCompletion, InlineCompletionContext, InlineCompletions, InlineCompletionsProvider, PartialAcceptInfo, InlineCompletionsDisposeReason, LifetimeSummary } from '../../../../common/languages.js';\nimport { ILanguageConfigurationService } from '../../../../common/languages/languageConfigurationRegistry.js';\nimport { ITextModel } from '../../../../common/model.js';\nimport { fixBracketsInLine } from '../../../../common/model/bracketPairsTextModelPart/fixBrackets.js';\nimport { SnippetParser, Text } from '../../../snippet/browser/snippetParser.js';\nimport { getReadonlyEmptyArray } from '../utils.js';\nimport { groupByMap } from '../../../../../base/common/collections.js';\nimport { DirectedGraph } from './graph.js';\nimport { CachedFunction } from '../../../../../base/common/cache.js';\nimport { InlineCompletionViewData, InlineCompletionViewKind } from '../view/inlineEdits/inlineEditsViewInterface.js';\nimport { isDefined } from '../../../../../base/common/types.js';\nimport { inlineCompletionIsVisible } from './inlineSuggestionItem.js';\n\nexport type InlineCompletionContextWithoutUuid = Omit<InlineCompletionContext, 'requestUuid'>;\n\nexport function provideInlineCompletions(\n\tproviders: InlineCompletionsProvider[],\n\tposition: Position,\n\tmodel: ITextModel,\n\tcontext: InlineCompletionContextWithoutUuid,\n\trequestInfo: InlineSuggestRequestInfo,\n\tlanguageConfigurationService?: ILanguageConfigurationService,\n): IInlineCompletionProviderResult {\n\tconst requestUuid = prefixedUuid('icr');\n\n\tconst cancellationTokenSource = new CancellationTokenSource();\n\tlet cancelReason: InlineCompletionsDisposeReason | undefined = undefined;\n\n\tconst contextWithUuid: InlineCompletionContext = { ...context, requestUuid: requestUuid };\n\n\tconst defaultReplaceRange = getDefaultRange(position, model);\n\n\tconst providersByGroupId = groupByMap(providers, p => p.groupId);\n\tconst yieldsToGraph = DirectedGraph.from(providers, p => {\n\t\treturn p.yieldsToGroupIds?.flatMap(groupId => providersByGroupId.get(groupId) ?? []) ?? [];\n\t});\n\tconst { foundCycles } = yieldsToGraph.removeCycles();\n\tif (foundCycles.length > 0) {\n\t\tonUnexpectedExternalError(new Error(`Inline completions: cyclic yield-to dependency detected.`\n\t\t\t+ ` Path: ${foundCycles.map(s => s.toString ? s.toString() : ('' + s)).join(' -> ')}`));\n\t}\n\n\tlet runningCount = 0;\n\n\tconst queryProvider = new CachedFunction(async (provider: InlineCompletionsProvider<InlineCompletions>): Promise<InlineSuggestionList | undefined> => {\n\t\ttry {\n\t\t\trunningCount++;\n\t\t\tif (cancellationTokenSource.token.isCancellationRequested) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst yieldsTo = yieldsToGraph.getOutgoing(provider);\n\t\t\tfor (const p of yieldsTo) {\n\t\t\t\t// We know there is no cycle, so no recursion here\n\t\t\t\tconst result = await queryProvider.get(p);\n\t\t\t\tif (result) {\n\t\t\t\t\tfor (const item of result.inlineSuggestions.items) {\n\t\t\t\t\t\tif (item.isInlineEdit || typeof item.insertText !== 'string') {\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst t = new TextReplacement(Range.lift(item.range) ?? defaultReplaceRange, item.insertText);\n\t\t\t\t\t\tif (inlineCompletionIsVisible(t, undefined, model, position)) {\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// else: inline completion is not visible, so lets not block\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet result: InlineCompletions | null | undefined;\n\t\t\tconst providerStartTime = Date.now();\n\t\t\ttry {\n\t\t\t\tresult = await provider.provideInlineCompletions(model, position, contextWithUuid, cancellationTokenSource.token);\n\t\t\t} catch (e) {\n\t\t\t\tonUnexpectedExternalError(e);\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tconst providerEndTime = Date.now();\n\n\t\t\tif (!result) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst data: InlineSuggestData[] = [];\n\t\t\tconst list = new InlineSuggestionList(result, data, provider);\n\t\t\tlist.addRef();\n\t\t\trunWhenCancelled(cancellationTokenSource.token, () => {\n\t\t\t\treturn list.removeRef(cancelReason);\n\t\t\t});\n\t\t\tif (cancellationTokenSource.token.isCancellationRequested) {\n\t\t\t\treturn undefined; // The list is disposed now, so we cannot return the items!\n\t\t\t}\n\n\t\t\tfor (const item of result.items) {\n\t\t\t\tdata.push(toInlineSuggestData(item, list, defaultReplaceRange, model, languageConfigurationService, contextWithUuid, requestInfo, { startTime: providerStartTime, endTime: providerEndTime }));\n\t\t\t}\n\n\t\t\treturn list;\n\t\t} finally {\n\t\t\trunningCount--;\n\t\t}\n\t});\n\n\tconst inlineCompletionLists = AsyncIterableObject.fromPromisesResolveOrder(providers.map(p => queryProvider.get(p))).filter(isDefined);\n\n\treturn {\n\t\tget didAllProvidersReturn() { return runningCount === 0; },\n\t\tlists: inlineCompletionLists,\n\t\tcancelAndDispose: reason => {\n\t\t\tif (cancelReason !== undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcancelReason = reason;\n\t\t\tcancellationTokenSource.dispose(true);\n\t\t}\n\t};\n}\n\n/** If the token is eventually cancelled, this will not leak either. */\nexport function runWhenCancelled(token: CancellationToken, callback: () => void): IDisposable {\n\tif (token.isCancellationRequested) {\n\t\tcallback();\n\t\treturn Disposable.None;\n\t} else {\n\t\tconst listener = token.onCancellationRequested(() => {\n\t\t\tlistener.dispose();\n\t\t\tcallback();\n\t\t});\n\t\treturn { dispose: () => listener.dispose() };\n\t}\n}\n\nexport interface IInlineCompletionProviderResult {\n\tget didAllProvidersReturn(): boolean;\n\n\tcancelAndDispose(reason: InlineCompletionsDisposeReason): void;\n\n\tlists: AsyncIterableObject<InlineSuggestionList>;\n}\n\nfunction toInlineSuggestData(\n\tinlineCompletion: InlineCompletion,\n\tsource: InlineSuggestionList,\n\tdefaultReplaceRange: Range,\n\ttextModel: ITextModel,\n\tlanguageConfigurationService: ILanguageConfigurationService | undefined,\n\tcontext: InlineCompletionContext,\n\trequestInfo: InlineSuggestRequestInfo,\n\tproviderRequestInfo: InlineSuggestProviderRequestInfo,\n): InlineSuggestData {\n\tlet insertText: string;\n\tlet snippetInfo: SnippetInfo | undefined;\n\tlet range = inlineCompletion.range ? Range.lift(inlineCompletion.range) : defaultReplaceRange;\n\n\tif (typeof inlineCompletion.insertText === 'string') {\n\t\tinsertText = inlineCompletion.insertText;\n\n\t\tif (languageConfigurationService && inlineCompletion.completeBracketPairs) {\n\t\t\tinsertText = closeBrackets(\n\t\t\t\tinsertText,\n\t\t\t\trange.getStartPosition(),\n\t\t\t\ttextModel,\n\t\t\t\tlanguageConfigurationService\n\t\t\t);\n\n\t\t\t// Modify range depending on if brackets are added or removed\n\t\t\tconst diff = insertText.length - inlineCompletion.insertText.length;\n\t\t\tif (diff !== 0) {\n\t\t\t\trange = new Range(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn + diff);\n\t\t\t}\n\t\t}\n\n\t\tsnippetInfo = undefined;\n\t} else if ('snippet' in inlineCompletion.insertText) {\n\t\tconst preBracketCompletionLength = inlineCompletion.insertText.snippet.length;\n\n\t\tif (languageConfigurationService && inlineCompletion.completeBracketPairs) {\n\t\t\tinlineCompletion.insertText.snippet = closeBrackets(\n\t\t\t\tinlineCompletion.insertText.snippet,\n\t\t\t\trange.getStartPosition(),\n\t\t\t\ttextModel,\n\t\t\t\tlanguageConfigurationService\n\t\t\t);\n\n\t\t\t// Modify range depending on if brackets are added or removed\n\t\t\tconst diff = inlineCompletion.insertText.snippet.length - preBracketCompletionLength;\n\t\t\tif (diff !== 0) {\n\t\t\t\trange = new Range(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn + diff);\n\t\t\t}\n\t\t}\n\n\t\tconst snippet = new SnippetParser().parse(inlineCompletion.insertText.snippet);\n\n\t\tif (snippet.children.length === 1 && snippet.children[0] instanceof Text) {\n\t\t\tinsertText = snippet.children[0].value;\n\t\t\tsnippetInfo = undefined;\n\t\t} else {\n\t\t\tinsertText = snippet.toString();\n\t\t\tsnippetInfo = {\n\t\t\t\tsnippet: inlineCompletion.insertText.snippet,\n\t\t\t\trange: range\n\t\t\t};\n\t\t}\n\t} else {\n\t\tassertNever(inlineCompletion.insertText);\n\t}\n\n\tconst displayLocation = inlineCompletion.displayLocation ? {\n\t\trange: Range.lift(inlineCompletion.displayLocation.range),\n\t\tlabel: inlineCompletion.displayLocation.label,\n\t\tkind: inlineCompletion.displayLocation.kind\n\t} : undefined;\n\n\treturn new InlineSuggestData(\n\t\trange,\n\t\tinsertText,\n\t\tsnippetInfo,\n\t\tdisplayLocation,\n\t\tinlineCompletion.additionalTextEdits || getReadonlyEmptyArray(),\n\t\tinlineCompletion,\n\t\tsource,\n\t\tcontext,\n\t\tinlineCompletion.isInlineEdit ?? false,\n\t\trequestInfo,\n\t\tproviderRequestInfo,\n\t\tinlineCompletion.correlationId,\n\t);\n}\n\nexport type InlineSuggestRequestInfo = {\n\tstartTime: number;\n\teditorType: InlineCompletionEditorType;\n\tlanguageId: string;\n\treason: string;\n\ttypingInterval: number;\n\ttypingIntervalCharacterCount: number;\n};\n\nexport type InlineSuggestProviderRequestInfo = {\n\tstartTime: number;\n\tendTime: number;\n};\n\nexport type PartialAcceptance = {\n\tcharacters: number;\n\tcount: number;\n\tratio: number;\n};\n\nexport type InlineSuggestViewData = {\n\teditorType: InlineCompletionEditorType;\n\trenderData?: InlineCompletionViewData;\n\tviewKind?: InlineCompletionViewKind;\n\terror?: string;\n};\n\nexport class InlineSuggestData {\n\tprivate _didShow = false;\n\tprivate _timeUntilShown: number | undefined = undefined;\n\tprivate _showStartTime: number | undefined = undefined;\n\tprivate _shownDuration: number = 0;\n\tprivate _showUncollapsedStartTime: number | undefined = undefined;\n\tprivate _showUncollapsedDuration: number = 0;\n\n\tprivate _viewData: InlineSuggestViewData;\n\tprivate _didReportEndOfLife = false;\n\tprivate _lastSetEndOfLifeReason: InlineCompletionEndOfLifeReason | undefined = undefined;\n\tprivate _isPreceeded = false;\n\tprivate _partiallyAcceptedCount = 0;\n\tprivate _partiallyAcceptedSinceOriginal: PartialAcceptance = { characters: 0, ratio: 0, count: 0 };\n\n\tconstructor(\n\t\tpublic readonly range: Range,\n\t\tpublic readonly insertText: string,\n\t\tpublic readonly snippetInfo: SnippetInfo | undefined,\n\t\tpublic readonly displayLocation: IDisplayLocation | undefined,\n\t\tpublic readonly additionalTextEdits: readonly ISingleEditOperation[],\n\n\t\tpublic readonly sourceInlineCompletion: InlineCompletion,\n\t\tpublic readonly source: InlineSuggestionList,\n\t\tpublic readonly context: InlineCompletionContext,\n\t\tpublic readonly isInlineEdit: boolean,\n\n\t\tprivate readonly _requestInfo: InlineSuggestRequestInfo,\n\t\tprivate readonly _providerRequestInfo: InlineSuggestProviderRequestInfo,\n\t\tprivate readonly _correlationId: string | undefined,\n\t) {\n\t\tthis._viewData = { editorType: _requestInfo.editorType };\n\t}\n\n\tpublic get showInlineEditMenu() { return this.sourceInlineCompletion.showInlineEditMenu ?? false; }\n\n\tpublic get partialAccepts(): PartialAcceptance { return this._partiallyAcceptedSinceOriginal; }\n\n\tpublic async reportInlineEditShown(commandService: ICommandService, updatedInsertText: string, viewKind: InlineCompletionViewKind, viewData: InlineCompletionViewData): Promise<void> {\n\t\tthis.updateShownDuration(viewKind);\n\n\t\tif (this._didShow) {\n\t\t\treturn;\n\t\t}\n\t\tthis._didShow = true;\n\t\tthis._viewData.viewKind = viewKind;\n\t\tthis._viewData.renderData = viewData;\n\t\tthis._timeUntilShown = Date.now() - this._requestInfo.startTime;\n\n\t\tthis.source.provider.handleItemDidShow?.(this.source.inlineSuggestions, this.sourceInlineCompletion, updatedInsertText);\n\n\t\tif (this.sourceInlineCompletion.shownCommand) {\n\t\t\tawait commandService.executeCommand(this.sourceInlineCompletion.shownCommand.id, ...(this.sourceInlineCompletion.shownCommand.arguments || []));\n\t\t}\n\t}\n\n\tpublic reportPartialAccept(acceptedCharacters: number, info: PartialAcceptInfo, partialAcceptance: PartialAcceptance) {\n\t\tthis._partiallyAcceptedCount++;\n\t\tthis._partiallyAcceptedSinceOriginal.characters += partialAcceptance.characters;\n\t\tthis._partiallyAcceptedSinceOriginal.ratio = Math.min(this._partiallyAcceptedSinceOriginal.ratio + (1 - this._partiallyAcceptedSinceOriginal.ratio) * partialAcceptance.ratio, 1);\n\t\tthis._partiallyAcceptedSinceOriginal.count += partialAcceptance.count;\n\n\t\tthis.source.provider.handlePartialAccept?.(\n\t\t\tthis.source.inlineSuggestions,\n\t\t\tthis.sourceInlineCompletion,\n\t\t\tacceptedCharacters,\n\t\t\tinfo\n\t\t);\n\t}\n\n\t/**\n\t * Sends the end of life event to the provider.\n\t * If no reason is provided, the last set reason is used.\n\t * If no reason was set, the default reason is used.\n\t*/\n\tpublic reportEndOfLife(reason?: InlineCompletionEndOfLifeReason): void {\n\t\tif (this._didReportEndOfLife) {\n\t\t\treturn;\n\t\t}\n\t\tthis._didReportEndOfLife = true;\n\t\tthis.reportInlineEditHidden();\n\n\t\tif (!reason) {\n\t\t\treason = this._lastSetEndOfLifeReason ?? { kind: InlineCompletionEndOfLifeReasonKind.Ignored, userTypingDisagreed: false, supersededBy: undefined };\n\t\t}\n\n\t\tif (reason.kind === InlineCompletionEndOfLifeReasonKind.Rejected && this.source.provider.handleRejection) {\n\t\t\tthis.source.provider.handleRejection(this.source.inlineSuggestions, this.sourceInlineCompletion);\n\t\t}\n\n\t\tif (this.source.provider.handleEndOfLifetime) {\n\t\t\tconst summary: LifetimeSummary = {\n\t\t\t\trequestUuid: this.context.requestUuid,\n\t\t\t\tcorrelationId: this._correlationId,\n\t\t\t\tpartiallyAccepted: this._partiallyAcceptedCount,\n\t\t\t\tpartiallyAcceptedCountSinceOriginal: this._partiallyAcceptedSinceOriginal.count,\n\t\t\t\tpartiallyAcceptedRatioSinceOriginal: this._partiallyAcceptedSinceOriginal.ratio,\n\t\t\t\tpartiallyAcceptedCharactersSinceOriginal: this._partiallyAcceptedSinceOriginal.characters,\n\t\t\t\tshown: this._didShow,\n\t\t\t\tshownDuration: this._shownDuration,\n\t\t\t\tshownDurationUncollapsed: this._showUncollapsedDuration,\n\t\t\t\tpreceeded: this._isPreceeded,\n\t\t\t\ttimeUntilShown: this._timeUntilShown,\n\t\t\t\ttimeUntilProviderRequest: this._providerRequestInfo.startTime - this._requestInfo.startTime,\n\t\t\t\ttimeUntilProviderResponse: this._providerRequestInfo.endTime - this._requestInfo.startTime,\n\t\t\t\teditorType: this._viewData.editorType,\n\t\t\t\tlanguageId: this._requestInfo.languageId,\n\t\t\t\trequestReason: this._requestInfo.reason,\n\t\t\t\tviewKind: this._viewData.viewKind,\n\t\t\t\terror: this._viewData.error,\n\t\t\t\ttypingInterval: this._requestInfo.typingInterval,\n\t\t\t\ttypingIntervalCharacterCount: this._requestInfo.typingIntervalCharacterCount,\n\t\t\t\t...this._viewData.renderData,\n\t\t\t};\n\t\t\tthis.source.provider.handleEndOfLifetime(this.source.inlineSuggestions, this.sourceInlineCompletion, reason, summary);\n\t\t}\n\t}\n\n\tpublic reportInlineEditError(message: string): void {\n\t\tif (this._viewData.error) {\n\t\t\tthis._viewData.error += `; ${message}`;\n\t\t} else {\n\t\t\tthis._viewData.error = message;\n\t\t}\n\t}\n\n\tpublic setIsPreceeded(partialAccepts: PartialAcceptance): void {\n\t\tthis._isPreceeded = true;\n\n\t\tif (this._partiallyAcceptedSinceOriginal.characters !== 0 || this._partiallyAcceptedSinceOriginal.ratio !== 0 || this._partiallyAcceptedSinceOriginal.count !== 0) {\n\t\t\tconsole.warn('Expected partiallyAcceptedCountSinceOriginal to be { characters: 0, rate: 0, partialAcceptances: 0 } before setIsPreceeded.');\n\t\t}\n\t\tthis._partiallyAcceptedSinceOriginal = partialAccepts;\n\t}\n\n\t/**\n\t * Sets the end of life reason, but does not send the event to the provider yet.\n\t*/\n\tpublic setEndOfLifeReason(reason: InlineCompletionEndOfLifeReason): void {\n\t\tthis.reportInlineEditHidden();\n\t\tthis._lastSetEndOfLifeReason = reason;\n\t}\n\n\tprivate updateShownDuration(viewKind: InlineCompletionViewKind) {\n\t\tconst timeNow = Date.now();\n\t\tif (!this._showStartTime) {\n\t\t\tthis._showStartTime = timeNow;\n\t\t}\n\n\t\tconst isCollapsed = viewKind === InlineCompletionViewKind.Collapsed;\n\t\tif (!isCollapsed && this._showUncollapsedStartTime === undefined) {\n\t\t\tthis._showUncollapsedStartTime = timeNow;\n\t\t}\n\n\t\tif (isCollapsed && this._showUncollapsedStartTime !== undefined) {\n\t\t\tthis._showUncollapsedDuration += timeNow - this._showUncollapsedStartTime;\n\t\t}\n\t}\n\n\tprivate reportInlineEditHidden() {\n\t\tif (this._showStartTime === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tconst timeNow = Date.now();\n\t\tthis._shownDuration += timeNow - this._showStartTime;\n\t\tthis._showStartTime = undefined;\n\n\t\tif (this._showUncollapsedStartTime === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tthis._showUncollapsedDuration += timeNow - this._showUncollapsedStartTime;\n\t\tthis._showUncollapsedStartTime = undefined;\n\t}\n}\n\nexport interface SnippetInfo {\n\tsnippet: string;\n\t/* Could be different than the main range */\n\trange: Range;\n}\n\nexport interface IDisplayLocation {\n\trange: Range;\n\tlabel: string;\n\tkind: InlineCompletionDisplayLocationKind;\n}\n\nexport enum InlineCompletionEditorType {\n\tTextEditor = 'textEditor',\n\tDiffEditor = 'diffEditor',\n\tNotebook = 'notebook',\n}\n\n/**\n * A ref counted pointer to the computed `InlineCompletions` and the `InlineCompletionsProvider` that\n * computed them.\n */\nexport class InlineSuggestionList {\n\tprivate refCount = 0;\n\tconstructor(\n\t\tpublic readonly inlineSuggestions: InlineCompletions,\n\t\tpublic readonly inlineSuggestionsData: readonly InlineSuggestData[],\n\t\tpublic readonly provider: InlineCompletionsProvider,\n\t) { }\n\n\taddRef(): void {\n\t\tthis.refCount++;\n\t}\n\n\tremoveRef(reason: InlineCompletionsDisposeReason = { kind: 'other' }): void {\n\t\tthis.refCount--;\n\t\tif (this.refCount === 0) {\n\t\t\tfor (const item of this.inlineSuggestionsData) {\n\t\t\t\t// Fallback if it has not been called before\n\t\t\t\titem.reportEndOfLife();\n\t\t\t}\n\t\t\tthis.provider.disposeInlineCompletions(this.inlineSuggestions, reason);\n\t\t}\n\t}\n}\n\nfunction getDefaultRange(position: Position, model: ITextModel): Range {\n\tconst word = model.getWordAtPosition(position);\n\tconst maxColumn = model.getLineMaxColumn(position.lineNumber);\n\t// By default, always replace up until the end of the current line.\n\t// This default might be subject to change!\n\treturn word\n\t\t? new Range(position.lineNumber, word.startColumn, position.lineNumber, maxColumn)\n\t\t: Range.fromPositions(position, position.with(undefined, maxColumn));\n}\n\nfunction closeBrackets(text: string, position: Position, model: ITextModel, languageConfigurationService: ILanguageConfigurationService): string {\n\tconst currentLine = model.getLineContent(position.lineNumber);\n\tconst edit = StringReplacement.replace(new OffsetRange(position.column - 1, currentLine.length), text);\n\n\tconst proposedLineTokens = model.tokenization.tokenizeLinesAt(position.lineNumber, [edit.replace(currentLine)]);\n\tconst textTokens = proposedLineTokens?.[0].sliceZeroCopy(edit.getRangeAfterReplace());\n\tif (!textTokens) {\n\t\treturn text;\n\t}\n\n\tconst fixedText = fixBracketsInLine(textTokens, languageConfigurationService);\n\treturn fixedText;\n}\n"]}
1
+ {"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/editor/contrib/inlineCompletions/browser/model/provideInlineCompletions.ts","vs/editor/contrib/inlineCompletions/browser/model/provideInlineCompletions.ts"],"names":[],"mappings":"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","file":"provideInlineCompletions.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 { assertNever } from '../../../../../base/common/assert.js';\nimport { AsyncIterableProducer } from '../../../../../base/common/async.js';\nimport { CancellationToken, CancellationTokenSource } from '../../../../../base/common/cancellation.js';\nimport { onUnexpectedExternalError } from '../../../../../base/common/errors.js';\nimport { Disposable, IDisposable } from '../../../../../base/common/lifecycle.js';\nimport { prefixedUuid } from '../../../../../base/common/uuid.js';\nimport { ICommandService } from '../../../../../platform/commands/common/commands.js';\nimport { ISingleEditOperation } from '../../../../common/core/editOperation.js';\nimport { StringReplacement } from '../../../../common/core/edits/stringEdit.js';\nimport { OffsetRange } from '../../../../common/core/ranges/offsetRange.js';\nimport { Position } from '../../../../common/core/position.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { TextReplacement } from '../../../../common/core/edits/textEdit.js';\nimport { InlineCompletionEndOfLifeReason, InlineCompletionEndOfLifeReasonKind, InlineCompletionDisplayLocationKind, InlineCompletion, InlineCompletionContext, InlineCompletions, InlineCompletionsProvider, PartialAcceptInfo, InlineCompletionsDisposeReason, LifetimeSummary } from '../../../../common/languages.js';\nimport { ILanguageConfigurationService } from '../../../../common/languages/languageConfigurationRegistry.js';\nimport { ITextModel } from '../../../../common/model.js';\nimport { fixBracketsInLine } from '../../../../common/model/bracketPairsTextModelPart/fixBrackets.js';\nimport { SnippetParser, Text } from '../../../snippet/browser/snippetParser.js';\nimport { getReadonlyEmptyArray } from '../utils.js';\nimport { groupByMap } from '../../../../../base/common/collections.js';\nimport { DirectedGraph } from './graph.js';\nimport { CachedFunction } from '../../../../../base/common/cache.js';\nimport { InlineCompletionViewData, InlineCompletionViewKind } from '../view/inlineEdits/inlineEditsViewInterface.js';\nimport { isDefined } from '../../../../../base/common/types.js';\nimport { inlineCompletionIsVisible } from './inlineSuggestionItem.js';\n\nexport type InlineCompletionContextWithoutUuid = Omit<InlineCompletionContext, 'requestUuid'>;\n\nexport function provideInlineCompletions(\n\tproviders: InlineCompletionsProvider[],\n\tposition: Position,\n\tmodel: ITextModel,\n\tcontext: InlineCompletionContextWithoutUuid,\n\trequestInfo: InlineSuggestRequestInfo,\n\tlanguageConfigurationService?: ILanguageConfigurationService,\n): IInlineCompletionProviderResult {\n\tconst requestUuid = prefixedUuid('icr');\n\n\tconst cancellationTokenSource = new CancellationTokenSource();\n\tlet cancelReason: InlineCompletionsDisposeReason | undefined = undefined;\n\n\tconst contextWithUuid: InlineCompletionContext = { ...context, requestUuid: requestUuid };\n\n\tconst defaultReplaceRange = getDefaultRange(position, model);\n\n\tconst providersByGroupId = groupByMap(providers, p => p.groupId);\n\tconst yieldsToGraph = DirectedGraph.from(providers, p => {\n\t\treturn p.yieldsToGroupIds?.flatMap(groupId => providersByGroupId.get(groupId) ?? []) ?? [];\n\t});\n\tconst { foundCycles } = yieldsToGraph.removeCycles();\n\tif (foundCycles.length > 0) {\n\t\tonUnexpectedExternalError(new Error(`Inline completions: cyclic yield-to dependency detected.`\n\t\t\t+ ` Path: ${foundCycles.map(s => s.toString ? s.toString() : ('' + s)).join(' -> ')}`));\n\t}\n\n\tlet runningCount = 0;\n\n\tconst queryProvider = new CachedFunction(async (provider: InlineCompletionsProvider<InlineCompletions>): Promise<InlineSuggestionList | undefined> => {\n\t\ttry {\n\t\t\trunningCount++;\n\t\t\tif (cancellationTokenSource.token.isCancellationRequested) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst yieldsTo = yieldsToGraph.getOutgoing(provider);\n\t\t\tfor (const p of yieldsTo) {\n\t\t\t\t// We know there is no cycle, so no recursion here\n\t\t\t\tconst result = await queryProvider.get(p);\n\t\t\t\tif (result) {\n\t\t\t\t\tfor (const item of result.inlineSuggestions.items) {\n\t\t\t\t\t\tif (item.isInlineEdit || typeof item.insertText !== 'string') {\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst t = new TextReplacement(Range.lift(item.range) ?? defaultReplaceRange, item.insertText);\n\t\t\t\t\t\tif (inlineCompletionIsVisible(t, undefined, model, position)) {\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// else: inline completion is not visible, so lets not block\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet result: InlineCompletions | null | undefined;\n\t\t\tconst providerStartTime = Date.now();\n\t\t\ttry {\n\t\t\t\tresult = await provider.provideInlineCompletions(model, position, contextWithUuid, cancellationTokenSource.token);\n\t\t\t} catch (e) {\n\t\t\t\tonUnexpectedExternalError(e);\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tconst providerEndTime = Date.now();\n\n\t\t\tif (!result) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst data: InlineSuggestData[] = [];\n\t\t\tconst list = new InlineSuggestionList(result, data, provider);\n\t\t\tlist.addRef();\n\t\t\trunWhenCancelled(cancellationTokenSource.token, () => {\n\t\t\t\treturn list.removeRef(cancelReason);\n\t\t\t});\n\t\t\tif (cancellationTokenSource.token.isCancellationRequested) {\n\t\t\t\treturn undefined; // The list is disposed now, so we cannot return the items!\n\t\t\t}\n\n\t\t\tfor (const item of result.items) {\n\t\t\t\tdata.push(toInlineSuggestData(item, list, defaultReplaceRange, model, languageConfigurationService, contextWithUuid, requestInfo, { startTime: providerStartTime, endTime: providerEndTime }));\n\t\t\t}\n\n\t\t\treturn list;\n\t\t} finally {\n\t\t\trunningCount--;\n\t\t}\n\t});\n\n\tconst inlineCompletionLists = AsyncIterableProducer.fromPromisesResolveOrder(providers.map(p => queryProvider.get(p))).filter(isDefined);\n\n\treturn {\n\t\tget didAllProvidersReturn() { return runningCount === 0; },\n\t\tlists: inlineCompletionLists,\n\t\tcancelAndDispose: reason => {\n\t\t\tif (cancelReason !== undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcancelReason = reason;\n\t\t\tcancellationTokenSource.dispose(true);\n\t\t}\n\t};\n}\n\n/** If the token is eventually cancelled, this will not leak either. */\nexport function runWhenCancelled(token: CancellationToken, callback: () => void): IDisposable {\n\tif (token.isCancellationRequested) {\n\t\tcallback();\n\t\treturn Disposable.None;\n\t} else {\n\t\tconst listener = token.onCancellationRequested(() => {\n\t\t\tlistener.dispose();\n\t\t\tcallback();\n\t\t});\n\t\treturn { dispose: () => listener.dispose() };\n\t}\n}\n\nexport interface IInlineCompletionProviderResult {\n\tget didAllProvidersReturn(): boolean;\n\n\tcancelAndDispose(reason: InlineCompletionsDisposeReason): void;\n\n\tlists: AsyncIterableProducer<InlineSuggestionList>;\n}\n\nfunction toInlineSuggestData(\n\tinlineCompletion: InlineCompletion,\n\tsource: InlineSuggestionList,\n\tdefaultReplaceRange: Range,\n\ttextModel: ITextModel,\n\tlanguageConfigurationService: ILanguageConfigurationService | undefined,\n\tcontext: InlineCompletionContext,\n\trequestInfo: InlineSuggestRequestInfo,\n\tproviderRequestInfo: InlineSuggestProviderRequestInfo,\n): InlineSuggestData {\n\tlet insertText: string;\n\tlet snippetInfo: SnippetInfo | undefined;\n\tlet range = inlineCompletion.range ? Range.lift(inlineCompletion.range) : defaultReplaceRange;\n\n\tif (typeof inlineCompletion.insertText === 'string') {\n\t\tinsertText = inlineCompletion.insertText;\n\n\t\tif (languageConfigurationService && inlineCompletion.completeBracketPairs) {\n\t\t\tinsertText = closeBrackets(\n\t\t\t\tinsertText,\n\t\t\t\trange.getStartPosition(),\n\t\t\t\ttextModel,\n\t\t\t\tlanguageConfigurationService\n\t\t\t);\n\n\t\t\t// Modify range depending on if brackets are added or removed\n\t\t\tconst diff = insertText.length - inlineCompletion.insertText.length;\n\t\t\tif (diff !== 0) {\n\t\t\t\trange = new Range(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn + diff);\n\t\t\t}\n\t\t}\n\n\t\tsnippetInfo = undefined;\n\t} else if ('snippet' in inlineCompletion.insertText) {\n\t\tconst preBracketCompletionLength = inlineCompletion.insertText.snippet.length;\n\n\t\tif (languageConfigurationService && inlineCompletion.completeBracketPairs) {\n\t\t\tinlineCompletion.insertText.snippet = closeBrackets(\n\t\t\t\tinlineCompletion.insertText.snippet,\n\t\t\t\trange.getStartPosition(),\n\t\t\t\ttextModel,\n\t\t\t\tlanguageConfigurationService\n\t\t\t);\n\n\t\t\t// Modify range depending on if brackets are added or removed\n\t\t\tconst diff = inlineCompletion.insertText.snippet.length - preBracketCompletionLength;\n\t\t\tif (diff !== 0) {\n\t\t\t\trange = new Range(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn + diff);\n\t\t\t}\n\t\t}\n\n\t\tconst snippet = new SnippetParser().parse(inlineCompletion.insertText.snippet);\n\n\t\tif (snippet.children.length === 1 && snippet.children[0] instanceof Text) {\n\t\t\tinsertText = snippet.children[0].value;\n\t\t\tsnippetInfo = undefined;\n\t\t} else {\n\t\t\tinsertText = snippet.toString();\n\t\t\tsnippetInfo = {\n\t\t\t\tsnippet: inlineCompletion.insertText.snippet,\n\t\t\t\trange: range\n\t\t\t};\n\t\t}\n\t} else {\n\t\tassertNever(inlineCompletion.insertText);\n\t}\n\n\tconst displayLocation = inlineCompletion.displayLocation ? {\n\t\trange: Range.lift(inlineCompletion.displayLocation.range),\n\t\tlabel: inlineCompletion.displayLocation.label,\n\t\tkind: inlineCompletion.displayLocation.kind\n\t} : undefined;\n\n\treturn new InlineSuggestData(\n\t\trange,\n\t\tinsertText,\n\t\tsnippetInfo,\n\t\tdisplayLocation,\n\t\tinlineCompletion.additionalTextEdits || getReadonlyEmptyArray(),\n\t\tinlineCompletion,\n\t\tsource,\n\t\tcontext,\n\t\tinlineCompletion.isInlineEdit ?? false,\n\t\trequestInfo,\n\t\tproviderRequestInfo,\n\t\tinlineCompletion.correlationId,\n\t);\n}\n\nexport type InlineSuggestRequestInfo = {\n\tstartTime: number;\n\teditorType: InlineCompletionEditorType;\n\tlanguageId: string;\n\treason: string;\n\ttypingInterval: number;\n\ttypingIntervalCharacterCount: number;\n};\n\nexport type InlineSuggestProviderRequestInfo = {\n\tstartTime: number;\n\tendTime: number;\n};\n\nexport type PartialAcceptance = {\n\tcharacters: number;\n\tcount: number;\n\tratio: number;\n};\n\nexport type InlineSuggestViewData = {\n\teditorType: InlineCompletionEditorType;\n\trenderData?: InlineCompletionViewData;\n\tviewKind?: InlineCompletionViewKind;\n\terror?: string;\n};\n\nexport class InlineSuggestData {\n\tprivate _didShow = false;\n\tprivate _timeUntilShown: number | undefined = undefined;\n\tprivate _showStartTime: number | undefined = undefined;\n\tprivate _shownDuration: number = 0;\n\tprivate _showUncollapsedStartTime: number | undefined = undefined;\n\tprivate _showUncollapsedDuration: number = 0;\n\n\tprivate _viewData: InlineSuggestViewData;\n\tprivate _didReportEndOfLife = false;\n\tprivate _lastSetEndOfLifeReason: InlineCompletionEndOfLifeReason | undefined = undefined;\n\tprivate _isPreceeded = false;\n\tprivate _partiallyAcceptedCount = 0;\n\tprivate _partiallyAcceptedSinceOriginal: PartialAcceptance = { characters: 0, ratio: 0, count: 0 };\n\n\tconstructor(\n\t\tpublic readonly range: Range,\n\t\tpublic readonly insertText: string,\n\t\tpublic readonly snippetInfo: SnippetInfo | undefined,\n\t\tpublic readonly displayLocation: IDisplayLocation | undefined,\n\t\tpublic readonly additionalTextEdits: readonly ISingleEditOperation[],\n\n\t\tpublic readonly sourceInlineCompletion: InlineCompletion,\n\t\tpublic readonly source: InlineSuggestionList,\n\t\tpublic readonly context: InlineCompletionContext,\n\t\tpublic readonly isInlineEdit: boolean,\n\n\t\tprivate readonly _requestInfo: InlineSuggestRequestInfo,\n\t\tprivate readonly _providerRequestInfo: InlineSuggestProviderRequestInfo,\n\t\tprivate readonly _correlationId: string | undefined,\n\t) {\n\t\tthis._viewData = { editorType: _requestInfo.editorType };\n\t}\n\n\tpublic get showInlineEditMenu() { return this.sourceInlineCompletion.showInlineEditMenu ?? false; }\n\n\tpublic get partialAccepts(): PartialAcceptance { return this._partiallyAcceptedSinceOriginal; }\n\n\tpublic async reportInlineEditShown(commandService: ICommandService, updatedInsertText: string, viewKind: InlineCompletionViewKind, viewData: InlineCompletionViewData): Promise<void> {\n\t\tthis.updateShownDuration(viewKind);\n\n\t\tif (this._didShow) {\n\t\t\treturn;\n\t\t}\n\t\tthis._didShow = true;\n\t\tthis._viewData.viewKind = viewKind;\n\t\tthis._viewData.renderData = viewData;\n\t\tthis._timeUntilShown = Date.now() - this._requestInfo.startTime;\n\n\t\tthis.source.provider.handleItemDidShow?.(this.source.inlineSuggestions, this.sourceInlineCompletion, updatedInsertText);\n\n\t\tif (this.sourceInlineCompletion.shownCommand) {\n\t\t\tawait commandService.executeCommand(this.sourceInlineCompletion.shownCommand.id, ...(this.sourceInlineCompletion.shownCommand.arguments || []));\n\t\t}\n\t}\n\n\tpublic reportPartialAccept(acceptedCharacters: number, info: PartialAcceptInfo, partialAcceptance: PartialAcceptance) {\n\t\tthis._partiallyAcceptedCount++;\n\t\tthis._partiallyAcceptedSinceOriginal.characters += partialAcceptance.characters;\n\t\tthis._partiallyAcceptedSinceOriginal.ratio = Math.min(this._partiallyAcceptedSinceOriginal.ratio + (1 - this._partiallyAcceptedSinceOriginal.ratio) * partialAcceptance.ratio, 1);\n\t\tthis._partiallyAcceptedSinceOriginal.count += partialAcceptance.count;\n\n\t\tthis.source.provider.handlePartialAccept?.(\n\t\t\tthis.source.inlineSuggestions,\n\t\t\tthis.sourceInlineCompletion,\n\t\t\tacceptedCharacters,\n\t\t\tinfo\n\t\t);\n\t}\n\n\t/**\n\t * Sends the end of life event to the provider.\n\t * If no reason is provided, the last set reason is used.\n\t * If no reason was set, the default reason is used.\n\t*/\n\tpublic reportEndOfLife(reason?: InlineCompletionEndOfLifeReason): void {\n\t\tif (this._didReportEndOfLife) {\n\t\t\treturn;\n\t\t}\n\t\tthis._didReportEndOfLife = true;\n\t\tthis.reportInlineEditHidden();\n\n\t\tif (!reason) {\n\t\t\treason = this._lastSetEndOfLifeReason ?? { kind: InlineCompletionEndOfLifeReasonKind.Ignored, userTypingDisagreed: false, supersededBy: undefined };\n\t\t}\n\n\t\tif (reason.kind === InlineCompletionEndOfLifeReasonKind.Rejected && this.source.provider.handleRejection) {\n\t\t\tthis.source.provider.handleRejection(this.source.inlineSuggestions, this.sourceInlineCompletion);\n\t\t}\n\n\t\tif (this.source.provider.handleEndOfLifetime) {\n\t\t\tconst summary: LifetimeSummary = {\n\t\t\t\trequestUuid: this.context.requestUuid,\n\t\t\t\tcorrelationId: this._correlationId,\n\t\t\t\tpartiallyAccepted: this._partiallyAcceptedCount,\n\t\t\t\tpartiallyAcceptedCountSinceOriginal: this._partiallyAcceptedSinceOriginal.count,\n\t\t\t\tpartiallyAcceptedRatioSinceOriginal: this._partiallyAcceptedSinceOriginal.ratio,\n\t\t\t\tpartiallyAcceptedCharactersSinceOriginal: this._partiallyAcceptedSinceOriginal.characters,\n\t\t\t\tshown: this._didShow,\n\t\t\t\tshownDuration: this._shownDuration,\n\t\t\t\tshownDurationUncollapsed: this._showUncollapsedDuration,\n\t\t\t\tpreceeded: this._isPreceeded,\n\t\t\t\ttimeUntilShown: this._timeUntilShown,\n\t\t\t\ttimeUntilProviderRequest: this._providerRequestInfo.startTime - this._requestInfo.startTime,\n\t\t\t\ttimeUntilProviderResponse: this._providerRequestInfo.endTime - this._requestInfo.startTime,\n\t\t\t\teditorType: this._viewData.editorType,\n\t\t\t\tlanguageId: this._requestInfo.languageId,\n\t\t\t\trequestReason: this._requestInfo.reason,\n\t\t\t\tviewKind: this._viewData.viewKind,\n\t\t\t\terror: this._viewData.error,\n\t\t\t\ttypingInterval: this._requestInfo.typingInterval,\n\t\t\t\ttypingIntervalCharacterCount: this._requestInfo.typingIntervalCharacterCount,\n\t\t\t\t...this._viewData.renderData,\n\t\t\t};\n\t\t\tthis.source.provider.handleEndOfLifetime(this.source.inlineSuggestions, this.sourceInlineCompletion, reason, summary);\n\t\t}\n\t}\n\n\tpublic reportInlineEditError(message: string): void {\n\t\tif (this._viewData.error) {\n\t\t\tthis._viewData.error += `; ${message}`;\n\t\t} else {\n\t\t\tthis._viewData.error = message;\n\t\t}\n\t}\n\n\tpublic setIsPreceeded(partialAccepts: PartialAcceptance): void {\n\t\tthis._isPreceeded = true;\n\n\t\tif (this._partiallyAcceptedSinceOriginal.characters !== 0 || this._partiallyAcceptedSinceOriginal.ratio !== 0 || this._partiallyAcceptedSinceOriginal.count !== 0) {\n\t\t\tconsole.warn('Expected partiallyAcceptedCountSinceOriginal to be { characters: 0, rate: 0, partialAcceptances: 0 } before setIsPreceeded.');\n\t\t}\n\t\tthis._partiallyAcceptedSinceOriginal = partialAccepts;\n\t}\n\n\t/**\n\t * Sets the end of life reason, but does not send the event to the provider yet.\n\t*/\n\tpublic setEndOfLifeReason(reason: InlineCompletionEndOfLifeReason): void {\n\t\tthis.reportInlineEditHidden();\n\t\tthis._lastSetEndOfLifeReason = reason;\n\t}\n\n\tprivate updateShownDuration(viewKind: InlineCompletionViewKind) {\n\t\tconst timeNow = Date.now();\n\t\tif (!this._showStartTime) {\n\t\t\tthis._showStartTime = timeNow;\n\t\t}\n\n\t\tconst isCollapsed = viewKind === InlineCompletionViewKind.Collapsed;\n\t\tif (!isCollapsed && this._showUncollapsedStartTime === undefined) {\n\t\t\tthis._showUncollapsedStartTime = timeNow;\n\t\t}\n\n\t\tif (isCollapsed && this._showUncollapsedStartTime !== undefined) {\n\t\t\tthis._showUncollapsedDuration += timeNow - this._showUncollapsedStartTime;\n\t\t}\n\t}\n\n\tprivate reportInlineEditHidden() {\n\t\tif (this._showStartTime === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tconst timeNow = Date.now();\n\t\tthis._shownDuration += timeNow - this._showStartTime;\n\t\tthis._showStartTime = undefined;\n\n\t\tif (this._showUncollapsedStartTime === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tthis._showUncollapsedDuration += timeNow - this._showUncollapsedStartTime;\n\t\tthis._showUncollapsedStartTime = undefined;\n\t}\n}\n\nexport interface SnippetInfo {\n\tsnippet: string;\n\t/* Could be different than the main range */\n\trange: Range;\n}\n\nexport interface IDisplayLocation {\n\trange: Range;\n\tlabel: string;\n\tkind: InlineCompletionDisplayLocationKind;\n}\n\nexport enum InlineCompletionEditorType {\n\tTextEditor = 'textEditor',\n\tDiffEditor = 'diffEditor',\n\tNotebook = 'notebook',\n}\n\n/**\n * A ref counted pointer to the computed `InlineCompletions` and the `InlineCompletionsProvider` that\n * computed them.\n */\nexport class InlineSuggestionList {\n\tprivate refCount = 0;\n\tconstructor(\n\t\tpublic readonly inlineSuggestions: InlineCompletions,\n\t\tpublic readonly inlineSuggestionsData: readonly InlineSuggestData[],\n\t\tpublic readonly provider: InlineCompletionsProvider,\n\t) { }\n\n\taddRef(): void {\n\t\tthis.refCount++;\n\t}\n\n\tremoveRef(reason: InlineCompletionsDisposeReason = { kind: 'other' }): void {\n\t\tthis.refCount--;\n\t\tif (this.refCount === 0) {\n\t\t\tfor (const item of this.inlineSuggestionsData) {\n\t\t\t\t// Fallback if it has not been called before\n\t\t\t\titem.reportEndOfLife();\n\t\t\t}\n\t\t\tthis.provider.disposeInlineCompletions(this.inlineSuggestions, reason);\n\t\t}\n\t}\n}\n\nfunction getDefaultRange(position: Position, model: ITextModel): Range {\n\tconst word = model.getWordAtPosition(position);\n\tconst maxColumn = model.getLineMaxColumn(position.lineNumber);\n\t// By default, always replace up until the end of the current line.\n\t// This default might be subject to change!\n\treturn word\n\t\t? new Range(position.lineNumber, word.startColumn, position.lineNumber, maxColumn)\n\t\t: Range.fromPositions(position, position.with(undefined, maxColumn));\n}\n\nfunction closeBrackets(text: string, position: Position, model: ITextModel, languageConfigurationService: ILanguageConfigurationService): string {\n\tconst currentLine = model.getLineContent(position.lineNumber);\n\tconst edit = StringReplacement.replace(new OffsetRange(position.column - 1, currentLine.length), text);\n\n\tconst proposedLineTokens = model.tokenization.tokenizeLinesAt(position.lineNumber, [edit.replace(currentLine)]);\n\tconst textTokens = proposedLineTokens?.[0].sliceZeroCopy(edit.getRangeAfterReplace());\n\tif (!textTokens) {\n\t\treturn text;\n\t}\n\n\tconst fixedText = fixBracketsInLine(textTokens, languageConfigurationService);\n\treturn fixedText;\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 { assertNever } from '../../../../../base/common/assert.js';\nimport { AsyncIterableProducer } from '../../../../../base/common/async.js';\nimport { CancellationToken, CancellationTokenSource } from '../../../../../base/common/cancellation.js';\nimport { onUnexpectedExternalError } from '../../../../../base/common/errors.js';\nimport { Disposable, IDisposable } from '../../../../../base/common/lifecycle.js';\nimport { prefixedUuid } from '../../../../../base/common/uuid.js';\nimport { ICommandService } from '../../../../../platform/commands/common/commands.js';\nimport { ISingleEditOperation } from '../../../../common/core/editOperation.js';\nimport { StringReplacement } from '../../../../common/core/edits/stringEdit.js';\nimport { OffsetRange } from '../../../../common/core/ranges/offsetRange.js';\nimport { Position } from '../../../../common/core/position.js';\nimport { Range } from '../../../../common/core/range.js';\nimport { TextReplacement } from '../../../../common/core/edits/textEdit.js';\nimport { InlineCompletionEndOfLifeReason, InlineCompletionEndOfLifeReasonKind, InlineCompletionDisplayLocationKind, InlineCompletion, InlineCompletionContext, InlineCompletions, InlineCompletionsProvider, PartialAcceptInfo, InlineCompletionsDisposeReason, LifetimeSummary } from '../../../../common/languages.js';\nimport { ILanguageConfigurationService } from '../../../../common/languages/languageConfigurationRegistry.js';\nimport { ITextModel } from '../../../../common/model.js';\nimport { fixBracketsInLine } from '../../../../common/model/bracketPairsTextModelPart/fixBrackets.js';\nimport { SnippetParser, Text } from '../../../snippet/browser/snippetParser.js';\nimport { getReadonlyEmptyArray } from '../utils.js';\nimport { groupByMap } from '../../../../../base/common/collections.js';\nimport { DirectedGraph } from './graph.js';\nimport { CachedFunction } from '../../../../../base/common/cache.js';\nimport { InlineCompletionViewData, InlineCompletionViewKind } from '../view/inlineEdits/inlineEditsViewInterface.js';\nimport { isDefined } from '../../../../../base/common/types.js';\nimport { inlineCompletionIsVisible } from './inlineSuggestionItem.js';\n\nexport type InlineCompletionContextWithoutUuid = Omit<InlineCompletionContext, 'requestUuid'>;\n\nexport function provideInlineCompletions(\n\tproviders: InlineCompletionsProvider[],\n\tposition: Position,\n\tmodel: ITextModel,\n\tcontext: InlineCompletionContextWithoutUuid,\n\trequestInfo: InlineSuggestRequestInfo,\n\tlanguageConfigurationService?: ILanguageConfigurationService,\n): IInlineCompletionProviderResult {\n\tconst requestUuid = prefixedUuid('icr');\n\n\tconst cancellationTokenSource = new CancellationTokenSource();\n\tlet cancelReason: InlineCompletionsDisposeReason | undefined = undefined;\n\n\tconst contextWithUuid: InlineCompletionContext = { ...context, requestUuid: requestUuid };\n\n\tconst defaultReplaceRange = getDefaultRange(position, model);\n\n\tconst providersByGroupId = groupByMap(providers, p => p.groupId);\n\tconst yieldsToGraph = DirectedGraph.from(providers, p => {\n\t\treturn p.yieldsToGroupIds?.flatMap(groupId => providersByGroupId.get(groupId) ?? []) ?? [];\n\t});\n\tconst { foundCycles } = yieldsToGraph.removeCycles();\n\tif (foundCycles.length > 0) {\n\t\tonUnexpectedExternalError(new Error(`Inline completions: cyclic yield-to dependency detected.`\n\t\t\t+ ` Path: ${foundCycles.map(s => s.toString ? s.toString() : ('' + s)).join(' -> ')}`));\n\t}\n\n\tlet runningCount = 0;\n\n\tconst queryProvider = new CachedFunction(async (provider: InlineCompletionsProvider<InlineCompletions>): Promise<InlineSuggestionList | undefined> => {\n\t\ttry {\n\t\t\trunningCount++;\n\t\t\tif (cancellationTokenSource.token.isCancellationRequested) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst yieldsTo = yieldsToGraph.getOutgoing(provider);\n\t\t\tfor (const p of yieldsTo) {\n\t\t\t\t// We know there is no cycle, so no recursion here\n\t\t\t\tconst result = await queryProvider.get(p);\n\t\t\t\tif (result) {\n\t\t\t\t\tfor (const item of result.inlineSuggestions.items) {\n\t\t\t\t\t\tif (item.isInlineEdit || typeof item.insertText !== 'string') {\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst t = new TextReplacement(Range.lift(item.range) ?? defaultReplaceRange, item.insertText);\n\t\t\t\t\t\tif (inlineCompletionIsVisible(t, undefined, model, position)) {\n\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// else: inline completion is not visible, so lets not block\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet result: InlineCompletions | null | undefined;\n\t\t\tconst providerStartTime = Date.now();\n\t\t\ttry {\n\t\t\t\tresult = await provider.provideInlineCompletions(model, position, contextWithUuid, cancellationTokenSource.token);\n\t\t\t} catch (e) {\n\t\t\t\tonUnexpectedExternalError(e);\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tconst providerEndTime = Date.now();\n\n\t\t\tif (!result) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\tconst data: InlineSuggestData[] = [];\n\t\t\tconst list = new InlineSuggestionList(result, data, provider);\n\t\t\tlist.addRef();\n\t\t\trunWhenCancelled(cancellationTokenSource.token, () => {\n\t\t\t\treturn list.removeRef(cancelReason);\n\t\t\t});\n\t\t\tif (cancellationTokenSource.token.isCancellationRequested) {\n\t\t\t\treturn undefined; // The list is disposed now, so we cannot return the items!\n\t\t\t}\n\n\t\t\tfor (const item of result.items) {\n\t\t\t\tdata.push(toInlineSuggestData(item, list, defaultReplaceRange, model, languageConfigurationService, contextWithUuid, requestInfo, { startTime: providerStartTime, endTime: providerEndTime }));\n\t\t\t}\n\n\t\t\treturn list;\n\t\t} finally {\n\t\t\trunningCount--;\n\t\t}\n\t});\n\n\tconst inlineCompletionLists = AsyncIterableProducer.fromPromisesResolveOrder(providers.map(p => queryProvider.get(p))).filter(isDefined);\n\n\treturn {\n\t\tget didAllProvidersReturn() { return runningCount === 0; },\n\t\tlists: inlineCompletionLists,\n\t\tcancelAndDispose: reason => {\n\t\t\tif (cancelReason !== undefined) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcancelReason = reason;\n\t\t\tcancellationTokenSource.dispose(true);\n\t\t}\n\t};\n}\n\n/** If the token is eventually cancelled, this will not leak either. */\nexport function runWhenCancelled(token: CancellationToken, callback: () => void): IDisposable {\n\tif (token.isCancellationRequested) {\n\t\tcallback();\n\t\treturn Disposable.None;\n\t} else {\n\t\tconst listener = token.onCancellationRequested(() => {\n\t\t\tlistener.dispose();\n\t\t\tcallback();\n\t\t});\n\t\treturn { dispose: () => listener.dispose() };\n\t}\n}\n\nexport interface IInlineCompletionProviderResult {\n\tget didAllProvidersReturn(): boolean;\n\n\tcancelAndDispose(reason: InlineCompletionsDisposeReason): void;\n\n\tlists: AsyncIterableProducer<InlineSuggestionList>;\n}\n\nfunction toInlineSuggestData(\n\tinlineCompletion: InlineCompletion,\n\tsource: InlineSuggestionList,\n\tdefaultReplaceRange: Range,\n\ttextModel: ITextModel,\n\tlanguageConfigurationService: ILanguageConfigurationService | undefined,\n\tcontext: InlineCompletionContext,\n\trequestInfo: InlineSuggestRequestInfo,\n\tproviderRequestInfo: InlineSuggestProviderRequestInfo,\n): InlineSuggestData {\n\tlet insertText: string;\n\tlet snippetInfo: SnippetInfo | undefined;\n\tlet range = inlineCompletion.range ? Range.lift(inlineCompletion.range) : defaultReplaceRange;\n\n\tif (typeof inlineCompletion.insertText === 'string') {\n\t\tinsertText = inlineCompletion.insertText;\n\n\t\tif (languageConfigurationService && inlineCompletion.completeBracketPairs) {\n\t\t\tinsertText = closeBrackets(\n\t\t\t\tinsertText,\n\t\t\t\trange.getStartPosition(),\n\t\t\t\ttextModel,\n\t\t\t\tlanguageConfigurationService\n\t\t\t);\n\n\t\t\t// Modify range depending on if brackets are added or removed\n\t\t\tconst diff = insertText.length - inlineCompletion.insertText.length;\n\t\t\tif (diff !== 0) {\n\t\t\t\trange = new Range(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn + diff);\n\t\t\t}\n\t\t}\n\n\t\tsnippetInfo = undefined;\n\t} else if ('snippet' in inlineCompletion.insertText) {\n\t\tconst preBracketCompletionLength = inlineCompletion.insertText.snippet.length;\n\n\t\tif (languageConfigurationService && inlineCompletion.completeBracketPairs) {\n\t\t\tinlineCompletion.insertText.snippet = closeBrackets(\n\t\t\t\tinlineCompletion.insertText.snippet,\n\t\t\t\trange.getStartPosition(),\n\t\t\t\ttextModel,\n\t\t\t\tlanguageConfigurationService\n\t\t\t);\n\n\t\t\t// Modify range depending on if brackets are added or removed\n\t\t\tconst diff = inlineCompletion.insertText.snippet.length - preBracketCompletionLength;\n\t\t\tif (diff !== 0) {\n\t\t\t\trange = new Range(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn + diff);\n\t\t\t}\n\t\t}\n\n\t\tconst snippet = new SnippetParser().parse(inlineCompletion.insertText.snippet);\n\n\t\tif (snippet.children.length === 1 && snippet.children[0] instanceof Text) {\n\t\t\tinsertText = snippet.children[0].value;\n\t\t\tsnippetInfo = undefined;\n\t\t} else {\n\t\t\tinsertText = snippet.toString();\n\t\t\tsnippetInfo = {\n\t\t\t\tsnippet: inlineCompletion.insertText.snippet,\n\t\t\t\trange: range\n\t\t\t};\n\t\t}\n\t} else {\n\t\tassertNever(inlineCompletion.insertText);\n\t}\n\n\tconst displayLocation = inlineCompletion.displayLocation ? {\n\t\trange: Range.lift(inlineCompletion.displayLocation.range),\n\t\tlabel: inlineCompletion.displayLocation.label,\n\t\tkind: inlineCompletion.displayLocation.kind\n\t} : undefined;\n\n\treturn new InlineSuggestData(\n\t\trange,\n\t\tinsertText,\n\t\tsnippetInfo,\n\t\tdisplayLocation,\n\t\tinlineCompletion.additionalTextEdits || getReadonlyEmptyArray(),\n\t\tinlineCompletion,\n\t\tsource,\n\t\tcontext,\n\t\tinlineCompletion.isInlineEdit ?? false,\n\t\trequestInfo,\n\t\tproviderRequestInfo,\n\t\tinlineCompletion.correlationId,\n\t);\n}\n\nexport type InlineSuggestRequestInfo = {\n\tstartTime: number;\n\teditorType: InlineCompletionEditorType;\n\tlanguageId: string;\n\treason: string;\n\ttypingInterval: number;\n\ttypingIntervalCharacterCount: number;\n};\n\nexport type InlineSuggestProviderRequestInfo = {\n\tstartTime: number;\n\tendTime: number;\n};\n\nexport type PartialAcceptance = {\n\tcharacters: number;\n\tcount: number;\n\tratio: number;\n};\n\nexport type InlineSuggestViewData = {\n\teditorType: InlineCompletionEditorType;\n\trenderData?: InlineCompletionViewData;\n\tviewKind?: InlineCompletionViewKind;\n\terror?: string;\n};\n\nexport class InlineSuggestData {\n\tprivate _didShow = false;\n\tprivate _timeUntilShown: number | undefined = undefined;\n\tprivate _showStartTime: number | undefined = undefined;\n\tprivate _shownDuration: number = 0;\n\tprivate _showUncollapsedStartTime: number | undefined = undefined;\n\tprivate _showUncollapsedDuration: number = 0;\n\n\tprivate _viewData: InlineSuggestViewData;\n\tprivate _didReportEndOfLife = false;\n\tprivate _lastSetEndOfLifeReason: InlineCompletionEndOfLifeReason | undefined = undefined;\n\tprivate _isPreceeded = false;\n\tprivate _partiallyAcceptedCount = 0;\n\tprivate _partiallyAcceptedSinceOriginal: PartialAcceptance = { characters: 0, ratio: 0, count: 0 };\n\n\tconstructor(\n\t\tpublic readonly range: Range,\n\t\tpublic readonly insertText: string,\n\t\tpublic readonly snippetInfo: SnippetInfo | undefined,\n\t\tpublic readonly displayLocation: IDisplayLocation | undefined,\n\t\tpublic readonly additionalTextEdits: readonly ISingleEditOperation[],\n\n\t\tpublic readonly sourceInlineCompletion: InlineCompletion,\n\t\tpublic readonly source: InlineSuggestionList,\n\t\tpublic readonly context: InlineCompletionContext,\n\t\tpublic readonly isInlineEdit: boolean,\n\n\t\tprivate readonly _requestInfo: InlineSuggestRequestInfo,\n\t\tprivate readonly _providerRequestInfo: InlineSuggestProviderRequestInfo,\n\t\tprivate readonly _correlationId: string | undefined,\n\t) {\n\t\tthis._viewData = { editorType: _requestInfo.editorType };\n\t}\n\n\tpublic get showInlineEditMenu() { return this.sourceInlineCompletion.showInlineEditMenu ?? false; }\n\n\tpublic get partialAccepts(): PartialAcceptance { return this._partiallyAcceptedSinceOriginal; }\n\n\tpublic async reportInlineEditShown(commandService: ICommandService, updatedInsertText: string, viewKind: InlineCompletionViewKind, viewData: InlineCompletionViewData): Promise<void> {\n\t\tthis.updateShownDuration(viewKind);\n\n\t\tif (this._didShow) {\n\t\t\treturn;\n\t\t}\n\t\tthis._didShow = true;\n\t\tthis._viewData.viewKind = viewKind;\n\t\tthis._viewData.renderData = viewData;\n\t\tthis._timeUntilShown = Date.now() - this._requestInfo.startTime;\n\n\t\tthis.source.provider.handleItemDidShow?.(this.source.inlineSuggestions, this.sourceInlineCompletion, updatedInsertText);\n\n\t\tif (this.sourceInlineCompletion.shownCommand) {\n\t\t\tawait commandService.executeCommand(this.sourceInlineCompletion.shownCommand.id, ...(this.sourceInlineCompletion.shownCommand.arguments || []));\n\t\t}\n\t}\n\n\tpublic reportPartialAccept(acceptedCharacters: number, info: PartialAcceptInfo, partialAcceptance: PartialAcceptance) {\n\t\tthis._partiallyAcceptedCount++;\n\t\tthis._partiallyAcceptedSinceOriginal.characters += partialAcceptance.characters;\n\t\tthis._partiallyAcceptedSinceOriginal.ratio = Math.min(this._partiallyAcceptedSinceOriginal.ratio + (1 - this._partiallyAcceptedSinceOriginal.ratio) * partialAcceptance.ratio, 1);\n\t\tthis._partiallyAcceptedSinceOriginal.count += partialAcceptance.count;\n\n\t\tthis.source.provider.handlePartialAccept?.(\n\t\t\tthis.source.inlineSuggestions,\n\t\t\tthis.sourceInlineCompletion,\n\t\t\tacceptedCharacters,\n\t\t\tinfo\n\t\t);\n\t}\n\n\t/**\n\t * Sends the end of life event to the provider.\n\t * If no reason is provided, the last set reason is used.\n\t * If no reason was set, the default reason is used.\n\t*/\n\tpublic reportEndOfLife(reason?: InlineCompletionEndOfLifeReason): void {\n\t\tif (this._didReportEndOfLife) {\n\t\t\treturn;\n\t\t}\n\t\tthis._didReportEndOfLife = true;\n\t\tthis.reportInlineEditHidden();\n\n\t\tif (!reason) {\n\t\t\treason = this._lastSetEndOfLifeReason ?? { kind: InlineCompletionEndOfLifeReasonKind.Ignored, userTypingDisagreed: false, supersededBy: undefined };\n\t\t}\n\n\t\tif (reason.kind === InlineCompletionEndOfLifeReasonKind.Rejected && this.source.provider.handleRejection) {\n\t\t\tthis.source.provider.handleRejection(this.source.inlineSuggestions, this.sourceInlineCompletion);\n\t\t}\n\n\t\tif (this.source.provider.handleEndOfLifetime) {\n\t\t\tconst summary: LifetimeSummary = {\n\t\t\t\trequestUuid: this.context.requestUuid,\n\t\t\t\tcorrelationId: this._correlationId,\n\t\t\t\tpartiallyAccepted: this._partiallyAcceptedCount,\n\t\t\t\tpartiallyAcceptedCountSinceOriginal: this._partiallyAcceptedSinceOriginal.count,\n\t\t\t\tpartiallyAcceptedRatioSinceOriginal: this._partiallyAcceptedSinceOriginal.ratio,\n\t\t\t\tpartiallyAcceptedCharactersSinceOriginal: this._partiallyAcceptedSinceOriginal.characters,\n\t\t\t\tshown: this._didShow,\n\t\t\t\tshownDuration: this._shownDuration,\n\t\t\t\tshownDurationUncollapsed: this._showUncollapsedDuration,\n\t\t\t\tpreceeded: this._isPreceeded,\n\t\t\t\ttimeUntilShown: this._timeUntilShown,\n\t\t\t\ttimeUntilProviderRequest: this._providerRequestInfo.startTime - this._requestInfo.startTime,\n\t\t\t\ttimeUntilProviderResponse: this._providerRequestInfo.endTime - this._requestInfo.startTime,\n\t\t\t\teditorType: this._viewData.editorType,\n\t\t\t\tlanguageId: this._requestInfo.languageId,\n\t\t\t\trequestReason: this._requestInfo.reason,\n\t\t\t\tviewKind: this._viewData.viewKind,\n\t\t\t\terror: this._viewData.error,\n\t\t\t\ttypingInterval: this._requestInfo.typingInterval,\n\t\t\t\ttypingIntervalCharacterCount: this._requestInfo.typingIntervalCharacterCount,\n\t\t\t\t...this._viewData.renderData,\n\t\t\t};\n\t\t\tthis.source.provider.handleEndOfLifetime(this.source.inlineSuggestions, this.sourceInlineCompletion, reason, summary);\n\t\t}\n\t}\n\n\tpublic reportInlineEditError(message: string): void {\n\t\tif (this._viewData.error) {\n\t\t\tthis._viewData.error += `; ${message}`;\n\t\t} else {\n\t\t\tthis._viewData.error = message;\n\t\t}\n\t}\n\n\tpublic setIsPreceeded(partialAccepts: PartialAcceptance): void {\n\t\tthis._isPreceeded = true;\n\n\t\tif (this._partiallyAcceptedSinceOriginal.characters !== 0 || this._partiallyAcceptedSinceOriginal.ratio !== 0 || this._partiallyAcceptedSinceOriginal.count !== 0) {\n\t\t\tconsole.warn('Expected partiallyAcceptedCountSinceOriginal to be { characters: 0, rate: 0, partialAcceptances: 0 } before setIsPreceeded.');\n\t\t}\n\t\tthis._partiallyAcceptedSinceOriginal = partialAccepts;\n\t}\n\n\t/**\n\t * Sets the end of life reason, but does not send the event to the provider yet.\n\t*/\n\tpublic setEndOfLifeReason(reason: InlineCompletionEndOfLifeReason): void {\n\t\tthis.reportInlineEditHidden();\n\t\tthis._lastSetEndOfLifeReason = reason;\n\t}\n\n\tprivate updateShownDuration(viewKind: InlineCompletionViewKind) {\n\t\tconst timeNow = Date.now();\n\t\tif (!this._showStartTime) {\n\t\t\tthis._showStartTime = timeNow;\n\t\t}\n\n\t\tconst isCollapsed = viewKind === InlineCompletionViewKind.Collapsed;\n\t\tif (!isCollapsed && this._showUncollapsedStartTime === undefined) {\n\t\t\tthis._showUncollapsedStartTime = timeNow;\n\t\t}\n\n\t\tif (isCollapsed && this._showUncollapsedStartTime !== undefined) {\n\t\t\tthis._showUncollapsedDuration += timeNow - this._showUncollapsedStartTime;\n\t\t}\n\t}\n\n\tprivate reportInlineEditHidden() {\n\t\tif (this._showStartTime === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tconst timeNow = Date.now();\n\t\tthis._shownDuration += timeNow - this._showStartTime;\n\t\tthis._showStartTime = undefined;\n\n\t\tif (this._showUncollapsedStartTime === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tthis._showUncollapsedDuration += timeNow - this._showUncollapsedStartTime;\n\t\tthis._showUncollapsedStartTime = undefined;\n\t}\n}\n\nexport interface SnippetInfo {\n\tsnippet: string;\n\t/* Could be different than the main range */\n\trange: Range;\n}\n\nexport interface IDisplayLocation {\n\trange: Range;\n\tlabel: string;\n\tkind: InlineCompletionDisplayLocationKind;\n}\n\nexport enum InlineCompletionEditorType {\n\tTextEditor = 'textEditor',\n\tDiffEditor = 'diffEditor',\n\tNotebook = 'notebook',\n}\n\n/**\n * A ref counted pointer to the computed `InlineCompletions` and the `InlineCompletionsProvider` that\n * computed them.\n */\nexport class InlineSuggestionList {\n\tprivate refCount = 0;\n\tconstructor(\n\t\tpublic readonly inlineSuggestions: InlineCompletions,\n\t\tpublic readonly inlineSuggestionsData: readonly InlineSuggestData[],\n\t\tpublic readonly provider: InlineCompletionsProvider,\n\t) { }\n\n\taddRef(): void {\n\t\tthis.refCount++;\n\t}\n\n\tremoveRef(reason: InlineCompletionsDisposeReason = { kind: 'other' }): void {\n\t\tthis.refCount--;\n\t\tif (this.refCount === 0) {\n\t\t\tfor (const item of this.inlineSuggestionsData) {\n\t\t\t\t// Fallback if it has not been called before\n\t\t\t\titem.reportEndOfLife();\n\t\t\t}\n\t\t\tthis.provider.disposeInlineCompletions(this.inlineSuggestions, reason);\n\t\t}\n\t}\n}\n\nfunction getDefaultRange(position: Position, model: ITextModel): Range {\n\tconst word = model.getWordAtPosition(position);\n\tconst maxColumn = model.getLineMaxColumn(position.lineNumber);\n\t// By default, always replace up until the end of the current line.\n\t// This default might be subject to change!\n\treturn word\n\t\t? new Range(position.lineNumber, word.startColumn, position.lineNumber, maxColumn)\n\t\t: Range.fromPositions(position, position.with(undefined, maxColumn));\n}\n\nfunction closeBrackets(text: string, position: Position, model: ITextModel, languageConfigurationService: ILanguageConfigurationService): string {\n\tconst currentLine = model.getLineContent(position.lineNumber);\n\tconst edit = StringReplacement.replace(new OffsetRange(position.column - 1, currentLine.length), text);\n\n\tconst proposedLineTokens = model.tokenization.tokenizeLinesAt(position.lineNumber, [edit.replace(currentLine)]);\n\tconst textTokens = proposedLineTokens?.[0].sliceZeroCopy(edit.getRangeAfterReplace());\n\tif (!textTokens) {\n\t\treturn text;\n\t}\n\n\tconst fixedText = fixBracketsInLine(textTokens, languageConfigurationService);\n\treturn fixedText;\n}\n"]}