monaco-editor-core 0.56.0-dev-20251125 → 0.56.0-dev-20251218

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 (410) hide show
  1. package/esm/nls.keys.json +1 -1
  2. package/esm/nls.messages.cs.js +2 -2
  3. package/esm/nls.messages.de.js +2 -2
  4. package/esm/nls.messages.es.js +2 -2
  5. package/esm/nls.messages.fr.js +2 -2
  6. package/esm/nls.messages.it.js +2 -2
  7. package/esm/nls.messages.ja.js +2 -2
  8. package/esm/nls.messages.js +1 -1
  9. package/esm/nls.messages.json +1 -1
  10. package/esm/nls.messages.ko.js +2 -2
  11. package/esm/nls.messages.pl.js +2 -2
  12. package/esm/nls.messages.pt-br.js +2 -2
  13. package/esm/nls.messages.ru.js +2 -2
  14. package/esm/nls.messages.tr.js +2 -2
  15. package/esm/nls.messages.zh-cn.js +2 -2
  16. package/esm/nls.messages.zh-tw.js +2 -2
  17. package/esm/nls.metadata.json +34 -6
  18. package/esm/vs/base/browser/dom.js +1 -4
  19. package/esm/vs/base/browser/dom.js.map +1 -1
  20. package/esm/vs/base/browser/markdownRenderer.js +25 -11
  21. package/esm/vs/base/browser/markdownRenderer.js.map +1 -1
  22. package/esm/vs/base/browser/ui/actionbar/actionViewItems.js.map +1 -1
  23. package/esm/vs/base/browser/ui/button/button.js +15 -8
  24. package/esm/vs/base/browser/ui/button/button.js.map +1 -1
  25. package/esm/vs/base/browser/ui/codicons/codicon/codicon-modifiers.css +3 -8
  26. package/esm/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
  27. package/esm/vs/base/browser/ui/findinput/findInput.js +6 -1
  28. package/esm/vs/base/browser/ui/findinput/findInput.js.map +1 -1
  29. package/esm/vs/base/browser/ui/inputbox/inputBox.js +17 -1
  30. package/esm/vs/base/browser/ui/inputbox/inputBox.js.map +1 -1
  31. package/esm/vs/base/browser/ui/list/list.css +1 -0
  32. package/esm/vs/base/browser/ui/toggle/toggle.js +78 -6
  33. package/esm/vs/base/browser/ui/toggle/toggle.js.map +1 -1
  34. package/esm/vs/base/browser/ui/toolbar/toolbar.js +3 -0
  35. package/esm/vs/base/browser/ui/toolbar/toolbar.js.map +1 -1
  36. package/esm/vs/base/common/codiconsLibrary.js +11 -2
  37. package/esm/vs/base/common/codiconsLibrary.js.map +1 -1
  38. package/esm/vs/base/common/defaultAccount.js +6 -0
  39. package/esm/vs/base/common/defaultAccount.js.map +1 -0
  40. package/esm/vs/base/common/equals.js +73 -24
  41. package/esm/vs/base/common/equals.js.map +1 -1
  42. package/esm/vs/base/common/event.js +14 -4
  43. package/esm/vs/base/common/event.js.map +1 -1
  44. package/esm/vs/base/common/iterator.js.map +1 -1
  45. package/esm/vs/base/common/keybindings.js +0 -8
  46. package/esm/vs/base/common/keybindings.js.map +1 -1
  47. package/esm/vs/base/common/lifecycle.js +2 -2
  48. package/esm/vs/base/common/lifecycle.js.map +1 -1
  49. package/esm/vs/base/common/marshallingIds.js.map +1 -1
  50. package/esm/vs/base/common/observableInternal/index.js +1 -1
  51. package/esm/vs/base/common/observableInternal/index.js.map +1 -1
  52. package/esm/vs/base/common/observableInternal/observables/observableFromEvent.js +1 -1
  53. package/esm/vs/base/common/observableInternal/observables/observableFromEvent.js.map +1 -1
  54. package/esm/vs/base/common/observableInternal/reactions/autorunImpl.js +16 -0
  55. package/esm/vs/base/common/observableInternal/reactions/autorunImpl.js.map +1 -1
  56. package/esm/vs/base/common/observableInternal/utils/utils.js +11 -0
  57. package/esm/vs/base/common/observableInternal/utils/utils.js.map +1 -1
  58. package/esm/vs/base/common/product.js.map +1 -1
  59. package/esm/vs/base/common/strings.js +3 -1
  60. package/esm/vs/base/common/strings.js.map +1 -1
  61. package/esm/vs/editor/browser/controller/dragScrolling.js +2 -1
  62. package/esm/vs/editor/browser/controller/dragScrolling.js.map +1 -1
  63. package/esm/vs/editor/browser/controller/editContext/clipboardUtils.js +73 -2
  64. package/esm/vs/editor/browser/controller/editContext/clipboardUtils.js.map +1 -1
  65. package/esm/vs/editor/browser/controller/editContext/native/nativeEditContext.js +7 -51
  66. package/esm/vs/editor/browser/controller/editContext/native/nativeEditContext.js.map +1 -1
  67. package/esm/vs/editor/browser/controller/editContext/screenReaderUtils.js.map +1 -1
  68. package/esm/vs/editor/browser/controller/editContext/textArea/textAreaEditContext.js +7 -20
  69. package/esm/vs/editor/browser/controller/editContext/textArea/textAreaEditContext.js.map +1 -1
  70. package/esm/vs/editor/browser/controller/editContext/textArea/textAreaEditContextInput.js +14 -44
  71. package/esm/vs/editor/browser/controller/editContext/textArea/textAreaEditContextInput.js.map +1 -1
  72. package/esm/vs/editor/browser/controller/editContext/textArea/textAreaEditContextRegistry.js +19 -0
  73. package/esm/vs/editor/browser/controller/editContext/textArea/textAreaEditContextRegistry.js.map +1 -0
  74. package/esm/vs/editor/browser/controller/editContext/textArea/textAreaEditContextState.js +14 -1
  75. package/esm/vs/editor/browser/controller/editContext/textArea/textAreaEditContextState.js.map +1 -1
  76. package/esm/vs/editor/browser/controller/mouseHandler.js +5 -2
  77. package/esm/vs/editor/browser/controller/mouseHandler.js.map +1 -1
  78. package/esm/vs/editor/browser/editorBrowser.js.map +1 -1
  79. package/esm/vs/editor/browser/observableCodeEditor.js +32 -15
  80. package/esm/vs/editor/browser/observableCodeEditor.js.map +1 -1
  81. package/esm/vs/editor/browser/services/editorWorkerService.js +6 -2
  82. package/esm/vs/editor/browser/services/editorWorkerService.js.map +1 -1
  83. package/esm/vs/editor/browser/view.js +11 -2
  84. package/esm/vs/editor/browser/view.js.map +1 -1
  85. package/esm/vs/editor/browser/viewParts/contentWidgets/contentWidgets.js +5 -2
  86. package/esm/vs/editor/browser/viewParts/contentWidgets/contentWidgets.js.map +1 -1
  87. package/esm/vs/editor/browser/widget/codeEditor/codeEditorWidget.js +10 -0
  88. package/esm/vs/editor/browser/widget/codeEditor/codeEditorWidget.js.map +1 -1
  89. package/esm/vs/editor/browser/widget/multiDiffEditor/multiDiffEditorWidgetImpl.js.map +1 -1
  90. package/esm/vs/editor/browser/widget/multiDiffEditor/style.css +48 -0
  91. package/esm/vs/editor/common/config/editorConfigurationSchema.js +49 -47
  92. package/esm/vs/editor/common/config/editorConfigurationSchema.js.map +1 -1
  93. package/esm/vs/editor/common/config/editorOptions.js +410 -410
  94. package/esm/vs/editor/common/config/fontInfo.js +1 -1
  95. package/esm/vs/editor/common/config/fontInfo.js.map +1 -1
  96. package/esm/vs/editor/common/core/editorColorRegistry.js +69 -69
  97. package/esm/vs/editor/common/core/edits/edit.js +19 -0
  98. package/esm/vs/editor/common/core/edits/edit.js.map +1 -1
  99. package/esm/vs/editor/common/core/edits/stringEdit.js +13 -0
  100. package/esm/vs/editor/common/core/edits/stringEdit.js.map +1 -1
  101. package/esm/vs/editor/common/core/edits/textEdit.js +0 -3
  102. package/esm/vs/editor/common/core/edits/textEdit.js.map +1 -1
  103. package/esm/vs/editor/common/core/text/positionToOffsetImpl.js +24 -10
  104. package/esm/vs/editor/common/core/text/positionToOffsetImpl.js.map +1 -1
  105. package/esm/vs/editor/common/cursor/cursorMoveCommands.js +4 -4
  106. package/esm/vs/editor/common/cursor/cursorMoveCommands.js.map +1 -1
  107. package/esm/vs/editor/common/cursor/cursorWordOperations.js +6 -3
  108. package/esm/vs/editor/common/cursor/cursorWordOperations.js.map +1 -1
  109. package/esm/vs/editor/common/editorContextKeys.js +47 -47
  110. package/esm/vs/editor/common/languages/defaultDocumentColorsComputer.js +2 -2
  111. package/esm/vs/editor/common/languages/defaultDocumentColorsComputer.js.map +1 -1
  112. package/esm/vs/editor/common/languages/modesRegistry.js +1 -1
  113. package/esm/vs/editor/common/languages/nullTokenize.js +1 -1
  114. package/esm/vs/editor/common/languages/nullTokenize.js.map +1 -1
  115. package/esm/vs/editor/common/languages/supports/tokenization.js +3 -0
  116. package/esm/vs/editor/common/languages/supports/tokenization.js.map +1 -1
  117. package/esm/vs/editor/common/languages.js +58 -57
  118. package/esm/vs/editor/common/languages.js.map +1 -1
  119. package/esm/vs/editor/common/model/decorationProvider.js +21 -1
  120. package/esm/vs/editor/common/model/decorationProvider.js.map +1 -1
  121. package/esm/vs/editor/common/model/editStack.js +1 -1
  122. package/esm/vs/editor/common/model/textModel.js +49 -30
  123. package/esm/vs/editor/common/model/textModel.js.map +1 -1
  124. package/esm/vs/editor/common/model/tokens/abstractSyntaxTokenBackend.js +6 -3
  125. package/esm/vs/editor/common/model/tokens/abstractSyntaxTokenBackend.js.map +1 -1
  126. package/esm/vs/editor/common/model/tokens/annotations.js +177 -0
  127. package/esm/vs/editor/common/model/tokens/annotations.js.map +1 -0
  128. package/esm/vs/editor/common/model/tokens/tokenizationFontDecorationsProvider.js +131 -0
  129. package/esm/vs/editor/common/model/tokens/tokenizationFontDecorationsProvider.js.map +1 -0
  130. package/esm/vs/editor/common/model/tokens/tokenizationTextModelPart.js +9 -0
  131. package/esm/vs/editor/common/model/tokens/tokenizationTextModelPart.js.map +1 -1
  132. package/esm/vs/editor/common/model/tokens/tokenizerSyntaxTokenBackend.js +9 -0
  133. package/esm/vs/editor/common/model/tokens/tokenizerSyntaxTokenBackend.js.map +1 -1
  134. package/esm/vs/editor/common/standaloneStrings.js +11 -11
  135. package/esm/vs/editor/common/textModelEditSource.js +2 -0
  136. package/esm/vs/editor/common/textModelEditSource.js.map +1 -1
  137. package/esm/vs/editor/common/textModelEvents.js.map +1 -1
  138. package/esm/vs/editor/common/viewLayout/lineDecorations.js.map +1 -1
  139. package/esm/vs/editor/common/viewLayout/viewLineRenderer.js +3 -3
  140. package/esm/vs/editor/common/viewLayout/viewLineRenderer.js.map +1 -1
  141. package/esm/vs/editor/contrib/anchorSelect/browser/anchorSelect.js +6 -6
  142. package/esm/vs/editor/contrib/bracketMatching/browser/bracketMatching.js +6 -6
  143. package/esm/vs/editor/contrib/caretOperations/browser/caretOperations.js +2 -2
  144. package/esm/vs/editor/contrib/caretOperations/browser/transpose.js +1 -1
  145. package/esm/vs/editor/contrib/clipboard/browser/clipboard.js +71 -53
  146. package/esm/vs/editor/contrib/clipboard/browser/clipboard.js.map +1 -1
  147. package/esm/vs/editor/contrib/codeAction/browser/codeAction.js +1 -1
  148. package/esm/vs/editor/contrib/codeAction/browser/codeActionCommands.js +29 -29
  149. package/esm/vs/editor/contrib/codeAction/browser/codeActionContributions.js +3 -3
  150. package/esm/vs/editor/contrib/codeAction/browser/codeActionController.js +3 -3
  151. package/esm/vs/editor/contrib/codeAction/browser/codeActionMenu.js +8 -8
  152. package/esm/vs/editor/contrib/codeAction/browser/lightBulbWidget.js +9 -9
  153. package/esm/vs/editor/contrib/codelens/browser/codelensController.js +2 -2
  154. package/esm/vs/editor/contrib/colorPicker/browser/colorPickerParts/colorPickerCloseButton.js +1 -1
  155. package/esm/vs/editor/contrib/colorPicker/browser/colorPickerParts/colorPickerHeader.js +1 -1
  156. package/esm/vs/editor/contrib/colorPicker/browser/hoverColorPicker/hoverColorPickerParticipant.js +1 -1
  157. package/esm/vs/editor/contrib/colorPicker/browser/standaloneColorPicker/standaloneColorPickerActions.js +7 -7
  158. package/esm/vs/editor/contrib/comment/browser/comment.js +6 -6
  159. package/esm/vs/editor/contrib/contextmenu/browser/contextmenu.js +10 -10
  160. package/esm/vs/editor/contrib/cursorUndo/browser/cursorUndo.js +2 -2
  161. package/esm/vs/editor/contrib/dropOrPasteInto/browser/copyPasteContribution.js +4 -4
  162. package/esm/vs/editor/contrib/dropOrPasteInto/browser/copyPasteController.js +23 -10
  163. package/esm/vs/editor/contrib/dropOrPasteInto/browser/copyPasteController.js.map +1 -1
  164. package/esm/vs/editor/contrib/dropOrPasteInto/browser/defaultProviders.js +8 -8
  165. package/esm/vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorController.js +3 -3
  166. package/esm/vs/editor/contrib/dropOrPasteInto/browser/postEditWidget.js +2 -2
  167. package/esm/vs/editor/contrib/editorState/browser/keybindingCancellation.js +1 -1
  168. package/esm/vs/editor/contrib/find/browser/findController.js +16 -16
  169. package/esm/vs/editor/contrib/find/browser/findWidget.js +26 -26
  170. package/esm/vs/editor/contrib/floatingMenu/browser/floatingMenu.css +1 -1
  171. package/esm/vs/editor/contrib/folding/browser/folding.js +20 -20
  172. package/esm/vs/editor/contrib/folding/browser/folding.js.map +1 -1
  173. package/esm/vs/editor/contrib/folding/browser/foldingDecorations.js +9 -9
  174. package/esm/vs/editor/contrib/fontZoom/browser/fontZoom.js +3 -3
  175. package/esm/vs/editor/contrib/format/browser/formatActions.js +2 -2
  176. package/esm/vs/editor/contrib/gotoError/browser/gotoError.js +8 -8
  177. package/esm/vs/editor/contrib/gotoError/browser/gotoErrorWidget.js +14 -14
  178. package/esm/vs/editor/contrib/gotoSymbol/browser/goToCommands.js +39 -39
  179. package/esm/vs/editor/contrib/gotoSymbol/browser/link/goToDefinitionAtPosition.js +1 -1
  180. package/esm/vs/editor/contrib/gotoSymbol/browser/peek/referencesController.js +3 -3
  181. package/esm/vs/editor/contrib/gotoSymbol/browser/peek/referencesTree.js +3 -3
  182. package/esm/vs/editor/contrib/gotoSymbol/browser/peek/referencesWidget.js +3 -3
  183. package/esm/vs/editor/contrib/gotoSymbol/browser/referencesModel.js +8 -8
  184. package/esm/vs/editor/contrib/gotoSymbol/browser/symbolNavigation.js +3 -3
  185. package/esm/vs/editor/contrib/gpu/browser/gpuActions.js +4 -4
  186. package/esm/vs/editor/contrib/hover/browser/hover.css +1 -1
  187. package/esm/vs/editor/contrib/hover/browser/hoverActionIds.js +2 -2
  188. package/esm/vs/editor/contrib/hover/browser/hoverActions.js +24 -24
  189. package/esm/vs/editor/contrib/hover/browser/hoverCopyButton.js +2 -2
  190. package/esm/vs/editor/contrib/hover/browser/markdownHoverParticipant.js +10 -10
  191. package/esm/vs/editor/contrib/hover/browser/markdownHoverParticipant.js.map +1 -1
  192. package/esm/vs/editor/contrib/hover/browser/markerHoverParticipant.js +5 -5
  193. package/esm/vs/editor/contrib/inPlaceReplace/browser/inPlaceReplace.js +2 -2
  194. package/esm/vs/editor/contrib/indentation/browser/indentation.js +20 -20
  195. package/esm/vs/editor/contrib/inlayHints/browser/inlayHintsController.js +1 -0
  196. package/esm/vs/editor/contrib/inlayHints/browser/inlayHintsController.js.map +1 -1
  197. package/esm/vs/editor/contrib/inlayHints/browser/inlayHintsHover.js +8 -8
  198. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/commandIds.js +1 -0
  199. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/commandIds.js.map +1 -1
  200. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/commands.js +50 -21
  201. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/commands.js.map +1 -1
  202. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionContextKeys.js +13 -12
  203. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionContextKeys.js.map +1 -1
  204. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionsController.js +7 -1
  205. package/esm/vs/editor/contrib/inlineCompletions/browser/controller/inlineCompletionsController.js.map +1 -1
  206. package/esm/vs/editor/contrib/inlineCompletions/browser/hintsWidget/hoverParticipant.js +2 -2
  207. package/esm/vs/editor/contrib/inlineCompletions/browser/hintsWidget/inlineCompletionsHintsWidget.js +5 -5
  208. package/esm/vs/editor/contrib/inlineCompletions/browser/inlineCompletions.contribution.js +2 -1
  209. package/esm/vs/editor/contrib/inlineCompletions/browser/inlineCompletions.contribution.js.map +1 -1
  210. package/esm/vs/editor/contrib/inlineCompletions/browser/model/InlineSuggestAlternativeAction.js +8 -0
  211. package/esm/vs/editor/contrib/inlineCompletions/browser/model/InlineSuggestAlternativeAction.js.map +1 -0
  212. package/esm/vs/editor/contrib/inlineCompletions/browser/model/editKind.js +198 -0
  213. package/esm/vs/editor/contrib/inlineCompletions/browser/model/editKind.js.map +1 -0
  214. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionIsVisible.js +40 -0
  215. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionIsVisible.js.map +1 -0
  216. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsModel.js +128 -70
  217. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsModel.js.map +1 -1
  218. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsSource.js +59 -11
  219. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineCompletionsSource.js.map +1 -1
  220. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineSuggestionItem.js +152 -95
  221. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineSuggestionItem.js.map +1 -1
  222. package/esm/vs/editor/contrib/inlineCompletions/browser/model/provideInlineCompletions.js +113 -54
  223. package/esm/vs/editor/contrib/inlineCompletions/browser/model/provideInlineCompletions.js.map +1 -1
  224. package/esm/vs/editor/contrib/inlineCompletions/browser/model/renameSymbolProcessor.js +317 -75
  225. package/esm/vs/editor/contrib/inlineCompletions/browser/model/renameSymbolProcessor.js.map +1 -1
  226. package/esm/vs/editor/contrib/inlineCompletions/browser/telemetry.js.map +1 -1
  227. package/esm/vs/editor/contrib/inlineCompletions/browser/utils.js +20 -0
  228. package/esm/vs/editor/contrib/inlineCompletions/browser/utils.js.map +1 -1
  229. package/esm/vs/editor/contrib/inlineCompletions/browser/view/ghostText/ghostTextView.js +59 -42
  230. package/esm/vs/editor/contrib/inlineCompletions/browser/view/ghostText/ghostTextView.js.map +1 -1
  231. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorMenu.js +29 -8
  232. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorMenu.js.map +1 -1
  233. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorView.js +78 -46
  234. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorView.js.map +1 -1
  235. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditWithChanges.js +9 -4
  236. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditWithChanges.js.map +1 -1
  237. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsModel.js +11 -4
  238. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsModel.js.map +1 -1
  239. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.js +81 -41
  240. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsView.js.map +1 -1
  241. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewInterface.js +48 -0
  242. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewInterface.js.map +1 -1
  243. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewProducer.js +18 -15
  244. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViewProducer.js.map +1 -1
  245. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsCollapsedView.js +3 -4
  246. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsCollapsedView.js.map +1 -1
  247. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsCustomView.js +6 -7
  248. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsCustomView.js.map +1 -1
  249. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsDeletionView.js +4 -5
  250. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsDeletionView.js.map +1 -1
  251. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsInsertionView.js +4 -3
  252. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsInsertionView.js.map +1 -1
  253. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsLineReplacementView.js +8 -8
  254. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsLineReplacementView.js.map +1 -1
  255. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsSideBySideView.js +9 -7
  256. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsSideBySideView.js.map +1 -1
  257. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsWordReplacementView.js +203 -41
  258. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/inlineEditsWordReplacementView.js.map +1 -1
  259. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/jumpToView.js +189 -0
  260. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/jumpToView.js.map +1 -0
  261. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/longDistanceHint/inlineEditsLongDistanceHint.js +85 -102
  262. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/longDistanceHint/inlineEditsLongDistanceHint.js.map +1 -1
  263. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/longDistanceHint/longDistancePreviewEditor.js +75 -32
  264. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/longDistanceHint/longDistancePreviewEditor.js.map +1 -1
  265. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/longDistanceHint/longDistnaceWidgetPlacement.js +121 -0
  266. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/longDistanceHint/longDistnaceWidgetPlacement.js.map +1 -0
  267. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/originalEditorInlineDiffView.js +2 -1
  268. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsViews/originalEditorInlineDiffView.js.map +1 -1
  269. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/theme.js +22 -20
  270. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/theme.js.map +1 -1
  271. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/utils/utils.js +15 -5
  272. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/utils/utils.js.map +1 -1
  273. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/view.css +39 -6
  274. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineSuggestionsView.js +10 -5
  275. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineSuggestionsView.js.map +1 -1
  276. package/esm/vs/editor/contrib/insertFinalNewLine/browser/insertFinalNewLine.js +1 -1
  277. package/esm/vs/editor/contrib/lineSelection/browser/lineSelection.js +1 -1
  278. package/esm/vs/editor/contrib/linesOperations/browser/linesOperations.js +32 -32
  279. package/esm/vs/editor/contrib/linesOperations/browser/linesOperations.js.map +1 -1
  280. package/esm/vs/editor/contrib/linkedEditing/browser/linkedEditing.js +2 -2
  281. package/esm/vs/editor/contrib/links/browser/links.js +10 -10
  282. package/esm/vs/editor/contrib/message/browser/messageController.js +1 -1
  283. package/esm/vs/editor/contrib/multicursor/browser/multicursor.js +22 -22
  284. package/esm/vs/editor/contrib/parameterHints/browser/parameterHints.js +1 -1
  285. package/esm/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.js +4 -4
  286. package/esm/vs/editor/contrib/peekView/browser/peekView.js +18 -18
  287. package/esm/vs/editor/contrib/placeholderText/browser/placeholderText.contribution.js +1 -1
  288. package/esm/vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess.js +25 -27
  289. package/esm/vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess.js.map +1 -1
  290. package/esm/vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess.js +32 -32
  291. package/esm/vs/editor/contrib/readOnlyMessage/browser/contribution.js +2 -2
  292. package/esm/vs/editor/contrib/rename/browser/rename.js +19 -15
  293. package/esm/vs/editor/contrib/rename/browser/rename.js.map +1 -1
  294. package/esm/vs/editor/contrib/rename/browser/renameWidget.js +7 -7
  295. package/esm/vs/editor/contrib/sectionHeaders/browser/sectionHeaders.js +3 -2
  296. package/esm/vs/editor/contrib/sectionHeaders/browser/sectionHeaders.js.map +1 -1
  297. package/esm/vs/editor/contrib/smartSelect/browser/smartSelect.js +4 -4
  298. package/esm/vs/editor/contrib/snippet/browser/snippetController2.js +4 -4
  299. package/esm/vs/editor/contrib/snippet/browser/snippetParser.js +33 -0
  300. package/esm/vs/editor/contrib/snippet/browser/snippetParser.js.map +1 -1
  301. package/esm/vs/editor/contrib/snippet/browser/snippetVariables.js +4 -4
  302. package/esm/vs/editor/contrib/stickyScroll/browser/stickyScrollActions.js +11 -11
  303. package/esm/vs/editor/contrib/stickyScroll/browser/stickyScrollController.js +12 -4
  304. package/esm/vs/editor/contrib/stickyScroll/browser/stickyScrollController.js.map +1 -1
  305. package/esm/vs/editor/contrib/stickyScroll/browser/stickyScrollWidget.js +1 -0
  306. package/esm/vs/editor/contrib/stickyScroll/browser/stickyScrollWidget.js.map +1 -1
  307. package/esm/vs/editor/contrib/suggest/browser/suggest.js +9 -8
  308. package/esm/vs/editor/contrib/suggest/browser/suggest.js.map +1 -1
  309. package/esm/vs/editor/contrib/suggest/browser/suggestController.js +39 -28
  310. package/esm/vs/editor/contrib/suggest/browser/suggestController.js.map +1 -1
  311. package/esm/vs/editor/contrib/suggest/browser/suggestInlineCompletions.js +1 -0
  312. package/esm/vs/editor/contrib/suggest/browser/suggestInlineCompletions.js.map +1 -1
  313. package/esm/vs/editor/contrib/suggest/browser/suggestWidget.js +22 -18
  314. package/esm/vs/editor/contrib/suggest/browser/suggestWidget.js.map +1 -1
  315. package/esm/vs/editor/contrib/suggest/browser/suggestWidgetDetails.js +28 -6
  316. package/esm/vs/editor/contrib/suggest/browser/suggestWidgetDetails.js.map +1 -1
  317. package/esm/vs/editor/contrib/suggest/browser/suggestWidgetRenderer.js +2 -2
  318. package/esm/vs/editor/contrib/suggest/browser/wordContextKey.js +1 -1
  319. package/esm/vs/editor/contrib/symbolIcons/browser/symbolIcons.js +33 -33
  320. package/esm/vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.js +4 -4
  321. package/esm/vs/editor/contrib/tokenization/browser/tokenization.js +1 -1
  322. package/esm/vs/editor/contrib/unicodeHighlighter/browser/bannerController.js +1 -1
  323. package/esm/vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.js +24 -24
  324. package/esm/vs/editor/contrib/unusualLineTerminators/browser/unusualLineTerminators.js +5 -5
  325. package/esm/vs/editor/contrib/wordHighlighter/browser/highlightDecorations.js +9 -9
  326. package/esm/vs/editor/contrib/wordHighlighter/browser/wordHighlighter.js +3 -3
  327. package/esm/vs/editor/contrib/wordOperations/browser/wordOperations.js +19 -2
  328. package/esm/vs/editor/contrib/wordOperations/browser/wordOperations.js.map +1 -1
  329. package/esm/vs/editor/editor.api.d.ts +34 -3
  330. package/esm/vs/editor/standalone/browser/standaloneLanguages.js +2 -2
  331. package/esm/vs/editor/standalone/browser/standaloneLanguages.js.map +1 -1
  332. package/esm/vs/editor/standalone/browser/standaloneServices.js +11 -1
  333. package/esm/vs/editor/standalone/browser/standaloneServices.js.map +1 -1
  334. package/esm/vs/editor/standalone/common/monarch/monarchLexer.js +1 -1
  335. package/esm/vs/editor/standalone/common/monarch/monarchLexer.js.map +1 -1
  336. package/esm/vs/platform/accessibilitySignal/browser/accessibilitySignalService.js +62 -62
  337. package/esm/vs/platform/action/common/actionCommonCategories.js +6 -6
  338. package/esm/vs/platform/actionWidget/browser/actionList.js +4 -4
  339. package/esm/vs/platform/actionWidget/browser/actionWidget.css +11 -8
  340. package/esm/vs/platform/actionWidget/browser/actionWidget.js +7 -7
  341. package/esm/vs/platform/actions/browser/menuEntryActionViewItem.js +5 -5
  342. package/esm/vs/platform/actions/browser/toolbar.js +2 -2
  343. package/esm/vs/platform/actions/common/actions.js +11 -5
  344. package/esm/vs/platform/actions/common/actions.js.map +1 -1
  345. package/esm/vs/platform/actions/common/menuService.js +2 -2
  346. package/esm/vs/platform/configuration/common/configurationRegistry.js +10 -10
  347. package/esm/vs/platform/contextkey/browser/contextKeyService.js +1 -1
  348. package/esm/vs/platform/contextkey/common/contextkey.js +9 -9
  349. package/esm/vs/platform/contextkey/common/contextkeys.js +9 -9
  350. package/esm/vs/platform/contextkey/common/scanner.js +5 -5
  351. package/esm/vs/platform/{product/common/productService.js → defaultAccount/common/defaultAccount.js} +2 -2
  352. package/esm/vs/platform/defaultAccount/common/defaultAccount.js.map +1 -0
  353. package/esm/vs/platform/history/browser/contextScopedHistoryWidget.js +1 -1
  354. package/esm/vs/platform/hover/browser/hoverWidget.js +1 -1
  355. package/esm/vs/platform/hover/browser/updatableHoverWidget.js +1 -1
  356. package/esm/vs/platform/instantiation/common/instantiation.js.map +1 -1
  357. package/esm/vs/platform/instantiation/common/instantiationService.js +1 -8
  358. package/esm/vs/platform/instantiation/common/instantiationService.js.map +1 -1
  359. package/esm/vs/platform/keybinding/common/abstractKeybindingService.js +4 -4
  360. package/esm/vs/platform/list/browser/listService.js +27 -27
  361. package/esm/vs/platform/log/common/log.js +1 -1
  362. package/esm/vs/platform/log/common/log.js.map +1 -1
  363. package/esm/vs/platform/markers/common/markerService.js +6 -6
  364. package/esm/vs/platform/markers/common/markerService.js.map +1 -1
  365. package/esm/vs/platform/markers/common/markers.js +6 -6
  366. package/esm/vs/platform/quickinput/browser/commandsQuickAccess.js +8 -8
  367. package/esm/vs/platform/quickinput/browser/helpQuickAccess.js +1 -1
  368. package/esm/vs/platform/quickinput/browser/media/quickInput.css +45 -7
  369. package/esm/vs/platform/quickinput/browser/quickInput.js +51 -15
  370. package/esm/vs/platform/quickinput/browser/quickInput.js.map +1 -1
  371. package/esm/vs/platform/quickinput/browser/quickInputActions.js +5 -5
  372. package/esm/vs/platform/quickinput/browser/quickInputBox.js +13 -1
  373. package/esm/vs/platform/quickinput/browser/quickInputBox.js.map +1 -1
  374. package/esm/vs/platform/quickinput/browser/quickInputController.js +22 -12
  375. package/esm/vs/platform/quickinput/browser/quickInputController.js.map +1 -1
  376. package/esm/vs/platform/quickinput/browser/quickInputList.js +17 -12
  377. package/esm/vs/platform/quickinput/browser/quickInputList.js.map +1 -1
  378. package/esm/vs/platform/quickinput/browser/quickInputUtils.js +36 -8
  379. package/esm/vs/platform/quickinput/browser/quickInputUtils.js.map +1 -1
  380. package/esm/vs/platform/quickinput/browser/tree/quickInputTreeAccessibilityProvider.js +1 -1
  381. package/esm/vs/platform/quickinput/browser/tree/quickInputTreeController.js +3 -3
  382. package/esm/vs/platform/quickinput/browser/tree/quickInputTreeController.js.map +1 -1
  383. package/esm/vs/platform/quickinput/browser/tree/quickInputTreeRenderer.js +8 -4
  384. package/esm/vs/platform/quickinput/browser/tree/quickInputTreeRenderer.js.map +1 -1
  385. package/esm/vs/platform/quickinput/common/quickInput.js.map +1 -1
  386. package/esm/vs/platform/theme/common/colorUtils.js +2 -2
  387. package/esm/vs/platform/theme/common/colors/baseColors.js +18 -17
  388. package/esm/vs/platform/theme/common/colors/baseColors.js.map +1 -1
  389. package/esm/vs/platform/theme/common/colors/chartsColors.js +8 -8
  390. package/esm/vs/platform/theme/common/colors/editorColors.js +95 -95
  391. package/esm/vs/platform/theme/common/colors/inputColors.js +47 -47
  392. package/esm/vs/platform/theme/common/colors/listColors.js +36 -36
  393. package/esm/vs/platform/theme/common/colors/menuColors.js +7 -7
  394. package/esm/vs/platform/theme/common/colors/minimapColors.js +13 -13
  395. package/esm/vs/platform/theme/common/colors/minimapColors.js.map +1 -1
  396. package/esm/vs/platform/theme/common/colors/miscColors.js +16 -16
  397. package/esm/vs/platform/theme/common/colors/quickpickColors.js +9 -9
  398. package/esm/vs/platform/theme/common/colors/searchColors.js +3 -3
  399. package/esm/vs/platform/theme/common/iconRegistry.js +6 -6
  400. package/esm/vs/platform/undoRedo/common/undoRedoService.js +21 -21
  401. package/esm/vs/platform/undoRedo/common/undoRedoService.js.map +1 -1
  402. package/esm/vs/platform/window/common/window.js +1 -1
  403. package/esm/vs/platform/window/common/window.js.map +1 -1
  404. package/esm/vs/platform/workspace/common/workspace.js +1 -1
  405. package/monaco.d.ts +34 -3
  406. package/package.json +2 -2
  407. package/version.txt +1 -1
  408. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineEdit.js +0 -16
  409. package/esm/vs/editor/contrib/inlineCompletions/browser/model/inlineEdit.js.map +0 -1
  410. package/esm/vs/platform/product/common/productService.js.map +0 -1
