Skip to content

Commit 95fd5bf

Browse files
alexdimaaiday-mar
andauthored
Make sure to use view line numbers when fetching data from the view model (microsoft#156569)
Fixes microsoft#156413: Make sure to use view line numbers when fetching data from the view model Co-authored-by: aiday-mar <[email protected]> Co-authored-by: aiday-mar <[email protected]>
1 parent 0397ca4 commit 95fd5bf

File tree

4 files changed

+31
-14
lines changed

4 files changed

+31
-14
lines changed

src/vs/editor/common/viewModel.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ export interface IViewModel extends ICursorSimpleModel {
4242

4343
getDecorationsInViewport(visibleRange: Range): ViewModelDecoration[];
4444
getViewportViewLineRenderingData(visibleRange: Range, lineNumber: number): ViewLineRenderingData;
45+
getViewLineRenderingData(lineNumber: number): ViewLineRenderingData;
4546
getViewLineData(lineNumber: number): ViewLineData;
4647
getMinimapLinesRenderingData(startLineNumber: number, endLineNumber: number, needed: boolean[]): MinimapLinesRenderingData;
4748
getCompletelyVisibleViewRange(): Range;

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

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -100,17 +100,21 @@ export class ViewModelDecorations implements IDisposable {
100100
let cacheIsValid = (this._cachedModelDecorationsResolver !== null);
101101
cacheIsValid = cacheIsValid && (viewRange.equalsRange(this._cachedModelDecorationsResolverViewRange));
102102
if (!cacheIsValid) {
103-
this._cachedModelDecorationsResolver = this._getDecorationsViewportData(viewRange);
103+
this._cachedModelDecorationsResolver = this._getDecorationsInRange(viewRange);
104104
this._cachedModelDecorationsResolverViewRange = viewRange;
105105
}
106106
return this._cachedModelDecorationsResolver!;
107107
}
108108

109-
private _getDecorationsViewportData(viewportRange: Range): IDecorationsViewportData {
110-
const modelDecorations = this._linesCollection.getDecorationsInRange(viewportRange, this.editorId, filterValidationDecorations(this.configuration.options));
109+
public getInlineDecorationsOnLine(lineNumber: number): InlineDecoration[] {
110+
const range = new Range(lineNumber, this._linesCollection.getViewLineMinColumn(lineNumber), lineNumber, this._linesCollection.getViewLineMaxColumn(lineNumber));
111+
return this._getDecorationsInRange(range).inlineDecorations[0];
112+
}
111113

112-
const startLineNumber = viewportRange.startLineNumber;
113-
const endLineNumber = viewportRange.endLineNumber;
114+
private _getDecorationsInRange(viewRange: Range): IDecorationsViewportData {
115+
const modelDecorations = this._linesCollection.getDecorationsInRange(viewRange, this.editorId, filterValidationDecorations(this.configuration.options));
116+
const startLineNumber = viewRange.startLineNumber;
117+
const endLineNumber = viewRange.endLineNumber;
114118

115119
const decorationsInViewport: ViewModelDecoration[] = [];
116120
let decorationsInViewportLen = 0;

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

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ import { ViewLayout } from 'vs/editor/common/viewLayout/viewLayout';
3434
import { MinimapTokensColorTracker } from 'vs/editor/common/viewModel/minimapTokensColorTracker';
3535
import { ILineBreaksComputer, ILineBreaksComputerFactory, InjectedText } from 'vs/editor/common/modelLineProjectionData';
3636
import { ViewEventHandler } from 'vs/editor/common/viewEventHandler';
37-
import { ICoordinatesConverter, IViewModel, IWhitespaceChangeAccessor, MinimapLinesRenderingData, OverviewRulerDecorationsGroup, ViewLineData, ViewLineRenderingData, ViewModelDecoration } from 'vs/editor/common/viewModel';
37+
import { ICoordinatesConverter, InlineDecoration, IViewModel, IWhitespaceChangeAccessor, MinimapLinesRenderingData, OverviewRulerDecorationsGroup, ViewLineData, ViewLineRenderingData, ViewModelDecoration } from 'vs/editor/common/viewModel';
3838
import { ViewModelDecorations } from 'vs/editor/common/viewModel/viewModelDecorations';
3939
import { FocusChangedEvent, ModelContentChangedEvent, ModelDecorationsChangedEvent, ModelLanguageChangedEvent, ModelLanguageConfigurationChangedEvent, ModelOptionsChangedEvent, ModelTokensChangedEvent, OutgoingViewModelEvent, ReadOnlyEditAttemptEvent, ScrollChangedEvent, ViewModelEventDispatcher, ViewModelEventsCollector, ViewZonesChangedEvent } from 'vs/editor/common/viewModelEventDispatcher';
4040
import { IViewModelLines, ViewModelLinesFromModelAsIs, ViewModelLinesFromProjectedModel } from 'vs/editor/common/viewModel/viewModelLines';
@@ -680,12 +680,21 @@ export class ViewModel extends Disposable implements IViewModel {
680680
}
681681

682682
public getViewportViewLineRenderingData(visibleRange: Range, lineNumber: number): ViewLineRenderingData {
683+
const allInlineDecorations = this._decorations.getDecorationsViewportData(visibleRange).inlineDecorations;
684+
const inlineDecorations = allInlineDecorations[lineNumber - visibleRange.startLineNumber];
685+
return this._getViewLineRenderingData(lineNumber, inlineDecorations);
686+
}
687+
688+
public getViewLineRenderingData(lineNumber: number): ViewLineRenderingData {
689+
const inlineDecorations = this._decorations.getInlineDecorationsOnLine(lineNumber);
690+
return this._getViewLineRenderingData(lineNumber, inlineDecorations);
691+
}
692+
693+
private _getViewLineRenderingData(lineNumber: number, inlineDecorations: InlineDecoration[]): ViewLineRenderingData {
683694
const mightContainRTL = this.model.mightContainRTL();
684695
const mightContainNonBasicASCII = this.model.mightContainNonBasicASCII();
685696
const tabSize = this.getTabSize();
686697
const lineData = this._lines.getViewLineData(lineNumber);
687-
const allInlineDecorations = this._decorations.getDecorationsViewportData(visibleRange).inlineDecorations;
688-
let inlineDecorations = allInlineDecorations[lineNumber - visibleRange.startLineNumber];
689698

690699
if (lineData.inlineDecorations) {
691700
inlineDecorations = [

src/vs/editor/contrib/stickyScroll/browser/stickyScroll.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { SymbolKind } from 'vs/editor/common/languages';
1818
import { LineDecoration } from 'vs/editor/common/viewLayout/lineDecorations';
1919
import { RunOnceScheduler } from 'vs/base/common/async';
2020
import { IModelTokensChangedEvent } from 'vs/editor/common/textModelEvents';
21+
import { Position } from 'vs/editor/common/core/position';
2122

2223
class StickyScrollController extends Disposable implements IEditorContribution {
2324

@@ -201,12 +202,12 @@ class StickyScrollController extends Disposable implements IEditorContribution {
201202
if (!beginningLinesConsidered.has(start)) {
202203
if (topOfElementAtDepth >= topOfEndLine - 1 && topOfElementAtDepth < bottomOfEndLine - 2) {
203204
beginningLinesConsidered.add(start);
204-
this.stickyScrollWidget.pushCodeLine(new StickyScrollCodeLine(model.getLineContent(start), start, this._editor, -1, bottomOfEndLine - bottomOfElementAtDepth));
205+
this.stickyScrollWidget.pushCodeLine(new StickyScrollCodeLine(start, this._editor, -1, bottomOfEndLine - bottomOfElementAtDepth));
205206
break;
206207
}
207208
else if (bottomOfElementAtDepth > bottomOfBeginningLine - 1 && bottomOfElementAtDepth < bottomOfEndLine - 1) {
208209
beginningLinesConsidered.add(start);
209-
this.stickyScrollWidget.pushCodeLine(new StickyScrollCodeLine(model.getLineContent(start), start, this._editor, 0, 0));
210+
this.stickyScrollWidget.pushCodeLine(new StickyScrollCodeLine(start, this._editor, 0, 0));
210211
}
211212
} else {
212213
this._ranges.splice(index, 1);
@@ -228,7 +229,7 @@ class StickyScrollCodeLine {
228229

229230
public readonly effectiveLineHeight: number = 0;
230231

231-
constructor(private readonly _line: string, private readonly _lineNumber: number, private readonly _editor: IActiveCodeEditor,
232+
constructor(private readonly _lineNumber: number, private readonly _editor: IActiveCodeEditor,
232233
private readonly _zIndex: number, private readonly _relativePosition: number) {
233234
this.effectiveLineHeight = this._editor.getOption(EditorOption.lineHeight) + this._relativePosition;
234235
}
@@ -240,16 +241,18 @@ class StickyScrollCodeLine {
240241
getDomNode() {
241242

242243
const root: HTMLElement = document.createElement('div');
243-
const lineRenderingData = this._editor._getViewModel().getViewportViewLineRenderingData(this._editor.getVisibleRangesPlusViewportAboveBelow()[0], this._lineNumber);
244+
const viewModel = this._editor._getViewModel();
245+
const viewLineNumber = viewModel.coordinatesConverter.convertModelPositionToViewPosition(new Position(this._lineNumber, 1)).lineNumber;
246+
const lineRenderingData = viewModel.getViewLineRenderingData(viewLineNumber);
244247

245248
let actualInlineDecorations: LineDecoration[];
246249
try {
247-
actualInlineDecorations = LineDecoration.filter(lineRenderingData.inlineDecorations, this._lineNumber, lineRenderingData.minColumn, lineRenderingData.maxColumn);
250+
actualInlineDecorations = LineDecoration.filter(lineRenderingData.inlineDecorations, viewLineNumber, lineRenderingData.minColumn, lineRenderingData.maxColumn);
248251
} catch (err) {
249252
actualInlineDecorations = [];
250253
}
251254

252-
const renderLineInput: RenderLineInput = new RenderLineInput(true, true, this._line, lineRenderingData.continuesWithWrappedLine,
255+
const renderLineInput: RenderLineInput = new RenderLineInput(true, true, lineRenderingData.content, lineRenderingData.continuesWithWrappedLine,
253256
lineRenderingData.isBasicASCII, lineRenderingData.containsRTL, 0, lineRenderingData.tokens, actualInlineDecorations, lineRenderingData.tabSize,
254257
lineRenderingData.startVisibleColumn, 1, 1, 1, 100, 'none', true, true, null);
255258

0 commit comments

Comments
 (0)