library-ts/browser/text/lexer/parsing/SourceInfo.ts

88 lines
1.7 KiB
TypeScript
Raw Normal View History

2025-03-08 12:22:18 +00:00
2025-03-08 08:16:54 +00:00
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;
}
2025-03-08 12:22:18 +00:00
/*
2025-03-08 08:16:54 +00:00
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 );
}
2025-03-08 12:22:18 +00:00
*/
2025-03-08 08:16:54 +00:00
}
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 );
}
}