Skip to content

Commit

Permalink
small refactorings and readability improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
x17jiri committed Nov 28, 2024
1 parent 9c19dc0 commit 3b92312
Show file tree
Hide file tree
Showing 17 changed files with 183 additions and 196 deletions.
7 changes: 6 additions & 1 deletion src/vs/editor/browser/view/viewController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -212,9 +212,14 @@ export class ViewController {

private _usualArgs(viewPosition: Position, revealType: NavigationCommandRevealType): CoreNavigationCommands.MoveCommandOptions {
viewPosition = this._validateViewColumn(viewPosition);
let position = this._convertViewToModelPosition(viewPosition);
const maxViewColumn = this.viewModel.getLineMaxColumn(viewPosition.lineNumber);
if (viewPosition.column > maxViewColumn) {
position = position.delta(0, viewPosition.column - maxViewColumn);
}
return {
source: 'mouse',
position: this._convertViewToModelPosition(viewPosition),
position,
viewPosition,
revealType
};
Expand Down
5 changes: 2 additions & 3 deletions src/vs/editor/browser/viewParts/viewCursors/viewCursor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -158,10 +158,9 @@ export class ViewCursor {
const lineContent = this._context.viewModel.getLineContent(lineNumber);
if (column > lineContent.length) {
return [new Position(lineNumber, column), ''];
} else {
const [startOffset, endOffset] = strings.getCharContainingOffset(lineContent, column - 1);
return [new Position(lineNumber, startOffset + 1), lineContent.substring(startOffset, endOffset)];
}
const [startOffset, endOffset] = strings.getCharContainingOffset(lineContent, column - 1);
return [new Position(lineNumber, startOffset + 1), lineContent.substring(startOffset, endOffset)];
}

private _prepareRender(ctx: RenderingContext): ViewCursorRenderData | null {
Expand Down
22 changes: 11 additions & 11 deletions src/vs/editor/browser/viewParts/viewLines/viewLine.ts
Original file line number Diff line number Diff line change
Expand Up @@ -563,22 +563,22 @@ class RenderedViewLine implements IRenderedViewLine {
if (column > this._characterMapping.length) {
const last = this._readPixelOffset(domNode, lineNumber, this._characterMapping.length, context);
return last + spaceWidth * (column - this._characterMapping.length);
} else {
if (this._pixelOffsetCache !== null) {
// the text is LTR
}

const cachedPixelOffset = this._pixelOffsetCache[column];
if (cachedPixelOffset !== -1) {
return cachedPixelOffset;
}
if (this._pixelOffsetCache !== null) {
// the text is LTR

const result = this._actualReadPixelOffset(domNode, lineNumber, column, context);
this._pixelOffsetCache[column] = result;
return result;
const cachedPixelOffset = this._pixelOffsetCache[column];
if (cachedPixelOffset !== -1) {
return cachedPixelOffset;
}

return this._actualReadPixelOffset(domNode, lineNumber, column, context);
const result = this._actualReadPixelOffset(domNode, lineNumber, column, context);
this._pixelOffsetCache[column] = result;
return result;
}

return this._actualReadPixelOffset(domNode, lineNumber, column, context);
}

private _actualReadPixelOffset(domNode: FastDomNode<HTMLElement>, lineNumber: number, column: number, context: DomReadingContext): number {
Expand Down
10 changes: 6 additions & 4 deletions src/vs/editor/browser/viewParts/viewLines/viewLines.ts
Original file line number Diff line number Diff line change
Expand Up @@ -422,7 +422,11 @@ export class ViewLines extends ViewPart implements IViewLines {

const originalEndLineNumber = _range.endLineNumber;
const _visibleRange = this._lastRenderedData.getCurrentVisibleRange();
const visibleRange = new Range(_visibleRange.startLineNumber, _visibleRange.startColumn, _visibleRange.endLineNumber, Infinity);
// With virtual space, the visible range is not limited by line length
const visibleRange = {
startLineNumber: _visibleRange.startLineNumber, startColumn: _visibleRange.startColumn,
endLineNumber: _visibleRange.endLineNumber, endColumn: Constants.MAX_SAFE_SMALL_INTEGER,
};
const range = Range.intersectRanges(_range, visibleRange);
if (!range) {
return null;
Expand All @@ -447,9 +451,7 @@ export class ViewLines extends ViewPart implements IViewLines {

const startColumn = lineNumber === range.startLineNumber ? range.startColumn : 1;
const continuesInNextLine = lineNumber !== range.endLineNumber;
const endColumn = continuesInNextLine
? Math.max(startColumn, this._context.viewModel.getLineMaxColumn(lineNumber))
: range.endColumn;
const endColumn = continuesInNextLine ? Math.max(startColumn, this._context.viewModel.getLineMaxColumn(lineNumber)) : range.endColumn;
const visibleRangesForLine = this._visibleLines.getVisibleLine(lineNumber).getVisibleRangesForRange(lineNumber, startColumn, endColumn, domReadingContext);

if (!visibleRangesForLine) {
Expand Down
10 changes: 5 additions & 5 deletions src/vs/editor/browser/widget/codeEditor/codeEditorWidget.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ import { INotificationService, Severity } from '../../../../platform/notificatio
import { editorErrorForeground, editorHintForeground, editorInfoForeground, editorWarningForeground } from '../../../../platform/theme/common/colorRegistry.js';
import { IThemeService, registerThemingParticipant } from '../../../../platform/theme/common/themeService.js';
import { MenuId } from '../../../../platform/actions/common/actions.js';
import { calcLeftoverVisibleColumns } from '../../../common/virtualSpaceSupport.js';

export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeEditor {

Expand Down Expand Up @@ -608,13 +609,12 @@ export class CodeEditorWidget extends Disposable implements editorBrowser.ICodeE
}

const position = this._modelData.model.validatePosition(rawPosition);
let leftoverVisibleColumns = 0;
if (position.lineNumber === rawPosition.lineNumber && position.column < rawPosition.column) {
leftoverVisibleColumns = rawPosition.column - position.column;
}
const tabSize = this._modelData.model.getOptions().tabSize;

return CursorColumns.toStatusbarColumn(this._modelData.model.getLineContent(position.lineNumber), position.column, tabSize) + leftoverVisibleColumns;
return (
CursorColumns.toStatusbarColumn(this._modelData.model.getLineContent(position.lineNumber), position.column, tabSize)
+ calcLeftoverVisibleColumns(rawPosition, position)
);
}

public getPosition(): Position | null {
Expand Down
8 changes: 4 additions & 4 deletions src/vs/editor/common/core/cursorColumns.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ export class CursorColumns {
*/
public static visibleColumnFromColumn(lineContent: string, column: number, tabSize: number): number {
const textLen = Math.min(column - 1, lineContent.length);
const leftoverVisualColumns = column - 1 - textLen;
const leftoverVisibleColumns = column - 1 - textLen;
const text = lineContent.substring(0, textLen);
const iterator = new strings.GraphemeIterator(text);

Expand All @@ -52,7 +52,7 @@ export class CursorColumns {
result = this._nextVisibleColumn(codePoint, result, tabSize);
}

return result + leftoverVisualColumns;
return result + leftoverVisibleColumns;
}

/**
Expand Down Expand Up @@ -113,8 +113,8 @@ export class CursorColumns {
}

// walked the entire string
const leftoverVisualColumns = visibleColumn - beforeVisibleColumn;
return lineContentLength + 1 + leftoverVisualColumns;
const leftoverVisibleColumns = visibleColumn - beforeVisibleColumn;
return lineContentLength + 1 + leftoverVisibleColumns;
}

/**
Expand Down
35 changes: 15 additions & 20 deletions src/vs/editor/common/cursor/cursor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import { onUnexpectedError } from '../../../base/common/errors.js';
import * as strings from '../../../base/common/strings.js';
import { CursorCollection } from './cursorCollection.js';
import { CursorConfiguration, CursorState, EditOperationResult, EditOperationType, IColumnSelectData, PartialCursorState, ICursorSimpleModel, PositionTripple } from '../cursorCommon.js';
import { CursorConfiguration, CursorState, EditOperationResult, EditOperationType, IColumnSelectData, PartialCursorState, ICursorSimpleModel } from '../cursorCommon.js';
import { CursorContext } from './cursorContext.js';
import { DeleteOperations } from './cursorDeleteOperations.js';
import { CursorChangeReason } from '../cursorEvents.js';
Expand All @@ -22,7 +22,7 @@ import { VerticalRevealType, ViewCursorStateChangedEvent, ViewRevealRangeRequest
import { dispose, Disposable } from '../../../base/common/lifecycle.js';
import { ICoordinatesConverter } from '../viewModel.js';
import { CursorStateChangedEvent, ViewModelEventsCollector } from '../viewModelEventDispatcher.js';
import { VirtualSpaceRangeExtraData, virtualSpaceRangeExtraData, restoreVirtualSpaceRange } from '../virtualSpaceRange.js';
import { VirtualSpaceRangeExtraData, virtualSpaceRangeExtraData, PositionTripple } from '../virtualSpaceSupport.js';

export class CursorsController extends Disposable {

Expand Down Expand Up @@ -745,7 +745,7 @@ interface IExecContext {
readonly selectionsBefore: Selection[];
readonly trackedRanges: string[];
readonly trackedRangesDirection: SelectionDirection[];
readonly trackedRangesExtra: VirtualSpaceRangeExtraData[];
readonly trackedRangesExtra: (VirtualSpaceRangeExtraData | null)[];
}

interface ICommandData {
Expand Down Expand Up @@ -866,11 +866,7 @@ export class CommandExecutor {
getTrackedSelection: (id: string) => {
const idx = parseInt(id, 10);
const clippedRange = ctx.model._getTrackedRange(ctx.trackedRanges[idx])!;
const extra = ctx.trackedRangesExtra[idx];
const range =
extra !== undefined
? restoreVirtualSpaceRange(ctx.model, clippedRange, extra)
: clippedRange;
const range = ctx.trackedRangesExtra[idx]?.restore(ctx.model, clippedRange) ?? clippedRange;
if (ctx.trackedRangesDirection[idx] === SelectionDirection.LTR) {
return new Selection(range.startLineNumber, range.startColumn, range.endLineNumber, range.endColumn);
}
Expand Down Expand Up @@ -965,12 +961,14 @@ export class CommandExecutor {
};

const trackSelection = (_selection: ISelection, trackPreviousOnEmpty?: boolean) => {
const selection = Selection.liftSelection(_selection);
const start = PositionTripple.fromSelectionStart(ctx.model, selection);
const pos = PositionTripple.fromSelectionPosition(ctx.model, selection);
const clippedSelection = new Selection(start.lineNumber, start.column, pos.lineNumber, pos.column);
const initialSelection = Selection.liftSelection(_selection);
const initialStart = initialSelection.getSelectionStart();
const start = PositionTripple.fromValidatedPosition(initialStart, ctx.model.validatePosition(initialStart));
const initialPos = initialSelection.getPosition();
const pos = PositionTripple.fromValidatedPosition(initialPos, ctx.model.validatePosition(initialPos));
const selection = Selection.fromPositions(start.validPosition, pos.validPosition);
let stickiness: TrackedRangeStickiness;
if (clippedSelection.isEmpty()) {
if (selection.isEmpty()) {
if (typeof trackPreviousOnEmpty === 'boolean') {
if (trackPreviousOnEmpty) {
stickiness = TrackedRangeStickiness.GrowsOnlyWhenTypingBefore;
Expand All @@ -979,8 +977,8 @@ export class CommandExecutor {
}
} else {
// Try to lock it with surrounding text
const maxLineColumn = ctx.model.getLineMaxColumn(clippedSelection.startLineNumber);
if (clippedSelection.startColumn >= maxLineColumn) {
const maxLineColumn = ctx.model.getLineMaxColumn(selection.startLineNumber);
if (selection.startColumn === maxLineColumn) {
stickiness = TrackedRangeStickiness.GrowsOnlyWhenTypingBefore;
} else {
stickiness = TrackedRangeStickiness.GrowsOnlyWhenTypingAfter;
Expand All @@ -991,13 +989,10 @@ export class CommandExecutor {
}

const l = ctx.trackedRanges.length;
const id = ctx.model._setTrackedRange(null, clippedSelection, stickiness);
const id = ctx.model._setTrackedRange(null, selection, stickiness);
ctx.trackedRanges[l] = id;
ctx.trackedRangesDirection[l] = selection.getDirection();
const extra = virtualSpaceRangeExtraData(ctx.model, selection, clippedSelection);
if (extra !== null) {
ctx.trackedRangesExtra[l] = extra;
}
ctx.trackedRangesExtra[l] = virtualSpaceRangeExtraData(ctx.model, initialSelection, selection);
return l.toString();
};

Expand Down
3 changes: 1 addition & 2 deletions src/vs/editor/common/cursor/cursorColumnSelection.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,7 @@ export class ColumnSelection {
const leftoverVisibleColumns = toVisibleColumn - visibleEndColumn;

result.push(new SingleCursorState(
new Range(lineNumber, startColumn, lineNumber, startColumn),
SelectionStartKind.Simple, selectionStartLeftoverVisibleColumns,
new Range(lineNumber, startColumn, lineNumber, startColumn), SelectionStartKind.Simple, selectionStartLeftoverVisibleColumns,
new Position(lineNumber, endColumn), leftoverVisibleColumns, null,
));
}
Expand Down
3 changes: 2 additions & 1 deletion src/vs/editor/common/cursor/cursorMoveCommands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { IPosition, Position } from '../core/position.js';
import { Range } from '../core/range.js';
import { ICommandMetadata } from '../../../platform/commands/common/commands.js';
import { IViewModel } from '../viewModel.js';
import { validVirtualSpacePosition } from '../virtualSpaceSupport.js';

export class CursorMoveCommands {

Expand Down Expand Up @@ -260,7 +261,7 @@ export class CursorMoveCommands {
return this.line(viewModel, cursor, inSelectionMode, _position, _viewPosition);
}
}
const position = viewModel.model.validatePosition(_position);
const position = validVirtualSpacePosition(_position, viewModel.model.validatePosition(_position));
const viewPosition = (
_viewPosition
? viewModel.coordinatesConverter.validateViewPosition(new Position(_viewPosition.lineNumber, _viewPosition.column), position)
Expand Down
2 changes: 1 addition & 1 deletion src/vs/editor/common/cursor/cursorMoveOperations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ export class CursorPosition {
export class MoveOperations {
// Operations in this class can handle both model and view model cursor states.
// However, model states may have their column clipped to the line length.
// If this happens, this function will unclip the them.
// If this happens, this function will unclip them.
private static toVirtualSpace(cursor: SingleCursorState): SingleCursorState {
const selectionStartLeftoverVisibleColumns = cursor.selectionStartLeftoverVisibleColumns;
const leftoverVisibleColumns = cursor.leftoverVisibleColumns;
Expand Down
6 changes: 2 additions & 4 deletions src/vs/editor/common/cursor/oneCursor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -200,10 +200,8 @@ export class Cursor {
),
);
const viewSelectionStart = new Range(
viewSelectionStartStart.lineNumber,
viewSelectionStartStart.column,
viewSelectionStartEnd.lineNumber,
viewSelectionStartEnd.column
viewSelectionStartStart.lineNumber, viewSelectionStartStart.column,
viewSelectionStartEnd.lineNumber, viewSelectionStartEnd.column
);
const viewPosition = context.coordinatesConverter.validateViewPosition(
viewState.position,
Expand Down
56 changes: 5 additions & 51 deletions src/vs/editor/common/cursorCommon.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import { ConfigurationChangedEvent, EditorAutoClosingEditStrategy, EditorAutoClosingStrategy, EditorAutoIndentStrategy, EditorAutoSurroundStrategy, EditorOption } from './config/editorOptions.js';
import { LineTokens } from './tokens/lineTokens.js';
import { Position } from './core/position.js';
import { PositionTripple } from './virtualSpaceSupport.js';
import { Range } from './core/range.js';
import { ISelection, Selection } from './core/selection.js';
import { ICommand } from './editorCommon.js';
Expand Down Expand Up @@ -273,12 +274,12 @@ export class CursorState {
}

public static fromModelSelection(model: ICursorSimpleModel, modelSelection: ISelection): PartialModelCursorState {
const start = PositionTripple.fromSelectionStart(model, modelSelection);
const pos = PositionTripple.fromSelectionPosition(model, modelSelection);
const start = PositionTripple.fromModelPosition(model, new Position(modelSelection.selectionStartLineNumber, modelSelection.selectionStartColumn));
const pos = PositionTripple.fromModelPosition(model, new Position(modelSelection.positionLineNumber, modelSelection.positionColumn));
const modelState = new SingleCursorState(
new Range(start.lineNumber, start.column, pos.lineNumber, pos.column),
Range.fromPositions(start.validPosition),
SelectionStartKind.Simple, start.leftoverVisibleColumns,
new Position(pos.lineNumber, pos.column), pos.leftoverVisibleColumns, null,
pos.validPosition, pos.leftoverVisibleColumns, null,
);
return CursorState.fromModelState(modelState);
}
Expand Down Expand Up @@ -330,38 +331,6 @@ export const enum SelectionStartKind {
Line
}

export class PositionTripple {
constructor(
public readonly lineNumber: number,
public readonly column: number,
public readonly leftoverVisibleColumns: number,
) { }

public static fromSelectionStart(model: ICursorSimpleModel, selection: ISelection): PositionTripple {
const lineNumber = selection.selectionStartLineNumber;
let column = selection.selectionStartColumn;
let leftoverVisibleColumns = 0;
const maxColumn = model.getLineMaxColumn(lineNumber);
if (column > maxColumn) {
leftoverVisibleColumns = column - maxColumn;
column = maxColumn;
}
return new PositionTripple(lineNumber, column, leftoverVisibleColumns);
}

public static fromSelectionPosition(model: ICursorSimpleModel, selection: ISelection): PositionTripple {
const lineNumber = selection.positionLineNumber;
let column = selection.positionColumn;
let leftoverVisibleColumns = 0;
const maxColumn = model.getLineMaxColumn(lineNumber);
if (column > maxColumn) {
leftoverVisibleColumns = column - maxColumn;
column = maxColumn;
}
return new PositionTripple(lineNumber, column, leftoverVisibleColumns);
}
}

/**
* Represents the cursor state on either the model or on the view model.
*/
Expand All @@ -383,21 +352,6 @@ export class SingleCursorState {
// Without virtual space, it helps to recover from short lines.
// With virtual space, it helps when going through inlay hints.
//
// Example of cursor going down without columnHint:
//
// | = cursor
// x = inlay hint
// . = other text
//
// .....|..... ........... ...........
// ...xxxxx... -> ..|xxxxx... -> ...xxxxx...
// ........... ........... ..|........
//
// Same situation with columnHint:
// .....|..... ........... ...........
// ...xxxxx... -> ..|xxxxx... -> ...xxxxx...
// ........... ........... .....|.....
//
// When converting between model and view model, we convert positions in virtual space
// to leftoverVisibleColumns and back.
// Column hint is not easy to convert, so it is dropped during conversions.
Expand Down
10 changes: 4 additions & 6 deletions src/vs/editor/common/model/textModel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ import { IInstantiationService } from '../../../platform/instantiation/common/in
import { IColorTheme } from '../../../platform/theme/common/themeService.js';
import { IUndoRedoService, ResourceEditStackSnapshot, UndoRedoGroup } from '../../../platform/undoRedo/common/undoRedo.js';
import { TokenArray } from '../tokens/tokenArray.js';
import { VirtualSpaceRangeExtraData, virtualSpaceRangeExtraData, restoreVirtualSpaceRange } from '../virtualSpaceRange.js';
import { VirtualSpaceRangeExtraData, virtualSpaceRangeExtraData } from '../virtualSpaceSupport.js';

export function createTextBufferFactory(text: string): model.ITextBufferFactory {
const builder = new PieceTreeTextBufferBuilder();
Expand Down Expand Up @@ -1667,12 +1667,10 @@ export class TextModel extends Disposable implements model.ITextModel, IDecorati

_getTrackedRange(id: string): Range | null {
const range = this.getDecorationRange(id);
const extra = this._trackedRangeExtraData[id];
if (range === null || extra === undefined) {
return range;
} else {
return restoreVirtualSpaceRange(this, range, extra);
if (range === null) {
return null;
}
return this._trackedRangeExtraData[id]?.restore(this, range) ?? range;
}

_setTrackedRange(id: string | null, newRange: null, newStickiness: model.TrackedRangeStickiness): null;
Expand Down
Loading

0 comments on commit 3b92312

Please sign in to comment.