Skip to content

Commit 351409e

Browse files
committed
When a decoration and injected text refer to the same model position, injected text is preferred. This resolves a conflict with gitlens.
1 parent 2a893be commit 351409e

File tree

3 files changed

+20
-12
lines changed

3 files changed

+20
-12
lines changed

src/vs/editor/common/viewModel/splitLinesCollection.ts

+9-6
Original file line numberDiff line numberDiff line change
@@ -118,12 +118,12 @@ export class CoordinatesConverter implements ICoordinatesConverter {
118118

119119
// Model -> View conversion and related methods
120120

121-
public convertModelPositionToViewPosition(modelPosition: Position): Position {
122-
return this._lines.convertModelPositionToViewPosition(modelPosition.lineNumber, modelPosition.column);
121+
public convertModelPositionToViewPosition(modelPosition: Position, affinity?: PositionAffinity): Position {
122+
return this._lines.convertModelPositionToViewPosition(modelPosition.lineNumber, modelPosition.column, affinity);
123123
}
124124

125-
public convertModelRangeToViewRange(modelRange: Range): Range {
126-
return this._lines.convertModelRangeToViewRange(modelRange);
125+
public convertModelRangeToViewRange(modelRange: Range, affinity?: PositionAffinity): Range {
126+
return this._lines.convertModelRangeToViewRange(modelRange, affinity);
127127
}
128128

129129
public modelPositionIsVisible(modelPosition: Position): boolean {
@@ -886,9 +886,12 @@ export class SplitLinesCollection implements IViewModelLinesCollection {
886886
return r;
887887
}
888888

889-
public convertModelRangeToViewRange(modelRange: Range): Range {
889+
/**
890+
* @param affinity The affinity in case of an empty range. Has no effect for non-empty ranges.
891+
*/
892+
public convertModelRangeToViewRange(modelRange: Range, affinity: PositionAffinity = PositionAffinity.Left): Range {
890893
if (modelRange.isEmpty()) {
891-
const start = this.convertModelPositionToViewPosition(modelRange.startLineNumber, modelRange.startColumn, PositionAffinity.Left);
894+
const start = this.convertModelPositionToViewPosition(modelRange.startLineNumber, modelRange.startColumn, affinity);
892895
return Range.fromPositions(start);
893896
} else {
894897
const start = this.convertModelPositionToViewPosition(modelRange.startLineNumber, modelRange.startColumn, PositionAffinity.Right);

src/vs/editor/common/viewModel/viewModel.ts

+5-2
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,11 @@ export interface ICoordinatesConverter {
8282
validateViewRange(viewRange: Range, expectedModelRange: Range): Range;
8383

8484
// Model -> View conversion and related methods
85-
convertModelPositionToViewPosition(modelPosition: Position): Position;
86-
convertModelRangeToViewRange(modelRange: Range): Range;
85+
convertModelPositionToViewPosition(modelPosition: Position, affinity?: PositionAffinity): Position;
86+
/**
87+
* @param affinity Only has an effect if the range is empty.
88+
*/
89+
convertModelRangeToViewRange(modelRange: Range, affinity?: PositionAffinity): Range;
8790
modelPositionIsVisible(modelPosition: Position): boolean;
8891
getModelLineViewLineCount(modelLineNumber: number): number;
8992
}

src/vs/editor/common/viewModel/viewModelDecorations.ts

+6-4
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { IDisposable } from 'vs/base/common/lifecycle';
77
import { Position } from 'vs/editor/common/core/position';
88
import { Range } from 'vs/editor/common/core/range';
99
import * as editorCommon from 'vs/editor/common/editorCommon';
10-
import { IModelDecoration, ITextModel } from 'vs/editor/common/model';
10+
import { IModelDecoration, ITextModel, PositionAffinity } from 'vs/editor/common/model';
1111
import { IViewModelLinesCollection } from 'vs/editor/common/viewModel/splitLinesCollection';
1212
import { ICoordinatesConverter, InlineDecoration, InlineDecorationType, ViewModelDecoration } from 'vs/editor/common/viewModel/viewModel';
1313
import { filterValidationDecorations } from 'vs/editor/common/config/editorOptions';
@@ -81,11 +81,13 @@ export class ViewModelDecorations implements IDisposable {
8181
const options = modelDecoration.options;
8282
let viewRange: Range;
8383
if (options.isWholeLine) {
84-
const start = this._coordinatesConverter.convertModelPositionToViewPosition(new Position(modelRange.startLineNumber, 1));
85-
const end = this._coordinatesConverter.convertModelPositionToViewPosition(new Position(modelRange.endLineNumber, this.model.getLineMaxColumn(modelRange.endLineNumber)));
84+
const start = this._coordinatesConverter.convertModelPositionToViewPosition(new Position(modelRange.startLineNumber, 1), PositionAffinity.Left);
85+
const end = this._coordinatesConverter.convertModelPositionToViewPosition(new Position(modelRange.endLineNumber, this.model.getLineMaxColumn(modelRange.endLineNumber)), PositionAffinity.Right);
8686
viewRange = new Range(start.lineNumber, start.column, end.lineNumber, end.column);
8787
} else {
88-
viewRange = this._coordinatesConverter.convertModelRangeToViewRange(modelRange);
88+
// For backwards compatibility reasons, we want injected text before any decoration.
89+
// Thus, move decorations to the right.
90+
viewRange = this._coordinatesConverter.convertModelRangeToViewRange(modelRange, PositionAffinity.Right);
8991
}
9092
r = new ViewModelDecoration(viewRange, options);
9193
this._decorationsCache[id] = r;

0 commit comments

Comments
 (0)