/** Ċ Ġ* ĠCode Ġto Ġcreate Ġfast Ġmapping Ġof Ġtext Ġoffset Ġtol Ġin e Ġand Ġcolumn Ġnumbers Ċ Ġ* Ġfix me : Ġthis Ġcode Ġis Ġcopy - past ed Ġfrom Ġk tl int . ĠChange Ġit Ċ Ġ*/ Ċ Ċ package Ġorg . cq fn . di kt at . rule set . utils Ċ Ċ internal Ġtype alias ĠLine And Column Ġ= ĠPair < Int , ĠInt > Ċ Ċ /** Ċ Ġ* ĠCalculate Ġposition Ġin Ġtext Ġ- Ġline Ġand Ġcolumn Ġbased Ġon Ġoffset Ġfrom Ġthe Ġtext Ġstart . Ċ Ġ* Ċ Ġ* Ġ@ param Ġtext Ġa Ġpiece Ġof Ġtext Ċ Ġ* Ġ@ return Ġmapping Ġfunction Ġfrom Ġoffset Ġto Ġline Ġand Ġcolumn Ġnumber Ċ Ġ*/ Ċ internal Ġfun Ġbuild Position In Text Locator ( text : ĠString ): Ġ( offset : ĠInt ) Ġ-> ĠLine And Column Ġ{ ĊĠĠĠ Ġval Ġtext Length Ġ= Ġtext . length ĊĠĠĠ Ġval Ġidentifier Array : ĠArrayList < Int > Ġ= ĠArrayList () ĊĠĠĠ Ġvar Ġend Of Line Index Ġ= Ġ- 1 ĊĊĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠ Ġidentifier Array . add ( end Of Line Index Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġend Of Line Index Ġ= Ġtext . indexOf ('\ n ', Ġend Of Line Index Ġ+ Ġ 1 ) ĊĠĠĠ Ġ} Ġwhile Ġ( end Of Line Index Ġ!= Ġ- 1 ) ĊĊĠĠĠ Ġidentifier Array . add ( text Length Ġ+ Ġif Ġ( identifier Array . last () Ġ== Ġtext Length ) Ġ 1 Ġelse Ġ 0 ) ĊĊĠĠĠ Ġval Ġsegment Tree Ġ= ĠSegment Tree ( identifier Array . to IntArray ()) ĊĊĠĠĠ Ġreturn Ġ{ Ġoffset Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġsegment Tree . indexOf ( offset ) ĊĠĠĠĠĠĠĠ Ġif Ġ( line Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolumn Ġ= Ġoffset Ġ- Ġsegment Tree . get ( line ). left ĊĠĠĠĠĠĠĠĠĠĠĠ Ġline Ġ+ Ġ 1 Ġto Ġcolumn Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġto Ġ 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Suppress (" MISSING _ K DOC _ ON _ FUNCTION ", Ġ" K DOC _ WITHOUT _ PARAM _ TAG ", Ġ" K DOC _ WITHOUT _ RETURN _ TAG ") Ċ private Ġclass ĠSegment Tree ( sorted Array : ĠInt Array ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġsegments : ĠList < Segment > Ġ= Ġsorted Array ĊĠĠĠĠĠĠĠ Ġ. drop Last ( 1 ) ĊĠĠĠĠĠĠĠ Ġ. map Indexed Ġ{ Ġindex : ĠInt , Ġelement : ĠInt Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSegment ( element , Ġsorted Array [ index Ġ+ Ġ 1 ] Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( sorted Array . size Ġ> Ġ 1 ) Ġ{ Ġ" At Ġleast Ġtwo Ġdata Ġpoints Ġare Ġrequired " Ġ} ĊĠĠĠĠĠĠĠ Ġsorted Array . reduce Ġ{ Ġcurrent , Ġnext Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( current Ġ<= Ġnext ) Ġ{ Ġ" Data Ġpoints Ġare Ġnot Ġsorted Ġ( ASC )" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget ( index : ĠInt ): ĠSegment Ġ= Ġsegments [ index ] ĊĊĠĠĠ Ġfun ĠindexOf ( index : ĠInt ): ĠInt Ġ= Ġbinary Search ( index , Ġ 0 , Ġsegments . size Ġ- Ġ 1 ) ĊĊĠĠĠ Ġprivate Ġfun Ġbinary Search ( ĊĠĠĠĠĠĠĠ Ġcompare Element : ĠInt , ĊĠĠĠĠĠĠĠ Ġleft : ĠInt , ĊĠĠĠĠĠĠĠ Ġright : ĠInt ): ĠInt Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġleft Ġ> Ġright Ġ-> Ġ- 1 ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġleft Ġ+ Ġ( right Ġ- Ġleft ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmid Element Ġ= Ġsegments [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( compare Element Ġ< Ġmid Element . left ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbinary Search ( compare Element , Ġleft , Ġindex Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mid Element . right Ġ< Ġcompare Element ) Ġbinary Search ( compare Element , Ġindex Ġ+ Ġ 1 , Ġright ) Ġelse Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Suppress (" K DOC _ NO _ CON STRUCTOR _ PROPERTY ") Ċ private Ġdata Ġclass ĠSegment ( ĊĠĠĠ Ġval Ġleft : ĠInt , ĊĠĠĠ Ġval Ġright : ĠInt Ċ ) Ċ