import { LexerEvent } from "../LexerEvent"; export class SourceRange { offset:number; length:number; get exclusiveEnd() { return this.offset + this.length; } get lastSourceIndex() { return this.exclusiveEnd - 1; } static create( offset:number, length:number ) { let range = new SourceRange(); range.offset = offset; range.length = length; return range; } static combine( a:SourceRange, b:SourceRange ) { let start = Math.min( a.offset, b.offset ); let end = Math.max( a.exclusiveEnd, b.exclusiveEnd ); let range = new SourceRange(); range.offset = start; range.length = end - start; return range; } /* static combineNodes( a:RJExpressionNode, b:RJExpressionNode ) { return SourceRange.combine( a.sourceRange, b.sourceRange ); } static fromNodes( nodes:RJExpressionNode[], start:number, end:number ) { return SourceRange.combine( nodes[ start ].sourceRange, nodes[ end ].sourceRange ); } static fromAllNodes( nodes:RJExpressionNode[] ) { return SourceRange.fromNodes( nodes, 0, nodes.length - 1 ); } */ } export class SourceInfo { range:SourceRange; static asRange( start:number, length:number ) { let sourceInfo = new SourceInfo(); sourceInfo.range = SourceRange.create( start, length ); return sourceInfo; } static fromRange( range:SourceRange ) { let sourceInfo = new SourceInfo(); sourceInfo.range = range; return sourceInfo; } static fromEvent( le:LexerEvent ) { return SourceInfo.asRange( le.offset, le.length ); } }