/* Ċ Ġ* Ġ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 . ste pping Ċ Ċ import Ġcom . intellij . debugger . No DataException Ċ import Ġcom . intellij . debugger . Source Position Ċ import Ġcom . intellij . debugger . engine . Debug Process Impl Ċ import Ġcom . intellij . debugger . engine . Method Filter Ċ import Ġcom . intellij . debugger . engine . Suspend Context Impl Ċ import Ġcom . intellij . debugger . impl . Debugger Context Impl Ċ import Ġcom . intellij . debugger . impl . Jvm Ste pping Command Provider Ċ import Ġcom . intellij . debugger . j di . Stack Frame Proxy Impl Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . x debugger . impl . X Source Position Impl Ċ import Ġcom . sun . j di . Absent Information Exception Ċ import Ġcom . sun . j di . Local Variable Ċ import Ġcom . sun . j di . Location Ċ import Ġcom . sun . j di . Method Ċ import Ġorg . jetbrains . annotations . Test Only Ċ import Ġorg . jetbrains . kotlin . builtins . isFunction Type Ċ import Ġorg . jetbrains . kotlin . codegen . inline . K OT LIN _ STR ATA _ NAME Ċ import Ġorg . jetbrains . kotlin . descriptors . Callable Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Declaration Descriptor Ċ import Ġorg . jetbrains . kotlin . idea . cache s . resolve . analyze Ċ import Ġorg . jetbrains . kotlin . idea . cache s . resolve . resolve To Call Ċ import Ġorg . jetbrains . kotlin . idea . cache s . resolve . unsafe Resolve To Descriptor Ċ import Ġorg . jetbrains . kotlin . idea . code Insight . Code Insight Utils Ċ import Ġorg . jetbrains . kotlin . idea . debugger .* Ċ import Ġorg . jetbrains . kotlin . idea . debugger . ste pping . Dex Byte code . GOTO Ċ import Ġorg . jetbrains . kotlin . idea . debugger . ste pping . Dex Byte code . MOVE Ċ import Ġorg . jetbrains . kotlin . idea . debugger . ste pping . Dex Byte code . RETURN Ċ import Ġorg . jetbrains . kotlin . idea . debugger . ste pping . Dex Byte code . RETURN _ OBJECT Ċ import Ġorg . jetbrains . kotlin . idea . debugger . ste pping . Dex Byte code . RETURN _ VOID Ċ import Ġorg . jetbrains . kotlin . idea . debugger . ste pping . Dex Byte code . RETURN _ W IDE Ċ import Ġorg . jetbrains . kotlin . idea . refactor ing . get LineNumber Ċ import Ġorg . jetbrains . kotlin . idea . refactor ing . getLine Start Offset Ċ import Ġorg . jetbrains . kotlin . idea . util . application . run Read Action Ċ import Ġorg . jetbrains . kotlin . load . java . Jvm Ab i Ċ import Ġorg . jetbrains . kotlin . psi .* Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . end Offset Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . getParent OfType Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . parents Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . start Offset Ċ import Ġorg . jetbrains . kotlin . resolve . calls . model . Variable As Function Resolved Call Impl Ċ import Ġorg . jetbrains . kotlin . resolve . inline . Inline Util Ċ import Ġorg . jetbrains . kotlin . resolve . lazy . Body Resolve Mode Ċ import Ġorg . jetbrains . kotlin . utils . keys ToMap Ċ Ċ class ĠKotlin Ste pping Command Provider Ġ: ĠJ vm Ste pping Command Provider () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġget Step Over Command ( ĊĠĠĠĠĠĠĠ Ġsuspend Context : ĠS uspend Context Impl ?, ĊĠĠĠĠĠĠĠ Ġignore Break points : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġstep Size : ĠInt ĊĠĠĠ Ġ): ĠDebug Process Impl . Resume Command ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( suspend Context Ġ== Ġnull Ġ|| Ġsuspend Context . is Res umed ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġsource Position Ġ= Ġsuspend Context . debug Process . debugger Context . source Position Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġget Step Over Command ( suspend Context , Ġignore Break points , Ġsource Position ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Only ĊĠĠĠ Ġfun Ġget Step Over Command ( ĊĠĠĠĠĠĠĠ Ġsuspend Context : ĠS uspend Context Impl , ĊĠĠĠĠĠĠĠ Ġignore Break points : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġdebugger Context : ĠDebugger Context Impl ĊĠĠĠ Ġ): ĠDebug Process Impl . Resume Command ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Step Over Command ( suspend Context , Ġignore Break points , Ġdebugger Context . source Position ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Step Over Command ( ĊĠĠĠĠĠĠĠ Ġsuspend Context : ĠS uspend Context Impl , ĊĠĠĠĠĠĠĠ Ġignore Break points : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġsource Position : ĠSource Position ĊĠĠĠ Ġ): ĠDebug Process Impl . Resume Command ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkotlin Source Position Ġ= ĠKotlin Source Position . create ( source Position ) Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Special Step Over Needed ( kotlin Source Position )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDebugger Ste pping Helper . create Step Over Command ( suspend Context , Ġignore Break points , Ġkotlin Source Position ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġsource Position . elementAt . containing File ĊĠĠĠĠĠĠĠ Ġval Ġlocation Ġ= Ġsuspend Context . debug Process . invoke In Manager Thread Ġ{ Ġsuspend Context . frame Proxy ?. location () Ġ} Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( isIn Suspend Method ( location ) Ġ&& Ġ! is On Suspend Return Or Re enter ( location ) Ġ&& Ġ! is Last Line Location In Method ( location )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDebug Process Impl Helper . create Step Over Command With Custom Filter ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuspend Context , Ġignore Break points , ĠKotlin Suspend Call Step Over Filter ( source Position . line , Ġfile , Ġignore Break points ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠKotlin Source Position ( ĊĠĠĠĠĠĠĠ Ġval Ġfile : ĠK t File , Ġval Ġfunction : ĠK t Named Function , ĊĠĠĠĠĠĠĠ Ġval Ġlines Range : ĠInt Range , Ġval Ġsource Position : ĠSource Position ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġcreate ( source Position : ĠSource Position ): ĠKotlin Source Position ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġsource Position . file Ġas ? ĠK t File Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( source Position . line Ġ< Ġ 0 ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement At Ġ= Ġsource Position . elementAt Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontaining Function Ġ= Ġelement At . parents ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Is Instance < Kt Named Function >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ Ġ! it . is Local Ġ} Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart LineNumber Ġ= Ġcontaining Function . get LineNumber ( true ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend LineNumber Ġ= Ġcontaining Function . get LineNumber ( false ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( start LineNumber Ġ> Ġend LineNumber ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlines Range Ġ= Ġstart LineNumber .. end LineNumber ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠKotlin Source Position ( file , Ġcontaining Function , Ġlines Range , Ġsource Position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Special Step Over Needed ( kotlin Source Position : ĠKotlin Source Position ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsource Position Ġ= Ġkotlin Source Position . source Position ĊĊĠĠĠĠĠĠĠ Ġval Ġhas Inline Calls On Line Ġ= Ġget Inline Function Calls If Any ( source Position ). isNotEmpty () ĊĠĠĠĠĠĠĠ Ġif Ġ( has Inline Calls On Line ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠStep Ġover Ġcalls Ġto Ġlambda Ġarguments Ġin Ġinline Ġfunction Ġwhile Ġexecution Ġis Ġalready Ġin Ġthat Ġfunction ĊĠĠĠĠĠĠĠ Ġval Ġcontaining Function Descriptor Ġ= Ġkotlin Source Position . function . unsafe Resolve To Descriptor () ĊĠĠĠĠĠĠĠ Ġif Ġ( Inline Util . is Inline ( containing Function Descriptor )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinline Arguments Calls If Any Ġ= Ġget Inline Arguments Calls If Any ( source Position , Ġcontaining Function Descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( inline Arguments Calls If Any Ġ!= Ġnull Ġ&& Ġinline Arguments Calls If Any . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Only ĊĠĠĠ Ġfun Ġget Step Out Command ( suspend Context : ĠS uspend Context Impl , Ġdebug Context : ĠDebugger Context Impl ): ĠDebug Process Impl . Resume Command ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Step Out Command ( suspend Context , Ġdebug Context . source Position ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Step Out Command ( suspend Context : ĠS uspend Context Impl ?, Ġstep Size : ĠInt ): ĠDebug Process Impl . Resume Command ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( suspend Context Ġ== Ġnull Ġ|| Ġsuspend Context . is Res umed ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġsource Position Ġ= Ġsuspend Context . debug Process . debugger Context . source Position Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġget Step Out Command ( suspend Context , Ġsource Position ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Step Out Command ( suspend Context : ĠS uspend Context Impl , Ġsource Position : ĠSource Position ): ĠDebug Process Impl . Resume Command ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġsource Position . file Ġas ? ĠK t File Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( source Position . line Ġ< Ġ 0 ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġline Start Offset Ġ= Ġfile . getLine Start Offset ( source Position . line ) Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġinline Functions Ġ= Ġget Inline Functions If Any ( file , Ġline Start Offset ) ĊĠĠĠĠĠĠĠ Ġval Ġin lined Argument Ġ= Ġget Inline Argument If Any ( source Position . elementAt ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( inline Functions . isEmpty () Ġ&& Ġin lined Argument Ġ== Ġnull ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġreturn ĠDebugger Ste pping Helper . create Step Out Command ( suspend Context , Ġtrue , Ġinline Functions , Ġin lined Argument ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠPsi Element ?. contains ( element : ĠPsi Element ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġthis ?. text Range ?. contains ( element . text Range ) Ġ?: Ġfalse Ċ } Ċ Ċ private Ġfun Ġget Inline Call Function Arguments If Any ( source Position : ĠSource Position ): ĠList < Kt Function > Ġ{ ĊĠĠĠ Ġval Ġinline Function Calls Ġ= Ġget Inline Function Calls If Any ( source Position ) ĊĠĠĠ Ġreturn Ġget Inline Arguments If Any ( inline Function Calls ) Ċ } Ċ Ċ private Ġfun Ġget Inline Functions If Any ( file : ĠK t File , Ġoffset : ĠInt ): ĠList < Kt Named Function > Ġ{ ĊĠĠĠ Ġval Ġelement At Ġ= Ġfile . findElement At ( offset ) Ġ?: Ġreturn Ġempty List () ĊĠĠĠ Ġval Ġcontaining Function Ġ= Ġelement At . getParent OfType < Kt Named Function >( false ) Ġ?: Ġreturn Ġempty List () ĊĊĠĠĠ Ġval Ġdescriptor Ġ= Ġcontaining Function . unsafe Resolve To Descriptor () ĊĠĠĠ Ġif Ġ(! Inline Util . is Inline ( descriptor )) Ġreturn Ġempty List () ĊĊĠĠĠ Ġreturn ĠDebugger Utils . analyze Element With Inline ( containing Function , Ġfalse ). filter Is Instance < Kt Named Function >() Ċ } Ċ Ċ private Ġfun Ġget Inline Arguments If Any ( inline Function Calls : ĠList < Kt Call Expression >): ĠList < Kt Function > Ġ{ ĊĠĠĠ Ġreturn Ġinline Function Calls . flatMap Ġ{ ĊĠĠĠĠĠĠĠ Ġit . value Arguments ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map (:: get Argument Expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Is Instance < Kt Function >() ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġget Argument Expression ( it : ĠValue Argument ) Ġ= ĊĠĠĠ Ġ( it . get Argument Expression () Ġas ? ĠK t Lambda Expression )?. function Literal Ġ?: Ġit . get Argument Expression () Ċ Ċ private Ġfun Ġget Inline Arguments Calls If Any ( ĊĠĠĠ Ġsource Position : ĠSource Position , ĊĠĠĠ Ġdeclaration Descriptor : ĠDeclaration Descriptor Ċ ): ĠList < Kt Call Expression >? Ġ{ ĊĠĠĠ Ġif Ġ( declaration Descriptor Ġ! is ĠCallable Descriptor ) Ġreturn Ġnull ĊĊĠĠĠ Ġval Ġvalue Parameters Ġ= Ġdeclaration Descriptor . value Parameters . filter Ġ{ Ġit . type . isFunction Type Ġ}. toSet () ĊĊĠĠĠ Ġif Ġ( value Parameters . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Call Of Argument ( kt Call Expression : ĠK t Call Expression ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresolved Call Ġ= Ġkt Call Expression . resolve To Call () Ġas ? ĠVariable As Function Resolved Call Impl Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġcandidate Descriptor Ġ= Ġresolved Call . variable Call . candidate Descriptor ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcandidate Descriptor Ġin Ġvalue Parameters ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġfind Calls On Position ( source Position , Ġ:: is Call Of Argument ) Ċ } Ċ Ċ private Ġfun Ġget Inline Function Calls If Any ( source Position : ĠSource Position ): ĠList < Kt Call Expression > Ġ{ ĊĠĠĠ Ġfun Ġis Inline Call ( expr : ĠK t Call Expression ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresolved Call Ġ= Ġexpr . resolve To Call () Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn ĠInline Util . is Inline ( resolved Call . result ing Descriptor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġfind Calls On Position ( source Position , Ġ:: is Inline Call ) Ċ } Ċ Ċ private Ġfun Ġfind Calls On Position ( source Position : ĠSource Position , Ġfilter : Ġ( Kt Call Expression ) Ġ-> ĠBoolean ): ĠList < Kt Call Expression > Ġ{ ĊĠĠĠ Ġval Ġfile Ġ= Ġsource Position . file Ġas ? ĠK t File Ġ?: Ġreturn Ġempty List () ĊĠĠĠ Ġval ĠlineNumber Ġ= Ġsource Position . line ĊĊĠĠĠ Ġval Ġline Element Ġ= Ġfind ElementAt Line ( file , ĠlineNumber ) ĊĊĠĠĠ Ġif Ġ( line Element Ġ! is ĠK t Element ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( line Element Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Ġ= Ġfind Call By End Token ( line Element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( call Ġ!= Ġnull Ġ&& Ġfilter ( call )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( call ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġstart Ġ= Ġline Element . start Offset ĊĠĠĠ Ġval Ġend Ġ= Ġline Element . end Offset ĊĊĠĠĠ Ġval Ġall Filtered Calls Ġ= ĠCode Insight Utils . find Elements Of Class InRange ( file , Ġstart , Ġend , ĠK t Expression :: class . java ) ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠK t Psi Util . getParent Call If Present ( it Ġas ĠK t Expression ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. filter Is Instance < Kt Call Expression >() ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġfilter ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. toSet () ĊĊĠĠĠ Ġ// ĠIt Ġis Ġnecessary Ġto Ġcheck Ġrange Ġbecause Ġof Ġmultiline Ġassign ĊĠĠĠ Ġvar Ġlines Range Ġ= ĠlineNumber .. line Number ĊĠĠĠ Ġreturn Ġall Filtered Calls . filter Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġshould Include Ġ= Ġit . get LineNumber () Ġin Ġlines Range ĊĠĠĠĠĠĠĠ Ġif Ġ( should Include ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlines Range Ġ= ĠMath . min ( lines Range . start , Ġit . get LineNumber ()) .. Math . max ( lines Range . end Inclusive , Ġit . get LineNumber ( false )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġshould Include ĊĠĠĠ Ġ} Ċ } Ċ Ċ sealed Ġclass ĠAction ( ĊĠĠĠ Ġval Ġposition : ĠX Source Position Impl ? Ġ= Ġnull , ĊĠĠĠ Ġval Ġstep Over InlineData : ĠStep Over Filter Data ? Ġ= Ġnull Ċ ) Ġ{ ĊĠĠĠ Ġclass ĠSTEP _ OVER Ġ: ĠAction () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( debug Process : ĠDebug Process Impl , Ġsuspend Context : ĠS uspend Context Impl , Ġignore Break points : ĠBoolean ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Process . create Step Over Command ( suspend Context , Ġignore Break points ). context Action ( suspend Context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠSTEP _ OUT Ġ: ĠAction () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( debug Process : ĠDebug Process Impl , Ġsuspend Context : ĠS uspend Context Impl , Ġignore Break points : ĠBoolean ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Process . create Step Out Command ( suspend Context ). context Action ( suspend Context ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠRUN _ TO _ CURSOR ( position : ĠX Source Position Impl ) Ġ: ĠAction ( position ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( debug Process : ĠDebug Process Impl , Ġsuspend Context : ĠS uspend Context Impl , Ġignore Break points : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrun Read Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdebug Process . create Run To Cursor Command ( suspend Context , Ġposition !! , Ġignore Break points ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. context Action ( suspend Context ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠSTEP _ OVER _ IN LIN ED ( step Over InlineData : ĠStep Over Filter Data ) Ġ: ĠAction ( step Over InlineData Ġ= Ġstep Over InlineData ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( debug Process : ĠDebug Process Impl , Ġsuspend Context : ĠS uspend Context Impl , Ġignore Break points : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠKotlin Step Action Factory ( debug Process ). create Kotlin Step Over Inline Action ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Step Over Inline Filter ( debug Process . project , Ġstep Over InlineData !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). context Action ( suspend Context ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġabstract Ġfun Ġapply ( debug Process : ĠDebug Process Impl , Ġsuspend Context : ĠS uspend Context Impl , Ġignore Break points : ĠBoolean ) Ċ } Ċ Ċ interface ĠKotlin Method Filter Ġ: ĠMethod Filter Ġ{ ĊĠĠĠ Ġfun Ġlocation Matches ( context : ĠS uspend Context Impl , Ġlocation : ĠLocation ): ĠBoolean Ċ } Ċ Ċ fun Ġget Step Over Action ( ĊĠĠĠ Ġlocation : ĠLocation , ĊĠĠĠ Ġkotlin Source Position : ĠKotlin Ste pping Command Provider . Kotlin Source Position , ĊĠĠĠ Ġframe Proxy : ĠStack Frame Proxy Impl , ĊĠĠĠ Ġis Dex Debug : ĠBoolean Ċ ): ĠAction Ġ{ ĊĠĠĠ Ġval Ġinline Arguments To Skip Ġ= Ġrun Read Action Ġ{ ĊĠĠĠĠĠĠĠ Ġget Inline Call Function Arguments If Any ( kotlin Source Position . source Position ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġget Step Over Action ( ĊĠĠĠĠĠĠĠ Ġlocation , Ġkotlin Source Position . file , Ġkotlin Source Position . lines Range , ĊĠĠĠĠĠĠĠ Ġinline Arguments To Skip , Ġframe Proxy , Ġis Dex Debug ĊĠĠĠ Ġ) Ċ } Ċ Ċ fun Ġget Step Over Action ( ĊĠĠĠ Ġlocation : ĠLocation , ĊĠĠĠ Ġsource File : ĠK t File , ĊĠĠĠ Ġrange : ĠInt Range , ĊĠĠĠ Ġinline Function Arguments : ĠList < Kt Element >, ĊĠĠĠ Ġframe Proxy : ĠStack Frame Proxy Impl , ĊĠĠĠ Ġis Dex Debug : ĠBoolean Ċ ): ĠAction Ġ{ ĊĠĠĠ Ġlocation . decl aring Type () Ġ?: Ġreturn ĠAction . STEP _ OVER () ĊĊĠĠĠ Ġval Ġproject Ġ= Ġsource File . project ĊĊĠĠĠ Ġval Ġmethod Locations Ġ= Ġlocation . method (). all Line Locations () ĊĠĠĠ Ġval Ġlocations Line And File Ġ= Ġmethod Locations . keys ToMap Ġ{ Ġkt Location Info ( it , Ġis Dex Debug , Ġproject , Ġtrue ) Ġ} ĊĊĠĠĠ Ġfun ĠLocation . kt LineNumber (): ĠInt Ġ= Ġ( locations Line And File [ this ] Ġ?: Ġkt Location Info ( this , Ġis Dex Debug , Ġproject , Ġtrue )). first ĊĠĠĠ Ġfun ĠLocation . kt FileName (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkt File Ġ= Ġ( locations Line And File [ this ] Ġ?: Ġkt Location Info ( this , Ġis Dex Debug , Ġproject , Ġtrue )). second ĊĠĠĠĠĠĠĠ Ġ// ĠFile Ġis Ġnot Ġnull Ġonly Ġfor Ġin lined Ġlocations . ĠGet Ġfile Ġname Ġfrom Ġdebugger Ġinformation Ġotherwise . ĊĠĠĠĠĠĠĠ Ġreturn Ġkt File ?. name Ġ?: Ġthis . source Name ( K OT LIN _ STR ATA _ NAME ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis This Method Location ( next Location : ĠLocation ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( next Location . method () Ġ!= Ġlocation . method ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġkt LineNumber Ġ= Ġnext Location . kt LineNumber () ĊĠĠĠĠĠĠĠ Ġif Ġ( kt LineNumber Ġ! in Ġrange ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnext Location . kt FileName () Ġ== Ġsource File . name ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠAbs ent Information Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Back Edge Location (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprevious Suit able Location Ġ= Ġmethod Locations . reversed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. drop While Ġ{ Ġit Ġ!= Ġlocation Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. drop ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter (:: is This Method Location ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. drop While Ġ{ Ġit . kt LineNumber () Ġ== Ġlocation . kt LineNumber () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġprevious Suit able Location Ġ!= Ġnull Ġ&& Ġprevious Suit able Location . kt LineNumber () Ġ> Ġlocation . kt LineNumber () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġpatched Location Ġ= Ġif Ġ( is Back Edge Location ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠP ret end Ġwe Ġhad Ġalready Ġdone Ġa Ġbacking Ġstep ĊĠĠĠĠĠĠĠ Ġmethod Locations ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter (:: is This Method Location ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ Ġit . kt LineNumber () Ġ== Ġlocation . kt LineNumber () Ġ} Ġ?: Ġlocation ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġlocation ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġpatched LineNumber Ġ= Ġpatched Location . kt LineNumber () ĊĊĠĠĠ Ġval Ġlambda Argument Ranges Ġ= Ġrun Read Action Ġ{ ĊĠĠĠĠĠĠĠ Ġinline Function Arguments . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart LineNumber Ġ= Ġit . get LineNumber ( true ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend LineNumber Ġ= Ġit . get LineNumber ( false ) Ġ+ Ġ 1 ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart LineNumber .. end LineNumber ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġinline Range Variables Ġ= Ġget Inline Range Local Variables ( frame Proxy ) ĊĊĠĠĠ Ġ// ĠTry Ġto Ġfind Ġthe Ġrange Ġfor Ġstep Ġover : ĊĠĠĠ Ġ// Ġ- ĠLines Ġfrom Ġother Ġfiles Ġand Ġfrom Ġfunctions Ġthat Ġare Ġnot Ġin Ġrange Ġof Ġcurrent Ġone Ġare Ġdefinitely Ġin lined Ġand Ġshould Ġbe Ġste pped Ġover . ĊĠĠĠ Ġ// Ġ- ĠLines Ġin Ġfunction Ġarguments Ġof Ġin lined Ġfunctions Ġare Ġin lined Ġtoo Ġas Ġwe Ġfound Ġthem Ġstarting Ġfrom Ġthe Ġposition Ġof Ġin lined Ġcall . ĊĠĠĠ Ġ// Ġ- ĠCurrent Ġline Ġlocations Ġshould Ġalso Ġbe Ġste pped Ġover . ĊĠĠĠ Ġ// ĊĠĠĠ Ġ// ĠWe Ġmight Ġerr one ously Ġextend Ġthis Ġrange Ġtoo Ġmuch Ġwhen Ġthere 's Ġa Ġcall Ġof Ġfunction Ġargument Ġor Ġother ĊĠĠĠ Ġ// Ġinline Ġfunction Ġin Ġlast Ġstatement Ġof Ġinline Ġfunction . ĠThe Ġlist Ġof Ġinline Range Variables Ġwill Ġbe Ġused Ġlater Ġto Ġover come Ġit . ĊĠĠĠ Ġval Ġstep Over Locations Ġ= Ġmethod Locations ĊĠĠĠĠĠĠĠ Ġ. drop While Ġ{ Ġit Ġ!= Ġpatched Location Ġ} ĊĠĠĠĠĠĠĠ Ġ. drop ( 1 ) ĊĠĠĠĠĠĠĠ Ġ. drop While Ġ{ Ġit . kt LineNumber () Ġ== Ġpatched LineNumber Ġ} ĊĠĠĠĠĠĠĠ Ġ. take While Ġ{ Ġloc Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! is This Method Location ( loc ) Ġ|| Ġlambda Argument Ranges . any Ġ{ Ġloc . kt LineNumber () Ġin Ġit Ġ} Ġ|| Ġloc . kt LineNumber () Ġ== Ġpatched LineNumber ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ(! step Over Locations . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSome ĠKotlin Ġin lined Ġmethods Ġwith Ġ' for ' Ġ( and Ġmaybe Ġothers ) Ġgenerates Ġbytecode Ġthat Ġafter Ġde xing Ġhave Ġa Ġstrange Ġartifact . ĊĠĠĠĠĠĠĠ Ġ// ĠGOTO Ġinstructions Ġare Ġmoved Ġto Ġthe Ġend Ġof Ġmethod Ġand Ġas Ġthey Ġdon 't Ġhave Ġproper Ġline , Ġline Ġis Ġobtained Ġfrom Ġthe Ġprevious ĊĠĠĠĠĠĠĠ Ġ// Ġinstruction . ĠIt Ġmight Ġbe Ġmethod Ġreturn Ġor Ġprevious ĠGOTO Ġfrom Ġthe Ġin lining . ĠSimple Ġste pping Ġover Ġsuch Ġfunction Ġis Ġreally ĊĠĠĠĠĠĠĠ Ġ// Ġter rible . ĠOn Ġeach Ġiteration Ġposition Ġjumps Ġto Ġthe Ġmethod Ġend Ġor Ġsome Ġprevious Ġinline Ġcall Ġand Ġthen Ġreturns Ġback . ĠTo Ġprevent ĊĠĠĠĠĠĠĠ Ġ// Ġthis Ġfilter Ġlocations Ġwith Ġtoo Ġbig Ġcode Ġindexes Ġmanually ĊĠĠĠĠĠĠĠ Ġval Ġreturn Code Index : ĠLong Ġ= Ġif Ġ( is Dex Debug ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġlocation . method () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocations Of Line Ġ= Ġmethod . safe Locations Of Line ( range . last ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( locations Of Line . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocations Of Line . map Ġ{ Ġit . code Index () Ġ}. max () Ġ?: Ġ- 1 L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Return From Dex Byte code ( location . method ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ- 1 L ĊĊĠĠĠĠĠĠĠ Ġreturn ĠAction . STEP _ OVER _ IN LIN ED ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStep Over Filter Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpatched LineNumber , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstep Over Locations . map Ġ{ Ġit . kt LineNumber () Ġ}. toSet (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinline Range Variables , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Dex Debug , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Code Index ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠAction . STEP _ OVER () Ċ } Ċ Ċ fun Ġget Step Out Action ( ĊĠĠĠ Ġlocation : ĠLocation , ĊĠĠĠ Ġsuspend Context : ĠS uspend Context Impl , ĊĠĠĠ Ġinline Functions : ĠList < Kt Named Function >, ĊĠĠĠ Ġin lined Argument : ĠK t Function Literal ? Ċ ): ĠAction Ġ{ ĊĠĠĠ Ġval Ġcomputed Reference Type Ġ= Ġlocation . decl aring Type () Ġ?: Ġreturn ĠAction . STEP _ OUT () ĊĊĠĠĠ Ġval Ġlocations Ġ= Ġcomputed Reference Type . safe All Line Locations () ĊĠĠĠ Ġval Ġnext Line Locations Ġ= Ġlocations ĊĠĠĠĠĠĠĠ Ġ. drop While Ġ{ Ġit Ġ!= Ġlocation Ġ} ĊĠĠĠĠĠĠĠ Ġ. drop ( 1 ) ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . method () Ġ== Ġlocation . method () Ġ} ĊĠĠĠĠĠĠĠ Ġ. drop While Ġ{ Ġit . line Number () Ġ== Ġlocation . line Number () Ġ} ĊĊĠĠĠ Ġif Ġ( inline Functions . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġsuspend Context . getX Position For Step Out From Inline Function ( nextLine Locations , Ġinline Functions ) ĊĠĠĠĠĠĠĠ Ġreturn Ġposition ?. let Ġ{ ĠAction . RUN _ TO _ CURSOR ( it ) Ġ} Ġ?: ĠAction . STEP _ OVER () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( in lined Argument Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġsuspend Context . getX Position For Step Out From In lined Argument ( nextLine Locations , Ġin lined Argument ) ĊĠĠĠĠĠĠĠ Ġreturn Ġposition ?. let Ġ{ ĠAction . RUN _ TO _ CURSOR ( it ) Ġ} Ġ?: ĠAction . STEP _ OVER () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠAction . STEP _ OVER () Ċ } Ċ Ċ private Ġfun ĠS uspend Context Impl . getX Position For Step Out From Inline Function ( ĊĠĠĠ Ġlocations : ĠList < Location >, ĊĠĠĠ Ġinline Functions To Skip : ĠList < Kt Named Function > Ċ ): ĠX Source Position Impl ? Ġ{ ĊĠĠĠ Ġreturn ĠgetNext Position With Filter ( locations ) Ġ{ Ġoffset , Ġelement At Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( inline Functions To Skip . any Ġ{ Ġit . text Range . contains ( offset ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ getNext Position With Filter Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġget Inline Argument If Any ( elementAt ) Ġ!= Ġnull ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠS uspend Context Impl . getX Position For Step Out From In lined Argument ( ĊĠĠĠ Ġlocations : ĠList < Location >, ĊĠĠĠ Ġin lined Argument To Skip : ĠK t Function Literal Ċ ): ĠX Source Position Impl ? Ġ{ ĊĠĠĠ Ġreturn ĠgetNext Position With Filter ( locations ) Ġ{ Ġoffset , Ġ_ Ġ-> ĊĠĠĠĠĠĠĠ Ġin lined Argument To Skip . text Range . contains ( offset ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠS uspend Context Impl . getNext Position With Filter ( ĊĠĠĠ Ġlocations : ĠList < Location >, ĊĠĠĠ Ġskip : Ġ( Int , ĠPsi Element ) Ġ-> ĠBoolean Ċ ): ĠX Source Position Impl ? Ġ{ ĊĠĠĠ Ġfor Ġ( location Ġin Ġlocations ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġrun Read Action Ġl @{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Position Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . debug Process . position Manager . getSource Position ( location ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNo DataException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġreturn @ l Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġsource Position . file Ġas ? ĠK t File Ġ?: Ġreturn @ l Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement At Ġ= Ġsource Position . elementAt Ġ?: Ġreturn @ l Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Line Ġ= Ġlocation . line Number () Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġline Start Offset Ġ= Ġfile . getLine Start Offset ( current Line ) Ġ?: Ġreturn @ l Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( skip ( line Start Offset , Ġelement At )) Ġreturn @ l Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠX Source Position Impl . create By Element ( elementAt ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( position Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġposition ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġnull Ċ } Ċ Ċ fun Ġget Inline Range Local Variables ( stack Frame : ĠStack Frame Proxy Impl ): ĠList < Local Variable > Ġ{ ĊĠĠĠ Ġreturn Ġstack Frame . visible Variables () ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġit . name () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname . startsWith ( Jvm Ab i . LOCAL _ VARIABLE _ NAME _ PREFIX _ INLINE _ FUNCTION ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . variable Ġ} Ċ } Ċ Ċ private Ġfun Ġget Inline Argument If Any ( elementAt : ĠPsi Element ?): ĠK t Function Literal ? Ġ{ ĊĠĠĠ Ġval Ġfunction Literal Expression Ġ= Ġelement At ?. getParent OfType < Kt Lambda Expression >( false ) Ġ?: Ġreturn Ġnull ĊĊĠĠĠ Ġval Ġcontext Ġ= Ġfunction Literal Expression . analyze ( Body Resolve Mode . PAR TIAL ) ĊĠĠĠ Ġif Ġ(! Inline Util . isIn lined Argument ( function Literal Expression . function Literal , Ġcontext , Ġfalse )) Ġreturn Ġnull ĊĊĠĠĠ Ġreturn Ġfunction Literal Expression . function Literal Ċ } Ċ Ċ private Ġfun Ġfind Return From Dex Byte code ( method : ĠMethod ): ĠLong Ġ{ ĊĠĠĠ Ġval Ġmethod Locations Ġ= Ġmethod . safe All Line Locations () ĊĠĠĠ Ġif Ġ( method Locations . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ- 1 L ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġlast Method Code Index Ġ= Ġmethod Locations . last (). code Index () ĊĠĠĠ Ġ// ĠContinue Ġwhile Ġit 's Ġpossible Ġto Ġget Ġlocation ĊĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( method . location Of Code Index ( last Method Code Index Ġ+ Ġ 1 ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Method Code Index ++ ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġreturn Index Ġ= Ġlast Method Code Index Ġ+ Ġ 1 ĊĊĠĠĠ Ġval Ġbytecode Ġ= Ġmethod . byte codes () ĊĠĠĠ Ġvar Ġi Ġ= Ġbytecode . size ĊĊĠĠĠ Ġwhile Ġ( i Ġ>= Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCan Ġstep Ġonly Ġthrough Ġtwo - byte Ġinstructions Ġand Ġabort Ġon Ġany Ġunknown Ġone ĊĠĠĠĠĠĠĠ Ġi Ġ-= Ġ 2 ĊĠĠĠĠĠĠĠ Ġreturn Index Ġ-= Ġ 1 ĊĊĠĠĠĠĠĠĠ Ġval Ġinstruction Ġ= Ġbytecode [ i ]. toInt () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( instruction Ġ== ĠRETURN _ VOID Ġ|| Ġinstruction Ġ== ĠRETURN Ġ|| Ġinstruction Ġ== ĠRETURN _ W IDE Ġ|| Ġinstruction Ġ== ĠRETURN _ OBJECT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInstruction Ġfound ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġreturn Index ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( instruction Ġ== ĠMOVE Ġ|| Ġinstruction Ġ== ĠGOTO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġproceed ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDon 't Ġknow Ġthe Ġinstruction Ġand Ġit 's Ġlength . ĠAbort . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġ- 1 L Ċ } Ċ Ċ object ĠDex Byte code Ġ{ ĊĠĠĠ Ġval ĠRETURN _ VOID Ġ= Ġ 0 x 0 e ĊĠĠĠ Ġval ĠRETURN Ġ= Ġ 0 x 0 f ĊĠĠĠ Ġval ĠRETURN _ W IDE Ġ= Ġ 0 x 1 0 ĊĠĠĠ Ġval ĠRETURN _ OBJECT Ġ= Ġ 0 x 1 1 ĊĊĠĠĠ Ġval ĠGOTO Ġ= Ġ 0 x 2 8 ĊĠĠĠ Ġval ĠMOVE Ġ= Ġ 0 x 0 1 Ċ } Ċ