mirror of
https://github.com/react/react-native-devtools-frontend.git
synced 2026-10-07 04:26:32 +08:00
R=aerotwist@chromium.org Bug: 1061125 Change-Id: Ibda5def22de8767faabe7c37572ffb920d8d6310 Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/2102716 Commit-Queue: Tim van der Lippe <tvanderlippe@chromium.org> Auto-Submit: Tim van der Lippe <tvanderlippe@chromium.org> Reviewed-by: Jack Franklin <jacktfranklin@chromium.org>
132 lines
3.3 KiB
JavaScript
132 lines
3.3 KiB
JavaScript
// Copyright 2016 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
import * as Platform from '../platform/platform.js';
|
|
|
|
import {TextCursor} from './TextCursor.js';
|
|
import {SourceRange, TextRange} from './TextRange.js';
|
|
|
|
/**
|
|
* @unrestricted
|
|
*/
|
|
export class Text {
|
|
/**
|
|
* @param {string} value
|
|
*/
|
|
constructor(value) {
|
|
this._value = value;
|
|
}
|
|
|
|
/**
|
|
* @return {!Array<number>}
|
|
*/
|
|
lineEndings() {
|
|
if (!this._lineEndings) {
|
|
this._lineEndings = Platform.StringUtilities.findLineEndingIndexes(this._value);
|
|
}
|
|
return this._lineEndings;
|
|
}
|
|
|
|
/**
|
|
* @return {string}
|
|
*/
|
|
value() {
|
|
return this._value;
|
|
}
|
|
|
|
/**
|
|
* @return {number}
|
|
*/
|
|
lineCount() {
|
|
const lineEndings = this.lineEndings();
|
|
return lineEndings.length;
|
|
}
|
|
|
|
/**
|
|
* @param {number} lineNumber
|
|
* @param {number} columnNumber
|
|
* @return {number}
|
|
*/
|
|
offsetFromPosition(lineNumber, columnNumber) {
|
|
return (lineNumber ? this.lineEndings()[lineNumber - 1] + 1 : 0) + columnNumber;
|
|
}
|
|
|
|
/**
|
|
* @param {number} offset
|
|
* @return {!Position}
|
|
*/
|
|
positionFromOffset(offset) {
|
|
const lineEndings = this.lineEndings();
|
|
const lineNumber = lineEndings.lowerBound(offset);
|
|
return {lineNumber: lineNumber, columnNumber: offset - (lineNumber && (lineEndings[lineNumber - 1] + 1))};
|
|
}
|
|
|
|
/**
|
|
* @param {number} lineNumber
|
|
* @return {string}
|
|
*/
|
|
lineAt(lineNumber) {
|
|
const lineEndings = this.lineEndings();
|
|
const lineStart = lineNumber > 0 ? lineEndings[lineNumber - 1] + 1 : 0;
|
|
const lineEnd = lineEndings[lineNumber];
|
|
let lineContent = this._value.substring(lineStart, lineEnd);
|
|
if (lineContent.length > 0 && lineContent.charAt(lineContent.length - 1) === '\r') {
|
|
lineContent = lineContent.substring(0, lineContent.length - 1);
|
|
}
|
|
return lineContent;
|
|
}
|
|
|
|
/**
|
|
* @param {!TextRange} range
|
|
* @return {!SourceRange}
|
|
*/
|
|
toSourceRange(range) {
|
|
const start = this.offsetFromPosition(range.startLine, range.startColumn);
|
|
const end = this.offsetFromPosition(range.endLine, range.endColumn);
|
|
return new SourceRange(start, end - start);
|
|
}
|
|
|
|
/**
|
|
* @param {!SourceRange} sourceRange
|
|
* @return {!TextRange}
|
|
*/
|
|
toTextRange(sourceRange) {
|
|
const cursor = new TextCursor(this.lineEndings());
|
|
const result = TextRange.createFromLocation(0, 0);
|
|
|
|
cursor.resetTo(sourceRange.offset);
|
|
result.startLine = cursor.lineNumber();
|
|
result.startColumn = cursor.columnNumber();
|
|
|
|
cursor.advance(sourceRange.offset + sourceRange.length);
|
|
result.endLine = cursor.lineNumber();
|
|
result.endColumn = cursor.columnNumber();
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* @param {!TextRange} range
|
|
* @param {string} replacement
|
|
* @return {string}
|
|
*/
|
|
replaceRange(range, replacement) {
|
|
const sourceRange = this.toSourceRange(range);
|
|
return this._value.substring(0, sourceRange.offset) + replacement +
|
|
this._value.substring(sourceRange.offset + sourceRange.length);
|
|
}
|
|
|
|
/**
|
|
* @param {!TextRange} range
|
|
* @return {string}
|
|
*/
|
|
extract(range) {
|
|
const sourceRange = this.toSourceRange(range);
|
|
return this._value.substr(sourceRange.offset, sourceRange.length);
|
|
}
|
|
}
|
|
|
|
/** @typedef {{lineNumber: number, columnNumber: number}} */
|
|
// @ts-ignore typedef
|
|
export let Position;
|