/* Ċ Ġ* Ġ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 . project . Project Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi File Ċ import Ġcom . intellij . psi . Psi Variable Ċ 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 . elements . Fake File For Light Class Ċ import Ġorg . jetbrains . kotlin . as Java . elements . Kt Light Field Ċ import Ġorg . jetbrains . kotlin . as Java . elements . Kt Light Method Ċ import Ġorg . jetbrains . kotlin . as Java . elements . Kt Light Parameter Ċ import Ġorg . jetbrains . kotlin . as Java . to Light Class Ċ import Ġorg . jetbrains . kotlin . codegen . state . Kotlin Type Mapper Ċ 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 . resolve . Binding Context Ċ import Ġorg . jetbrains . kotlin . resolve . calls . call Util . get Resolved Call Ċ import Ġorg . jetbrains . u ast .* Ċ import Ġorg . jetbrains . u ast . java . Java U ast Language Plugin Ċ import Ġorg . jetbrains . u ast . kotlin . declarations . Kotlin U Method Ċ import Ġorg . jetbrains . u ast . kotlin . expressions . Kotlin UB reak Expression Ċ import Ġorg . jetbrains . u ast . kotlin . expressions . Kotlin U Continue Expression Ċ import Ġorg . jetbrains . u ast . kotlin . kind s . Kotlin Special Expression Kinds Ċ import Ġorg . jetbrains . u ast . kotlin . psi . U ast Kotlin Psi Parameter Ċ import Ġorg . jetbrains . u ast . kotlin . psi . U ast Kotlin Psi Variable Ċ import Ġorg . jetbrains . u ast . psi . Psi Element Back ed Ċ Ċ interface ĠKotlin U ast Binding Context Provider Service Ġ{ ĊĠĠĠ Ġfun Ġget Binding Context ( element : ĠK t Element ): ĠBinding Context ĊĠĠĠ Ġfun ĠgetType Mapper ( element : ĠK t Element ): ĠKotlin Type Mapper ? Ċ } Ċ Ċ class ĠKotlin U ast Language Plugin ( override Ġval Ġproject : ĠProject ) Ġ: ĠU ast Language Plugin Ġ{ ĊĠĠĠ Ġoverride Ġval Ġpriority Ġ= Ġ 1 0 ĊĊĠĠĠ Ġprivate Ġval Ġjava Plugin Ġby Ġl z Ġ{ ĠU ast Language Plugin . get Instances ( project ). first Ġ{ Ġit Ġis ĠJava U ast Language Plugin Ġ} Ġ} ĊĊĠĠĠ Ġ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 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġconvert Element ( element : ĠPsi Element , Ġparent : ĠU Element ?, Ġrequired Type : ĠClass < out ĠU Element >? ): ĠU Element ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( element Ġ! is ĠPsi Element ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġconvert Declaration ( element , Ġparent , Ġrequired Type ) Ġ?: ĠKotlin Converter . convert Psi 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 ĠPsi Element ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( element Ġis ĠPsi File ) Ġreturn Ġconvert Declaration ( element , Ġnull , Ġrequired Type ) ĊĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġelement . parent Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġparent U Element Ġ= Ġconvert Element With Parent ( parent , Ġnull ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġconvert Element ( element , Ġparent U Element , Ġrequired Type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ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 Ġ?: Ġ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 ĊĠĠĠĠĠĠĠ Ġ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 Ġ= Ġ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 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġconvert Declaration ( element : ĠPsi Element , Ġ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 )?. let Ġ{ Ġref Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġref . get ()?. let Ġ{ Ġreturn Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġval Ġoriginal Ġ= Ġelement . original Element ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( original ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Light Method Ġ-> ĠKotlin U Method . create ( original , Ġparent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Light Class Ġ-> ĠKotlin U Class . create ( original , Ġparent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Light Field , Ġis ĠK t Light Parameter , Ġis ĠU ast Kotlin Psi Parameter , Ġis ĠU ast Kotlin Psi Variable Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin U Variable . create ( original Ġas ĠPsi Variable , Ġparent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Class Or Object Ġ-> Ġoriginal . to Light Class ()?. let Ġ{ Ġlight Class Ġ-> ĠKotlin U Class . create ( light Class , Ġparent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Function Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlight Method Ġ= ĠLight Class Util . get Light Class Method ( original ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconvert Declaration ( light Method , Ġparent , Ġrequired Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Property Accessor Ġ-> Ġjava Plugin . convert Opt < U Method >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLight Class Util . get Light Class Accessor Method ( original ), Ġparent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Property Ġ-> Ġjava Plugin . convert Opt < U Field >( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLight Class Util . get Light Class Backing Field ( original ), Ġparent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġconvert Declaration ( element . parent , Ġparent , Ġrequired Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t File Ġ-> ĠKotlin U File ( original , Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFake File For Light Class Ġ-> ĠKotlin U File ( original . navigation Element , Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ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 Ġas ? ĠPsi Element Back ed )?. 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 ĠT Ġ: ĠU Element > ĠClass < out ĠU Element > ?. el ( f : Ġ() Ġ-> ĠU Element ?): ĠU Element ? Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( this Ġ== Ġnull Ġ|| ĠT :: class . java Ġ== Ġthis ) Ġf () Ġelse Ġnull Ċ } Ċ Ċ internal Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠU Element > ĠClass < out ĠU Element > ?. expr ( f : Ġ() Ġ-> ĠU Expression ): ĠU Expression Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( this Ġ== Ġnull Ġ|| ĠT :: class . java Ġ== Ġthis ) Ġf () Ġelse ĠU ast Empty Expression Ċ } Ċ Ċ internal Ġobject ĠKotlin Converter Ġ{ ĊĠĠĠ Ġinternal Ġfun Ġconvert Psi Element ( element : ĠPsi Element ?, Ġparent : ĠU Element ?, Ġrequired Type : ĠClass < out ĠU Element >? ): ĠU Element ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Ġ( required Type ) Ġ{ Ġwhen Ġ( element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Parameter List Ġ-> Ġel < U Variable Declarations Expression > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin U Variable Declarations Expression ( parent ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariables Ġ= Ġelement . parameters . map Indexed Ġ{ Ġi , Ġp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin U Variable . create ( U ast Kotlin Psi Parameter . create ( p , Ġelement , Ġparent !! , Ġi ), Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Class Body Ġ-> ĠKotlin U Expression List ( element , ĠKotlin Special Expression Kinds . CLASS _ BODY , Ġparent ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpressions Ġ= Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Catch Clause Ġ-> Ġel < UC atch Clause > Ġ{ ĠKotlin UC atch Clause ( element , Ġparent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Expression Ġ-> ĠKotlin Converter . convert Expression ( element , Ġparent , Ġrequired Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Lambda Argument Ġ-> ĠKotlin Converter . convert Expression ( element . get Lambda Expression (), Ġparent , Ġrequired Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element Ġis ĠLeaf Psi Element Ġ&& Ġelement . elementType Ġ== ĠK t Tokens . IDENTIFIER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġel < U Identifier > Ġ{ ĠU Identifier ( element , Ġparent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}} ĊĠĠĠ Ġ} ĊĠĠĠĠĊĠĠĠ Ġprivate Ġfun Ġconvert Variables Declaration ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpsi : ĠK t Variable Declaration , ĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent : ĠU Element ? ĊĠĠĠ Ġ): ĠU Variable Declarations Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparent Psi Element Ġ= Ġ( parent Ġas ? ĠPsi Element Back ed )?. psi ĊĠĠĠĠĠĠĠ Ġval Ġvariable Ġ= ĠKotlin U Variable . create ( U ast Kotlin Psi Variable . create ( psi , Ġparent Psi Element , Ġparent !! ), Ġparent ) ĊĠĠĠĠĠĠĠ Ġreturn ĠKotlin U Variable Declarations Expression ( parent ). apply Ġ{ Ġvariables Ġ= ĠlistOf ( variable ) Ġ} ĊĠĠĠ Ġ} ĊĠĠĠĠĊĠĠĠ Ġprivate Ġfun Ġconvert String Template Expression ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression : ĠK t String Template Expression , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent : ĠU Element ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi : ĠInt ĊĠĠĠ Ġ): ĠU Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( i Ġ== Ġ 1 ) ĠKotlin String Template UB inary Expression ( expression , Ġparent ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Operand Ġ= Ġconvert ( expression . entries [ 0 ], Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġright Operand Ġ= Ġconvert ( expression . entries [ 1 ], Ġthis ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse ĠKotlin String Template UB inary Expression ( expression , Ġparent ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġleft Operand Ġ= Ġconvert String Template Expression ( expression , Ġparent , Ġi Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġright Operand Ġ= Ġconvert ( expression . entries [ i ], Ġthis ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġconvert ( entry : ĠK t String Template Entry , Ġparent : ĠU Element ?): ĠU Expression Ġ= Ġwhen Ġ( entry ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠK t String Template Entry With Expression Ġ-> Ġconvert OrEmpty ( entry . expression , Ġparent ) ĊĠĠĠĠĠĠĠ Ġis ĠK t Escape String Template Entry Ġ-> ĠKotlin String UL iteral Expression ( entry , Ġparent , Ġentry . unes caped Value ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin String UL iteral Expression ( entry , Ġparent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġconvert Expression ( expression : ĠK t Expression , Ġparent : ĠU Element ?, Ġrequired Type : ĠClass < out ĠU Element >? Ġ= Ġnull ): ĠU Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwith Ġ( required Type ) Ġ{ Ġwhen Ġ( expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Variable Declaration Ġ-> Ġexpr < U Variable Declarations Expression > Ġ{ Ġconvert Variables Declaration ( expression , Ġparent ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t String Template Expression Ġ-> Ġexpr < UL iteral Expression > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression . entries . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin String UL iteral Expression ( expression , Ġparent , Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( expression . entries . size Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconvert ( expression . entries [ 0 ], Ġparent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconvert String Template Expression ( expression , Ġparent , Ġexpression . entries . size Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Dest ruct uring Declaration Ġ-> Ġexpr < U Variable Declarations Expression > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin U Variable Declarations Expression ( parent ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtemp Assignment Ġ= ĠKotlin U Variable . create ( U ast Kotlin Psi Variable . create ( expression , Ġparent !! ), Ġparent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ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 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin U Variable . create ( U ast Kotlin Psi Variable . create ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry , Ġtemp Assignment . psi , Ġparent , Ġinitializer ), Ġparent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariables Ġ= ĠlistOf ( temp Assignment ) Ġ+ Ġdestruct uring Assignments ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Labeled Expression Ġ-> Ġexpr < UL abeled Expression > Ġ{ ĠKotlin UL abeled Expression ( expression , Ġparent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Class Literal Expression Ġ-> Ġexpr < U Class Literal Expression > Ġ{ ĠKotlin U Class Literal Expression ( expression , Ġparent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Object Literal Expression Ġ-> Ġexpr < U Object Literal Expression > Ġ{ ĠKotlin U Object Literal Expression ( expression , Ġparent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t String Template Entry Ġ-> Ġexpression . expression ?. let Ġ{ Ġconvert Expression ( it , Ġparent , Ġrequired Type ) Ġ} Ġ?: ĠU ast Empty Expression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Dot Qualified Expression Ġ-> Ġexpr < U Qualified Reference Expression > Ġ{ ĠKotlin U Qualified Reference Expression ( expression , Ġparent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Safe Qualified Expression Ġ-> Ġexpr < U Qualified Reference Expression > Ġ{ ĠKotlin US afe Qualified Expression ( expression , Ġparent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Simple Name Expression Ġ-> Ġexpr < US imple Name Reference Expression > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin US imple Reference Expression ( expression , Ġexpression . get Referenced Name (), Ġparent ) ĠĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Call Expression Ġ-> Ġexpr < U Call Expression > Ġ{ ĠKotlin U Function Call Expression ( expression , Ġparent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Binary Expression Ġ-> Ġexpr < UB inary Expression > Ġ{ ĠKotlin UB inary Expression ( expression , Ġparent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Parent hesized Expression Ġ-> Ġexpr < UP arent hesized Expression > Ġ{ ĠKotlin UP arent hesized Expression ( expression , Ġparent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Prefix Expression Ġ-> Ġexpr < UP refix Expression > Ġ{ ĠKotlin UP refix Expression ( expression , Ġparent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Post fix Expression Ġ-> Ġexpr < UP ost fix Expression > Ġ{ ĠKotlin UP ost fix Expression ( expression , Ġparent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t This Expression Ġ-> Ġexpr < U This Expression > Ġ{ ĠKotlin U This Expression ( expression , Ġparent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Super Expression Ġ-> Ġexpr < US uper Expression > Ġ{ ĠKotlin US uper Expression ( expression , Ġparent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Callable Reference Expression Ġ-> Ġexpr < U Callable Reference Expression > Ġ{ ĠKotlin U Callable Reference Expression ( expression , Ġparent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Is Expression Ġ-> Ġexpr < UB inary Expression WithType > Ġ{ ĠKotlin U Type Check Expression ( expression , Ġparent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t If Expression Ġ-> Ġexpr < UI f Expression > Ġ{ ĠKotlin UI f Expression ( expression , Ġparent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t While Expression Ġ-> Ġexpr < U While Expression > Ġ{ ĠKotlin U While Expression ( expression , Ġparent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Do While Expression Ġ-> Ġexpr < U Do While Expression > Ġ{ ĠKotlin U Do While Expression ( expression , Ġparent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t For Expression Ġ-> Ġexpr < U ForEach Expression > Ġ{ ĠKotlin U ForEach Expression ( expression , Ġparent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t When Expression Ġ-> Ġexpr < US witch Expression > Ġ{ ĠKotlin US witch Expression ( expression , Ġparent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Break Expression Ġ-> Ġexpr < UB reak Expression > Ġ{ ĠKotlin UB reak Expression ( expression , Ġparent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Continue Expression Ġ-> Ġexpr < U Continue Expression > Ġ{ ĠKotlin U Continue Expression ( expression , Ġparent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Return Expression Ġ-> Ġexpr < UR eturn Expression > Ġ{ ĠKotlin UR eturn Expression ( expression , Ġparent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Throw Expression Ġ-> Ġexpr < U Throw Expression > Ġ{ ĠKotlin U Throw Expression ( expression , Ġparent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Block Expression Ġ-> Ġexpr < U Block Expression > Ġ{ ĠKotlin U Block Expression ( expression , Ġparent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Constant Expression Ġ-> Ġexpr < UL iteral Expression > Ġ{ ĠKotlin UL iteral Expression ( expression , Ġparent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Try Expression Ġ-> Ġexpr < U Try Expression > Ġ{ ĠKotlin U Try Expression ( expression , Ġparent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Array Access Expression Ġ-> Ġexpr < U Array Access Expression > Ġ{ ĠKotlin U Array Access Expression ( expression , Ġparent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Lambda Expression Ġ-> Ġexpr < UL ambda Expression > Ġ{ ĠKotlin UL ambda Expression ( expression , Ġparent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Binary Expression WithType RHS Ġ-> Ġexpr < UB inary Expression WithType > Ġ{ ĠKotlin UB inary Expression WithType ( expression , Ġparent ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠUnknown Kotlin Expression ( expression , Ġparent ) ĊĠĠĠĠĠĠĠ Ġ}} ĊĠĠĠ Ġ} ĊĠĠĠĠĊĠĠĠ Ġinternal Ġfun Ġconvert OrEmpty ( expression : ĠK t Expression ?, Ġparent : ĠU Element ?): ĠU Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( expression Ġ!= Ġnull ) Ġconvert Expression ( expression , Ġparent , Ġnull ) Ġelse Ġ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 " Ġ} ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġdeclarations . first () Ġas ĠT Declaration ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ }