/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { LineRange } from '../vs/editor/common/core/ranges/lineRange'; export class AnnotatedLineRange extends LineRange { public static fromLineRange(range: LineRange): AnnotatedLineRange { return new AnnotatedLineRange(range.startLineNumber, range.endLineNumberExclusive, undefined); } public static fromLineRangeWithData(range: LineRange, data: T): AnnotatedLineRange { return new AnnotatedLineRange(range.startLineNumber, range.endLineNumberExclusive, data); } constructor( startLineNumber: number, endLineNumberExclusive: number, public readonly data: T, ) { super(startLineNumber, endLineNumberExclusive); } } export class AnnotatedLineRanges { constructor( /** * Have to be sorted and disjoined. */ public readonly ranges: readonly AnnotatedLineRange[], ) { } public getFilled(range: LineRange): AnnotatedLineRanges { const filledRanges: AnnotatedLineRange[] = []; let lastEndLineNumberExclusive = range.startLineNumber; for (const r of this.ranges) { if (r.startLineNumber > lastEndLineNumberExclusive) { filledRanges.push(new AnnotatedLineRange(lastEndLineNumberExclusive, r.startLineNumber, undefined)); } filledRanges.push(r); lastEndLineNumberExclusive = r.endLineNumberExclusive; } if (lastEndLineNumberExclusive < range.endLineNumberExclusive) { filledRanges.push(new AnnotatedLineRange(lastEndLineNumberExclusive, range.endLineNumberExclusive, undefined)); } return new AnnotatedLineRanges(filledRanges); } public intersects(range: LineRange): boolean { for (const r of this.ranges) { if (r.intersectsStrict(range)) { return true; } } return false; } public withAdded(range: AnnotatedLineRange): AnnotatedLineRanges { const newRanges: AnnotatedLineRange[] = [...this.ranges]; newRanges.push(range); newRanges.sort((a, b) => a.startLineNumber - b.startLineNumber); return new AnnotatedLineRanges(newRanges); } }