/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 1 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . u ast . kotlin Ċ Ċ import Ġcom . intellij . openapi . util . registry . Registry Ċ import Ġcom . intellij . psi .* Ċ import Ġorg . jetbrains . annotations . Test Only Ċ import Ġorg . jetbrains . kotlin . as Java . to Light Class Ċ import Ġorg . jetbrains . kotlin . lexer . Kt Tokens Ċ import Ġorg . jetbrains . kotlin . psi .* Ċ import Ġorg . jetbrains . u ast .* Ċ import Ġorg . jetbrains . u ast . expressions . U Injection Host Ċ import Ġorg . jetbrains . u ast . kotlin . psi .* Ċ Ċ internal Ġobject ĠKotlin Converter Ġ: ĠBase Kotlin Converter Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġlanguage Plugin : ĠU ast Language Plugin ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġkotlin U ast Plugin ĊĊĠĠĠ Ġvar Ġforce U Injection Host Ġ= ĠRegistry .` is ` (" kotlin . u ast . force . u injection host ", Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ@ Test Only ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġforce U Injection Host (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġforce U Injection Host ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġconvert Expression ( ĊĠĠĠĠĠĠĠ Ġexpression : ĠK t Expression , ĊĠĠĠĠĠĠĠ Ġgiven Parent : ĠU Element ?, ĊĠĠĠĠĠĠĠ Ġrequired Types : ĠArray < out ĠClass < out ĠU Element >> ĊĠĠĠ Ġ): ĠU Expression ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġ< P Ġ: ĠPsi Element > Ġbuild ( ctor : Ġ( P , ĠU Element ?) Ġ-> ĠU Expression ): Ġ() Ġ-> ĠU Expression ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctor ( expression Ġas ĠP , Ġgiven Parent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwith ( required Types ) Ġ{ Ġwhen Ġ( expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Variable Declaration Ġ-> Ġexpr < U Declarations Expression >( build (:: convert Variables Declaration )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t String Template Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġforce U Injection Host Ġ|| Ġrequired Types . contains ( U Injection Host :: class . java ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr < U Injection Host > Ġ{ ĠKotlin String Template UP oly adic Expression ( expression , Ġgiven Parent ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . entries . isEmpty () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr < UL iteral Expression > Ġ{ ĠKotlin String UL iteral Expression ( expression , Ġgiven Parent , Ġ"") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . entries . size Ġ== Ġ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconvert String Template Entry ( expression . entries [ 0 ], Ġgiven Parent , Ġrequired Types ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr < Kotlin String Template UP oly adic 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 . java 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 > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression . parent Ġis ĠK t Function Literal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġexpression . parent . parent Ġis ĠK t Lambda Expression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġgiven Parent Ġ! is ĠKotlin UL ambda Expression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin UL ambda Expression ( expression . parent . parent Ġas ĠK t Lambda Expression , Ġgiven Parent ). body ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKotlin U Block Expression ( expression , Ġgiven Parent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ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 ( given Parent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ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 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Annotated Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . base Expression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġconvert Expression ( it , Ġgiven Parent , Ġrequired Types ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġexpr < U Expression >( build (:: Unknown Kotlin Expression )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġexpr < U Expression >( build (:: Unknown Kotlin Expression )) ĊĠĠĠĠĠĠĠ Ġ}} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ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 ") ĊĠĠĠĠĠĠĠ Ġreturn Ġdeclarations . first () Ġas ĠT Declaration ĊĠĠĠ Ġ} Ċ } Ċ