123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280 |
- (function (factory) {
- if (typeof module === "object" && typeof module.exports === "object") {
- var v = factory(require, exports);
- if (v !== undefined) module.exports = v;
- }
- else if (typeof define === "function" && define.amd) {
- define(["require", "exports"], factory);
- }
- })(function (require, exports) {
- /* --------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- * ------------------------------------------------------------------------------------------ */
- 'use strict';
- Object.defineProperty(exports, "__esModule", { value: true });
- var FullTextDocument = /** @class */ (function () {
- function FullTextDocument(uri, languageId, version, content) {
- this._uri = uri;
- this._languageId = languageId;
- this._version = version;
- this._content = content;
- this._lineOffsets = undefined;
- }
- Object.defineProperty(FullTextDocument.prototype, "uri", {
- get: function () {
- return this._uri;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(FullTextDocument.prototype, "languageId", {
- get: function () {
- return this._languageId;
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(FullTextDocument.prototype, "version", {
- get: function () {
- return this._version;
- },
- enumerable: true,
- configurable: true
- });
- FullTextDocument.prototype.getText = function (range) {
- if (range) {
- var start = this.offsetAt(range.start);
- var end = this.offsetAt(range.end);
- return this._content.substring(start, end);
- }
- return this._content;
- };
- FullTextDocument.prototype.update = function (changes, version) {
- for (var _i = 0, changes_1 = changes; _i < changes_1.length; _i++) {
- var change = changes_1[_i];
- if (FullTextDocument.isIncremental(change)) {
- // makes sure start is before end
- var range = getWellformedRange(change.range);
- // update content
- var startOffset = this.offsetAt(range.start);
- var endOffset = this.offsetAt(range.end);
- this._content = this._content.substring(0, startOffset) + change.text + this._content.substring(endOffset, this._content.length);
- // update the offsets
- var startLine = Math.max(range.start.line, 0);
- var endLine = Math.max(range.end.line, 0);
- var lineOffsets = this._lineOffsets;
- var addedLineOffsets = computeLineOffsets(change.text, false, startOffset);
- if (endLine - startLine === addedLineOffsets.length) {
- for (var i = 0, len = addedLineOffsets.length; i < len; i++) {
- lineOffsets[i + startLine + 1] = addedLineOffsets[i];
- }
- }
- else {
- if (addedLineOffsets.length < 10000) {
- lineOffsets.splice.apply(lineOffsets, [startLine + 1, endLine - startLine].concat(addedLineOffsets));
- }
- else { // avoid too many arguments for splice
- this._lineOffsets = lineOffsets = lineOffsets.slice(0, startLine + 1).concat(addedLineOffsets, lineOffsets.slice(endLine + 1));
- }
- }
- var diff = change.text.length - (endOffset - startOffset);
- if (diff !== 0) {
- for (var i = startLine + 1 + addedLineOffsets.length, len = lineOffsets.length; i < len; i++) {
- lineOffsets[i] = lineOffsets[i] + diff;
- }
- }
- }
- else if (FullTextDocument.isFull(change)) {
- this._content = change.text;
- this._lineOffsets = undefined;
- }
- else {
- throw new Error('Unknown change event received');
- }
- }
- this._version = version;
- };
- FullTextDocument.prototype.getLineOffsets = function () {
- if (this._lineOffsets === undefined) {
- this._lineOffsets = computeLineOffsets(this._content, true);
- }
- return this._lineOffsets;
- };
- FullTextDocument.prototype.positionAt = function (offset) {
- offset = Math.max(Math.min(offset, this._content.length), 0);
- var lineOffsets = this.getLineOffsets();
- var low = 0, high = lineOffsets.length;
- if (high === 0) {
- return { line: 0, character: offset };
- }
- while (low < high) {
- var mid = Math.floor((low + high) / 2);
- if (lineOffsets[mid] > offset) {
- high = mid;
- }
- else {
- low = mid + 1;
- }
- }
- // low is the least x for which the line offset is larger than the current offset
- // or array.length if no line offset is larger than the current offset
- var line = low - 1;
- return { line: line, character: offset - lineOffsets[line] };
- };
- FullTextDocument.prototype.offsetAt = function (position) {
- var lineOffsets = this.getLineOffsets();
- if (position.line >= lineOffsets.length) {
- return this._content.length;
- }
- else if (position.line < 0) {
- return 0;
- }
- var lineOffset = lineOffsets[position.line];
- var nextLineOffset = (position.line + 1 < lineOffsets.length) ? lineOffsets[position.line + 1] : this._content.length;
- return Math.max(Math.min(lineOffset + position.character, nextLineOffset), lineOffset);
- };
- Object.defineProperty(FullTextDocument.prototype, "lineCount", {
- get: function () {
- return this.getLineOffsets().length;
- },
- enumerable: true,
- configurable: true
- });
- FullTextDocument.isIncremental = function (event) {
- var candidate = event;
- return candidate !== undefined && candidate !== null &&
- typeof candidate.text === 'string' && candidate.range !== undefined &&
- (candidate.rangeLength === undefined || typeof candidate.rangeLength === 'number');
- };
- FullTextDocument.isFull = function (event) {
- var candidate = event;
- return candidate !== undefined && candidate !== null &&
- typeof candidate.text === 'string' && candidate.range === undefined && candidate.rangeLength === undefined;
- };
- return FullTextDocument;
- }());
- var TextDocument;
- (function (TextDocument) {
- /**
- * Creates a new text document.
- *
- * @param uri The document's uri.
- * @param languageId The document's language Id.
- * @param version The document's initial version number.
- * @param content The document's content.
- */
- function create(uri, languageId, version, content) {
- return new FullTextDocument(uri, languageId, version, content);
- }
- TextDocument.create = create;
- /**
- * Updates a TextDocument by modifing its content.
- *
- * @param document the document to update. Only documents created by TextDocument.create are valid inputs.
- * @param changes the changes to apply to the document.
- * @returns The updated TextDocument. Note: That's the same document instance passed in as first parameter.
- *
- */
- function update(document, changes, version) {
- if (document instanceof FullTextDocument) {
- document.update(changes, version);
- return document;
- }
- else {
- throw new Error('TextDocument.update: document must be created by TextDocument.create');
- }
- }
- TextDocument.update = update;
- function applyEdits(document, edits) {
- var text = document.getText();
- var sortedEdits = mergeSort(edits.map(getWellformedEdit), function (a, b) {
- var diff = a.range.start.line - b.range.start.line;
- if (diff === 0) {
- return a.range.start.character - b.range.start.character;
- }
- return diff;
- });
- var lastModifiedOffset = 0;
- var spans = [];
- for (var _i = 0, sortedEdits_1 = sortedEdits; _i < sortedEdits_1.length; _i++) {
- var e = sortedEdits_1[_i];
- var startOffset = document.offsetAt(e.range.start);
- if (startOffset < lastModifiedOffset) {
- throw new Error('Overlapping edit');
- }
- else if (startOffset > lastModifiedOffset) {
- spans.push(text.substring(lastModifiedOffset, startOffset));
- }
- if (e.newText.length) {
- spans.push(e.newText);
- }
- lastModifiedOffset = document.offsetAt(e.range.end);
- }
- spans.push(text.substr(lastModifiedOffset));
- return spans.join('');
- }
- TextDocument.applyEdits = applyEdits;
- })(TextDocument = exports.TextDocument || (exports.TextDocument = {}));
- function mergeSort(data, compare) {
- if (data.length <= 1) {
- // sorted
- return data;
- }
- var p = (data.length / 2) | 0;
- var left = data.slice(0, p);
- var right = data.slice(p);
- mergeSort(left, compare);
- mergeSort(right, compare);
- var leftIdx = 0;
- var rightIdx = 0;
- var i = 0;
- while (leftIdx < left.length && rightIdx < right.length) {
- var ret = compare(left[leftIdx], right[rightIdx]);
- if (ret <= 0) {
- // smaller_equal -> take left to preserve order
- data[i++] = left[leftIdx++];
- }
- else {
- // greater -> take right
- data[i++] = right[rightIdx++];
- }
- }
- while (leftIdx < left.length) {
- data[i++] = left[leftIdx++];
- }
- while (rightIdx < right.length) {
- data[i++] = right[rightIdx++];
- }
- return data;
- }
- function computeLineOffsets(text, isAtLineStart, textOffset) {
- if (textOffset === void 0) { textOffset = 0; }
- var result = isAtLineStart ? [textOffset] : [];
- for (var i = 0; i < text.length; i++) {
- var ch = text.charCodeAt(i);
- if (ch === 13 /* CarriageReturn */ || ch === 10 /* LineFeed */) {
- if (ch === 13 /* CarriageReturn */ && i + 1 < text.length && text.charCodeAt(i + 1) === 10 /* LineFeed */) {
- i++;
- }
- result.push(textOffset + i + 1);
- }
- }
- return result;
- }
- function getWellformedRange(range) {
- var start = range.start;
- var end = range.end;
- if (start.line > end.line || (start.line === end.line && start.character > end.character)) {
- return { start: end, end: start };
- }
- return range;
- }
- function getWellformedEdit(textEdit) {
- var range = getWellformedRange(textEdit.range);
- if (range !== textEdit.range) {
- return { newText: textEdit.newText, range: range };
- }
- return textEdit;
- }
- });
|