/* Ċ Ġ* Ġ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 . idea . debugger Ċ Ċ import Ġcom . intellij . debugger . Source Position Ċ import Ġcom . intellij . debugger . engine . Frame Extra Variables Provider Ċ import Ġcom . intellij . debugger . engine . evaluation . Code Fragment Kind Ċ import Ġcom . intellij . debugger . engine . evaluation . Evaluation Context Ċ import Ġcom . intellij . debugger . engine . evaluation . Text With Imports Ċ import Ġcom . intellij . debugger . engine . evaluation . Text With Imports Impl Ċ import Ġcom . intellij . debugger . settings . Debugger Settings Ċ import Ġcom . intellij . openapi . editor . Document Ċ import Ġcom . intellij . openapi . file Editor . File Document Manager Ċ import Ġcom . intellij . openapi . util . Text Range Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi File Ċ import Ġcom . intellij . psi . util . Psi Tree Util Ċ import Ġcom . intellij . util . text . CharArray Util Ċ import Ġorg . jetbrains . kotlin . descriptors . Property Descriptor Ċ import Ġorg . jetbrains . kotlin . idea . Kotlin FileType Ċ import Ġorg . jetbrains . kotlin . idea . cache s . resolve . analyze Fully Ċ import Ġorg . jetbrains . kotlin . idea . code Insight . Code Insight Utils Ċ import Ġorg . jetbrains . kotlin . idea . refactor ing . getLine End Offset Ċ import Ġorg . jetbrains . kotlin . idea . refactor ing . getLine Start Offset Ċ import Ġorg . jetbrains . kotlin . idea . util . application . run Read Action Ċ import Ġorg . jetbrains . kotlin . psi .* Ċ import Ġorg . jetbrains . kotlin . resolve . Binding Context Ċ import Ġjava . util .* Ċ Ċ class ĠKotlin Frame Extra Variables Provider Ġ: ĠFrame Extra Variables Provider Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġis Available ( source Position : ĠSource Position , Ġeval Context : ĠEvaluation Context ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( source Position . line Ġ< Ġ 0 ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġsource Position . file . fileType Ġ== ĠKotlin FileType . INSTANCE Ġ&& ĠDebugger Settings . getInstance (). AUTO _ VARIABLE S _ MODE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcollect Variables ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Position : ĠSource Position , Ġeval Context : ĠEvaluation Context , Ġalready Collected : ĠMutable Set < String >): ĠSet < Text With Imports > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrun Read Action Ġ{ Ġfind Additional Expressions ( source Position ) Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġfind Additional Expressions ( position : ĠSource Position ): ĠSet < Text With Imports > Ġ{ ĊĠĠĠ Ġval Ġline Ġ= Ġposition . line ĊĠĠĠ Ġval Ġfile Ġ= Ġposition . file ĊĊĠĠĠ Ġval Ġv File Ġ= Ġfile . virtual File ĊĠĠĠ Ġval Ġdoc Ġ= Ġif Ġ( v File Ġ!= Ġnull ) ĠFile Document Manager . getInstance (). getDocument ( v File ) Ġelse Ġnull ĊĠĠĠ Ġif Ġ( doc Ġ== Ġnull Ġ|| Ġdoc . line Count Ġ== Ġ 0 Ġ|| Ġline Ġ> Ġ( doc . line Count Ġ- Ġ 1 )) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġempty Set () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġoffset Ġ= Ġfile . getLine Start Offset ( line )?. take If Ġ{ Ġit Ġ> Ġ 0 Ġ} Ġ?: Ġreturn Ġempty Set () ĊĊĠĠĠ Ġval Ġelem Ġ= Ġfile . findElement At ( offset ) Ġ?: Ġreturn Ġempty Set () ĊĠĠĠ Ġval Ġcontaining Element Ġ= Ġget Containing Element ( elem ) Ġ?: Ġelem ĊĊĠĠĠ Ġval Ġlimit Ġ= Ġget Line Range For Element ( containing Element , Ġdoc ) ĊĊĠĠĠ Ġvar Ġstart Line Ġ= ĠMath . max ( limit . start Offset , Ġline ) ĊĠĠĠ Ġwhile Ġ( start Line Ġ- Ġ 1 Ġ> Ġlimit . start Offset Ġ&& Ġshould Skip Line ( file , Ġdoc , Ġstart Line Ġ- Ġ 1 )) Ġ{ ĊĠĠĠĠĠĠĠ Ġstart Line -- ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġend Line Ġ= ĠMath . min ( limit . end Offset , Ġline ) ĊĠĠĠ Ġwhile Ġ( end Line Ġ+ Ġ 1 Ġ< Ġlimit . end Offset Ġ&& Ġshould Skip Line ( file , Ġdoc , Ġend Line Ġ+ Ġ 1 )) Ġ{ ĊĠĠĠĠĠĠĠ Ġend Line ++ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġstart Offset Ġ= Ġfile . getLine Start Offset ( start Line ) Ġ?: Ġreturn Ġempty Set () ĊĠĠĠ Ġval Ġend Offset Ġ= Ġfile . getLine End Offset ( end Line ) Ġ?: Ġreturn Ġempty Set () ĊĊĠĠĠ Ġif Ġ( start Offset Ġ>= Ġend Offset ) Ġreturn Ġempty Set () ĊĊĠĠĠ Ġval Ġline Range Ġ= ĠText Range ( start Offset , Ġend Offset ) ĊĠĠĠ Ġif Ġ( line Range . isEmpty ) Ġreturn Ġempty Set () ĊĊĠĠĠ Ġval Ġexpressions Ġ= ĠLinked HashSet < Text With Imports >() ĊĊĠĠĠ Ġval Ġvariables Collector Ġ= ĠVariables Collector ( line Range , Ġexpressions ) ĊĠĠĠ Ġcontaining Element . accept ( variables Collector ) ĊĊĠĠĠ Ġreturn Ġexpressions Ċ } Ċ Ċ private Ġfun Ġget Containing Element ( element : ĠPsi Element ): ĠK t Element ? Ġ{ ĊĠĠĠ Ġval Ġcont Element Ġ= ĠPsi Tree Util . getParent OfType ( element , ĠK t Declaration :: class . java ) Ġ?: ĠPsi Tree Util . getParent OfType ( element , ĠK t Element :: class . java ) ĊĠĠĠ Ġif Ġ( cont Element Ġis ĠK t Property Ġ&& Ġcont Element . is Local ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġcont Element . parent ĊĠĠĠĠĠĠĠ Ġreturn Ġget Containing Element ( parent ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( cont Element Ġis ĠK t Declaration With Body ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcont Element . body Expression ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġcont Element Ċ } Ċ Ċ private Ġfun Ġget Line Range For Element ( containing Element : ĠPsi Element , Ġdoc : ĠDocument ): ĠText Range Ġ{ ĊĠĠĠ Ġval Ġelem Range Ġ= Ġcontaining Element . text Range ĊĠĠĠ Ġreturn ĠText Range ( doc . get LineNumber ( elem Range . start Offset ), Ġdoc . get LineNumber ( elem Range . end Offset )) Ċ } Ċ Ċ private Ġfun Ġshould Skip Line ( file : ĠPsi File , Ġdoc : ĠDocument , Ġline : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġstart Ġ= ĠChar Array Util . shift Forward ( doc . chars Sequence , Ġdoc . getLine Start Offset ( line ), Ġ" Ġ\ n \ t ") ĊĠĠĠ Ġval Ġend Ġ= Ġdoc . getLine End Offset ( line ) ĊĠĠĠ Ġif Ġ( start Ġ>= Ġend ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġelem At Offset Ġ= Ġfile . findElement At ( start ) ĊĠĠĠ Ġval Ġtop most ElementAt Offset Ġ= ĠCode Insight Utils . get Top most ElementAt Offset ( elem At Offset !! , Ġstart ) ĊĠĠĠ Ġreturn Ġtop most ElementAt Offset Ġ! is ĠK t Declaration Ċ } Ċ Ċ private Ġclass ĠVariables Collector ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmy Line Range : ĠText Range , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġmy Expressions : ĠMutable Set < Text With Imports > Ċ ) Ġ: ĠK t Tree Visitor Void () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Kt Element ( element : ĠK t Element ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( element . isIn Range ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Kt Element ( element ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Qualified Expression ( expression : ĠK t Qualified Expression ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( expression . isIn Range ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselector Ġ= Ġexpression . selector Expression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selector Ġis ĠK t Reference Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Ref To Property ( selector )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy Expressions . add ( expression . createText ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . visit Qualified Expression ( expression ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Ref To Property ( expression : ĠK t Reference Expression ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġexpression . analyze Fully () ĊĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġcontext [ Binding Context . REFERENCE _ TARGET , Ġexpression ] ĊĠĠĠĠĠĠĠ Ġif Ġ( descriptor Ġis ĠProperty Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgetter Ġ= Ġdescriptor . getter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( getter Ġ== Ġnull Ġ|| Ġcontext [ Binding Context . DE LEG ATED _ PROPERTY _ RESOL VED _ CALL , Ġgetter ] Ġ== Ġnull ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . compile Time Initializer Ġ== Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Reference Expression ( expression : ĠK t Reference Expression ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( expression . isIn Range ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Ref To Property ( expression )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy Expressions . add ( expression . createText ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsuper . visit Reference Expression ( expression ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠK t Element . isIn Range (): ĠBoolean Ġ= Ġmy Line Range . intersect s ( this . text Range ) ĊĠĠĠ Ġprivate Ġfun ĠK t Element . createText (): ĠText With Imports Ġ= ĠText With Imports Impl ( Code Fragment Kind . EXPRESSION , Ġthis . text ) ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Class ( klass : ĠK t Class ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDo Ġnot Ġshow Ġexpressions Ġused Ġin Ġlocal Ġclasses ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Named Function ( function : ĠK t Named Function ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDo Ġnot Ġshow Ġexpressions Ġused Ġin Ġlocal Ġfunctions ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Object Literal Expression ( expression : ĠK t Object Literal Expression ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDo Ġnot Ġshow Ġexpressions Ġused Ġin Ġanonymous Ġobjects ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Lambda Expression ( lambda Expression : ĠK t Lambda Expression ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDo Ġnot Ġshow Ġexpressions Ġused Ġin Ġlamb das ĊĠĠĠ Ġ} Ċ }