diff --git a/src/vs/editor/common/viewModel/splitLinesCollection.ts b/src/vs/editor/common/viewModel/splitLinesCollection.ts index 0704e236922437af0e3a08df964f27d61e6f04a4..3cd2afbafaf85035399b13dfb540a97452f7de5a 100644 --- a/src/vs/editor/common/viewModel/splitLinesCollection.ts +++ b/src/vs/editor/common/viewModel/splitLinesCollection.ts @@ -129,9 +129,7 @@ export class CoordinatesConverter implements ICoordinatesConverter { } public convertModelRangeToViewRange(modelRange: Range): Range { - let start = this._lines.convertModelPositionToViewPosition(modelRange.startLineNumber, modelRange.startColumn); - let end = this._lines.convertModelPositionToViewPosition(modelRange.endLineNumber, modelRange.endColumn); - return new Range(start.lineNumber, start.column, end.lineNumber, end.column); + return this._lines.convertModelRangeToViewRange(modelRange); } public modelPositionIsVisible(modelPosition: Position): boolean { @@ -737,9 +735,9 @@ export class SplitLinesCollection implements IViewModelLinesCollection { public convertModelPositionToViewPosition(_modelLineNumber: number, _modelColumn: number): Position { this._ensureValidState(); - let validPosition = this.model.validatePosition(new Position(_modelLineNumber, _modelColumn)); - let inputLineNumber = validPosition.lineNumber; - let inputColumn = validPosition.column; + const validPosition = this.model.validatePosition(new Position(_modelLineNumber, _modelColumn)); + const inputLineNumber = validPosition.lineNumber; + const inputColumn = validPosition.column; let lineIndex = inputLineNumber - 1, lineIndexChanged = false; while (lineIndex > 0 && !this.lines[lineIndex].isVisible()) { @@ -751,7 +749,7 @@ export class SplitLinesCollection implements IViewModelLinesCollection { // console.log('in -> out ' + inputLineNumber + ',' + inputColumn + ' ===> ' + 1 + ',' + 1); return new Position(1, 1); } - let deltaLineNumber = 1 + (lineIndex === 0 ? 0 : this.prefixSumComputer.getAccumulatedValue(lineIndex - 1)); + const deltaLineNumber = 1 + (lineIndex === 0 ? 0 : this.prefixSumComputer.getAccumulatedValue(lineIndex - 1)); let r: Position; if (lineIndexChanged) { @@ -764,6 +762,19 @@ export class SplitLinesCollection implements IViewModelLinesCollection { return r; } + public convertModelRangeToViewRange(modelRange: Range): Range { + let start = this.convertModelPositionToViewPosition(modelRange.startLineNumber, modelRange.startColumn); + let end = this.convertModelPositionToViewPosition(modelRange.endLineNumber, modelRange.endColumn); + if (modelRange.startLineNumber === modelRange.endLineNumber && start.lineNumber !== end.lineNumber) { + // This is a single line range that ends up taking more lines due to wrapping + if (end.column === this.getViewLineMinColumn(end.lineNumber)) { + // the end column lands on the first column of the next line + return new Range(start.lineNumber, start.column, end.lineNumber - 1, this.getViewLineMaxColumn(end.lineNumber - 1)); + } + } + return new Range(start.lineNumber, start.column, end.lineNumber, end.column); + } + private _getViewLineNumberForModelPosition(inputLineNumber: number, inputColumn: number): number { let lineIndex = inputLineNumber - 1; if (this.lines[lineIndex].isVisible()) { diff --git a/src/vs/editor/test/common/viewModel/viewModelDecorations.test.ts b/src/vs/editor/test/common/viewModel/viewModelDecorations.test.ts index 9aab952c372f1ce21294df4a3aa2f0bb263af704..099e4d4e915d536ddaa84a51a3b3734ce1efb1ad 100644 --- a/src/vs/editor/test/common/viewModel/viewModelDecorations.test.ts +++ b/src/vs/editor/test/common/viewModel/viewModelDecorations.test.ts @@ -103,16 +103,6 @@ suite('ViewModelDecorations', () => { // view line 2: (1,14 -> 1,24) assert.deepEqual(inlineDecorations1, [ - { - range: new Range(1, 2, 2, 1), - inlineClassName: 'i-dec2', - type: InlineDecorationType.Regular - }, - { - range: new Range(2, 1, 2, 1), - inlineClassName: 'a-dec2', - type: InlineDecorationType.After - }, { range: new Range(1, 2, 2, 2), inlineClassName: 'i-dec3', @@ -124,7 +114,7 @@ suite('ViewModelDecorations', () => { type: InlineDecorationType.After }, { - range: new Range(1, 2, 4, 1), + range: new Range(1, 2, 3, 13), inlineClassName: 'i-dec4', type: InlineDecorationType.Regular }, @@ -164,7 +154,7 @@ suite('ViewModelDecorations', () => { type: InlineDecorationType.After }, { - range: new Range(2, 1, 4, 1), + range: new Range(2, 1, 3, 13), inlineClassName: 'i-dec8', type: InlineDecorationType.Regular }, @@ -199,7 +189,7 @@ suite('ViewModelDecorations', () => { type: InlineDecorationType.After }, { - range: new Range(2, 3, 4, 1), + range: new Range(2, 3, 3, 13), inlineClassName: 'i-dec11', type: InlineDecorationType.Regular }, @@ -228,30 +218,45 @@ suite('ViewModelDecorations', () => { // view line 3 (24 -> 36) assert.deepEqual(inlineDecorations2, [ { - range: new Range(1, 2, 4, 1), + range: new Range(1, 2, 3, 13), inlineClassName: 'i-dec4', type: InlineDecorationType.Regular }, + { + range: new Range(3, 13, 3, 13), + inlineClassName: 'a-dec4', + type: InlineDecorationType.After + }, { range: new Range(1, 2, 5, 8), inlineClassName: 'i-dec5', type: InlineDecorationType.Regular }, { - range: new Range(2, 1, 4, 1), + range: new Range(2, 1, 3, 13), inlineClassName: 'i-dec8', type: InlineDecorationType.Regular }, + { + range: new Range(3, 13, 3, 13), + inlineClassName: 'a-dec8', + type: InlineDecorationType.After + }, { range: new Range(2, 1, 5, 8), inlineClassName: 'i-dec9', type: InlineDecorationType.Regular }, { - range: new Range(2, 3, 4, 1), + range: new Range(2, 3, 3, 13), inlineClassName: 'i-dec11', type: InlineDecorationType.Regular }, + { + range: new Range(3, 13, 3, 13), + inlineClassName: 'a-dec11', + type: InlineDecorationType.After + }, { range: new Range(2, 3, 5, 8), inlineClassName: 'i-dec12',