package Ġio . gitlab . art urb os ch . gro v lin . ast Ċ Ċ import Ġio . gitlab . art urb os ch . gro v lin . parser . Code Point Ċ import Ġorg . antlr . v 4 . runtime . ParserRuleContext Ċ import Ġorg . antlr . v 4 . runtime . Token Ċ import Ġorg . antlr . v 4 . runtime . tree . Terminal Node Ċ Ċ class ĠPoint ( line : ĠInt , Ġcolumn : ĠInt ) Ġ: ĠCode Point ( line , Ġcolumn ) Ġ{ ĊĊ ĉ fun Ġoffset ( lines : ĠList < String >): ĠInt Ġ{ Ċĉ ĉ val Ġnew Lines Ġ= Ġthis . line Ġ- Ġ 1 Ċĉ ĉ return Ġlines . sub List ( 0 , Ġnew Lines ). fold Right ( 0 ) Ġ{ Ġit , Ġacc Ġ-> Ġit . length Ġ+ Ġacc Ġ} Ġ+ Ġnew Lines Ġ+ Ġcolumn Ċ ĉ } ĊĊ ĉ fun Ġis Before ( other : ĠPoint ): ĠBoolean Ġ= Ġline Ġ< Ġother . line Ġ|| Ġ( line Ġ== Ġother . line Ġ&& Ġcolumn Ġ< Ġother . column ) ĊĊ ĉ fun Ġis After ( other : ĠPoint ): ĠBoolean Ġ= Ġline Ġ> Ġother . line Ġ|| Ġ( line Ġ== Ġother . line Ġ&& Ġcolumn Ġ> Ġother . column ) Ċ Ċ } Ċ Ċ data Ġclass ĠPosition ( val Ġstart : ĠPoint , Ġval Ġend : ĠPoint ) Ġ{ ĊĊ ĉ init Ġ{ Ċĉ ĉ if Ġ( end . is Before ( start )) Ġ{ Ċĉĉ ĉ throw ĠIllegalArgumentException (" Start Ġpositions Ġshould Ġbe Ġlocated Ġbefore Ġend Ġpositions !") Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ override Ġfun ĠtoString () Ġ= Ġ" ($ start Ġto Ġ$ end )" ĊĊ ĉ fun Ġtext ( code : ĠString ): ĠString Ġ{ Ċĉ ĉ val Ġlines Ġ= Ġcode . split ("\ n ") Ċĉ ĉ return Ġcode . substring ( start . offset ( lines ), Ġend . offset ( lines )) Ċ ĉ } ĊĊ ĉ fun Ġlength ( code : ĠString ): ĠInt Ġ{ Ċĉ ĉ val Ġlines Ġ= Ġcode . split ("\ n ") Ċĉ ĉ return Ġend . offset ( lines ) Ġ- Ġstart . offset ( lines ) Ċ ĉ } ĊĊ ĉ fun Ġcontains ( position : ĠPosition ): ĠBoolean Ġ{ Ċĉ ĉ return Ġ( position . start . is After ( start ) Ġ|| Ġposition . start Ġ== Ġstart ) Ċĉĉĉ ĉ && Ġ( position . end . is Before ( end ) Ġ|| Ġposition . end Ġ== Ġend ) Ċ ĉ } Ċ } Ċ Ċ val ĠINVALID _ POINT Ġ= ĠPoint (- 1 , Ġ- 1 ) Ċ /** Ċ Ġ* ĠFor Ġgenerated Ġor Ġomitted Ġnodes . Ċ Ġ*/ Ċ val ĠINVALID _ POSITION Ġ= ĠPosition ( INVALID _ POINT , ĠINVALID _ POINT ) Ċ Ċ fun Ġpos ( start Line : ĠInt , Ġstart Column : ĠInt , Ġend Line : ĠInt , Ġend Column : ĠInt ) Ġ= Ċĉ ĉ Position ( Point ( start Line , Ġstart Column ), ĠPoint ( end Line , Ġend Column )) Ċ Ċ // ĠNode Ġextensions Ċ Ċ fun ĠNode . is Before ( other : ĠNode ): ĠBoolean Ġ= Ġposition Ġ!= Ġnull Ġ&& Ġother . position Ġ!= Ġnull Ġ&& Ġposition !!. start . is Before ( other . position !!. start ) Ċ Ċ fun ĠNode . is After ( other : ĠNode ): ĠBoolean Ġ= Ġposition Ġ!= Ġnull Ġ&& Ġother . position Ġ!= Ġnull Ġ&& Ġposition !!. start . is After ( other . position !!. start ) Ċ Ċ // ĠParser Ġextensions Ċ Ċ fun ĠToken . start Point () Ġ= ĠPoint ( line , Ġchar Position In Line Ġ+ Ġ 1 ) Ċ Ċ fun ĠToken . end Point () Ġ= ĠPoint ( line , Ġchar Position In Line Ġ+ Ġ 1 ) Ċ Ċ fun ĠToken . to Position () Ġ= ĠPosition ( start Point (), Ġend Point ()) Ċ Ċ fun ĠTerminal Node . to Position () Ġ= ĠPosition ( symbol . start Point (), Ġsymbol . end Point ()) Ċ Ċ fun ĠParser RuleContext . to Position (): ĠPosition ? Ġ{ Ċ ĉ return ĠPosition ( start . start Point (), Ġstop . end Point ()) Ċ } Ċ