/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 5 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . nj 2 k Ċ Ċ import Ġcom . intellij . openapi . application . Application Manager Ċ import Ġcom . intellij . openapi . application . Modal ity State Ċ import Ġcom . intellij . openapi . command . Command Processor Ċ import Ġcom . intellij . openapi . editor . Range Marker Ċ import Ġcom . intellij . openapi . util . Text Range Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi Recursive Element Visitor Ċ import Ġcom . intellij . psi . code Style . Code Style Manager Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġorg . jetbrains . kotlin . idea . cache s . resolve . get Resolution Facade Ċ import Ġorg . jetbrains . kotlin . idea . cache s . resolve . resolve Import Reference Ċ import Ġorg . jetbrains . kotlin . idea . core . Short en References Ċ import Ġorg . jetbrains . kotlin . idea . core . util . ED T Ċ import Ġorg . jetbrains . kotlin . idea . core . util . range Ċ import Ġorg . jetbrains . kotlin . idea . formatter . commit And Un block Document Ċ import Ġorg . jetbrains . kotlin . idea . util . Import Insert Helper Ċ import Ġorg . jetbrains . kotlin . idea . util . application . run Read Action Ċ import Ġorg . jetbrains . kotlin . idea . util . application . run Write Action Ċ import Ġorg . jetbrains . kotlin . j 2 k . Converter Context Ċ import Ġorg . jetbrains . kotlin . j 2 k . Post Processor Ċ import Ġorg . jetbrains . kotlin . name . Fq Name Ċ import Ġorg . jetbrains . kotlin . nj 2 k . null ability Analysis . Analysis Scope Ċ import Ġorg . jetbrains . kotlin . nj 2 k . null ability Analysis . Null ability Analysis Facade Ċ import Ġorg . jetbrains . kotlin . nj 2 k . null ability Analysis . null ability By Undefined Null ability Comment Ċ import Ġorg . jetbrains . kotlin . nj 2 k . null ability Analysis . prepare Type Element By M aking All Types Nullable Consider ing Null ability Comment Ċ import Ġorg . jetbrains . kotlin . psi . Kt Element Ċ import Ġorg . jetbrains . kotlin . psi . Kt File Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . elements InRange Ċ import Ġorg . jetbrains . kotlin . resolve . diagnostics . Diagnostics Ċ import Ġjava . util .* Ċ Ċ class ĠNew J 2 k Post Processor ( private Ġval Ġformat Code : ĠBoolean ) Ġ: ĠPost Processor Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġinsert Import ( file : ĠK t File , Ġfq Name : ĠF q Name ) Ġ{ ĊĠĠĠĠĠĠĠ ĠApplication Manager . getApplication (). invoke And Wait Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Write Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptors Ġ= Ġfile . resolve Import Reference ( fq Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptors . first OrNull ()?. let Ġ{ ĠImport Insert Helper . getInstance ( file . project ). import Descriptor ( file , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġenum Ġclass ĠRange Filter Result Ġ{ ĊĠĠĠĠĠĠĠ ĠSKIP , ĊĠĠĠĠĠĠĠ ĠGO _ INS IDE , ĊĠĠĠĠĠĠĠ ĠPROCESS ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun ĠList < New J 2 k Post Processing >. run Process ings ( ĊĠĠĠĠĠĠĠ Ġfile : ĠK t File , ĊĠĠĠĠĠĠĠ Ġconverter Context : ĠNew J 2 k Converter Context , ĊĠĠĠĠĠĠĠ Ġrange Marker : ĠRange Marker ? ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmodification Stamp : ĠLong ? Ġ= Ġfile . modification Stamp ĊĠĠĠĠĠĠĠ Ġval Ġelement To Actions Ġ= Ġrun Read Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcollect Available Actions ( this , Ġfile , Ġconverter Context , Ġrange Marker ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwith Context ( ED T ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Processor . getInstance (). run Undo Transparent Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( element , Ġaction , Ġ_, Ġwrite Action Needed ) Ġin Ġelement To Actions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . isValid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( write Action Needed ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Write Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Action ( action , Ġelement ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Action ( action , Ġelement ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodification Stamp Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmodification Stamp Ġ!= Ġfile . modification Stamp Ġ&& Ġelement To Actions . isNotEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġrun Action ( action : Ġ() Ġ-> ĠUnit , Ġelement : ĠPsi Element ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalStateException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . containing File . commit And Un block Document () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaction () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġsuspend Ġfun ĠProcessing . run Process ings ( file : ĠK t File , Ġconverter Context : ĠNew J 2 k Converter Context , Ġrange Marker : ĠRange Marker ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSingle One Time Processing Ġ-> ĠlistOf ( processing ). run Process ings ( file , Ġconverter Context , Ġrange Marker ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRepeat able Processing Group Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġneed Continue Ġ= Ġprocess ings . run Process ings ( file , Ġconverter Context , Ġrange Marker ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( need Continue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠOne Time Processing Group Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess ings . forEach Ġ{ Ġit . run Process ings ( file , Ġconverter Context , Ġrange Marker ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġdo Additional Processing ( file : ĠK t File , Ġconverter Context : ĠConverter Context ?, Ġrange Marker : ĠRange Marker ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking ( ED T . Modal ity State Element ( Modal ity State . default Modal ity State ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( ED T ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNull ability Analysis Facade ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconverter Context Ġas ĠNew J 2 k Converter Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetType Element Null ability Ġ= Ġ:: null ability By Undefined Null ability Comment , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprepare Type Element Ġ= Ġ:: prepare Type Element By M aking All Types Nullable Consider ing Null ability Comment , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Print Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). fix Null ability ( Analysis Scope ( file , Ġrange Marker )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( ED T ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Processor . getInstance (). run Undo Transparent Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Write Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( range Marker Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShort en References . DEFAULT . process ( file , Ġrange Marker . start Offset , Ġrange Marker . end Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠShort en References . DEFAULT . process ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNew J 2 K Post Processing Registrar . main Process ings . run Process ings ( file , Ġconverter Context Ġas ĠNew J 2 k Converter Context , Ġrange Marker ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( ED T ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Processor . getInstance (). run Undo Transparent Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Write Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . commit And Un block Document () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith Context ( ED T ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Write Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommand Processor . getInstance (). run Undo Transparent Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcode Style Manager Ġ= ĠCode Style Manager . getInstance ( file . project ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( range Marker Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( range Marker . isValid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcode Style Manager . re format Range ( file , Ġrange Marker . start Offset , Ġrange Marker . end Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcode Style Manager . re format ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠAction Data ( val Ġelement : ĠPsi Element , Ġval Ġaction : Ġ() Ġ-> ĠUnit , Ġval Ġpriority : ĠInt , Ġval Ġwrite Action Needed : ĠBoolean ) ĊĊĠĠĠ Ġprivate Ġfun Ġcollect Available Actions ( ĊĠĠĠĠĠĠĠ Ġprocess ings : ĠCollection < New J 2 k Post Processing >, ĊĠĠĠĠĠĠĠ Ġfile : ĠK t File , ĊĠĠĠĠĠĠĠ Ġcontext : ĠNew J 2 k Converter Context , ĊĠĠĠĠĠĠĠ Ġrange Marker : ĠRange Marker ? ĊĠĠĠ Ġ): ĠList < Action Data > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdiagnostics Ġ= Ġanalyze File Range ( file , Ġrange Marker ) ĊĊĠĠĠĠĠĠĠ Ġval Ġavailable Actions Ġ= ĠArrayList < Action Data >() ĊĊĠĠĠĠĠĠĠ Ġfile . accept ( object Ġ: ĠPsi Recursive Element Visitor () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Element ( element : ĠPsi Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrange Result Ġ= Ġrange Filter ( element , Ġrange Marker ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( range Result Ġ== ĠRange Filter Result . SKIP ) Ġreturn ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Element ( element ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( range Result Ġ== ĠRange Filter Result . PROCESS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess ings . forEach Ġ{ Ġprocessing Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Ġ= Ġprocessing . create Action ( element , Ġdiagnostics , Ġcontext . converter . settings ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( action Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Actions . add ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAction Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement , Ġaction , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNew J 2 K Post Processing Registrar . priority ( processing ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing . write Action Needed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġavailable Actions . sortBy Ġ{ Ġit . priority Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġavailable Actions ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġanalyze File Range ( file : ĠK t File , Ġrange Marker : ĠRange Marker ?): ĠDi agnostics Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġelements Ġ= Ġif Ġ( range Marker Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( file ) ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . elements InRange ( range Marker . range !! ). filter Is Instance < Kt Element >() ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( elements . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . get Resolution Facade (). analyze With All Compiler Checks ( elements ). binding Context . diagnostics ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDi agnostics . EMPTY ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrange Filter ( element : ĠPsi Element , Ġrange Marker : ĠRange Marker ?): ĠRange Filter Result Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( range Marker Ġ== Ġnull ) Ġreturn ĠRange Filter Result . PROCESS ĊĠĠĠĠĠĠĠ Ġif Ġ(! range Marker . isValid ) Ġreturn ĠRange Filter Result . SKIP ĊĠĠĠĠĠĠĠ Ġval Ġrange Ġ= ĠText Range ( range Marker . start Offset , Ġrange Marker . end Offset ) ĊĠĠĠĠĠĠĠ Ġval Ġelement Range Ġ= Ġelement . text Range ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrange . contains ( element Range ) Ġ-> ĠRange Filter Result . PROCESS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrange . intersect s ( element Range ) Ġ-> ĠRange Filter Result . GO _ INS IDE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠRange Filter Result . SKIP ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