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

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 (124) hide show
  1. package/esm/nls.keys.json +1 -1
  2. package/esm/nls.messages.de.js +2 -2
  3. package/esm/nls.messages.es.js +2 -2
  4. package/esm/nls.messages.fr.js +2 -2
  5. package/esm/nls.messages.it.js +2 -2
  6. package/esm/nls.messages.ja.js +2 -2
  7. package/esm/nls.messages.js +1 -1
  8. package/esm/nls.messages.json +1 -1
  9. package/esm/nls.messages.ko.js +2 -2
  10. package/esm/nls.messages.ru.js +2 -2
  11. package/esm/nls.messages.zh-cn.js +2 -2
  12. package/esm/nls.messages.zh-tw.js +2 -2
  13. package/esm/nls.metadata.json +3 -1
  14. package/esm/vs/base/browser/markdownRenderer.js.map +1 -1
  15. package/esm/vs/base/browser/ui/codicons/codicon/codicon.ttf +0 -0
  16. package/esm/vs/base/browser/ui/toolbar/toolbar.js +4 -1
  17. package/esm/vs/base/browser/ui/toolbar/toolbar.js.map +1 -1
  18. package/esm/vs/base/common/codiconsLibrary.js +9 -1
  19. package/esm/vs/base/common/codiconsLibrary.js.map +1 -1
  20. package/esm/vs/editor/browser/services/hoverService/hoverWidget.js +5 -8
  21. package/esm/vs/editor/browser/services/hoverService/hoverWidget.js.map +1 -1
  22. package/esm/vs/editor/browser/widget/markdownRenderer/browser/markdownRenderer.js +36 -31
  23. package/esm/vs/editor/browser/widget/markdownRenderer/browser/markdownRenderer.js.map +1 -1
  24. package/esm/vs/editor/common/core/text/abstractText.js +5 -1
  25. package/esm/vs/editor/common/core/text/abstractText.js.map +1 -1
  26. package/esm/vs/editor/common/model/tokens/treeSitter/tokenStore.js +2 -1
  27. package/esm/vs/editor/common/model/tokens/treeSitter/tokenStore.js.map +1 -1
  28. package/esm/vs/editor/contrib/find/browser/findController.js +54 -61
  29. package/esm/vs/editor/contrib/find/browser/findController.js.map +1 -1
  30. package/esm/vs/editor/contrib/hover/browser/glyphHoverWidget.js +5 -8
  31. package/esm/vs/editor/contrib/hover/browser/glyphHoverWidget.js.map +1 -1
  32. package/esm/vs/editor/contrib/hover/browser/markdownHoverParticipant.js +18 -23
  33. package/esm/vs/editor/contrib/hover/browser/markdownHoverParticipant.js.map +1 -1
  34. package/esm/vs/editor/contrib/inPlaceReplace/browser/inPlaceReplace.js +2 -2
  35. package/esm/vs/editor/contrib/inlayHints/browser/inlayHintsHover.js +10 -12
  36. package/esm/vs/editor/contrib/inlayHints/browser/inlayHintsHover.js.map +1 -1
  37. package/esm/vs/editor/contrib/inlineCompletions/browser/hintsWidget/hoverParticipant.js +9 -13
  38. package/esm/vs/editor/contrib/inlineCompletions/browser/hintsWidget/hoverParticipant.js.map +1 -1
  39. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorMenu.js +8 -1
  40. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/components/gutterIndicatorMenu.js.map +1 -1
  41. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/inlineEditsModel.js +1 -1
  42. package/esm/vs/editor/contrib/inlineCompletions/browser/view/inlineEdits/theme.js +20 -20
  43. package/esm/vs/editor/contrib/insertFinalNewLine/browser/insertFinalNewLine.js +1 -1
  44. package/esm/vs/editor/contrib/lineSelection/browser/lineSelection.js +1 -1
  45. package/esm/vs/editor/contrib/linesOperations/browser/linesOperations.js +31 -31
  46. package/esm/vs/editor/contrib/linkedEditing/browser/linkedEditing.js +2 -2
  47. package/esm/vs/editor/contrib/links/browser/links.js +10 -10
  48. package/esm/vs/editor/contrib/message/browser/messageController.js +1 -1
  49. package/esm/vs/editor/contrib/multicursor/browser/multicursor.js +22 -22
  50. package/esm/vs/editor/contrib/parameterHints/browser/parameterHints.js +1 -1
  51. package/esm/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.js +10 -12
  52. package/esm/vs/editor/contrib/parameterHints/browser/parameterHintsWidget.js.map +1 -1
  53. package/esm/vs/editor/contrib/peekView/browser/peekView.js +18 -18
  54. package/esm/vs/editor/contrib/placeholderText/browser/placeholderText.contribution.js +1 -1
  55. package/esm/vs/editor/contrib/quickAccess/browser/gotoLineQuickAccess.js +5 -5
  56. package/esm/vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess.js +32 -32
  57. package/esm/vs/editor/contrib/readOnlyMessage/browser/contribution.js +2 -2
  58. package/esm/vs/editor/contrib/rename/browser/rename.js +11 -11
  59. package/esm/vs/editor/contrib/rename/browser/renameWidget.js +7 -7
  60. package/esm/vs/editor/contrib/rename/browser/renameWidget.js.map +1 -1
  61. package/esm/vs/editor/contrib/smartSelect/browser/smartSelect.js +4 -4
  62. package/esm/vs/editor/contrib/snippet/browser/snippetController2.js +4 -4
  63. package/esm/vs/editor/contrib/snippet/browser/snippetVariables.js +4 -4
  64. package/esm/vs/editor/contrib/stickyScroll/browser/stickyScrollActions.js +11 -11
  65. package/esm/vs/editor/contrib/suggest/browser/suggest.js +8 -8
  66. package/esm/vs/editor/contrib/suggest/browser/suggestController.js +10 -10
  67. package/esm/vs/editor/contrib/suggest/browser/suggestWidget.js +18 -24
  68. package/esm/vs/editor/contrib/suggest/browser/suggestWidget.js.map +1 -1
  69. package/esm/vs/editor/contrib/suggest/browser/suggestWidgetDetails.js +15 -18
  70. package/esm/vs/editor/contrib/suggest/browser/suggestWidgetDetails.js.map +1 -1
  71. package/esm/vs/editor/contrib/suggest/browser/suggestWidgetRenderer.js +2 -2
  72. package/esm/vs/editor/contrib/suggest/browser/wordContextKey.js +1 -1
  73. package/esm/vs/editor/contrib/symbolIcons/browser/symbolIcons.js +33 -33
  74. package/esm/vs/editor/contrib/toggleTabFocusMode/browser/toggleTabFocusMode.js +4 -4
  75. package/esm/vs/editor/contrib/tokenization/browser/tokenization.js +1 -1
  76. package/esm/vs/editor/contrib/unicodeHighlighter/browser/bannerController.js +7 -6
  77. package/esm/vs/editor/contrib/unicodeHighlighter/browser/bannerController.js.map +1 -1
  78. package/esm/vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.js +29 -32
  79. package/esm/vs/editor/contrib/unicodeHighlighter/browser/unicodeHighlighter.js.map +1 -1
  80. package/esm/vs/editor/contrib/unusualLineTerminators/browser/unusualLineTerminators.js +5 -5
  81. package/esm/vs/editor/contrib/wordHighlighter/browser/highlightDecorations.js +9 -9
  82. package/esm/vs/editor/contrib/wordHighlighter/browser/wordHighlighter.js +3 -3
  83. package/esm/vs/editor/contrib/wordOperations/browser/wordOperations.js +1 -1
  84. package/esm/vs/platform/accessibilitySignal/browser/accessibilitySignalService.js +62 -62
  85. package/esm/vs/platform/action/common/actionCommonCategories.js +6 -6
  86. package/esm/vs/platform/actionWidget/browser/actionList.js +4 -4
  87. package/esm/vs/platform/actionWidget/browser/actionWidget.js +7 -7
  88. package/esm/vs/platform/actions/browser/menuEntryActionViewItem.js +5 -5
  89. package/esm/vs/platform/actions/browser/toolbar.js +2 -2
  90. package/esm/vs/platform/actions/common/menuService.js +2 -2
  91. package/esm/vs/platform/configuration/common/configurationRegistry.js +10 -10
  92. package/esm/vs/platform/contextkey/browser/contextKeyService.js +1 -1
  93. package/esm/vs/platform/contextkey/common/contextkey.js +9 -9
  94. package/esm/vs/platform/contextkey/common/contextkeys.js +9 -9
  95. package/esm/vs/platform/contextkey/common/scanner.js +5 -5
  96. package/esm/vs/platform/history/browser/contextScopedHistoryWidget.js +1 -1
  97. package/esm/vs/platform/keybinding/common/abstractKeybindingService.js +4 -4
  98. package/esm/vs/platform/list/browser/listService.js +27 -27
  99. package/esm/vs/platform/markers/common/markerService.js +2 -2
  100. package/esm/vs/platform/markers/common/markers.js +6 -6
  101. package/esm/vs/platform/quickinput/browser/commandsQuickAccess.js +7 -7
  102. package/esm/vs/platform/quickinput/browser/helpQuickAccess.js +1 -1
  103. package/esm/vs/platform/quickinput/browser/quickInput.js +10 -10
  104. package/esm/vs/platform/quickinput/browser/quickInputActions.js +5 -5
  105. package/esm/vs/platform/quickinput/browser/quickInputController.js +6 -6
  106. package/esm/vs/platform/quickinput/browser/quickInputList.js +1 -1
  107. package/esm/vs/platform/quickinput/browser/quickInputUtils.js +1 -1
  108. package/esm/vs/platform/quickinput/browser/tree/quickInputTreeAccessibilityProvider.js +1 -1
  109. package/esm/vs/platform/theme/common/colorUtils.js +2 -2
  110. package/esm/vs/platform/theme/common/colors/baseColors.js +17 -17
  111. package/esm/vs/platform/theme/common/colors/chartsColors.js +8 -8
  112. package/esm/vs/platform/theme/common/colors/editorColors.js +95 -95
  113. package/esm/vs/platform/theme/common/colors/inputColors.js +47 -47
  114. package/esm/vs/platform/theme/common/colors/listColors.js +36 -36
  115. package/esm/vs/platform/theme/common/colors/menuColors.js +7 -7
  116. package/esm/vs/platform/theme/common/colors/minimapColors.js +11 -11
  117. package/esm/vs/platform/theme/common/colors/miscColors.js +15 -15
  118. package/esm/vs/platform/theme/common/colors/quickpickColors.js +9 -9
  119. package/esm/vs/platform/theme/common/colors/searchColors.js +3 -3
  120. package/esm/vs/platform/theme/common/iconRegistry.js +6 -6
  121. package/esm/vs/platform/undoRedo/common/undoRedoService.js +20 -20
  122. package/esm/vs/platform/workspace/common/workspace.js +1 -1
  123. package/package.json +2 -2
  124. package/version.txt +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/editor/common/model/tokens/treeSitter/tokenStore.ts","vs/editor/common/model/tokens/treeSitter/tokenStore.ts"],"names":[],"mappings":"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","file":"tokenStore.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 { IDisposable } from '../../../../../base/common/lifecycle.js';\nimport { ITextModel } from '../../../model.js';\n\nclass ListNode implements IDisposable {\n\tparent?: ListNode;\n\tprivate readonly _children: Node[] = [];\n\tget children(): ReadonlyArray<Node> { return this._children; }\n\n\tprivate _length: number = 0;\n\tget length(): number { return this._length; }\n\n\tconstructor(public readonly height: number) { }\n\n\tstatic create(node1: Node, node2: Node) {\n\t\tconst list = new ListNode(node1.height + 1);\n\t\tlist.appendChild(node1);\n\t\tlist.appendChild(node2);\n\t\treturn list;\n\t}\n\n\tcanAppendChild(): boolean {\n\t\treturn this._children.length < 3;\n\t}\n\n\tappendChild(node: Node) {\n\t\tif (!this.canAppendChild()) {\n\t\t\tthrow new Error('Cannot insert more than 3 children in a ListNode');\n\t\t}\n\t\tthis._children.push(node);\n\n\t\tthis._length += node.length;\n\t\tthis._updateParentLength(node.length);\n\t\tif (!isLeaf(node)) {\n\t\t\tnode.parent = this;\n\t\t}\n\t}\n\n\tprivate _updateParentLength(delta: number) {\n\t\tlet updateParent = this.parent;\n\t\twhile (updateParent) {\n\t\t\tupdateParent._length += delta;\n\t\t\tupdateParent = updateParent.parent;\n\t\t}\n\t}\n\n\tunappendChild(): Node {\n\t\tconst child = this._children.pop()!;\n\t\tthis._length -= child.length;\n\t\tthis._updateParentLength(-child.length);\n\t\treturn child;\n\t}\n\n\tprependChild(node: Node) {\n\t\tif (this._children.length >= 3) {\n\t\t\tthrow new Error('Cannot prepend more than 3 children in a ListNode');\n\t\t}\n\t\tthis._children.unshift(node);\n\n\t\tthis._length += node.length;\n\t\tthis._updateParentLength(node.length);\n\t\tif (!isLeaf(node)) {\n\t\t\tnode.parent = this;\n\t\t}\n\t}\n\n\tunprependChild(): Node {\n\t\tconst child = this._children.shift()!;\n\t\tthis._length -= child.length;\n\t\tthis._updateParentLength(-child.length);\n\t\treturn child;\n\t}\n\n\tlastChild(): Node {\n\t\treturn this._children[this._children.length - 1];\n\t}\n\n\tdispose() {\n\t\tthis._children.splice(0, this._children.length);\n\t}\n}\n\nexport enum TokenQuality {\n\tNone = 0,\n\tViewportGuess = 1,\n\tEditGuess = 2,\n\tAccurate = 3\n}\n\ntype Node = ListNode | LeafNode;\n\ninterface LeafNode {\n\treadonly length: number;\n\ttoken: number;\n\ttokenQuality: TokenQuality;\n\theight: 0;\n}\n\nexport interface TokenUpdate {\n\treadonly startOffsetInclusive: number;\n\treadonly length: number;\n\treadonly token: number;\n}\n\nfunction isLeaf(node: Node): node is LeafNode {\n\treturn (node as LeafNode).token !== undefined;\n}\n\n// Heavily inspired by https://github.com/microsoft/vscode/blob/4eb2658d592cb6114a7a393655574176cc790c5b/src/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/concat23Trees.ts#L108-L109\nfunction append(node: Node, nodeToAppend: Node): Node {\n\tlet curNode = node;\n\tconst parents: ListNode[] = [];\n\tlet nodeToAppendOfCorrectHeight: Node | undefined;\n\twhile (true) {\n\t\tif (nodeToAppend.height === curNode.height) {\n\t\t\tnodeToAppendOfCorrectHeight = nodeToAppend;\n\t\t\tbreak;\n\t\t}\n\n\t\tif (isLeaf(curNode)) {\n\t\t\tthrow new Error('unexpected');\n\t\t}\n\t\tparents.push(curNode);\n\t\tcurNode = curNode.lastChild();\n\t}\n\tfor (let i = parents.length - 1; i >= 0; i--) {\n\t\tconst parent = parents[i];\n\t\tif (nodeToAppendOfCorrectHeight) {\n\t\t\t// Can we take the element?\n\t\t\tif (parent.children.length >= 3) {\n\t\t\t\t// we need to split to maintain (2,3)-tree property.\n\t\t\t\t// Send the third element + the new element to the parent.\n\t\t\t\tconst newList = ListNode.create(parent.unappendChild()!, nodeToAppendOfCorrectHeight);\n\t\t\t\tnodeToAppendOfCorrectHeight = newList;\n\t\t\t} else {\n\t\t\t\tparent.appendChild(nodeToAppendOfCorrectHeight);\n\t\t\t\tnodeToAppendOfCorrectHeight = undefined;\n\t\t\t}\n\t\t}\n\t}\n\tif (nodeToAppendOfCorrectHeight) {\n\t\tconst newList = new ListNode(nodeToAppendOfCorrectHeight.height + 1);\n\t\tnewList.appendChild(node);\n\t\tnewList.appendChild(nodeToAppendOfCorrectHeight);\n\t\treturn newList;\n\t} else {\n\t\treturn node;\n\t}\n}\n\nfunction prepend(list: Node, nodeToAppend: Node): Node {\n\tlet curNode = list;\n\tconst parents: ListNode[] = [];\n\twhile (nodeToAppend.height !== curNode.height) {\n\t\tif (isLeaf(curNode)) {\n\t\t\tthrow new Error('unexpected');\n\t\t}\n\t\tparents.push(curNode);\n\t\t// assert 2 <= curNode.childrenFast.length <= 3\n\t\tcurNode = curNode.children[0] as ListNode;\n\t}\n\tlet nodeToPrependOfCorrectHeight: Node | undefined = nodeToAppend;\n\t// assert nodeToAppendOfCorrectHeight!.listHeight === curNode.listHeight\n\tfor (let i = parents.length - 1; i >= 0; i--) {\n\t\tconst parent = parents[i];\n\t\tif (nodeToPrependOfCorrectHeight) {\n\t\t\t// Can we take the element?\n\t\t\tif (parent.children.length >= 3) {\n\t\t\t\t// we need to split to maintain (2,3)-tree property.\n\t\t\t\t// Send the third element + the new element to the parent.\n\t\t\t\tnodeToPrependOfCorrectHeight = ListNode.create(nodeToPrependOfCorrectHeight, parent.unprependChild());\n\t\t\t} else {\n\t\t\t\tparent.prependChild(nodeToPrependOfCorrectHeight);\n\t\t\t\tnodeToPrependOfCorrectHeight = undefined;\n\t\t\t}\n\t\t}\n\t}\n\tif (nodeToPrependOfCorrectHeight) {\n\t\treturn ListNode.create(nodeToPrependOfCorrectHeight, list);\n\t} else {\n\t\treturn list;\n\t}\n}\n\nfunction concat(node1: Node, node2: Node): Node {\n\tif (node1.height === node2.height) {\n\t\treturn ListNode.create(node1, node2);\n\t}\n\telse if (node1.height > node2.height) {\n\t\t// node1 is the tree we want to insert into\n\t\treturn append(node1, node2);\n\t} else {\n\t\treturn prepend(node2, node1);\n\t}\n}\n\nexport class TokenStore implements IDisposable {\n\tprivate _root: Node;\n\n\tconstructor(private readonly _textModel: ITextModel) {\n\t\tthis._root = this.createEmptyRoot();\n\t}\n\n\tprivate createEmptyRoot(): Node {\n\t\treturn {\n\t\t\tlength: this._textModel.getValueLength(),\n\t\t\ttoken: 0,\n\t\t\theight: 0,\n\t\t\ttokenQuality: TokenQuality.None\n\t\t};\n\t}\n\n\t/**\n\t *\n\t * @param update all the tokens for the document in sequence\n\t */\n\tbuildStore(tokens: TokenUpdate[], tokenQuality: TokenQuality): void {\n\t\tthis._root = this.createFromUpdates(tokens, tokenQuality);\n\t}\n\n\tprivate createFromUpdates(tokens: TokenUpdate[], tokenQuality: TokenQuality): Node {\n\t\tif (tokens.length === 0) {\n\t\t\treturn this.createEmptyRoot();\n\t\t}\n\t\tlet newRoot: Node = {\n\t\t\tlength: tokens[0].length,\n\t\t\ttoken: tokens[0].token,\n\t\t\theight: 0,\n\t\t\ttokenQuality\n\t\t};\n\t\tfor (let j = 1; j < tokens.length; j++) {\n\t\t\tnewRoot = append(newRoot, { length: tokens[j].length, token: tokens[j].token, height: 0, tokenQuality });\n\t\t}\n\t\treturn newRoot;\n\t}\n\n\t/**\n\t *\n\t * @param tokens tokens are in sequence in the document.\n\t */\n\tupdate(length: number, tokens: TokenUpdate[], tokenQuality: TokenQuality) {\n\t\tif (tokens.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tthis.replace(length, tokens[0].startOffsetInclusive, tokens, tokenQuality);\n\t}\n\n\tdelete(length: number, startOffset: number) {\n\t\tthis.replace(length, startOffset, [], TokenQuality.EditGuess);\n\t}\n\n\t/**\n\t *\n\t * @param tokens tokens are in sequence in the document.\n\t */\n\tprivate replace(length: number, updateOffsetStart: number, tokens: TokenUpdate[], tokenQuality: TokenQuality) {\n\t\tconst firstUnchangedOffsetAfterUpdate = updateOffsetStart + length;\n\t\t// Find the last unchanged node preceding the update\n\t\tconst precedingNodes: Node[] = [];\n\t\t// Find the first unchanged node after the update\n\t\tconst postcedingNodes: Node[] = [];\n\t\tconst stack: { node: Node; offset: number }[] = [{ node: this._root, offset: 0 }];\n\n\t\twhile (stack.length > 0) {\n\t\t\tconst node = stack.pop()!;\n\t\t\tconst currentOffset = node.offset;\n\n\t\t\tif (currentOffset < updateOffsetStart && currentOffset + node.node.length <= updateOffsetStart) {\n\t\t\t\tif (!isLeaf(node.node)) {\n\t\t\t\t\tnode.node.parent = undefined;\n\t\t\t\t}\n\t\t\t\tprecedingNodes.push(node.node);\n\t\t\t\tcontinue;\n\t\t\t} else if (isLeaf(node.node) && (currentOffset < updateOffsetStart)) {\n\t\t\t\t// We have a partial preceding node\n\t\t\t\tprecedingNodes.push({ length: updateOffsetStart - currentOffset, token: node.node.token, height: 0, tokenQuality: node.node.tokenQuality });\n\t\t\t\t// Node could also be postceeding, so don't continue\n\t\t\t}\n\n\t\t\tif ((updateOffsetStart <= currentOffset) && (currentOffset + node.node.length <= firstUnchangedOffsetAfterUpdate)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (currentOffset >= firstUnchangedOffsetAfterUpdate) {\n\t\t\t\tif (!isLeaf(node.node)) {\n\t\t\t\t\tnode.node.parent = undefined;\n\t\t\t\t}\n\t\t\t\tpostcedingNodes.push(node.node);\n\t\t\t\tcontinue;\n\t\t\t} else if (isLeaf(node.node) && (currentOffset + node.node.length > firstUnchangedOffsetAfterUpdate)) {\n\t\t\t\t// we have a partial postceeding node\n\t\t\t\tpostcedingNodes.push({ length: currentOffset + node.node.length - firstUnchangedOffsetAfterUpdate, token: node.node.token, height: 0, tokenQuality: node.node.tokenQuality });\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!isLeaf(node.node)) {\n\t\t\t\t// Push children in reverse order to process them left-to-right when popping\n\t\t\t\tlet childOffset = currentOffset + node.node.length;\n\t\t\t\tfor (let i = node.node.children.length - 1; i >= 0; i--) {\n\t\t\t\t\tchildOffset -= node.node.children[i].length;\n\t\t\t\t\tstack.push({ node: node.node.children[i], offset: childOffset });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet allNodes: Node[];\n\t\tif (tokens.length > 0) {\n\t\t\tallNodes = precedingNodes.concat(this.createFromUpdates(tokens, tokenQuality), postcedingNodes);\n\t\t} else {\n\t\t\tallNodes = precedingNodes.concat(postcedingNodes);\n\t\t}\n\t\tlet newRoot: Node = allNodes[0];\n\t\tfor (let i = 1; i < allNodes.length; i++) {\n\t\t\tnewRoot = concat(newRoot, allNodes[i]);\n\t\t}\n\n\t\tthis._root = newRoot ?? this.createEmptyRoot();\n\t}\n\n\t/**\n\t *\n\t * @param startOffsetInclusive\n\t * @param endOffsetExclusive\n\t * @param visitor Return true from visitor to exit early\n\t * @returns\n\t */\n\tprivate traverseInOrderInRange(startOffsetInclusive: number, endOffsetExclusive: number, visitor: (node: Node, offset: number) => boolean): void {\n\t\tconst stack: { node: Node; offset: number }[] = [{ node: this._root, offset: 0 }];\n\n\t\twhile (stack.length > 0) {\n\t\t\tconst { node, offset } = stack.pop()!;\n\t\t\tconst nodeEnd = offset + node.length;\n\n\t\t\t// Skip nodes that are completely before or after the range\n\t\t\tif (nodeEnd <= startOffsetInclusive || offset >= endOffsetExclusive) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (visitor(node, offset)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!isLeaf(node)) {\n\t\t\t\t// Push children in reverse order to process them left-to-right when popping\n\t\t\t\tlet childOffset = offset + node.length;\n\t\t\t\tfor (let i = node.children.length - 1; i >= 0; i--) {\n\t\t\t\t\tchildOffset -= node.children[i].length;\n\t\t\t\t\tstack.push({ node: node.children[i], offset: childOffset });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tgetTokenAt(offset: number): TokenUpdate | undefined {\n\t\tlet result: TokenUpdate | undefined;\n\t\tthis.traverseInOrderInRange(offset, this._root.length, (node, offset) => {\n\t\t\tif (isLeaf(node)) {\n\t\t\t\tresult = { token: node.token, startOffsetInclusive: offset, length: node.length };\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\t\treturn result;\n\t}\n\n\tgetTokensInRange(startOffsetInclusive: number, endOffsetExclusive: number): TokenUpdate[] {\n\t\tconst result: { token: number; startOffsetInclusive: number; length: number }[] = [];\n\t\tthis.traverseInOrderInRange(startOffsetInclusive, endOffsetExclusive, (node, offset) => {\n\t\t\tif (isLeaf(node)) {\n\t\t\t\tlet clippedLength = node.length;\n\t\t\t\tlet clippedOffset = offset;\n\t\t\t\tif ((offset < startOffsetInclusive) && (offset + node.length > endOffsetExclusive)) {\n\t\t\t\t\tclippedOffset = startOffsetInclusive;\n\t\t\t\t\tclippedLength = endOffsetExclusive - startOffsetInclusive;\n\t\t\t\t} else if (offset < startOffsetInclusive) {\n\t\t\t\t\tclippedLength -= (startOffsetInclusive - offset);\n\t\t\t\t\tclippedOffset = startOffsetInclusive;\n\t\t\t\t} else if (offset + node.length > endOffsetExclusive) {\n\t\t\t\t\tclippedLength -= (offset + node.length - endOffsetExclusive);\n\t\t\t\t}\n\t\t\t\tresult.push({ token: node.token, startOffsetInclusive: clippedOffset, length: clippedLength });\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\t\treturn result;\n\t}\n\n\tmarkForRefresh(startOffsetInclusive: number, endOffsetExclusive: number): void {\n\t\tthis.traverseInOrderInRange(startOffsetInclusive, endOffsetExclusive, (node) => {\n\t\t\tif (isLeaf(node)) {\n\t\t\t\tnode.tokenQuality = TokenQuality.None;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\t}\n\n\trangeHasTokens(startOffsetInclusive: number, endOffsetExclusive: number, minimumTokenQuality: TokenQuality): boolean {\n\t\tlet hasAny = true;\n\t\tthis.traverseInOrderInRange(startOffsetInclusive, endOffsetExclusive, (node) => {\n\t\t\tif (isLeaf(node) && (node.tokenQuality < minimumTokenQuality)) {\n\t\t\t\thasAny = false;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\t\treturn hasAny;\n\t}\n\n\trangeNeedsRefresh(startOffsetInclusive: number, endOffsetExclusive: number): boolean {\n\t\tlet needsRefresh = false;\n\t\tthis.traverseInOrderInRange(startOffsetInclusive, endOffsetExclusive, (node) => {\n\t\t\tif (isLeaf(node) && (node.tokenQuality !== TokenQuality.Accurate)) {\n\t\t\t\tneedsRefresh = true;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\t\treturn needsRefresh;\n\t}\n\n\tgetNeedsRefresh(): { startOffset: number; endOffset: number }[] {\n\t\tconst result: { startOffset: number; endOffset: number }[] = [];\n\n\t\tthis.traverseInOrderInRange(0, this._textModel.getValueLength(), (node, offset) => {\n\t\t\tif (isLeaf(node) && (node.tokenQuality !== TokenQuality.Accurate)) {\n\t\t\t\tif ((result.length > 0) && (result[result.length - 1].endOffset === offset)) {\n\t\t\t\t\tresult[result.length - 1].endOffset += node.length;\n\t\t\t\t} else {\n\t\t\t\t\tresult.push({ startOffset: offset, endOffset: offset + node.length });\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\t\treturn result;\n\t}\n\n\tdispose(): void {\n\t\tconst stack: Array<[Node, boolean]> = [[this._root, false]];\n\t\twhile (stack.length > 0) {\n\t\t\tconst [node, visited] = stack.pop()!;\n\t\t\tif (isLeaf(node)) {\n\t\t\t\t// leaf node does not need to be disposed\n\t\t\t} else if (!visited) {\n\t\t\t\tstack.push([node, true]);\n\t\t\t\tfor (let i = node.children.length - 1; i >= 0; i--) {\n\t\t\t\t\tstack.push([node.children[i], false]);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnode.dispose();\n\t\t\t\tnode.parent = undefined;\n\t\t\t}\n\t\t}\n\t\tthis._root = undefined!;\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 { IDisposable } from '../../../../../base/common/lifecycle.js';\nimport { ITextModel } from '../../../model.js';\n\nclass ListNode implements IDisposable {\n\tparent?: ListNode;\n\tprivate readonly _children: Node[] = [];\n\tget children(): ReadonlyArray<Node> { return this._children; }\n\n\tprivate _length: number = 0;\n\tget length(): number { return this._length; }\n\n\tconstructor(public readonly height: number) { }\n\n\tstatic create(node1: Node, node2: Node) {\n\t\tconst list = new ListNode(node1.height + 1);\n\t\tlist.appendChild(node1);\n\t\tlist.appendChild(node2);\n\t\treturn list;\n\t}\n\n\tcanAppendChild(): boolean {\n\t\treturn this._children.length < 3;\n\t}\n\n\tappendChild(node: Node) {\n\t\tif (!this.canAppendChild()) {\n\t\t\tthrow new Error('Cannot insert more than 3 children in a ListNode');\n\t\t}\n\t\tthis._children.push(node);\n\n\t\tthis._length += node.length;\n\t\tthis._updateParentLength(node.length);\n\t\tif (!isLeaf(node)) {\n\t\t\tnode.parent = this;\n\t\t}\n\t}\n\n\tprivate _updateParentLength(delta: number) {\n\t\tlet updateParent = this.parent;\n\t\twhile (updateParent) {\n\t\t\tupdateParent._length += delta;\n\t\t\tupdateParent = updateParent.parent;\n\t\t}\n\t}\n\n\tunappendChild(): Node {\n\t\tconst child = this._children.pop()!;\n\t\tthis._length -= child.length;\n\t\tthis._updateParentLength(-child.length);\n\t\treturn child;\n\t}\n\n\tprependChild(node: Node) {\n\t\tif (this._children.length >= 3) {\n\t\t\tthrow new Error('Cannot prepend more than 3 children in a ListNode');\n\t\t}\n\t\tthis._children.unshift(node);\n\n\t\tthis._length += node.length;\n\t\tthis._updateParentLength(node.length);\n\t\tif (!isLeaf(node)) {\n\t\t\tnode.parent = this;\n\t\t}\n\t}\n\n\tunprependChild(): Node {\n\t\tconst child = this._children.shift()!;\n\t\tthis._length -= child.length;\n\t\tthis._updateParentLength(-child.length);\n\t\treturn child;\n\t}\n\n\tlastChild(): Node {\n\t\treturn this._children[this._children.length - 1];\n\t}\n\n\tdispose() {\n\t\tthis._children.splice(0, this._children.length);\n\t}\n}\n\nexport enum TokenQuality {\n\tNone = 0,\n\tViewportGuess = 1,\n\tEditGuess = 2,\n\tAccurate = 3\n}\n\ntype Node = ListNode | LeafNode;\n\ninterface LeafNode {\n\treadonly length: number;\n\ttoken: number;\n\ttokenQuality: TokenQuality;\n\theight: 0;\n}\n\nexport interface TokenUpdate {\n\treadonly startOffsetInclusive: number;\n\treadonly length: number;\n\treadonly token: number;\n}\n\nfunction isLeaf(node: Node): node is LeafNode {\n\treturn (node as LeafNode).token !== undefined;\n}\n\n// Heavily inspired by https://github.com/microsoft/vscode/blob/4eb2658d592cb6114a7a393655574176cc790c5b/src/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/concat23Trees.ts#L108-L109\nfunction append(node: Node, nodeToAppend: Node): Node {\n\tlet curNode = node;\n\tconst parents: ListNode[] = [];\n\tlet nodeToAppendOfCorrectHeight: Node | undefined;\n\twhile (true) {\n\t\tif (nodeToAppend.height === curNode.height) {\n\t\t\tnodeToAppendOfCorrectHeight = nodeToAppend;\n\t\t\tbreak;\n\t\t}\n\n\t\tif (isLeaf(curNode)) {\n\t\t\tthrow new Error('unexpected');\n\t\t}\n\t\tparents.push(curNode);\n\t\tcurNode = curNode.lastChild();\n\t}\n\tfor (let i = parents.length - 1; i >= 0; i--) {\n\t\tconst parent = parents[i];\n\t\tif (nodeToAppendOfCorrectHeight) {\n\t\t\t// Can we take the element?\n\t\t\tif (parent.children.length >= 3) {\n\t\t\t\t// we need to split to maintain (2,3)-tree property.\n\t\t\t\t// Send the third element + the new element to the parent.\n\t\t\t\tconst newList = ListNode.create(parent.unappendChild()!, nodeToAppendOfCorrectHeight);\n\t\t\t\tnodeToAppendOfCorrectHeight = newList;\n\t\t\t} else {\n\t\t\t\tparent.appendChild(nodeToAppendOfCorrectHeight);\n\t\t\t\tnodeToAppendOfCorrectHeight = undefined;\n\t\t\t}\n\t\t}\n\t}\n\tif (nodeToAppendOfCorrectHeight) {\n\t\tconst newList = new ListNode(nodeToAppendOfCorrectHeight.height + 1);\n\t\tnewList.appendChild(node);\n\t\tnewList.appendChild(nodeToAppendOfCorrectHeight);\n\t\treturn newList;\n\t} else {\n\t\treturn node;\n\t}\n}\n\nfunction prepend(list: Node, nodeToAppend: Node): Node {\n\tlet curNode = list;\n\tconst parents: ListNode[] = [];\n\twhile (nodeToAppend.height !== curNode.height) {\n\t\tif (isLeaf(curNode)) {\n\t\t\tthrow new Error('unexpected');\n\t\t}\n\t\tparents.push(curNode);\n\t\t// assert 2 <= curNode.childrenFast.length <= 3\n\t\tcurNode = curNode.children[0] as ListNode;\n\t}\n\tlet nodeToPrependOfCorrectHeight: Node | undefined = nodeToAppend;\n\t// assert nodeToAppendOfCorrectHeight!.listHeight === curNode.listHeight\n\tfor (let i = parents.length - 1; i >= 0; i--) {\n\t\tconst parent = parents[i];\n\t\tif (nodeToPrependOfCorrectHeight) {\n\t\t\t// Can we take the element?\n\t\t\tif (parent.children.length >= 3) {\n\t\t\t\t// we need to split to maintain (2,3)-tree property.\n\t\t\t\t// Send the third element + the new element to the parent.\n\t\t\t\tnodeToPrependOfCorrectHeight = ListNode.create(nodeToPrependOfCorrectHeight, parent.unprependChild());\n\t\t\t} else {\n\t\t\t\tparent.prependChild(nodeToPrependOfCorrectHeight);\n\t\t\t\tnodeToPrependOfCorrectHeight = undefined;\n\t\t\t}\n\t\t}\n\t}\n\tif (nodeToPrependOfCorrectHeight) {\n\t\treturn ListNode.create(nodeToPrependOfCorrectHeight, list);\n\t} else {\n\t\treturn list;\n\t}\n}\n\nfunction concat(node1: Node, node2: Node): Node {\n\tif (node1.height === node2.height) {\n\t\treturn ListNode.create(node1, node2);\n\t}\n\telse if (node1.height > node2.height) {\n\t\t// node1 is the tree we want to insert into\n\t\treturn append(node1, node2);\n\t} else {\n\t\treturn prepend(node2, node1);\n\t}\n}\n\nexport class TokenStore implements IDisposable {\n\tprivate _root: Node;\n\n\tconstructor(private readonly _textModel: ITextModel) {\n\t\tthis._root = this.createEmptyRoot();\n\t}\n\n\tprivate createEmptyRoot(): Node {\n\t\treturn {\n\t\t\tlength: this._textModel.getValueLength(),\n\t\t\ttoken: 0,\n\t\t\theight: 0,\n\t\t\ttokenQuality: TokenQuality.None\n\t\t};\n\t}\n\n\t/**\n\t *\n\t * @param update all the tokens for the document in sequence\n\t */\n\tbuildStore(tokens: TokenUpdate[], tokenQuality: TokenQuality): void {\n\t\tthis._root = this.createFromUpdates(tokens, tokenQuality);\n\t}\n\n\tprivate createFromUpdates(tokens: TokenUpdate[], tokenQuality: TokenQuality): Node {\n\t\tif (tokens.length === 0) {\n\t\t\treturn this.createEmptyRoot();\n\t\t}\n\t\tlet newRoot: Node = {\n\t\t\tlength: tokens[0].length,\n\t\t\ttoken: tokens[0].token,\n\t\t\theight: 0,\n\t\t\ttokenQuality\n\t\t};\n\t\tfor (let j = 1; j < tokens.length; j++) {\n\t\t\tnewRoot = append(newRoot, { length: tokens[j].length, token: tokens[j].token, height: 0, tokenQuality });\n\t\t}\n\t\treturn newRoot;\n\t}\n\n\t/**\n\t *\n\t * @param tokens tokens are in sequence in the document.\n\t */\n\tupdate(length: number, tokens: TokenUpdate[], tokenQuality: TokenQuality) {\n\t\tif (tokens.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tthis.replace(length, tokens[0].startOffsetInclusive, tokens, tokenQuality);\n\t}\n\n\tdelete(length: number, startOffset: number) {\n\t\tthis.replace(length, startOffset, [], TokenQuality.EditGuess);\n\t}\n\n\t/**\n\t *\n\t * @param tokens tokens are in sequence in the document.\n\t */\n\tprivate replace(length: number, updateOffsetStart: number, tokens: TokenUpdate[], tokenQuality: TokenQuality) {\n\t\tconst firstUnchangedOffsetAfterUpdate = updateOffsetStart + length;\n\t\t// Find the last unchanged node preceding the update\n\t\tconst precedingNodes: Node[] = [];\n\t\t// Find the first unchanged node after the update\n\t\tconst postcedingNodes: Node[] = [];\n\t\tconst stack: { node: Node; offset: number }[] = [{ node: this._root, offset: 0 }];\n\n\t\twhile (stack.length > 0) {\n\t\t\tconst node = stack.pop()!;\n\t\t\tconst currentOffset = node.offset;\n\n\t\t\tif (currentOffset < updateOffsetStart && currentOffset + node.node.length <= updateOffsetStart) {\n\t\t\t\tif (!isLeaf(node.node)) {\n\t\t\t\t\tnode.node.parent = undefined;\n\t\t\t\t}\n\t\t\t\tprecedingNodes.push(node.node);\n\t\t\t\tcontinue;\n\t\t\t} else if (isLeaf(node.node) && (currentOffset < updateOffsetStart)) {\n\t\t\t\t// We have a partial preceding node\n\t\t\t\tprecedingNodes.push({ length: updateOffsetStart - currentOffset, token: node.node.token, height: 0, tokenQuality: node.node.tokenQuality });\n\t\t\t\t// Node could also be postceeding, so don't continue\n\t\t\t}\n\n\t\t\tif ((updateOffsetStart <= currentOffset) && (currentOffset + node.node.length <= firstUnchangedOffsetAfterUpdate)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (currentOffset >= firstUnchangedOffsetAfterUpdate) {\n\t\t\t\tif (!isLeaf(node.node)) {\n\t\t\t\t\tnode.node.parent = undefined;\n\t\t\t\t}\n\t\t\t\tpostcedingNodes.push(node.node);\n\t\t\t\tcontinue;\n\t\t\t} else if (isLeaf(node.node) && (currentOffset + node.node.length > firstUnchangedOffsetAfterUpdate)) {\n\t\t\t\t// we have a partial postceeding node\n\t\t\t\tpostcedingNodes.push({ length: currentOffset + node.node.length - firstUnchangedOffsetAfterUpdate, token: node.node.token, height: 0, tokenQuality: node.node.tokenQuality });\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!isLeaf(node.node)) {\n\t\t\t\t// Push children in reverse order to process them left-to-right when popping\n\t\t\t\tlet childOffset = currentOffset + node.node.length;\n\t\t\t\tfor (let i = node.node.children.length - 1; i >= 0; i--) {\n\t\t\t\t\tchildOffset -= node.node.children[i].length;\n\t\t\t\t\tstack.push({ node: node.node.children[i], offset: childOffset });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet allNodes: Node[];\n\t\tif (tokens.length > 0) {\n\t\t\tallNodes = precedingNodes.concat(this.createFromUpdates(tokens, tokenQuality), postcedingNodes);\n\t\t} else {\n\t\t\tallNodes = precedingNodes.concat(postcedingNodes);\n\t\t}\n\t\tlet newRoot: Node = allNodes[0];\n\t\tfor (let i = 1; i < allNodes.length; i++) {\n\t\t\tnewRoot = concat(newRoot, allNodes[i]);\n\t\t}\n\n\t\tthis._root = newRoot ?? this.createEmptyRoot();\n\t}\n\n\t/**\n\t *\n\t * @param startOffsetInclusive\n\t * @param endOffsetExclusive\n\t * @param visitor Return true from visitor to exit early\n\t * @returns\n\t */\n\tprivate traverseInOrderInRange(startOffsetInclusive: number, endOffsetExclusive: number, visitor: (node: Node, offset: number) => boolean): void {\n\t\tconst stack: { node: Node; offset: number }[] = [{ node: this._root, offset: 0 }];\n\n\t\twhile (stack.length > 0) {\n\t\t\tconst { node, offset } = stack.pop()!;\n\t\t\tconst nodeEnd = offset + node.length;\n\n\t\t\t// Skip nodes that are completely before or after the range\n\t\t\tif (nodeEnd <= startOffsetInclusive || offset >= endOffsetExclusive) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (visitor(node, offset)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!isLeaf(node)) {\n\t\t\t\t// Push children in reverse order to process them left-to-right when popping\n\t\t\t\tlet childOffset = offset + node.length;\n\t\t\t\tfor (let i = node.children.length - 1; i >= 0; i--) {\n\t\t\t\t\tchildOffset -= node.children[i].length;\n\t\t\t\t\tstack.push({ node: node.children[i], offset: childOffset });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tgetTokenAt(offset: number): TokenUpdate | undefined {\n\t\tlet result: TokenUpdate | undefined;\n\t\tthis.traverseInOrderInRange(offset, this._root.length, (node, offset) => {\n\t\t\tif (isLeaf(node)) {\n\t\t\t\tresult = { token: node.token, startOffsetInclusive: offset, length: node.length };\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\t\treturn result;\n\t}\n\n\tgetTokensInRange(startOffsetInclusive: number, endOffsetExclusive: number): TokenUpdate[] {\n\t\tconst result: { token: number; startOffsetInclusive: number; length: number }[] = [];\n\t\tthis.traverseInOrderInRange(startOffsetInclusive, endOffsetExclusive, (node, offset) => {\n\t\t\tif (isLeaf(node)) {\n\t\t\t\tlet clippedLength = node.length;\n\t\t\t\tlet clippedOffset = offset;\n\t\t\t\tif ((offset < startOffsetInclusive) && (offset + node.length > endOffsetExclusive)) {\n\t\t\t\t\tclippedOffset = startOffsetInclusive;\n\t\t\t\t\tclippedLength = endOffsetExclusive - startOffsetInclusive;\n\t\t\t\t} else if (offset < startOffsetInclusive) {\n\t\t\t\t\tclippedLength -= (startOffsetInclusive - offset);\n\t\t\t\t\tclippedOffset = startOffsetInclusive;\n\t\t\t\t} else if (offset + node.length > endOffsetExclusive) {\n\t\t\t\t\tclippedLength -= (offset + node.length - endOffsetExclusive);\n\t\t\t\t}\n\t\t\t\tresult.push({ token: node.token, startOffsetInclusive: clippedOffset, length: clippedLength });\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\t\treturn result;\n\t}\n\n\tmarkForRefresh(startOffsetInclusive: number, endOffsetExclusive: number): void {\n\t\tthis.traverseInOrderInRange(startOffsetInclusive, endOffsetExclusive, (node) => {\n\t\t\tif (isLeaf(node)) {\n\t\t\t\tnode.tokenQuality = TokenQuality.None;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\t}\n\n\trangeHasTokens(startOffsetInclusive: number, endOffsetExclusive: number, minimumTokenQuality: TokenQuality): boolean {\n\t\tlet hasAny = true;\n\t\tthis.traverseInOrderInRange(startOffsetInclusive, endOffsetExclusive, (node) => {\n\t\t\tif (isLeaf(node) && (node.tokenQuality < minimumTokenQuality)) {\n\t\t\t\thasAny = false;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\t\treturn hasAny;\n\t}\n\n\trangeNeedsRefresh(startOffsetInclusive: number, endOffsetExclusive: number): boolean {\n\t\tlet needsRefresh = false;\n\t\tthis.traverseInOrderInRange(startOffsetInclusive, endOffsetExclusive, (node) => {\n\t\t\tif (isLeaf(node) && (node.tokenQuality !== TokenQuality.Accurate)) {\n\t\t\t\tneedsRefresh = true;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\t\treturn needsRefresh;\n\t}\n\n\tgetNeedsRefresh(): { startOffset: number; endOffset: number }[] {\n\t\tconst result: { startOffset: number; endOffset: number }[] = [];\n\n\t\tthis.traverseInOrderInRange(0, this._textModel.getValueLength(), (node, offset) => {\n\t\t\tif (isLeaf(node) && (node.tokenQuality !== TokenQuality.Accurate)) {\n\t\t\t\tif ((result.length > 0) && (result[result.length - 1].endOffset === offset)) {\n\t\t\t\t\tresult[result.length - 1].endOffset += node.length;\n\t\t\t\t} else {\n\t\t\t\t\tresult.push({ startOffset: offset, endOffset: offset + node.length });\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\t\treturn result;\n\t}\n\n\tdispose(): void {\n\t\tconst stack: Array<[Node, boolean]> = [[this._root, false]];\n\t\twhile (stack.length > 0) {\n\t\t\tconst [node, visited] = stack.pop()!;\n\t\t\tif (isLeaf(node)) {\n\t\t\t\t// leaf node does not need to be disposed\n\t\t\t} else if (!visited) {\n\t\t\t\tstack.push([node, true]);\n\t\t\t\tfor (let i = node.children.length - 1; i >= 0; i--) {\n\t\t\t\t\tstack.push([node.children[i], false]);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnode.dispose();\n\t\t\t\tnode.parent = undefined;\n\t\t\t}\n\t\t}\n\t\tthis._root = undefined!;\n\t}\n}\n"]}
