Path: blob/main/extensions/copilot/src/platform/editing/common/offsetLineColumnConverter.ts
13401 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { CharCode } from '../../../util/vs/base/common/charCode';6import { Position } from '../../../util/vs/editor/common/core/position';78export class OffsetLineColumnConverter {9private readonly _lineStartOffsets: number[];1011/** 1-based number of lines in the source text. */12public get lines() {13return this._lineStartOffsets.length;14}1516constructor(text: string) {17this._lineStartOffsets = [0];18let index = 0;19while (index < text.length) {20const ch = text.charCodeAt(index);21index++; // go to next index22if (ch === CharCode.CarriageReturn || ch === CharCode.LineFeed) {23if (ch === CharCode.CarriageReturn && index < text.length && text.charCodeAt(index) === CharCode.LineFeed) {24index++;25}26this._lineStartOffsets.push(index);27}28}29}3031public lineOffset(lineNumber: number): number {32return this._lineStartOffsets[lineNumber - 1];33}3435public offsetToPosition(offset: number): Position {36let lineNumber = 1;37for (; lineNumber < this._lineStartOffsets.length; lineNumber++) {38if (this._lineStartOffsets[lineNumber] > offset) {39break;40}41}42const column = offset - this._lineStartOffsets[lineNumber - 1];43return new Position(lineNumber, column + 1);44}4546public startOffsetOfLineContaining(offset: number): number {47let lineNumber = 1;48for (; lineNumber < this._lineStartOffsets.length; lineNumber++) {49if (this._lineStartOffsets[lineNumber] > offset) {50break;51}52}53return this._lineStartOffsets[lineNumber - 1];54}5556public positionToOffset(position: Position): number {57if (position.lineNumber >= this._lineStartOffsets.length) {58return this._lineStartOffsets[this._lineStartOffsets.length - 1] + position.column - 1;59}60return this._lineStartOffsets[position.lineNumber - 1] + position.column - 1;61}62}636465