87 lines
1.7 KiB
TypeScript
87 lines
1.7 KiB
TypeScript
import { RJExpressionNode } from "../../../rj/expressions/RJExpressionNode";
|
|
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 );
|
|
}
|
|
} |