1
+ {"version":3,"sources":["file:///mnt/vss/_work/1/s/dependencies/vscode/out-editor-src/vs/editor/common/model/tokens/treeSitter/tokenStore.ts","vs/editor/common/model/tokens/treeSitter/tokenStore.ts"],"names":[],"mappings":"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","file":"tokenStore.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 { IDisposable } from '../../../../../base/common/lifecycle.js';\nimport { ITextModel } from '../../../model.js';\n\n// Exported for tests\nexport class ListNode implements IDisposable {\n\tparent?: ListNode;\n\tprivate readonly _children: Node[] = [];\n\tget children(): ReadonlyArray<Node> { return this._children; }\n\n\tprivate _length: number = 0;\n\tget length(): number { return this._length; }\n\n\tconstructor(public readonly height: number) { }\n\n\tstatic create(node1: Node, node2: Node) {\n\t\tconst list = new ListNode(node1.height + 1);\n\t\tlist.appendChild(node1);\n\t\tlist.appendChild(node2);\n\t\treturn list;\n\t}\n\n\tcanAppendChild(): boolean {\n\t\treturn this._children.length < 3;\n\t}\n\n\tappendChild(node: Node) {\n\t\tif (!this.canAppendChild()) {\n\t\t\tthrow new Error('Cannot insert more than 3 children in a ListNode');\n\t\t}\n\t\tthis._children.push(node);\n\n\t\tthis._length += node.length;\n\t\tthis._updateParentLength(node.length);\n\t\tif (!isLeaf(node)) {\n\t\t\tnode.parent = this;\n\t\t}\n\t}\n\n\tprivate _updateParentLength(delta: number) {\n\t\tlet updateParent = this.parent;\n\t\twhile (updateParent) {\n\t\t\tupdateParent._length += delta;\n\t\t\tupdateParent = updateParent.parent;\n\t\t}\n\t}\n\n\tunappendChild(): Node {\n\t\tconst child = this._children.pop()!;\n\t\tthis._length -= child.length;\n\t\tthis._updateParentLength(-child.length);\n\t\treturn child;\n\t}\n\n\tprependChild(node: Node) {\n\t\tif (this._children.length >= 3) {\n\t\t\tthrow new Error('Cannot prepend more than 3 children in a ListNode');\n\t\t}\n\t\tthis._children.unshift(node);\n\n\t\tthis._length += node.length;\n\t\tthis._updateParentLength(node.length);\n\t\tif (!isLeaf(node)) {\n\t\t\tnode.parent = this;\n\t\t}\n\t}\n\n\tunprependChild(): Node {\n\t\tconst child = this._children.shift()!;\n\t\tthis._length -= child.length;\n\t\tthis._updateParentLength(-child.length);\n\t\treturn child;\n\t}\n\n\tlastChild(): Node {\n\t\treturn this._children[this._children.length - 1];\n\t}\n\n\tdispose() {\n\t\tthis._children.splice(0, this._children.length);\n\t}\n}\n\nexport enum TokenQuality {\n\tNone = 0,\n\tViewportGuess = 1,\n\tEditGuess = 2,\n\tAccurate = 3\n}\n\ntype Node = ListNode | LeafNode;\n\n// Exported for tests\nexport interface LeafNode {\n\treadonly length: number;\n\ttoken: number;\n\ttokenQuality: TokenQuality;\n\theight: 0;\n}\n\nexport interface TokenUpdate {\n\treadonly startOffsetInclusive: number;\n\treadonly length: number;\n\treadonly token: number;\n}\n\nfunction isLeaf(node: Node): node is LeafNode {\n\treturn (node as LeafNode).token !== undefined;\n}\n\n// Heavily inspired by https://github.com/microsoft/vscode/blob/4eb2658d592cb6114a7a393655574176cc790c5b/src/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/concat23Trees.ts#L108-L109\nfunction append(node: Node, nodeToAppend: Node): Node {\n\tlet curNode = node;\n\tconst parents: ListNode[] = [];\n\tlet nodeToAppendOfCorrectHeight: Node | undefined;\n\twhile (true) {\n\t\tif (nodeToAppend.height === curNode.height) {\n\t\t\tnodeToAppendOfCorrectHeight = nodeToAppend;\n\t\t\tbreak;\n\t\t}\n\n\t\tif (isLeaf(curNode)) {\n\t\t\tthrow new Error('unexpected');\n\t\t}\n\t\tparents.push(curNode);\n\t\tcurNode = curNode.lastChild();\n\t}\n\tfor (let i = parents.length - 1; i >= 0; i--) {\n\t\tconst parent = parents[i];\n\t\tif (nodeToAppendOfCorrectHeight) {\n\t\t\t// Can we take the element?\n\t\t\tif (parent.children.length >= 3) {\n\t\t\t\t// we need to split to maintain (2,3)-tree property.\n\t\t\t\t// Send the third element + the new element to the parent.\n\t\t\t\tconst newList = ListNode.create(parent.unappendChild()!, nodeToAppendOfCorrectHeight);\n\t\t\t\tnodeToAppendOfCorrectHeight = newList;\n\t\t\t} else {\n\t\t\t\tparent.appendChild(nodeToAppendOfCorrectHeight);\n\t\t\t\tnodeToAppendOfCorrectHeight = undefined;\n\t\t\t}\n\t\t}\n\t}\n\tif (nodeToAppendOfCorrectHeight) {\n\t\tconst newList = new ListNode(nodeToAppendOfCorrectHeight.height + 1);\n\t\tnewList.appendChild(node);\n\t\tnewList.appendChild(nodeToAppendOfCorrectHeight);\n\t\treturn newList;\n\t} else {\n\t\treturn node;\n\t}\n}\n\nfunction prepend(list: Node, nodeToAppend: Node): Node {\n\tlet curNode = list;\n\tconst parents: ListNode[] = [];\n\twhile (nodeToAppend.height !== curNode.height) {\n\t\tif (isLeaf(curNode)) {\n\t\t\tthrow new Error('unexpected');\n\t\t}\n\t\tparents.push(curNode);\n\t\t// assert 2 <= curNode.childrenFast.length <= 3\n\t\tcurNode = curNode.children[0] as ListNode;\n\t}\n\tlet nodeToPrependOfCorrectHeight: Node | undefined = nodeToAppend;\n\t// assert nodeToAppendOfCorrectHeight!.listHeight === curNode.listHeight\n\tfor (let i = parents.length - 1; i >= 0; i--) {\n\t\tconst parent = parents[i];\n\t\tif (nodeToPrependOfCorrectHeight) {\n\t\t\t// Can we take the element?\n\t\t\tif (parent.children.length >= 3) {\n\t\t\t\t// we need to split to maintain (2,3)-tree property.\n\t\t\t\t// Send the third element + the new element to the parent.\n\t\t\t\tnodeToPrependOfCorrectHeight = ListNode.create(nodeToPrependOfCorrectHeight, parent.unprependChild());\n\t\t\t} else {\n\t\t\t\tparent.prependChild(nodeToPrependOfCorrectHeight);\n\t\t\t\tnodeToPrependOfCorrectHeight = undefined;\n\t\t\t}\n\t\t}\n\t}\n\tif (nodeToPrependOfCorrectHeight) {\n\t\treturn ListNode.create(nodeToPrependOfCorrectHeight, list);\n\t} else {\n\t\treturn list;\n\t}\n}\n\nfunction concat(node1: Node, node2: Node): Node {\n\tif (node1.height === node2.height) {\n\t\treturn ListNode.create(node1, node2);\n\t}\n\telse if (node1.height > node2.height) {\n\t\t// node1 is the tree we want to insert into\n\t\treturn append(node1, node2);\n\t} else {\n\t\treturn prepend(node2, node1);\n\t}\n}\n\nexport class TokenStore implements IDisposable {\n\tprivate _root: Node;\n\n\tconstructor(private readonly _textModel: ITextModel) {\n\t\tthis._root = this.createEmptyRoot();\n\t}\n\n\tprivate createEmptyRoot(): Node {\n\t\treturn {\n\t\t\tlength: this._textModel.getValueLength(),\n\t\t\ttoken: 0,\n\t\t\theight: 0,\n\t\t\ttokenQuality: TokenQuality.None\n\t\t};\n\t}\n\n\t/**\n\t *\n\t * @param update all the tokens for the document in sequence\n\t */\n\tbuildStore(tokens: TokenUpdate[], tokenQuality: TokenQuality): void {\n\t\tthis._root = this.createFromUpdates(tokens, tokenQuality);\n\t}\n\n\tprivate createFromUpdates(tokens: TokenUpdate[], tokenQuality: TokenQuality): Node {\n\t\tif (tokens.length === 0) {\n\t\t\treturn this.createEmptyRoot();\n\t\t}\n\t\tlet newRoot: Node = {\n\t\t\tlength: tokens[0].length,\n\t\t\ttoken: tokens[0].token,\n\t\t\theight: 0,\n\t\t\ttokenQuality\n\t\t};\n\t\tfor (let j = 1; j < tokens.length; j++) {\n\t\t\tnewRoot = append(newRoot, { length: tokens[j].length, token: tokens[j].token, height: 0, tokenQuality });\n\t\t}\n\t\treturn newRoot;\n\t}\n\n\t/**\n\t *\n\t * @param tokens tokens are in sequence in the document.\n\t */\n\tupdate(length: number, tokens: TokenUpdate[], tokenQuality: TokenQuality) {\n\t\tif (tokens.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tthis.replace(length, tokens[0].startOffsetInclusive, tokens, tokenQuality);\n\t}\n\n\tdelete(length: number, startOffset: number) {\n\t\tthis.replace(length, startOffset, [], TokenQuality.EditGuess);\n\t}\n\n\t/**\n\t *\n\t * @param tokens tokens are in sequence in the document.\n\t */\n\tprivate replace(length: number, updateOffsetStart: number, tokens: TokenUpdate[], tokenQuality: TokenQuality) {\n\t\tconst firstUnchangedOffsetAfterUpdate = updateOffsetStart + length;\n\t\t// Find the last unchanged node preceding the update\n\t\tconst precedingNodes: Node[] = [];\n\t\t// Find the first unchanged node after the update\n\t\tconst postcedingNodes: Node[] = [];\n\t\tconst stack: { node: Node; offset: number }[] = [{ node: this._root, offset: 0 }];\n\n\t\twhile (stack.length > 0) {\n\t\t\tconst node = stack.pop()!;\n\t\t\tconst currentOffset = node.offset;\n\n\t\t\tif (currentOffset < updateOffsetStart && currentOffset + node.node.length <= updateOffsetStart) {\n\t\t\t\tif (!isLeaf(node.node)) {\n\t\t\t\t\tnode.node.parent = undefined;\n\t\t\t\t}\n\t\t\t\tprecedingNodes.push(node.node);\n\t\t\t\tcontinue;\n\t\t\t} else if (isLeaf(node.node) && (currentOffset < updateOffsetStart)) {\n\t\t\t\t// We have a partial preceding node\n\t\t\t\tprecedingNodes.push({ length: updateOffsetStart - currentOffset, token: node.node.token, height: 0, tokenQuality: node.node.tokenQuality });\n\t\t\t\t// Node could also be postceeding, so don't continue\n\t\t\t}\n\n\t\t\tif ((updateOffsetStart <= currentOffset) && (currentOffset + node.node.length <= firstUnchangedOffsetAfterUpdate)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (currentOffset >= firstUnchangedOffsetAfterUpdate) {\n\t\t\t\tif (!isLeaf(node.node)) {\n\t\t\t\t\tnode.node.parent = undefined;\n\t\t\t\t}\n\t\t\t\tpostcedingNodes.push(node.node);\n\t\t\t\tcontinue;\n\t\t\t} else if (isLeaf(node.node) && (currentOffset + node.node.length > firstUnchangedOffsetAfterUpdate)) {\n\t\t\t\t// we have a partial postceeding node\n\t\t\t\tpostcedingNodes.push({ length: currentOffset + node.node.length - firstUnchangedOffsetAfterUpdate, token: node.node.token, height: 0, tokenQuality: node.node.tokenQuality });\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!isLeaf(node.node)) {\n\t\t\t\t// Push children in reverse order to process them left-to-right when popping\n\t\t\t\tlet childOffset = currentOffset + node.node.length;\n\t\t\t\tfor (let i = node.node.children.length - 1; i >= 0; i--) {\n\t\t\t\t\tchildOffset -= node.node.children[i].length;\n\t\t\t\t\tstack.push({ node: node.node.children[i], offset: childOffset });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet allNodes: Node[];\n\t\tif (tokens.length > 0) {\n\t\t\tallNodes = precedingNodes.concat(this.createFromUpdates(tokens, tokenQuality), postcedingNodes);\n\t\t} else {\n\t\t\tallNodes = precedingNodes.concat(postcedingNodes);\n\t\t}\n\t\tlet newRoot: Node = allNodes[0];\n\t\tfor (let i = 1; i < allNodes.length; i++) {\n\t\t\tnewRoot = concat(newRoot, allNodes[i]);\n\t\t}\n\n\t\tthis._root = newRoot ?? this.createEmptyRoot();\n\t}\n\n\t/**\n\t *\n\t * @param startOffsetInclusive\n\t * @param endOffsetExclusive\n\t * @param visitor Return true from visitor to exit early\n\t * @returns\n\t */\n\tprivate traverseInOrderInRange(startOffsetInclusive: number, endOffsetExclusive: number, visitor: (node: Node, offset: number) => boolean): void {\n\t\tconst stack: { node: Node; offset: number }[] = [{ node: this._root, offset: 0 }];\n\n\t\twhile (stack.length > 0) {\n\t\t\tconst { node, offset } = stack.pop()!;\n\t\t\tconst nodeEnd = offset + node.length;\n\n\t\t\t// Skip nodes that are completely before or after the range\n\t\t\tif (nodeEnd <= startOffsetInclusive || offset >= endOffsetExclusive) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (visitor(node, offset)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!isLeaf(node)) {\n\t\t\t\t// Push children in reverse order to process them left-to-right when popping\n\t\t\t\tlet childOffset = offset + node.length;\n\t\t\t\tfor (let i = node.children.length - 1; i >= 0; i--) {\n\t\t\t\t\tchildOffset -= node.children[i].length;\n\t\t\t\t\tstack.push({ node: node.children[i], offset: childOffset });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tgetTokenAt(offset: number): TokenUpdate | undefined {\n\t\tlet result: TokenUpdate | undefined;\n\t\tthis.traverseInOrderInRange(offset, this._root.length, (node, offset) => {\n\t\t\tif (isLeaf(node)) {\n\t\t\t\tresult = { token: node.token, startOffsetInclusive: offset, length: node.length };\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\t\treturn result;\n\t}\n\n\tgetTokensInRange(startOffsetInclusive: number, endOffsetExclusive: number): TokenUpdate[] {\n\t\tconst result: { token: number; startOffsetInclusive: number; length: number }[] = [];\n\t\tthis.traverseInOrderInRange(startOffsetInclusive, endOffsetExclusive, (node, offset) => {\n\t\t\tif (isLeaf(node)) {\n\t\t\t\tlet clippedLength = node.length;\n\t\t\t\tlet clippedOffset = offset;\n\t\t\t\tif ((offset < startOffsetInclusive) && (offset + node.length > endOffsetExclusive)) {\n\t\t\t\t\tclippedOffset = startOffsetInclusive;\n\t\t\t\t\tclippedLength = endOffsetExclusive - startOffsetInclusive;\n\t\t\t\t} else if (offset < startOffsetInclusive) {\n\t\t\t\t\tclippedLength -= (startOffsetInclusive - offset);\n\t\t\t\t\tclippedOffset = startOffsetInclusive;\n\t\t\t\t} else if (offset + node.length > endOffsetExclusive) {\n\t\t\t\t\tclippedLength -= (offset + node.length - endOffsetExclusive);\n\t\t\t\t}\n\t\t\t\tresult.push({ token: node.token, startOffsetInclusive: clippedOffset, length: clippedLength });\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\t\treturn result;\n\t}\n\n\tmarkForRefresh(startOffsetInclusive: number, endOffsetExclusive: number): void {\n\t\tthis.traverseInOrderInRange(startOffsetInclusive, endOffsetExclusive, (node) => {\n\t\t\tif (isLeaf(node)) {\n\t\t\t\tnode.tokenQuality = TokenQuality.None;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\t}\n\n\trangeHasTokens(startOffsetInclusive: number, endOffsetExclusive: number, minimumTokenQuality: TokenQuality): boolean {\n\t\tlet hasAny = true;\n\t\tthis.traverseInOrderInRange(startOffsetInclusive, endOffsetExclusive, (node) => {\n\t\t\tif (isLeaf(node) && (node.tokenQuality < minimumTokenQuality)) {\n\t\t\t\thasAny = false;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\t\treturn hasAny;\n\t}\n\n\trangeNeedsRefresh(startOffsetInclusive: number, endOffsetExclusive: number): boolean {\n\t\tlet needsRefresh = false;\n\t\tthis.traverseInOrderInRange(startOffsetInclusive, endOffsetExclusive, (node) => {\n\t\t\tif (isLeaf(node) && (node.tokenQuality !== TokenQuality.Accurate)) {\n\t\t\t\tneedsRefresh = true;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\t\treturn needsRefresh;\n\t}\n\n\tgetNeedsRefresh(): { startOffset: number; endOffset: number }[] {\n\t\tconst result: { startOffset: number; endOffset: number }[] = [];\n\n\t\tthis.traverseInOrderInRange(0, this._textModel.getValueLength(), (node, offset) => {\n\t\t\tif (isLeaf(node) && (node.tokenQuality !== TokenQuality.Accurate)) {\n\t\t\t\tif ((result.length > 0) && (result[result.length - 1].endOffset === offset)) {\n\t\t\t\t\tresult[result.length - 1].endOffset += node.length;\n\t\t\t\t} else {\n\t\t\t\t\tresult.push({ startOffset: offset, endOffset: offset + node.length });\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\t\treturn result;\n\t}\n\n\tdispose(): void {\n\t\tconst stack: Array<[Node, boolean]> = [[this._root, false]];\n\t\twhile (stack.length > 0) {\n\t\t\tconst [node, visited] = stack.pop()!;\n\t\t\tif (isLeaf(node)) {\n\t\t\t\t// leaf node does not need to be disposed\n\t\t\t} else if (!visited) {\n\t\t\t\tstack.push([node, true]);\n\t\t\t\tfor (let i = node.children.length - 1; i >= 0; i--) {\n\t\t\t\t\tstack.push([node.children[i], false]);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnode.dispose();\n\t\t\t\tnode.parent = undefined;\n\t\t\t}\n\t\t}\n\t\tthis._root = undefined!;\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 { IDisposable } from '../../../../../base/common/lifecycle.js';\nimport { ITextModel } from '../../../model.js';\n\n// Exported for tests\nexport class ListNode implements IDisposable {\n\tparent?: ListNode;\n\tprivate readonly _children: Node[] = [];\n\tget children(): ReadonlyArray<Node> { return this._children; }\n\n\tprivate _length: number = 0;\n\tget length(): number { return this._length; }\n\n\tconstructor(public readonly height: number) { }\n\n\tstatic create(node1: Node, node2: Node) {\n\t\tconst list = new ListNode(node1.height + 1);\n\t\tlist.appendChild(node1);\n\t\tlist.appendChild(node2);\n\t\treturn list;\n\t}\n\n\tcanAppendChild(): boolean {\n\t\treturn this._children.length < 3;\n\t}\n\n\tappendChild(node: Node) {\n\t\tif (!this.canAppendChild()) {\n\t\t\tthrow new Error('Cannot insert more than 3 children in a ListNode');\n\t\t}\n\t\tthis._children.push(node);\n\n\t\tthis._length += node.length;\n\t\tthis._updateParentLength(node.length);\n\t\tif (!isLeaf(node)) {\n\t\t\tnode.parent = this;\n\t\t}\n\t}\n\n\tprivate _updateParentLength(delta: number) {\n\t\tlet updateParent = this.parent;\n\t\twhile (updateParent) {\n\t\t\tupdateParent._length += delta;\n\t\t\tupdateParent = updateParent.parent;\n\t\t}\n\t}\n\n\tunappendChild(): Node {\n\t\tconst child = this._children.pop()!;\n\t\tthis._length -= child.length;\n\t\tthis._updateParentLength(-child.length);\n\t\treturn child;\n\t}\n\n\tprependChild(node: Node) {\n\t\tif (this._children.length >= 3) {\n\t\t\tthrow new Error('Cannot prepend more than 3 children in a ListNode');\n\t\t}\n\t\tthis._children.unshift(node);\n\n\t\tthis._length += node.length;\n\t\tthis._updateParentLength(node.length);\n\t\tif (!isLeaf(node)) {\n\t\t\tnode.parent = this;\n\t\t}\n\t}\n\n\tunprependChild(): Node {\n\t\tconst child = this._children.shift()!;\n\t\tthis._length -= child.length;\n\t\tthis._updateParentLength(-child.length);\n\t\treturn child;\n\t}\n\n\tlastChild(): Node {\n\t\treturn this._children[this._children.length - 1];\n\t}\n\n\tdispose() {\n\t\tthis._children.splice(0, this._children.length);\n\t}\n}\n\nexport enum TokenQuality {\n\tNone = 0,\n\tViewportGuess = 1,\n\tEditGuess = 2,\n\tAccurate = 3\n}\n\ntype Node = ListNode | LeafNode;\n\n// Exported for tests\nexport interface LeafNode {\n\treadonly length: number;\n\ttoken: number;\n\ttokenQuality: TokenQuality;\n\theight: 0;\n}\n\nexport interface TokenUpdate {\n\treadonly startOffsetInclusive: number;\n\treadonly length: number;\n\treadonly token: number;\n}\n\nfunction isLeaf(node: Node): node is LeafNode {\n\treturn (node as LeafNode).token !== undefined;\n}\n\n// Heavily inspired by https://github.com/microsoft/vscode/blob/4eb2658d592cb6114a7a393655574176cc790c5b/src/vs/editor/common/model/bracketPairsTextModelPart/bracketPairsTree/concat23Trees.ts#L108-L109\nfunction append(node: Node, nodeToAppend: Node): Node {\n\tlet curNode = node;\n\tconst parents: ListNode[] = [];\n\tlet nodeToAppendOfCorrectHeight: Node | undefined;\n\twhile (true) {\n\t\tif (nodeToAppend.height === curNode.height) {\n\t\t\tnodeToAppendOfCorrectHeight = nodeToAppend;\n\t\t\tbreak;\n\t\t}\n\n\t\tif (isLeaf(curNode)) {\n\t\t\tthrow new Error('unexpected');\n\t\t}\n\t\tparents.push(curNode);\n\t\tcurNode = curNode.lastChild();\n\t}\n\tfor (let i = parents.length - 1; i >= 0; i--) {\n\t\tconst parent = parents[i];\n\t\tif (nodeToAppendOfCorrectHeight) {\n\t\t\t// Can we take the element?\n\t\t\tif (parent.children.length >= 3) {\n\t\t\t\t// we need to split to maintain (2,3)-tree property.\n\t\t\t\t// Send the third element + the new element to the parent.\n\t\t\t\tconst newList = ListNode.create(parent.unappendChild()!, nodeToAppendOfCorrectHeight);\n\t\t\t\tnodeToAppendOfCorrectHeight = newList;\n\t\t\t} else {\n\t\t\t\tparent.appendChild(nodeToAppendOfCorrectHeight);\n\t\t\t\tnodeToAppendOfCorrectHeight = undefined;\n\t\t\t}\n\t\t}\n\t}\n\tif (nodeToAppendOfCorrectHeight) {\n\t\tconst newList = new ListNode(nodeToAppendOfCorrectHeight.height + 1);\n\t\tnewList.appendChild(node);\n\t\tnewList.appendChild(nodeToAppendOfCorrectHeight);\n\t\treturn newList;\n\t} else {\n\t\treturn node;\n\t}\n}\n\nfunction prepend(list: Node, nodeToAppend: Node): Node {\n\tlet curNode = list;\n\tconst parents: ListNode[] = [];\n\twhile (nodeToAppend.height !== curNode.height) {\n\t\tif (isLeaf(curNode)) {\n\t\t\tthrow new Error('unexpected');\n\t\t}\n\t\tparents.push(curNode);\n\t\t// assert 2 <= curNode.childrenFast.length <= 3\n\t\tcurNode = curNode.children[0] as ListNode;\n\t}\n\tlet nodeToPrependOfCorrectHeight: Node | undefined = nodeToAppend;\n\t// assert nodeToAppendOfCorrectHeight!.listHeight === curNode.listHeight\n\tfor (let i = parents.length - 1; i >= 0; i--) {\n\t\tconst parent = parents[i];\n\t\tif (nodeToPrependOfCorrectHeight) {\n\t\t\t// Can we take the element?\n\t\t\tif (parent.children.length >= 3) {\n\t\t\t\t// we need to split to maintain (2,3)-tree property.\n\t\t\t\t// Send the third element + the new element to the parent.\n\t\t\t\tnodeToPrependOfCorrectHeight = ListNode.create(nodeToPrependOfCorrectHeight, parent.unprependChild());\n\t\t\t} else {\n\t\t\t\tparent.prependChild(nodeToPrependOfCorrectHeight);\n\t\t\t\tnodeToPrependOfCorrectHeight = undefined;\n\t\t\t}\n\t\t}\n\t}\n\tif (nodeToPrependOfCorrectHeight) {\n\t\treturn ListNode.create(nodeToPrependOfCorrectHeight, list);\n\t} else {\n\t\treturn list;\n\t}\n}\n\nfunction concat(node1: Node, node2: Node): Node {\n\tif (node1.height === node2.height) {\n\t\treturn ListNode.create(node1, node2);\n\t}\n\telse if (node1.height > node2.height) {\n\t\t// node1 is the tree we want to insert into\n\t\treturn append(node1, node2);\n\t} else {\n\t\treturn prepend(node2, node1);\n\t}\n}\n\nexport class TokenStore implements IDisposable {\n\tprivate _root: Node;\n\n\tconstructor(private readonly _textModel: ITextModel) {\n\t\tthis._root = this.createEmptyRoot();\n\t}\n\n\tprivate createEmptyRoot(): Node {\n\t\treturn {\n\t\t\tlength: this._textModel.getValueLength(),\n\t\t\ttoken: 0,\n\t\t\theight: 0,\n\t\t\ttokenQuality: TokenQuality.None\n\t\t};\n\t}\n\n\t/**\n\t *\n\t * @param update all the tokens for the document in sequence\n\t */\n\tbuildStore(tokens: TokenUpdate[], tokenQuality: TokenQuality): void {\n\t\tthis._root = this.createFromUpdates(tokens, tokenQuality);\n\t}\n\n\tprivate createFromUpdates(tokens: TokenUpdate[], tokenQuality: TokenQuality): Node {\n\t\tif (tokens.length === 0) {\n\t\t\treturn this.createEmptyRoot();\n\t\t}\n\t\tlet newRoot: Node = {\n\t\t\tlength: tokens[0].length,\n\t\t\ttoken: tokens[0].token,\n\t\t\theight: 0,\n\t\t\ttokenQuality\n\t\t};\n\t\tfor (let j = 1; j < tokens.length; j++) {\n\t\t\tnewRoot = append(newRoot, { length: tokens[j].length, token: tokens[j].token, height: 0, tokenQuality });\n\t\t}\n\t\treturn newRoot;\n\t}\n\n\t/**\n\t *\n\t * @param tokens tokens are in sequence in the document.\n\t */\n\tupdate(length: number, tokens: TokenUpdate[], tokenQuality: TokenQuality) {\n\t\tif (tokens.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tthis.replace(length, tokens[0].startOffsetInclusive, tokens, tokenQuality);\n\t}\n\n\tdelete(length: number, startOffset: number) {\n\t\tthis.replace(length, startOffset, [], TokenQuality.EditGuess);\n\t}\n\n\t/**\n\t *\n\t * @param tokens tokens are in sequence in the document.\n\t */\n\tprivate replace(length: number, updateOffsetStart: number, tokens: TokenUpdate[], tokenQuality: TokenQuality) {\n\t\tconst firstUnchangedOffsetAfterUpdate = updateOffsetStart + length;\n\t\t// Find the last unchanged node preceding the update\n\t\tconst precedingNodes: Node[] = [];\n\t\t// Find the first unchanged node after the update\n\t\tconst postcedingNodes: Node[] = [];\n\t\tconst stack: { node: Node; offset: number }[] = [{ node: this._root, offset: 0 }];\n\n\t\twhile (stack.length > 0) {\n\t\t\tconst node = stack.pop()!;\n\t\t\tconst currentOffset = node.offset;\n\n\t\t\tif (currentOffset < updateOffsetStart && currentOffset + node.node.length <= updateOffsetStart) {\n\t\t\t\tif (!isLeaf(node.node)) {\n\t\t\t\t\tnode.node.parent = undefined;\n\t\t\t\t}\n\t\t\t\tprecedingNodes.push(node.node);\n\t\t\t\tcontinue;\n\t\t\t} else if (isLeaf(node.node) && (currentOffset < updateOffsetStart)) {\n\t\t\t\t// We have a partial preceding node\n\t\t\t\tprecedingNodes.push({ length: updateOffsetStart - currentOffset, token: node.node.token, height: 0, tokenQuality: node.node.tokenQuality });\n\t\t\t\t// Node could also be postceeding, so don't continue\n\t\t\t}\n\n\t\t\tif ((updateOffsetStart <= currentOffset) && (currentOffset + node.node.length <= firstUnchangedOffsetAfterUpdate)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (currentOffset >= firstUnchangedOffsetAfterUpdate) {\n\t\t\t\tif (!isLeaf(node.node)) {\n\t\t\t\t\tnode.node.parent = undefined;\n\t\t\t\t}\n\t\t\t\tpostcedingNodes.push(node.node);\n\t\t\t\tcontinue;\n\t\t\t} else if (isLeaf(node.node) && (currentOffset + node.node.length > firstUnchangedOffsetAfterUpdate)) {\n\t\t\t\t// we have a partial postceeding node\n\t\t\t\tpostcedingNodes.push({ length: currentOffset + node.node.length - firstUnchangedOffsetAfterUpdate, token: node.node.token, height: 0, tokenQuality: node.node.tokenQuality });\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!isLeaf(node.node)) {\n\t\t\t\t// Push children in reverse order to process them left-to-right when popping\n\t\t\t\tlet childOffset = currentOffset + node.node.length;\n\t\t\t\tfor (let i = node.node.children.length - 1; i >= 0; i--) {\n\t\t\t\t\tchildOffset -= node.node.children[i].length;\n\t\t\t\t\tstack.push({ node: node.node.children[i], offset: childOffset });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet allNodes: Node[];\n\t\tif (tokens.length > 0) {\n\t\t\tallNodes = precedingNodes.concat(this.createFromUpdates(tokens, tokenQuality), postcedingNodes);\n\t\t} else {\n\t\t\tallNodes = precedingNodes.concat(postcedingNodes);\n\t\t}\n\t\tlet newRoot: Node = allNodes[0];\n\t\tfor (let i = 1; i < allNodes.length; i++) {\n\t\t\tnewRoot = concat(newRoot, allNodes[i]);\n\t\t}\n\n\t\tthis._root = newRoot ?? this.createEmptyRoot();\n\t}\n\n\t/**\n\t *\n\t * @param startOffsetInclusive\n\t * @param endOffsetExclusive\n\t * @param visitor Return true from visitor to exit early\n\t * @returns\n\t */\n\tprivate traverseInOrderInRange(startOffsetInclusive: number, endOffsetExclusive: number, visitor: (node: Node, offset: number) => boolean): void {\n\t\tconst stack: { node: Node; offset: number }[] = [{ node: this._root, offset: 0 }];\n\n\t\twhile (stack.length > 0) {\n\t\t\tconst { node, offset } = stack.pop()!;\n\t\t\tconst nodeEnd = offset + node.length;\n\n\t\t\t// Skip nodes that are completely before or after the range\n\t\t\tif (nodeEnd <= startOffsetInclusive || offset >= endOffsetExclusive) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (visitor(node, offset)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!isLeaf(node)) {\n\t\t\t\t// Push children in reverse order to process them left-to-right when popping\n\t\t\t\tlet childOffset = offset + node.length;\n\t\t\t\tfor (let i = node.children.length - 1; i >= 0; i--) {\n\t\t\t\t\tchildOffset -= node.children[i].length;\n\t\t\t\t\tstack.push({ node: node.children[i], offset: childOffset });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tgetTokenAt(offset: number): TokenUpdate | undefined {\n\t\tlet result: TokenUpdate | undefined;\n\t\tthis.traverseInOrderInRange(offset, this._root.length, (node, offset) => {\n\t\t\tif (isLeaf(node)) {\n\t\t\t\tresult = { token: node.token, startOffsetInclusive: offset, length: node.length };\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\t\treturn result;\n\t}\n\n\tgetTokensInRange(startOffsetInclusive: number, endOffsetExclusive: number): TokenUpdate[] {\n\t\tconst result: { token: number; startOffsetInclusive: number; length: number }[] = [];\n\t\tthis.traverseInOrderInRange(startOffsetInclusive, endOffsetExclusive, (node, offset) => {\n\t\t\tif (isLeaf(node)) {\n\t\t\t\tlet clippedLength = node.length;\n\t\t\t\tlet clippedOffset = offset;\n\t\t\t\tif ((offset < startOffsetInclusive) && (offset + node.length > endOffsetExclusive)) {\n\t\t\t\t\tclippedOffset = startOffsetInclusive;\n\t\t\t\t\tclippedLength = endOffsetExclusive - startOffsetInclusive;\n\t\t\t\t} else if (offset < startOffsetInclusive) {\n\t\t\t\t\tclippedLength -= (startOffsetInclusive - offset);\n\t\t\t\t\tclippedOffset = startOffsetInclusive;\n\t\t\t\t} else if (offset + node.length > endOffsetExclusive) {\n\t\t\t\t\tclippedLength -= (offset + node.length - endOffsetExclusive);\n\t\t\t\t}\n\t\t\t\tresult.push({ token: node.token, startOffsetInclusive: clippedOffset, length: clippedLength });\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\t\treturn result;\n\t}\n\n\tmarkForRefresh(startOffsetInclusive: number, endOffsetExclusive: number): void {\n\t\tthis.traverseInOrderInRange(startOffsetInclusive, endOffsetExclusive, (node) => {\n\t\t\tif (isLeaf(node)) {\n\t\t\t\tnode.tokenQuality = TokenQuality.None;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\t}\n\n\trangeHasTokens(startOffsetInclusive: number, endOffsetExclusive: number, minimumTokenQuality: TokenQuality): boolean {\n\t\tlet hasAny = true;\n\t\tthis.traverseInOrderInRange(startOffsetInclusive, endOffsetExclusive, (node) => {\n\t\t\tif (isLeaf(node) && (node.tokenQuality < minimumTokenQuality)) {\n\t\t\t\thasAny = false;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\t\treturn hasAny;\n\t}\n\n\trangeNeedsRefresh(startOffsetInclusive: number, endOffsetExclusive: number): boolean {\n\t\tlet needsRefresh = false;\n\t\tthis.traverseInOrderInRange(startOffsetInclusive, endOffsetExclusive, (node) => {\n\t\t\tif (isLeaf(node) && (node.tokenQuality !== TokenQuality.Accurate)) {\n\t\t\t\tneedsRefresh = true;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\t\treturn needsRefresh;\n\t}\n\n\tgetNeedsRefresh(): { startOffset: number; endOffset: number }[] {\n\t\tconst result: { startOffset: number; endOffset: number }[] = [];\n\n\t\tthis.traverseInOrderInRange(0, this._textModel.getValueLength(), (node, offset) => {\n\t\t\tif (isLeaf(node) && (node.tokenQuality !== TokenQuality.Accurate)) {\n\t\t\t\tif ((result.length > 0) && (result[result.length - 1].endOffset === offset)) {\n\t\t\t\t\tresult[result.length - 1].endOffset += node.length;\n\t\t\t\t} else {\n\t\t\t\t\tresult.push({ startOffset: offset, endOffset: offset + node.length });\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\t\treturn result;\n\t}\n\n\tdispose(): void {\n\t\tconst stack: Array<[Node, boolean]> = [[this._root, false]];\n\t\twhile (stack.length > 0) {\n\t\t\tconst [node, visited] = stack.pop()!;\n\t\t\tif (isLeaf(node)) {\n\t\t\t\t// leaf node does not need to be disposed\n\t\t\t} else if (!visited) {\n\t\t\t\tstack.push([node, true]);\n\t\t\t\tfor (let i = node.children.length - 1; i >= 0; i--) {\n\t\t\t\t\tstack.push([node.children[i], false]);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnode.dispose();\n\t\t\t\tnode.parent = undefined;\n\t\t\t}\n\t\t}\n\t\tthis._root = undefined!;\n\t}\n}\n"]}
@@ -552,74 +552,69 @@ export class StartFindWithSelectionAction extends EditorAction {
552
552
  }
