monaco-editor11 1.0.9 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -1
- package/dist/monaco-editor11.es.js +11 -16
- package/dist/monaco-editor11.umd.js +1 -1
- package/package.json +2 -2
- package/dist/monaco.d.ts +0 -8
- package/dist/workers/common/initialize.js +0 -16
- package/dist/workers/common/workers.js +0 -141
- package/dist/workers/editor/common/abstractSyntaxTokenBackend.js +0 -128
- package/dist/workers/editor/common/abstractText.js +0 -89
- package/dist/workers/editor/common/ast.js +0 -485
- package/dist/workers/editor/common/autoIndent.js +0 -390
- package/dist/workers/editor/common/beforeEditPositionMapper.js +0 -110
- package/dist/workers/editor/common/bracketPairsImpl.js +0 -717
- package/dist/workers/editor/common/bracketPairsTree.js +0 -343
- package/dist/workers/editor/common/brackets.js +0 -108
- package/dist/workers/editor/common/characterClassifier.js +0 -59
- package/dist/workers/editor/common/characterPair.js +0 -40
- package/dist/workers/editor/common/colorizedBracketPairsDecorationProvider.js +0 -97
- package/dist/workers/editor/common/columnRange.js +0 -35
- package/dist/workers/editor/common/combineTextEditInfos.js +0 -124
- package/dist/workers/editor/common/common.js +0 -20
- package/dist/workers/editor/common/computeMovedLines.js +0 -249
- package/dist/workers/editor/common/concat23Trees.js +0 -192
- package/dist/workers/editor/common/contiguousMultilineTokens.js +0 -32
- package/dist/workers/editor/common/contiguousMultilineTokensBuilder.js +0 -23
- package/dist/workers/editor/common/contiguousTokensEditing.js +0 -128
- package/dist/workers/editor/common/contiguousTokensStore.js +0 -207
- package/dist/workers/editor/common/coordinatesConverter.js +0 -51
- package/dist/workers/editor/common/cursor.js +0 -899
- package/dist/workers/editor/common/cursorAtomicMoveOperations.js +0 -145
- package/dist/workers/editor/common/cursorCollection.js +0 -194
- package/dist/workers/editor/common/cursorColumnSelection.js +0 -93
- package/dist/workers/editor/common/cursorColumns.js +0 -112
- package/dist/workers/editor/common/cursorCommon.js +0 -250
- package/dist/workers/editor/common/cursorContext.js +0 -15
- package/dist/workers/editor/common/cursorDeleteOperations.js +0 -231
- package/dist/workers/editor/common/cursorMoveCommands.js +0 -676
- package/dist/workers/editor/common/cursorMoveOperations.js +0 -290
- package/dist/workers/editor/common/cursorTypeEditOperations.js +0 -968
- package/dist/workers/editor/common/cursorTypeOperations.js +0 -173
- package/dist/workers/editor/common/cursorUtils.js +0 -75
- package/dist/workers/editor/common/cursorWordOperations.js +0 -720
- package/dist/workers/editor/common/defaultDocumentColorsComputer.js +0 -138
- package/dist/workers/editor/common/defaultLinesDiffComputer.js +0 -188
- package/dist/workers/editor/common/diffAlgorithm.js +0 -139
- package/dist/workers/editor/common/diffEditor.js +0 -38
- package/dist/workers/editor/common/dynamicProgrammingDiffing.js +0 -101
- package/dist/workers/editor/common/edit.js +0 -183
- package/dist/workers/editor/common/editOperation.js +0 -36
- package/dist/workers/editor/common/editStack.js +0 -363
- package/dist/workers/editor/common/editorAction.js +0 -26
- package/dist/workers/editor/common/editorBaseApi.js +0 -43
- package/dist/workers/editor/common/editorColorRegistry.js +0 -102
- package/dist/workers/editor/common/editorCommon.js +0 -13
- package/dist/workers/editor/common/editorConfigurationSchema.js +0 -338
- package/dist/workers/editor/common/editorContextKeys.js +0 -84
- package/dist/workers/editor/common/editorFeatures.js +0 -17
- package/dist/workers/editor/common/editorOptions.js +0 -3440
- package/dist/workers/editor/common/editorTheme.js +0 -23
- package/dist/workers/editor/common/editorWebWorker.js +0 -299
- package/dist/workers/editor/common/editorWorker.js +0 -9
- package/dist/workers/editor/common/editorWorkerHost.js +0 -15
- package/dist/workers/editor/common/editorZoom.js +0 -26
- package/dist/workers/editor/common/electricCharacter.js +0 -55
- package/dist/workers/editor/common/encodedTokenAttributes.js +0 -79
- package/dist/workers/editor/common/enterAction.js +0 -53
- package/dist/workers/editor/common/eolCounter.js +0 -44
- package/dist/workers/editor/common/findSectionHeaders.js +0 -128
- package/dist/workers/editor/common/fixBrackets.js +0 -67
- package/dist/workers/editor/common/fixedArray.js +0 -70
- package/dist/workers/editor/common/fontInfo.js +0 -172
- package/dist/workers/editor/common/fontInfoFromSettings.js +0 -29
- package/dist/workers/editor/common/getIconClasses.js +0 -106
- package/dist/workers/editor/common/getPositionOffsetTransformerFromTextModel.js +0 -24
- package/dist/workers/editor/common/glyphLanesModel.js +0 -61
- package/dist/workers/editor/common/guidesTextModelPart.js +0 -405
- package/dist/workers/editor/common/heuristicSequenceOptimizations.js +0 -374
- package/dist/workers/editor/common/indentRules.js +0 -63
- package/dist/workers/editor/common/indentation.js +0 -39
- package/dist/workers/editor/common/indentationGuesser.js +0 -178
- package/dist/workers/editor/common/indentationLineProcessor.js +0 -193
- package/dist/workers/editor/common/inlineDecorations.js +0 -26
- package/dist/workers/editor/common/inplaceReplaceSupport.js +0 -87
- package/dist/workers/editor/common/inputMode.js +0 -22
- package/dist/workers/editor/common/intervalTree.js +0 -1002
- package/dist/workers/editor/common/language.js +0 -9
- package/dist/workers/editor/common/languageBracketsConfiguration.js +0 -133
- package/dist/workers/editor/common/languageConfiguration.js +0 -138
- package/dist/workers/editor/common/languageConfigurationRegistry.js +0 -361
- package/dist/workers/editor/common/languageFeatureDebounce.js +0 -137
- package/dist/workers/editor/common/languageFeatureRegistry.js +0 -180
- package/dist/workers/editor/common/languageFeatures.js +0 -9
- package/dist/workers/editor/common/languageFeaturesService.js +0 -47
- package/dist/workers/editor/common/languageSelector.js +0 -112
- package/dist/workers/editor/common/languageService.js +0 -92
- package/dist/workers/editor/common/languages.js +0 -522
- package/dist/workers/editor/common/languagesAssociations.js +0 -193
- package/dist/workers/editor/common/languagesRegistry.js +0 -237
- package/dist/workers/editor/common/legacyLinesDiffComputer.js +0 -468
- package/dist/workers/editor/common/length.js +0 -129
- package/dist/workers/editor/common/lineDecorations.js +0 -208
- package/dist/workers/editor/common/lineEdit.js +0 -75
- package/dist/workers/editor/common/lineHeights.js +0 -370
- package/dist/workers/editor/common/linePart.js +0 -25
- package/dist/workers/editor/common/lineRange.js +0 -312
- package/dist/workers/editor/common/lineSequence.js +0 -36
- package/dist/workers/editor/common/lineTokens.js +0 -405
- package/dist/workers/editor/common/linesDiffComputer.js +0 -29
- package/dist/workers/editor/common/linesDiffComputers.js +0 -13
- package/dist/workers/editor/common/linesLayout.js +0 -765
- package/dist/workers/editor/common/linesSliceCharSequence.js +0 -205
- package/dist/workers/editor/common/linkComputer.js +0 -269
- package/dist/workers/editor/common/markerDecorations.js +0 -9
- package/dist/workers/editor/common/markerDecorationsService.js +0 -248
- package/dist/workers/editor/common/minimapTokensColorTracker.js +0 -58
- package/dist/workers/editor/common/mirrorTextModel.js +0 -117
- package/dist/workers/editor/common/model.js +0 -9
- package/dist/workers/editor/common/modelLineProjection.js +0 -350
- package/dist/workers/editor/common/modelLineProjectionData.js +0 -297
- package/dist/workers/editor/common/modelService.js +0 -413
- package/dist/workers/editor/common/modesRegistry.js +0 -75
- package/dist/workers/editor/common/monospaceLineBreaksComputer.js +0 -473
- package/dist/workers/editor/common/myersDiffAlgorithm.js +0 -159
- package/dist/workers/editor/common/nodeReader.js +0 -127
- package/dist/workers/editor/common/nullTokenize.js +0 -29
- package/dist/workers/editor/common/offsetRange.js +0 -225
- package/dist/workers/editor/common/onEnter.js +0 -109
- package/dist/workers/editor/common/oneCursor.js +0 -117
- package/dist/workers/editor/common/overviewZoneManager.js +0 -176
- package/dist/workers/editor/common/parser.js +0 -121
- package/dist/workers/editor/common/pieceTreeBase.js +0 -1473
- package/dist/workers/editor/common/pieceTreeTextBuffer.js +0 -461
- package/dist/workers/editor/common/pieceTreeTextBufferBuilder.js +0 -140
- package/dist/workers/editor/common/point.js +0 -50
- package/dist/workers/editor/common/position.js +0 -142
- package/dist/workers/editor/common/positionToOffset.js +0 -17
- package/dist/workers/editor/common/positionToOffsetImpl.js +0 -98
- package/dist/workers/editor/common/prefixSumComputer.js +0 -226
- package/dist/workers/editor/common/range.js +0 -421
- package/dist/workers/editor/common/rangeMapping.js +0 -229
- package/dist/workers/editor/common/rangeSingleLine.js +0 -17
- package/dist/workers/editor/common/rbTreeBase.js +0 -362
- package/dist/workers/editor/common/rect.js +0 -163
- package/dist/workers/editor/common/replaceCommand.js +0 -158
- package/dist/workers/editor/common/resolverService.js +0 -5
- package/dist/workers/editor/common/rgba.js +0 -35
- package/dist/workers/editor/common/richEditBrackets.js +0 -356
- package/dist/workers/editor/common/selection.js +0 -145
- package/dist/workers/editor/common/semanticTokensDto.js +0 -82
- package/dist/workers/editor/common/semanticTokensProviderStyling.js +0 -263
- package/dist/workers/editor/common/semanticTokensStyling.js +0 -9
- package/dist/workers/editor/common/semanticTokensStylingService.js +0 -47
- package/dist/workers/editor/common/shiftCommand.js +0 -241
- package/dist/workers/editor/common/smallImmutableSet.js +0 -108
- package/dist/workers/editor/common/sparseMultilineTokens.js +0 -548
- package/dist/workers/editor/common/sparseTokensStore.js +0 -210
- package/dist/workers/editor/common/standaloneEnums.js +0 -1017
- package/dist/workers/editor/common/standaloneStrings.js +0 -42
- package/dist/workers/editor/common/stringBuilder.js +0 -122
- package/dist/workers/editor/common/stringEdit.js +0 -165
- package/dist/workers/editor/common/supports.js +0 -58
- package/dist/workers/editor/common/surroundSelectionCommand.js +0 -44
- package/dist/workers/editor/common/textChange.js +0 -248
- package/dist/workers/editor/common/textEdit.js +0 -269
- package/dist/workers/editor/common/textLength.js +0 -87
- package/dist/workers/editor/common/textModel.js +0 -2031
- package/dist/workers/editor/common/textModelBracketPairs.js +0 -45
- package/dist/workers/editor/common/textModelDefaults.js +0 -18
- package/dist/workers/editor/common/textModelEditSource.js +0 -166
- package/dist/workers/editor/common/textModelEvents.js +0 -216
- package/dist/workers/editor/common/textModelGuides.js +0 -40
- package/dist/workers/editor/common/textModelPart.js +0 -23
- package/dist/workers/editor/common/textModelSearch.js +0 -455
- package/dist/workers/editor/common/textModelStringEdit.js +0 -11
- package/dist/workers/editor/common/textModelSync.impl.js +0 -307
- package/dist/workers/editor/common/textModelText.js +0 -26
- package/dist/workers/editor/common/textModelTokens.js +0 -436
- package/dist/workers/editor/common/textResourceConfiguration.js +0 -6
- package/dist/workers/editor/common/textToHtmlTokenizer.js +0 -139
- package/dist/workers/editor/common/tokenStore.js +0 -407
- package/dist/workers/editor/common/tokenWithTextArray.js +0 -73
- package/dist/workers/editor/common/tokenization.js +0 -287
- package/dist/workers/editor/common/tokenizationRegistry.js +0 -123
- package/dist/workers/editor/common/tokenizationTextModelPart.js +0 -275
- package/dist/workers/editor/common/tokenizer.js +0 -301
- package/dist/workers/editor/common/tokenizerSyntaxTokenBackend.js +0 -261
- package/dist/workers/editor/common/treeSitterLibraryService.js +0 -9
- package/dist/workers/editor/common/treeSitterSyntaxTokenBackend.js +0 -167
- package/dist/workers/editor/common/treeSitterThemeService.js +0 -9
- package/dist/workers/editor/common/treeSitterTokenizationImpl.js +0 -713
- package/dist/workers/editor/common/treeSitterTree.js +0 -395
- package/dist/workers/editor/common/treeViewsDnd.js +0 -24
- package/dist/workers/editor/common/treeViewsDndService.js +0 -12
- package/dist/workers/editor/common/trimTrailingWhitespaceCommand.js +0 -98
- package/dist/workers/editor/common/unicodeTextModelHighlighter.js +0 -188
- package/dist/workers/editor/common/utils.js +0 -62
- package/dist/workers/editor/common/viewContext.js +0 -22
- package/dist/workers/editor/common/viewEventHandler.js +0 -186
- package/dist/workers/editor/common/viewEvents.js +0 -180
- package/dist/workers/editor/common/viewLayout.js +0 -368
- package/dist/workers/editor/common/viewLineRenderer.js +0 -948
- package/dist/workers/editor/common/viewLinesViewportData.js +0 -30
- package/dist/workers/editor/common/viewModel.js +0 -98
- package/dist/workers/editor/common/viewModelDecoration.js +0 -55
- package/dist/workers/editor/common/viewModelDecorations.js +0 -132
- package/dist/workers/editor/common/viewModelEventDispatcher.js +0 -398
- package/dist/workers/editor/common/viewModelImpl.js +0 -1163
- package/dist/workers/editor/common/viewModelLines.js +0 -938
- package/dist/workers/editor/common/wordCharacterClassifier.js +0 -87
- package/dist/workers/editor/common/wordHelper.js +0 -127
- package/dist/workers/language/cssMode.js +0 -198
- package/dist/workers/language/cssWorker.js +0 -183
- package/dist/workers/language/htmlMode.js +0 -213
- package/dist/workers/language/htmlWorker.js +0 -126
- package/dist/workers/language/jsonMode.js +0 -224
- package/dist/workers/language/jsonWorker.js +0 -187
- package/dist/workers/language/languageFeatures.js +0 -1009
- package/dist/workers/language/lib.index.js +0 -103
- package/dist/workers/language/lib.js +0 -1107
- package/dist/workers/language/lspLanguageFeatures.js +0 -716
- package/dist/workers/language/monaco.contribution.js +0 -144
- package/dist/workers/language/tokenization.js +0 -189
- package/dist/workers/language/tsMode.js +0 -212
- package/dist/workers/language/tsWorker.js +0 -352
- package/dist/workers/language/typescriptServices.js +0 -210154
- package/dist/workers/language/typescriptServicesMetadata.js +0 -3
- package/dist/workers/language/workerManager.js +0 -65
- /package/dist/workers/{language/css.worker.js → css.worker.js} +0 -0
- /package/dist/workers/{editor/editor.worker.js → editor.worker.js} +0 -0
- /package/dist/workers/{language/html.worker.js → html.worker.js} +0 -0
- /package/dist/workers/{language/json.worker.js → json.worker.js} +0 -0
- /package/dist/workers/{language/ts.worker.js → ts.worker.js} +0 -0
|
@@ -1,938 +0,0 @@
|
|
|
1
|
-
import { ArrayQueue } from '../../../base/common/arrays.js';
|
|
2
|
-
import { Position } from '../core/position.js';
|
|
3
|
-
import { Range } from '../core/range.js';
|
|
4
|
-
import { IndentGuide, IndentGuideHorizontalLine } from '../textModelGuides.js';
|
|
5
|
-
import { ModelDecorationOptions } from '../model/textModel.js';
|
|
6
|
-
import { LineInjectedText } from '../textModelEvents.js';
|
|
7
|
-
import { ViewLinesDeletedEvent, ViewLinesInsertedEvent, ViewLinesChangedEvent } from '../viewEvents.js';
|
|
8
|
-
import { createModelLineProjection } from './modelLineProjection.js';
|
|
9
|
-
import { ConstantTimePrefixSumComputer } from '../model/prefixSumComputer.js';
|
|
10
|
-
import { ViewLineData } from '../viewModel.js';
|
|
11
|
-
import { IdentityCoordinatesConverter } from '../coordinatesConverter.js';
|
|
12
|
-
|
|
13
|
-
/*---------------------------------------------------------------------------------------------
|
|
14
|
-
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
15
|
-
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
16
|
-
*--------------------------------------------------------------------------------------------*/
|
|
17
|
-
class ViewModelLinesFromProjectedModel {
|
|
18
|
-
constructor(editorId, model, domLineBreaksComputerFactory, monospaceLineBreaksComputerFactory, fontInfo, tabSize, wrappingStrategy, wrappingColumn, wrappingIndent, wordBreak, wrapOnEscapedLineFeeds) {
|
|
19
|
-
this._editorId = editorId;
|
|
20
|
-
this.model = model;
|
|
21
|
-
this._validModelVersionId = -1;
|
|
22
|
-
this._domLineBreaksComputerFactory = domLineBreaksComputerFactory;
|
|
23
|
-
this._monospaceLineBreaksComputerFactory = monospaceLineBreaksComputerFactory;
|
|
24
|
-
this.fontInfo = fontInfo;
|
|
25
|
-
this.tabSize = tabSize;
|
|
26
|
-
this.wrappingStrategy = wrappingStrategy;
|
|
27
|
-
this.wrappingColumn = wrappingColumn;
|
|
28
|
-
this.wrappingIndent = wrappingIndent;
|
|
29
|
-
this.wordBreak = wordBreak;
|
|
30
|
-
this.wrapOnEscapedLineFeeds = wrapOnEscapedLineFeeds;
|
|
31
|
-
this._constructLines(/*resetHiddenAreas*/ true, null);
|
|
32
|
-
}
|
|
33
|
-
dispose() {
|
|
34
|
-
this.hiddenAreasDecorationIds = this.model.deltaDecorations(this.hiddenAreasDecorationIds, []);
|
|
35
|
-
}
|
|
36
|
-
createCoordinatesConverter() {
|
|
37
|
-
return new CoordinatesConverter(this);
|
|
38
|
-
}
|
|
39
|
-
_constructLines(resetHiddenAreas, previousLineBreaks) {
|
|
40
|
-
this.modelLineProjections = [];
|
|
41
|
-
if (resetHiddenAreas) {
|
|
42
|
-
this.hiddenAreasDecorationIds = this.model.deltaDecorations(this.hiddenAreasDecorationIds, []);
|
|
43
|
-
}
|
|
44
|
-
const linesContent = this.model.getLinesContent();
|
|
45
|
-
const injectedTextDecorations = this.model.getInjectedTextDecorations(this._editorId);
|
|
46
|
-
const lineCount = linesContent.length;
|
|
47
|
-
const lineBreaksComputer = this.createLineBreaksComputer();
|
|
48
|
-
const injectedTextQueue = new ArrayQueue(LineInjectedText.fromDecorations(injectedTextDecorations));
|
|
49
|
-
for (let i = 0; i < lineCount; i++) {
|
|
50
|
-
const lineInjectedText = injectedTextQueue.takeWhile(t => t.lineNumber === i + 1);
|
|
51
|
-
lineBreaksComputer.addRequest(linesContent[i], lineInjectedText, previousLineBreaks ? previousLineBreaks[i] : null);
|
|
52
|
-
}
|
|
53
|
-
const linesBreaks = lineBreaksComputer.finalize();
|
|
54
|
-
const values = [];
|
|
55
|
-
const hiddenAreas = this.hiddenAreasDecorationIds.map((areaId) => this.model.getDecorationRange(areaId)).sort(Range.compareRangesUsingStarts);
|
|
56
|
-
let hiddenAreaStart = 1, hiddenAreaEnd = 0;
|
|
57
|
-
let hiddenAreaIdx = -1;
|
|
58
|
-
let nextLineNumberToUpdateHiddenArea = (hiddenAreaIdx + 1 < hiddenAreas.length) ? hiddenAreaEnd + 1 : lineCount + 2;
|
|
59
|
-
for (let i = 0; i < lineCount; i++) {
|
|
60
|
-
const lineNumber = i + 1;
|
|
61
|
-
if (lineNumber === nextLineNumberToUpdateHiddenArea) {
|
|
62
|
-
hiddenAreaIdx++;
|
|
63
|
-
hiddenAreaStart = hiddenAreas[hiddenAreaIdx].startLineNumber;
|
|
64
|
-
hiddenAreaEnd = hiddenAreas[hiddenAreaIdx].endLineNumber;
|
|
65
|
-
nextLineNumberToUpdateHiddenArea = (hiddenAreaIdx + 1 < hiddenAreas.length) ? hiddenAreaEnd + 1 : lineCount + 2;
|
|
66
|
-
}
|
|
67
|
-
const isInHiddenArea = (lineNumber >= hiddenAreaStart && lineNumber <= hiddenAreaEnd);
|
|
68
|
-
const line = createModelLineProjection(linesBreaks[i], !isInHiddenArea);
|
|
69
|
-
values[i] = line.getViewLineCount();
|
|
70
|
-
this.modelLineProjections[i] = line;
|
|
71
|
-
}
|
|
72
|
-
this._validModelVersionId = this.model.getVersionId();
|
|
73
|
-
this.projectedModelLineLineCounts = new ConstantTimePrefixSumComputer(values);
|
|
74
|
-
}
|
|
75
|
-
getHiddenAreas() {
|
|
76
|
-
return this.hiddenAreasDecorationIds.map((decId) => this.model.getDecorationRange(decId));
|
|
77
|
-
}
|
|
78
|
-
setHiddenAreas(_ranges) {
|
|
79
|
-
const validatedRanges = _ranges.map(r => this.model.validateRange(r));
|
|
80
|
-
const newRanges = normalizeLineRanges(validatedRanges);
|
|
81
|
-
// TODO@Martin: Please stop calling this method on each model change!
|
|
82
|
-
// This checks if there really was a change
|
|
83
|
-
const oldRanges = this.hiddenAreasDecorationIds.map((areaId) => this.model.getDecorationRange(areaId)).sort(Range.compareRangesUsingStarts);
|
|
84
|
-
if (newRanges.length === oldRanges.length) {
|
|
85
|
-
let hasDifference = false;
|
|
86
|
-
for (let i = 0; i < newRanges.length; i++) {
|
|
87
|
-
if (!newRanges[i].equalsRange(oldRanges[i])) {
|
|
88
|
-
hasDifference = true;
|
|
89
|
-
break;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
if (!hasDifference) {
|
|
93
|
-
return false;
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
const newDecorations = newRanges.map((r) => ({
|
|
97
|
-
range: r,
|
|
98
|
-
options: ModelDecorationOptions.EMPTY,
|
|
99
|
-
}));
|
|
100
|
-
this.hiddenAreasDecorationIds = this.model.deltaDecorations(this.hiddenAreasDecorationIds, newDecorations);
|
|
101
|
-
const hiddenAreas = newRanges;
|
|
102
|
-
let hiddenAreaStart = 1, hiddenAreaEnd = 0;
|
|
103
|
-
let hiddenAreaIdx = -1;
|
|
104
|
-
let nextLineNumberToUpdateHiddenArea = (hiddenAreaIdx + 1 < hiddenAreas.length) ? hiddenAreaEnd + 1 : this.modelLineProjections.length + 2;
|
|
105
|
-
let hasVisibleLine = false;
|
|
106
|
-
for (let i = 0; i < this.modelLineProjections.length; i++) {
|
|
107
|
-
const lineNumber = i + 1;
|
|
108
|
-
if (lineNumber === nextLineNumberToUpdateHiddenArea) {
|
|
109
|
-
hiddenAreaIdx++;
|
|
110
|
-
hiddenAreaStart = hiddenAreas[hiddenAreaIdx].startLineNumber;
|
|
111
|
-
hiddenAreaEnd = hiddenAreas[hiddenAreaIdx].endLineNumber;
|
|
112
|
-
nextLineNumberToUpdateHiddenArea = (hiddenAreaIdx + 1 < hiddenAreas.length) ? hiddenAreaEnd + 1 : this.modelLineProjections.length + 2;
|
|
113
|
-
}
|
|
114
|
-
let lineChanged = false;
|
|
115
|
-
if (lineNumber >= hiddenAreaStart && lineNumber <= hiddenAreaEnd) {
|
|
116
|
-
// Line should be hidden
|
|
117
|
-
if (this.modelLineProjections[i].isVisible()) {
|
|
118
|
-
this.modelLineProjections[i] = this.modelLineProjections[i].setVisible(false);
|
|
119
|
-
lineChanged = true;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
else {
|
|
123
|
-
hasVisibleLine = true;
|
|
124
|
-
// Line should be visible
|
|
125
|
-
if (!this.modelLineProjections[i].isVisible()) {
|
|
126
|
-
this.modelLineProjections[i] = this.modelLineProjections[i].setVisible(true);
|
|
127
|
-
lineChanged = true;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
if (lineChanged) {
|
|
131
|
-
const newOutputLineCount = this.modelLineProjections[i].getViewLineCount();
|
|
132
|
-
this.projectedModelLineLineCounts.setValue(i, newOutputLineCount);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
if (!hasVisibleLine) {
|
|
136
|
-
// Cannot have everything be hidden => reveal everything!
|
|
137
|
-
this.setHiddenAreas([]);
|
|
138
|
-
}
|
|
139
|
-
return true;
|
|
140
|
-
}
|
|
141
|
-
modelPositionIsVisible(modelLineNumber, _modelColumn) {
|
|
142
|
-
if (modelLineNumber < 1 || modelLineNumber > this.modelLineProjections.length) {
|
|
143
|
-
// invalid arguments
|
|
144
|
-
return false;
|
|
145
|
-
}
|
|
146
|
-
return this.modelLineProjections[modelLineNumber - 1].isVisible();
|
|
147
|
-
}
|
|
148
|
-
getModelLineViewLineCount(modelLineNumber) {
|
|
149
|
-
if (modelLineNumber < 1 || modelLineNumber > this.modelLineProjections.length) {
|
|
150
|
-
// invalid arguments
|
|
151
|
-
return 1;
|
|
152
|
-
}
|
|
153
|
-
return this.modelLineProjections[modelLineNumber - 1].getViewLineCount();
|
|
154
|
-
}
|
|
155
|
-
setTabSize(newTabSize) {
|
|
156
|
-
if (this.tabSize === newTabSize) {
|
|
157
|
-
return false;
|
|
158
|
-
}
|
|
159
|
-
this.tabSize = newTabSize;
|
|
160
|
-
this._constructLines(/*resetHiddenAreas*/ false, null);
|
|
161
|
-
return true;
|
|
162
|
-
}
|
|
163
|
-
setWrappingSettings(fontInfo, wrappingStrategy, wrappingColumn, wrappingIndent, wordBreak) {
|
|
164
|
-
const equalFontInfo = this.fontInfo.equals(fontInfo);
|
|
165
|
-
const equalWrappingStrategy = (this.wrappingStrategy === wrappingStrategy);
|
|
166
|
-
const equalWrappingColumn = (this.wrappingColumn === wrappingColumn);
|
|
167
|
-
const equalWrappingIndent = (this.wrappingIndent === wrappingIndent);
|
|
168
|
-
const equalWordBreak = (this.wordBreak === wordBreak);
|
|
169
|
-
if (equalFontInfo && equalWrappingStrategy && equalWrappingColumn && equalWrappingIndent && equalWordBreak) {
|
|
170
|
-
return false;
|
|
171
|
-
}
|
|
172
|
-
const onlyWrappingColumnChanged = (equalFontInfo && equalWrappingStrategy && !equalWrappingColumn && equalWrappingIndent && equalWordBreak);
|
|
173
|
-
this.fontInfo = fontInfo;
|
|
174
|
-
this.wrappingStrategy = wrappingStrategy;
|
|
175
|
-
this.wrappingColumn = wrappingColumn;
|
|
176
|
-
this.wrappingIndent = wrappingIndent;
|
|
177
|
-
this.wordBreak = wordBreak;
|
|
178
|
-
let previousLineBreaks = null;
|
|
179
|
-
if (onlyWrappingColumnChanged) {
|
|
180
|
-
previousLineBreaks = [];
|
|
181
|
-
for (let i = 0, len = this.modelLineProjections.length; i < len; i++) {
|
|
182
|
-
previousLineBreaks[i] = this.modelLineProjections[i].getProjectionData();
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
this._constructLines(/*resetHiddenAreas*/ false, previousLineBreaks);
|
|
186
|
-
return true;
|
|
187
|
-
}
|
|
188
|
-
createLineBreaksComputer() {
|
|
189
|
-
const lineBreaksComputerFactory = (this.wrappingStrategy === 'advanced'
|
|
190
|
-
? this._domLineBreaksComputerFactory
|
|
191
|
-
: this._monospaceLineBreaksComputerFactory);
|
|
192
|
-
return lineBreaksComputerFactory.createLineBreaksComputer(this.fontInfo, this.tabSize, this.wrappingColumn, this.wrappingIndent, this.wordBreak, this.wrapOnEscapedLineFeeds);
|
|
193
|
-
}
|
|
194
|
-
onModelFlushed() {
|
|
195
|
-
this._constructLines(/*resetHiddenAreas*/ true, null);
|
|
196
|
-
}
|
|
197
|
-
onModelLinesDeleted(versionId, fromLineNumber, toLineNumber) {
|
|
198
|
-
if (!versionId || versionId <= this._validModelVersionId) {
|
|
199
|
-
// Here we check for versionId in case the lines were reconstructed in the meantime.
|
|
200
|
-
// We don't want to apply stale change events on top of a newer read model state.
|
|
201
|
-
return null;
|
|
202
|
-
}
|
|
203
|
-
const outputFromLineNumber = (fromLineNumber === 1 ? 1 : this.projectedModelLineLineCounts.getPrefixSum(fromLineNumber - 1) + 1);
|
|
204
|
-
const outputToLineNumber = this.projectedModelLineLineCounts.getPrefixSum(toLineNumber);
|
|
205
|
-
this.modelLineProjections.splice(fromLineNumber - 1, toLineNumber - fromLineNumber + 1);
|
|
206
|
-
this.projectedModelLineLineCounts.removeValues(fromLineNumber - 1, toLineNumber - fromLineNumber + 1);
|
|
207
|
-
return new ViewLinesDeletedEvent(outputFromLineNumber, outputToLineNumber);
|
|
208
|
-
}
|
|
209
|
-
onModelLinesInserted(versionId, fromLineNumber, _toLineNumber, lineBreaks) {
|
|
210
|
-
if (!versionId || versionId <= this._validModelVersionId) {
|
|
211
|
-
// Here we check for versionId in case the lines were reconstructed in the meantime.
|
|
212
|
-
// We don't want to apply stale change events on top of a newer read model state.
|
|
213
|
-
return null;
|
|
214
|
-
}
|
|
215
|
-
// cannot use this.getHiddenAreas() because those decorations have already seen the effect of this model change
|
|
216
|
-
const isInHiddenArea = (fromLineNumber > 2 && !this.modelLineProjections[fromLineNumber - 2].isVisible());
|
|
217
|
-
const outputFromLineNumber = (fromLineNumber === 1 ? 1 : this.projectedModelLineLineCounts.getPrefixSum(fromLineNumber - 1) + 1);
|
|
218
|
-
let totalOutputLineCount = 0;
|
|
219
|
-
const insertLines = [];
|
|
220
|
-
const insertPrefixSumValues = [];
|
|
221
|
-
for (let i = 0, len = lineBreaks.length; i < len; i++) {
|
|
222
|
-
const line = createModelLineProjection(lineBreaks[i], !isInHiddenArea);
|
|
223
|
-
insertLines.push(line);
|
|
224
|
-
const outputLineCount = line.getViewLineCount();
|
|
225
|
-
totalOutputLineCount += outputLineCount;
|
|
226
|
-
insertPrefixSumValues[i] = outputLineCount;
|
|
227
|
-
}
|
|
228
|
-
// TODO@Alex: use arrays.arrayInsert
|
|
229
|
-
this.modelLineProjections =
|
|
230
|
-
this.modelLineProjections.slice(0, fromLineNumber - 1)
|
|
231
|
-
.concat(insertLines)
|
|
232
|
-
.concat(this.modelLineProjections.slice(fromLineNumber - 1));
|
|
233
|
-
this.projectedModelLineLineCounts.insertValues(fromLineNumber - 1, insertPrefixSumValues);
|
|
234
|
-
return new ViewLinesInsertedEvent(outputFromLineNumber, outputFromLineNumber + totalOutputLineCount - 1);
|
|
235
|
-
}
|
|
236
|
-
onModelLineChanged(versionId, lineNumber, lineBreakData) {
|
|
237
|
-
if (versionId !== null && versionId <= this._validModelVersionId) {
|
|
238
|
-
// Here we check for versionId in case the lines were reconstructed in the meantime.
|
|
239
|
-
// We don't want to apply stale change events on top of a newer read model state.
|
|
240
|
-
return [false, null, null, null];
|
|
241
|
-
}
|
|
242
|
-
const lineIndex = lineNumber - 1;
|
|
243
|
-
const oldOutputLineCount = this.modelLineProjections[lineIndex].getViewLineCount();
|
|
244
|
-
const isVisible = this.modelLineProjections[lineIndex].isVisible();
|
|
245
|
-
const line = createModelLineProjection(lineBreakData, isVisible);
|
|
246
|
-
this.modelLineProjections[lineIndex] = line;
|
|
247
|
-
const newOutputLineCount = this.modelLineProjections[lineIndex].getViewLineCount();
|
|
248
|
-
let lineMappingChanged = false;
|
|
249
|
-
let changeFrom = 0;
|
|
250
|
-
let changeTo = -1;
|
|
251
|
-
let insertFrom = 0;
|
|
252
|
-
let insertTo = -1;
|
|
253
|
-
let deleteFrom = 0;
|
|
254
|
-
let deleteTo = -1;
|
|
255
|
-
if (oldOutputLineCount > newOutputLineCount) {
|
|
256
|
-
changeFrom = this.projectedModelLineLineCounts.getPrefixSum(lineNumber - 1) + 1;
|
|
257
|
-
changeTo = changeFrom + newOutputLineCount - 1;
|
|
258
|
-
deleteFrom = changeTo + 1;
|
|
259
|
-
deleteTo = deleteFrom + (oldOutputLineCount - newOutputLineCount) - 1;
|
|
260
|
-
lineMappingChanged = true;
|
|
261
|
-
}
|
|
262
|
-
else if (oldOutputLineCount < newOutputLineCount) {
|
|
263
|
-
changeFrom = this.projectedModelLineLineCounts.getPrefixSum(lineNumber - 1) + 1;
|
|
264
|
-
changeTo = changeFrom + oldOutputLineCount - 1;
|
|
265
|
-
insertFrom = changeTo + 1;
|
|
266
|
-
insertTo = insertFrom + (newOutputLineCount - oldOutputLineCount) - 1;
|
|
267
|
-
lineMappingChanged = true;
|
|
268
|
-
}
|
|
269
|
-
else {
|
|
270
|
-
changeFrom = this.projectedModelLineLineCounts.getPrefixSum(lineNumber - 1) + 1;
|
|
271
|
-
changeTo = changeFrom + newOutputLineCount - 1;
|
|
272
|
-
}
|
|
273
|
-
this.projectedModelLineLineCounts.setValue(lineIndex, newOutputLineCount);
|
|
274
|
-
const viewLinesChangedEvent = (changeFrom <= changeTo ? new ViewLinesChangedEvent(changeFrom, changeTo - changeFrom + 1) : null);
|
|
275
|
-
const viewLinesInsertedEvent = (insertFrom <= insertTo ? new ViewLinesInsertedEvent(insertFrom, insertTo) : null);
|
|
276
|
-
const viewLinesDeletedEvent = (deleteFrom <= deleteTo ? new ViewLinesDeletedEvent(deleteFrom, deleteTo) : null);
|
|
277
|
-
return [lineMappingChanged, viewLinesChangedEvent, viewLinesInsertedEvent, viewLinesDeletedEvent];
|
|
278
|
-
}
|
|
279
|
-
acceptVersionId(versionId) {
|
|
280
|
-
this._validModelVersionId = versionId;
|
|
281
|
-
if (this.modelLineProjections.length === 1 && !this.modelLineProjections[0].isVisible()) {
|
|
282
|
-
// At least one line must be visible => reset hidden areas
|
|
283
|
-
this.setHiddenAreas([]);
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
getViewLineCount() {
|
|
287
|
-
return this.projectedModelLineLineCounts.getTotalSum();
|
|
288
|
-
}
|
|
289
|
-
_toValidViewLineNumber(viewLineNumber) {
|
|
290
|
-
if (viewLineNumber < 1) {
|
|
291
|
-
return 1;
|
|
292
|
-
}
|
|
293
|
-
const viewLineCount = this.getViewLineCount();
|
|
294
|
-
if (viewLineNumber > viewLineCount) {
|
|
295
|
-
return viewLineCount;
|
|
296
|
-
}
|
|
297
|
-
return viewLineNumber | 0;
|
|
298
|
-
}
|
|
299
|
-
getActiveIndentGuide(viewLineNumber, minLineNumber, maxLineNumber) {
|
|
300
|
-
viewLineNumber = this._toValidViewLineNumber(viewLineNumber);
|
|
301
|
-
minLineNumber = this._toValidViewLineNumber(minLineNumber);
|
|
302
|
-
maxLineNumber = this._toValidViewLineNumber(maxLineNumber);
|
|
303
|
-
const modelPosition = this.convertViewPositionToModelPosition(viewLineNumber, this.getViewLineMinColumn(viewLineNumber));
|
|
304
|
-
const modelMinPosition = this.convertViewPositionToModelPosition(minLineNumber, this.getViewLineMinColumn(minLineNumber));
|
|
305
|
-
const modelMaxPosition = this.convertViewPositionToModelPosition(maxLineNumber, this.getViewLineMinColumn(maxLineNumber));
|
|
306
|
-
const result = this.model.guides.getActiveIndentGuide(modelPosition.lineNumber, modelMinPosition.lineNumber, modelMaxPosition.lineNumber);
|
|
307
|
-
const viewStartPosition = this.convertModelPositionToViewPosition(result.startLineNumber, 1);
|
|
308
|
-
const viewEndPosition = this.convertModelPositionToViewPosition(result.endLineNumber, this.model.getLineMaxColumn(result.endLineNumber));
|
|
309
|
-
return {
|
|
310
|
-
startLineNumber: viewStartPosition.lineNumber,
|
|
311
|
-
endLineNumber: viewEndPosition.lineNumber,
|
|
312
|
-
indent: result.indent
|
|
313
|
-
};
|
|
314
|
-
}
|
|
315
|
-
// #region ViewLineInfo
|
|
316
|
-
getViewLineInfo(viewLineNumber) {
|
|
317
|
-
viewLineNumber = this._toValidViewLineNumber(viewLineNumber);
|
|
318
|
-
const r = this.projectedModelLineLineCounts.getIndexOf(viewLineNumber - 1);
|
|
319
|
-
const lineIndex = r.index;
|
|
320
|
-
const remainder = r.remainder;
|
|
321
|
-
return new ViewLineInfo(lineIndex + 1, remainder);
|
|
322
|
-
}
|
|
323
|
-
getMinColumnOfViewLine(viewLineInfo) {
|
|
324
|
-
return this.modelLineProjections[viewLineInfo.modelLineNumber - 1].getViewLineMinColumn(this.model, viewLineInfo.modelLineNumber, viewLineInfo.modelLineWrappedLineIdx);
|
|
325
|
-
}
|
|
326
|
-
getMaxColumnOfViewLine(viewLineInfo) {
|
|
327
|
-
return this.modelLineProjections[viewLineInfo.modelLineNumber - 1].getViewLineMaxColumn(this.model, viewLineInfo.modelLineNumber, viewLineInfo.modelLineWrappedLineIdx);
|
|
328
|
-
}
|
|
329
|
-
getModelStartPositionOfViewLine(viewLineInfo) {
|
|
330
|
-
const line = this.modelLineProjections[viewLineInfo.modelLineNumber - 1];
|
|
331
|
-
const minViewColumn = line.getViewLineMinColumn(this.model, viewLineInfo.modelLineNumber, viewLineInfo.modelLineWrappedLineIdx);
|
|
332
|
-
const column = line.getModelColumnOfViewPosition(viewLineInfo.modelLineWrappedLineIdx, minViewColumn);
|
|
333
|
-
return new Position(viewLineInfo.modelLineNumber, column);
|
|
334
|
-
}
|
|
335
|
-
getModelEndPositionOfViewLine(viewLineInfo) {
|
|
336
|
-
const line = this.modelLineProjections[viewLineInfo.modelLineNumber - 1];
|
|
337
|
-
const maxViewColumn = line.getViewLineMaxColumn(this.model, viewLineInfo.modelLineNumber, viewLineInfo.modelLineWrappedLineIdx);
|
|
338
|
-
const column = line.getModelColumnOfViewPosition(viewLineInfo.modelLineWrappedLineIdx, maxViewColumn);
|
|
339
|
-
return new Position(viewLineInfo.modelLineNumber, column);
|
|
340
|
-
}
|
|
341
|
-
getViewLineInfosGroupedByModelRanges(viewStartLineNumber, viewEndLineNumber) {
|
|
342
|
-
const startViewLine = this.getViewLineInfo(viewStartLineNumber);
|
|
343
|
-
const endViewLine = this.getViewLineInfo(viewEndLineNumber);
|
|
344
|
-
const result = new Array();
|
|
345
|
-
let lastVisibleModelPos = this.getModelStartPositionOfViewLine(startViewLine);
|
|
346
|
-
let viewLines = new Array();
|
|
347
|
-
for (let curModelLine = startViewLine.modelLineNumber; curModelLine <= endViewLine.modelLineNumber; curModelLine++) {
|
|
348
|
-
const line = this.modelLineProjections[curModelLine - 1];
|
|
349
|
-
if (line.isVisible()) {
|
|
350
|
-
const startOffset = curModelLine === startViewLine.modelLineNumber
|
|
351
|
-
? startViewLine.modelLineWrappedLineIdx
|
|
352
|
-
: 0;
|
|
353
|
-
const endOffset = curModelLine === endViewLine.modelLineNumber
|
|
354
|
-
? endViewLine.modelLineWrappedLineIdx + 1
|
|
355
|
-
: line.getViewLineCount();
|
|
356
|
-
for (let i = startOffset; i < endOffset; i++) {
|
|
357
|
-
viewLines.push(new ViewLineInfo(curModelLine, i));
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
if (!line.isVisible() && lastVisibleModelPos) {
|
|
361
|
-
const lastVisibleModelPos2 = new Position(curModelLine - 1, this.model.getLineMaxColumn(curModelLine - 1) + 1);
|
|
362
|
-
const modelRange = Range.fromPositions(lastVisibleModelPos, lastVisibleModelPos2);
|
|
363
|
-
result.push(new ViewLineInfoGroupedByModelRange(modelRange, viewLines));
|
|
364
|
-
viewLines = [];
|
|
365
|
-
lastVisibleModelPos = null;
|
|
366
|
-
}
|
|
367
|
-
else if (line.isVisible() && !lastVisibleModelPos) {
|
|
368
|
-
lastVisibleModelPos = new Position(curModelLine, 1);
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
if (lastVisibleModelPos) {
|
|
372
|
-
const modelRange = Range.fromPositions(lastVisibleModelPos, this.getModelEndPositionOfViewLine(endViewLine));
|
|
373
|
-
result.push(new ViewLineInfoGroupedByModelRange(modelRange, viewLines));
|
|
374
|
-
}
|
|
375
|
-
return result;
|
|
376
|
-
}
|
|
377
|
-
// #endregion
|
|
378
|
-
getViewLinesBracketGuides(viewStartLineNumber, viewEndLineNumber, activeViewPosition, options) {
|
|
379
|
-
const modelActivePosition = activeViewPosition ? this.convertViewPositionToModelPosition(activeViewPosition.lineNumber, activeViewPosition.column) : null;
|
|
380
|
-
const resultPerViewLine = [];
|
|
381
|
-
for (const group of this.getViewLineInfosGroupedByModelRanges(viewStartLineNumber, viewEndLineNumber)) {
|
|
382
|
-
const modelRangeStartLineNumber = group.modelRange.startLineNumber;
|
|
383
|
-
const bracketGuidesPerModelLine = this.model.guides.getLinesBracketGuides(modelRangeStartLineNumber, group.modelRange.endLineNumber, modelActivePosition, options);
|
|
384
|
-
for (const viewLineInfo of group.viewLines) {
|
|
385
|
-
const bracketGuides = bracketGuidesPerModelLine[viewLineInfo.modelLineNumber - modelRangeStartLineNumber];
|
|
386
|
-
// visibleColumns stay as they are (this is a bug and needs to be fixed, but it is not a regression)
|
|
387
|
-
// model-columns must be converted to view-model columns.
|
|
388
|
-
const result = bracketGuides.map(g => {
|
|
389
|
-
if (g.forWrappedLinesAfterColumn !== -1) {
|
|
390
|
-
const p = this.modelLineProjections[viewLineInfo.modelLineNumber - 1].getViewPositionOfModelPosition(0, g.forWrappedLinesAfterColumn);
|
|
391
|
-
if (p.lineNumber >= viewLineInfo.modelLineWrappedLineIdx) {
|
|
392
|
-
return undefined;
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
if (g.forWrappedLinesBeforeOrAtColumn !== -1) {
|
|
396
|
-
const p = this.modelLineProjections[viewLineInfo.modelLineNumber - 1].getViewPositionOfModelPosition(0, g.forWrappedLinesBeforeOrAtColumn);
|
|
397
|
-
if (p.lineNumber < viewLineInfo.modelLineWrappedLineIdx) {
|
|
398
|
-
return undefined;
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
if (!g.horizontalLine) {
|
|
402
|
-
return g;
|
|
403
|
-
}
|
|
404
|
-
let column = -1;
|
|
405
|
-
if (g.column !== -1) {
|
|
406
|
-
const p = this.modelLineProjections[viewLineInfo.modelLineNumber - 1].getViewPositionOfModelPosition(0, g.column);
|
|
407
|
-
if (p.lineNumber === viewLineInfo.modelLineWrappedLineIdx) {
|
|
408
|
-
column = p.column;
|
|
409
|
-
}
|
|
410
|
-
else if (p.lineNumber < viewLineInfo.modelLineWrappedLineIdx) {
|
|
411
|
-
column = this.getMinColumnOfViewLine(viewLineInfo);
|
|
412
|
-
}
|
|
413
|
-
else if (p.lineNumber > viewLineInfo.modelLineWrappedLineIdx) {
|
|
414
|
-
return undefined;
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
const viewPosition = this.convertModelPositionToViewPosition(viewLineInfo.modelLineNumber, g.horizontalLine.endColumn);
|
|
418
|
-
const p = this.modelLineProjections[viewLineInfo.modelLineNumber - 1].getViewPositionOfModelPosition(0, g.horizontalLine.endColumn);
|
|
419
|
-
if (p.lineNumber === viewLineInfo.modelLineWrappedLineIdx) {
|
|
420
|
-
return new IndentGuide(g.visibleColumn, column, g.className, new IndentGuideHorizontalLine(g.horizontalLine.top, viewPosition.column), -1, -1);
|
|
421
|
-
}
|
|
422
|
-
else if (p.lineNumber < viewLineInfo.modelLineWrappedLineIdx) {
|
|
423
|
-
return undefined;
|
|
424
|
-
}
|
|
425
|
-
else {
|
|
426
|
-
if (g.visibleColumn !== -1) {
|
|
427
|
-
// Don't repeat horizontal lines that use visibleColumn for unrelated lines.
|
|
428
|
-
return undefined;
|
|
429
|
-
}
|
|
430
|
-
return new IndentGuide(g.visibleColumn, column, g.className, new IndentGuideHorizontalLine(g.horizontalLine.top, this.getMaxColumnOfViewLine(viewLineInfo)), -1, -1);
|
|
431
|
-
}
|
|
432
|
-
});
|
|
433
|
-
resultPerViewLine.push(result.filter((r) => !!r));
|
|
434
|
-
}
|
|
435
|
-
}
|
|
436
|
-
return resultPerViewLine;
|
|
437
|
-
}
|
|
438
|
-
getViewLinesIndentGuides(viewStartLineNumber, viewEndLineNumber) {
|
|
439
|
-
// TODO: Use the same code as in `getViewLinesBracketGuides`.
|
|
440
|
-
// Future TODO: Merge with `getViewLinesBracketGuides`.
|
|
441
|
-
// However, this requires more refactoring of indent guides.
|
|
442
|
-
viewStartLineNumber = this._toValidViewLineNumber(viewStartLineNumber);
|
|
443
|
-
viewEndLineNumber = this._toValidViewLineNumber(viewEndLineNumber);
|
|
444
|
-
const modelStart = this.convertViewPositionToModelPosition(viewStartLineNumber, this.getViewLineMinColumn(viewStartLineNumber));
|
|
445
|
-
const modelEnd = this.convertViewPositionToModelPosition(viewEndLineNumber, this.getViewLineMaxColumn(viewEndLineNumber));
|
|
446
|
-
let result = [];
|
|
447
|
-
const resultRepeatCount = [];
|
|
448
|
-
const resultRepeatOption = [];
|
|
449
|
-
const modelStartLineIndex = modelStart.lineNumber - 1;
|
|
450
|
-
const modelEndLineIndex = modelEnd.lineNumber - 1;
|
|
451
|
-
let reqStart = null;
|
|
452
|
-
for (let modelLineIndex = modelStartLineIndex; modelLineIndex <= modelEndLineIndex; modelLineIndex++) {
|
|
453
|
-
const line = this.modelLineProjections[modelLineIndex];
|
|
454
|
-
if (line.isVisible()) {
|
|
455
|
-
const viewLineStartIndex = line.getViewLineNumberOfModelPosition(0, modelLineIndex === modelStartLineIndex ? modelStart.column : 1);
|
|
456
|
-
const viewLineEndIndex = line.getViewLineNumberOfModelPosition(0, this.model.getLineMaxColumn(modelLineIndex + 1));
|
|
457
|
-
const count = viewLineEndIndex - viewLineStartIndex + 1;
|
|
458
|
-
let option = 0 /* IndentGuideRepeatOption.BlockNone */;
|
|
459
|
-
if (count > 1 && line.getViewLineMinColumn(this.model, modelLineIndex + 1, viewLineEndIndex) === 1) {
|
|
460
|
-
// wrapped lines should block indent guides
|
|
461
|
-
option = (viewLineStartIndex === 0 ? 1 /* IndentGuideRepeatOption.BlockSubsequent */ : 2 /* IndentGuideRepeatOption.BlockAll */);
|
|
462
|
-
}
|
|
463
|
-
resultRepeatCount.push(count);
|
|
464
|
-
resultRepeatOption.push(option);
|
|
465
|
-
// merge into previous request
|
|
466
|
-
if (reqStart === null) {
|
|
467
|
-
reqStart = new Position(modelLineIndex + 1, 0);
|
|
468
|
-
}
|
|
469
|
-
}
|
|
470
|
-
else {
|
|
471
|
-
// hit invisible line => flush request
|
|
472
|
-
if (reqStart !== null) {
|
|
473
|
-
result = result.concat(this.model.guides.getLinesIndentGuides(reqStart.lineNumber, modelLineIndex));
|
|
474
|
-
reqStart = null;
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
}
|
|
478
|
-
if (reqStart !== null) {
|
|
479
|
-
result = result.concat(this.model.guides.getLinesIndentGuides(reqStart.lineNumber, modelEnd.lineNumber));
|
|
480
|
-
reqStart = null;
|
|
481
|
-
}
|
|
482
|
-
const viewLineCount = viewEndLineNumber - viewStartLineNumber + 1;
|
|
483
|
-
const viewIndents = new Array(viewLineCount);
|
|
484
|
-
let currIndex = 0;
|
|
485
|
-
for (let i = 0, len = result.length; i < len; i++) {
|
|
486
|
-
let value = result[i];
|
|
487
|
-
const count = Math.min(viewLineCount - currIndex, resultRepeatCount[i]);
|
|
488
|
-
const option = resultRepeatOption[i];
|
|
489
|
-
let blockAtIndex;
|
|
490
|
-
if (option === 2 /* IndentGuideRepeatOption.BlockAll */) {
|
|
491
|
-
blockAtIndex = 0;
|
|
492
|
-
}
|
|
493
|
-
else if (option === 1 /* IndentGuideRepeatOption.BlockSubsequent */) {
|
|
494
|
-
blockAtIndex = 1;
|
|
495
|
-
}
|
|
496
|
-
else {
|
|
497
|
-
blockAtIndex = count;
|
|
498
|
-
}
|
|
499
|
-
for (let j = 0; j < count; j++) {
|
|
500
|
-
if (j === blockAtIndex) {
|
|
501
|
-
value = 0;
|
|
502
|
-
}
|
|
503
|
-
viewIndents[currIndex++] = value;
|
|
504
|
-
}
|
|
505
|
-
}
|
|
506
|
-
return viewIndents;
|
|
507
|
-
}
|
|
508
|
-
getViewLineContent(viewLineNumber) {
|
|
509
|
-
const info = this.getViewLineInfo(viewLineNumber);
|
|
510
|
-
return this.modelLineProjections[info.modelLineNumber - 1].getViewLineContent(this.model, info.modelLineNumber, info.modelLineWrappedLineIdx);
|
|
511
|
-
}
|
|
512
|
-
getViewLineLength(viewLineNumber) {
|
|
513
|
-
const info = this.getViewLineInfo(viewLineNumber);
|
|
514
|
-
return this.modelLineProjections[info.modelLineNumber - 1].getViewLineLength(this.model, info.modelLineNumber, info.modelLineWrappedLineIdx);
|
|
515
|
-
}
|
|
516
|
-
getViewLineMinColumn(viewLineNumber) {
|
|
517
|
-
const info = this.getViewLineInfo(viewLineNumber);
|
|
518
|
-
return this.modelLineProjections[info.modelLineNumber - 1].getViewLineMinColumn(this.model, info.modelLineNumber, info.modelLineWrappedLineIdx);
|
|
519
|
-
}
|
|
520
|
-
getViewLineMaxColumn(viewLineNumber) {
|
|
521
|
-
const info = this.getViewLineInfo(viewLineNumber);
|
|
522
|
-
return this.modelLineProjections[info.modelLineNumber - 1].getViewLineMaxColumn(this.model, info.modelLineNumber, info.modelLineWrappedLineIdx);
|
|
523
|
-
}
|
|
524
|
-
getViewLineData(viewLineNumber) {
|
|
525
|
-
const info = this.getViewLineInfo(viewLineNumber);
|
|
526
|
-
return this.modelLineProjections[info.modelLineNumber - 1].getViewLineData(this.model, info.modelLineNumber, info.modelLineWrappedLineIdx);
|
|
527
|
-
}
|
|
528
|
-
getViewLinesData(viewStartLineNumber, viewEndLineNumber, needed) {
|
|
529
|
-
viewStartLineNumber = this._toValidViewLineNumber(viewStartLineNumber);
|
|
530
|
-
viewEndLineNumber = this._toValidViewLineNumber(viewEndLineNumber);
|
|
531
|
-
const start = this.projectedModelLineLineCounts.getIndexOf(viewStartLineNumber - 1);
|
|
532
|
-
let viewLineNumber = viewStartLineNumber;
|
|
533
|
-
const startModelLineIndex = start.index;
|
|
534
|
-
const startRemainder = start.remainder;
|
|
535
|
-
const result = [];
|
|
536
|
-
for (let modelLineIndex = startModelLineIndex, len = this.model.getLineCount(); modelLineIndex < len; modelLineIndex++) {
|
|
537
|
-
const line = this.modelLineProjections[modelLineIndex];
|
|
538
|
-
if (!line.isVisible()) {
|
|
539
|
-
continue;
|
|
540
|
-
}
|
|
541
|
-
const fromViewLineIndex = (modelLineIndex === startModelLineIndex ? startRemainder : 0);
|
|
542
|
-
let remainingViewLineCount = line.getViewLineCount() - fromViewLineIndex;
|
|
543
|
-
let lastLine = false;
|
|
544
|
-
if (viewLineNumber + remainingViewLineCount > viewEndLineNumber) {
|
|
545
|
-
lastLine = true;
|
|
546
|
-
remainingViewLineCount = viewEndLineNumber - viewLineNumber + 1;
|
|
547
|
-
}
|
|
548
|
-
line.getViewLinesData(this.model, modelLineIndex + 1, fromViewLineIndex, remainingViewLineCount, viewLineNumber - viewStartLineNumber, needed, result);
|
|
549
|
-
viewLineNumber += remainingViewLineCount;
|
|
550
|
-
if (lastLine) {
|
|
551
|
-
break;
|
|
552
|
-
}
|
|
553
|
-
}
|
|
554
|
-
return result;
|
|
555
|
-
}
|
|
556
|
-
validateViewPosition(viewLineNumber, viewColumn, expectedModelPosition) {
|
|
557
|
-
viewLineNumber = this._toValidViewLineNumber(viewLineNumber);
|
|
558
|
-
const r = this.projectedModelLineLineCounts.getIndexOf(viewLineNumber - 1);
|
|
559
|
-
const lineIndex = r.index;
|
|
560
|
-
const remainder = r.remainder;
|
|
561
|
-
const line = this.modelLineProjections[lineIndex];
|
|
562
|
-
const minColumn = line.getViewLineMinColumn(this.model, lineIndex + 1, remainder);
|
|
563
|
-
const maxColumn = line.getViewLineMaxColumn(this.model, lineIndex + 1, remainder);
|
|
564
|
-
if (viewColumn < minColumn) {
|
|
565
|
-
viewColumn = minColumn;
|
|
566
|
-
}
|
|
567
|
-
if (viewColumn > maxColumn) {
|
|
568
|
-
viewColumn = maxColumn;
|
|
569
|
-
}
|
|
570
|
-
const computedModelColumn = line.getModelColumnOfViewPosition(remainder, viewColumn);
|
|
571
|
-
const computedModelPosition = this.model.validatePosition(new Position(lineIndex + 1, computedModelColumn));
|
|
572
|
-
if (computedModelPosition.equals(expectedModelPosition)) {
|
|
573
|
-
return new Position(viewLineNumber, viewColumn);
|
|
574
|
-
}
|
|
575
|
-
return this.convertModelPositionToViewPosition(expectedModelPosition.lineNumber, expectedModelPosition.column);
|
|
576
|
-
}
|
|
577
|
-
validateViewRange(viewRange, expectedModelRange) {
|
|
578
|
-
const validViewStart = this.validateViewPosition(viewRange.startLineNumber, viewRange.startColumn, expectedModelRange.getStartPosition());
|
|
579
|
-
const validViewEnd = this.validateViewPosition(viewRange.endLineNumber, viewRange.endColumn, expectedModelRange.getEndPosition());
|
|
580
|
-
return new Range(validViewStart.lineNumber, validViewStart.column, validViewEnd.lineNumber, validViewEnd.column);
|
|
581
|
-
}
|
|
582
|
-
convertViewPositionToModelPosition(viewLineNumber, viewColumn) {
|
|
583
|
-
const info = this.getViewLineInfo(viewLineNumber);
|
|
584
|
-
const inputColumn = this.modelLineProjections[info.modelLineNumber - 1].getModelColumnOfViewPosition(info.modelLineWrappedLineIdx, viewColumn);
|
|
585
|
-
// console.log('out -> in ' + viewLineNumber + ',' + viewColumn + ' ===> ' + (lineIndex+1) + ',' + inputColumn);
|
|
586
|
-
return this.model.validatePosition(new Position(info.modelLineNumber, inputColumn));
|
|
587
|
-
}
|
|
588
|
-
convertViewRangeToModelRange(viewRange) {
|
|
589
|
-
const start = this.convertViewPositionToModelPosition(viewRange.startLineNumber, viewRange.startColumn);
|
|
590
|
-
const end = this.convertViewPositionToModelPosition(viewRange.endLineNumber, viewRange.endColumn);
|
|
591
|
-
return new Range(start.lineNumber, start.column, end.lineNumber, end.column);
|
|
592
|
-
}
|
|
593
|
-
convertModelPositionToViewPosition(_modelLineNumber, _modelColumn, affinity = 2 /* PositionAffinity.None */, allowZeroLineNumber = false, belowHiddenRanges = false) {
|
|
594
|
-
const validPosition = this.model.validatePosition(new Position(_modelLineNumber, _modelColumn));
|
|
595
|
-
const inputLineNumber = validPosition.lineNumber;
|
|
596
|
-
const inputColumn = validPosition.column;
|
|
597
|
-
let lineIndex = inputLineNumber - 1, lineIndexChanged = false;
|
|
598
|
-
if (belowHiddenRanges) {
|
|
599
|
-
while (lineIndex < this.modelLineProjections.length && !this.modelLineProjections[lineIndex].isVisible()) {
|
|
600
|
-
lineIndex++;
|
|
601
|
-
lineIndexChanged = true;
|
|
602
|
-
}
|
|
603
|
-
}
|
|
604
|
-
else {
|
|
605
|
-
while (lineIndex > 0 && !this.modelLineProjections[lineIndex].isVisible()) {
|
|
606
|
-
lineIndex--;
|
|
607
|
-
lineIndexChanged = true;
|
|
608
|
-
}
|
|
609
|
-
}
|
|
610
|
-
if (lineIndex === 0 && !this.modelLineProjections[lineIndex].isVisible()) {
|
|
611
|
-
// Could not reach a real line
|
|
612
|
-
// console.log('in -> out ' + inputLineNumber + ',' + inputColumn + ' ===> ' + 1 + ',' + 1);
|
|
613
|
-
// TODO@alexdima@hediet this isn't soo pretty
|
|
614
|
-
return new Position(allowZeroLineNumber ? 0 : 1, 1);
|
|
615
|
-
}
|
|
616
|
-
const deltaLineNumber = 1 + this.projectedModelLineLineCounts.getPrefixSum(lineIndex);
|
|
617
|
-
let r;
|
|
618
|
-
if (lineIndexChanged) {
|
|
619
|
-
if (belowHiddenRanges) {
|
|
620
|
-
r = this.modelLineProjections[lineIndex].getViewPositionOfModelPosition(deltaLineNumber, 1, affinity);
|
|
621
|
-
}
|
|
622
|
-
else {
|
|
623
|
-
r = this.modelLineProjections[lineIndex].getViewPositionOfModelPosition(deltaLineNumber, this.model.getLineMaxColumn(lineIndex + 1), affinity);
|
|
624
|
-
}
|
|
625
|
-
}
|
|
626
|
-
else {
|
|
627
|
-
r = this.modelLineProjections[inputLineNumber - 1].getViewPositionOfModelPosition(deltaLineNumber, inputColumn, affinity);
|
|
628
|
-
}
|
|
629
|
-
// console.log('in -> out ' + inputLineNumber + ',' + inputColumn + ' ===> ' + r.lineNumber + ',' + r);
|
|
630
|
-
return r;
|
|
631
|
-
}
|
|
632
|
-
/**
|
|
633
|
-
* @param affinity The affinity in case of an empty range. Has no effect for non-empty ranges.
|
|
634
|
-
*/
|
|
635
|
-
convertModelRangeToViewRange(modelRange, affinity = 0 /* PositionAffinity.Left */) {
|
|
636
|
-
if (modelRange.isEmpty()) {
|
|
637
|
-
const start = this.convertModelPositionToViewPosition(modelRange.startLineNumber, modelRange.startColumn, affinity);
|
|
638
|
-
return Range.fromPositions(start);
|
|
639
|
-
}
|
|
640
|
-
else {
|
|
641
|
-
const start = this.convertModelPositionToViewPosition(modelRange.startLineNumber, modelRange.startColumn, 1 /* PositionAffinity.Right */);
|
|
642
|
-
const end = this.convertModelPositionToViewPosition(modelRange.endLineNumber, modelRange.endColumn, 0 /* PositionAffinity.Left */);
|
|
643
|
-
return new Range(start.lineNumber, start.column, end.lineNumber, end.column);
|
|
644
|
-
}
|
|
645
|
-
}
|
|
646
|
-
getViewLineNumberOfModelPosition(modelLineNumber, modelColumn) {
|
|
647
|
-
let lineIndex = modelLineNumber - 1;
|
|
648
|
-
if (this.modelLineProjections[lineIndex].isVisible()) {
|
|
649
|
-
// this model line is visible
|
|
650
|
-
const deltaLineNumber = 1 + this.projectedModelLineLineCounts.getPrefixSum(lineIndex);
|
|
651
|
-
return this.modelLineProjections[lineIndex].getViewLineNumberOfModelPosition(deltaLineNumber, modelColumn);
|
|
652
|
-
}
|
|
653
|
-
// this model line is not visible
|
|
654
|
-
while (lineIndex > 0 && !this.modelLineProjections[lineIndex].isVisible()) {
|
|
655
|
-
lineIndex--;
|
|
656
|
-
}
|
|
657
|
-
if (lineIndex === 0 && !this.modelLineProjections[lineIndex].isVisible()) {
|
|
658
|
-
// Could not reach a real line
|
|
659
|
-
return 1;
|
|
660
|
-
}
|
|
661
|
-
const deltaLineNumber = 1 + this.projectedModelLineLineCounts.getPrefixSum(lineIndex);
|
|
662
|
-
return this.modelLineProjections[lineIndex].getViewLineNumberOfModelPosition(deltaLineNumber, this.model.getLineMaxColumn(lineIndex + 1));
|
|
663
|
-
}
|
|
664
|
-
getDecorationsInRange(range, ownerId, filterOutValidation, filterFontDecorations, onlyMinimapDecorations, onlyMarginDecorations) {
|
|
665
|
-
const modelStart = this.convertViewPositionToModelPosition(range.startLineNumber, range.startColumn);
|
|
666
|
-
const modelEnd = this.convertViewPositionToModelPosition(range.endLineNumber, range.endColumn);
|
|
667
|
-
if (modelEnd.lineNumber - modelStart.lineNumber <= range.endLineNumber - range.startLineNumber) {
|
|
668
|
-
// most likely there are no hidden lines => fast path
|
|
669
|
-
// fetch decorations from column 1 to cover the case of wrapped lines that have whole line decorations at column 1
|
|
670
|
-
return this.model.getDecorationsInRange(new Range(modelStart.lineNumber, 1, modelEnd.lineNumber, modelEnd.column), ownerId, filterOutValidation, filterFontDecorations, onlyMinimapDecorations, onlyMarginDecorations);
|
|
671
|
-
}
|
|
672
|
-
let result = [];
|
|
673
|
-
const modelStartLineIndex = modelStart.lineNumber - 1;
|
|
674
|
-
const modelEndLineIndex = modelEnd.lineNumber - 1;
|
|
675
|
-
let reqStart = null;
|
|
676
|
-
for (let modelLineIndex = modelStartLineIndex; modelLineIndex <= modelEndLineIndex; modelLineIndex++) {
|
|
677
|
-
const line = this.modelLineProjections[modelLineIndex];
|
|
678
|
-
if (line.isVisible()) {
|
|
679
|
-
// merge into previous request
|
|
680
|
-
if (reqStart === null) {
|
|
681
|
-
reqStart = new Position(modelLineIndex + 1, modelLineIndex === modelStartLineIndex ? modelStart.column : 1);
|
|
682
|
-
}
|
|
683
|
-
}
|
|
684
|
-
else {
|
|
685
|
-
// hit invisible line => flush request
|
|
686
|
-
if (reqStart !== null) {
|
|
687
|
-
const maxLineColumn = this.model.getLineMaxColumn(modelLineIndex);
|
|
688
|
-
result = result.concat(this.model.getDecorationsInRange(new Range(reqStart.lineNumber, reqStart.column, modelLineIndex, maxLineColumn), ownerId, filterOutValidation, filterFontDecorations, onlyMinimapDecorations));
|
|
689
|
-
reqStart = null;
|
|
690
|
-
}
|
|
691
|
-
}
|
|
692
|
-
}
|
|
693
|
-
if (reqStart !== null) {
|
|
694
|
-
result = result.concat(this.model.getDecorationsInRange(new Range(reqStart.lineNumber, reqStart.column, modelEnd.lineNumber, modelEnd.column), ownerId, filterOutValidation, filterFontDecorations, onlyMinimapDecorations));
|
|
695
|
-
reqStart = null;
|
|
696
|
-
}
|
|
697
|
-
result.sort((a, b) => {
|
|
698
|
-
const res = Range.compareRangesUsingStarts(a.range, b.range);
|
|
699
|
-
if (res === 0) {
|
|
700
|
-
if (a.id < b.id) {
|
|
701
|
-
return -1;
|
|
702
|
-
}
|
|
703
|
-
if (a.id > b.id) {
|
|
704
|
-
return 1;
|
|
705
|
-
}
|
|
706
|
-
return 0;
|
|
707
|
-
}
|
|
708
|
-
return res;
|
|
709
|
-
});
|
|
710
|
-
// Eliminate duplicate decorations that might have intersected our visible ranges multiple times
|
|
711
|
-
const finalResult = [];
|
|
712
|
-
let finalResultLen = 0;
|
|
713
|
-
let prevDecId = null;
|
|
714
|
-
for (const dec of result) {
|
|
715
|
-
const decId = dec.id;
|
|
716
|
-
if (prevDecId === decId) {
|
|
717
|
-
// skip
|
|
718
|
-
continue;
|
|
719
|
-
}
|
|
720
|
-
prevDecId = decId;
|
|
721
|
-
finalResult[finalResultLen++] = dec;
|
|
722
|
-
}
|
|
723
|
-
return finalResult;
|
|
724
|
-
}
|
|
725
|
-
getInjectedTextAt(position) {
|
|
726
|
-
const info = this.getViewLineInfo(position.lineNumber);
|
|
727
|
-
return this.modelLineProjections[info.modelLineNumber - 1].getInjectedTextAt(info.modelLineWrappedLineIdx, position.column);
|
|
728
|
-
}
|
|
729
|
-
normalizePosition(position, affinity) {
|
|
730
|
-
const info = this.getViewLineInfo(position.lineNumber);
|
|
731
|
-
return this.modelLineProjections[info.modelLineNumber - 1].normalizePosition(info.modelLineWrappedLineIdx, position, affinity);
|
|
732
|
-
}
|
|
733
|
-
getLineIndentColumn(lineNumber) {
|
|
734
|
-
const info = this.getViewLineInfo(lineNumber);
|
|
735
|
-
if (info.modelLineWrappedLineIdx === 0) {
|
|
736
|
-
return this.model.getLineIndentColumn(info.modelLineNumber);
|
|
737
|
-
}
|
|
738
|
-
// wrapped lines have no indentation.
|
|
739
|
-
// We deliberately don't handle the case that indentation is wrapped
|
|
740
|
-
// to avoid two view lines reporting indentation for the very same model line.
|
|
741
|
-
return 0;
|
|
742
|
-
}
|
|
743
|
-
}
|
|
744
|
-
/**
|
|
745
|
-
* Overlapping unsorted ranges:
|
|
746
|
-
* [ ) [ ) [ )
|
|
747
|
-
* [ ) [ )
|
|
748
|
-
* ->
|
|
749
|
-
* Non overlapping sorted ranges:
|
|
750
|
-
* [ ) [ ) [ )
|
|
751
|
-
*
|
|
752
|
-
* Note: This function only considers line information! Columns are ignored.
|
|
753
|
-
*/
|
|
754
|
-
function normalizeLineRanges(ranges) {
|
|
755
|
-
if (ranges.length === 0) {
|
|
756
|
-
return [];
|
|
757
|
-
}
|
|
758
|
-
const sortedRanges = ranges.slice();
|
|
759
|
-
sortedRanges.sort(Range.compareRangesUsingStarts);
|
|
760
|
-
const result = [];
|
|
761
|
-
let currentRangeStart = sortedRanges[0].startLineNumber;
|
|
762
|
-
let currentRangeEnd = sortedRanges[0].endLineNumber;
|
|
763
|
-
for (let i = 1, len = sortedRanges.length; i < len; i++) {
|
|
764
|
-
const range = sortedRanges[i];
|
|
765
|
-
if (range.startLineNumber > currentRangeEnd + 1) {
|
|
766
|
-
result.push(new Range(currentRangeStart, 1, currentRangeEnd, 1));
|
|
767
|
-
currentRangeStart = range.startLineNumber;
|
|
768
|
-
currentRangeEnd = range.endLineNumber;
|
|
769
|
-
}
|
|
770
|
-
else if (range.endLineNumber > currentRangeEnd) {
|
|
771
|
-
currentRangeEnd = range.endLineNumber;
|
|
772
|
-
}
|
|
773
|
-
}
|
|
774
|
-
result.push(new Range(currentRangeStart, 1, currentRangeEnd, 1));
|
|
775
|
-
return result;
|
|
776
|
-
}
|
|
777
|
-
/**
|
|
778
|
-
* Represents a view line. Can be used to efficiently query more information about it.
|
|
779
|
-
*/
|
|
780
|
-
class ViewLineInfo {
|
|
781
|
-
constructor(modelLineNumber, modelLineWrappedLineIdx) {
|
|
782
|
-
this.modelLineNumber = modelLineNumber;
|
|
783
|
-
this.modelLineWrappedLineIdx = modelLineWrappedLineIdx;
|
|
784
|
-
}
|
|
785
|
-
}
|
|
786
|
-
/**
|
|
787
|
-
* A list of view lines that have a contiguous span in the model.
|
|
788
|
-
*/
|
|
789
|
-
class ViewLineInfoGroupedByModelRange {
|
|
790
|
-
constructor(modelRange, viewLines) {
|
|
791
|
-
this.modelRange = modelRange;
|
|
792
|
-
this.viewLines = viewLines;
|
|
793
|
-
}
|
|
794
|
-
}
|
|
795
|
-
class CoordinatesConverter {
|
|
796
|
-
constructor(lines) {
|
|
797
|
-
this._lines = lines;
|
|
798
|
-
}
|
|
799
|
-
// View -> Model conversion and related methods
|
|
800
|
-
convertViewPositionToModelPosition(viewPosition) {
|
|
801
|
-
return this._lines.convertViewPositionToModelPosition(viewPosition.lineNumber, viewPosition.column);
|
|
802
|
-
}
|
|
803
|
-
convertViewRangeToModelRange(viewRange) {
|
|
804
|
-
return this._lines.convertViewRangeToModelRange(viewRange);
|
|
805
|
-
}
|
|
806
|
-
validateViewPosition(viewPosition, expectedModelPosition) {
|
|
807
|
-
return this._lines.validateViewPosition(viewPosition.lineNumber, viewPosition.column, expectedModelPosition);
|
|
808
|
-
}
|
|
809
|
-
validateViewRange(viewRange, expectedModelRange) {
|
|
810
|
-
return this._lines.validateViewRange(viewRange, expectedModelRange);
|
|
811
|
-
}
|
|
812
|
-
// Model -> View conversion and related methods
|
|
813
|
-
convertModelPositionToViewPosition(modelPosition, affinity, allowZero, belowHiddenRanges) {
|
|
814
|
-
return this._lines.convertModelPositionToViewPosition(modelPosition.lineNumber, modelPosition.column, affinity, allowZero, belowHiddenRanges);
|
|
815
|
-
}
|
|
816
|
-
convertModelRangeToViewRange(modelRange, affinity) {
|
|
817
|
-
return this._lines.convertModelRangeToViewRange(modelRange, affinity);
|
|
818
|
-
}
|
|
819
|
-
modelPositionIsVisible(modelPosition) {
|
|
820
|
-
return this._lines.modelPositionIsVisible(modelPosition.lineNumber, modelPosition.column);
|
|
821
|
-
}
|
|
822
|
-
getModelLineViewLineCount(modelLineNumber) {
|
|
823
|
-
return this._lines.getModelLineViewLineCount(modelLineNumber);
|
|
824
|
-
}
|
|
825
|
-
getViewLineNumberOfModelPosition(modelLineNumber, modelColumn) {
|
|
826
|
-
return this._lines.getViewLineNumberOfModelPosition(modelLineNumber, modelColumn);
|
|
827
|
-
}
|
|
828
|
-
}
|
|
829
|
-
class ViewModelLinesFromModelAsIs {
|
|
830
|
-
constructor(model) {
|
|
831
|
-
this.model = model;
|
|
832
|
-
}
|
|
833
|
-
dispose() {
|
|
834
|
-
}
|
|
835
|
-
createCoordinatesConverter() {
|
|
836
|
-
return new IdentityCoordinatesConverter(this.model);
|
|
837
|
-
}
|
|
838
|
-
getHiddenAreas() {
|
|
839
|
-
return [];
|
|
840
|
-
}
|
|
841
|
-
setHiddenAreas(_ranges) {
|
|
842
|
-
return false;
|
|
843
|
-
}
|
|
844
|
-
setTabSize(_newTabSize) {
|
|
845
|
-
return false;
|
|
846
|
-
}
|
|
847
|
-
setWrappingSettings(_fontInfo, _wrappingStrategy, _wrappingColumn, _wrappingIndent) {
|
|
848
|
-
return false;
|
|
849
|
-
}
|
|
850
|
-
createLineBreaksComputer() {
|
|
851
|
-
const result = [];
|
|
852
|
-
return {
|
|
853
|
-
addRequest: (lineText, injectedText, previousLineBreakData) => {
|
|
854
|
-
result.push(null);
|
|
855
|
-
},
|
|
856
|
-
finalize: () => {
|
|
857
|
-
return result;
|
|
858
|
-
}
|
|
859
|
-
};
|
|
860
|
-
}
|
|
861
|
-
onModelFlushed() {
|
|
862
|
-
}
|
|
863
|
-
onModelLinesDeleted(_versionId, fromLineNumber, toLineNumber) {
|
|
864
|
-
return new ViewLinesDeletedEvent(fromLineNumber, toLineNumber);
|
|
865
|
-
}
|
|
866
|
-
onModelLinesInserted(_versionId, fromLineNumber, toLineNumber, lineBreaks) {
|
|
867
|
-
return new ViewLinesInsertedEvent(fromLineNumber, toLineNumber);
|
|
868
|
-
}
|
|
869
|
-
onModelLineChanged(_versionId, lineNumber, lineBreakData) {
|
|
870
|
-
return [false, new ViewLinesChangedEvent(lineNumber, 1), null, null];
|
|
871
|
-
}
|
|
872
|
-
acceptVersionId(_versionId) {
|
|
873
|
-
}
|
|
874
|
-
getViewLineCount() {
|
|
875
|
-
return this.model.getLineCount();
|
|
876
|
-
}
|
|
877
|
-
getActiveIndentGuide(viewLineNumber, _minLineNumber, _maxLineNumber) {
|
|
878
|
-
return {
|
|
879
|
-
startLineNumber: viewLineNumber,
|
|
880
|
-
endLineNumber: viewLineNumber,
|
|
881
|
-
indent: 0
|
|
882
|
-
};
|
|
883
|
-
}
|
|
884
|
-
getViewLinesBracketGuides(startLineNumber, endLineNumber, activePosition) {
|
|
885
|
-
return new Array(endLineNumber - startLineNumber + 1).fill([]);
|
|
886
|
-
}
|
|
887
|
-
getViewLinesIndentGuides(viewStartLineNumber, viewEndLineNumber) {
|
|
888
|
-
const viewLineCount = viewEndLineNumber - viewStartLineNumber + 1;
|
|
889
|
-
const result = new Array(viewLineCount);
|
|
890
|
-
for (let i = 0; i < viewLineCount; i++) {
|
|
891
|
-
result[i] = 0;
|
|
892
|
-
}
|
|
893
|
-
return result;
|
|
894
|
-
}
|
|
895
|
-
getViewLineContent(viewLineNumber) {
|
|
896
|
-
return this.model.getLineContent(viewLineNumber);
|
|
897
|
-
}
|
|
898
|
-
getViewLineLength(viewLineNumber) {
|
|
899
|
-
return this.model.getLineLength(viewLineNumber);
|
|
900
|
-
}
|
|
901
|
-
getViewLineMinColumn(viewLineNumber) {
|
|
902
|
-
return this.model.getLineMinColumn(viewLineNumber);
|
|
903
|
-
}
|
|
904
|
-
getViewLineMaxColumn(viewLineNumber) {
|
|
905
|
-
return this.model.getLineMaxColumn(viewLineNumber);
|
|
906
|
-
}
|
|
907
|
-
getViewLineData(viewLineNumber) {
|
|
908
|
-
const lineTokens = this.model.tokenization.getLineTokens(viewLineNumber);
|
|
909
|
-
const lineContent = lineTokens.getLineContent();
|
|
910
|
-
return new ViewLineData(lineContent, false, 1, lineContent.length + 1, 0, lineTokens.inflate(), null);
|
|
911
|
-
}
|
|
912
|
-
getViewLinesData(viewStartLineNumber, viewEndLineNumber, needed) {
|
|
913
|
-
const lineCount = this.model.getLineCount();
|
|
914
|
-
viewStartLineNumber = Math.min(Math.max(1, viewStartLineNumber), lineCount);
|
|
915
|
-
viewEndLineNumber = Math.min(Math.max(1, viewEndLineNumber), lineCount);
|
|
916
|
-
const result = [];
|
|
917
|
-
for (let lineNumber = viewStartLineNumber; lineNumber <= viewEndLineNumber; lineNumber++) {
|
|
918
|
-
const idx = lineNumber - viewStartLineNumber;
|
|
919
|
-
result[idx] = needed[idx] ? this.getViewLineData(lineNumber) : null;
|
|
920
|
-
}
|
|
921
|
-
return result;
|
|
922
|
-
}
|
|
923
|
-
getDecorationsInRange(range, ownerId, filterOutValidation, filterFontDecorations, onlyMinimapDecorations, onlyMarginDecorations) {
|
|
924
|
-
return this.model.getDecorationsInRange(range, ownerId, filterOutValidation, filterFontDecorations, onlyMinimapDecorations, onlyMarginDecorations);
|
|
925
|
-
}
|
|
926
|
-
normalizePosition(position, affinity) {
|
|
927
|
-
return this.model.normalizePosition(position, affinity);
|
|
928
|
-
}
|
|
929
|
-
getLineIndentColumn(lineNumber) {
|
|
930
|
-
return this.model.getLineIndentColumn(lineNumber);
|
|
931
|
-
}
|
|
932
|
-
getInjectedTextAt(position) {
|
|
933
|
-
// Identity lines collection does not support injected text.
|
|
934
|
-
return null;
|
|
935
|
-
}
|
|
936
|
-
}
|
|
937
|
-
|
|
938
|
-
export { ViewModelLinesFromModelAsIs, ViewModelLinesFromProjectedModel };
|