/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 6 Ġ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 . resolve . calls . check ers Ċ Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġorg . jetbrains . kotlin . config . Language Feature Ċ import Ġorg . jetbrains . kotlin . descriptors . Function Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Simple Function Descriptor Ċ import Ġorg . jetbrains . kotlin . diagnostics . Errors Ċ import Ġorg . jetbrains . kotlin . psi . Kt Expression Ċ import Ġorg . jetbrains . kotlin . resolve . Binding Context Ċ import Ġorg . jetbrains . kotlin . resolve . calls . model . Resolved Call Ċ import Ġorg . jetbrains . kotlin . resolve . coroutine . Coroutine Receiver Value Ċ import Ġorg . jetbrains . kotlin . resolve . inline . Inline Util Ċ import Ġorg . jetbrains . kotlin . resolve . scopes . Lex ical Scope Ċ import Ġorg . jetbrains . kotlin . resolve . scopes . utils . get Implicit Re ceiv ers Hierarchy Ċ import Ġorg . jetbrains . kotlin . resolve . scopes . utils . parent sWith Self Ċ Ċ object ĠCor outine Suspend Call Checker Ġ: ĠCall Checker Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcheck ( resolved Call : ĠResolved Call <* >, Ġreport On : ĠPsi Element , Ġcontext : ĠCall Checker Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġresolved Call . candidate Descriptor Ġas ? ĠSimple Function Descriptor Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ(! descriptor . is Suspend ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġclosest Coroutine Receiver Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . scope . get Implicit Re ceiv ers Hierarchy (). first OrNull Ġ{ Ġit . value Ġis ĠCor outine Receiver Value Ġ} ?. value Ġas ĠCor outine Receiver Value ? ĊĊĠĠĠĠĠĠĠ Ġval Ġen closing Suspend Function Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . scope . parent sWith Self . filter Is Instance < Lex ical Scope >(). take While Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclosest Coroutine Receiver Ġ== Ġnull Ġ|| Ġit . implicit Receiver ?. value Ġ!= Ġclosest Coroutine Receiver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. first OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( it . owner Descriptor Ġas ? ĠFunction Descriptor )?. is Suspend Ġ== Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. owner Descriptor Ġas ? ĠSimple Function Descriptor ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġen closing Suspend Function Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTail Ġcalls Ġchecks Ġhappen Ġduring Ġcontrol Ġflow Ġanalysis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHere Ġwe Ġonly Ġrecord Ġen closing Ġfunction Ġmapping Ġ( for Ġbackends Ġpurposes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . trace . record ( Binding Context . ENC LO SING _ SUS PEND _ FUNCTION _ FOR _ SUS PEND _ FUNCTION _ CALL , Ġresolved Call . call , Ġen closing Suspend Function ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclosest Coroutine Receiver Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Element Ġ= Ġresolved Call . call . call Element Ġas ĠK t Expression ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Inline Util . check Non Local Return Usage ( closest Coroutine Receiver . declaration Descriptor , Ġcall Element , Ġcontext . resolution Context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . trace . report ( Errors . NON _ LOCAL _ SUS P ENSION _ POINT . on ( report On )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . trace . record ( Binding Context . COR OUT INE _ RECE IVER _ FOR _ SUS P ENSION _ POINT , Ġresolved Call . call , Ġclosest Coroutine Receiver ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . trace . report ( Errors . IL LEG AL _ SUS PEND _ FUNCTION _ CALL . on ( report On )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ object ĠBuilder Functions Call Checker Ġ: ĠCall Checker Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcheck ( resolved Call : ĠResolved Call <* >, Ġreport On : ĠPsi Element , Ġcontext : ĠCall Checker Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġresolved Call . candidate Descriptor Ġas ? ĠFunction Descriptor Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( descriptor . value Parameters . any Ġ{ Ġit . is Coroutine Ġ} Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! context . language Version Settings . supports Feature ( Language Feature . Cor outines )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . trace . report ( Errors . UNSUPPORTED _ FEATURE . on ( report On , ĠLanguage Feature . Cor outines )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