553
553
  }
554
554
  }
555
- export class MatchFindAction extends EditorAction {
556
- async run(accessor, editor) {
557
- const controller = CommonFindController.get(editor);
558
- if (controller && !this._run(controller)) {
559
- await controller.start({
560
- forceRevealReplace: false,
561
- seedSearchStringFromSelection: (controller.getState().searchString.length === 0) && editor.getOption(50 /* EditorOption.find */).seedSearchStringFromSelection !== 'never' ? 'single' : 'none',
562
- seedSearchStringFromNonEmptySelection: editor.getOption(50 /* EditorOption.find */).seedSearchStringFromSelection === 'selection',
563
- seedSearchStringFromGlobalClipboard: true,
564
- shouldFocus: 0 /* FindStartFocusAction.NoFocusChange */,
565
- shouldAnimate: true,
566
- updateSearchScope: false,
567
- loop: editor.getOption(50 /* EditorOption.find */).loop
568
- });
569
- this._run(controller);
570
- }
571
- }
572
- }
573
- export class NextMatchFindAction extends MatchFindAction {
574
- constructor() {
575
- super({
576
- id: FIND_IDS.NextMatchFindAction,
577
- label: nls.localize2(945, "Find Next"),
578
- precondition: undefined,
579
- kbOpts: [{
580
- kbExpr: EditorContextKeys.focus,
581
- primary: 61 /* KeyCode.F3 */,
582
- mac: { primary: 2048 /* KeyMod.CtrlCmd */ | 37 /* KeyCode.KeyG */, secondary: [61 /* KeyCode.F3 */] },
583
- weight: 100 /* KeybindingWeight.EditorContrib */
584
- }, {
585
- kbExpr: ContextKeyExpr.and(EditorContextKeys.focus, CONTEXT_FIND_INPUT_FOCUSED),
586
- primary: 3 /* KeyCode.Enter */,
587
- weight: 100 /* KeybindingWeight.EditorContrib */
588
- }]
589
- });
555
+ async function matchFindAction(editor, next) {
556
+ const controller = CommonFindController.get(editor);
557
+ if (!controller) {
558
+ return;
590
559
  }
591
- _run(controller) {
592
- const result = controller.moveToNextMatch();
560
+ const runMatch = () => {
561
+ const result = next ? controller.moveToNextMatch() : controller.moveToPrevMatch();
593
562
  if (result) {
594
563
  controller.editor.pushUndoStop();
595
564
  return true;
596
565
  }
597
566
  return false;
598
- }
599
- }
600
- export class PreviousMatchFindAction extends MatchFindAction {
601
- constructor() {
602
- super({
603
- id: FIND_IDS.PreviousMatchFindAction,
604
- label: nls.localize2(946, "Find Previous"),
605
- precondition: undefined,
606
- kbOpts: [{
607
- kbExpr: EditorContextKeys.focus,
608
- primary: 1024 /* KeyMod.Shift */ | 61 /* KeyCode.F3 */,
609
- mac: { primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 37 /* KeyCode.KeyG */, secondary: [1024 /* KeyMod.Shift */ | 61 /* KeyCode.F3 */] },
610
- weight: 100 /* KeybindingWeight.EditorContrib */
611
- }, {
612
- kbExpr: ContextKeyExpr.and(EditorContextKeys.focus, CONTEXT_FIND_INPUT_FOCUSED),
613
- primary: 1024 /* KeyMod.Shift */ | 3 /* KeyCode.Enter */,
614
- weight: 100 /* KeybindingWeight.EditorContrib */
615
- }
616
- ]
567
+ };
568
+ if (!runMatch()) {
569
+ await controller.start({
570
+ forceRevealReplace: false,
571
+ seedSearchStringFromSelection: (controller.getState().searchString.length === 0) && editor.getOption(50 /* EditorOption.find */).seedSearchStringFromSelection !== 'never' ? 'single' : 'none',
572
+ seedSearchStringFromNonEmptySelection: editor.getOption(50 /* EditorOption.find */).seedSearchStringFromSelection === 'selection',
573
+ seedSearchStringFromGlobalClipboard: true,
574
+ shouldFocus: 0 /* FindStartFocusAction.NoFocusChange */,
575
+ shouldAnimate: true,
576
+ updateSearchScope: false,
577
+ loop: editor.getOption(50 /* EditorOption.find */).loop
617
578
  });
618
- }
619
- _run(controller) {
620
- return controller.moveToPrevMatch();
579
+ runMatch();
621
580
  }
622
581
  }
582
+ export const NextMatchFindAction = registerMultiEditorAction(new MultiEditorAction({
583
+ id: FIND_IDS.NextMatchFindAction,
584
+ label: nls.localize2(945, "Find Next"),
585
+ precondition: undefined,
586
+ kbOpts: [{
587
+ kbExpr: EditorContextKeys.focus,
588
+ primary: 61 /* KeyCode.F3 */,
589
+ mac: { primary: 2048 /* KeyMod.CtrlCmd */ | 37 /* KeyCode.KeyG */, secondary: [61 /* KeyCode.F3 */] },
590
+ weight: 100 /* KeybindingWeight.EditorContrib */
591
+ }, {
592
+ kbExpr: ContextKeyExpr.and(EditorContextKeys.focus, CONTEXT_FIND_INPUT_FOCUSED),
593
+ primary: 3 /* KeyCode.Enter */,
594
+ weight: 100 /* KeybindingWeight.EditorContrib */
595
+ }]
596
+ }));
597
+ NextMatchFindAction.addImplementation(0, async (accessor, editor, args) => {
598
+ return matchFindAction(editor, true);
599
+ });
600
+ export const PreviousMatchFindAction = registerMultiEditorAction(new MultiEditorAction({
601
+ id: FIND_IDS.PreviousMatchFindAction,
602
+ label: nls.localize2(946, "Find Previous"),
603
+ precondition: undefined,
604
+ kbOpts: [{
605
+ kbExpr: EditorContextKeys.focus,
606
+ primary: 1024 /* KeyMod.Shift */ | 61 /* KeyCode.F3 */,
607
+ mac: { primary: 2048 /* KeyMod.CtrlCmd */ | 1024 /* KeyMod.Shift */ | 37 /* KeyCode.KeyG */, secondary: [1024 /* KeyMod.Shift */ | 61 /* KeyCode.F3 */] },
608
+ weight: 100 /* KeybindingWeight.EditorContrib */
609
+ }, {
610
+ kbExpr: ContextKeyExpr.and(EditorContextKeys.focus, CONTEXT_FIND_INPUT_FOCUSED),
611
+ primary: 1024 /* KeyMod.Shift */ | 3 /* KeyCode.Enter */,
612
+ weight: 100 /* KeybindingWeight.EditorContrib */
613
+ }]
614
+ }));
615
+ PreviousMatchFindAction.addImplementation(0, async (accessor, editor, args) => {
616
+ return matchFindAction(editor, false);
617
+ });
623
618
  export class MoveToMatchFindAction extends EditorAction {
624
619
  constructor() {
625
620
  super({
@@ -841,8 +836,6 @@ StartFindReplaceAction.addImplementation(0, (accessor, editor, args) => {
841
836
  registerEditorContribution(CommonFindController.ID, FindController, 0 /* EditorContributionInstantiation.Eager */); // eager because it uses `saveViewState`/`restoreViewState`
842
837
  registerEditorAction(StartFindWithArgsAction);
843
838
  registerEditorAction(StartFindWithSelectionAction);
844
- registerEditorAction(NextMatchFindAction);
845
- registerEditorAction(PreviousMatchFindAction);
846
839
  registerEditorAction(MoveToMatchFindAction);
847
840
  registerEditorAction(NextSelectionMatchFindAction);
848
841
  registerEditorAction(PreviousSelectionMatchFindAction);