/* Ċ Ġ* Ġ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 . u ast . kotlin Ċ Ċ import Ġcom . intellij . lang . Language Ċ import Ġcom . intellij . openapi . components . Service Manager Ċ import Ġcom . intellij . openapi . util . Key Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi File Ċ import Ġcom . intellij . psi . impl . source . tree . Leaf Psi Element Ċ import Ġorg . jetbrains . kotlin . as Java . Light Class Util Ċ import Ġorg . jetbrains . kotlin . as Java . classes . Kt Light Class Ċ import Ġorg . jetbrains . kotlin . as Java . classes . Kt Light Class For Facade Ċ import Ġorg . jetbrains . kotlin . as Java . elements .* Ċ import Ġorg . jetbrains . kotlin . as Java . to Light Class Ċ import Ġorg . jetbrains . kotlin . codegen . state . Kotlin Type Mapper Ċ import Ġorg . jetbrains . kotlin . config . Language Version Settings Ċ import Ġorg . jetbrains . kotlin . descriptors . Class Constructor Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Class Kind Ċ import Ġorg . jetbrains . kotlin . descriptors . Constructor Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Function Descriptor Ċ import Ġorg . jetbrains . kotlin . idea . Kotlin Language Ċ import Ġorg . jetbrains . kotlin . lexer . Kt Tokens Ċ import Ġorg . jetbrains . kotlin . psi .* Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . getParent OfType Ċ import Ġorg . jetbrains . kotlin . resolve . Binding Context Ċ import Ġorg . jetbrains . kotlin . resolve . calls . call Util . get Resolved Call Ċ import Ġorg . jetbrains . u ast .* Ċ import Ġorg . jetbrains . u ast . kotlin . declarations . Kotlin U Identifier Ċ import Ġorg . jetbrains . u ast . kotlin . declarations . Kotlin U Method Ċ import Ġorg . jetbrains . u ast . kotlin . expressions .* Ċ import Ġorg . jetbrains . u ast . kotlin . psi . U ast Kotlin Psi Parameter Ċ import Ġorg . jetbrains . u ast . kotlin . psi . U ast Kotlin Psi Variable Ċ Ċ interface ĠKotlin U ast Resolve Provider Service Ġ{ ĊĠĠĠ Ġfun Ġget Binding Context ( element : ĠK t Element ): ĠBinding Context ĊĠĠĠ Ġfun ĠgetType Mapper ( element : ĠK t Element ): ĠKotlin Type Mapper ? ĊĠĠĠ Ġfun Ġget Language Version Settings ( element : ĠK t Element ): ĠLanguage Version Settings ĊĠĠĠ Ġfun Ġis Jvm Element ( psi Element : ĠPsi Element ): ĠBoolean Ċ } Ċ Ċ var ĠPsi Element . destruct uring Declaration Initializer : ĠBoolean ? Ġby ĠUser Data Property ( Key . create (" kotlin . u ast . destruct uring Declaration Initializer ")) Ċ Ċ class ĠKotlin U ast Language Plugin Ġ: ĠU ast Language Plugin Ġ{ ĊĠĠĠ Ġoverride Ġval Ġpriority Ġ= Ġ 1 0 ĊĊĠĠĠ Ġoverride Ġval Ġlanguage : ĠLanguage ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠKotlin Language . INSTANCE ĊĊĠĠĠ Ġoverride Ġfun Ġis File Supported ( fileName : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠfileName . endsWith (". kt ", Ġfalse ) Ġ|| ĠfileName . endsWith (". k ts ", Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠPsi Element . is Jvm Element : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresolve Provider Ġ= ĠService Manager . getService ( project , ĠKotlin U ast Resolve Provider Service :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresolve Provider . is Jvm Element ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġconvert Element ( element : ĠPsi Element , Ġparent : ĠU Element ?, Ġrequired Type : ĠClass < out ĠU Element >? ): ĠU Element ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! element . is Jvm Element ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġconvert Declaration Or Element ( element , Ġparent , Ġrequired Type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġconvert Element With Parent ( element : ĠPsi Element , Ġrequired Type : ĠClass < out ĠU Element >? ): ĠU Element ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! element . is Jvm Element ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( element Ġis ĠPsi File ) Ġreturn Ġconvert Declaration ( element , Ġnull , Ġrequired Type ) ĊĠĠĠĠĠĠĠ Ġif Ġ( element Ġis ĠK t Light Class For Facade ) Ġreturn Ġconvert Declaration ( element , Ġnull , Ġrequired Type ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġconvert Declaration Or Element ( element , Ġnull , Ġrequired Type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconvert Declaration Or Element ( element : ĠPsi Element , Ġgiven Parent : ĠU Element ?, Ġrequired Type : ĠClass < out ĠU Element >? ): ĠU Element ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( element Ġis ĠU Element ) Ġreturn Ġelement ĊĊĠĠĠĠĠĠĠ Ġif Ġ( element . isValid ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . getUser Data ( K OT LIN _ C ACHED _ UE LEMENT _ KEY )?. get ()?. let Ġ{ Ġcached U Element Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( required Type Ġ== Ġnull Ġ|| Ġrequired Type . is Instance ( cached U Element )) Ġcached U Element Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġu Element Ġ= Ġconvert Declaration ( element , Ġgiven Parent , Ġrequired Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠKotlin Converter . convert Psi Element ( element , Ġgiven Parent , Ġrequired Type ) ĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠ Ġif Ġ( u Element Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement . put UserData ( K OT LIN _ C ACHED _ UE LEMENT _ KEY , ĠWeak Reference ( u Element )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġreturn Ġu Element ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget MethodCall Expression ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement : ĠPsi Element , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontaining Class Fq Name : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠmethodName : ĠString ĊĠĠĠ Ġ): ĠU ast Language Plugin . Resolved Method ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( element Ġ! is ĠK t Call Expression ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġresolved Call Ġ= Ġelement . get Resolved Call ( element . analyze ()) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġresulting Descriptor Ġ= Ġresolved Call . result ing Descriptor ĊĠĠĠĠĠĠĠ Ġif Ġ( result ing Descriptor Ġ! is ĠFunction Descriptor Ġ|| Ġresulting Descriptor . name . asString () Ġ!= ĠmethodName ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġelement . parent ĊĠĠĠĠĠĠĠ Ġval Ġparent U Element Ġ= Ġconvert Element With Parent ( parent , Ġnull ) Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġu Expression Ġ= ĠKotlin U Function Call Expression ( element , Ġparent U Element , Ġresolved Call ) ĊĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġu Expression . resolve () Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( method . name Ġ!= ĠmethodName ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn ĠU ast Language Plugin . Resolved Method ( u Expression , Ġmethod ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Constructor Call Expression ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement : ĠPsi Element , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfq Name : ĠString ĊĠĠĠ Ġ): ĠU ast Language Plugin . Resolved Constructor ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( element Ġ! is ĠK t Call Expression ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġresolved Call Ġ= Ġelement . get Resolved Call ( element . analyze ()) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġresulting Descriptor Ġ= Ġresolved Call . result ing Descriptor ĊĠĠĠĠĠĠĠ Ġif Ġ( result ing Descriptor Ġ! is ĠConstructor Descriptor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ|| Ġresulting Descriptor . returnType . constructor . declaration Descriptor ?. name ?. asString () Ġ!= Ġfq Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= ĠKotlin Converter . unwrap Elements ( element . parent ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġparent U Element Ġ= Ġconvert Element With Parent ( parent , Ġnull ) Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġu Expression Ġ= ĠKotlin U Function Call Expression ( element , Ġparent U Element , Ġresolved Call ) ĊĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġu Expression . resolve () Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġcontaining Class Ġ= Ġmethod . containing Class Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn ĠU ast Language Plugin . Resolved Constructor ( u Expression , Ġmethod , Ġcontaining Class ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġconvert Declaration ( element : ĠPsi Element , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgiven Parent : ĠU Element ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequired Type : ĠClass < out ĠU Element >? ): ĠU Element ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġ< P Ġ: ĠPsi Element > Ġbuild ( ctor : Ġ( P , ĠU Element ?) Ġ-> ĠU Element ): Ġ() Ġ-> ĠU Element ? Ġ= Ġ{ Ġctor ( element Ġas ĠP , Ġgiven Parent ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġ< P Ġ: ĠPsi Element , ĠK Ġ: ĠK t Element > Ġbuild Kt ( kt Element : ĠK , Ġctor : Ġ( P , ĠK , ĠU Element ?) Ġ-> ĠU Element ): Ġ() Ġ-> ĠU Element ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġctor ( element Ġas ĠP , Ġkt Element , Ġgiven Parent ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġ< P Ġ: ĠPsi Element , ĠK Ġ: ĠK t Element > Ġbuild Kt Opt ( kt Element : ĠK ?, Ġctor : Ġ( P , ĠK ?, ĠU Element ?) Ġ-> ĠU Element ): Ġ() Ġ-> ĠU Element ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġctor ( element Ġas ĠP , Ġkt Element , Ġgiven Parent ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġoriginal Ġ= Ġelement . original Element ĊĠĠĠĠĠĠĠ Ġreturn Ġwith ( required Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( original ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Light Method Ġ-> Ġel < U Method >( build ( Kotlin U Method . Companion :: create )) ĠĠ Ġ// Ġ. Companion Ġis Ġneeded Ġbecause Ġof ĠK T - 1 3 9 3 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Light Class Ġ-> Ġwhen Ġ( original . kotlin Origin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Enum Entry Ġ-> Ġel < U Enum Constant > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconvert Enum Entry ( original . kotlin Origin Ġas ĠK t Enum Entry , Ġgiven Parent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġel < U Class > Ġ{ ĠKotlin U Class . create ( original , Ġgiven Parent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Light Field Impl . Kt Light Enum Constant Ġ-> Ġel < U Enum Constant >( build Kt Opt ( original . kotlin Origin , Ġ:: Kotlin U Enum Constant )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Light Field Ġ-> Ġel < U Field >( build Kt Opt ( original . kotlin Origin , Ġ:: Kotlin U Field )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Light Parameter Ġ-> Ġel < U Parameter >( build Kt Opt ( original . kotlin Origin , Ġ:: Kotlin U Parameter )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠU ast Kotlin Psi Parameter Ġ-> Ġel < U Parameter >( build Kt ( original . kt Parameter , Ġ:: Kotlin U Parameter )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠU ast Kotlin Psi Variable Ġ-> Ġel < U Variable >( build Kt ( original . kt Element , Ġ:: Kotlin U Variable )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Enum Entry Ġ-> Ġel < U Enum Constant > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconvert Enum Entry ( original , Ġgiven Parent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Class Or Object Ġ-> Ġel < U Class > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoriginal . to Light Class ()?. let Ġ{ Ġlight Class Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin U Class . create ( light Class , Ġgiven Parent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Function Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( original . is Local ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġel < UL ambda Expression > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġoriginal . parent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( parent Ġis ĠK t Lambda Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin UL ambda Expression ( parent , Ġgiven Parent ) Ġ// Ġyour Ġparent Ġis Ġthe ĠU Lambda Expression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( original . name . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Local Function Lambda Expression ( original , Ġgiven Parent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġu Declarations Expression Ġ= Ġcreate Local Function Declaration ( original , Ġgiven Parent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal Function Var Ġ= Ġu Declarations Expression . declarations . single () Ġas ĠKotlin Local Function U Variable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Function Var . u ast Initializer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġel < U Method > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlight Method Ġ= ĠLight Class Util . get Light Class Method ( original ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconvert Declaration ( light Method , Ġgiven Parent , Ġrequired Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Property Accessor Ġ-> Ġel < U Method > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlight Method Ġ= ĠLight Class Util . get Light Class Accessor Method ( original ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconvert Declaration ( light Method , Ġgiven Parent , Ġrequired Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Property Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( original . is Local ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Converter . convert Psi Element ( element , Ġgiven Parent , Ġrequired Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconvert Non Local Property ( original , Ġgiven Parent , Ġrequired Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Parameter Ġ-> Ġel < U Parameter > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġowner Function Ġ= Ġoriginal . owner Function Ġas ? ĠK t Function Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlight Method Ġ= ĠLight Class Util . get Light Class Method ( owner Function ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlight Parameter Ġ= Ġlight Method . parameter List . parameters . find Ġ{ Ġit . name Ġ== Ġoriginal . name Ġ} Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin U Parameter ( light Parameter , Ġoriginal , Ġgiven Parent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t File Ġ-> Ġel < U File > Ġ{ ĠKotlin U File ( original , Ġthis @ Kotlin U ast Language Plugin ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFake File For Light Class Ġ-> Ġel < U File > Ġ{ ĠKotlin U File ( original . navigation Element , Ġthis @ Kotlin U ast Language Plugin ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Annotation Entry Ġ-> Ġel < U Annotation >( build (:: Kotlin U Annotation )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Call Expression Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( required Type Ġ!= Ġnull Ġ&& ĠU Annotation :: class . java . isAssignableFrom ( required Type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġel < U Annotation > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass Descriptor Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( original . get Resolved Call ( original . analyze ()) ?. result ing Descriptor Ġas ? ĠClass Constructor Descriptor )?. construct ed Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( class Descriptor ?. kind Ġ== ĠClass Kind . AN NOT ATION _ CLASS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin UN ested Annotation ( original , Ġgiven Parent , Ġclass Descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Light Annotation For Source Entry Ġ-> Ġconvert Element ( original . kotlin Origin , Ġgiven Parent , Ġrequired Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconvert Enum Entry ( original : ĠK t Enum Entry , Ġgiven Parent : ĠU Element ?): ĠU Element ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠLight Class Util . get Light Class Backing Field ( original )?. let Ġ{ Ġpsi Field Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( psi Field Ġis ĠK t Light Field Impl . Kt Light Enum Constant ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin U Enum Constant ( psi Field , Ġpsi Field . kotlin Origin , Ġgiven Parent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Expression Value Used ( element : ĠU Expression ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠKotlin US imple Reference Expression . Kotlin Accessor Call Expression Ġ-> Ġelement . setter Value Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠKotlin Abstract U Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkt Element Ġ= Ġelement . psi Ġas ? ĠK t Element Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkt Element . analyze ()[ Binding Context . USED _ AS _ EXPRESSION , Ġkt Element ] Ġ?: Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġinline Ġfun Ġ< re ified ĠActual T Ġ: ĠU Element > ĠClass < out ĠU Element > ?. el ( f : Ġ() Ġ-> ĠU Element ?): ĠU Element ? Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( this Ġ== Ġnull Ġ|| Ġis AssignableFrom ( Actual T :: class . java )) Ġf () Ġelse Ġnull Ċ } Ċ Ċ internal Ġinline Ġfun Ġ< re ified ĠActual T Ġ: ĠU Element > ĠClass < out ĠU Element > ?. expr ( f : Ġ() Ġ-> ĠU Expression ?): ĠU Expression ? Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( this Ġ== Ġnull Ġ|| Ġis AssignableFrom ( Actual T :: class . java )) Ġf () Ġelse Ġnull Ċ } Ċ Ċ private Ġfun Ġconvert Non Local Property ( property : ĠK t Property , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgiven Parent : ĠU Element ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequired Type : ĠClass < out ĠU Element >? ): ĠU Element ? Ġ{ ĊĠĠĠ Ġval Ġmethods Ġ= ĠLight Class Util . get Light Class Property Methods ( property ) ĊĠĠĠ Ġreturn Ġmethods . back ing Field ?. let Ġ{ Ġbacking Field Ġ-> ĊĠĠĠĠĠĠĠ Ġwith ( required Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġel < U Field > Ġ{ ĠKotlin U Field ( back ing Field , Ġ( back ing Field Ġas ? ĠK t Light Element < *, * >) ?. kotlin Origin , Ġ Ġgiven Parent ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġ?: Ġmethods . getter ?. let Ġ{ Ġgetter Ġ-> ĊĠĠĠĠĠĠĠ ĠKotlin U ast Language Plugin (). convert Declaration ( getter , Ġgiven Parent , Ġrequired Type ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġobject ĠKotlin Converter Ġ{ ĊĠĠĠ Ġinternal Ġtail rec Ġfun Ġunwrap Elements ( element : ĠPsi Element ?): ĠPsi Element ? Ġ= Ġwhen Ġ( element ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠK t Value ArgumentList Ġ-> Ġunwrap Elements ( element . parent ) ĊĠĠĠĠĠĠĠ Ġis ĠK t Value Argument Ġ-> Ġunwrap Elements ( element . parent ) ĊĠĠĠĠĠĠĠ Ġis ĠK t Declaration Modifier List Ġ-> Ġunwrap Elements ( element . parent ) ĊĠĠĠĠĠĠĠ Ġis ĠK t Container Node Ġ-> Ġunwrap Elements ( element . parent ) ĊĠĠĠĠĠĠĠ Ġis ĠK t Simple Name String Template Entry Ġ-> Ġunwrap Elements ( element . parent ) ĊĠĠĠĠĠĠĠ Ġis ĠK t Light Parameter List Ġ-> Ġunwrap Elements ( element . parent ) ĊĠĠĠĠĠĠĠ Ġis ĠK t Type Element Ġ-> Ġunwrap Elements ( element . parent ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġelement ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġidentifiers Tokens Ġ= ĊĠĠĠĠĠĠĠ Ġset Of ( Kt Tokens . IDENTIFIER , ĠK t Tokens . CON STRUCTOR _ KEYWORD , ĠK t Tokens . THIS _ KEYWORD , ĠK t Tokens . SUPER _ KEYWORD , ĠK t Tokens . OBJECT _ KEYWORD ) ĊĊĠĠĠ Ġinternal Ġfun Ġconvert Psi Element ( element : ĠPsi Element ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgiven Parent : ĠU Element ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequired Type : ĠClass < out ĠU Element >? ): ĠU Element ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġ< P Ġ: ĠPsi Element > Ġbuild ( ctor : Ġ( P , ĠU Element ?) Ġ-> ĠU Element ): Ġ() Ġ-> ĠU Element ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ{ Ġctor ( element Ġas ĠP , Ġgiven Parent ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwith Ġ( required Type ) Ġ{ Ġwhen Ġ( element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Parameter List Ġ-> Ġel < U Declarations Expression > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeclarations Expression Ġ= ĠKotlin U Declarations Expression ( given Parent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclarations Expression . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclarations Ġ= Ġelement . parameters . map Indexed Ġ{ Ġi , Ġp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin U Parameter ( U ast Kotlin Psi Parameter . create ( p , Ġelement , Ġdeclarations Expression , Ġi ), Ġp , Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Class Body Ġ-> Ġel < U Expression List >( build ( Kotlin U Expression List . Companion :: createClass Body )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Catch Clause Ġ-> Ġel < UC atch Clause >( build (:: Kotlin UC atch Clause )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Variable Declaration Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element Ġis ĠK t Property Ġ&& Ġ! element . is Local ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġel < U Field > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLight Class Util . get Light Class Backing Field ( element )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin U Field ( it , Ġelement , Ġgiven Parent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġel < U Variable > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconvert Variables Declaration ( element , Ġgiven Parent ). declarations . single OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Expression Ġ-> ĠKotlin Converter . convert Expression ( element , Ġgiven Parent , Ġrequired Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Lambda Argument Ġ-> Ġelement . get Lambda Expression ()?. let Ġ{ ĠKotlin Converter . convert Expression ( it , Ġgiven Parent , Ġrequired Type ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Light Element Base Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpression Ġ= Ġelement . kotlin Origin ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Expression Ġ-> ĠKotlin Converter . convert Expression ( expression , Ġgiven Parent , Ġrequired Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġel < U Expression > Ġ{ ĠU ast Empty Expression ( given Parent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Literal String Template Entry , Ġis ĠK t Escape String Template Entry Ġ-> Ġel < UL iteral Expression >( build (:: Kotlin String UL iteral Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t String Template Entry Ġ-> Ġelement . expression ?. let Ġ{ Ġconvert Expression ( it , Ġgiven Parent , Ġrequired Type ) Ġ} Ġ?: Ġexpr < U Expression > Ġ{ ĠU ast Empty Expression Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t When Entry Ġ-> Ġel < US witch Clause Expression With Body >( build (:: Kotlin US witch Entry )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t When Condition Ġ-> Ġconvert When Condition ( element , Ġgiven Parent , Ġrequired Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Type Reference Ġ-> Ġel < U Type Reference Expression > Ġ{ ĠLazy Kotlin U Type Reference Expression ( element , Ġgiven Parent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Constructor Deleg ation Call Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġel < U Call Expression > Ġ{ ĠKotlin U Function Call Expression ( element , Ġgiven Parent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Super Type Call Entry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġel < U Expression > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( element . getParent OfType < Kt Class Or Object >( true )?. parent Ġas ? ĠK t Object Literal Expression ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . to U Element OfType < U Expression >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠKotlin U Function Call Expression ( element , Ġgiven Parent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Import Directive Ġ-> Ġel < U Import Statement >( build (:: Kotlin U Import Statement )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element Ġis ĠLeaf Psi Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . elementType Ġin Ġidentifiers Tokens ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element . elementType Ġ!= ĠK t Tokens . OBJECT _ KEYWORD Ġ|| Ġelement . getParent OfType < Kt Object Declaration >( false )?. name Identifier Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġel < U Identifier >( build (:: Kotlin U Identifier )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( element . elementType Ġin ĠK t Tokens . OPER ATIONS Ġ&& Ġelement . parent Ġis ĠK t Operation Reference Expression ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġel < U Identifier >( build (:: Kotlin U Identifier )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( element . elementType Ġ== ĠK t Tokens . L BRACK ET Ġ&& Ġelement . parent Ġis ĠK t Collection Literal Expression ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġel < U Identifier > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠU Identifier ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin U Collection Literal Expression ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . parent Ġas ĠK t Collection Literal Expression , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġinternal Ġfun Ġconvert Entry ( entry : ĠK t String Template Entry , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgiven Parent : ĠU Element ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequired Type : ĠClass < out ĠU Element >? Ġ= Ġnull ): ĠU Expression ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith ( required Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry Ġis ĠK t String Template Entry With Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr < U Expression > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Converter . convert OrEmpty ( entry . expression , Ġgiven Parent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr < UL iteral Expression > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry Ġis ĠK t Escape String Template Entry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin String UL iteral Expression ( entry , Ġgiven Parent , Ġentry . unes caped Value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin String UL iteral Expression ( entry , Ġgiven Parent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġconvert Expression ( expression : ĠK t Expression , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgiven Parent : ĠU Element ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequired Type : ĠClass < out ĠU Element >? Ġ= Ġnull ): ĠU Expression ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġ< P Ġ: ĠPsi Element > Ġbuild ( ctor : Ġ( P , ĠU Element ?) Ġ-> ĠU Expression ): Ġ() Ġ-> ĠU Expression ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ{ Ġctor ( expression Ġas ĠP , Ġgiven Parent ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwith Ġ( required Type ) Ġ{ Ġwhen Ġ( expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Variable Declaration Ġ-> Ġexpr < U Declarations Expression >( build (:: convert Variables Declaration )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t String Template Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . entries . isEmpty () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr < UL iteral Expression > Ġ{ ĠKotlin String UL iteral Expression ( expression , Ġgiven Parent , Ġ"") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . entries . size Ġ== Ġ 1 Ġ-> Ġconvert Entry ( expression . entries [ 0 ], Ġgiven Parent , Ġrequired Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr < U Expression > Ġ{ ĠKotlin String Template UP oly adic Expression ( expression , Ġgiven Parent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Dest ruct uring Declaration Ġ-> Ġexpr < U Declarations Expression > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeclarations Expression Ġ= ĠKotlin UD est ruct uring Declaration Expression ( given Parent , Ġexpression ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclarations Expression . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Assignment Ġ= ĠKotlin UL ocal Variable ( U ast Kotlin Psi Variable . create ( expression , Ġdeclarations Expression ), Ġexpression , Ġdeclarations Expression ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdestruct uring Assignments Ġ= Ġexpression . entries . map Indexed Ġ{ Ġi , Ġentry Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpsi Factory Ġ= ĠK t Psi Factory ( expression . project ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinitializer Ġ= Ġpsi Factory . create Analy z able Expression ("${ temp Assignment . name }. component ${ i Ġ+ Ġ 1 }() ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . containing File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitializer . destruct uring Declaration Initializer Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin UL ocal Variable ( U ast Kotlin Psi Variable . create ( entry , Ġtemp Assignment . psi , Ġdeclarations Expression , Ġinitializer ), Ġentry , Ġdeclarations Expression ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclarations Ġ= ĠlistOf ( temp Assignment ) Ġ+ Ġdestruct uring Assignments ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Labeled Expression Ġ-> Ġexpr < UL abeled Expression >( build (:: Kotlin UL abeled Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Class Literal Expression Ġ-> Ġexpr < U Class Literal Expression >( build (:: Kotlin U Class Literal Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Object Literal Expression Ġ-> Ġexpr < U Object Literal Expression >( build (:: Kotlin U Object Literal Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Dot Qualified Expression Ġ-> Ġexpr < U Qualified Reference Expression >( build (:: Kotlin U Qualified Reference Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Safe Qualified Expression Ġ-> Ġexpr < U Qualified Reference Expression >( build (:: Kotlin US afe Qualified Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Simple Name Expression Ġ-> Ġexpr < US imple Name Reference Expression >( build (:: Kotlin US imple Reference Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Call Expression Ġ-> Ġexpr < U Call Expression >( build (:: Kotlin U Function Call Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Collection Literal Expression Ġ-> Ġexpr < U Call Expression >( build (:: Kotlin U Collection Literal Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Binary Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression . operation Token Ġ== ĠK t Tokens . EL VIS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr < U Expression List >( build (:: create El vis Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġexpr < UB inary Expression >( build (:: Kotlin UB inary Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Parent hesized Expression Ġ-> Ġexpr < UP arent hesized Expression >( build (:: Kotlin UP arent hesized Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Prefix Expression Ġ-> Ġexpr < UP refix Expression >( build (:: Kotlin UP refix Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Post fix Expression Ġ-> Ġexpr < UP ost fix Expression >( build (:: Kotlin UP ost fix Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t This Expression Ġ-> Ġexpr < U This Expression >( build (:: Kotlin U This Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Super Expression Ġ-> Ġexpr < US uper Expression >( build (:: Kotlin US uper Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Callable Reference Expression Ġ-> Ġexpr < U Callable Reference Expression >( build (:: Kotlin U Callable Reference Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Is Expression Ġ-> Ġexpr < UB inary Expression WithType >( build (:: Kotlin U Type Check Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t If Expression Ġ-> Ġexpr < UI f Expression >( build (:: Kotlin UI f Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t While Expression Ġ-> Ġexpr < U While Expression >( build (:: Kotlin U While Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Do While Expression Ġ-> Ġexpr < U Do While Expression >( build (:: Kotlin U Do While Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t For Expression Ġ-> Ġexpr < U ForEach Expression >( build (:: Kotlin U ForEach Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t When Expression Ġ-> Ġexpr < US witch Expression >( build (:: Kotlin US witch Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Break Expression Ġ-> Ġexpr < UB reak Expression >( build (:: Kotlin UB reak Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Continue Expression Ġ-> Ġexpr < U Continue Expression >( build (:: Kotlin U Continue Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Return Expression Ġ-> Ġexpr < UR eturn Expression >( build (:: Kotlin UR eturn Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Throw Expression Ġ-> Ġexpr < U Throw Expression >( build (:: Kotlin U Throw Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Block Expression Ġ-> Ġexpr < U Block Expression >( build (:: Kotlin U Block Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Constant Expression Ġ-> Ġexpr < UL iteral Expression >( build (:: Kotlin UL iteral Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Try Expression Ġ-> Ġexpr < U Try Expression >( build (:: Kotlin U Try Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Array Access Expression Ġ-> Ġexpr < U Array Access Expression >( build (:: Kotlin U Array Access Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Lambda Expression Ġ-> Ġexpr < UL ambda Expression >( build (:: Kotlin UL ambda Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Binary Expression WithType RHS Ġ-> Ġexpr < UB inary Expression WithType >( build (:: Kotlin UB inary Expression WithType )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Class Or Object Ġ-> Ġexpr < U Declarations Expression > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . to Light Class ()?. let Ġ{ Ġlight Class Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin U Declarations Expression ( given Parent ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclarations Ġ= ĠlistOf ( Kotlin U Class . create ( light Class , Ġthis )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: ĠU ast Empty Expression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Function Ġ-> Ġif Ġ( expression . name . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr < UL ambda Expression >( build (:: create Local Function Lambda Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr < U Declarations Expression >( build (:: create Local Function Declaration )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġexpr < U Expression >( build (:: Unknown Kotlin Expression )) ĊĠĠĠĠĠĠĠ Ġ}} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġconvert When Condition ( condition : ĠK t When Condition , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgiven Parent : ĠU Element ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequired Type : ĠClass < out ĠU Element >? Ġ= Ġnull ): ĠU Expression ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith ( required Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( condition ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t When Condition InRange Ġ-> Ġexpr < UB inary Expression > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Custom UB inary Expression ( condition , Ġgiven Parent ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġleft Operand Ġ= ĠKotlin String US imple Reference Expression (" it ", Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperator Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcondition . is Neg ated Ġ-> ĠKotlin Binary Operators . NOT _ IN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠKotlin Binary Operators . IN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Operand Ġ= ĠKotlin Converter . convert OrEmpty ( condition . range Expression , Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t When Condition Is Pattern Ġ-> Ġexpr < UB inary Expression > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin Custom UB inary Expression WithType ( condition , Ġgiven Parent ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperand Ġ= ĠKotlin String US imple Reference Expression (" it ", Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperation Kind Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcondition . is Neg ated Ġ-> ĠKotlin Binary Expression WithType Kinds . NEG ATED _ INSTANCE _ CHECK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠU ast Binary Expression WithType Kind . INSTANCE _ CHECK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ref Ġ= Ġcondition . type Reference ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Reference Ġ= Ġtype Ref ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLazy Kotlin U Type Reference Expression ( it , Ġthis ) Ġ{ Ġtype Ref . to Psi Type ( this , Ġbox ed Ġ= Ġtrue ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t When Condition With Expression Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcondition . expression ?. let Ġ{ ĠKotlin Converter . convert Expression ( it , Ġgiven Parent , Ġrequired Type ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġexpr < U Expression > Ġ{ ĠU ast Empty Expression Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġconvert OrEmpty ( expression : ĠK t Expression ?, Ġparent : ĠU Element ?): ĠU Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġexpression ?. let Ġ{ Ġconvert Expression ( it , Ġparent , Ġnull ) Ġ} Ġ?: ĠU ast Empty Expression ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġconvert OrNull ( expression : ĠK t Expression ?, Ġparent : ĠU Element ?): ĠU Expression ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( expression Ġ!= Ġnull ) Ġconvert Expression ( expression , Ġparent , Ġnull ) Ġelse Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun ĠK t Psi Factory . create Analy z able Expression ( text : ĠString , Ġcontext : ĠPsi Element ): ĠK t Expression Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Analy z able Property (" val Ġx Ġ= Ġ$ text ", Ġcontext ). initializer Ġ?: Ġerror (" Failed Ġto Ġcreate Ġexpression Ġfrom Ġtext : Ġ'$ text '") ĊĊĠĠĠ Ġinternal Ġfun ĠK t Psi Factory . create Analy z able Property ( text : ĠString , Ġcontext : ĠPsi Element ): ĠK t Property Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Analy z able Declaration ( text , Ġcontext ) ĊĊĠĠĠ Ġinternal Ġfun Ġ< T Declaration Ġ: ĠK t Declaration > ĠK t Psi Factory . create Analy z able Declaration ( text : ĠString , Ġcontext : ĠPsi Element ): ĠT Declaration Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcreate Analy z able File (" dummy . kt ", Ġtext , Ġcontext ) ĊĠĠĠĠĠĠĠ Ġval Ġdeclarations Ġ= Ġfile . declarations ĊĠĠĠĠĠĠĠ Ġassert ( declarations . size Ġ== Ġ 1 ) Ġ{ Ġ"${ declarations . size } Ġdeclarations Ġin Ġ$ text " Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdeclarations . first () Ġas ĠT Declaration ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġconvert Variables Declaration ( ĊĠĠĠĠĠĠĠ Ġpsi : ĠK t Variable Declaration , ĊĠĠĠĠĠĠĠ Ġparent : ĠU Element ? Ċ ): ĠU Declarations Expression Ġ{ ĊĠĠĠ Ġval Ġdeclarations Expression Ġ= Ġparent Ġas ? ĠKotlin U Declarations Expression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġpsi . parent . to U Element OfType < U Declarations Expression >() Ġas ? ĠKotlin U Declarations Expression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠKotlin U Declarations Expression ( null , Ġparent , Ġpsi ) ĊĠĠĠ Ġval Ġparent Psi Element Ġ= Ġparent ?. psi ĊĠĠĠ Ġval Ġvariable Ġ= ĠKotlin U Annotated Local Variable ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠU ast Kotlin Psi Variable . create ( psi , Ġparent Psi Element , Ġdeclarations Expression ), Ġpsi , Ġdeclarations Expression ) Ġ{ Ġannotation Parent Ġ-> ĊĠĠĠĠĠĠĠ Ġpsi . annotation Entries . map Ġ{ ĠKotlin U Annotation ( it , Ġannotation Parent ) Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġdeclarations Expression . apply Ġ{ Ġdeclarations Ġ= ĠlistOf ( variable ) Ġ} Ċ } Ċ