diff --git a/src/vs/editor/common/controller/cursor.ts b/src/vs/editor/common/controller/cursor.ts index dc8ed10c13a37cc3cea6ca75b0c1e75918c71b72..89278fc16c42b844475fc5dbb5b296a9975dacba 100644 --- a/src/vs/editor/common/controller/cursor.ts +++ b/src/vs/editor/common/controller/cursor.ts @@ -495,8 +495,8 @@ export class Cursor extends EventEmitter { } var l = ctx.selectionStartMarkers.length; - ctx.selectionStartMarkers[l] = this.model._addMarker(selection.selectionStartLineNumber, selection.selectionStartColumn, selectionMarkerStickToPreviousCharacter); - ctx.positionMarkers[l] = this.model._addMarker(selection.positionLineNumber, selection.positionColumn, positionMarkerStickToPreviousCharacter); + ctx.selectionStartMarkers[l] = this.model._addMarker(null, selection.selectionStartLineNumber, selection.selectionStartColumn, selectionMarkerStickToPreviousCharacter); + ctx.positionMarkers[l] = this.model._addMarker(null, selection.positionLineNumber, selection.positionColumn, positionMarkerStickToPreviousCharacter); return l.toString(); }; diff --git a/src/vs/editor/common/controller/oneCursor.ts b/src/vs/editor/common/controller/oneCursor.ts index 641964dc32b3af6d8aa1cbc8f04dfa265483a558..966b9d9811bbf5453c006eeb9f9e19e27f1a3c7e 100644 --- a/src/vs/editor/common/controller/oneCursor.ts +++ b/src/vs/editor/common/controller/oneCursor.ts @@ -221,7 +221,7 @@ export class OneCursor implements IOneCursor { private _ensureMarker(markerId: string, lineNumber: number, column: number, stickToPreviousCharacter: boolean): string { if (!markerId) { - return this.model._addMarker(lineNumber, column, stickToPreviousCharacter); + return this.model._addMarker(null, lineNumber, column, stickToPreviousCharacter); } else { this.model._changeMarker(markerId, lineNumber, column); this.model._changeMarkerStickiness(markerId, stickToPreviousCharacter); diff --git a/src/vs/editor/common/editorCommon.ts b/src/vs/editor/common/editorCommon.ts index fc922d14a75d3fbb599e9e0c00ffaa8a8f451978..f2c4ae7fc969af07a36f7eb9a082798b10ffee51 100644 --- a/src/vs/editor/common/editorCommon.ts +++ b/src/vs/editor/common/editorCommon.ts @@ -1958,7 +1958,7 @@ export interface ITextModelWithMarkers extends ITextModel { /** * @internal */ - _addMarker(lineNumber: number, column: number, stickToPreviousCharacter: boolean): string; + _addMarker(rangeId: string, lineNumber: number, column: number, stickToPreviousCharacter: boolean): string; /** * @internal */ diff --git a/src/vs/editor/common/model/modelLine.ts b/src/vs/editor/common/model/modelLine.ts index a96a1b4fbc90263a7effa8ae0df5da4421541454..c7c434e2744681969bad32691a6bd93fbc06f309 100644 --- a/src/vs/editor/common/model/modelLine.ts +++ b/src/vs/editor/common/model/modelLine.ts @@ -28,8 +28,9 @@ export class LineMarker { public stickToPreviousCharacter: boolean; public line: ModelLine; - constructor(id: string, column: number, stickToPreviousCharacter: boolean) { + constructor(id: string, rangeId: string, column: number, stickToPreviousCharacter: boolean) { this.id = id; + this.rangeId = rangeId; this.column = column; this.stickToPreviousCharacter = stickToPreviousCharacter; this.line = null; diff --git a/src/vs/editor/common/model/textModelWithMarkers.ts b/src/vs/editor/common/model/textModelWithMarkers.ts index 5a498c77780b9eff24d5346f03129be4b3e26d81..9e91cacb05395bc7abefb3bd9fad2b572ab447b3 100644 --- a/src/vs/editor/common/model/textModelWithMarkers.ts +++ b/src/vs/editor/common/model/textModelWithMarkers.ts @@ -15,6 +15,7 @@ export interface IMarkerIdToMarkerMap { } export interface INewMarker { + rangeId: string; lineNumber: number; column: number; stickToPreviousCharacter: boolean; @@ -44,10 +45,10 @@ export class TextModelWithMarkers extends TextModelWithTokens implements ITextMo this._markerIdToMarker = {}; } - _addMarker(lineNumber: number, column: number, stickToPreviousCharacter: boolean): string { + _addMarker(rangeId: string, lineNumber: number, column: number, stickToPreviousCharacter: boolean): string { var pos = this.validatePosition(new Position(lineNumber, column)); - var marker = new LineMarker(this._markerIdGenerator.nextId(), pos.column, stickToPreviousCharacter); + var marker = new LineMarker(this._markerIdGenerator.nextId(), rangeId, pos.column, stickToPreviousCharacter); this._markerIdToMarker[marker.id] = marker; this._lines[pos.lineNumber - 1].addMarker(marker); @@ -64,7 +65,7 @@ export class TextModelWithMarkers extends TextModelWithTokens implements ITextMo for (let i = 0, len = newMarkers.length; i < len; i++) { let newMarker = newMarkers[i]; - let marker = new LineMarker(this._markerIdGenerator.nextId(), newMarker.column, newMarker.stickToPreviousCharacter); + let marker = new LineMarker(this._markerIdGenerator.nextId(), newMarker.rangeId, newMarker.column, newMarker.stickToPreviousCharacter); this._markerIdToMarker[marker.id] = marker; if (!addMarkersPerLine[newMarker.lineNumber]) { diff --git a/src/vs/editor/common/model/textModelWithTrackedRanges.ts b/src/vs/editor/common/model/textModelWithTrackedRanges.ts index 483cc8e65ec1e91b2ce52713bd7d11de7badaaf5..8b3b024d5bbee68cfb23004829e4d7c302d6353d 100644 --- a/src/vs/editor/common/model/textModelWithTrackedRanges.ts +++ b/src/vs/editor/common/model/textModelWithTrackedRanges.ts @@ -21,14 +21,10 @@ interface ITrackedRangesMap { [key: string]: ITrackedRange; } -interface IMarkerIdToRangeIdMap { - [key: string]: string; -} - class TrackedRange implements ITrackedRange { - id: string; - startMarkerId: string; - endMarkerId: string; + public readonly id: string; + public readonly startMarkerId: string; + public readonly endMarkerId: string; constructor(id: string, startMarkedId: string, endMarkerId: string) { this.id = id; @@ -43,20 +39,17 @@ export class TextModelWithTrackedRanges extends TextModelWithMarkers implements private _rangeIdGenerator: IdGenerator; private _ranges: ITrackedRangesMap; - private _markerIdToRangeId: IMarkerIdToRangeIdMap; private _multiLineTrackedRanges: { [key: string]: boolean; }; constructor(allowedEventTypes: string[], rawText: editorCommon.IRawText, languageId: string) { super(allowedEventTypes, rawText, languageId); this._rangeIdGenerator = new IdGenerator((++_INSTANCE_COUNT) + ';'); this._ranges = {}; - this._markerIdToRangeId = {}; this._multiLineTrackedRanges = {}; } public dispose(): void { this._ranges = null; - this._markerIdToRangeId = null; this._multiLineTrackedRanges = null; super.dispose(); } @@ -66,7 +59,6 @@ export class TextModelWithTrackedRanges extends TextModelWithMarkers implements // Destroy all my tracked ranges this._ranges = {}; - this._markerIdToRangeId = {}; this._multiLineTrackedRanges = {}; } @@ -97,19 +89,19 @@ export class TextModelWithTrackedRanges extends TextModelWithMarkers implements return Object.keys(this._ranges).length; } - public addTrackedRange(textRange: editorCommon.IRange, stickiness: editorCommon.TrackedRangeStickiness): string { - textRange = this.validateRange(textRange); + public addTrackedRange(_textRange: editorCommon.IRange, stickiness: editorCommon.TrackedRangeStickiness): string { + let textRange = this.validateRange(_textRange); + + let startMarkerSticksToPreviousCharacter = this._shouldStartMarkerSticksToPreviousCharacter(stickiness); + let endMarkerSticksToPreviousCharacter = this._shouldEndMarkerSticksToPreviousCharacter(stickiness); - var startMarkerSticksToPreviousCharacter = this._shouldStartMarkerSticksToPreviousCharacter(stickiness); - var endMarkerSticksToPreviousCharacter = this._shouldEndMarkerSticksToPreviousCharacter(stickiness); + let rangeId = this._rangeIdGenerator.nextId(); - var startMarkerId = this._addMarker(textRange.startLineNumber, textRange.startColumn, startMarkerSticksToPreviousCharacter); - var endMarkerId = this._addMarker(textRange.endLineNumber, textRange.endColumn, endMarkerSticksToPreviousCharacter); + let startMarkerId = this._addMarker(rangeId, textRange.startLineNumber, textRange.startColumn, startMarkerSticksToPreviousCharacter); + let endMarkerId = this._addMarker(rangeId, textRange.endLineNumber, textRange.endColumn, endMarkerSticksToPreviousCharacter); - var range = new TrackedRange(this._rangeIdGenerator.nextId(), startMarkerId, endMarkerId); + let range = new TrackedRange(rangeId, startMarkerId, endMarkerId); this._ranges[range.id] = range; - this._markerIdToRangeId[startMarkerId] = range.id; - this._markerIdToRangeId[endMarkerId] = range.id; this._setRangeIsMultiLine(range.id, (textRange.startLineNumber !== textRange.endLineNumber)); @@ -118,20 +110,26 @@ export class TextModelWithTrackedRanges extends TextModelWithMarkers implements protected _addTrackedRanges(textRanges: editorCommon.IRange[], stickinessArr: editorCommon.TrackedRangeStickiness[]): string[] { let addMarkers: INewMarker[] = []; + let addRangeId: string[] = []; for (let i = 0, len = textRanges.length; i < len; i++) { let textRange = textRanges[i]; let stickiness = stickinessArr[i]; + let rangeId = this._rangeIdGenerator.nextId(); + addMarkers.push({ + rangeId: rangeId, lineNumber: textRange.startLineNumber, column: textRange.startColumn, stickToPreviousCharacter: this._shouldStartMarkerSticksToPreviousCharacter(stickiness) }); addMarkers.push({ + rangeId: rangeId, lineNumber: textRange.endLineNumber, column: textRange.endColumn, stickToPreviousCharacter: this._shouldEndMarkerSticksToPreviousCharacter(stickiness) }); + addRangeId.push(rangeId); } let markerIds = this._addMarkers(addMarkers); @@ -142,10 +140,8 @@ export class TextModelWithTrackedRanges extends TextModelWithMarkers implements let startMarkerId = markerIds[2 * i]; let endMarkerId = markerIds[2 * i + 1]; - let range = new TrackedRange(this._rangeIdGenerator.nextId(), startMarkerId, endMarkerId); + let range = new TrackedRange(addRangeId[i], startMarkerId, endMarkerId); this._ranges[range.id] = range; - this._markerIdToRangeId[startMarkerId] = range.id; - this._markerIdToRangeId[endMarkerId] = range.id; this._setRangeIsMultiLine(range.id, (textRange.startLineNumber !== textRange.endLineNumber)); @@ -191,8 +187,6 @@ export class TextModelWithTrackedRanges extends TextModelWithMarkers implements this._setRangeIsMultiLine(range.id, false); delete this._ranges[range.id]; - delete this._markerIdToRangeId[range.startMarkerId]; - delete this._markerIdToRangeId[range.endMarkerId]; } } @@ -213,8 +207,6 @@ export class TextModelWithTrackedRanges extends TextModelWithMarkers implements this._setRangeIsMultiLine(range.id, false); delete this._ranges[range.id]; - delete this._markerIdToRangeId[range.startMarkerId]; - delete this._markerIdToRangeId[range.endMarkerId]; } if (removeMarkers.length > 0) { @@ -272,31 +264,23 @@ export class TextModelWithTrackedRanges extends TextModelWithMarkers implements } public getLinesTrackedRanges(startLineNumber: number, endLineNumber: number): editorCommon.IModelTrackedRange[] { - var result = this._getMultiLineTrackedRanges(startLineNumber, endLineNumber), - resultMap: { [rangeId: string]: boolean; } = {}, - lineMarkers: LineMarker[], - lineMarker: LineMarker, - rangeId: string, - i: number, - len: number, - lineNumber: number, - startMarker: Position, - endMarker: Position; - - for (i = 0, len = result.length; i < len; i++) { + let result = this._getMultiLineTrackedRanges(startLineNumber, endLineNumber); + let resultMap: { [rangeId: string]: boolean; } = {}; + + for (let i = 0, len = result.length; i < len; i++) { resultMap[result[i].id] = true; } - for (lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) { - lineMarkers = this._getLineMarkers(lineNumber); - for (i = 0, len = lineMarkers.length; i < len; i++) { - lineMarker = lineMarkers[i]; + for (let lineNumber = startLineNumber; lineNumber <= endLineNumber; lineNumber++) { + let lineMarkers = this._getLineMarkers(lineNumber); + for (let i = 0, len = lineMarkers.length; i < len; i++) { + let lineMarker = lineMarkers[i]; - if (this._markerIdToRangeId.hasOwnProperty(lineMarker.id)) { - rangeId = this._markerIdToRangeId[lineMarker.id]; + if (lineMarker.rangeId !== null) { + let rangeId = lineMarker.rangeId; if (!resultMap.hasOwnProperty(rangeId)) { - startMarker = this._getMarker(this._ranges[rangeId].startMarkerId); - endMarker = this._getMarker(this._ranges[rangeId].endMarkerId); + let startMarker = this._getMarker(this._ranges[rangeId].startMarkerId); + let endMarker = this._getMarker(this._ranges[rangeId].endMarkerId); result.push({ id: rangeId, @@ -317,8 +301,8 @@ export class TextModelWithTrackedRanges extends TextModelWithMarkers implements for (let i = 0, len = changedMarkers.length; i < len; i++) { let marker = changedMarkers[i]; - if (this._markerIdToRangeId.hasOwnProperty(marker.id)) { - let rangeId = this._markerIdToRangeId[marker.id]; + if (marker.rangeId !== null) { + let rangeId = marker.rangeId; changedRanges[changedRangesLen++] = rangeId; } diff --git a/src/vs/editor/test/common/commands/sideEditing.test.ts b/src/vs/editor/test/common/commands/sideEditing.test.ts index 817b6f5c34b83e7f193f4fbdc66587bacb8f00c7..9aceb6c8a570f27c5d3d80045f60809696163dba 100644 --- a/src/vs/editor/test/common/commands/sideEditing.test.ts +++ b/src/vs/editor/test/common/commands/sideEditing.test.ts @@ -40,7 +40,7 @@ function testCommand(lines: string[], selection: Selection, edits: IIdentifiedSi function testLineEditMarker(text: string, column: number, stickToPreviousCharacter: boolean, edit: ILineEdit, expectedColumn: number): void { var line = new ModelLine(1, text, NO_TAB_SIZE); - line.addMarker(new LineMarker('1', column, stickToPreviousCharacter)); + line.addMarker(new LineMarker('1', null, column, stickToPreviousCharacter)); line.applyEdits({}, [edit], NO_TAB_SIZE); diff --git a/src/vs/editor/test/common/model/editableTextModel.test.ts b/src/vs/editor/test/common/model/editableTextModel.test.ts index 6d5351adcbd866a96a255d3abe9a2cdfa4836621..301b2f6378db8a60b1cc687794212cde0287a92c 100644 --- a/src/vs/editor/test/common/model/editableTextModel.test.ts +++ b/src/vs/editor/test/common/model/editableTextModel.test.ts @@ -1585,7 +1585,7 @@ suite('EditorModel - EditableTextModel.applyEdits & markers', () => { // Add markers markers.forEach((m) => { - let modelMarkerId = model._addMarker(m.lineNumber, m.column, m.stickToPreviousCharacter); + let modelMarkerId = model._addMarker(null, m.lineNumber, m.column, m.stickToPreviousCharacter); markerId2ModelMarkerId[m.id] = modelMarkerId; }); diff --git a/src/vs/editor/test/common/model/model.line.test.ts b/src/vs/editor/test/common/model/model.line.test.ts index 8be1f03891001f6fa92ea9e905915056d5e2bbd1..0f874e1302cad6252dabdad3942bcbcc96bc597a 100644 --- a/src/vs/editor/test/common/model/model.line.test.ts +++ b/src/vs/editor/test/common/model/model.line.test.ts @@ -1045,7 +1045,7 @@ interface ILightWeightMarker { suite('Editor Model - modelLine.applyEdits text & markers', () => { function marker(id: number, column: number, stickToPreviousCharacter: boolean): LineMarker { - return new LineMarker(String(id), column, stickToPreviousCharacter); + return new LineMarker(String(id), null, column, stickToPreviousCharacter); } function toLightWeightMarker(marker: LineMarker): ILightWeightMarker { @@ -1861,7 +1861,7 @@ suite('Editor Model - modelLine.applyEdits text & markers', () => { suite('Editor Model - modelLine.split text & markers', () => { function marker(id: number, column: number, stickToPreviousCharacter: boolean): LineMarker { - return new LineMarker(String(id), column, stickToPreviousCharacter); + return new LineMarker(String(id), null, column, stickToPreviousCharacter); } function toLightWeightMarker(marker: LineMarker): ILightWeightMarker { @@ -2129,7 +2129,7 @@ suite('Editor Model - modelLine.split text & markers', () => { suite('Editor Model - modelLine.append text & markers', () => { function marker(id: number, column: number, stickToPreviousCharacter: boolean): LineMarker { - return new LineMarker(String(id), column, stickToPreviousCharacter); + return new LineMarker(String(id), null, column, stickToPreviousCharacter); } function toLightWeightMarker(marker: LineMarker): ILightWeightMarker {