/** Ċ Ġ* Ġadopt ed Ġfrom Ġhttps :// github . com / gt ache / intellij - lsp Ċ Ġ*/ Ċ package Ġcom . intellij . plugin . powershell . lang . lsp . util Ċ Ċ import Ġcom . intellij . openapi . diagnostic . Logger Ċ import Ġcom . intellij . openapi . editor . Editor Ċ import Ġcom . intellij . openapi . editor . Logical Position Ċ import Ġcom . intellij . openapi . util . Text Range Ċ import Ġcom . intellij . openapi . util . text . StringUtil Ċ import Ġcom . intellij . util . Document Util Ċ import Ġorg . eclipse . lsp 4 j . Position Ċ import Ġorg . eclipse . lsp 4 j . Range ĊĊ Ċ object ĠDocument Utils Ġ{ ĊĊĠ Ġprivate Ġval ĠLOG : ĠLogger Ġ= ĠLogger . getInstance ( Document Utils . toString ()) ĊĊĠ Ġfun Ġoffset To L SP Pos ( editor : ĠEditor , Ġoffset : ĠInt ): ĠPosition Ġ{ ĊĠĠĠ Ġval Ġdoc Ġ= Ġeditor . document ĊĠĠĠ Ġval Ġline Ġ= Ġdoc . get LineNumber ( offset ) ĊĠĠĠ Ġval Ġline Start Ġ= Ġdoc . getLine Start Offset ( line ) ĊĠĠĠ Ġval Ġline Text Before Offset Ġ= Ġdoc . getText ( Text Range . create ( line Start , Ġoffset )) ĊĠĠĠ Ġval Ġcolumn Ġ= Ġline Text Before Offset . length ĊĠĠĠ Ġreturn ĠPosition ( line , Ġcolumn ) ĊĠ Ġ} ĊĊĠ Ġfun Ġlogical To L SP Pos ( position : ĠLogical Position , Ġeditor : ĠEditor ): ĠPosition Ġ{ ĊĠĠĠ Ġreturn Ġoffset To L SP Pos ( editor , Ġeditor . logical Position To Offset ( position )) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠRead Access Ġmust Ġbe Ġallowed ĊĠĠ Ġ*/ ĊĠ Ġ@ Throws ( String Index OutOfBoundsException :: class , ĠIndex OutOfBoundsException :: class ) ĊĠ Ġfun Ġlsp Pos To Offset ( editor : ĠEditor , Ġpos : ĠPosition ): ĠInt Ġ{ ĊĠĠĠ Ġval Ġline Ġ= Ġpos . line ĊĠĠĠ Ġval Ġdoc Ġ= Ġeditor . document ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġval Ġline Text For Position Ġ= Ġdoc . getText ( Document Util . getLine Text Range ( doc , Ġline )). substring ( 0 , Ġpos . character ) ĊĠĠĠĠĠ Ġval Ġtabs Ġ= ĠString Util . count Chars ( line Text For Position , Ġ'\ t ') ĊĠĠĠĠĠ Ġval Ġtab Size Ġ= Ġeditor . settings . get Tab Size ( editor . project ) ĊĠĠĠĠĠ Ġval Ġcolumn Ġ= Ġtabs Ġ* Ġtab Size Ġ+ Ġline Text For Position . length Ġ- Ġtabs ĊĠĠĠĠĠ Ġval Ġoffset Ġ= Ġeditor . logical Position To Offset ( Logical Position ( line , Ġcolumn )) ĊĠĠĠĠĠ Ġval Ġdoc Length Ġ= Ġdoc . text Length ĊĠĠĠĠĠ Ġif Ġ( offset Ġ> Ġdoc Length ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLOG . warn (" Offset Ġgreater Ġthan Ġtext Ġlength Ġ: Ġ$ offset Ġ> Ġ$ doc Length ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn ĠMath . min ( Math . max ( offset , Ġ 0 ), Ġdoc Length ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠString Index OutOfBoundsException ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠString Index OutOfBoundsException ("${ e . message } Ġfor Ġserver ĠPosition : Ġ${ p ToString ( pos )}; ĠDocument Ġline Ġtext : Ġ'${ doc . getText ( Document Util . getLine Text Range ( doc , Ġline )) }' ") ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠIndex OutOfBoundsException ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠIndex OutOfBoundsException ("${ e . message } Ġfor Ġserver ĠPosition : Ġ${ p ToString ( pos )}; ĠDocument Ġline Ġtext : Ġ'${ doc . getText ( Document Util . getLine Text Range ( doc , Ġline )) }' ") ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġr ToString ( range : ĠRange ): ĠString Ġ= Ġ" (${ p ToString ( range . start )}, Ġ${ p ToString ( range . start )}) " ĊĊĠ Ġprivate Ġfun Ġp ToString ( pos : ĠPosition ): ĠString Ġ= Ġ"[ ${ pos . line }, Ġ${ pos . character }] " Ċ } Ċ