monaco-editor11 1.0.9 → 1.1.1

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 (232) hide show
  1. package/dist/index.d.ts +1 -1
  2. package/dist/monaco-editor11.es.js +12 -16
  3. package/dist/monaco-editor11.umd.js +1 -1
  4. package/package.json +2 -2
  5. package/dist/monaco.d.ts +0 -8
  6. package/dist/workers/common/initialize.js +0 -16
  7. package/dist/workers/common/workers.js +0 -141
  8. package/dist/workers/editor/common/abstractSyntaxTokenBackend.js +0 -128
  9. package/dist/workers/editor/common/abstractText.js +0 -89
  10. package/dist/workers/editor/common/ast.js +0 -485
  11. package/dist/workers/editor/common/autoIndent.js +0 -390
  12. package/dist/workers/editor/common/beforeEditPositionMapper.js +0 -110
  13. package/dist/workers/editor/common/bracketPairsImpl.js +0 -717
  14. package/dist/workers/editor/common/bracketPairsTree.js +0 -343
  15. package/dist/workers/editor/common/brackets.js +0 -108
  16. package/dist/workers/editor/common/characterClassifier.js +0 -59
  17. package/dist/workers/editor/common/characterPair.js +0 -40
  18. package/dist/workers/editor/common/colorizedBracketPairsDecorationProvider.js +0 -97
  19. package/dist/workers/editor/common/columnRange.js +0 -35
  20. package/dist/workers/editor/common/combineTextEditInfos.js +0 -124
  21. package/dist/workers/editor/common/common.js +0 -20
  22. package/dist/workers/editor/common/computeMovedLines.js +0 -249
  23. package/dist/workers/editor/common/concat23Trees.js +0 -192
  24. package/dist/workers/editor/common/contiguousMultilineTokens.js +0 -32
  25. package/dist/workers/editor/common/contiguousMultilineTokensBuilder.js +0 -23
  26. package/dist/workers/editor/common/contiguousTokensEditing.js +0 -128
  27. package/dist/workers/editor/common/contiguousTokensStore.js +0 -207
  28. package/dist/workers/editor/common/coordinatesConverter.js +0 -51
  29. package/dist/workers/editor/common/cursor.js +0 -899
  30. package/dist/workers/editor/common/cursorAtomicMoveOperations.js +0 -145
  31. package/dist/workers/editor/common/cursorCollection.js +0 -194
  32. package/dist/workers/editor/common/cursorColumnSelection.js +0 -93
  33. package/dist/workers/editor/common/cursorColumns.js +0 -112
  34. package/dist/workers/editor/common/cursorCommon.js +0 -250
  35. package/dist/workers/editor/common/cursorContext.js +0 -15
  36. package/dist/workers/editor/common/cursorDeleteOperations.js +0 -231
  37. package/dist/workers/editor/common/cursorMoveCommands.js +0 -676
  38. package/dist/workers/editor/common/cursorMoveOperations.js +0 -290
  39. package/dist/workers/editor/common/cursorTypeEditOperations.js +0 -968
  40. package/dist/workers/editor/common/cursorTypeOperations.js +0 -173
  41. package/dist/workers/editor/common/cursorUtils.js +0 -75
  42. package/dist/workers/editor/common/cursorWordOperations.js +0 -720
  43. package/dist/workers/editor/common/defaultDocumentColorsComputer.js +0 -138
  44. package/dist/workers/editor/common/defaultLinesDiffComputer.js +0 -188
  45. package/dist/workers/editor/common/diffAlgorithm.js +0 -139
  46. package/dist/workers/editor/common/diffEditor.js +0 -38
  47. package/dist/workers/editor/common/dynamicProgrammingDiffing.js +0 -101
  48. package/dist/workers/editor/common/edit.js +0 -183
  49. package/dist/workers/editor/common/editOperation.js +0 -36
  50. package/dist/workers/editor/common/editStack.js +0 -363
  51. package/dist/workers/editor/common/editorAction.js +0 -26
  52. package/dist/workers/editor/common/editorBaseApi.js +0 -43
  53. package/dist/workers/editor/common/editorColorRegistry.js +0 -102
  54. package/dist/workers/editor/common/editorCommon.js +0 -13
  55. package/dist/workers/editor/common/editorConfigurationSchema.js +0 -338
  56. package/dist/workers/editor/common/editorContextKeys.js +0 -84
  57. package/dist/workers/editor/common/editorFeatures.js +0 -17
  58. package/dist/workers/editor/common/editorOptions.js +0 -3440
  59. package/dist/workers/editor/common/editorTheme.js +0 -23
  60. package/dist/workers/editor/common/editorWebWorker.js +0 -299
  61. package/dist/workers/editor/common/editorWorker.js +0 -9
  62. package/dist/workers/editor/common/editorWorkerHost.js +0 -15
  63. package/dist/workers/editor/common/editorZoom.js +0 -26
  64. package/dist/workers/editor/common/electricCharacter.js +0 -55
  65. package/dist/workers/editor/common/encodedTokenAttributes.js +0 -79
  66. package/dist/workers/editor/common/enterAction.js +0 -53
  67. package/dist/workers/editor/common/eolCounter.js +0 -44
  68. package/dist/workers/editor/common/findSectionHeaders.js +0 -128
  69. package/dist/workers/editor/common/fixBrackets.js +0 -67
  70. package/dist/workers/editor/common/fixedArray.js +0 -70
  71. package/dist/workers/editor/common/fontInfo.js +0 -172
  72. package/dist/workers/editor/common/fontInfoFromSettings.js +0 -29
  73. package/dist/workers/editor/common/getIconClasses.js +0 -106
  74. package/dist/workers/editor/common/getPositionOffsetTransformerFromTextModel.js +0 -24
  75. package/dist/workers/editor/common/glyphLanesModel.js +0 -61
  76. package/dist/workers/editor/common/guidesTextModelPart.js +0 -405
  77. package/dist/workers/editor/common/heuristicSequenceOptimizations.js +0 -374
  78. package/dist/workers/editor/common/indentRules.js +0 -63
  79. package/dist/workers/editor/common/indentation.js +0 -39
  80. package/dist/workers/editor/common/indentationGuesser.js +0 -178
  81. package/dist/workers/editor/common/indentationLineProcessor.js +0 -193
  82. package/dist/workers/editor/common/inlineDecorations.js +0 -26
  83. package/dist/workers/editor/common/inplaceReplaceSupport.js +0 -87
  84. package/dist/workers/editor/common/inputMode.js +0 -22
  85. package/dist/workers/editor/common/intervalTree.js +0 -1002
  86. package/dist/workers/editor/common/language.js +0 -9
  87. package/dist/workers/editor/common/languageBracketsConfiguration.js +0 -133
  88. package/dist/workers/editor/common/languageConfiguration.js +0 -138
  89. package/dist/workers/editor/common/languageConfigurationRegistry.js +0 -361
  90. package/dist/workers/editor/common/languageFeatureDebounce.js +0 -137
  91. package/dist/workers/editor/common/languageFeatureRegistry.js +0 -180
  92. package/dist/workers/editor/common/languageFeatures.js +0 -9
  93. package/dist/workers/editor/common/languageFeaturesService.js +0 -47
  94. package/dist/workers/editor/common/languageSelector.js +0 -112
  95. package/dist/workers/editor/common/languageService.js +0 -92
  96. package/dist/workers/editor/common/languages.js +0 -522
  97. package/dist/workers/editor/common/languagesAssociations.js +0 -193
  98. package/dist/workers/editor/common/languagesRegistry.js +0 -237
  99. package/dist/workers/editor/common/legacyLinesDiffComputer.js +0 -468
  100. package/dist/workers/editor/common/length.js +0 -129
  101. package/dist/workers/editor/common/lineDecorations.js +0 -208
  102. package/dist/workers/editor/common/lineEdit.js +0 -75
  103. package/dist/workers/editor/common/lineHeights.js +0 -370
  104. package/dist/workers/editor/common/linePart.js +0 -25
  105. package/dist/workers/editor/common/lineRange.js +0 -312
  106. package/dist/workers/editor/common/lineSequence.js +0 -36
  107. package/dist/workers/editor/common/lineTokens.js +0 -405
  108. package/dist/workers/editor/common/linesDiffComputer.js +0 -29
  109. package/dist/workers/editor/common/linesDiffComputers.js +0 -13
  110. package/dist/workers/editor/common/linesLayout.js +0 -765
  111. package/dist/workers/editor/common/linesSliceCharSequence.js +0 -205
  112. package/dist/workers/editor/common/linkComputer.js +0 -269
  113. package/dist/workers/editor/common/markerDecorations.js +0 -9
  114. package/dist/workers/editor/common/markerDecorationsService.js +0 -248
  115. package/dist/workers/editor/common/minimapTokensColorTracker.js +0 -58
  116. package/dist/workers/editor/common/mirrorTextModel.js +0 -117
  117. package/dist/workers/editor/common/model.js +0 -9
  118. package/dist/workers/editor/common/modelLineProjection.js +0 -350
  119. package/dist/workers/editor/common/modelLineProjectionData.js +0 -297
  120. package/dist/workers/editor/common/modelService.js +0 -413
  121. package/dist/workers/editor/common/modesRegistry.js +0 -75
  122. package/dist/workers/editor/common/monospaceLineBreaksComputer.js +0 -473
  123. package/dist/workers/editor/common/myersDiffAlgorithm.js +0 -159
  124. package/dist/workers/editor/common/nodeReader.js +0 -127
  125. package/dist/workers/editor/common/nullTokenize.js +0 -29
  126. package/dist/workers/editor/common/offsetRange.js +0 -225
  127. package/dist/workers/editor/common/onEnter.js +0 -109
  128. package/dist/workers/editor/common/oneCursor.js +0 -117
  129. package/dist/workers/editor/common/overviewZoneManager.js +0 -176
  130. package/dist/workers/editor/common/parser.js +0 -121
  131. package/dist/workers/editor/common/pieceTreeBase.js +0 -1473
  132. package/dist/workers/editor/common/pieceTreeTextBuffer.js +0 -461
  133. package/dist/workers/editor/common/pieceTreeTextBufferBuilder.js +0 -140
  134. package/dist/workers/editor/common/point.js +0 -50
  135. package/dist/workers/editor/common/position.js +0 -142
  136. package/dist/workers/editor/common/positionToOffset.js +0 -17
  137. package/dist/workers/editor/common/positionToOffsetImpl.js +0 -98
  138. package/dist/workers/editor/common/prefixSumComputer.js +0 -226
  139. package/dist/workers/editor/common/range.js +0 -421
  140. package/dist/workers/editor/common/rangeMapping.js +0 -229
  141. package/dist/workers/editor/common/rangeSingleLine.js +0 -17
  142. package/dist/workers/editor/common/rbTreeBase.js +0 -362
  143. package/dist/workers/editor/common/rect.js +0 -163
  144. package/dist/workers/editor/common/replaceCommand.js +0 -158
  145. package/dist/workers/editor/common/resolverService.js +0 -5
  146. package/dist/workers/editor/common/rgba.js +0 -35
  147. package/dist/workers/editor/common/richEditBrackets.js +0 -356
  148. package/dist/workers/editor/common/selection.js +0 -145
  149. package/dist/workers/editor/common/semanticTokensDto.js +0 -82
  150. package/dist/workers/editor/common/semanticTokensProviderStyling.js +0 -263
  151. package/dist/workers/editor/common/semanticTokensStyling.js +0 -9
  152. package/dist/workers/editor/common/semanticTokensStylingService.js +0 -47
  153. package/dist/workers/editor/common/shiftCommand.js +0 -241
  154. package/dist/workers/editor/common/smallImmutableSet.js +0 -108
  155. package/dist/workers/editor/common/sparseMultilineTokens.js +0 -548
  156. package/dist/workers/editor/common/sparseTokensStore.js +0 -210
  157. package/dist/workers/editor/common/standaloneEnums.js +0 -1017
  158. package/dist/workers/editor/common/standaloneStrings.js +0 -42
  159. package/dist/workers/editor/common/stringBuilder.js +0 -122
  160. package/dist/workers/editor/common/stringEdit.js +0 -165
  161. package/dist/workers/editor/common/supports.js +0 -58
  162. package/dist/workers/editor/common/surroundSelectionCommand.js +0 -44
  163. package/dist/workers/editor/common/textChange.js +0 -248
  164. package/dist/workers/editor/common/textEdit.js +0 -269
  165. package/dist/workers/editor/common/textLength.js +0 -87
  166. package/dist/workers/editor/common/textModel.js +0 -2031
  167. package/dist/workers/editor/common/textModelBracketPairs.js +0 -45
  168. package/dist/workers/editor/common/textModelDefaults.js +0 -18
  169. package/dist/workers/editor/common/textModelEditSource.js +0 -166
  170. package/dist/workers/editor/common/textModelEvents.js +0 -216
  171. package/dist/workers/editor/common/textModelGuides.js +0 -40
  172. package/dist/workers/editor/common/textModelPart.js +0 -23
  173. package/dist/workers/editor/common/textModelSearch.js +0 -455
  174. package/dist/workers/editor/common/textModelStringEdit.js +0 -11
  175. package/dist/workers/editor/common/textModelSync.impl.js +0 -307
  176. package/dist/workers/editor/common/textModelText.js +0 -26
  177. package/dist/workers/editor/common/textModelTokens.js +0 -436
  178. package/dist/workers/editor/common/textResourceConfiguration.js +0 -6
  179. package/dist/workers/editor/common/textToHtmlTokenizer.js +0 -139
  180. package/dist/workers/editor/common/tokenStore.js +0 -407
  181. package/dist/workers/editor/common/tokenWithTextArray.js +0 -73
  182. package/dist/workers/editor/common/tokenization.js +0 -287
  183. package/dist/workers/editor/common/tokenizationRegistry.js +0 -123
  184. package/dist/workers/editor/common/tokenizationTextModelPart.js +0 -275
  185. package/dist/workers/editor/common/tokenizer.js +0 -301
  186. package/dist/workers/editor/common/tokenizerSyntaxTokenBackend.js +0 -261
  187. package/dist/workers/editor/common/treeSitterLibraryService.js +0 -9
  188. package/dist/workers/editor/common/treeSitterSyntaxTokenBackend.js +0 -167
  189. package/dist/workers/editor/common/treeSitterThemeService.js +0 -9
  190. package/dist/workers/editor/common/treeSitterTokenizationImpl.js +0 -713
  191. package/dist/workers/editor/common/treeSitterTree.js +0 -395
  192. package/dist/workers/editor/common/treeViewsDnd.js +0 -24
  193. package/dist/workers/editor/common/treeViewsDndService.js +0 -12
  194. package/dist/workers/editor/common/trimTrailingWhitespaceCommand.js +0 -98
  195. package/dist/workers/editor/common/unicodeTextModelHighlighter.js +0 -188
  196. package/dist/workers/editor/common/utils.js +0 -62
  197. package/dist/workers/editor/common/viewContext.js +0 -22
  198. package/dist/workers/editor/common/viewEventHandler.js +0 -186
  199. package/dist/workers/editor/common/viewEvents.js +0 -180
  200. package/dist/workers/editor/common/viewLayout.js +0 -368
  201. package/dist/workers/editor/common/viewLineRenderer.js +0 -948
  202. package/dist/workers/editor/common/viewLinesViewportData.js +0 -30
  203. package/dist/workers/editor/common/viewModel.js +0 -98
  204. package/dist/workers/editor/common/viewModelDecoration.js +0 -55
  205. package/dist/workers/editor/common/viewModelDecorations.js +0 -132
  206. package/dist/workers/editor/common/viewModelEventDispatcher.js +0 -398
  207. package/dist/workers/editor/common/viewModelImpl.js +0 -1163
  208. package/dist/workers/editor/common/viewModelLines.js +0 -938
  209. package/dist/workers/editor/common/wordCharacterClassifier.js +0 -87
  210. package/dist/workers/editor/common/wordHelper.js +0 -127
  211. package/dist/workers/language/cssMode.js +0 -198
  212. package/dist/workers/language/cssWorker.js +0 -183
  213. package/dist/workers/language/htmlMode.js +0 -213
  214. package/dist/workers/language/htmlWorker.js +0 -126
  215. package/dist/workers/language/jsonMode.js +0 -224
  216. package/dist/workers/language/jsonWorker.js +0 -187
  217. package/dist/workers/language/languageFeatures.js +0 -1009
  218. package/dist/workers/language/lib.index.js +0 -103
  219. package/dist/workers/language/lib.js +0 -1107
  220. package/dist/workers/language/lspLanguageFeatures.js +0 -716
  221. package/dist/workers/language/monaco.contribution.js +0 -144
  222. package/dist/workers/language/tokenization.js +0 -189
  223. package/dist/workers/language/tsMode.js +0 -212
  224. package/dist/workers/language/tsWorker.js +0 -352
  225. package/dist/workers/language/typescriptServices.js +0 -210154
  226. package/dist/workers/language/typescriptServicesMetadata.js +0 -3
  227. package/dist/workers/language/workerManager.js +0 -65
  228. /package/dist/workers/{language/css.worker.js → css.worker.js} +0 -0
  229. /package/dist/workers/{editor/editor.worker.js → editor.worker.js} +0 -0
  230. /package/dist/workers/{language/html.worker.js → html.worker.js} +0 -0
  231. /package/dist/workers/{language/json.worker.js → json.worker.js} +0 -0
  232. /package/dist/workers/{language/ts.worker.js → ts.worker.js} +0 -0