@@ -30,10 +30,10 @@ export class IndentationToSpacesAction extends EditorAction {
30
30
  constructor() {
31
31
  super({
32
32
  id: IndentationToSpacesAction.ID,
33
- label: nls.localize2(1154, "Convert Indentation to Spaces"),
33
+ label: nls.localize2(1155, "Convert Indentation to Spaces"),
34
34
  precondition: EditorContextKeys.writable,
35
35
  metadata: {
36
- description: nls.localize2(1155, "Convert the tab indentation to spaces."),
36
+ description: nls.localize2(1156, "Convert the tab indentation to spaces."),
37
37
  }
38
38
  });
39
39
  }
@@ -61,10 +61,10 @@ export class IndentationToTabsAction extends EditorAction {
61
61
  constructor() {
62
62
  super({
63
63
  id: IndentationToTabsAction.ID,
64
- label: nls.localize2(1156, "Convert Indentation to Tabs"),
64
+ label: nls.localize2(1157, "Convert Indentation to Tabs"),
65
65
  precondition: EditorContextKeys.writable,
66
66
  metadata: {
67
- description: nls.localize2(1157, "Convert the spaces indentation to tabs."),
67
+ description: nls.localize2(1158, "Convert the spaces indentation to tabs."),
68
68
  }
69
69
  });
70
70
  }
@@ -107,17 +107,17 @@ export class ChangeIndentationSizeAction extends EditorAction {
107
107
  label: n.toString(),
108
108
  // add description for tabSize value set in the configuration
109
109
  description: (n === creationOpts.tabSize && n === modelOpts.tabSize
110
- ? nls.localize(1150, "Configured Tab Size")
110
+ ? nls.localize(1151, "Configured Tab Size")
111
111
  : n === creationOpts.tabSize
112
- ? nls.localize(1151, "Default Tab Size")
112
+ ? nls.localize(1152, "Default Tab Size")
113
113
  : n === modelOpts.tabSize
114
- ? nls.localize(1152, "Current Tab Size")
114
+ ? nls.localize(1153, "Current Tab Size")
115
115
  : undefined)
116
116
  }));
117
117
  // auto focus the tabSize set for the current editor
118
118
  const autoFocusIndex = Math.min(model.getOptions().tabSize - 1, 7);
