/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 4 Ġ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 . jet . plugin . debugger . evaluate Ċ Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . psi . util . Cached Values Manager Ċ import Ġcom . intellij . psi . util . Cached Value Provider Ċ import Ġcom . intellij . psi . util . Psi Modification Tracker Ċ import Ġorg . jetbrains . jet . lang . psi . Jet Code Fragment Ċ import Ġcom . intellij . debugger . Source Position Ċ import Ġcom . intellij . debugger . engine . evaluation . Evaluation Context Impl Ċ import Ġjava . util . ArrayList Ċ import Ġcom . intellij . openapi . components . Service Manager Ċ import Ġorg . jetbrains . org . object web . asm . Type Ċ import Ġcom . intellij . util . containers . Multi Map Ċ import Ġorg . jetbrains . jet . lang . types . Jet Type Ċ import Ġorg . jetbrains . jet . lang . resolve . java . mapping . Java To Kotlin Class Map Ċ import Ġcom . intellij . psi . search . Global Search Scope Ċ import Ġcom . intellij . psi . Java Psi Facade Ċ import Ġorg . jetbrains . jet . lang . resolve . Descriptor Utils Ċ import Ġorg . jetbrains . jet . lang . descriptors . Class Descriptor Ċ import Ġorg . jetbrains . jet . plugin . cache s . resolve . Java Resolve Extension Ċ import Ġorg . jetbrains . jet . lang . resolve . java . structure . impl . Java Class Impl Ċ import Ġorg . jetbrains . jet . lang . resolve . java . Jvm ClassName Ċ import Ġorg . jetbrains . jet . codegen . Asm Util Ċ import Ġorg . apache . log 4 j . Logger Ċ import Ġorg . jetbrains . jet . plugin . refactor ing . run Read Action Ċ Ċ class ĠKotlin Evaluate Expression Cache ( val Ġproject : ĠProject ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcached Compiled Data Ġ= ĠCached Values Manager . getManager ( project ). create Cached Value ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCached Value Provider . Result < Multi Map < String , ĠComp iled Data Descriptor >>( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMulti Map . create (), ĠPsi Modification Tracker . MO DIF ICATION _ COUNT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġfalse ) ĊĊĠĠĠ Ġclass Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOG Ġ= ĠLogger . getLogger ( java Class < Kotlin Evaluate Expression Cache >()) !! ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetInstance ( project : ĠProject ) Ġ= ĠService Manager . getService ( project , Ġjava Class < Kotlin Evaluate Expression Cache >()) !! ĊĊĠĠĠĠĠĠĠ Ġfun Ġget OrCreate Compiled Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcode Fragment : ĠJet Code Fragment , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Position : ĠSource Position , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevaluation Context : ĠEvaluation Context Impl , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate : Ġ( Jet Code Fragment , ĠSource Position ) Ġ-> ĠComp iled Data Descriptor ĊĠĠĠĠĠĠĠ Ġ): ĠComp iled Data Descriptor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevaluate Expression Cache Ġ= ĠgetInstance ( code Fragment . getProject ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsynchronized ( evaluate Expression Cache . cached Compiled Data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(): ĠComp iled Data Descriptor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcache Ġ= Ġevaluate Expression Cache . cached Compiled Data . getValue () !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġ"${ code Fragment . imports ToString () }\ n ${ code Fragment . getText () }" ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanswer Ġ= Ġcache [ text ]. first OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . source Position Ġ== Ġsource Position Ġ|| Ġevaluate Expression Cache . can Be Evalu ated In This Context ( it , Ġevaluation Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( answer Ġ!= Ġnull ) Ġreturn @ synchronized Ġanswer ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Compiled Data Ġ= Ġcreate ( code Fragment , Ġsource Position ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . debug (" Compile Ġbytecode Ġfor Ġ${ code Fragment . getText () }") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache . put Value ( text , Ġnew Compiled Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ synchronized Ġnew Compiled Data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcan Be Evalu ated In This Context ( compiled Data : ĠComp iled Data Descriptor , Ġcontext : ĠEvaluation Context Impl ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcompiled Data . parameters . all Ġ{ Ġ( p ): ĠBoolean Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( name , Ġjet Type ) Ġ= Ġp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġcontext . find Local Variable ( name , Ġasm Type Ġ= Ġnull , Ġcheck Type Ġ= Ġfalse , Ġfail If NotFound Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ== Ġnull ) Ġreturn @ all Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthis Descriptor Ġ= Ġvalue . asm Type . getClass Descriptor () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠsuperClass Descriptor Ġ= Ġjet Type . get Constructor (). get Declaration Descriptor () Ġas ? ĠClass Descriptor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ all Ġthis Descriptor Ġ!= Ġnull Ġ&& ĠsuperClass Descriptor Ġ!= Ġnull Ġ&& ĠDescriptor Utils . is Subclass ( this Descriptor , ĠsuperClass Descriptor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠType . getClass Descriptor (): ĠClass Descriptor ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Asm Util . is Primitive ( this )) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġj vm Name Ġ= ĠJ vm ClassName . by Internal Name ( get Internal Name ()). getF q Name For ClassName Without Dollar s () ĊĊĠĠĠĠĠĠĠ Ġval Ġplatform Classes Ġ= ĠJava To Kotlin Class Map . getInstance (). map Platform Class ( jvm Name ) ĊĠĠĠĠĠĠĠ Ġif Ġ( platform Classes . not Empty ) Ġreturn Ġplatform Classes . first () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġrun Read Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclasses Ġ= ĠJava Psi Facade . getInstance ( project ). find Classes ( jvm Name . asString (), ĠGlobal Search Scope . all Scope ( project )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( classes . isEmpty ()) Ġnull Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclazz Ġ= Ġclasses . first () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJava Resolve Extension . get Resolver ( project , Ġclazz ). resolve Class ( Java Class Impl ( clazz )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdata Ġclass ĠComp iled Data Descriptor ( val Ġbyte codes : ĠByteArray , Ġval Ġsource Position : ĠSource Position , Ġval Ġfun Name : ĠString , Ġval Ġparameters : ĠParameters Descriptor ) ĊĊĠĠĠ Ġclass ĠParameters Descriptor Ġ: ĠIterable < Pair < String , ĠJet Type >> Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlist Ġ= ĠArrayList < Pair < String , ĠJet Type >>() ĊĊĠĠĠĠĠĠĠ Ġfun Ġadd ( name : ĠString , Ġjet Type : ĠJet Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add ( name Ġto Ġjet Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Parameter Names () Ġ= Ġlist . map Ġ{ Ġit . first Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġiterator () Ġ= Ġlist . iterator () ĊĠĠĠ Ġ} Ċ }