Skip to content

Commit

Permalink
Refactors line break data.
Browse files Browse the repository at this point in the history
  • Loading branch information
hediet committed Nov 2, 2021
1 parent fd04883 commit 83f5a2d
Show file tree
Hide file tree
Showing 4 changed files with 151 additions and 138 deletions.
109 changes: 27 additions & 82 deletions src/vs/editor/common/viewModel/modelLineProjection.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,24 +83,22 @@ export class ModelLineProjection implements IModelLineProjection {
if (!this._isVisible) {
return 0;
}
return this._lineBreakData.breakOffsets.length;
return this._lineBreakData.getOutputLineCount();
}

private getInputStartOffsetOfOutputLineIndex(outputLineIndex: number): number {
return this._lineBreakData.getInputOffsetOfOutputPosition(outputLineIndex, 0);
return this._lineBreakData.translateToInputOffset(outputLineIndex, 0);
}

private getInputEndOffsetOfOutputLineIndex(model: ISimpleModel, modelLineNumber: number, outputLineIndex: number): number {
if (outputLineIndex + 1 === this._lineBreakData.breakOffsets.length) {
return model.getLineMaxColumn(modelLineNumber) - 1;
}
return this._lineBreakData.getInputOffsetOfOutputPosition(outputLineIndex + 1, 0);
return this._lineBreakData.translateToInputOffset(outputLineIndex + 1, 0);
}