@@ -1,713 +0,0 @@
1
- import { Emitter } from '../../../../../base/common/event.js';
2
- import { Disposable } from '../../../../../base/common/lifecycle.js';
3
- import { setTimeout0 } from '../../../../../base/common/platform.js';
4
- import { StopWatch } from '../../../../../base/common/stopwatch.js';
5
- import { findLikelyRelevantLines } from '../../textModelTokens.js';
6
- import { TokenStore, TokenQuality } from './tokenStore.js';
7
- import '../../../../../base/common/observableInternal/index.js';
8
- import { LineTokens } from '../../../tokens/lineTokens.js';
9
- import { Position } from '../../../core/position.js';
10
- import { Range } from '../../../core/range.js';
11
- import { isDefined } from '../../../../../base/common/types.js';
12
- import { ITreeSitterThemeService } from '../../../services/treeSitter/treeSitterThemeService.js';
13
- import { BugIndicatingError } from '../../../../../base/common/errors.js';
14
- import { autorun, autorunHandleChanges } from '../../../../../base/common/observableInternal/reactions/autorun.js';
15
- import { recordChanges } from '../../../../../base/common/observableInternal/changeTracker.js';
16
- import { runOnChange } from '../../../../../base/common/observableInternal/utils/runOnChange.js';
17
-
18
- /*---------------------------------------------------------------------------------------------
19
- * Copyright (c) Microsoft Corporation. All rights reserved.
20
- * Licensed under the MIT License. See License.txt in the project root for license information.
21
- *--------------------------------------------------------------------------------------------*/
22
- var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) {
23
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
24
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
25
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
26
- return c > 3 && r && Object.defineProperty(target, key, r), r;
27
- };
28
- var __param = (undefined && undefined.__param) || function (paramIndex, decorator) {
29
- return function (target, key) { decorator(target, key, paramIndex); }
30
- };
31
- let TreeSitterTokenizationImpl = class TreeSitterTokenizationImpl extends Disposable {
32
- get _textModel() {
33
- return this._tree.textModel;
34
- }
35
- constructor(_tree, _highlightingQueries, _languageIdCodec, _visibleLineRanges, _treeSitterThemeService) {
36
- super();
37
- this._tree = _tree;
38
- this._highlightingQueries = _highlightingQueries;
39
- this._languageIdCodec = _languageIdCodec;
40
- this._visibleLineRanges = _visibleLineRanges;
41
- this._treeSitterThemeService = _treeSitterThemeService;
42
- this._onDidChangeTokens = this._register(new Emitter());
43
- this.onDidChangeTokens = this._onDidChangeTokens.event;
44
- this._onDidCompleteBackgroundTokenization = this._register(new Emitter());
45
- this.onDidChangeBackgroundTokenization = this._onDidCompleteBackgroundTokenization.event;
46
- this._encodedLanguageId = this._languageIdCodec.encodeLanguageId(this._tree.languageId);
47
- this._register(runOnChange(this._treeSitterThemeService.onChange, () => {
48
- this._updateTheme();
49
- }));
50
- this._tokenStore = this._register(new TokenStore(this._textModel));
51
- this._accurateVersion = this._textModel.getVersionId();
52
- this._guessVersion = this._textModel.getVersionId();
53
- this._tokenStore.buildStore(this._createEmptyTokens(), TokenQuality.None);
54
- this._register(autorun(reader => {
55
- const visibleLineRanges = this._visibleLineRanges.read(reader);
56
- this._parseAndTokenizeViewPort(visibleLineRanges);
57
- }));
58
- this._register(autorunHandleChanges({
59
- owner: this,
60
- changeTracker: recordChanges({ tree: this._tree.tree }),
61
- }, (reader, ctx) => {
62
- const changeEvent = ctx.changes.at(0)?.change;
63
- if (ctx.changes.length > 1) {
64
- throw new BugIndicatingError('The tree changed twice in one transaction. This is currently not supported and should not happen.');
65
- }
66
- if (!changeEvent) {
67
- if (ctx.tree) {
68
- this._firstTreeUpdate(this._tree.treeLastParsedVersion.read(reader));
69
- }
70
- }
71
- else {
72
- if (this.hasTokens()) {
73
- // Mark the range for refresh immediately
74
- for (const range of changeEvent.ranges) {
75
- this._markForRefresh(range.newRange);
76
- }
77
- }
78
- // First time we see a tree we need to build a token store.
79
- if (!this.hasTokens()) {
80
- this._firstTreeUpdate(changeEvent.versionId);
81
- }
82
- else {
83
- this._handleTreeUpdate(changeEvent.ranges, changeEvent.versionId);
84
- }
85
- }
86
- }));
87
- }
88
- handleContentChanged(e) {
89
- this._guessVersion = e.versionId;
90
- for (const change of e.changes) {
91
- if (change.text.length > change.rangeLength) {
92
- // If possible, use the token before the change as the starting point for the new token.
93
- // This is more likely to let the new text be the correct color as typeing is usually at the end of the token.
94
- const offset = change.rangeOffset > 0 ? change.rangeOffset - 1 : change.rangeOffset;
95
- const oldToken = this._tokenStore.getTokenAt(offset);
96
- let newToken;
97
- if (oldToken) {
98
- // Insert. Just grow the token at this position to include the insert.
99
- newToken = { startOffsetInclusive: oldToken.startOffsetInclusive, length: oldToken.length + change.text.length - change.rangeLength, token: oldToken.token };
100
- // Also mark tokens that are in the range of the change as needing a refresh.
101
- this._tokenStore.markForRefresh(offset, change.rangeOffset + (change.text.length > change.rangeLength ? change.text.length : change.rangeLength));
102
- }
103
- else {
104
- // The document got larger and the change is at the end of the document.
105
- newToken = { startOffsetInclusive: offset, length: change.text.length, token: 0 };
106
- }
107
- this._tokenStore.update(oldToken?.length ?? 0, [newToken], TokenQuality.EditGuess);
108
- }
109
- else if (change.text.length < change.rangeLength) {
110
- // Delete. Delete the tokens at the corresponding range.
111
- const deletedCharCount = change.rangeLength - change.text.length;
112
- this._tokenStore.delete(deletedCharCount, change.rangeOffset);
113
- }
114
- }
115
- }
116
- getLineTokens(lineNumber) {
117
- const content = this._textModel.getLineContent(lineNumber);
118
- const rawTokens = this.getTokens(lineNumber);
119
- return new LineTokens(rawTokens, content, this._languageIdCodec);
120
- }
121
- _createEmptyTokens() {
122
- const emptyToken = this._emptyToken();
123
- const modelEndOffset = this._textModel.getValueLength();
124
- const emptyTokens = [this._emptyTokensForOffsetAndLength(0, modelEndOffset, emptyToken)];
125
- return emptyTokens;
126
- }
127
- _emptyToken() {
128
- return this._treeSitterThemeService.findMetadata([], this._encodedLanguageId, false, undefined);
129
- }
130
- _emptyTokensForOffsetAndLength(offset, length, emptyToken) {
131
- return { token: emptyToken, length: offset + length, startOffsetInclusive: 0 };
132
- }
133
- hasAccurateTokensForLine(lineNumber) {
134
- return this.hasTokens(new Range(lineNumber, 1, lineNumber, this._textModel.getLineMaxColumn(lineNumber)));
135
- }
136
- tokenizeLinesAt(lineNumber, lines) {
137
- const rawLineTokens = this._guessTokensForLinesContent(lineNumber, lines);
138
- const lineTokens = [];
139
- if (!rawLineTokens) {
140
- return null;
141
- }
142
- for (let i = 0; i < rawLineTokens.length; i++) {
143
- lineTokens.push(new LineTokens(rawLineTokens[i], lines[i], this._languageIdCodec));
144
- }
145
- return lineTokens;
146
- }
147
- _rangeHasTokens(range, minimumTokenQuality) {
148
- return this._tokenStore.rangeHasTokens(this._textModel.getOffsetAt(range.getStartPosition()), this._textModel.getOffsetAt(range.getEndPosition()), minimumTokenQuality);
149
- }
150
- hasTokens(accurateForRange) {
151
- if (!accurateForRange || (this._guessVersion === this._accurateVersion)) {
152
- return true;
153
- }
154
- return !this._tokenStore.rangeNeedsRefresh(this._textModel.getOffsetAt(accurateForRange.getStartPosition()), this._textModel.getOffsetAt(accurateForRange.getEndPosition()));
155
- }
156
- getTokens(line) {
157
- const lineStartOffset = this._textModel.getOffsetAt({ lineNumber: line, column: 1 });
158
- const lineEndOffset = this._textModel.getOffsetAt({ lineNumber: line, column: this._textModel.getLineLength(line) + 1 });
159
- const lineTokens = this._tokenStore.getTokensInRange(lineStartOffset, lineEndOffset);
160
- const result = new Uint32Array(lineTokens.length * 2);
161
- for (let i = 0; i < lineTokens.length; i++) {
162
- result[i * 2] = lineTokens[i].startOffsetInclusive - lineStartOffset + lineTokens[i].length;
163
- result[i * 2 + 1] = lineTokens[i].token;
164
- }
165
- return result;
166
- }
167
- getTokensInRange(range, rangeStartOffset, rangeEndOffset, captures) {
168
- const tokens = captures ? this._tokenizeCapturesWithMetadata(captures, rangeStartOffset, rangeEndOffset) : this._tokenize(range, rangeStartOffset, rangeEndOffset);
169
- if (tokens?.endOffsetsAndMetadata) {
170
- return this._rangeTokensAsUpdates(rangeStartOffset, tokens.endOffsetsAndMetadata);
171
- }
172
- return undefined;
173
- }
174
- _updateTokensInStore(version, updates, tokenQuality) {
175
- this._accurateVersion = version;
176
- for (const update of updates) {
177
- const lastToken = update.newTokens.length > 0 ? update.newTokens[update.newTokens.length - 1] : undefined;
178
- let oldRangeLength;
179
- if (lastToken && (this._guessVersion >= version)) {
180
- oldRangeLength = lastToken.startOffsetInclusive + lastToken.length - update.newTokens[0].startOffsetInclusive;
181
- }
182
- else if (update.oldRangeLength) {
183
- oldRangeLength = update.oldRangeLength;
184
- }
185
- else {
186
- oldRangeLength = 0;
187
- }
188
- this._tokenStore.update(oldRangeLength, update.newTokens, tokenQuality);
189
- }
190
- }
191
- _markForRefresh(range) {
192
- this._tokenStore.markForRefresh(this._textModel.getOffsetAt(range.getStartPosition()), this._textModel.getOffsetAt(range.getEndPosition()));
193
- }
194
- _getNeedsRefresh() {
195
- const needsRefreshOffsetRanges = this._tokenStore.getNeedsRefresh();
196
- if (!needsRefreshOffsetRanges) {
197
- return [];
198
- }
199
- return needsRefreshOffsetRanges.map(range => ({
200
- range: Range.fromPositions(this._textModel.getPositionAt(range.startOffset), this._textModel.getPositionAt(range.endOffset)),
201
- startOffset: range.startOffset,
202
- endOffset: range.endOffset
203
- }));
204
- }
205
- _parseAndTokenizeViewPort(lineRanges) {
206
- const viewportRanges = lineRanges.map(r => r.toInclusiveRange()).filter(isDefined);
207
- for (const range of viewportRanges) {
208
- const startOffsetOfRangeInDocument = this._textModel.getOffsetAt(range.getStartPosition());
209
- const endOffsetOfRangeInDocument = this._textModel.getOffsetAt(range.getEndPosition());
210
- const version = this._textModel.getVersionId();
211
- if (this._rangeHasTokens(range, TokenQuality.ViewportGuess)) {
212
- continue;
213
- }
214
- const content = this._textModel.getValueInRange(range);
215
- const tokenUpdates = this._forceParseAndTokenizeContent(range, startOffsetOfRangeInDocument, endOffsetOfRangeInDocument, content, true);
216
- if (!tokenUpdates || this._rangeHasTokens(range, TokenQuality.ViewportGuess)) {
217
- continue;
218
- }
219
- if (tokenUpdates.length === 0) {
220
- continue;
221
- }
222
- const lastToken = tokenUpdates[tokenUpdates.length - 1];
223
- const oldRangeLength = lastToken.startOffsetInclusive + lastToken.length - tokenUpdates[0].startOffsetInclusive;
224
- this._updateTokensInStore(version, [{ newTokens: tokenUpdates, oldRangeLength }], TokenQuality.ViewportGuess);
225
- this._onDidChangeTokens.fire({ changes: { semanticTokensApplied: false, ranges: [{ fromLineNumber: range.startLineNumber, toLineNumber: range.endLineNumber }] } });
226
- }
227
- }
228
- _guessTokensForLinesContent(lineNumber, lines) {
229
- if (lines.length === 0) {
230
- return undefined;
231
- }
232
- const lineContent = lines.join(this._textModel.getEOL());
233
- const range = new Range(1, 1, lineNumber + lines.length, lines[lines.length - 1].length + 1);
234
- const startOffset = this._textModel.getOffsetAt({ lineNumber, column: 1 });
235
- const tokens = this._forceParseAndTokenizeContent(range, startOffset, startOffset + lineContent.length, lineContent, false);
236
- if (!tokens) {
237
- return undefined;
238
- }
239
- const tokensByLine = new Array(lines.length);
240
- let tokensIndex = 0;
241
- let tokenStartOffset = 0;
242
- let lineStartOffset = 0;
243
- for (let i = 0; i < lines.length; i++) {
244
- const tokensForLine = [];
245
- let moveToNextLine = false;
246
- for (let j = tokensIndex; (!moveToNextLine && (j < tokens.length)); j++) {
247
- const token = tokens[j];
248
- const lineAdjustedEndOffset = token.endOffset - lineStartOffset;
249
- const lineAdjustedStartOffset = tokenStartOffset - lineStartOffset;
250
- if (lineAdjustedEndOffset <= lines[i].length) {
251
- tokensForLine.push({ endOffset: lineAdjustedEndOffset, metadata: token.metadata });
252
- tokensIndex++;
253
- }
254
- else if (lineAdjustedStartOffset < lines[i].length) {
255
- const partialToken = { endOffset: lines[i].length, metadata: token.metadata };
256
- tokensForLine.push(partialToken);
257
- moveToNextLine = true;
258
- }
259
- else {
260
- moveToNextLine = true;
261
- }
262
- tokenStartOffset = token.endOffset;
263
- }
264
- tokensByLine[i] = this._endOffsetTokensToUint32Array(tokensForLine);
265
- lineStartOffset += lines[i].length + this._textModel.getEOL().length;
266
- }
267
- return tokensByLine;
268
- }
269
- _forceParseAndTokenizeContent(range, startOffsetOfRangeInDocument, endOffsetOfRangeInDocument, content, asUpdate) {
270
- const likelyRelevantLines = findLikelyRelevantLines(this._textModel, range.startLineNumber).likelyRelevantLines;
271
- const likelyRelevantPrefix = likelyRelevantLines.join(this._textModel.getEOL());
272
- const tree = this._tree.createParsedTreeSync(`${likelyRelevantPrefix}${content}`);
273
- if (!tree) {
274
- return;
275
- }
276
- const treeRange = new Range(1, 1, range.endLineNumber - range.startLineNumber + 1 + likelyRelevantLines.length, range.endColumn);
277
- const captures = this.captureAtRange(treeRange);
278
- const tokens = this._tokenizeCapturesWithMetadata(captures, likelyRelevantPrefix.length, endOffsetOfRangeInDocument - startOffsetOfRangeInDocument + likelyRelevantPrefix.length);
279
- tree.delete();
280
- if (!tokens) {
281
- return;
282
- }
283
- if (asUpdate) {
284
- return this._rangeTokensAsUpdates(startOffsetOfRangeInDocument, tokens.endOffsetsAndMetadata, likelyRelevantPrefix.length);
285
- }
286
- else {
287
- return tokens.endOffsetsAndMetadata;
288
- }
289
- }
290
- _firstTreeUpdate(versionId) {
291
- return this._setViewPortTokens(versionId);
292
- }
293
- _setViewPortTokens(versionId) {
294
- const rangeChanges = this._visibleLineRanges.get().map(lineRange => {
295
- const range = lineRange.toInclusiveRange();
296
- if (!range) {
297
- return undefined;
298
- }
299
- const newRangeStartOffset = this._textModel.getOffsetAt(range.getStartPosition());
300
- const newRangeEndOffset = this._textModel.getOffsetAt(range.getEndPosition());
301
- return {
302
- newRange: range,
303
- newRangeEndOffset,
304
- newRangeStartOffset,
305
- };
306
- }).filter(isDefined);
307
- return this._handleTreeUpdate(rangeChanges, versionId);
308
- }
309
- /**
310
- * Do not await in this method, it will cause a race
311
- */
312
- _handleTreeUpdate(ranges, versionId) {
313
- const rangeChanges = [];
314
- const chunkSize = 1000;
315
- for (let i = 0; i < ranges.length; i++) {
316
- const rangeLinesLength = ranges[i].newRange.endLineNumber - ranges[i].newRange.startLineNumber;
317
- if (rangeLinesLength > chunkSize) {
318
- // Split the range into chunks to avoid long operations
319
- const fullRangeEndLineNumber = ranges[i].newRange.endLineNumber;
320
- let chunkLineStart = ranges[i].newRange.startLineNumber;
321
- let chunkColumnStart = ranges[i].newRange.startColumn;
322
- let chunkLineEnd = chunkLineStart + chunkSize;
323
- do {
324
- const chunkStartingPosition = new Position(chunkLineStart, chunkColumnStart);
325
- const chunkEndColumn = ((chunkLineEnd === ranges[i].newRange.endLineNumber) ? ranges[i].newRange.endColumn : this._textModel.getLineMaxColumn(chunkLineEnd));
326
- const chunkEndPosition = new Position(chunkLineEnd, chunkEndColumn);
327
- const chunkRange = Range.fromPositions(chunkStartingPosition, chunkEndPosition);
328
- rangeChanges.push({
329
- range: chunkRange,
330
- startOffset: this._textModel.getOffsetAt(chunkRange.getStartPosition()),
331
- endOffset: this._textModel.getOffsetAt(chunkRange.getEndPosition())
332
- });
333
- chunkLineStart = chunkLineEnd + 1;
334
- chunkColumnStart = 1;
335
- if (chunkLineEnd < fullRangeEndLineNumber && chunkLineEnd + chunkSize > fullRangeEndLineNumber) {
336
- chunkLineEnd = fullRangeEndLineNumber;
337
- }
338
- else {
339
- chunkLineEnd = chunkLineEnd + chunkSize;
340
- }
341
- } while (chunkLineEnd <= fullRangeEndLineNumber);
342
- }
343
- else {
344
- // Check that the previous range doesn't overlap
345
- if ((i === 0) || (rangeChanges[i - 1].endOffset < ranges[i].newRangeStartOffset)) {
346
- rangeChanges.push({
347
- range: ranges[i].newRange,
348
- startOffset: ranges[i].newRangeStartOffset,
349
- endOffset: ranges[i].newRangeEndOffset
350
- });
351
- }
352
- else if (rangeChanges[i - 1].endOffset < ranges[i].newRangeEndOffset) {
353
- // clip the range to the previous range
354
- const startPosition = this._textModel.getPositionAt(rangeChanges[i - 1].endOffset + 1);
355
- const range = new Range(startPosition.lineNumber, startPosition.column, ranges[i].newRange.endLineNumber, ranges[i].newRange.endColumn);
356
- rangeChanges.push({
357
- range,
358
- startOffset: rangeChanges[i - 1].endOffset + 1,
359
- endOffset: ranges[i].newRangeEndOffset
360
- });
361
- }
362
- }
363
- }
364
- // Get the captures immediately while the text model is correct
365
- const captures = rangeChanges.map(range => this._getCaptures(range.range));
366
- // Don't block
367
- return this._updateTreeForRanges(rangeChanges, versionId, captures).then(() => {
368
- if (!this._textModel.isDisposed() && (this._tree.treeLastParsedVersion.get() === this._textModel.getVersionId())) {
369
- this._refreshNeedsRefresh(versionId);
370
- }
371
- });
372
- }
373
- async _updateTreeForRanges(rangeChanges, versionId, captures) {
374
- let tokenUpdate;
375
- for (let i = 0; i < rangeChanges.length; i++) {
376
- if (!this._textModel.isDisposed() && versionId !== this._textModel.getVersionId()) {
377
- // Our captures have become invalid and we need to re-capture
378
- break;
379
- }
380
- const capture = captures[i];
381
- const range = rangeChanges[i];
382
- const updates = this.getTokensInRange(range.range, range.startOffset, range.endOffset, capture);
383
- if (updates) {
384
- tokenUpdate = { newTokens: updates };
385
- }
386
- else {
387
- tokenUpdate = { newTokens: [] };
388
- }
389
- this._updateTokensInStore(versionId, [tokenUpdate], TokenQuality.Accurate);
390
- this._onDidChangeTokens.fire({
391
- changes: {
392
- semanticTokensApplied: false,
393
- ranges: [{ fromLineNumber: range.range.getStartPosition().lineNumber, toLineNumber: range.range.getEndPosition().lineNumber }]
394
- }
395
- });
396
- await new Promise(resolve => setTimeout0(resolve));
397
- }
398
- this._onDidCompleteBackgroundTokenization.fire();
399
- }
400
- _refreshNeedsRefresh(versionId) {
401
- const rangesToRefresh = this._getNeedsRefresh();
402
- if (rangesToRefresh.length === 0) {
403
- return;
404
- }
405
- const rangeChanges = new Array(rangesToRefresh.length);
406
- for (let i = 0; i < rangesToRefresh.length; i++) {
407
- const range = rangesToRefresh[i];
408
- rangeChanges[i] = {
409
- newRange: range.range,
410
- newRangeStartOffset: range.startOffset,
411
- newRangeEndOffset: range.endOffset
412
- };
413
- }
414
- this._handleTreeUpdate(rangeChanges, versionId);
415
- }
416
- _rangeTokensAsUpdates(rangeOffset, endOffsetToken, startingOffsetInArray) {
417
- const updates = [];
418
- let lastEnd = 0;
419
- for (const token of endOffsetToken) {
420
- if (token.endOffset <= lastEnd || (startingOffsetInArray && (token.endOffset < startingOffsetInArray))) {
421
- continue;
422
- }
423
- let tokenUpdate;
424
- if (startingOffsetInArray && (lastEnd < startingOffsetInArray)) {
425
- tokenUpdate = { startOffsetInclusive: rangeOffset + startingOffsetInArray, length: token.endOffset - startingOffsetInArray, token: token.metadata };
426
- }
427
- else {
428
- tokenUpdate = { startOffsetInclusive: rangeOffset + lastEnd, length: token.endOffset - lastEnd, token: token.metadata };
429
- }
430
- updates.push(tokenUpdate);
431
- lastEnd = token.endOffset;
432
- }
433
- return updates;
434
- }
435
- _updateTheme() {
436
- const modelRange = this._textModel.getFullModelRange();
437
- this._markForRefresh(modelRange);
438
- this._parseAndTokenizeViewPort(this._visibleLineRanges.get());
439
- }
440
- captureAtRange(range) {
441
- const tree = this._tree.tree.get();
442
- if (!tree) {
443
- return [];
444
- }
445
- // Tree sitter row is 0 based, column is 0 based
446
- return this._highlightingQueries.captures(tree.rootNode, { startPosition: { row: range.startLineNumber - 1, column: range.startColumn - 1 }, endPosition: { row: range.endLineNumber - 1, column: range.endColumn - 1 } }).map(capture => ({
447
- name: capture.name,
448
- text: capture.node.text,
449
- node: {
450
- startIndex: capture.node.startIndex,
451
- endIndex: capture.node.endIndex,
452
- startPosition: {
453
- lineNumber: capture.node.startPosition.row + 1,
454
- column: capture.node.startPosition.column + 1
455
- },
456
- endPosition: {
457
- lineNumber: capture.node.endPosition.row + 1,
458
- column: capture.node.endPosition.column + 1
459
- }
460
- },
461
- encodedLanguageId: this._encodedLanguageId
462
- }));
463
- }
464
- captureAtRangeWithInjections(range) {
465
- const captures = this.captureAtRange(range);
466
- for (let i = 0; i < captures.length; i++) {
467
- const capture = captures[i];
468
- const capStartLine = capture.node.startPosition.lineNumber;
469
- const capEndLine = capture.node.endPosition.lineNumber;
470
- const capStartColumn = capture.node.startPosition.column;
471
- const capEndColumn = capture.node.endPosition.column;
472
- const startLine = ((capStartLine > range.startLineNumber) && (capStartLine < range.endLineNumber)) ? capStartLine : range.startLineNumber;
473
- const endLine = ((capEndLine > range.startLineNumber) && (capEndLine < range.endLineNumber)) ? capEndLine : range.endLineNumber;
474
- const startColumn = (capStartLine === range.startLineNumber) ? (capStartColumn < range.startColumn ? range.startColumn : capStartColumn) : (capStartLine < range.startLineNumber ? range.startColumn : capStartColumn);
475
- const endColumn = (capEndLine === range.endLineNumber) ? (capEndColumn > range.endColumn ? range.endColumn : capEndColumn) : (capEndLine > range.endLineNumber ? range.endColumn : capEndColumn);
476
- const injectionRange = new Range(startLine, startColumn, endLine, endColumn);
477
- const injection = this._getInjectionCaptures(capture, injectionRange);
478
- if (injection && injection.length > 0) {
479
- captures.splice(i + 1, 0, ...injection);
480
- i += injection.length;
481
- }
482
- }
483
- return captures;
484
- }
485
- /**
486
- * Gets the tokens for a given line.
487
- * Each token takes 2 elements in the array. The first element is the offset of the end of the token *in the line, not in the document*, and the second element is the metadata.
488
- *
489
- * @param lineNumber
490
- * @returns
491
- */
492
- tokenizeEncoded(lineNumber) {
493
- const tokens = this._tokenizeEncoded(lineNumber);
494
- if (!tokens) {
495
- return undefined;
496
- }
497
- const updates = this._rangeTokensAsUpdates(this._textModel.getOffsetAt({ lineNumber, column: 1 }), tokens.result);
498
- if (tokens.versionId === this._textModel.getVersionId()) {
499
- this._updateTokensInStore(tokens.versionId, [{ newTokens: updates, oldRangeLength: this._textModel.getLineLength(lineNumber) }], TokenQuality.Accurate);
500
- }
501
- }
502
- _getCaptures(range) {
503
- const captures = this.captureAtRangeWithInjections(range);
504
- return captures;
505
- }
506
- _tokenize(range, rangeStartOffset, rangeEndOffset) {
507
- const captures = this._getCaptures(range);
508
- const result = this._tokenizeCapturesWithMetadata(captures, rangeStartOffset, rangeEndOffset);
509
- if (!result) {
510
- return undefined;
511
- }
512
- return { ...result, versionId: this._tree.treeLastParsedVersion.get() };
513
- }
514
- _createTokensFromCaptures(captures, rangeStartOffset, rangeEndOffset) {
515
- const tree = this._tree.tree.get();
516
- const stopwatch = StopWatch.create();
517
- const rangeLength = rangeEndOffset - rangeStartOffset;
518
- const encodedLanguageId = this._languageIdCodec.encodeLanguageId(this._tree.languageId);
519
- const baseScope = TREESITTER_BASE_SCOPES[this._tree.languageId] || 'source';
520
- if (captures.length === 0) {
521
- if (tree) {
522
- stopwatch.stop();
523
- const endOffsetsAndMetadata = [{ endOffset: rangeLength, scopes: [], encodedLanguageId }];
524
- return { endOffsets: endOffsetsAndMetadata, captureTime: stopwatch.elapsed() };
525
- }
526
- return undefined;
527
- }
528
- const endOffsetsAndScopes = Array(captures.length);
529
- endOffsetsAndScopes.fill({ endOffset: 0, scopes: [baseScope], encodedLanguageId });
530
- let tokenIndex = 0;
531
- const increaseSizeOfTokensByOneToken = () => {
532
- endOffsetsAndScopes.push({ endOffset: 0, scopes: [baseScope], encodedLanguageId });
533
- };
534
- const brackets = (capture, startOffset) => {
535
- return (capture.name.includes('punctuation') && capture.text) ? Array.from(capture.text.matchAll(BRACKETS)).map(match => startOffset + match.index) : undefined;
536
- };
537
- const addCurrentTokenToArray = (capture, startOffset, endOffset, position) => {
538
- if (position !== undefined) {
539
- const oldScopes = endOffsetsAndScopes[position].scopes;
540
- let oldBracket = endOffsetsAndScopes[position].bracket;
541
- // Check that the previous token ends at the same point that the current token starts
542
- const prevEndOffset = position > 0 ? endOffsetsAndScopes[position - 1].endOffset : 0;
543
- if (prevEndOffset !== startOffset) {
544
- let preInsertBracket = undefined;
545
- if (oldBracket && oldBracket.length > 0) {
546
- preInsertBracket = [];
547
- const postInsertBracket = [];
548
- for (let i = 0; i < oldBracket.length; i++) {
549
- const bracket = oldBracket[i];
550
- if (bracket < startOffset) {
551
- preInsertBracket.push(bracket);
552
- }
553
- else if (bracket > endOffset) {
554
- postInsertBracket.push(bracket);
555
- }
556
- }
557
- if (preInsertBracket.length === 0) {
558
- preInsertBracket = undefined;
559
- }
560
- if (postInsertBracket.length === 0) {
561
- oldBracket = undefined;
562
- }
563
- else {
564
- oldBracket = postInsertBracket;
565
- }
566
- }
567
- // We need to add some of the position token to cover the space
568
- endOffsetsAndScopes.splice(position, 0, { endOffset: startOffset, scopes: [...oldScopes], bracket: preInsertBracket, encodedLanguageId: capture.encodedLanguageId });
569
- position++;
570
- increaseSizeOfTokensByOneToken();
571
- tokenIndex++;
572
- }
573
- endOffsetsAndScopes.splice(position, 0, { endOffset: endOffset, scopes: [...oldScopes, capture.name], bracket: brackets(capture, startOffset), encodedLanguageId: capture.encodedLanguageId });
574
- endOffsetsAndScopes[tokenIndex].bracket = oldBracket;
575
- }
576
- else {
577
- endOffsetsAndScopes[tokenIndex] = { endOffset: endOffset, scopes: [baseScope, capture.name], bracket: brackets(capture, startOffset), encodedLanguageId: capture.encodedLanguageId };
578
- }
579
- tokenIndex++;
580
- };
581
- for (let captureIndex = 0; captureIndex < captures.length; captureIndex++) {
582
- const capture = captures[captureIndex];
583
- const tokenEndIndex = capture.node.endIndex < rangeEndOffset ? ((capture.node.endIndex < rangeStartOffset) ? rangeStartOffset : capture.node.endIndex) : rangeEndOffset;
584
- const tokenStartIndex = capture.node.startIndex < rangeStartOffset ? rangeStartOffset : capture.node.startIndex;
585
- const endOffset = tokenEndIndex - rangeStartOffset;
586
- // Not every character will get captured, so we need to make sure that our current capture doesn't bleed toward the start of the line and cover characters that it doesn't apply to.
587
- // We do this by creating a new token in the array if the previous token ends before the current token starts.
588
- let previousEndOffset;
589
- const currentTokenLength = tokenEndIndex - tokenStartIndex;
590
- if (captureIndex > 0) {
591
- previousEndOffset = endOffsetsAndScopes[(tokenIndex - 1)].endOffset;
592
- }
593
- else {
594
- previousEndOffset = tokenStartIndex - rangeStartOffset - 1;
595
- }
596
- const startOffset = endOffset - currentTokenLength;
597
- if ((previousEndOffset >= 0) && (previousEndOffset < startOffset)) {
598
- // Add en empty token to cover the space where there were no captures
599
- endOffsetsAndScopes[tokenIndex] = { endOffset: startOffset, scopes: [baseScope], encodedLanguageId: this._encodedLanguageId };
600
- tokenIndex++;
601
- increaseSizeOfTokensByOneToken();
602
- }
603
- if (currentTokenLength < 0) {
604
- // This happens when we have a token "gap" right at the end of the capture range. The last capture isn't used because it's start index isn't included in the range.
605
- continue;
606
- }
607
- if (previousEndOffset >= endOffset) {
608
- // walk back through the tokens until we find the one that contains the current token
609
- let withinTokenIndex = tokenIndex - 1;
610
- let previousTokenEndOffset = endOffsetsAndScopes[withinTokenIndex].endOffset;
611
- let previousTokenStartOffset = ((withinTokenIndex >= 2) ? endOffsetsAndScopes[withinTokenIndex - 1].endOffset : 0);
612
- do {
613
- // Check that the current token doesn't just replace the last token
614
- if ((previousTokenStartOffset + currentTokenLength) === previousTokenEndOffset) {
615
- if (previousTokenStartOffset === startOffset) {
616
- // Current token and previous token span the exact same characters, add the scopes to the previous token
617
- endOffsetsAndScopes[withinTokenIndex].scopes.push(capture.name);
618
- const oldBracket = endOffsetsAndScopes[withinTokenIndex].bracket;
619
- endOffsetsAndScopes[withinTokenIndex].bracket = ((oldBracket && (oldBracket.length > 0)) ? oldBracket : brackets(capture, startOffset));
620
- }
621
- }
622
- else if (previousTokenStartOffset <= startOffset) {
623
- addCurrentTokenToArray(capture, startOffset, endOffset, withinTokenIndex);
624
- break;
625
- }
626
- withinTokenIndex--;
627
- previousTokenStartOffset = ((withinTokenIndex >= 1) ? endOffsetsAndScopes[withinTokenIndex - 1].endOffset : 0);
628
- previousTokenEndOffset = ((withinTokenIndex >= 0) ? endOffsetsAndScopes[withinTokenIndex].endOffset : 0);
629
- } while (previousTokenEndOffset > startOffset);
630
- }
631
- else {
632
- // Just add the token to the array
633
- addCurrentTokenToArray(capture, startOffset, endOffset);
634
- }
635
- }
636
- // Account for uncaptured characters at the end of the line
637
- if ((endOffsetsAndScopes[tokenIndex - 1].endOffset < rangeLength)) {
638
- if (rangeLength - endOffsetsAndScopes[tokenIndex - 1].endOffset > 0) {
639
- increaseSizeOfTokensByOneToken();
640
- endOffsetsAndScopes[tokenIndex] = { endOffset: rangeLength, scopes: endOffsetsAndScopes[tokenIndex].scopes, encodedLanguageId: this._encodedLanguageId };
641
- tokenIndex++;
642
- }
643
- }
644
- for (let i = 0; i < endOffsetsAndScopes.length; i++) {
645
- const token = endOffsetsAndScopes[i];
646
- if (token.endOffset === 0 && i !== 0) {
647
- endOffsetsAndScopes.splice(i, endOffsetsAndScopes.length - i);
648
- break;
649
- }
650
- }
651
- const captureTime = stopwatch.elapsed();
652
- return { endOffsets: endOffsetsAndScopes, captureTime };
653
- }
654
- _getInjectionCaptures(parentCapture, range) {
655
- /*
656
- const injection = textModelTreeSitter.getInjection(parentCapture.node.startIndex, this._treeSitterModel.languageId);
657
- if (!injection?.tree || injection.versionId !== textModelTreeSitter.parseResult?.versionId) {
658
- return undefined;
659
- }
660
-
661
- const feature = TreeSitterTokenizationRegistry.get(injection.languageId);
662
- if (!feature) {
663
- return undefined;
664
- }
665
- return feature.tokSupport_captureAtRangeTree(range, injection.tree, textModelTreeSitter);*/
666
- return [];
667
- }
668
- _tokenizeCapturesWithMetadata(captures, rangeStartOffset, rangeEndOffset) {
669
- const stopwatch = StopWatch.create();
670
- const emptyTokens = this._createTokensFromCaptures(captures, rangeStartOffset, rangeEndOffset);
671
- if (!emptyTokens) {
672
- return undefined;
673
- }
674
- const endOffsetsAndScopes = emptyTokens.endOffsets;
675
- for (let i = 0; i < endOffsetsAndScopes.length; i++) {
676
- const token = endOffsetsAndScopes[i];
677
- token.metadata = this._treeSitterThemeService.findMetadata(token.scopes, token.encodedLanguageId, !!token.bracket && (token.bracket.length > 0), undefined);
678
- }
679
- const metadataTime = stopwatch.elapsed();
680
- return { endOffsetsAndMetadata: endOffsetsAndScopes, captureTime: emptyTokens.captureTime, metadataTime };
681
- }
682
- _tokenizeEncoded(lineNumber) {
683
- const lineOffset = this._textModel.getOffsetAt({ lineNumber: lineNumber, column: 1 });
684
- const maxLine = this._textModel.getLineCount();
685
- const lineEndOffset = (lineNumber + 1 <= maxLine) ? this._textModel.getOffsetAt({ lineNumber: lineNumber + 1, column: 1 }) : this._textModel.getValueLength();
686
- const lineLength = lineEndOffset - lineOffset;
687
- const result = this._tokenize(new Range(lineNumber, 1, lineNumber, lineLength + 1), lineOffset, lineEndOffset);
688
- if (!result) {
689
- return undefined;
690
- }
691
- return { result: result.endOffsetsAndMetadata, captureTime: result.captureTime, metadataTime: result.metadataTime, versionId: result.versionId };
692
- }
693
- _endOffsetTokensToUint32Array(endOffsetsAndMetadata) {
694
- const uint32Array = new Uint32Array(endOffsetsAndMetadata.length * 2);
695
- for (let i = 0; i < endOffsetsAndMetadata.length; i++) {
696
- uint32Array[i * 2] = endOffsetsAndMetadata[i].endOffset;
697
- uint32Array[i * 2 + 1] = endOffsetsAndMetadata[i].metadata;
698
- }
699
- return uint32Array;
700
- }
701
- };
702
- TreeSitterTokenizationImpl = __decorate([
703
- __param(4, ITreeSitterThemeService)
704
- ], TreeSitterTokenizationImpl);
705
- const TREESITTER_BASE_SCOPES = {
706
- 'css': 'source.css',
707
- 'typescript': 'source.ts',
708
- 'ini': 'source.ini',
709
- 'regex': 'source.regex',
710
- };
711
- const BRACKETS = /[\{\}\[\]\<\>\(\)]/g;
712
-
713
- export { TREESITTER_BASE_SCOPES, TreeSitterTokenizationImpl };