119
119
  setTimeout(() => {
120
- quickInputService.pick(picks, { placeHolder: nls.localize(1153, "Select Tab Size for Current File"), activeItem: picks[autoFocusIndex] }).then(pick => {
120
+ quickInputService.pick(picks, { placeHolder: nls.localize(1154, "Select Tab Size for Current File"), activeItem: picks[autoFocusIndex] }).then(pick => {
121
121
  if (pick) {
122
122
  if (model && !model.isDisposed()) {
123
123
  const pickedVal = parseInt(pick.label, 10);
@@ -144,10 +144,10 @@ export class IndentUsingTabs extends ChangeIndentationSizeAction {
144
144
  constructor() {
145
145
  super(false, false, {
146
146
  id: IndentUsingTabs.ID,
147
- label: nls.localize2(1158, "Indent Using Tabs"),
147
+ label: nls.localize2(1159, "Indent Using Tabs"),
148
148
  precondition: undefined,
149
149
  metadata: {
150
- description: nls.localize2(1159, "Use indentation with tabs."),
150
+ description: nls.localize2(1160, "Use indentation with tabs."),
151
151
  }
152
152
  });
153
153
  }
@@ -157,10 +157,10 @@ export class IndentUsingSpaces extends ChangeIndentationSizeAction {
157
157
  constructor() {
158
158
  super(true, false, {
159
159
  id: IndentUsingSpaces.ID,
160
- label: nls.localize2(1160, "Indent Using Spaces"),
160
+ label: nls.localize2(1161, "Indent Using Spaces"),
161
161
  precondition: undefined,
162
162
  metadata: {
163
- description: nls.localize2(1161, "Use indentation with spaces."),
163
+ description: nls.localize2(1162, "Use indentation with spaces."),
164
164
  }
165
165
  });
166
166
  }
@@ -170,10 +170,10 @@ export class ChangeTabDisplaySize extends ChangeIndentationSizeAction {
170
170
  constructor() {
171
171
  super(true, true, {
172
172
  id: ChangeTabDisplaySize.ID,
173
- label: nls.localize2(1162, "Change Tab Display Size"),
173
+ label: nls.localize2(1163, "Change Tab Display Size"),
174
174
  precondition: undefined,
175
175
  metadata: {
176
- description: nls.localize2(1163, "Change the space size equivalent of the tab."),
176
+ description: nls.localize2(1164, "Change the space size equivalent of the tab."),
177
177
  }
178
178
  });
179
179
  }
@@ -183,10 +183,10 @@ export class DetectIndentation extends EditorAction {
183
183
  constructor() {
184
184
  super({
185
185
  id: DetectIndentation.ID,
186
- label: nls.localize2(1164, "Detect Indentation from Content"),
186
+ label: nls.localize2(1165, "Detect Indentation from Content"),
187
187
  precondition: undefined,
188
188
  metadata: {
189
- description: nls.localize2(1165, "Detect the indentation from content."),
189
+ description: nls.localize2(1166, "Detect the indentation from content."),
190
190
  }
191
191
  });
192
192
  }
@@ -204,10 +204,10 @@ export class ReindentLinesAction extends EditorAction {
204
204
  constructor() {
205
205
  super({
206
206
  id: 'editor.action.reindentlines',
207
- label: nls.localize2(1166, "Reindent Lines"),
207
+ label: nls.localize2(1167, "Reindent Lines"),
208
208
  precondition: EditorContextKeys.writable,
209
209
  metadata: {
210
- description: nls.localize2(1167, "Reindent the lines of the editor."),
210
+ description: nls.localize2(1168, "Reindent the lines of the editor."),
211
211
  },
212
212
  canTriggerInlineEdits: true,
213
213
  });
@@ -230,10 +230,10 @@ export class ReindentSelectedLinesAction extends EditorAction {
230
230
  constructor() {
231
231
  super({
232
232
  id: 'editor.action.reindentselectedlines',
233
- label: nls.localize2(1168, "Reindent Selected Lines"),
233
+ label: nls.localize2(1169, "Reindent Selected Lines"),
234
234
  precondition: EditorContextKeys.writable,
235
235
  metadata: {
236
- description: nls.localize2(1169, "Reindent the selected lines of the editor."),
236
+ description: nls.localize2(1170, "Reindent the selected lines of the editor."),
237
237
  },
238
238
  canTriggerInlineEdits: true,
239
239
  });
@@ -220,6 +220,7 @@ let InlayHintsController = class InlayHintsController {
220
220
  }
221
221
  }
222
222
  store.add(inlayHints);
223
+ store.add(toDisposable(() => watchedProviders.clear()));
223
224
  this._updateHintsDecorators(inlayHints.ranges, inlayHints.items);
224
225
  this._cacheHintsForFastRestore(model);
225
226
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/editor/contrib/inlayHints/browser/inlayHintsController.ts","vs/editor/contrib/inlayHints/browser/inlayHintsController.ts"],"names":[],"mappings":"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","file":"inlayHintsController.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 { isHTMLElement, ModifierKeyEmitter } from '../../../../base/browser/dom.js';\nimport { isNonEmptyArray } from '../../../../base/common/arrays.js';\nimport { disposableTimeout, RunOnceScheduler } from '../../../../base/common/async.js';\nimport { CancellationToken, CancellationTokenSource } from '../../../../base/common/cancellation.js';\nimport { onUnexpectedError } from '../../../../base/common/errors.js';\nimport { DisposableStore, IDisposable, MutableDisposable, toDisposable } from '../../../../base/common/lifecycle.js';\nimport { LRUCache } from '../../../../base/common/map.js';\nimport { IRange } from '../../../../base/common/range.js';\nimport { assertType } from '../../../../base/common/types.js';\nimport { URI } from '../../../../base/common/uri.js';\nimport { IActiveCodeEditor, ICodeEditor, IEditorMouseEvent, MouseTargetType } from '../../../browser/editorBrowser.js';\nimport { ClassNameReference, CssProperties, DynamicCssRules } from '../../../browser/editorDom.js';\nimport { StableEditorScrollState } from '../../../browser/stableEditorScroll.js';\nimport { EditorOption } from '../../../common/config/editorOptions.js';\nimport { EDITOR_FONT_DEFAULTS } from '../../../common/config/fontInfo.js';\nimport { EditOperation } from '../../../common/core/editOperation.js';\nimport { Range } from '../../../common/core/range.js';\nimport { IEditorContribution } from '../../../common/editorCommon.js';\nimport * as languages from '../../../common/languages.js';\nimport { IModelDeltaDecoration, InjectedTextCursorStops, InjectedTextOptions, ITextModel, TrackedRangeStickiness } from '../../../common/model.js';\nimport { ModelDecorationInjectedTextOptions } from '../../../common/model/textModel.js';\nimport { IFeatureDebounceInformation, ILanguageFeatureDebounceService } from '../../../common/services/languageFeatureDebounce.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { ITextModelService } from '../../../common/services/resolverService.js';\nimport { ClickLinkGesture, ClickLinkMouseEvent } from '../../gotoSymbol/browser/link/clickLinkGesture.js';\nimport { InlayHintAnchor, InlayHintItem, InlayHintsFragments } from './inlayHints.js';\nimport { goToDefinitionWithLocation, showGoToContextMenu } from './inlayHintsLocations.js';\nimport { CommandsRegistry, ICommandService } from '../../../../platform/commands/common/commands.js';\nimport { InstantiationType, registerSingleton } from '../../../../platform/instantiation/common/extensions.js';\nimport { createDecorator, IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { INotificationService, Severity } from '../../../../platform/notification/common/notification.js';\nimport * as colors from '../../../../platform/theme/common/colorRegistry.js';\nimport { themeColorFromId } from '../../../../platform/theme/common/themeService.js';\nimport { Position } from '../../../common/core/position.js';\n\n// --- hint caching service (per session)\n\nclass InlayHintsCache {\n\n\tdeclare readonly _serviceBrand: undefined;\n\n\tprivate readonly _entries = new LRUCache<string, InlayHintItem[]>(50);\n\n\tget(model: ITextModel): InlayHintItem[] | undefined {\n\t\tconst key = InlayHintsCache._key(model);\n\t\treturn this._entries.get(key);\n\t}\n\n\tset(model: ITextModel, value: InlayHintItem[]): void {\n\t\tconst key = InlayHintsCache._key(model);\n\t\tthis._entries.set(key, value);\n\t}\n\n\tprivate static _key(model: ITextModel): string {\n\t\treturn `${model.uri.toString()}/${model.getVersionId()}`;\n\t}\n}\n\ninterface IInlayHintsCache extends InlayHintsCache { }\nconst IInlayHintsCache = createDecorator<IInlayHintsCache>('IInlayHintsCache');\nregisterSingleton(IInlayHintsCache, InlayHintsCache, InstantiationType.Delayed);\n\n// --- rendered label\n\nexport class RenderedInlayHintLabelPart {\n\tconstructor(readonly item: InlayHintItem, readonly index: number) { }\n\n\tget part() {\n\t\tconst label = this.item.hint.label;\n\t\tif (typeof label === 'string') {\n\t\t\treturn { label };\n\t\t} else {\n\t\t\treturn label[this.index];\n\t\t}\n\t}\n}\n\nclass ActiveInlayHintInfo {\n\tconstructor(readonly part: RenderedInlayHintLabelPart, readonly hasTriggerModifier: boolean) { }\n}\n\ntype InlayHintDecorationRenderInfo = {\n\titem: InlayHintItem;\n\tdecoration: IModelDeltaDecoration;\n\tclassNameRef: ClassNameReference;\n};\n\nconst enum RenderMode {\n\tNormal,\n\tInvisible\n}\n\n\n\n/**\n * Mix of CancellationTokenSource, DisposableStore and MutableDisposable\n */\nclass CancellationStore implements IDisposable {\n\n\tprivate readonly _store = new MutableDisposable<DisposableStore>();\n\tprivate _tokenSource = new CancellationTokenSource();\n\n\tdispose() {\n\t\tthis._store.dispose();\n\t\tthis._tokenSource.dispose(true);\n\t}\n\n\treset() {\n\t\tthis._tokenSource.dispose(true);\n\t\tthis._tokenSource = new CancellationTokenSource();\n\t\tthis._store.value = new DisposableStore();\n\n\t\treturn {\n\t\t\tstore: this._store.value,\n\t\t\ttoken: this._tokenSource.token\n\t\t};\n\t}\n}\n\n\n// --- controller\n\n\nexport class InlayHintsController implements IEditorContribution {\n\n\tstatic readonly ID: string = 'editor.contrib.InlayHints';\n\n\tprivate static readonly _MAX_DECORATORS = 1500;\n\tprivate static readonly _whitespaceData = {};\n\n\tstatic get(editor: ICodeEditor): InlayHintsController | undefined {\n\t\treturn editor.getContribution<InlayHintsController>(InlayHintsController.ID) ?? undefined;\n\t}\n\n\tprivate readonly _disposables = new DisposableStore();\n\tprivate readonly _sessionDisposables = new DisposableStore();\n\tprivate readonly _decorationsMetadata = new Map<string, InlayHintDecorationRenderInfo>();\n\tprivate readonly _debounceInfo: IFeatureDebounceInformation;\n\tprivate readonly _ruleFactory: DynamicCssRules;\n\n\tprivate _cursorInfo?: { position: Position; notEarlierThan: number };\n\tprivate _activeRenderMode = RenderMode.Normal;\n\tprivate _activeInlayHintPart?: ActiveInlayHintInfo;\n\n\tconstructor(\n\t\tprivate readonly _editor: ICodeEditor,\n\t\t@ILanguageFeaturesService private readonly _languageFeaturesService: ILanguageFeaturesService,\n\t\t@ILanguageFeatureDebounceService _featureDebounce: ILanguageFeatureDebounceService,\n\t\t@IInlayHintsCache private readonly _inlayHintsCache: IInlayHintsCache,\n\t\t@ICommandService private readonly _commandService: ICommandService,\n\t\t@INotificationService private readonly _notificationService: INotificationService,\n\t\t@IInstantiationService private readonly _instaService: IInstantiationService,\n\t) {\n\t\tthis._ruleFactory = this._disposables.add(new DynamicCssRules(this._editor));\n\t\tthis._debounceInfo = _featureDebounce.for(_languageFeaturesService.inlayHintsProvider, 'InlayHint', { min: 25 });\n\t\tthis._disposables.add(_languageFeaturesService.inlayHintsProvider.onDidChange(() => this._update()));\n\t\tthis._disposables.add(_editor.onDidChangeModel(() => this._update()));\n\t\tthis._disposables.add(_editor.onDidChangeModelLanguage(() => this._update()));\n\t\tthis._disposables.add(_editor.onDidChangeConfiguration(e => {\n\t\t\tif (e.hasChanged(EditorOption.inlayHints)) {\n\t\t\t\tthis._update();\n\t\t\t}\n\t\t}));\n\t\tthis._update();\n\n\t}\n\n\tdispose(): void {\n\t\tthis._sessionDisposables.dispose();\n\t\tthis._removeAllDecorations();\n\t\tthis._disposables.dispose();\n\t}\n\n\tprivate _update(): void {\n\t\tthis._sessionDisposables.clear();\n\t\tthis._removeAllDecorations();\n\n\t\tconst options = this._editor.getOption(EditorOption.inlayHints);\n\t\tif (options.enabled === 'off') {\n\t\t\treturn;\n\t\t}\n\n\t\tconst model = this._editor.getModel();\n\t\tif (!model || !this._languageFeaturesService.inlayHintsProvider.has(model)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (options.enabled === 'on') {\n\t\t\t// different \"on\" modes: always\n\t\t\tthis._activeRenderMode = RenderMode.Normal;\n\t\t} else {\n\t\t\t// different \"on\" modes: offUnlessPressed, or onUnlessPressed\n\t\t\tlet defaultMode: RenderMode;\n\t\t\tlet altMode: RenderMode;\n\t\t\tif (options.enabled === 'onUnlessPressed') {\n\t\t\t\tdefaultMode = RenderMode.Normal;\n\t\t\t\taltMode = RenderMode.Invisible;\n\t\t\t} else {\n\t\t\t\tdefaultMode = RenderMode.Invisible;\n\t\t\t\taltMode = RenderMode.Normal;\n\t\t\t}\n\t\t\tthis._activeRenderMode = defaultMode;\n\n\t\t\tthis._sessionDisposables.add(ModifierKeyEmitter.getInstance().event(e => {\n\t\t\t\tif (!this._editor.hasModel()) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst newRenderMode = e.altKey && e.ctrlKey && !(e.shiftKey || e.metaKey) ? altMode : defaultMode;\n\t\t\t\tif (newRenderMode !== this._activeRenderMode) {\n\t\t\t\t\tthis._activeRenderMode = newRenderMode;\n\t\t\t\t\tconst model = this._editor.getModel();\n\t\t\t\t\tconst copies = this._copyInlayHintsWithCurrentAnchor(model);\n\t\t\t\t\tthis._updateHintsDecorators([model.getFullModelRange()], copies);\n\t\t\t\t\tscheduler.schedule(0);\n\t\t\t\t}\n\t\t\t}));\n\t\t}\n\n\t\t// iff possible, quickly update from cache\n\t\tconst cached = this._inlayHintsCache.get(model);\n\t\tif (cached) {\n\t\t\tthis._updateHintsDecorators([model.getFullModelRange()], cached);\n\t\t}\n\t\tthis._sessionDisposables.add(toDisposable(() => {\n\t\t\t// cache items when switching files etc\n\t\t\tif (!model.isDisposed()) {\n\t\t\t\tthis._cacheHintsForFastRestore(model);\n\t\t\t}\n\t\t}));\n\n\t\tlet cts: CancellationTokenSource | undefined;\n\t\tconst watchedProviders = new Set<languages.InlayHintsProvider>();\n\n\t\tthis._sessionDisposables.add(model.onWillDispose(() => cts?.cancel()));\n\n\t\tconst cancellationStore = this._sessionDisposables.add(new CancellationStore());\n\n\t\tconst scheduler = new RunOnceScheduler(async () => {\n\t\t\tconst t1 = Date.now();\n\n\t\t\tconst { store, token } = cancellationStore.reset();\n\n\t\t\ttry {\n\t\t\t\tconst inlayHints = await InlayHintsFragments.create(this._languageFeaturesService.inlayHintsProvider, model, this._getHintsRanges(), token);\n\t\t\t\tscheduler.delay = this._debounceInfo.update(model, Date.now() - t1);\n\t\t\t\tif (token.isCancellationRequested) {\n\t\t\t\t\tinlayHints.dispose();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// listen to provider changes\n\t\t\t\tfor (const provider of inlayHints.provider) {\n\t\t\t\t\tif (typeof provider.onDidChangeInlayHints === 'function' && !watchedProviders.has(provider)) {\n\t\t\t\t\t\twatchedProviders.add(provider);\n\t\t\t\t\t\tstore.add(provider.onDidChangeInlayHints(() => {\n\t\t\t\t\t\t\tif (!scheduler.isScheduled()) { // ignore event when request is already scheduled\n\t\t\t\t\t\t\t\tscheduler.schedule();\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\tstore.add(inlayHints);\n\t\t\t\tthis._updateHintsDecorators(inlayHints.ranges, inlayHints.items);\n\t\t\t\tthis._cacheHintsForFastRestore(model);\n\n\t\t\t} catch (err) {\n\t\t\t\tonUnexpectedError(err);\n\t\t\t}\n\t\t}, this._debounceInfo.get(model));\n\n\t\tthis._sessionDisposables.add(scheduler);\n\t\tscheduler.schedule(0);\n\n\t\tthis._sessionDisposables.add(this._editor.onDidScrollChange((e) => {\n\t\t\t// update when scroll position changes\n\t\t\t// uses scrollTopChanged has weak heuristic to differenatiate between scrolling due to\n\t\t\t// typing or due to \"actual\" scrolling\n\t\t\tif (e.scrollTopChanged || !scheduler.isScheduled()) {\n\t\t\t\tscheduler.schedule();\n\t\t\t}\n\t\t}));\n\n\t\tconst cursor = this._sessionDisposables.add(new MutableDisposable());\n\t\tthis._sessionDisposables.add(this._editor.onDidChangeModelContent((e) => {\n\t\t\tcts?.cancel();\n\n\t\t\t// mark current cursor position and time after which the whole can be updated/redrawn\n\t\t\tconst delay = Math.max(scheduler.delay, 800);\n\t\t\tthis._cursorInfo = { position: this._editor.getPosition()!, notEarlierThan: Date.now() + delay };\n\t\t\tcursor.value = disposableTimeout(() => scheduler.schedule(0), delay);\n\n\t\t\tscheduler.schedule();\n\t\t}));\n\n\t\tthis._sessionDisposables.add(this._editor.onDidChangeConfiguration(e => {\n\t\t\tif (e.hasChanged(EditorOption.inlayHints)) {\n\t\t\t\tscheduler.schedule();\n\t\t\t}\n\t\t}));\n\n\t\t// mouse gestures\n\t\tthis._sessionDisposables.add(this._installDblClickGesture(() => scheduler.schedule(0)));\n\t\tthis._sessionDisposables.add(this._installLinkGesture());\n\t\tthis._sessionDisposables.add(this._installContextMenu());\n\t}\n\n\tprivate _installLinkGesture(): IDisposable {\n\n\t\tconst store = new DisposableStore();\n\t\tconst gesture = store.add(new ClickLinkGesture(this._editor));\n\n\t\t// let removeHighlight = () => { };\n\n\t\tconst sessionStore = new DisposableStore();\n\t\tstore.add(sessionStore);\n\n\t\tstore.add(gesture.onMouseMoveOrRelevantKeyDown(e => {\n\t\t\tconst [mouseEvent] = e;\n\t\t\tconst labelPart = this._getInlayHintLabelPart(mouseEvent);\n\t\t\tconst model = this._editor.getModel();\n\n\t\t\tif (!labelPart || !model) {\n\t\t\t\tsessionStore.clear();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// resolve the item\n\t\t\tconst cts = new CancellationTokenSource();\n\t\t\tsessionStore.add(toDisposable(() => cts.dispose(true)));\n\t\t\tlabelPart.item.resolve(cts.token);\n\n\t\t\t// render link => when the modifier is pressed and when there is a command or location\n\t\t\tthis._activeInlayHintPart = labelPart.part.command || labelPart.part.location\n\t\t\t\t? new ActiveInlayHintInfo(labelPart, mouseEvent.hasTriggerModifier)\n\t\t\t\t: undefined;\n\n\t\t\tconst lineNumber = model.validatePosition(labelPart.item.hint.position).lineNumber;\n\t\t\tconst range = new Range(lineNumber, 1, lineNumber, model.getLineMaxColumn(lineNumber));\n\t\t\tconst lineHints = this._getInlineHintsForRange(range);\n\t\t\tthis._updateHintsDecorators([range], lineHints);\n\t\t\tsessionStore.add(toDisposable(() => {\n\t\t\t\tthis._activeInlayHintPart = undefined;\n\t\t\t\tthis._updateHintsDecorators([range], lineHints);\n\t\t\t}));\n\t\t}));\n\t\tstore.add(gesture.onCancel(() => sessionStore.clear()));\n\t\tstore.add(gesture.onExecute(async e => {\n\t\t\tconst label = this._getInlayHintLabelPart(e);\n\t\t\tif (label) {\n\t\t\t\tconst part = label.part;\n\t\t\t\tif (part.location) {\n\t\t\t\t\t// location -> execute go to def\n\t\t\t\t\tthis._instaService.invokeFunction(goToDefinitionWithLocation, e, this._editor as IActiveCodeEditor, part.location);\n\t\t\t\t} else if (languages.Command.is(part.command)) {\n\t\t\t\t\t// command -> execute it\n\t\t\t\t\tawait this._invokeCommand(part.command, label.item);\n\t\t\t\t}\n\t\t\t}\n\t\t}));\n\t\treturn store;\n\t}\n\n\tprivate _getInlineHintsForRange(range: Range) {\n\t\tconst lineHints = new Set<InlayHintItem>();\n\t\tfor (const data of this._decorationsMetadata.values()) {\n\t\t\tif (range.containsRange(data.item.anchor.range)) {\n\t\t\t\tlineHints.add(data.item);\n\t\t\t}\n\t\t}\n\t\treturn Array.from(lineHints);\n\t}\n\n\tprivate _installDblClickGesture(updateInlayHints: Function): IDisposable {\n\t\treturn this._editor.onMouseUp(async e => {\n\t\t\tif (e.event.detail !== 2) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst part = this._getInlayHintLabelPart(e);\n\t\t\tif (!part) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\te.event.preventDefault();\n\t\t\tawait part.item.resolve(CancellationToken.None);\n\t\t\tif (isNonEmptyArray(part.item.hint.textEdits)) {\n\t\t\t\tconst edits = part.item.hint.textEdits.map(edit => EditOperation.replace(Range.lift(edit.range), edit.text));\n\t\t\t\tthis._editor.executeEdits('inlayHint.default', edits);\n\t\t\t\tupdateInlayHints();\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate _installContextMenu(): IDisposable {\n\t\treturn this._editor.onContextMenu(async e => {\n\t\t\tif (!(isHTMLElement(e.event.target))) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst part = this._getInlayHintLabelPart(e);\n\t\t\tif (part) {\n\t\t\t\tawait this._instaService.invokeFunction(showGoToContextMenu, this._editor, e.event.target, part);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate _getInlayHintLabelPart(e: IEditorMouseEvent | ClickLinkMouseEvent): RenderedInlayHintLabelPart | undefined {\n\t\tif (e.target.type !== MouseTargetType.CONTENT_TEXT) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst options = e.target.detail.injectedText?.options;\n\t\tif (options instanceof ModelDecorationInjectedTextOptions && options?.attachedData instanceof RenderedInlayHintLabelPart) {\n\t\t\treturn options.attachedData;\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate async _invokeCommand(command: languages.Command, item: InlayHintItem) {\n\t\ttry {\n\t\t\tawait this._commandService.executeCommand(command.id, ...(command.arguments ?? []));\n\t\t} catch (err) {\n\t\t\tthis._notificationService.notify({\n\t\t\t\tseverity: Severity.Error,\n\t\t\t\tsource: item.provider.displayName,\n\t\t\t\tmessage: err\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate _cacheHintsForFastRestore(model: ITextModel): void {\n\t\tconst hints = this._copyInlayHintsWithCurrentAnchor(model);\n\t\tthis._inlayHintsCache.set(model, hints);\n\t}\n\n\t// return inlay hints but with an anchor that reflects \"updates\"\n\t// that happened after receiving them, e.g adding new lines before a hint\n\tprivate _copyInlayHintsWithCurrentAnchor(model: ITextModel): InlayHintItem[] {\n\t\tconst items = new Map<InlayHintItem, InlayHintItem>();\n\t\tfor (const [id, obj] of this._decorationsMetadata) {\n\t\t\tif (items.has(obj.item)) {\n\t\t\t\t// an inlay item can be rendered as multiple decorations\n\t\t\t\t// but they will all uses the same range\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst range = model.getDecorationRange(id);\n\t\t\tif (range) {\n\t\t\t\t// update range with whatever the editor has tweaked it to\n\t\t\t\tconst anchor = new InlayHintAnchor(range, obj.item.anchor.direction);\n\t\t\t\tconst copy = obj.item.with({ anchor });\n\t\t\t\titems.set(obj.item, copy);\n\t\t\t}\n\t\t}\n\t\treturn Array.from(items.values());\n\t}\n\n\tprivate _getHintsRanges(): Range[] {\n\t\tconst extra = 30;\n\t\tconst model = this._editor.getModel()!;\n\t\tconst visibleRanges = this._editor.getVisibleRangesPlusViewportAboveBelow();\n\t\tconst result: Range[] = [];\n\t\tfor (const range of visibleRanges.sort(Range.compareRangesUsingStarts)) {\n\t\t\tconst extendedRange = model.validateRange(new Range(range.startLineNumber - extra, range.startColumn, range.endLineNumber + extra, range.endColumn));\n\t\t\tif (result.length === 0 || !Range.areIntersectingOrTouching(result[result.length - 1], extendedRange)) {\n\t\t\t\tresult.push(extendedRange);\n\t\t\t} else {\n\t\t\t\tresult[result.length - 1] = Range.plusRange(result[result.length - 1], extendedRange);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tprivate _updateHintsDecorators(ranges: readonly Range[], items: readonly InlayHintItem[]): void {\n\n\t\tconst itemFixedLengths = new Map<InlayHintItem, number>();\n\n\t\tif (this._cursorInfo\n\t\t\t&& this._cursorInfo.notEarlierThan > Date.now()\n\t\t\t&& ranges.some(range => range.containsPosition(this._cursorInfo!.position))\n\t\t) {\n\t\t\t// collect inlay hints that are on the same line and before the cursor. Those \"old\" hints\n\t\t\t// define fixed lengths so that the cursor does not jump back and worth while typing.\n\t\t\tconst { position } = this._cursorInfo;\n\t\t\tthis._cursorInfo = undefined;\n\n\t\t\tconst lengths = new Map<InlayHintItem, number>();\n\n\t\t\tfor (const deco of this._editor.getLineDecorations(position.lineNumber) ?? []) {\n\n\t\t\t\tconst data = this._decorationsMetadata.get(deco.id);\n\t\t\t\tif (deco.range.startColumn > position.column) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst opts = data?.decoration.options[data.item.anchor.direction];\n\t\t\t\tif (opts && opts.attachedData !== InlayHintsController._whitespaceData) {\n\t\t\t\t\tconst len = lengths.get(data.item) ?? 0;\n\t\t\t\t\tlengths.set(data.item, len + opts.content.length);\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\t// on the cursor line and before the cursor-column\n\t\t\tconst newItemsWithFixedLength = items.filter(item => item.anchor.range.startLineNumber === position.lineNumber && item.anchor.range.endColumn <= position.column);\n\t\t\tconst fixedLengths = Array.from(lengths.values());\n\n\t\t\t// match up fixed lengths with items and distribute the remaining lengths to the last item\n\t\t\tlet lastItem: InlayHintItem | undefined;\n\t\t\twhile (true) {\n\t\t\t\tconst targetItem = newItemsWithFixedLength.shift();\n\t\t\t\tconst fixedLength = fixedLengths.shift();\n\n\t\t\t\tif (!fixedLength && !targetItem) {\n\t\t\t\t\tbreak; // DONE\n\t\t\t\t}\n\n\t\t\t\tif (targetItem) {\n\t\t\t\t\titemFixedLengths.set(targetItem, fixedLength ?? 0);\n\t\t\t\t\tlastItem = targetItem;\n\n\t\t\t\t} else if (lastItem && fixedLength) {\n\t\t\t\t\t// still lengths but no more item. give it all to the last\n\t\t\t\t\tlet len = itemFixedLengths.get(lastItem)!;\n\t\t\t\t\tlen += fixedLength;\n\t\t\t\t\tlen += fixedLengths.reduce((p, c) => p + c, 0);\n\t\t\t\t\tfixedLengths.length = 0;\n\t\t\t\t\tbreak; // DONE\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// utils to collect/create injected text decorations\n\t\tconst newDecorationsData: InlayHintDecorationRenderInfo[] = [];\n\t\tconst addInjectedText = (item: InlayHintItem, ref: ClassNameReference, content: string, cursorStops: InjectedTextCursorStops, attachedData?: RenderedInlayHintLabelPart | object): void => {\n\t\t\tconst opts: InjectedTextOptions = {\n\t\t\t\tcontent,\n\t\t\t\tinlineClassNameAffectsLetterSpacing: true,\n\t\t\t\tinlineClassName: ref.className,\n\t\t\t\tcursorStops,\n\t\t\t\tattachedData\n\t\t\t};\n\t\t\tnewDecorationsData.push({\n\t\t\t\titem,\n\t\t\t\tclassNameRef: ref,\n\t\t\t\tdecoration: {\n\t\t\t\t\trange: item.anchor.range,\n\t\t\t\t\toptions: {\n\t\t\t\t\t\t// className: \"rangeHighlight\", // DEBUG highlight to see to what range a hint is attached\n\t\t\t\t\t\tdescription: 'InlayHint',\n\t\t\t\t\t\tshowIfCollapsed: item.anchor.range.isEmpty(), // \"original\" range is empty\n\t\t\t\t\t\tcollapseOnReplaceEdit: !item.anchor.range.isEmpty(),\n\t\t\t\t\t\tstickiness: TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges,\n\t\t\t\t\t\t[item.anchor.direction]: this._activeRenderMode === RenderMode.Normal ? opts : undefined\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tconst addInjectedWhitespace = (item: InlayHintItem, isLast: boolean): void => {\n\t\t\tconst marginRule = this._ruleFactory.createClassNameRef({\n\t\t\t\twidth: `${(fontSize / 3) | 0}px`,\n\t\t\t\tdisplay: 'inline-block'\n\t\t\t});\n\t\t\taddInjectedText(item, marginRule, '\\u200a', isLast ? InjectedTextCursorStops.Right : InjectedTextCursorStops.None, InlayHintsController._whitespaceData);\n\t\t};\n\n\n\t\t//\n\t\tconst { fontSize, fontFamily, padding, isUniform } = this._getLayoutInfo();\n\t\tconst maxLength = this._editor.getOption(EditorOption.inlayHints).maximumLength;\n\t\tconst fontFamilyVar = '--code-editorInlayHintsFontFamily';\n\t\tthis._editor.getContainerDomNode().style.setProperty(fontFamilyVar, fontFamily);\n\n\n\t\ttype ILineInfo = { line: number; totalLen: number };\n\t\tlet currentLineInfo: ILineInfo = { line: 0, totalLen: 0 };\n\n\t\tfor (let i = 0; i < items.length; i++) {\n\t\t\tconst item = items[i];\n\n\t\t\tif (currentLineInfo.line !== item.anchor.range.startLineNumber) {\n\t\t\t\tcurrentLineInfo = { line: item.anchor.range.startLineNumber, totalLen: 0 };\n\t\t\t}\n\n\t\t\tif (maxLength && currentLineInfo.totalLen > maxLength) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// whitespace leading the actual label\n\t\t\tif (item.hint.paddingLeft) {\n\t\t\t\taddInjectedWhitespace(item, false);\n\t\t\t}\n\n\t\t\t// the label with its parts\n\t\t\tconst parts: languages.InlayHintLabelPart[] = typeof item.hint.label === 'string'\n\t\t\t\t? [{ label: item.hint.label }]\n\t\t\t\t: item.hint.label;\n\n\t\t\tconst itemFixedLength = itemFixedLengths.get(item);\n\t\t\tlet itemActualLength = 0;\n\n\t\t\tfor (let i = 0; i < parts.length; i++) {\n\t\t\t\tconst part = parts[i];\n\n\t\t\t\tconst isFirst = i === 0;\n\t\t\t\tconst isLast = i === parts.length - 1;\n\n\t\t\t\tconst cssProperties: CssProperties = {\n\t\t\t\t\tfontSize: `${fontSize}px`,\n\t\t\t\t\tfontFamily: `var(${fontFamilyVar}), ${EDITOR_FONT_DEFAULTS.fontFamily}`,\n\t\t\t\t\tverticalAlign: isUniform ? 'baseline' : 'middle',\n\t\t\t\t\tunicodeBidi: 'isolate'\n\t\t\t\t};\n\n\t\t\t\tif (isNonEmptyArray(item.hint.textEdits)) {\n\t\t\t\t\tcssProperties.cursor = 'default';\n\t\t\t\t}\n\n\t\t\t\tthis._fillInColors(cssProperties, item.hint);\n\n\t\t\t\tif ((part.command || part.location) && this._activeInlayHintPart?.part.item === item && this._activeInlayHintPart.part.index === i) {\n\t\t\t\t\t// active link!\n\t\t\t\t\tcssProperties.textDecoration = 'underline';\n\t\t\t\t\tif (this._activeInlayHintPart.hasTriggerModifier) {\n\t\t\t\t\t\tcssProperties.color = themeColorFromId(colors.editorActiveLinkForeground);\n\t\t\t\t\t\tcssProperties.cursor = 'pointer';\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlet textlabel = part.label;\n\t\t\t\tcurrentLineInfo.totalLen += textlabel.length;\n\t\t\t\tlet tooLong = false;\n\t\t\t\tconst over = maxLength !== 0 ? (currentLineInfo.totalLen - maxLength) : 0;\n\t\t\t\tif (over > 0) {\n\t\t\t\t\ttextlabel = textlabel.slice(0, -over) + '…';\n\t\t\t\t\ttooLong = true;\n\t\t\t\t}\n\n\t\t\t\titemActualLength += textlabel.length;\n\n\t\t\t\tif (itemFixedLength !== undefined) {\n\t\t\t\t\tconst overFixedLength = itemActualLength - itemFixedLength;\n\t\t\t\t\tif (overFixedLength >= 0) {\n\t\t\t\t\t\t// longer than fixed length, trim\n\t\t\t\t\t\titemActualLength -= overFixedLength;\n\t\t\t\t\t\ttextlabel = textlabel.slice(0, -(1 + overFixedLength)) + '…';\n\t\t\t\t\t\ttooLong = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (padding) {\n\t\t\t\t\tif (isFirst && (isLast || tooLong)) {\n\t\t\t\t\t\t// only element\n\t\t\t\t\t\tcssProperties.padding = `1px ${Math.max(1, fontSize / 4) | 0}px`;\n\t\t\t\t\t\tcssProperties.borderRadius = `${(fontSize / 4) | 0}px`;\n\t\t\t\t\t} else if (isFirst) {\n\t\t\t\t\t\t// first element\n\t\t\t\t\t\tcssProperties.padding = `1px 0 1px ${Math.max(1, fontSize / 4) | 0}px`;\n\t\t\t\t\t\tcssProperties.borderRadius = `${(fontSize / 4) | 0}px 0 0 ${(fontSize / 4) | 0}px`;\n\t\t\t\t\t} else if ((isLast || tooLong)) {\n\t\t\t\t\t\t// last element\n\t\t\t\t\t\tcssProperties.padding = `1px ${Math.max(1, fontSize / 4) | 0}px 1px 0`;\n\t\t\t\t\t\tcssProperties.borderRadius = `0 ${(fontSize / 4) | 0}px ${(fontSize / 4) | 0}px 0`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcssProperties.padding = `1px 0 1px 0`;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\taddInjectedText(\n\t\t\t\t\titem,\n\t\t\t\t\tthis._ruleFactory.createClassNameRef(cssProperties),\n\t\t\t\t\tfixSpace(textlabel),\n\t\t\t\t\tisLast && !item.hint.paddingRight ? InjectedTextCursorStops.Right : InjectedTextCursorStops.None,\n\t\t\t\t\tnew RenderedInlayHintLabelPart(item, i)\n\t\t\t\t);\n\n\t\t\t\tif (tooLong) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (itemFixedLength !== undefined && itemActualLength < itemFixedLength) {\n\t\t\t\t// shorter than fixed length, pad\n\t\t\t\tconst pad = (itemFixedLength - itemActualLength);\n\t\t\t\taddInjectedText(\n\t\t\t\t\titem,\n\t\t\t\t\tthis._ruleFactory.createClassNameRef({}),\n\t\t\t\t\t'\\u200a'.repeat(pad),\n\t\t\t\t\tInjectedTextCursorStops.None\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// whitespace trailing the actual label\n\t\t\tif (item.hint.paddingRight) {\n\t\t\t\taddInjectedWhitespace(item, true);\n\t\t\t}\n\n\t\t\tif (newDecorationsData.length > InlayHintsController._MAX_DECORATORS) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// collect all decoration ids that are affected by the ranges\n\t\t// and only update those decorations\n\t\tconst decorationIdsToReplace: string[] = [];\n\t\tfor (const [id, metadata] of this._decorationsMetadata) {\n\t\t\tconst range = this._editor.getModel()?.getDecorationRange(id);\n\t\t\tif (range && ranges.some(r => r.containsRange(range))) {\n\t\t\t\tdecorationIdsToReplace.push(id);\n\t\t\t\tmetadata.classNameRef.dispose();\n\t\t\t\tthis._decorationsMetadata.delete(id);\n\t\t\t}\n\t\t}\n\n\t\tconst scrollState = StableEditorScrollState.capture(this._editor);\n\n\t\tthis._editor.changeDecorations(accessor => {\n\t\t\tconst newDecorationIds = accessor.deltaDecorations(decorationIdsToReplace, newDecorationsData.map(d => d.decoration));\n\t\t\tfor (let i = 0; i < newDecorationIds.length; i++) {\n\t\t\t\tconst data = newDecorationsData[i];\n\t\t\t\tthis._decorationsMetadata.set(newDecorationIds[i], data);\n\t\t\t}\n\t\t});\n\n\t\tscrollState.restore(this._editor);\n\t}\n\n\tprivate _fillInColors(props: CssProperties, hint: languages.InlayHint): void {\n\t\tif (hint.kind === languages.InlayHintKind.Parameter) {\n\t\t\tprops.backgroundColor = themeColorFromId(colors.editorInlayHintParameterBackground);\n\t\t\tprops.color = themeColorFromId(colors.editorInlayHintParameterForeground);\n\t\t} else if (hint.kind === languages.InlayHintKind.Type) {\n\t\t\tprops.backgroundColor = themeColorFromId(colors.editorInlayHintTypeBackground);\n\t\t\tprops.color = themeColorFromId(colors.editorInlayHintTypeForeground);\n\t\t} else {\n\t\t\tprops.backgroundColor = themeColorFromId(colors.editorInlayHintBackground);\n\t\t\tprops.color = themeColorFromId(colors.editorInlayHintForeground);\n\t\t}\n\t}\n\n\tprivate _getLayoutInfo() {\n\t\tconst options = this._editor.getOption(EditorOption.inlayHints);\n\t\tconst padding = options.padding;\n\n\t\tconst editorFontSize = this._editor.getOption(EditorOption.fontSize);\n\t\tconst editorFontFamily = this._editor.getOption(EditorOption.fontFamily);\n\n\t\tlet fontSize = options.fontSize;\n\t\tif (!fontSize || fontSize < 5 || fontSize > editorFontSize) {\n\t\t\tfontSize = editorFontSize;\n\t\t}\n\n\t\tconst fontFamily = options.fontFamily || editorFontFamily;\n\n\t\tconst isUniform = !padding\n\t\t\t&& fontFamily === editorFontFamily\n\t\t\t&& fontSize === editorFontSize;\n\n\t\treturn { fontSize, fontFamily, padding, isUniform };\n\t}\n\n\tprivate _removeAllDecorations(): void {\n\t\tthis._editor.removeDecorations(Array.from(this._decorationsMetadata.keys()));\n\t\tfor (const obj of this._decorationsMetadata.values()) {\n\t\t\tobj.classNameRef.dispose();\n\t\t}\n\t\tthis._decorationsMetadata.clear();\n\t}\n}\n\n\n// Prevents the view from potentially visible whitespace\nfunction fixSpace(str: string): string {\n\tconst noBreakWhitespace = '\\xa0';\n\treturn str.replace(/[ \\t]/g, noBreakWhitespace);\n}\n\nCommandsRegistry.registerCommand('_executeInlayHintProvider', async (accessor, ...args: [URI, IRange]): Promise<languages.InlayHint[]> => {\n\n\tconst [uri, range] = args;\n\tassertType(URI.isUri(uri));\n\tassertType(Range.isIRange(range));\n\n\tconst { inlayHintsProvider } = accessor.get(ILanguageFeaturesService);\n\tconst ref = await accessor.get(ITextModelService).createModelReference(uri);\n\ttry {\n\t\tconst model = await InlayHintsFragments.create(inlayHintsProvider, ref.object.textEditorModel, [Range.lift(range)], CancellationToken.None);\n\t\tconst result = model.items.map(i => i.hint);\n\t\tsetTimeout(() => model.dispose(), 0); // dispose after sending to ext host\n\t\treturn result;\n\t} finally {\n\t\tref.dispose();\n\t}\n});\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { isHTMLElement, ModifierKeyEmitter } from '../../../../base/browser/dom.js';\nimport { isNonEmptyArray } from '../../../../base/common/arrays.js';\nimport { disposableTimeout, RunOnceScheduler } from '../../../../base/common/async.js';\nimport { CancellationToken, CancellationTokenSource } from '../../../../base/common/cancellation.js';\nimport { onUnexpectedError } from '../../../../base/common/errors.js';\nimport { DisposableStore, IDisposable, MutableDisposable, toDisposable } from '../../../../base/common/lifecycle.js';\nimport { LRUCache } from '../../../../base/common/map.js';\nimport { IRange } from '../../../../base/common/range.js';\nimport { assertType } from '../../../../base/common/types.js';\nimport { URI } from '../../../../base/common/uri.js';\nimport { IActiveCodeEditor, ICodeEditor, IEditorMouseEvent, MouseTargetType } from '../../../browser/editorBrowser.js';\nimport { ClassNameReference, CssProperties, DynamicCssRules } from '../../../browser/editorDom.js';\nimport { StableEditorScrollState } from '../../../browser/stableEditorScroll.js';\nimport { EditorOption } from '../../../common/config/editorOptions.js';\nimport { EDITOR_FONT_DEFAULTS } from '../../../common/config/fontInfo.js';\nimport { EditOperation } from '../../../common/core/editOperation.js';\nimport { Range } from '../../../common/core/range.js';\nimport { IEditorContribution } from '../../../common/editorCommon.js';\nimport * as languages from '../../../common/languages.js';\nimport { IModelDeltaDecoration, InjectedTextCursorStops, InjectedTextOptions, ITextModel, TrackedRangeStickiness } from '../../../common/model.js';\nimport { ModelDecorationInjectedTextOptions } from '../../../common/model/textModel.js';\nimport { IFeatureDebounceInformation, ILanguageFeatureDebounceService } from '../../../common/services/languageFeatureDebounce.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { ITextModelService } from '../../../common/services/resolverService.js';\nimport { ClickLinkGesture, ClickLinkMouseEvent } from '../../gotoSymbol/browser/link/clickLinkGesture.js';\nimport { InlayHintAnchor, InlayHintItem, InlayHintsFragments } from './inlayHints.js';\nimport { goToDefinitionWithLocation, showGoToContextMenu } from './inlayHintsLocations.js';\nimport { CommandsRegistry, ICommandService } from '../../../../platform/commands/common/commands.js';\nimport { InstantiationType, registerSingleton } from '../../../../platform/instantiation/common/extensions.js';\nimport { createDecorator, IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { INotificationService, Severity } from '../../../../platform/notification/common/notification.js';\nimport * as colors from '../../../../platform/theme/common/colorRegistry.js';\nimport { themeColorFromId } from '../../../../platform/theme/common/themeService.js';\nimport { Position } from '../../../common/core/position.js';\n\n// --- hint caching service (per session)\n\nclass InlayHintsCache {\n\n\tdeclare readonly _serviceBrand: undefined;\n\n\tprivate readonly _entries = new LRUCache<string, InlayHintItem[]>(50);\n\n\tget(model: ITextModel): InlayHintItem[] | undefined {\n\t\tconst key = InlayHintsCache._key(model);\n\t\treturn this._entries.get(key);\n\t}\n\n\tset(model: ITextModel, value: InlayHintItem[]): void {\n\t\tconst key = InlayHintsCache._key(model);\n\t\tthis._entries.set(key, value);\n\t}\n\n\tprivate static _key(model: ITextModel): string {\n\t\treturn `${model.uri.toString()}/${model.getVersionId()}`;\n\t}\n}\n\ninterface IInlayHintsCache extends InlayHintsCache { }\nconst IInlayHintsCache = createDecorator<IInlayHintsCache>('IInlayHintsCache');\nregisterSingleton(IInlayHintsCache, InlayHintsCache, InstantiationType.Delayed);\n\n// --- rendered label\n\nexport class RenderedInlayHintLabelPart {\n\tconstructor(readonly item: InlayHintItem, readonly index: number) { }\n\n\tget part() {\n\t\tconst label = this.item.hint.label;\n\t\tif (typeof label === 'string') {\n\t\t\treturn { label };\n\t\t} else {\n\t\t\treturn label[this.index];\n\t\t}\n\t}\n}\n\nclass ActiveInlayHintInfo {\n\tconstructor(readonly part: RenderedInlayHintLabelPart, readonly hasTriggerModifier: boolean) { }\n}\n\ntype InlayHintDecorationRenderInfo = {\n\titem: InlayHintItem;\n\tdecoration: IModelDeltaDecoration;\n\tclassNameRef: ClassNameReference;\n};\n\nconst enum RenderMode {\n\tNormal,\n\tInvisible\n}\n\n\n\n/**\n * Mix of CancellationTokenSource, DisposableStore and MutableDisposable\n */\nclass CancellationStore implements IDisposable {\n\n\tprivate readonly _store = new MutableDisposable<DisposableStore>();\n\tprivate _tokenSource = new CancellationTokenSource();\n\n\tdispose() {\n\t\tthis._store.dispose();\n\t\tthis._tokenSource.dispose(true);\n\t}\n\n\treset() {\n\t\tthis._tokenSource.dispose(true);\n\t\tthis._tokenSource = new CancellationTokenSource();\n\t\tthis._store.value = new DisposableStore();\n\n\t\treturn {\n\t\t\tstore: this._store.value,\n\t\t\ttoken: this._tokenSource.token\n\t\t};\n\t}\n}\n\n\n// --- controller\n\n\nexport class InlayHintsController implements IEditorContribution {\n\n\tstatic readonly ID: string = 'editor.contrib.InlayHints';\n\n\tprivate static readonly _MAX_DECORATORS = 1500;\n\tprivate static readonly _whitespaceData = {};\n\n\tstatic get(editor: ICodeEditor): InlayHintsController | undefined {\n\t\treturn editor.getContribution<InlayHintsController>(InlayHintsController.ID) ?? undefined;\n\t}\n\n\tprivate readonly _disposables = new DisposableStore();\n\tprivate readonly _sessionDisposables = new DisposableStore();\n\tprivate readonly _decorationsMetadata = new Map<string, InlayHintDecorationRenderInfo>();\n\tprivate readonly _debounceInfo: IFeatureDebounceInformation;\n\tprivate readonly _ruleFactory: DynamicCssRules;\n\n\tprivate _cursorInfo?: { position: Position; notEarlierThan: number };\n\tprivate _activeRenderMode = RenderMode.Normal;\n\tprivate _activeInlayHintPart?: ActiveInlayHintInfo;\n\n\tconstructor(\n\t\tprivate readonly _editor: ICodeEditor,\n\t\t@ILanguageFeaturesService private readonly _languageFeaturesService: ILanguageFeaturesService,\n\t\t@ILanguageFeatureDebounceService _featureDebounce: ILanguageFeatureDebounceService,\n\t\t@IInlayHintsCache private readonly _inlayHintsCache: IInlayHintsCache,\n\t\t@ICommandService private readonly _commandService: ICommandService,\n\t\t@INotificationService private readonly _notificationService: INotificationService,\n\t\t@IInstantiationService private readonly _instaService: IInstantiationService,\n\t) {\n\t\tthis._ruleFactory = this._disposables.add(new DynamicCssRules(this._editor));\n\t\tthis._debounceInfo = _featureDebounce.for(_languageFeaturesService.inlayHintsProvider, 'InlayHint', { min: 25 });\n\t\tthis._disposables.add(_languageFeaturesService.inlayHintsProvider.onDidChange(() => this._update()));\n\t\tthis._disposables.add(_editor.onDidChangeModel(() => this._update()));\n\t\tthis._disposables.add(_editor.onDidChangeModelLanguage(() => this._update()));\n\t\tthis._disposables.add(_editor.onDidChangeConfiguration(e => {\n\t\t\tif (e.hasChanged(EditorOption.inlayHints)) {\n\t\t\t\tthis._update();\n\t\t\t}\n\t\t}));\n\t\tthis._update();\n\n\t}\n\n\tdispose(): void {\n\t\tthis._sessionDisposables.dispose();\n\t\tthis._removeAllDecorations();\n\t\tthis._disposables.dispose();\n\t}\n\n\tprivate _update(): void {\n\t\tthis._sessionDisposables.clear();\n\t\tthis._removeAllDecorations();\n\n\t\tconst options = this._editor.getOption(EditorOption.inlayHints);\n\t\tif (options.enabled === 'off') {\n\t\t\treturn;\n\t\t}\n\n\t\tconst model = this._editor.getModel();\n\t\tif (!model || !this._languageFeaturesService.inlayHintsProvider.has(model)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (options.enabled === 'on') {\n\t\t\t// different \"on\" modes: always\n\t\t\tthis._activeRenderMode = RenderMode.Normal;\n\t\t} else {\n\t\t\t// different \"on\" modes: offUnlessPressed, or onUnlessPressed\n\t\t\tlet defaultMode: RenderMode;\n\t\t\tlet altMode: RenderMode;\n\t\t\tif (options.enabled === 'onUnlessPressed') {\n\t\t\t\tdefaultMode = RenderMode.Normal;\n\t\t\t\taltMode = RenderMode.Invisible;\n\t\t\t} else {\n\t\t\t\tdefaultMode = RenderMode.Invisible;\n\t\t\t\taltMode = RenderMode.Normal;\n\t\t\t}\n\t\t\tthis._activeRenderMode = defaultMode;\n\n\t\t\tthis._sessionDisposables.add(ModifierKeyEmitter.getInstance().event(e => {\n\t\t\t\tif (!this._editor.hasModel()) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst newRenderMode = e.altKey && e.ctrlKey && !(e.shiftKey || e.metaKey) ? altMode : defaultMode;\n\t\t\t\tif (newRenderMode !== this._activeRenderMode) {\n\t\t\t\t\tthis._activeRenderMode = newRenderMode;\n\t\t\t\t\tconst model = this._editor.getModel();\n\t\t\t\t\tconst copies = this._copyInlayHintsWithCurrentAnchor(model);\n\t\t\t\t\tthis._updateHintsDecorators([model.getFullModelRange()], copies);\n\t\t\t\t\tscheduler.schedule(0);\n\t\t\t\t}\n\t\t\t}));\n\t\t}\n\n\t\t// iff possible, quickly update from cache\n\t\tconst cached = this._inlayHintsCache.get(model);\n\t\tif (cached) {\n\t\t\tthis._updateHintsDecorators([model.getFullModelRange()], cached);\n\t\t}\n\t\tthis._sessionDisposables.add(toDisposable(() => {\n\t\t\t// cache items when switching files etc\n\t\t\tif (!model.isDisposed()) {\n\t\t\t\tthis._cacheHintsForFastRestore(model);\n\t\t\t}\n\t\t}));\n\n\t\tlet cts: CancellationTokenSource | undefined;\n\t\tconst watchedProviders = new Set<languages.InlayHintsProvider>();\n\n\t\tthis._sessionDisposables.add(model.onWillDispose(() => cts?.cancel()));\n\n\t\tconst cancellationStore = this._sessionDisposables.add(new CancellationStore());\n\n\t\tconst scheduler = new RunOnceScheduler(async () => {\n\t\t\tconst t1 = Date.now();\n\n\t\t\tconst { store, token } = cancellationStore.reset();\n\n\t\t\ttry {\n\t\t\t\tconst inlayHints = await InlayHintsFragments.create(this._languageFeaturesService.inlayHintsProvider, model, this._getHintsRanges(), token);\n\t\t\t\tscheduler.delay = this._debounceInfo.update(model, Date.now() - t1);\n\t\t\t\tif (token.isCancellationRequested) {\n\t\t\t\t\tinlayHints.dispose();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// listen to provider changes\n\t\t\t\tfor (const provider of inlayHints.provider) {\n\t\t\t\t\tif (typeof provider.onDidChangeInlayHints === 'function' && !watchedProviders.has(provider)) {\n\t\t\t\t\t\twatchedProviders.add(provider);\n\t\t\t\t\t\tstore.add(provider.onDidChangeInlayHints(() => {\n\t\t\t\t\t\t\tif (!scheduler.isScheduled()) { // ignore event when request is already scheduled\n\t\t\t\t\t\t\t\tscheduler.schedule();\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\tstore.add(inlayHints);\n\t\t\t\tthis._updateHintsDecorators(inlayHints.ranges, inlayHints.items);\n\t\t\t\tthis._cacheHintsForFastRestore(model);\n\n\t\t\t} catch (err) {\n\t\t\t\tonUnexpectedError(err);\n\t\t\t}\n\t\t}, this._debounceInfo.get(model));\n\n\t\tthis._sessionDisposables.add(scheduler);\n\t\tscheduler.schedule(0);\n\n\t\tthis._sessionDisposables.add(this._editor.onDidScrollChange((e) => {\n\t\t\t// update when scroll position changes\n\t\t\t// uses scrollTopChanged has weak heuristic to differenatiate between scrolling due to\n\t\t\t// typing or due to \"actual\" scrolling\n\t\t\tif (e.scrollTopChanged || !scheduler.isScheduled()) {\n\t\t\t\tscheduler.schedule();\n\t\t\t}\n\t\t}));\n\n\t\tconst cursor = this._sessionDisposables.add(new MutableDisposable());\n\t\tthis._sessionDisposables.add(this._editor.onDidChangeModelContent((e) => {\n\t\t\tcts?.cancel();\n\n\t\t\t// mark current cursor position and time after which the whole can be updated/redrawn\n\t\t\tconst delay = Math.max(scheduler.delay, 800);\n\t\t\tthis._cursorInfo = { position: this._editor.getPosition()!, notEarlierThan: Date.now() + delay };\n\t\t\tcursor.value = disposableTimeout(() => scheduler.schedule(0), delay);\n\n\t\t\tscheduler.schedule();\n\t\t}));\n\n\t\tthis._sessionDisposables.add(this._editor.onDidChangeConfiguration(e => {\n\t\t\tif (e.hasChanged(EditorOption.inlayHints)) {\n\t\t\t\tscheduler.schedule();\n\t\t\t}\n\t\t}));\n\n\t\t// mouse gestures\n\t\tthis._sessionDisposables.add(this._installDblClickGesture(() => scheduler.schedule(0)));\n\t\tthis._sessionDisposables.add(this._installLinkGesture());\n\t\tthis._sessionDisposables.add(this._installContextMenu());\n\t}\n\n\tprivate _installLinkGesture(): IDisposable {\n\n\t\tconst store = new DisposableStore();\n\t\tconst gesture = store.add(new ClickLinkGesture(this._editor));\n\n\t\t// let removeHighlight = () => { };\n\n\t\tconst sessionStore = new DisposableStore();\n\t\tstore.add(sessionStore);\n\n\t\tstore.add(gesture.onMouseMoveOrRelevantKeyDown(e => {\n\t\t\tconst [mouseEvent] = e;\n\t\t\tconst labelPart = this._getInlayHintLabelPart(mouseEvent);\n\t\t\tconst model = this._editor.getModel();\n\n\t\t\tif (!labelPart || !model) {\n\t\t\t\tsessionStore.clear();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// resolve the item\n\t\t\tconst cts = new CancellationTokenSource();\n\t\t\tsessionStore.add(toDisposable(() => cts.dispose(true)));\n\t\t\tlabelPart.item.resolve(cts.token);\n\n\t\t\t// render link => when the modifier is pressed and when there is a command or location\n\t\t\tthis._activeInlayHintPart = labelPart.part.command || labelPart.part.location\n\t\t\t\t? new ActiveInlayHintInfo(labelPart, mouseEvent.hasTriggerModifier)\n\t\t\t\t: undefined;\n\n\t\t\tconst lineNumber = model.validatePosition(labelPart.item.hint.position).lineNumber;\n\t\t\tconst range = new Range(lineNumber, 1, lineNumber, model.getLineMaxColumn(lineNumber));\n\t\t\tconst lineHints = this._getInlineHintsForRange(range);\n\t\t\tthis._updateHintsDecorators([range], lineHints);\n\t\t\tsessionStore.add(toDisposable(() => {\n\t\t\t\tthis._activeInlayHintPart = undefined;\n\t\t\t\tthis._updateHintsDecorators([range], lineHints);\n\t\t\t}));\n\t\t}));\n\t\tstore.add(gesture.onCancel(() => sessionStore.clear()));\n\t\tstore.add(gesture.onExecute(async e => {\n\t\t\tconst label = this._getInlayHintLabelPart(e);\n\t\t\tif (label) {\n\t\t\t\tconst part = label.part;\n\t\t\t\tif (part.location) {\n\t\t\t\t\t// location -> execute go to def\n\t\t\t\t\tthis._instaService.invokeFunction(goToDefinitionWithLocation, e, this._editor as IActiveCodeEditor, part.location);\n\t\t\t\t} else if (languages.Command.is(part.command)) {\n\t\t\t\t\t// command -> execute it\n\t\t\t\t\tawait this._invokeCommand(part.command, label.item);\n\t\t\t\t}\n\t\t\t}\n\t\t}));\n\t\treturn store;\n\t}\n\n\tprivate _getInlineHintsForRange(range: Range) {\n\t\tconst lineHints = new Set<InlayHintItem>();\n\t\tfor (const data of this._decorationsMetadata.values()) {\n\t\t\tif (range.containsRange(data.item.anchor.range)) {\n\t\t\t\tlineHints.add(data.item);\n\t\t\t}\n\t\t}\n\t\treturn Array.from(lineHints);\n\t}\n\n\tprivate _installDblClickGesture(updateInlayHints: Function): IDisposable {\n\t\treturn this._editor.onMouseUp(async e => {\n\t\t\tif (e.event.detail !== 2) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst part = this._getInlayHintLabelPart(e);\n\t\t\tif (!part) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\te.event.preventDefault();\n\t\t\tawait part.item.resolve(CancellationToken.None);\n\t\t\tif (isNonEmptyArray(part.item.hint.textEdits)) {\n\t\t\t\tconst edits = part.item.hint.textEdits.map(edit => EditOperation.replace(Range.lift(edit.range), edit.text));\n\t\t\t\tthis._editor.executeEdits('inlayHint.default', edits);\n\t\t\t\tupdateInlayHints();\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate _installContextMenu(): IDisposable {\n\t\treturn this._editor.onContextMenu(async e => {\n\t\t\tif (!(isHTMLElement(e.event.target))) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst part = this._getInlayHintLabelPart(e);\n\t\t\tif (part) {\n\t\t\t\tawait this._instaService.invokeFunction(showGoToContextMenu, this._editor, e.event.target, part);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate _getInlayHintLabelPart(e: IEditorMouseEvent | ClickLinkMouseEvent): RenderedInlayHintLabelPart | undefined {\n\t\tif (e.target.type !== MouseTargetType.CONTENT_TEXT) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst options = e.target.detail.injectedText?.options;\n\t\tif (options instanceof ModelDecorationInjectedTextOptions && options?.attachedData instanceof RenderedInlayHintLabelPart) {\n\t\t\treturn options.attachedData;\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate async _invokeCommand(command: languages.Command, item: InlayHintItem) {\n\t\ttry {\n\t\t\tawait this._commandService.executeCommand(command.id, ...(command.arguments ?? []));\n\t\t} catch (err) {\n\t\t\tthis._notificationService.notify({\n\t\t\t\tseverity: Severity.Error,\n\t\t\t\tsource: item.provider.displayName,\n\t\t\t\tmessage: err\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate _cacheHintsForFastRestore(model: ITextModel): void {\n\t\tconst hints = this._copyInlayHintsWithCurrentAnchor(model);\n\t\tthis._inlayHintsCache.set(model, hints);\n\t}\n\n\t// return inlay hints but with an anchor that reflects \"updates\"\n\t// that happened after receiving them, e.g adding new lines before a hint\n\tprivate _copyInlayHintsWithCurrentAnchor(model: ITextModel): InlayHintItem[] {\n\t\tconst items = new Map<InlayHintItem, InlayHintItem>();\n\t\tfor (const [id, obj] of this._decorationsMetadata) {\n\t\t\tif (items.has(obj.item)) {\n\t\t\t\t// an inlay item can be rendered as multiple decorations\n\t\t\t\t// but they will all uses the same range\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst range = model.getDecorationRange(id);\n\t\t\tif (range) {\n\t\t\t\t// update range with whatever the editor has tweaked it to\n\t\t\t\tconst anchor = new InlayHintAnchor(range, obj.item.anchor.direction);\n\t\t\t\tconst copy = obj.item.with({ anchor });\n\t\t\t\titems.set(obj.item, copy);\n\t\t\t}\n\t\t}\n\t\treturn Array.from(items.values());\n\t}\n\n\tprivate _getHintsRanges(): Range[] {\n\t\tconst extra = 30;\n\t\tconst model = this._editor.getModel()!;\n\t\tconst visibleRanges = this._editor.getVisibleRangesPlusViewportAboveBelow();\n\t\tconst result: Range[] = [];\n\t\tfor (const range of visibleRanges.sort(Range.compareRangesUsingStarts)) {\n\t\t\tconst extendedRange = model.validateRange(new Range(range.startLineNumber - extra, range.startColumn, range.endLineNumber + extra, range.endColumn));\n\t\t\tif (result.length === 0 || !Range.areIntersectingOrTouching(result[result.length - 1], extendedRange)) {\n\t\t\t\tresult.push(extendedRange);\n\t\t\t} else {\n\t\t\t\tresult[result.length - 1] = Range.plusRange(result[result.length - 1], extendedRange);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tprivate _updateHintsDecorators(ranges: readonly Range[], items: readonly InlayHintItem[]): void {\n\n\t\tconst itemFixedLengths = new Map<InlayHintItem, number>();\n\n\t\tif (this._cursorInfo\n\t\t\t&& this._cursorInfo.notEarlierThan > Date.now()\n\t\t\t&& ranges.some(range => range.containsPosition(this._cursorInfo!.position))\n\t\t) {\n\t\t\t// collect inlay hints that are on the same line and before the cursor. Those \"old\" hints\n\t\t\t// define fixed lengths so that the cursor does not jump back and worth while typing.\n\t\t\tconst { position } = this._cursorInfo;\n\t\t\tthis._cursorInfo = undefined;\n\n\t\t\tconst lengths = new Map<InlayHintItem, number>();\n\n\t\t\tfor (const deco of this._editor.getLineDecorations(position.lineNumber) ?? []) {\n\n\t\t\t\tconst data = this._decorationsMetadata.get(deco.id);\n\t\t\t\tif (deco.range.startColumn > position.column) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst opts = data?.decoration.options[data.item.anchor.direction];\n\t\t\t\tif (opts && opts.attachedData !== InlayHintsController._whitespaceData) {\n\t\t\t\t\tconst len = lengths.get(data.item) ?? 0;\n\t\t\t\t\tlengths.set(data.item, len + opts.content.length);\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\t// on the cursor line and before the cursor-column\n\t\t\tconst newItemsWithFixedLength = items.filter(item => item.anchor.range.startLineNumber === position.lineNumber && item.anchor.range.endColumn <= position.column);\n\t\t\tconst fixedLengths = Array.from(lengths.values());\n\n\t\t\t// match up fixed lengths with items and distribute the remaining lengths to the last item\n\t\t\tlet lastItem: InlayHintItem | undefined;\n\t\t\twhile (true) {\n\t\t\t\tconst targetItem = newItemsWithFixedLength.shift();\n\t\t\t\tconst fixedLength = fixedLengths.shift();\n\n\t\t\t\tif (!fixedLength && !targetItem) {\n\t\t\t\t\tbreak; // DONE\n\t\t\t\t}\n\n\t\t\t\tif (targetItem) {\n\t\t\t\t\titemFixedLengths.set(targetItem, fixedLength ?? 0);\n\t\t\t\t\tlastItem = targetItem;\n\n\t\t\t\t} else if (lastItem && fixedLength) {\n\t\t\t\t\t// still lengths but no more item. give it all to the last\n\t\t\t\t\tlet len = itemFixedLengths.get(lastItem)!;\n\t\t\t\t\tlen += fixedLength;\n\t\t\t\t\tlen += fixedLengths.reduce((p, c) => p + c, 0);\n\t\t\t\t\tfixedLengths.length = 0;\n\t\t\t\t\tbreak; // DONE\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// utils to collect/create injected text decorations\n\t\tconst newDecorationsData: InlayHintDecorationRenderInfo[] = [];\n\t\tconst addInjectedText = (item: InlayHintItem, ref: ClassNameReference, content: string, cursorStops: InjectedTextCursorStops, attachedData?: RenderedInlayHintLabelPart | object): void => {\n\t\t\tconst opts: InjectedTextOptions = {\n\t\t\t\tcontent,\n\t\t\t\tinlineClassNameAffectsLetterSpacing: true,\n\t\t\t\tinlineClassName: ref.className,\n\t\t\t\tcursorStops,\n\t\t\t\tattachedData\n\t\t\t};\n\t\t\tnewDecorationsData.push({\n\t\t\t\titem,\n\t\t\t\tclassNameRef: ref,\n\t\t\t\tdecoration: {\n\t\t\t\t\trange: item.anchor.range,\n\t\t\t\t\toptions: {\n\t\t\t\t\t\t// className: \"rangeHighlight\", // DEBUG highlight to see to what range a hint is attached\n\t\t\t\t\t\tdescription: 'InlayHint',\n\t\t\t\t\t\tshowIfCollapsed: item.anchor.range.isEmpty(), // \"original\" range is empty\n\t\t\t\t\t\tcollapseOnReplaceEdit: !item.anchor.range.isEmpty(),\n\t\t\t\t\t\tstickiness: TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges,\n\t\t\t\t\t\t[item.anchor.direction]: this._activeRenderMode === RenderMode.Normal ? opts : undefined\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tconst addInjectedWhitespace = (item: InlayHintItem, isLast: boolean): void => {\n\t\t\tconst marginRule = this._ruleFactory.createClassNameRef({\n\t\t\t\twidth: `${(fontSize / 3) | 0}px`,\n\t\t\t\tdisplay: 'inline-block'\n\t\t\t});\n\t\t\taddInjectedText(item, marginRule, '\\u200a', isLast ? InjectedTextCursorStops.Right : InjectedTextCursorStops.None, InlayHintsController._whitespaceData);\n\t\t};\n\n\n\t\t//\n\t\tconst { fontSize, fontFamily, padding, isUniform } = this._getLayoutInfo();\n\t\tconst maxLength = this._editor.getOption(EditorOption.inlayHints).maximumLength;\n\t\tconst fontFamilyVar = '--code-editorInlayHintsFontFamily';\n\t\tthis._editor.getContainerDomNode().style.setProperty(fontFamilyVar, fontFamily);\n\n\n\t\ttype ILineInfo = { line: number; totalLen: number };\n\t\tlet currentLineInfo: ILineInfo = { line: 0, totalLen: 0 };\n\n\t\tfor (let i = 0; i < items.length; i++) {\n\t\t\tconst item = items[i];\n\n\t\t\tif (currentLineInfo.line !== item.anchor.range.startLineNumber) {\n\t\t\t\tcurrentLineInfo = { line: item.anchor.range.startLineNumber, totalLen: 0 };\n\t\t\t}\n\n\t\t\tif (maxLength && currentLineInfo.totalLen > maxLength) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// whitespace leading the actual label\n\t\t\tif (item.hint.paddingLeft) {\n\t\t\t\taddInjectedWhitespace(item, false);\n\t\t\t}\n\n\t\t\t// the label with its parts\n\t\t\tconst parts: languages.InlayHintLabelPart[] = typeof item.hint.label === 'string'\n\t\t\t\t? [{ label: item.hint.label }]\n\t\t\t\t: item.hint.label;\n\n\t\t\tconst itemFixedLength = itemFixedLengths.get(item);\n\t\t\tlet itemActualLength = 0;\n\n\t\t\tfor (let i = 0; i < parts.length; i++) {\n\t\t\t\tconst part = parts[i];\n\n\t\t\t\tconst isFirst = i === 0;\n\t\t\t\tconst isLast = i === parts.length - 1;\n\n\t\t\t\tconst cssProperties: CssProperties = {\n\t\t\t\t\tfontSize: `${fontSize}px`,\n\t\t\t\t\tfontFamily: `var(${fontFamilyVar}), ${EDITOR_FONT_DEFAULTS.fontFamily}`,\n\t\t\t\t\tverticalAlign: isUniform ? 'baseline' : 'middle',\n\t\t\t\t\tunicodeBidi: 'isolate'\n\t\t\t\t};\n\n\t\t\t\tif (isNonEmptyArray(item.hint.textEdits)) {\n\t\t\t\t\tcssProperties.cursor = 'default';\n\t\t\t\t}\n\n\t\t\t\tthis._fillInColors(cssProperties, item.hint);\n\n\t\t\t\tif ((part.command || part.location) && this._activeInlayHintPart?.part.item === item && this._activeInlayHintPart.part.index === i) {\n\t\t\t\t\t// active link!\n\t\t\t\t\tcssProperties.textDecoration = 'underline';\n\t\t\t\t\tif (this._activeInlayHintPart.hasTriggerModifier) {\n\t\t\t\t\t\tcssProperties.color = themeColorFromId(colors.editorActiveLinkForeground);\n\t\t\t\t\t\tcssProperties.cursor = 'pointer';\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlet textlabel = part.label;\n\t\t\t\tcurrentLineInfo.totalLen += textlabel.length;\n\t\t\t\tlet tooLong = false;\n\t\t\t\tconst over = maxLength !== 0 ? (currentLineInfo.totalLen - maxLength) : 0;\n\t\t\t\tif (over > 0) {\n\t\t\t\t\ttextlabel = textlabel.slice(0, -over) + '…';\n\t\t\t\t\ttooLong = true;\n\t\t\t\t}\n\n\t\t\t\titemActualLength += textlabel.length;\n\n\t\t\t\tif (itemFixedLength !== undefined) {\n\t\t\t\t\tconst overFixedLength = itemActualLength - itemFixedLength;\n\t\t\t\t\tif (overFixedLength >= 0) {\n\t\t\t\t\t\t// longer than fixed length, trim\n\t\t\t\t\t\titemActualLength -= overFixedLength;\n\t\t\t\t\t\ttextlabel = textlabel.slice(0, -(1 + overFixedLength)) + '…';\n\t\t\t\t\t\ttooLong = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (padding) {\n\t\t\t\t\tif (isFirst && (isLast || tooLong)) {\n\t\t\t\t\t\t// only element\n\t\t\t\t\t\tcssProperties.padding = `1px ${Math.max(1, fontSize / 4) | 0}px`;\n\t\t\t\t\t\tcssProperties.borderRadius = `${(fontSize / 4) | 0}px`;\n\t\t\t\t\t} else if (isFirst) {\n\t\t\t\t\t\t// first element\n\t\t\t\t\t\tcssProperties.padding = `1px 0 1px ${Math.max(1, fontSize / 4) | 0}px`;\n\t\t\t\t\t\tcssProperties.borderRadius = `${(fontSize / 4) | 0}px 0 0 ${(fontSize / 4) | 0}px`;\n\t\t\t\t\t} else if ((isLast || tooLong)) {\n\t\t\t\t\t\t// last element\n\t\t\t\t\t\tcssProperties.padding = `1px ${Math.max(1, fontSize / 4) | 0}px 1px 0`;\n\t\t\t\t\t\tcssProperties.borderRadius = `0 ${(fontSize / 4) | 0}px ${(fontSize / 4) | 0}px 0`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcssProperties.padding = `1px 0 1px 0`;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\taddInjectedText(\n\t\t\t\t\titem,\n\t\t\t\t\tthis._ruleFactory.createClassNameRef(cssProperties),\n\t\t\t\t\tfixSpace(textlabel),\n\t\t\t\t\tisLast && !item.hint.paddingRight ? InjectedTextCursorStops.Right : InjectedTextCursorStops.None,\n\t\t\t\t\tnew RenderedInlayHintLabelPart(item, i)\n\t\t\t\t);\n\n\t\t\t\tif (tooLong) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (itemFixedLength !== undefined && itemActualLength < itemFixedLength) {\n\t\t\t\t// shorter than fixed length, pad\n\t\t\t\tconst pad = (itemFixedLength - itemActualLength);\n\t\t\t\taddInjectedText(\n\t\t\t\t\titem,\n\t\t\t\t\tthis._ruleFactory.createClassNameRef({}),\n\t\t\t\t\t'\\u200a'.repeat(pad),\n\t\t\t\t\tInjectedTextCursorStops.None\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// whitespace trailing the actual label\n\t\t\tif (item.hint.paddingRight) {\n\t\t\t\taddInjectedWhitespace(item, true);\n\t\t\t}\n\n\t\t\tif (newDecorationsData.length > InlayHintsController._MAX_DECORATORS) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// collect all decoration ids that are affected by the ranges\n\t\t// and only update those decorations\n\t\tconst decorationIdsToReplace: string[] = [];\n\t\tfor (const [id, metadata] of this._decorationsMetadata) {\n\t\t\tconst range = this._editor.getModel()?.getDecorationRange(id);\n\t\t\tif (range && ranges.some(r => r.containsRange(range))) {\n\t\t\t\tdecorationIdsToReplace.push(id);\n\t\t\t\tmetadata.classNameRef.dispose();\n\t\t\t\tthis._decorationsMetadata.delete(id);\n\t\t\t}\n\t\t}\n\n\t\tconst scrollState = StableEditorScrollState.capture(this._editor);\n\n\t\tthis._editor.changeDecorations(accessor => {\n\t\t\tconst newDecorationIds = accessor.deltaDecorations(decorationIdsToReplace, newDecorationsData.map(d => d.decoration));\n\t\t\tfor (let i = 0; i < newDecorationIds.length; i++) {\n\t\t\t\tconst data = newDecorationsData[i];\n\t\t\t\tthis._decorationsMetadata.set(newDecorationIds[i], data);\n\t\t\t}\n\t\t});\n\n\t\tscrollState.restore(this._editor);\n\t}\n\n\tprivate _fillInColors(props: CssProperties, hint: languages.InlayHint): void {\n\t\tif (hint.kind === languages.InlayHintKind.Parameter) {\n\t\t\tprops.backgroundColor = themeColorFromId(colors.editorInlayHintParameterBackground);\n\t\t\tprops.color = themeColorFromId(colors.editorInlayHintParameterForeground);\n\t\t} else if (hint.kind === languages.InlayHintKind.Type) {\n\t\t\tprops.backgroundColor = themeColorFromId(colors.editorInlayHintTypeBackground);\n\t\t\tprops.color = themeColorFromId(colors.editorInlayHintTypeForeground);\n\t\t} else {\n\t\t\tprops.backgroundColor = themeColorFromId(colors.editorInlayHintBackground);\n\t\t\tprops.color = themeColorFromId(colors.editorInlayHintForeground);\n\t\t}\n\t}\n\n\tprivate _getLayoutInfo() {\n\t\tconst options = this._editor.getOption(EditorOption.inlayHints);\n\t\tconst padding = options.padding;\n\n\t\tconst editorFontSize = this._editor.getOption(EditorOption.fontSize);\n\t\tconst editorFontFamily = this._editor.getOption(EditorOption.fontFamily);\n\n\t\tlet fontSize = options.fontSize;\n\t\tif (!fontSize || fontSize < 5 || fontSize > editorFontSize) {\n\t\t\tfontSize = editorFontSize;\n\t\t}\n\n\t\tconst fontFamily = options.fontFamily || editorFontFamily;\n\n\t\tconst isUniform = !padding\n\t\t\t&& fontFamily === editorFontFamily\n\t\t\t&& fontSize === editorFontSize;\n\n\t\treturn { fontSize, fontFamily, padding, isUniform };\n\t}\n\n\tprivate _removeAllDecorations(): void {\n\t\tthis._editor.removeDecorations(Array.from(this._decorationsMetadata.keys()));\n\t\tfor (const obj of this._decorationsMetadata.values()) {\n\t\t\tobj.classNameRef.dispose();\n\t\t}\n\t\tthis._decorationsMetadata.clear();\n\t}\n}\n\n\n// Prevents the view from potentially visible whitespace\nfunction fixSpace(str: string): string {\n\tconst noBreakWhitespace = '\\xa0';\n\treturn str.replace(/[ \\t]/g, noBreakWhitespace);\n}\n\nCommandsRegistry.registerCommand('_executeInlayHintProvider', async (accessor, ...args: [URI, IRange]): Promise<languages.InlayHint[]> => {\n\n\tconst [uri, range] = args;\n\tassertType(URI.isUri(uri));\n\tassertType(Range.isIRange(range));\n\n\tconst { inlayHintsProvider } = accessor.get(ILanguageFeaturesService);\n\tconst ref = await accessor.get(ITextModelService).createModelReference(uri);\n\ttry {\n\t\tconst model = await InlayHintsFragments.create(inlayHintsProvider, ref.object.textEditorModel, [Range.lift(range)], CancellationToken.None);\n\t\tconst result = model.items.map(i => i.hint);\n\t\tsetTimeout(() => model.dispose(), 0); // dispose after sending to ext host\n\t\treturn result;\n\t} finally {\n\t\tref.dispose();\n\t}\n});\n"]}
1
+ {"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/editor/contrib/inlayHints/browser/inlayHintsController.ts","vs/editor/contrib/inlayHints/browser/inlayHintsController.ts"],"names":[],"mappings":"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","file":"inlayHintsController.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 { isHTMLElement, ModifierKeyEmitter } from '../../../../base/browser/dom.js';\nimport { isNonEmptyArray } from '../../../../base/common/arrays.js';\nimport { disposableTimeout, RunOnceScheduler } from '../../../../base/common/async.js';\nimport { CancellationToken, CancellationTokenSource } from '../../../../base/common/cancellation.js';\nimport { onUnexpectedError } from '../../../../base/common/errors.js';\nimport { DisposableStore, IDisposable, MutableDisposable, toDisposable } from '../../../../base/common/lifecycle.js';\nimport { LRUCache } from '../../../../base/common/map.js';\nimport { IRange } from '../../../../base/common/range.js';\nimport { assertType } from '../../../../base/common/types.js';\nimport { URI } from '../../../../base/common/uri.js';\nimport { IActiveCodeEditor, ICodeEditor, IEditorMouseEvent, MouseTargetType } from '../../../browser/editorBrowser.js';\nimport { ClassNameReference, CssProperties, DynamicCssRules } from '../../../browser/editorDom.js';\nimport { StableEditorScrollState } from '../../../browser/stableEditorScroll.js';\nimport { EditorOption } from '../../../common/config/editorOptions.js';\nimport { EDITOR_FONT_DEFAULTS } from '../../../common/config/fontInfo.js';\nimport { EditOperation } from '../../../common/core/editOperation.js';\nimport { Range } from '../../../common/core/range.js';\nimport { IEditorContribution } from '../../../common/editorCommon.js';\nimport * as languages from '../../../common/languages.js';\nimport { IModelDeltaDecoration, InjectedTextCursorStops, InjectedTextOptions, ITextModel, TrackedRangeStickiness } from '../../../common/model.js';\nimport { ModelDecorationInjectedTextOptions } from '../../../common/model/textModel.js';\nimport { IFeatureDebounceInformation, ILanguageFeatureDebounceService } from '../../../common/services/languageFeatureDebounce.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { ITextModelService } from '../../../common/services/resolverService.js';\nimport { ClickLinkGesture, ClickLinkMouseEvent } from '../../gotoSymbol/browser/link/clickLinkGesture.js';\nimport { InlayHintAnchor, InlayHintItem, InlayHintsFragments } from './inlayHints.js';\nimport { goToDefinitionWithLocation, showGoToContextMenu } from './inlayHintsLocations.js';\nimport { CommandsRegistry, ICommandService } from '../../../../platform/commands/common/commands.js';\nimport { InstantiationType, registerSingleton } from '../../../../platform/instantiation/common/extensions.js';\nimport { createDecorator, IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { INotificationService, Severity } from '../../../../platform/notification/common/notification.js';\nimport * as colors from '../../../../platform/theme/common/colorRegistry.js';\nimport { themeColorFromId } from '../../../../platform/theme/common/themeService.js';\nimport { Position } from '../../../common/core/position.js';\n\n// --- hint caching service (per session)\n\nclass InlayHintsCache {\n\n\tdeclare readonly _serviceBrand: undefined;\n\n\tprivate readonly _entries = new LRUCache<string, InlayHintItem[]>(50);\n\n\tget(model: ITextModel): InlayHintItem[] | undefined {\n\t\tconst key = InlayHintsCache._key(model);\n\t\treturn this._entries.get(key);\n\t}\n\n\tset(model: ITextModel, value: InlayHintItem[]): void {\n\t\tconst key = InlayHintsCache._key(model);\n\t\tthis._entries.set(key, value);\n\t}\n\n\tprivate static _key(model: ITextModel): string {\n\t\treturn `${model.uri.toString()}/${model.getVersionId()}`;\n\t}\n}\n\ninterface IInlayHintsCache extends InlayHintsCache { }\nconst IInlayHintsCache = createDecorator<IInlayHintsCache>('IInlayHintsCache');\nregisterSingleton(IInlayHintsCache, InlayHintsCache, InstantiationType.Delayed);\n\n// --- rendered label\n\nexport class RenderedInlayHintLabelPart {\n\tconstructor(readonly item: InlayHintItem, readonly index: number) { }\n\n\tget part() {\n\t\tconst label = this.item.hint.label;\n\t\tif (typeof label === 'string') {\n\t\t\treturn { label };\n\t\t} else {\n\t\t\treturn label[this.index];\n\t\t}\n\t}\n}\n\nclass ActiveInlayHintInfo {\n\tconstructor(readonly part: RenderedInlayHintLabelPart, readonly hasTriggerModifier: boolean) { }\n}\n\ntype InlayHintDecorationRenderInfo = {\n\titem: InlayHintItem;\n\tdecoration: IModelDeltaDecoration;\n\tclassNameRef: ClassNameReference;\n};\n\nconst enum RenderMode {\n\tNormal,\n\tInvisible\n}\n\n\n\n/**\n * Mix of CancellationTokenSource, DisposableStore and MutableDisposable\n */\nclass CancellationStore implements IDisposable {\n\n\tprivate readonly _store = new MutableDisposable<DisposableStore>();\n\tprivate _tokenSource = new CancellationTokenSource();\n\n\tdispose() {\n\t\tthis._store.dispose();\n\t\tthis._tokenSource.dispose(true);\n\t}\n\n\treset() {\n\t\tthis._tokenSource.dispose(true);\n\t\tthis._tokenSource = new CancellationTokenSource();\n\t\tthis._store.value = new DisposableStore();\n\n\t\treturn {\n\t\t\tstore: this._store.value,\n\t\t\ttoken: this._tokenSource.token\n\t\t};\n\t}\n}\n\n\n// --- controller\n\n\nexport class InlayHintsController implements IEditorContribution {\n\n\tstatic readonly ID: string = 'editor.contrib.InlayHints';\n\n\tprivate static readonly _MAX_DECORATORS = 1500;\n\tprivate static readonly _whitespaceData = {};\n\n\tstatic get(editor: ICodeEditor): InlayHintsController | undefined {\n\t\treturn editor.getContribution<InlayHintsController>(InlayHintsController.ID) ?? undefined;\n\t}\n\n\tprivate readonly _disposables = new DisposableStore();\n\tprivate readonly _sessionDisposables = new DisposableStore();\n\tprivate readonly _decorationsMetadata = new Map<string, InlayHintDecorationRenderInfo>();\n\tprivate readonly _debounceInfo: IFeatureDebounceInformation;\n\tprivate readonly _ruleFactory: DynamicCssRules;\n\n\tprivate _cursorInfo?: { position: Position; notEarlierThan: number };\n\tprivate _activeRenderMode = RenderMode.Normal;\n\tprivate _activeInlayHintPart?: ActiveInlayHintInfo;\n\n\tconstructor(\n\t\tprivate readonly _editor: ICodeEditor,\n\t\t@ILanguageFeaturesService private readonly _languageFeaturesService: ILanguageFeaturesService,\n\t\t@ILanguageFeatureDebounceService _featureDebounce: ILanguageFeatureDebounceService,\n\t\t@IInlayHintsCache private readonly _inlayHintsCache: IInlayHintsCache,\n\t\t@ICommandService private readonly _commandService: ICommandService,\n\t\t@INotificationService private readonly _notificationService: INotificationService,\n\t\t@IInstantiationService private readonly _instaService: IInstantiationService,\n\t) {\n\t\tthis._ruleFactory = this._disposables.add(new DynamicCssRules(this._editor));\n\t\tthis._debounceInfo = _featureDebounce.for(_languageFeaturesService.inlayHintsProvider, 'InlayHint', { min: 25 });\n\t\tthis._disposables.add(_languageFeaturesService.inlayHintsProvider.onDidChange(() => this._update()));\n\t\tthis._disposables.add(_editor.onDidChangeModel(() => this._update()));\n\t\tthis._disposables.add(_editor.onDidChangeModelLanguage(() => this._update()));\n\t\tthis._disposables.add(_editor.onDidChangeConfiguration(e => {\n\t\t\tif (e.hasChanged(EditorOption.inlayHints)) {\n\t\t\t\tthis._update();\n\t\t\t}\n\t\t}));\n\t\tthis._update();\n\n\t}\n\n\tdispose(): void {\n\t\tthis._sessionDisposables.dispose();\n\t\tthis._removeAllDecorations();\n\t\tthis._disposables.dispose();\n\t}\n\n\tprivate _update(): void {\n\t\tthis._sessionDisposables.clear();\n\t\tthis._removeAllDecorations();\n\n\t\tconst options = this._editor.getOption(EditorOption.inlayHints);\n\t\tif (options.enabled === 'off') {\n\t\t\treturn;\n\t\t}\n\n\t\tconst model = this._editor.getModel();\n\t\tif (!model || !this._languageFeaturesService.inlayHintsProvider.has(model)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (options.enabled === 'on') {\n\t\t\t// different \"on\" modes: always\n\t\t\tthis._activeRenderMode = RenderMode.Normal;\n\t\t} else {\n\t\t\t// different \"on\" modes: offUnlessPressed, or onUnlessPressed\n\t\t\tlet defaultMode: RenderMode;\n\t\t\tlet altMode: RenderMode;\n\t\t\tif (options.enabled === 'onUnlessPressed') {\n\t\t\t\tdefaultMode = RenderMode.Normal;\n\t\t\t\taltMode = RenderMode.Invisible;\n\t\t\t} else {\n\t\t\t\tdefaultMode = RenderMode.Invisible;\n\t\t\t\taltMode = RenderMode.Normal;\n\t\t\t}\n\t\t\tthis._activeRenderMode = defaultMode;\n\n\t\t\tthis._sessionDisposables.add(ModifierKeyEmitter.getInstance().event(e => {\n\t\t\t\tif (!this._editor.hasModel()) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst newRenderMode = e.altKey && e.ctrlKey && !(e.shiftKey || e.metaKey) ? altMode : defaultMode;\n\t\t\t\tif (newRenderMode !== this._activeRenderMode) {\n\t\t\t\t\tthis._activeRenderMode = newRenderMode;\n\t\t\t\t\tconst model = this._editor.getModel();\n\t\t\t\t\tconst copies = this._copyInlayHintsWithCurrentAnchor(model);\n\t\t\t\t\tthis._updateHintsDecorators([model.getFullModelRange()], copies);\n\t\t\t\t\tscheduler.schedule(0);\n\t\t\t\t}\n\t\t\t}));\n\t\t}\n\n\t\t// iff possible, quickly update from cache\n\t\tconst cached = this._inlayHintsCache.get(model);\n\t\tif (cached) {\n\t\t\tthis._updateHintsDecorators([model.getFullModelRange()], cached);\n\t\t}\n\t\tthis._sessionDisposables.add(toDisposable(() => {\n\t\t\t// cache items when switching files etc\n\t\t\tif (!model.isDisposed()) {\n\t\t\t\tthis._cacheHintsForFastRestore(model);\n\t\t\t}\n\t\t}));\n\n\t\tlet cts: CancellationTokenSource | undefined;\n\t\tconst watchedProviders = new Set<languages.InlayHintsProvider>();\n\n\t\tthis._sessionDisposables.add(model.onWillDispose(() => cts?.cancel()));\n\n\t\tconst cancellationStore = this._sessionDisposables.add(new CancellationStore());\n\n\t\tconst scheduler = new RunOnceScheduler(async () => {\n\t\t\tconst t1 = Date.now();\n\n\t\t\tconst { store, token } = cancellationStore.reset();\n\n\t\t\ttry {\n\t\t\t\tconst inlayHints = await InlayHintsFragments.create(this._languageFeaturesService.inlayHintsProvider, model, this._getHintsRanges(), token);\n\t\t\t\tscheduler.delay = this._debounceInfo.update(model, Date.now() - t1);\n\t\t\t\tif (token.isCancellationRequested) {\n\t\t\t\t\tinlayHints.dispose();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// listen to provider changes\n\t\t\t\tfor (const provider of inlayHints.provider) {\n\t\t\t\t\tif (typeof provider.onDidChangeInlayHints === 'function' && !watchedProviders.has(provider)) {\n\t\t\t\t\t\twatchedProviders.add(provider);\n\t\t\t\t\t\tstore.add(provider.onDidChangeInlayHints(() => {\n\t\t\t\t\t\t\tif (!scheduler.isScheduled()) { // ignore event when request is already scheduled\n\t\t\t\t\t\t\t\tscheduler.schedule();\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\n\t\t\t\tstore.add(inlayHints);\n\t\t\t\tstore.add(toDisposable(() => watchedProviders.clear()));\n\t\t\t\tthis._updateHintsDecorators(inlayHints.ranges, inlayHints.items);\n\t\t\t\tthis._cacheHintsForFastRestore(model);\n\n\t\t\t} catch (err) {\n\t\t\t\tonUnexpectedError(err);\n\t\t\t}\n\t\t}, this._debounceInfo.get(model));\n\n\t\tthis._sessionDisposables.add(scheduler);\n\t\tscheduler.schedule(0);\n\n\t\tthis._sessionDisposables.add(this._editor.onDidScrollChange((e) => {\n\t\t\t// update when scroll position changes\n\t\t\t// uses scrollTopChanged has weak heuristic to differenatiate between scrolling due to\n\t\t\t// typing or due to \"actual\" scrolling\n\t\t\tif (e.scrollTopChanged || !scheduler.isScheduled()) {\n\t\t\t\tscheduler.schedule();\n\t\t\t}\n\t\t}));\n\n\t\tconst cursor = this._sessionDisposables.add(new MutableDisposable());\n\t\tthis._sessionDisposables.add(this._editor.onDidChangeModelContent((e) => {\n\t\t\tcts?.cancel();\n\n\t\t\t// mark current cursor position and time after which the whole can be updated/redrawn\n\t\t\tconst delay = Math.max(scheduler.delay, 800);\n\t\t\tthis._cursorInfo = { position: this._editor.getPosition()!, notEarlierThan: Date.now() + delay };\n\t\t\tcursor.value = disposableTimeout(() => scheduler.schedule(0), delay);\n\n\t\t\tscheduler.schedule();\n\t\t}));\n\n\t\tthis._sessionDisposables.add(this._editor.onDidChangeConfiguration(e => {\n\t\t\tif (e.hasChanged(EditorOption.inlayHints)) {\n\t\t\t\tscheduler.schedule();\n\t\t\t}\n\t\t}));\n\n\t\t// mouse gestures\n\t\tthis._sessionDisposables.add(this._installDblClickGesture(() => scheduler.schedule(0)));\n\t\tthis._sessionDisposables.add(this._installLinkGesture());\n\t\tthis._sessionDisposables.add(this._installContextMenu());\n\t}\n\n\tprivate _installLinkGesture(): IDisposable {\n\n\t\tconst store = new DisposableStore();\n\t\tconst gesture = store.add(new ClickLinkGesture(this._editor));\n\n\t\t// let removeHighlight = () => { };\n\n\t\tconst sessionStore = new DisposableStore();\n\t\tstore.add(sessionStore);\n\n\t\tstore.add(gesture.onMouseMoveOrRelevantKeyDown(e => {\n\t\t\tconst [mouseEvent] = e;\n\t\t\tconst labelPart = this._getInlayHintLabelPart(mouseEvent);\n\t\t\tconst model = this._editor.getModel();\n\n\t\t\tif (!labelPart || !model) {\n\t\t\t\tsessionStore.clear();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// resolve the item\n\t\t\tconst cts = new CancellationTokenSource();\n\t\t\tsessionStore.add(toDisposable(() => cts.dispose(true)));\n\t\t\tlabelPart.item.resolve(cts.token);\n\n\t\t\t// render link => when the modifier is pressed and when there is a command or location\n\t\t\tthis._activeInlayHintPart = labelPart.part.command || labelPart.part.location\n\t\t\t\t? new ActiveInlayHintInfo(labelPart, mouseEvent.hasTriggerModifier)\n\t\t\t\t: undefined;\n\n\t\t\tconst lineNumber = model.validatePosition(labelPart.item.hint.position).lineNumber;\n\t\t\tconst range = new Range(lineNumber, 1, lineNumber, model.getLineMaxColumn(lineNumber));\n\t\t\tconst lineHints = this._getInlineHintsForRange(range);\n\t\t\tthis._updateHintsDecorators([range], lineHints);\n\t\t\tsessionStore.add(toDisposable(() => {\n\t\t\t\tthis._activeInlayHintPart = undefined;\n\t\t\t\tthis._updateHintsDecorators([range], lineHints);\n\t\t\t}));\n\t\t}));\n\t\tstore.add(gesture.onCancel(() => sessionStore.clear()));\n\t\tstore.add(gesture.onExecute(async e => {\n\t\t\tconst label = this._getInlayHintLabelPart(e);\n\t\t\tif (label) {\n\t\t\t\tconst part = label.part;\n\t\t\t\tif (part.location) {\n\t\t\t\t\t// location -> execute go to def\n\t\t\t\t\tthis._instaService.invokeFunction(goToDefinitionWithLocation, e, this._editor as IActiveCodeEditor, part.location);\n\t\t\t\t} else if (languages.Command.is(part.command)) {\n\t\t\t\t\t// command -> execute it\n\t\t\t\t\tawait this._invokeCommand(part.command, label.item);\n\t\t\t\t}\n\t\t\t}\n\t\t}));\n\t\treturn store;\n\t}\n\n\tprivate _getInlineHintsForRange(range: Range) {\n\t\tconst lineHints = new Set<InlayHintItem>();\n\t\tfor (const data of this._decorationsMetadata.values()) {\n\t\t\tif (range.containsRange(data.item.anchor.range)) {\n\t\t\t\tlineHints.add(data.item);\n\t\t\t}\n\t\t}\n\t\treturn Array.from(lineHints);\n\t}\n\n\tprivate _installDblClickGesture(updateInlayHints: Function): IDisposable {\n\t\treturn this._editor.onMouseUp(async e => {\n\t\t\tif (e.event.detail !== 2) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst part = this._getInlayHintLabelPart(e);\n\t\t\tif (!part) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\te.event.preventDefault();\n\t\t\tawait part.item.resolve(CancellationToken.None);\n\t\t\tif (isNonEmptyArray(part.item.hint.textEdits)) {\n\t\t\t\tconst edits = part.item.hint.textEdits.map(edit => EditOperation.replace(Range.lift(edit.range), edit.text));\n\t\t\t\tthis._editor.executeEdits('inlayHint.default', edits);\n\t\t\t\tupdateInlayHints();\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate _installContextMenu(): IDisposable {\n\t\treturn this._editor.onContextMenu(async e => {\n\t\t\tif (!(isHTMLElement(e.event.target))) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst part = this._getInlayHintLabelPart(e);\n\t\t\tif (part) {\n\t\t\t\tawait this._instaService.invokeFunction(showGoToContextMenu, this._editor, e.event.target, part);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate _getInlayHintLabelPart(e: IEditorMouseEvent | ClickLinkMouseEvent): RenderedInlayHintLabelPart | undefined {\n\t\tif (e.target.type !== MouseTargetType.CONTENT_TEXT) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst options = e.target.detail.injectedText?.options;\n\t\tif (options instanceof ModelDecorationInjectedTextOptions && options?.attachedData instanceof RenderedInlayHintLabelPart) {\n\t\t\treturn options.attachedData;\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate async _invokeCommand(command: languages.Command, item: InlayHintItem) {\n\t\ttry {\n\t\t\tawait this._commandService.executeCommand(command.id, ...(command.arguments ?? []));\n\t\t} catch (err) {\n\t\t\tthis._notificationService.notify({\n\t\t\t\tseverity: Severity.Error,\n\t\t\t\tsource: item.provider.displayName,\n\t\t\t\tmessage: err\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate _cacheHintsForFastRestore(model: ITextModel): void {\n\t\tconst hints = this._copyInlayHintsWithCurrentAnchor(model);\n\t\tthis._inlayHintsCache.set(model, hints);\n\t}\n\n\t// return inlay hints but with an anchor that reflects \"updates\"\n\t// that happened after receiving them, e.g adding new lines before a hint\n\tprivate _copyInlayHintsWithCurrentAnchor(model: ITextModel): InlayHintItem[] {\n\t\tconst items = new Map<InlayHintItem, InlayHintItem>();\n\t\tfor (const [id, obj] of this._decorationsMetadata) {\n\t\t\tif (items.has(obj.item)) {\n\t\t\t\t// an inlay item can be rendered as multiple decorations\n\t\t\t\t// but they will all uses the same range\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst range = model.getDecorationRange(id);\n\t\t\tif (range) {\n\t\t\t\t// update range with whatever the editor has tweaked it to\n\t\t\t\tconst anchor = new InlayHintAnchor(range, obj.item.anchor.direction);\n\t\t\t\tconst copy = obj.item.with({ anchor });\n\t\t\t\titems.set(obj.item, copy);\n\t\t\t}\n\t\t}\n\t\treturn Array.from(items.values());\n\t}\n\n\tprivate _getHintsRanges(): Range[] {\n\t\tconst extra = 30;\n\t\tconst model = this._editor.getModel()!;\n\t\tconst visibleRanges = this._editor.getVisibleRangesPlusViewportAboveBelow();\n\t\tconst result: Range[] = [];\n\t\tfor (const range of visibleRanges.sort(Range.compareRangesUsingStarts)) {\n\t\t\tconst extendedRange = model.validateRange(new Range(range.startLineNumber - extra, range.startColumn, range.endLineNumber + extra, range.endColumn));\n\t\t\tif (result.length === 0 || !Range.areIntersectingOrTouching(result[result.length - 1], extendedRange)) {\n\t\t\t\tresult.push(extendedRange);\n\t\t\t} else {\n\t\t\t\tresult[result.length - 1] = Range.plusRange(result[result.length - 1], extendedRange);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tprivate _updateHintsDecorators(ranges: readonly Range[], items: readonly InlayHintItem[]): void {\n\n\t\tconst itemFixedLengths = new Map<InlayHintItem, number>();\n\n\t\tif (this._cursorInfo\n\t\t\t&& this._cursorInfo.notEarlierThan > Date.now()\n\t\t\t&& ranges.some(range => range.containsPosition(this._cursorInfo!.position))\n\t\t) {\n\t\t\t// collect inlay hints that are on the same line and before the cursor. Those \"old\" hints\n\t\t\t// define fixed lengths so that the cursor does not jump back and worth while typing.\n\t\t\tconst { position } = this._cursorInfo;\n\t\t\tthis._cursorInfo = undefined;\n\n\t\t\tconst lengths = new Map<InlayHintItem, number>();\n\n\t\t\tfor (const deco of this._editor.getLineDecorations(position.lineNumber) ?? []) {\n\n\t\t\t\tconst data = this._decorationsMetadata.get(deco.id);\n\t\t\t\tif (deco.range.startColumn > position.column) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst opts = data?.decoration.options[data.item.anchor.direction];\n\t\t\t\tif (opts && opts.attachedData !== InlayHintsController._whitespaceData) {\n\t\t\t\t\tconst len = lengths.get(data.item) ?? 0;\n\t\t\t\t\tlengths.set(data.item, len + opts.content.length);\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\t// on the cursor line and before the cursor-column\n\t\t\tconst newItemsWithFixedLength = items.filter(item => item.anchor.range.startLineNumber === position.lineNumber && item.anchor.range.endColumn <= position.column);\n\t\t\tconst fixedLengths = Array.from(lengths.values());\n\n\t\t\t// match up fixed lengths with items and distribute the remaining lengths to the last item\n\t\t\tlet lastItem: InlayHintItem | undefined;\n\t\t\twhile (true) {\n\t\t\t\tconst targetItem = newItemsWithFixedLength.shift();\n\t\t\t\tconst fixedLength = fixedLengths.shift();\n\n\t\t\t\tif (!fixedLength && !targetItem) {\n\t\t\t\t\tbreak; // DONE\n\t\t\t\t}\n\n\t\t\t\tif (targetItem) {\n\t\t\t\t\titemFixedLengths.set(targetItem, fixedLength ?? 0);\n\t\t\t\t\tlastItem = targetItem;\n\n\t\t\t\t} else if (lastItem && fixedLength) {\n\t\t\t\t\t// still lengths but no more item. give it all to the last\n\t\t\t\t\tlet len = itemFixedLengths.get(lastItem)!;\n\t\t\t\t\tlen += fixedLength;\n\t\t\t\t\tlen += fixedLengths.reduce((p, c) => p + c, 0);\n\t\t\t\t\tfixedLengths.length = 0;\n\t\t\t\t\tbreak; // DONE\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// utils to collect/create injected text decorations\n\t\tconst newDecorationsData: InlayHintDecorationRenderInfo[] = [];\n\t\tconst addInjectedText = (item: InlayHintItem, ref: ClassNameReference, content: string, cursorStops: InjectedTextCursorStops, attachedData?: RenderedInlayHintLabelPart | object): void => {\n\t\t\tconst opts: InjectedTextOptions = {\n\t\t\t\tcontent,\n\t\t\t\tinlineClassNameAffectsLetterSpacing: true,\n\t\t\t\tinlineClassName: ref.className,\n\t\t\t\tcursorStops,\n\t\t\t\tattachedData\n\t\t\t};\n\t\t\tnewDecorationsData.push({\n\t\t\t\titem,\n\t\t\t\tclassNameRef: ref,\n\t\t\t\tdecoration: {\n\t\t\t\t\trange: item.anchor.range,\n\t\t\t\t\toptions: {\n\t\t\t\t\t\t// className: \"rangeHighlight\", // DEBUG highlight to see to what range a hint is attached\n\t\t\t\t\t\tdescription: 'InlayHint',\n\t\t\t\t\t\tshowIfCollapsed: item.anchor.range.isEmpty(), // \"original\" range is empty\n\t\t\t\t\t\tcollapseOnReplaceEdit: !item.anchor.range.isEmpty(),\n\t\t\t\t\t\tstickiness: TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges,\n\t\t\t\t\t\t[item.anchor.direction]: this._activeRenderMode === RenderMode.Normal ? opts : undefined\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tconst addInjectedWhitespace = (item: InlayHintItem, isLast: boolean): void => {\n\t\t\tconst marginRule = this._ruleFactory.createClassNameRef({\n\t\t\t\twidth: `${(fontSize / 3) | 0}px`,\n\t\t\t\tdisplay: 'inline-block'\n\t\t\t});\n\t\t\taddInjectedText(item, marginRule, '\\u200a', isLast ? InjectedTextCursorStops.Right : InjectedTextCursorStops.None, InlayHintsController._whitespaceData);\n\t\t};\n\n\n\t\t//\n\t\tconst { fontSize, fontFamily, padding, isUniform } = this._getLayoutInfo();\n\t\tconst maxLength = this._editor.getOption(EditorOption.inlayHints).maximumLength;\n\t\tconst fontFamilyVar = '--code-editorInlayHintsFontFamily';\n\t\tthis._editor.getContainerDomNode().style.setProperty(fontFamilyVar, fontFamily);\n\n\n\t\ttype ILineInfo = { line: number; totalLen: number };\n\t\tlet currentLineInfo: ILineInfo = { line: 0, totalLen: 0 };\n\n\t\tfor (let i = 0; i < items.length; i++) {\n\t\t\tconst item = items[i];\n\n\t\t\tif (currentLineInfo.line !== item.anchor.range.startLineNumber) {\n\t\t\t\tcurrentLineInfo = { line: item.anchor.range.startLineNumber, totalLen: 0 };\n\t\t\t}\n\n\t\t\tif (maxLength && currentLineInfo.totalLen > maxLength) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// whitespace leading the actual label\n\t\t\tif (item.hint.paddingLeft) {\n\t\t\t\taddInjectedWhitespace(item, false);\n\t\t\t}\n\n\t\t\t// the label with its parts\n\t\t\tconst parts: languages.InlayHintLabelPart[] = typeof item.hint.label === 'string'\n\t\t\t\t? [{ label: item.hint.label }]\n\t\t\t\t: item.hint.label;\n\n\t\t\tconst itemFixedLength = itemFixedLengths.get(item);\n\t\t\tlet itemActualLength = 0;\n\n\t\t\tfor (let i = 0; i < parts.length; i++) {\n\t\t\t\tconst part = parts[i];\n\n\t\t\t\tconst isFirst = i === 0;\n\t\t\t\tconst isLast = i === parts.length - 1;\n\n\t\t\t\tconst cssProperties: CssProperties = {\n\t\t\t\t\tfontSize: `${fontSize}px`,\n\t\t\t\t\tfontFamily: `var(${fontFamilyVar}), ${EDITOR_FONT_DEFAULTS.fontFamily}`,\n\t\t\t\t\tverticalAlign: isUniform ? 'baseline' : 'middle',\n\t\t\t\t\tunicodeBidi: 'isolate'\n\t\t\t\t};\n\n\t\t\t\tif (isNonEmptyArray(item.hint.textEdits)) {\n\t\t\t\t\tcssProperties.cursor = 'default';\n\t\t\t\t}\n\n\t\t\t\tthis._fillInColors(cssProperties, item.hint);\n\n\t\t\t\tif ((part.command || part.location) && this._activeInlayHintPart?.part.item === item && this._activeInlayHintPart.part.index === i) {\n\t\t\t\t\t// active link!\n\t\t\t\t\tcssProperties.textDecoration = 'underline';\n\t\t\t\t\tif (this._activeInlayHintPart.hasTriggerModifier) {\n\t\t\t\t\t\tcssProperties.color = themeColorFromId(colors.editorActiveLinkForeground);\n\t\t\t\t\t\tcssProperties.cursor = 'pointer';\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlet textlabel = part.label;\n\t\t\t\tcurrentLineInfo.totalLen += textlabel.length;\n\t\t\t\tlet tooLong = false;\n\t\t\t\tconst over = maxLength !== 0 ? (currentLineInfo.totalLen - maxLength) : 0;\n\t\t\t\tif (over > 0) {\n\t\t\t\t\ttextlabel = textlabel.slice(0, -over) + '…';\n\t\t\t\t\ttooLong = true;\n\t\t\t\t}\n\n\t\t\t\titemActualLength += textlabel.length;\n\n\t\t\t\tif (itemFixedLength !== undefined) {\n\t\t\t\t\tconst overFixedLength = itemActualLength - itemFixedLength;\n\t\t\t\t\tif (overFixedLength >= 0) {\n\t\t\t\t\t\t// longer than fixed length, trim\n\t\t\t\t\t\titemActualLength -= overFixedLength;\n\t\t\t\t\t\ttextlabel = textlabel.slice(0, -(1 + overFixedLength)) + '…';\n\t\t\t\t\t\ttooLong = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (padding) {\n\t\t\t\t\tif (isFirst && (isLast || tooLong)) {\n\t\t\t\t\t\t// only element\n\t\t\t\t\t\tcssProperties.padding = `1px ${Math.max(1, fontSize / 4) | 0}px`;\n\t\t\t\t\t\tcssProperties.borderRadius = `${(fontSize / 4) | 0}px`;\n\t\t\t\t\t} else if (isFirst) {\n\t\t\t\t\t\t// first element\n\t\t\t\t\t\tcssProperties.padding = `1px 0 1px ${Math.max(1, fontSize / 4) | 0}px`;\n\t\t\t\t\t\tcssProperties.borderRadius = `${(fontSize / 4) | 0}px 0 0 ${(fontSize / 4) | 0}px`;\n\t\t\t\t\t} else if ((isLast || tooLong)) {\n\t\t\t\t\t\t// last element\n\t\t\t\t\t\tcssProperties.padding = `1px ${Math.max(1, fontSize / 4) | 0}px 1px 0`;\n\t\t\t\t\t\tcssProperties.borderRadius = `0 ${(fontSize / 4) | 0}px ${(fontSize / 4) | 0}px 0`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcssProperties.padding = `1px 0 1px 0`;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\taddInjectedText(\n\t\t\t\t\titem,\n\t\t\t\t\tthis._ruleFactory.createClassNameRef(cssProperties),\n\t\t\t\t\tfixSpace(textlabel),\n\t\t\t\t\tisLast && !item.hint.paddingRight ? InjectedTextCursorStops.Right : InjectedTextCursorStops.None,\n\t\t\t\t\tnew RenderedInlayHintLabelPart(item, i)\n\t\t\t\t);\n\n\t\t\t\tif (tooLong) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (itemFixedLength !== undefined && itemActualLength < itemFixedLength) {\n\t\t\t\t// shorter than fixed length, pad\n\t\t\t\tconst pad = (itemFixedLength - itemActualLength);\n\t\t\t\taddInjectedText(\n\t\t\t\t\titem,\n\t\t\t\t\tthis._ruleFactory.createClassNameRef({}),\n\t\t\t\t\t'\\u200a'.repeat(pad),\n\t\t\t\t\tInjectedTextCursorStops.None\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// whitespace trailing the actual label\n\t\t\tif (item.hint.paddingRight) {\n\t\t\t\taddInjectedWhitespace(item, true);\n\t\t\t}\n\n\t\t\tif (newDecorationsData.length > InlayHintsController._MAX_DECORATORS) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// collect all decoration ids that are affected by the ranges\n\t\t// and only update those decorations\n\t\tconst decorationIdsToReplace: string[] = [];\n\t\tfor (const [id, metadata] of this._decorationsMetadata) {\n\t\t\tconst range = this._editor.getModel()?.getDecorationRange(id);\n\t\t\tif (range && ranges.some(r => r.containsRange(range))) {\n\t\t\t\tdecorationIdsToReplace.push(id);\n\t\t\t\tmetadata.classNameRef.dispose();\n\t\t\t\tthis._decorationsMetadata.delete(id);\n\t\t\t}\n\t\t}\n\n\t\tconst scrollState = StableEditorScrollState.capture(this._editor);\n\n\t\tthis._editor.changeDecorations(accessor => {\n\t\t\tconst newDecorationIds = accessor.deltaDecorations(decorationIdsToReplace, newDecorationsData.map(d => d.decoration));\n\t\t\tfor (let i = 0; i < newDecorationIds.length; i++) {\n\t\t\t\tconst data = newDecorationsData[i];\n\t\t\t\tthis._decorationsMetadata.set(newDecorationIds[i], data);\n\t\t\t}\n\t\t});\n\n\t\tscrollState.restore(this._editor);\n\t}\n\n\tprivate _fillInColors(props: CssProperties, hint: languages.InlayHint): void {\n\t\tif (hint.kind === languages.InlayHintKind.Parameter) {\n\t\t\tprops.backgroundColor = themeColorFromId(colors.editorInlayHintParameterBackground);\n\t\t\tprops.color = themeColorFromId(colors.editorInlayHintParameterForeground);\n\t\t} else if (hint.kind === languages.InlayHintKind.Type) {\n\t\t\tprops.backgroundColor = themeColorFromId(colors.editorInlayHintTypeBackground);\n\t\t\tprops.color = themeColorFromId(colors.editorInlayHintTypeForeground);\n\t\t} else {\n\t\t\tprops.backgroundColor = themeColorFromId(colors.editorInlayHintBackground);\n\t\t\tprops.color = themeColorFromId(colors.editorInlayHintForeground);\n\t\t}\n\t}\n\n\tprivate _getLayoutInfo() {\n\t\tconst options = this._editor.getOption(EditorOption.inlayHints);\n\t\tconst padding = options.padding;\n\n\t\tconst editorFontSize = this._editor.getOption(EditorOption.fontSize);\n\t\tconst editorFontFamily = this._editor.getOption(EditorOption.fontFamily);\n\n\t\tlet fontSize = options.fontSize;\n\t\tif (!fontSize || fontSize < 5 || fontSize > editorFontSize) {\n\t\t\tfontSize = editorFontSize;\n\t\t}\n\n\t\tconst fontFamily = options.fontFamily || editorFontFamily;\n\n\t\tconst isUniform = !padding\n\t\t\t&& fontFamily === editorFontFamily\n\t\t\t&& fontSize === editorFontSize;\n\n\t\treturn { fontSize, fontFamily, padding, isUniform };\n\t}\n\n\tprivate _removeAllDecorations(): void {\n\t\tthis._editor.removeDecorations(Array.from(this._decorationsMetadata.keys()));\n\t\tfor (const obj of this._decorationsMetadata.values()) {\n\t\t\tobj.classNameRef.dispose();\n\t\t}\n\t\tthis._decorationsMetadata.clear();\n\t}\n}\n\n\n// Prevents the view from potentially visible whitespace\nfunction fixSpace(str: string): string {\n\tconst noBreakWhitespace = '\\xa0';\n\treturn str.replace(/[ \\t]/g, noBreakWhitespace);\n}\n\nCommandsRegistry.registerCommand('_executeInlayHintProvider', async (accessor, ...args: [URI, IRange]): Promise<languages.InlayHint[]> => {\n\n\tconst [uri, range] = args;\n\tassertType(URI.isUri(uri));\n\tassertType(Range.isIRange(range));\n\n\tconst { inlayHintsProvider } = accessor.get(ILanguageFeaturesService);\n\tconst ref = await accessor.get(ITextModelService).createModelReference(uri);\n\ttry {\n\t\tconst model = await InlayHintsFragments.create(inlayHintsProvider, ref.object.textEditorModel, [Range.lift(range)], CancellationToken.None);\n\t\tconst result = model.items.map(i => i.hint);\n\t\tsetTimeout(() => model.dispose(), 0); // dispose after sending to ext host\n\t\treturn result;\n\t} finally {\n\t\tref.dispose();\n\t}\n});\n","/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { isHTMLElement, ModifierKeyEmitter } from '../../../../base/browser/dom.js';\nimport { isNonEmptyArray } from '../../../../base/common/arrays.js';\nimport { disposableTimeout, RunOnceScheduler } from '../../../../base/common/async.js';\nimport { CancellationToken, CancellationTokenSource } from '../../../../base/common/cancellation.js';\nimport { onUnexpectedError } from '../../../../base/common/errors.js';\nimport { DisposableStore, IDisposable, MutableDisposable, toDisposable } from '../../../../base/common/lifecycle.js';\nimport { LRUCache } from '../../../../base/common/map.js';\nimport { IRange } from '../../../../base/common/range.js';\nimport { assertType } from '../../../../base/common/types.js';\nimport { URI } from '../../../../base/common/uri.js';\nimport { IActiveCodeEditor, ICodeEditor, IEditorMouseEvent, MouseTargetType } from '../../../browser/editorBrowser.js';\nimport { ClassNameReference, CssProperties, DynamicCssRules } from '../../../browser/editorDom.js';\nimport { StableEditorScrollState } from '../../../browser/stableEditorScroll.js';\nimport { EditorOption } from '../../../common/config/editorOptions.js';\nimport { EDITOR_FONT_DEFAULTS } from '../../../common/config/fontInfo.js';\nimport { EditOperation } from '../../../common/core/editOperation.js';\nimport { Range } from '../../../common/core/range.js';\nimport { IEditorContribution } from '../../../common/editorCommon.js';\nimport * as languages from '../../../common/languages.js';\nimport { IModelDeltaDecoration, InjectedTextCursorStops, InjectedTextOptions, ITextModel, TrackedRangeStickiness } from '../../../common/model.js';\nimport { ModelDecorationInjectedTextOptions } from '../../../common/model/textModel.js';\nimport { IFeatureDebounceInformation, ILanguageFeatureDebounceService } from '../../../common/services/languageFeatureDebounce.js';\nimport { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';\nimport { ITextModelService } from '../../../common/services/resolverService.js';\nimport { ClickLinkGesture, ClickLinkMouseEvent } from '../../gotoSymbol/browser/link/clickLinkGesture.js';\nimport { InlayHintAnchor, InlayHintItem, InlayHintsFragments } from './inlayHints.js';\nimport { goToDefinitionWithLocation, showGoToContextMenu } from './inlayHintsLocations.js';\nimport { CommandsRegistry, ICommandService } from '../../../../platform/commands/common/commands.js';\nimport { InstantiationType, registerSingleton } from '../../../../platform/instantiation/common/extensions.js';\nimport { createDecorator, IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js';\nimport { INotificationService, Severity } from '../../../../platform/notification/common/notification.js';\nimport * as colors from '../../../../platform/theme/common/colorRegistry.js';\nimport { themeColorFromId } from '../../../../platform/theme/common/themeService.js';\nimport { Position } from '../../../common/core/position.js';\n\n// --- hint caching service (per session)\n\nclass InlayHintsCache {\n\n\tdeclare readonly _serviceBrand: undefined;\n\n\tprivate readonly _entries = new LRUCache<string, InlayHintItem[]>(50);\n\n\tget(model: ITextModel): InlayHintItem[] | undefined {\n\t\tconst key = InlayHintsCache._key(model);\n\t\treturn this._entries.get(key);\n\t}\n\n\tset(model: ITextModel, value: InlayHintItem[]): void {\n\t\tconst key = InlayHintsCache._key(model);\n\t\tthis._entries.set(key, value);\n\t}\n\n\tprivate static _key(model: ITextModel): string {\n\t\treturn `${model.uri.toString()}/${model.getVersionId()}`;\n\t}\n}\n\ninterface IInlayHintsCache extends InlayHintsCache { }\nconst IInlayHintsCache = createDecorator<IInlayHintsCache>('IInlayHintsCache');\nregisterSingleton(IInlayHintsCache, InlayHintsCache, InstantiationType.Delayed);\n\n// --- rendered label\n\nexport class RenderedInlayHintLabelPart {\n\tconstructor(readonly item: InlayHintItem, readonly index: number) { }\n\n\tget part() {\n\t\tconst label = this.item.hint.label;\n\t\tif (typeof label === 'string') {\n\t\t\treturn { label };\n\t\t} else {\n\t\t\treturn label[this.index];\n\t\t}\n\t}\n}\n\nclass ActiveInlayHintInfo {\n\tconstructor(readonly part: RenderedInlayHintLabelPart, readonly hasTriggerModifier: boolean) { }\n}\n\ntype InlayHintDecorationRenderInfo = {\n\titem: InlayHintItem;\n\tdecoration: IModelDeltaDecoration;\n\tclassNameRef: ClassNameReference;\n};\n\nconst enum RenderMode {\n\tNormal,\n\tInvisible\n}\n\n\n\n/**\n * Mix of CancellationTokenSource, DisposableStore and MutableDisposable\n */\nclass CancellationStore implements IDisposable {\n\n\tprivate readonly _store = new MutableDisposable<DisposableStore>();\n\tprivate _tokenSource = new CancellationTokenSource();\n\n\tdispose() {\n\t\tthis._store.dispose();\n\t\tthis._tokenSource.dispose(true);\n\t}\n\n\treset() {\n\t\tthis._tokenSource.dispose(true);\n\t\tthis._tokenSource = new CancellationTokenSource();\n\t\tthis._store.value = new DisposableStore();\n\n\t\treturn {\n\t\t\tstore: this._store.value,\n\t\t\ttoken: this._tokenSource.token\n\t\t};\n\t}\n}\n\n\n// --- controller\n\n\nexport class InlayHintsController implements IEditorContribution {\n\n\tstatic readonly ID: string = 'editor.contrib.InlayHints';\n\n\tprivate static readonly _MAX_DECORATORS = 1500;\n\tprivate static readonly _whitespaceData = {};\n\n\tstatic get(editor: ICodeEditor): InlayHintsController | undefined {\n\t\treturn editor.getContribution<InlayHintsController>(InlayHintsController.ID) ?? undefined;\n\t}\n\n\tprivate readonly _disposables = new DisposableStore();\n\tprivate readonly _sessionDisposables = new DisposableStore();\n\tprivate readonly _decorationsMetadata = new Map<string, InlayHintDecorationRenderInfo>();\n\tprivate readonly _debounceInfo: IFeatureDebounceInformation;\n\tprivate readonly _ruleFactory: DynamicCssRules;\n\n\tprivate _cursorInfo?: { position: Position; notEarlierThan: number };\n\tprivate _activeRenderMode = RenderMode.Normal;\n\tprivate _activeInlayHintPart?: ActiveInlayHintInfo;\n\n\tconstructor(\n\t\tprivate readonly _editor: ICodeEditor,\n\t\t@ILanguageFeaturesService private readonly _languageFeaturesService: ILanguageFeaturesService,\n\t\t@ILanguageFeatureDebounceService _featureDebounce: ILanguageFeatureDebounceService,\n\t\t@IInlayHintsCache private readonly _inlayHintsCache: IInlayHintsCache,\n\t\t@ICommandService private readonly _commandService: ICommandService,\n\t\t@INotificationService private readonly _notificationService: INotificationService,\n\t\t@IInstantiationService private readonly _instaService: IInstantiationService,\n\t) {\n\t\tthis._ruleFactory = this._disposables.add(new DynamicCssRules(this._editor));\n\t\tthis._debounceInfo = _featureDebounce.for(_languageFeaturesService.inlayHintsProvider, 'InlayHint', { min: 25 });\n\t\tthis._disposables.add(_languageFeaturesService.inlayHintsProvider.onDidChange(() => this._update()));\n\t\tthis._disposables.add(_editor.onDidChangeModel(() => this._update()));\n\t\tthis._disposables.add(_editor.onDidChangeModelLanguage(() => this._update()));\n\t\tthis._disposables.add(_editor.onDidChangeConfiguration(e => {\n\t\t\tif (e.hasChanged(EditorOption.inlayHints)) {\n\t\t\t\tthis._update();\n\t\t\t}\n\t\t}));\n\t\tthis._update();\n\n\t}\n\n\tdispose(): void {\n\t\tthis._sessionDisposables.dispose();\n\t\tthis._removeAllDecorations();\n\t\tthis._disposables.dispose();\n\t}\n\n\tprivate _update(): void {\n\t\tthis._sessionDisposables.clear();\n\t\tthis._removeAllDecorations();\n\n\t\tconst options = this._editor.getOption(EditorOption.inlayHints);\n\t\tif (options.enabled === 'off') {\n\t\t\treturn;\n\t\t}\n\n\t\tconst model = this._editor.getModel();\n\t\tif (!model || !this._languageFeaturesService.inlayHintsProvider.has(model)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (options.enabled === 'on') {\n\t\t\t// different \"on\" modes: always\n\t\t\tthis._activeRenderMode = RenderMode.Normal;\n\t\t} else {\n\t\t\t// different \"on\" modes: offUnlessPressed, or onUnlessPressed\n\t\t\tlet defaultMode: RenderMode;\n\t\t\tlet altMode: RenderMode;\n\t\t\tif (options.enabled === 'onUnlessPressed') {\n\t\t\t\tdefaultMode = RenderMode.Normal;\n\t\t\t\taltMode = RenderMode.Invisible;\n\t\t\t} else {\n\t\t\t\tdefaultMode = RenderMode.Invisible;\n\t\t\t\taltMode = RenderMode.Normal;\n\t\t\t}\n\t\t\tthis._activeRenderMode = defaultMode;\n\n\t\t\tthis._sessionDisposables.add(ModifierKeyEmitter.getInstance().event(e => {\n\t\t\t\tif (!this._editor.hasModel()) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst newRenderMode = e.altKey && e.ctrlKey && !(e.shiftKey || e.metaKey) ? altMode : defaultMode;\n\t\t\t\tif (newRenderMode !== this._activeRenderMode) {\n\t\t\t\t\tthis._activeRenderMode = newRenderMode;\n\t\t\t\t\tconst model = this._editor.getModel();\n\t\t\t\t\tconst copies = this._copyInlayHintsWithCurrentAnchor(model);\n\t\t\t\t\tthis._updateHintsDecorators([model.getFullModelRange()], copies);\n\t\t\t\t\tscheduler.schedule(0);\n\t\t\t\t}\n\t\t\t}));\n\t\t}\n\n\t\t// iff possible, quickly update from cache\n\t\tconst cached = this._inlayHintsCache.get(model);\n\t\tif (cached) {\n\t\t\tthis._updateHintsDecorators([model.getFullModelRange()], cached);\n\t\t}\n\t\tthis._sessionDisposables.add(toDisposable(() => {\n\t\t\t// cache items when switching files etc\n\t\t\tif (!model.isDisposed()) {\n\t\t\t\tthis._cacheHintsForFastRestore(model);\n\t\t\t}\n\t\t}));\n\n\t\tlet cts: CancellationTokenSource | undefined;\n\t\tconst watchedProviders = new Set<languages.InlayHintsProvider>();\n\n\t\tthis._sessionDisposables.add(model.onWillDispose(() => cts?.cancel()));\n\n\t\tconst cancellationStore = this._sessionDisposables.add(new CancellationStore());\n\n\t\tconst scheduler = new RunOnceScheduler(async () => {\n\t\t\tconst t1 = Date.now();\n\n\t\t\tconst { store, token } = cancellationStore.reset();\n\n\t\t\ttry {\n\t\t\t\tconst inlayHints = await InlayHintsFragments.create(this._languageFeaturesService.inlayHintsProvider, model, this._getHintsRanges(), token);\n\t\t\t\tscheduler.delay = this._debounceInfo.update(model, Date.now() - t1);\n\t\t\t\tif (token.isCancellationRequested) {\n\t\t\t\t\tinlayHints.dispose();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// listen to provider changes\n\t\t\t\tfor (const provider of inlayHints.provider) {\n\t\t\t\t\tif (typeof provider.onDidChangeInlayHints === 'function' && !watchedProviders.has(provider)) {\n\t\t\t\t\t\twatchedProviders.add(provider);\n\t\t\t\t\t\tstore.add(provider.onDidChangeInlayHints(() => {\n\t\t\t\t\t\t\tif (!scheduler.isScheduled()) { // ignore event when request is already scheduled\n\t\t\t\t\t\t\t\tscheduler.schedule();\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\n\t\t\t\tstore.add(inlayHints);\n\t\t\t\tstore.add(toDisposable(() => watchedProviders.clear()));\n\t\t\t\tthis._updateHintsDecorators(inlayHints.ranges, inlayHints.items);\n\t\t\t\tthis._cacheHintsForFastRestore(model);\n\n\t\t\t} catch (err) {\n\t\t\t\tonUnexpectedError(err);\n\t\t\t}\n\t\t}, this._debounceInfo.get(model));\n\n\t\tthis._sessionDisposables.add(scheduler);\n\t\tscheduler.schedule(0);\n\n\t\tthis._sessionDisposables.add(this._editor.onDidScrollChange((e) => {\n\t\t\t// update when scroll position changes\n\t\t\t// uses scrollTopChanged has weak heuristic to differenatiate between scrolling due to\n\t\t\t// typing or due to \"actual\" scrolling\n\t\t\tif (e.scrollTopChanged || !scheduler.isScheduled()) {\n\t\t\t\tscheduler.schedule();\n\t\t\t}\n\t\t}));\n\n\t\tconst cursor = this._sessionDisposables.add(new MutableDisposable());\n\t\tthis._sessionDisposables.add(this._editor.onDidChangeModelContent((e) => {\n\t\t\tcts?.cancel();\n\n\t\t\t// mark current cursor position and time after which the whole can be updated/redrawn\n\t\t\tconst delay = Math.max(scheduler.delay, 800);\n\t\t\tthis._cursorInfo = { position: this._editor.getPosition()!, notEarlierThan: Date.now() + delay };\n\t\t\tcursor.value = disposableTimeout(() => scheduler.schedule(0), delay);\n\n\t\t\tscheduler.schedule();\n\t\t}));\n\n\t\tthis._sessionDisposables.add(this._editor.onDidChangeConfiguration(e => {\n\t\t\tif (e.hasChanged(EditorOption.inlayHints)) {\n\t\t\t\tscheduler.schedule();\n\t\t\t}\n\t\t}));\n\n\t\t// mouse gestures\n\t\tthis._sessionDisposables.add(this._installDblClickGesture(() => scheduler.schedule(0)));\n\t\tthis._sessionDisposables.add(this._installLinkGesture());\n\t\tthis._sessionDisposables.add(this._installContextMenu());\n\t}\n\n\tprivate _installLinkGesture(): IDisposable {\n\n\t\tconst store = new DisposableStore();\n\t\tconst gesture = store.add(new ClickLinkGesture(this._editor));\n\n\t\t// let removeHighlight = () => { };\n\n\t\tconst sessionStore = new DisposableStore();\n\t\tstore.add(sessionStore);\n\n\t\tstore.add(gesture.onMouseMoveOrRelevantKeyDown(e => {\n\t\t\tconst [mouseEvent] = e;\n\t\t\tconst labelPart = this._getInlayHintLabelPart(mouseEvent);\n\t\t\tconst model = this._editor.getModel();\n\n\t\t\tif (!labelPart || !model) {\n\t\t\t\tsessionStore.clear();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// resolve the item\n\t\t\tconst cts = new CancellationTokenSource();\n\t\t\tsessionStore.add(toDisposable(() => cts.dispose(true)));\n\t\t\tlabelPart.item.resolve(cts.token);\n\n\t\t\t// render link => when the modifier is pressed and when there is a command or location\n\t\t\tthis._activeInlayHintPart = labelPart.part.command || labelPart.part.location\n\t\t\t\t? new ActiveInlayHintInfo(labelPart, mouseEvent.hasTriggerModifier)\n\t\t\t\t: undefined;\n\n\t\t\tconst lineNumber = model.validatePosition(labelPart.item.hint.position).lineNumber;\n\t\t\tconst range = new Range(lineNumber, 1, lineNumber, model.getLineMaxColumn(lineNumber));\n\t\t\tconst lineHints = this._getInlineHintsForRange(range);\n\t\t\tthis._updateHintsDecorators([range], lineHints);\n\t\t\tsessionStore.add(toDisposable(() => {\n\t\t\t\tthis._activeInlayHintPart = undefined;\n\t\t\t\tthis._updateHintsDecorators([range], lineHints);\n\t\t\t}));\n\t\t}));\n\t\tstore.add(gesture.onCancel(() => sessionStore.clear()));\n\t\tstore.add(gesture.onExecute(async e => {\n\t\t\tconst label = this._getInlayHintLabelPart(e);\n\t\t\tif (label) {\n\t\t\t\tconst part = label.part;\n\t\t\t\tif (part.location) {\n\t\t\t\t\t// location -> execute go to def\n\t\t\t\t\tthis._instaService.invokeFunction(goToDefinitionWithLocation, e, this._editor as IActiveCodeEditor, part.location);\n\t\t\t\t} else if (languages.Command.is(part.command)) {\n\t\t\t\t\t// command -> execute it\n\t\t\t\t\tawait this._invokeCommand(part.command, label.item);\n\t\t\t\t}\n\t\t\t}\n\t\t}));\n\t\treturn store;\n\t}\n\n\tprivate _getInlineHintsForRange(range: Range) {\n\t\tconst lineHints = new Set<InlayHintItem>();\n\t\tfor (const data of this._decorationsMetadata.values()) {\n\t\t\tif (range.containsRange(data.item.anchor.range)) {\n\t\t\t\tlineHints.add(data.item);\n\t\t\t}\n\t\t}\n\t\treturn Array.from(lineHints);\n\t}\n\n\tprivate _installDblClickGesture(updateInlayHints: Function): IDisposable {\n\t\treturn this._editor.onMouseUp(async e => {\n\t\t\tif (e.event.detail !== 2) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst part = this._getInlayHintLabelPart(e);\n\t\t\tif (!part) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\te.event.preventDefault();\n\t\t\tawait part.item.resolve(CancellationToken.None);\n\t\t\tif (isNonEmptyArray(part.item.hint.textEdits)) {\n\t\t\t\tconst edits = part.item.hint.textEdits.map(edit => EditOperation.replace(Range.lift(edit.range), edit.text));\n\t\t\t\tthis._editor.executeEdits('inlayHint.default', edits);\n\t\t\t\tupdateInlayHints();\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate _installContextMenu(): IDisposable {\n\t\treturn this._editor.onContextMenu(async e => {\n\t\t\tif (!(isHTMLElement(e.event.target))) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst part = this._getInlayHintLabelPart(e);\n\t\t\tif (part) {\n\t\t\t\tawait this._instaService.invokeFunction(showGoToContextMenu, this._editor, e.event.target, part);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate _getInlayHintLabelPart(e: IEditorMouseEvent | ClickLinkMouseEvent): RenderedInlayHintLabelPart | undefined {\n\t\tif (e.target.type !== MouseTargetType.CONTENT_TEXT) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst options = e.target.detail.injectedText?.options;\n\t\tif (options instanceof ModelDecorationInjectedTextOptions && options?.attachedData instanceof RenderedInlayHintLabelPart) {\n\t\t\treturn options.attachedData;\n\t\t}\n\t\treturn undefined;\n\t}\n\n\tprivate async _invokeCommand(command: languages.Command, item: InlayHintItem) {\n\t\ttry {\n\t\t\tawait this._commandService.executeCommand(command.id, ...(command.arguments ?? []));\n\t\t} catch (err) {\n\t\t\tthis._notificationService.notify({\n\t\t\t\tseverity: Severity.Error,\n\t\t\t\tsource: item.provider.displayName,\n\t\t\t\tmessage: err\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate _cacheHintsForFastRestore(model: ITextModel): void {\n\t\tconst hints = this._copyInlayHintsWithCurrentAnchor(model);\n\t\tthis._inlayHintsCache.set(model, hints);\n\t}\n\n\t// return inlay hints but with an anchor that reflects \"updates\"\n\t// that happened after receiving them, e.g adding new lines before a hint\n\tprivate _copyInlayHintsWithCurrentAnchor(model: ITextModel): InlayHintItem[] {\n\t\tconst items = new Map<InlayHintItem, InlayHintItem>();\n\t\tfor (const [id, obj] of this._decorationsMetadata) {\n\t\t\tif (items.has(obj.item)) {\n\t\t\t\t// an inlay item can be rendered as multiple decorations\n\t\t\t\t// but they will all uses the same range\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst range = model.getDecorationRange(id);\n\t\t\tif (range) {\n\t\t\t\t// update range with whatever the editor has tweaked it to\n\t\t\t\tconst anchor = new InlayHintAnchor(range, obj.item.anchor.direction);\n\t\t\t\tconst copy = obj.item.with({ anchor });\n\t\t\t\titems.set(obj.item, copy);\n\t\t\t}\n\t\t}\n\t\treturn Array.from(items.values());\n\t}\n\n\tprivate _getHintsRanges(): Range[] {\n\t\tconst extra = 30;\n\t\tconst model = this._editor.getModel()!;\n\t\tconst visibleRanges = this._editor.getVisibleRangesPlusViewportAboveBelow();\n\t\tconst result: Range[] = [];\n\t\tfor (const range of visibleRanges.sort(Range.compareRangesUsingStarts)) {\n\t\t\tconst extendedRange = model.validateRange(new Range(range.startLineNumber - extra, range.startColumn, range.endLineNumber + extra, range.endColumn));\n\t\t\tif (result.length === 0 || !Range.areIntersectingOrTouching(result[result.length - 1], extendedRange)) {\n\t\t\t\tresult.push(extendedRange);\n\t\t\t} else {\n\t\t\t\tresult[result.length - 1] = Range.plusRange(result[result.length - 1], extendedRange);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tprivate _updateHintsDecorators(ranges: readonly Range[], items: readonly InlayHintItem[]): void {\n\n\t\tconst itemFixedLengths = new Map<InlayHintItem, number>();\n\n\t\tif (this._cursorInfo\n\t\t\t&& this._cursorInfo.notEarlierThan > Date.now()\n\t\t\t&& ranges.some(range => range.containsPosition(this._cursorInfo!.position))\n\t\t) {\n\t\t\t// collect inlay hints that are on the same line and before the cursor. Those \"old\" hints\n\t\t\t// define fixed lengths so that the cursor does not jump back and worth while typing.\n\t\t\tconst { position } = this._cursorInfo;\n\t\t\tthis._cursorInfo = undefined;\n\n\t\t\tconst lengths = new Map<InlayHintItem, number>();\n\n\t\t\tfor (const deco of this._editor.getLineDecorations(position.lineNumber) ?? []) {\n\n\t\t\t\tconst data = this._decorationsMetadata.get(deco.id);\n\t\t\t\tif (deco.range.startColumn > position.column) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst opts = data?.decoration.options[data.item.anchor.direction];\n\t\t\t\tif (opts && opts.attachedData !== InlayHintsController._whitespaceData) {\n\t\t\t\t\tconst len = lengths.get(data.item) ?? 0;\n\t\t\t\t\tlengths.set(data.item, len + opts.content.length);\n\t\t\t\t}\n\t\t\t}\n\n\n\t\t\t// on the cursor line and before the cursor-column\n\t\t\tconst newItemsWithFixedLength = items.filter(item => item.anchor.range.startLineNumber === position.lineNumber && item.anchor.range.endColumn <= position.column);\n\t\t\tconst fixedLengths = Array.from(lengths.values());\n\n\t\t\t// match up fixed lengths with items and distribute the remaining lengths to the last item\n\t\t\tlet lastItem: InlayHintItem | undefined;\n\t\t\twhile (true) {\n\t\t\t\tconst targetItem = newItemsWithFixedLength.shift();\n\t\t\t\tconst fixedLength = fixedLengths.shift();\n\n\t\t\t\tif (!fixedLength && !targetItem) {\n\t\t\t\t\tbreak; // DONE\n\t\t\t\t}\n\n\t\t\t\tif (targetItem) {\n\t\t\t\t\titemFixedLengths.set(targetItem, fixedLength ?? 0);\n\t\t\t\t\tlastItem = targetItem;\n\n\t\t\t\t} else if (lastItem && fixedLength) {\n\t\t\t\t\t// still lengths but no more item. give it all to the last\n\t\t\t\t\tlet len = itemFixedLengths.get(lastItem)!;\n\t\t\t\t\tlen += fixedLength;\n\t\t\t\t\tlen += fixedLengths.reduce((p, c) => p + c, 0);\n\t\t\t\t\tfixedLengths.length = 0;\n\t\t\t\t\tbreak; // DONE\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// utils to collect/create injected text decorations\n\t\tconst newDecorationsData: InlayHintDecorationRenderInfo[] = [];\n\t\tconst addInjectedText = (item: InlayHintItem, ref: ClassNameReference, content: string, cursorStops: InjectedTextCursorStops, attachedData?: RenderedInlayHintLabelPart | object): void => {\n\t\t\tconst opts: InjectedTextOptions = {\n\t\t\t\tcontent,\n\t\t\t\tinlineClassNameAffectsLetterSpacing: true,\n\t\t\t\tinlineClassName: ref.className,\n\t\t\t\tcursorStops,\n\t\t\t\tattachedData\n\t\t\t};\n\t\t\tnewDecorationsData.push({\n\t\t\t\titem,\n\t\t\t\tclassNameRef: ref,\n\t\t\t\tdecoration: {\n\t\t\t\t\trange: item.anchor.range,\n\t\t\t\t\toptions: {\n\t\t\t\t\t\t// className: \"rangeHighlight\", // DEBUG highlight to see to what range a hint is attached\n\t\t\t\t\t\tdescription: 'InlayHint',\n\t\t\t\t\t\tshowIfCollapsed: item.anchor.range.isEmpty(), // \"original\" range is empty\n\t\t\t\t\t\tcollapseOnReplaceEdit: !item.anchor.range.isEmpty(),\n\t\t\t\t\t\tstickiness: TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges,\n\t\t\t\t\t\t[item.anchor.direction]: this._activeRenderMode === RenderMode.Normal ? opts : undefined\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tconst addInjectedWhitespace = (item: InlayHintItem, isLast: boolean): void => {\n\t\t\tconst marginRule = this._ruleFactory.createClassNameRef({\n\t\t\t\twidth: `${(fontSize / 3) | 0}px`,\n\t\t\t\tdisplay: 'inline-block'\n\t\t\t});\n\t\t\taddInjectedText(item, marginRule, '\\u200a', isLast ? InjectedTextCursorStops.Right : InjectedTextCursorStops.None, InlayHintsController._whitespaceData);\n\t\t};\n\n\n\t\t//\n\t\tconst { fontSize, fontFamily, padding, isUniform } = this._getLayoutInfo();\n\t\tconst maxLength = this._editor.getOption(EditorOption.inlayHints).maximumLength;\n\t\tconst fontFamilyVar = '--code-editorInlayHintsFontFamily';\n\t\tthis._editor.getContainerDomNode().style.setProperty(fontFamilyVar, fontFamily);\n\n\n\t\ttype ILineInfo = { line: number; totalLen: number };\n\t\tlet currentLineInfo: ILineInfo = { line: 0, totalLen: 0 };\n\n\t\tfor (let i = 0; i < items.length; i++) {\n\t\t\tconst item = items[i];\n\n\t\t\tif (currentLineInfo.line !== item.anchor.range.startLineNumber) {\n\t\t\t\tcurrentLineInfo = { line: item.anchor.range.startLineNumber, totalLen: 0 };\n\t\t\t}\n\n\t\t\tif (maxLength && currentLineInfo.totalLen > maxLength) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// whitespace leading the actual label\n\t\t\tif (item.hint.paddingLeft) {\n\t\t\t\taddInjectedWhitespace(item, false);\n\t\t\t}\n\n\t\t\t// the label with its parts\n\t\t\tconst parts: languages.InlayHintLabelPart[] = typeof item.hint.label === 'string'\n\t\t\t\t? [{ label: item.hint.label }]\n\t\t\t\t: item.hint.label;\n\n\t\t\tconst itemFixedLength = itemFixedLengths.get(item);\n\t\t\tlet itemActualLength = 0;\n\n\t\t\tfor (let i = 0; i < parts.length; i++) {\n\t\t\t\tconst part = parts[i];\n\n\t\t\t\tconst isFirst = i === 0;\n\t\t\t\tconst isLast = i === parts.length - 1;\n\n\t\t\t\tconst cssProperties: CssProperties = {\n\t\t\t\t\tfontSize: `${fontSize}px`,\n\t\t\t\t\tfontFamily: `var(${fontFamilyVar}), ${EDITOR_FONT_DEFAULTS.fontFamily}`,\n\t\t\t\t\tverticalAlign: isUniform ? 'baseline' : 'middle',\n\t\t\t\t\tunicodeBidi: 'isolate'\n\t\t\t\t};\n\n\t\t\t\tif (isNonEmptyArray(item.hint.textEdits)) {\n\t\t\t\t\tcssProperties.cursor = 'default';\n\t\t\t\t}\n\n\t\t\t\tthis._fillInColors(cssProperties, item.hint);\n\n\t\t\t\tif ((part.command || part.location) && this._activeInlayHintPart?.part.item === item && this._activeInlayHintPart.part.index === i) {\n\t\t\t\t\t// active link!\n\t\t\t\t\tcssProperties.textDecoration = 'underline';\n\t\t\t\t\tif (this._activeInlayHintPart.hasTriggerModifier) {\n\t\t\t\t\t\tcssProperties.color = themeColorFromId(colors.editorActiveLinkForeground);\n\t\t\t\t\t\tcssProperties.cursor = 'pointer';\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tlet textlabel = part.label;\n\t\t\t\tcurrentLineInfo.totalLen += textlabel.length;\n\t\t\t\tlet tooLong = false;\n\t\t\t\tconst over = maxLength !== 0 ? (currentLineInfo.totalLen - maxLength) : 0;\n\t\t\t\tif (over > 0) {\n\t\t\t\t\ttextlabel = textlabel.slice(0, -over) + '…';\n\t\t\t\t\ttooLong = true;\n\t\t\t\t}\n\n\t\t\t\titemActualLength += textlabel.length;\n\n\t\t\t\tif (itemFixedLength !== undefined) {\n\t\t\t\t\tconst overFixedLength = itemActualLength - itemFixedLength;\n\t\t\t\t\tif (overFixedLength >= 0) {\n\t\t\t\t\t\t// longer than fixed length, trim\n\t\t\t\t\t\titemActualLength -= overFixedLength;\n\t\t\t\t\t\ttextlabel = textlabel.slice(0, -(1 + overFixedLength)) + '…';\n\t\t\t\t\t\ttooLong = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (padding) {\n\t\t\t\t\tif (isFirst && (isLast || tooLong)) {\n\t\t\t\t\t\t// only element\n\t\t\t\t\t\tcssProperties.padding = `1px ${Math.max(1, fontSize / 4) | 0}px`;\n\t\t\t\t\t\tcssProperties.borderRadius = `${(fontSize / 4) | 0}px`;\n\t\t\t\t\t} else if (isFirst) {\n\t\t\t\t\t\t// first element\n\t\t\t\t\t\tcssProperties.padding = `1px 0 1px ${Math.max(1, fontSize / 4) | 0}px`;\n\t\t\t\t\t\tcssProperties.borderRadius = `${(fontSize / 4) | 0}px 0 0 ${(fontSize / 4) | 0}px`;\n\t\t\t\t\t} else if ((isLast || tooLong)) {\n\t\t\t\t\t\t// last element\n\t\t\t\t\t\tcssProperties.padding = `1px ${Math.max(1, fontSize / 4) | 0}px 1px 0`;\n\t\t\t\t\t\tcssProperties.borderRadius = `0 ${(fontSize / 4) | 0}px ${(fontSize / 4) | 0}px 0`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcssProperties.padding = `1px 0 1px 0`;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\taddInjectedText(\n\t\t\t\t\titem,\n\t\t\t\t\tthis._ruleFactory.createClassNameRef(cssProperties),\n\t\t\t\t\tfixSpace(textlabel),\n\t\t\t\t\tisLast && !item.hint.paddingRight ? InjectedTextCursorStops.Right : InjectedTextCursorStops.None,\n\t\t\t\t\tnew RenderedInlayHintLabelPart(item, i)\n\t\t\t\t);\n\n\t\t\t\tif (tooLong) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (itemFixedLength !== undefined && itemActualLength < itemFixedLength) {\n\t\t\t\t// shorter than fixed length, pad\n\t\t\t\tconst pad = (itemFixedLength - itemActualLength);\n\t\t\t\taddInjectedText(\n\t\t\t\t\titem,\n\t\t\t\t\tthis._ruleFactory.createClassNameRef({}),\n\t\t\t\t\t'\\u200a'.repeat(pad),\n\t\t\t\t\tInjectedTextCursorStops.None\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// whitespace trailing the actual label\n\t\t\tif (item.hint.paddingRight) {\n\t\t\t\taddInjectedWhitespace(item, true);\n\t\t\t}\n\n\t\t\tif (newDecorationsData.length > InlayHintsController._MAX_DECORATORS) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// collect all decoration ids that are affected by the ranges\n\t\t// and only update those decorations\n\t\tconst decorationIdsToReplace: string[] = [];\n\t\tfor (const [id, metadata] of this._decorationsMetadata) {\n\t\t\tconst range = this._editor.getModel()?.getDecorationRange(id);\n\t\t\tif (range && ranges.some(r => r.containsRange(range))) {\n\t\t\t\tdecorationIdsToReplace.push(id);\n\t\t\t\tmetadata.classNameRef.dispose();\n\t\t\t\tthis._decorationsMetadata.delete(id);\n\t\t\t}\n\t\t}\n\n\t\tconst scrollState = StableEditorScrollState.capture(this._editor);\n\n\t\tthis._editor.changeDecorations(accessor => {\n\t\t\tconst newDecorationIds = accessor.deltaDecorations(decorationIdsToReplace, newDecorationsData.map(d => d.decoration));\n\t\t\tfor (let i = 0; i < newDecorationIds.length; i++) {\n\t\t\t\tconst data = newDecorationsData[i];\n\t\t\t\tthis._decorationsMetadata.set(newDecorationIds[i], data);\n\t\t\t}\n\t\t});\n\n\t\tscrollState.restore(this._editor);\n\t}\n\n\tprivate _fillInColors(props: CssProperties, hint: languages.InlayHint): void {\n\t\tif (hint.kind === languages.InlayHintKind.Parameter) {\n\t\t\tprops.backgroundColor = themeColorFromId(colors.editorInlayHintParameterBackground);\n\t\t\tprops.color = themeColorFromId(colors.editorInlayHintParameterForeground);\n\t\t} else if (hint.kind === languages.InlayHintKind.Type) {\n\t\t\tprops.backgroundColor = themeColorFromId(colors.editorInlayHintTypeBackground);\n\t\t\tprops.color = themeColorFromId(colors.editorInlayHintTypeForeground);\n\t\t} else {\n\t\t\tprops.backgroundColor = themeColorFromId(colors.editorInlayHintBackground);\n\t\t\tprops.color = themeColorFromId(colors.editorInlayHintForeground);\n\t\t}\n\t}\n\n\tprivate _getLayoutInfo() {\n\t\tconst options = this._editor.getOption(EditorOption.inlayHints);\n\t\tconst padding = options.padding;\n\n\t\tconst editorFontSize = this._editor.getOption(EditorOption.fontSize);\n\t\tconst editorFontFamily = this._editor.getOption(EditorOption.fontFamily);\n\n\t\tlet fontSize = options.fontSize;\n\t\tif (!fontSize || fontSize < 5 || fontSize > editorFontSize) {\n\t\t\tfontSize = editorFontSize;\n\t\t}\n\n\t\tconst fontFamily = options.fontFamily || editorFontFamily;\n\n\t\tconst isUniform = !padding\n\t\t\t&& fontFamily === editorFontFamily\n\t\t\t&& fontSize === editorFontSize;\n\n\t\treturn { fontSize, fontFamily, padding, isUniform };\n\t}\n\n\tprivate _removeAllDecorations(): void {\n\t\tthis._editor.removeDecorations(Array.from(this._decorationsMetadata.keys()));\n\t\tfor (const obj of this._decorationsMetadata.values()) {\n\t\t\tobj.classNameRef.dispose();\n\t\t}\n\t\tthis._decorationsMetadata.clear();\n\t}\n}\n\n\n// Prevents the view from potentially visible whitespace\nfunction fixSpace(str: string): string {\n\tconst noBreakWhitespace = '\\xa0';\n\treturn str.replace(/[ \\t]/g, noBreakWhitespace);\n}\n\nCommandsRegistry.registerCommand('_executeInlayHintProvider', async (accessor, ...args: [URI, IRange]): Promise<languages.InlayHint[]> => {\n\n\tconst [uri, range] = args;\n\tassertType(URI.isUri(uri));\n\tassertType(Range.isIRange(range));\n\n\tconst { inlayHintsProvider } = accessor.get(ILanguageFeaturesService);\n\tconst ref = await accessor.get(ITextModelService).createModelReference(uri);\n\ttry {\n\t\tconst model = await InlayHintsFragments.create(inlayHintsProvider, ref.object.textEditorModel, [Range.lift(range)], CancellationToken.None);\n\t\tconst result = model.items.map(i => i.hint);\n\t\tsetTimeout(() => model.dispose(), 0); // dispose after sending to ext host\n\t\treturn result;\n\t} finally {\n\t\tref.dispose();\n\t}\n});\n"]}