public getViewLineContent(model: ISimpleModel, modelLineNumber: number, outputLineIndex: number): string {
if (!this._isVisible) {
throw new Error('Not supported');
}
this.assertVisible();

// These offsets refer to model text with injected text.
const startOffset = outputLineIndex > 0 ? this._lineBreakData.breakOffsets[outputLineIndex - 1] : 0;
Expand Down Expand Up @@ -130,52 +128,22 @@ export class ModelLineProjection implements IModelLineProjection {
}

public getViewLineLength(model: ISimpleModel, modelLineNumber: number, outputLineIndex: number): number {
// TODO @hediet make this method a member of LineBreakData.
if (!this._isVisible) {
throw new Error('Not supported');
}

// These offsets refer to model text with injected text.
const startOffset = outputLineIndex > 0 ? this._lineBreakData.breakOffsets[outputLineIndex - 1] : 0;
const endOffset = outputLineIndex < this._lineBreakData.breakOffsets.length
? this._lineBreakData.breakOffsets[outputLineIndex]
// This case might not be possible anyway, but we clamp the value to be on the safe side.
: this._lineBreakData.breakOffsets[this._lineBreakData.breakOffsets.length - 1];

let r = endOffset - startOffset;

if (outputLineIndex > 0) {
r = this._lineBreakData.wrappedTextIndentLength + r;
}

return r;
this.assertVisible();
return this._lineBreakData.getLineLength(outputLineIndex);
}

public getViewLineMinColumn(_model: ITextModel, _modelLineNumber: number, outputLineIndex: number): number {
if (!this._isVisible) {
throw new Error('Not supported');
}
return this._getViewLineMinColumn(outputLineIndex);
}

private _getViewLineMinColumn(outputLineIndex: number): number {
if (outputLineIndex > 0) {
return this._lineBreakData.wrappedTextIndentLength + 1;
}
return 1;
this.assertVisible();
return this._lineBreakData.getMinOutputOffset(outputLineIndex) + 1;
}

public getViewLineMaxColumn(model: ISimpleModel, modelLineNumber: number, outputLineIndex: number): number {
if (!this._isVisible) {
throw new Error('Not supported');
}
return this.getViewLineLength(model, modelLineNumber, outputLineIndex) + 1;
this.assertVisible();
return this._lineBreakData.getMaxOutputOffset(outputLineIndex) + 1;
}

public getViewLineData(model: ISimpleModel, modelLineNumber: number, outputLineIndex: number): ViewLineData {
if (!this._isVisible) {
throw new Error('Not supported');
}
this.assertVisible();
const lineBreakData = this._lineBreakData;
const deltaStartIndex = (outputLineIndex > 0 ? lineBreakData.wrappedTextIndentLength : 0);

Expand Down Expand Up @@ -260,10 +228,7 @@ export class ModelLineProjection implements IModelLineProjection {
}

public getViewLinesData(model: ITextModel, modelLineNumber: number, fromOuputLineIndex: number, toOutputLineIndex: number, globalStartIndex: number, needed: boolean[], result: Array<ViewLineData | null>): void {
if (!this._isVisible) {
throw new Error('Not supported');
}

this.assertVisible();
for (let outputLineIndex = fromOuputLineIndex; outputLineIndex < toOutputLineIndex; outputLineIndex++) {
let globalIndex = globalStartIndex + outputLineIndex - fromOuputLineIndex;
if (!needed[globalIndex]) {
Expand All @@ -275,9 +240,7 @@ export class ModelLineProjection implements IModelLineProjection {
}

public getModelColumnOfViewPosition(outputLineIndex: number, outputColumn: number): number {
if (!this._isVisible) {
throw new Error('Not supported');
}
this.assertVisible();
let adjustedColumn = outputColumn - 1;
if (outputLineIndex > 0) {
if (adjustedColumn < this._lineBreakData.wrappedTextIndentLength) {
Expand All @@ -286,14 +249,12 @@ export class ModelLineProjection implements IModelLineProjection {
adjustedColumn -= this._lineBreakData.wrappedTextIndentLength;
}
}
return this._lineBreakData.getInputOffsetOfOutputPosition(outputLineIndex, adjustedColumn) + 1;
return this._lineBreakData.translateToInputOffset(outputLineIndex, adjustedColumn) + 1;
}

public getViewPositionOfModelPosition(deltaLineNumber: number, inputColumn: number, affinity: PositionAffinity = PositionAffinity.None): Position {
if (!this._isVisible) {
throw new Error('Not supported');
}
let r = this._lineBreakData.getOutputPositionOfInputOffset(inputColumn - 1, affinity);
this.assertVisible();
let r = this._lineBreakData.translateToOutputPosition(inputColumn - 1, affinity);
let outputLineIndex = r.outputLineIndex;
let outputColumn = r.outputOffset + 1;

Expand All @@ -306,42 +267,26 @@ export class ModelLineProjection implements IModelLineProjection {
}

public getViewLineNumberOfModelPosition(deltaLineNumber: number, inputColumn: number): number {
if (!this._isVisible) {
throw new Error('Not supported');
}
const r = this._lineBreakData.getOutputPositionOfInputOffset(inputColumn - 1);
this.assertVisible();
const r = this._lineBreakData.translateToOutputPosition(inputColumn - 1);
return (deltaLineNumber + r.outputLineIndex);
}

public normalizePosition(model: ISimpleModel, modelLineNumber: number, outputLineIndex: number, outputPosition: Position, affinity: PositionAffinity): Position {
if (this._lineBreakData.injectionOffsets !== null) {
const baseViewLineNumber = outputPosition.lineNumber - outputLineIndex;
const offsetInUnwrappedLine = this._lineBreakData.outputPositionToOffsetInUnwrappedLine(outputLineIndex, outputPosition.column - 1);
const normalizedOffsetInUnwrappedLine = this._lineBreakData.normalizeOffsetAroundInjections(offsetInUnwrappedLine, affinity);
if (normalizedOffsetInUnwrappedLine !== offsetInUnwrappedLine) {
// injected text caused a change
return this._lineBreakData.getOutputPositionOfOffsetInUnwrappedLine(normalizedOffsetInUnwrappedLine, affinity).toPosition(baseViewLineNumber, this._lineBreakData.wrappedTextIndentLength);
}
}

if (affinity === PositionAffinity.Left) {
if (outputLineIndex > 0 && outputPosition.column === this._getViewLineMinColumn(outputLineIndex)) {
return new Position(outputPosition.lineNumber - 1, this.getViewLineMaxColumn(model, modelLineNumber, outputLineIndex - 1));
}
}
else if (affinity === PositionAffinity.Right) {
const maxOutputLineIndex = this.getViewLineCount() - 1;
if (outputLineIndex < maxOutputLineIndex && outputPosition.column === this.getViewLineMaxColumn(model, modelLineNumber, outputLineIndex)) {
return new Position(outputPosition.lineNumber + 1, this._getViewLineMinColumn(outputLineIndex + 1));
}
}

return outputPosition;
const baseViewLineNumber = outputPosition.lineNumber - outputLineIndex;
return this._lineBreakData.normalizeOutputPosition(outputLineIndex, outputPosition.column - 1, affinity)
.toPosition(baseViewLineNumber, this._lineBreakData.wrappedTextIndentLength);
}

public getInjectedTextAt(outputLineIndex: number, outputColumn: number): InjectedText | null {
return this._lineBreakData.getInjectedText(outputLineIndex, outputColumn - 1);
}

private assertVisible() {
if (!this._isVisible) {
throw new Error('Not supported');
}
}
}

/**
Expand Down

0 comments on commit 83f5a2d

Please sign in to comment.