// ĠCopyright Ġ 2 0 0 0 - 2 0 1 9 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ package Ġorg . jetbrains . u ast . java . generate Ċ Ċ import Ġcom . intellij . code Insight . Block Utils Ċ import Ġcom . intellij . lang . Language Ċ import Ġcom . intellij . lang . java . Java Language Ċ import Ġcom . intellij . lang . jvm . Jvm Modifier Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . psi .* Ċ import Ġcom . intellij . psi . code Style . Java Code Style Manager Ċ import Ġcom . intellij . psi . code Style . Variable Kind Ċ import Ġcom . intellij . psi . impl . source . tree . Composite Element Ċ import Ġcom . intellij . psi . util . Psi Types Util Ċ import Ġcom . intellij . psi . util . Psi Util Ċ import Ġcom . intellij . util . cast S af ely To Ċ import Ġcom . si ye h . ig . psi utils . Parent heses Utils Ċ import Ġorg . jetbrains . u ast .* Ċ import Ġorg . jetbrains . u ast . generate . U Parameter Info Ċ import Ġorg . jetbrains . u ast . generate . U ast Code Generation Plugin Ċ import Ġorg . jetbrains . u ast . generate . U ast Element Factory Ċ import Ġorg . jetbrains . u ast . java .* Ċ Ċ class ĠJava U ast Code Generation Plugin Ġ: ĠU ast Code Generation Plugin Ġ{ ĊĠ Ġoverride Ġfun Ġget Element Factory ( project : ĠProject ): ĠU ast Element Factory Ġ= ĠJava U ast Element Factory ( project ) ĊĊĠ Ġoverride Ġval Ġlanguage : ĠLanguage ĊĠĠĠ Ġget () Ġ= ĠJava Language . INSTANCE ĊĊĠ Ġprivate Ġfun Ġadjust Chain Style To Method Calls ( old Psi : ĠPsi Element , Ġnew Psi : ĠPsi Element ) Ġ{ ĊĠĠĠ Ġif Ġ( old Psi Ġis ĠPsi MethodCall Expression Ġ&& Ġnew Psi Ġis ĠPsi MethodCall Expression Ġ&& ĊĠĠĠĠĠĠĠ Ġold Psi . method Expression . qual ifier Expression Ġ!= Ġnull Ġ&& Ġnew Psi . method Expression . qual ifier Ġ!= Ġnull ) Ġ{ ĊĊĠĠĠĠĠ Ġif Ġ( old Psi . method Expression . children . get OrNull ( 1 ) Ġis ĠPsi WhiteSpace Ġ&& ĊĠĠĠĠĠĠĠĠĠ Ġnew Psi . method Expression . children . get OrNull ( 1 ) Ġ! is ĠPsi WhiteSpace ĊĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnew Psi . method Expression . add After ( old Psi . method Expression . children [ 1 ], Ġnew Psi . method Expression . children [ 0 ]) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġ< T Ġ: ĠU Element > Ġreplace ( old Element : ĠU Element , Ġnew Element : ĠT , Ġelement Type : ĠClass < T >): ĠT ? Ġ{ ĊĠĠĠ Ġval Ġold Psi Ġ= Ġold Element . source Psi Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġval Ġnew Psi Ġ= Ġnew Element . source Psi Ġ?: Ġreturn Ġnull ĊĊĠĠĠ Ġadjust Chain Style To Method Calls ( old Psi , Ġnew Psi ) ĊĊĠĠĠ Ġval Ġfactory Ġ= ĠJava Psi Facade . getElement Factory ( old Psi . project ) ĊĠĠĠ Ġval Ġup d Old Psi Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠ Ġ( new Psi Ġis ĠPsi Block Statement Ġ|| Ġnew Psi Ġis ĠPsi Code Block ) Ġ&& Ġold Psi . parent Ġis ĠPsi Expression Statement Ġ-> Ġold Psi . parent ĊĠĠĠĠĠ Ġelse Ġ-> Ġold Psi ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġup d New Psi Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠ Ġup d Old Psi Ġis ĠPsi Statement Ġ&& Ġnew Psi Ġis ĠPsi Expression Ġ-> Ġfactory . create Exp res ion Statement ( new Psi ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠ Ġup d Old Psi Ġis ĠPsi Code Block Ġ&& Ġnew Psi Ġis ĠPsi Block Statement Ġ-> Ġnew Psi . code Block ĊĠĠĠĠĠ Ġelse Ġ-> Ġnew Psi ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġwhen Ġ( val Ġreplaced Ġ= Ġup d Old Psi . replace ( upd New Psi )) Ġ{ ĊĠĠĠĠĠ Ġis ĠPsi Expression Statement Ġ-> Ġreplaced . expression . to U Element Of Expected Types ( elementType ) ĊĠĠĠĠĠ Ġelse Ġ-> Ġreplaced . to U Element Of Expected Types ( elementType ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠPsi Element Factory . create Exp res ion Statement ( expression : ĠPsi Expression ): ĠPsi Statement ? Ġ{ ĊĠ Ġval Ġstatement Ġ= Ġcreate Statement FromText (" x ;", Ġnull ) Ġas ? ĠPsi Expression Statement Ġ?: Ġreturn Ġnull ĊĠ Ġstatement . expression . replace ( expression ) ĊĠ Ġreturn Ġstatement Ċ } Ċ Ċ class ĠJava U ast Element Factory ( private Ġval Ġproject : ĠProject ) Ġ: ĠU ast Element Factory Ġ{ ĊĠ Ġprivate Ġval Ġpsi Factory : ĠPsi Element Factory Ġ= ĠJava Psi Facade . getElement Factory ( project ) ĊĊĠ Ġoverride Ġfun Ġcreate Qualified Reference ( qualified Name : ĠString , Ġcontext : ĠU Element ?): ĠU Qualified Reference Expression ? Ġ{ ĊĠĠĠ Ġreturn Ġpsi Factory . create Expression FromText ( qualified Name , Ġcontext ?. source Psi ) ĊĠĠĠĠĠ Ġ. cast S af ely To < Psi Reference Expression >() ĊĠĠĠĠĠ Ġ? . let Ġ{ ĠJava U Qualified Reference Expression ( it , Ġnull ) Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġcreate If Expression ( condition : ĠU Expression , Ġthen Branch : ĠU Expression , Ġelse Branch : ĠU Expression ?): ĠU If Expression ? Ġ{ ĊĠĠĠ Ġval Ġcondition Psi Ġ= Ġcondition . source Psi Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġval Ġthen Branch Psi Ġ= Ġthen Branch . source Psi Ġ?: Ġreturn Ġnull ĊĊĠĠĠ Ġval Ġif Statement Ġ= Ġpsi Factory . createStatement FromText (" if Ġ( a ) Ġb Ġelse Ġc ", Ġnull ) Ġas ? ĠPsi If Statement Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġif Statement . condition ?. replace ( condition Psi ) ĊĊĠĠĠ Ġif Statement . then Branch ?. replace ( then Branch Psi . branch Statement Ġ?: Ġreturn Ġnull ) ĊĠĠĠ Ġelse Branch ?. source Psi ?. branch Statement ?. let Ġ{ Ġif Statement . else Branch ?. replace ( it ) Ġ} Ġ?: Ġif Statement . else Branch ?. delete () ĊĊĠĠĠ Ġreturn ĠJava UI f Expression ( if Statement , Ġnull ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġcreate Call Expression ( receiver : ĠU Expression ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmethodName : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameters : ĠList < U Expression >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected ReturnType : ĠPsi Type ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkind : ĠU ast Call Kind ): ĠU Call Expression ? Ġ{ ĊĠĠĠ Ġif Ġ( kind Ġ!= ĠU ast Call Kind . METHOD _ CALL ) Ġreturn Ġnull ĊĊĠĠĠ Ġval Ġmethod Call Ġ= Ġpsi Factory . create Expression FromText ( if Ġ( receiver Ġ!= Ġnull ) Ġ" a . b ()" Ġelse Ġ" a ()", Ġnull ) Ġas ? ĠPsi MethodCall Expression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġnull ĊĊĠĠĠ Ġval Ġmethod Identifier Ġ= Ġpsi Factory . create Identifier ( methodName ) ĊĊĠĠĠ Ġif Ġ( receiver Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġmethod Call . method Expression . qual ifier Expression ?. replace ( receiver . source Psi !! ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġmethod Call . method Expression . reference Name Element ?. replace ( method Identifier ) ĊĊĠĠĠ Ġfor Ġ( parameter Ġin Ġparameters ) Ġ{ ĊĠĠĠĠĠ Ġmethod Call . argument List . add ( parameter . source Psi !! ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġif Ġ( expected ReturnType Ġ== Ġnull ) ĊĠĠĠĠĠ ĠJava U Call Expression ( method Call , Ġnull ) ĊĠĠĠ Ġelse ĊĠĠĠĠĠ ĠMethod Call Upgrade Helper ( project , Ġmethod Call , Ġexpected ReturnType ). try Upgrade To Expected Type () ĊĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĠJava U Call Expression ( it , Ġnull ) Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġclass ĠMethod Call Upgrade Helper ( val Ġproject : ĠProject , Ġval Ġmethod Call : ĠPsi MethodCall Expression , Ġval Ġexpected ReturnType : ĠPsi Type ) Ġ{ ĊĠĠĠ Ġlateinit Ġvar Ġresult Type : ĠPsi Type ĊĊĠĠĠ Ġfun Ġtry Upgrade To Expected Type (): ĠPsi MethodCall Expression ? Ġ{ ĊĠĠĠĠĠ Ġresult Type Ġ= Ġmethod Call . type Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠ Ġif Ġ( expected ReturnType . isAssignableFrom ( result Type )) Ġreturn Ġmethod Call ĊĊĠĠĠĠĠ Ġif Ġ(!( result Type Ġeq Resolved Ġexpected ReturnType )) ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĊĠĠĠĠĠ Ġreturn Ġmethod Call . method Expression . qual ifier Expression ?. let Ġ{ Ġtry Pick Up Type Parameters () Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtry Pick Up Type Parameters (): ĠPsi MethodCall Expression ? Ġ{ ĊĠĠĠĠĠ Ġval Ġexpected Type Type Parameters Ġ= Ġexpected ReturnType . cast S af ely To < Psi ClassType >() ?. parameters Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠ Ġval Ġresult Type Type Parameters Ġ= Ġresult Type . cast S af ely To < Psi ClassType >() ?. parameters Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠ Ġval Ġnot Equal Type Parameters Indices Ġ= Ġexpected Type Type Parameters ĊĠĠĠĠĠĠĠ Ġ. zip ( result Type Type Parameters ) ĊĠĠĠĠĠĠĠ Ġ. with Index () ĊĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġ(_, Ġpair ) Ġ-> ĠPsi Types Util . compare Types ( pair . first , Ġpair . second , Ġfalse ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( i , Ġ_) Ġ-> Ġi Ġ} ĊĊĠĠĠĠĠ Ġval Ġresolved Method Ġ= Ġmethod Call . resolve Method () Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠ Ġval Ġmethod ReturnType Type Parameters Ġ= Ġ( resolved Method . returnType . cast S af ely To < Psi ClassType >()) ?. parameters Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠ Ġval Ġmethod Definition Type Parameters Ġ= Ġresolved Method . type Parameters ĊĠĠĠĠĠ Ġval Ġmethod Definition To ReturnType Parameters Mapping Ġ= Ġmethod Definition Type Parameters . map Ġ{ ĊĠĠĠĠĠĠĠ Ġit Ġto Ġmethod ReturnType Type Parameters . indexOf First Ġ{ Ġparam Ġ-> Ġit . name Ġ== Ġparam . canonical Text Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . second Ġ!= Ġ- 1 Ġ} ĊĠĠĠĠĠĠĠ Ġ. toMap () ĊĊĠĠĠĠĠ Ġval Ġnot Matched Types Parameters Names Ġ= Ġnot Equal Type Parameters Indices ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġmethod ReturnType Type Parameters [ it ]. canonical Text Ġ} ĊĠĠĠĠĠĠĠ Ġ. toSet () ĊĊĠĠĠĠĠ Ġval Ġcall Type Parameters Subst it utor Ġ= Ġmethod Call . resolve Method Gener ics (). subst it utor ĊĠĠĠĠĠ Ġval Ġnew Parameters List Ġ= Ġmutable ListOf < Psi Type >() ĊĠĠĠĠĠ Ġfor Ġ( parameter Ġin Ġmethod Definition Type Parameters ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( parameter . name Ġin Ġnot Matched Types Parameters Names ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġnew Parameters List Ġ+= Ġexpected Type Type Parameters [ method Definition To ReturnType Parameters Mapping [ parameter ] Ġ?: Ġreturn Ġnull ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġnew Parameters List Ġ+= Ġcall Type Parameters Subst it utor . substitute ( parameter ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġreturn Ġbuild MethodCall From New Type Parameters ( new Parameters List ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbuild MethodCall From New Type Parameters ( new Parameters List : ĠList < Psi Type >): ĠPsi MethodCall Expression ? Ġ{ ĊĠĠĠĠĠ Ġval Ġfactory Ġ= ĠJava Psi Facade . getElement Factory ( project ) ĊĠĠĠĠĠ Ġval Ġexpr Ġ= Ġfactory . create Expression FromText ( build String Ġ{ ĊĠĠĠĠĠĠĠ Ġappend (" a .< ") ĊĠĠĠĠĠĠĠ Ġnew Parameters List . join To ( this ) Ġ{ Ġ" T " Ġ} ĊĠĠĠĠĠĠĠ Ġappend ("> b () ") ĊĠĠĠĠĠ Ġ}, Ġnull ) Ġas ? ĠPsi MethodCall Expression Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠ Ġfor Ġ(( i , Ġparam ) Ġin Ġnew Parameters List . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Element Ġ= Ġfactory . create Type Element ( param ) ĊĠĠĠĠĠĠĠ Ġexpr . type ArgumentList . type Parameter Elements [ i ]. replace ( type Element ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġmethod Call . type ArgumentList . replace ( expr . type ArgumentList ) ĊĊĠĠĠĠĠ Ġif Ġ( method Call . type ?. let Ġ{ Ġexpected ReturnType . isAssignableFrom ( it ) Ġ} Ġ!= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĊĠĠĠĠĠ Ġreturn Ġmethod Call ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġin fix Ġfun ĠPsi Type . eq Resolved ( other : ĠPsi Type ): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġval Ġresolved This Ġ= Ġthis . cast S af ely To < Psi ClassType >() ?. resolve () Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠ Ġval Ġresolved Other Ġ= Ġother . cast S af ely To < Psi ClassType >() ?. resolve () Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠ Ġreturn ĠPsi Manager . getInstance ( project ). are Elements Equivalent ( resolved This , Ġresolved Other ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġcreate Declaration Expression ( declarations : ĠList < U Declaration >): ĠU Declarations Expression ? Ġ{ ĊĠĠĠ Ġreturn ĠJava U Declarations Expression ( null , Ġdeclarations ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġcreate Return Exp res ion ( expression : ĠU Expression ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Lambda : ĠBoolean ): ĠU Return Expression ? Ġ{ ĊĠĠĠ Ġval Ġreturn Statement Ġ= Ġpsi Factory . createStatement FromText (" return Ġ; ", Ġnull ) Ġas ? ĠPsi Return Statement Ġ?: Ġreturn Ġnull ĊĊĠĠĠ Ġexpression ?. source Psi ?. node ?. let Ġ{ Ġ( return Statement Ġas ĠComposite Element ). addChild ( it , Ġreturn Statement . last Child . node ) Ġ} ĊĊĠĠĠ Ġreturn ĠJava UR eturn Expression ( return Statement , Ġnull ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠPsi Variable . set Mut ability ( immutable : ĠBoolean ) Ġ{ ĊĠĠĠ Ġif Ġ( immutable Ġ&& Ġ! this . has Modifier ( Jvm Modifier . FINAL )) Ġ{ ĊĠĠĠĠĠ ĠPsi Util . set Modifier Property ( this , ĠPsi Modifier . FINAL , Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ(! immutable Ġ&& Ġthis . has Modifier ( Jvm Modifier . FINAL )) Ġ{ ĊĠĠĠĠĠ ĠPsi Util . set Modifier Property ( this , ĠPsi Modifier . FINAL , Ġfalse ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġcreate Local Variable ( suggest ed Name : ĠString ?, Ġtype : ĠPsi Type ?, Ġinitializer : ĠU Expression , Ġimmutable : ĠBoolean ): ĠU Local Variable ? Ġ{ ĊĠĠĠ Ġval Ġinitializer Psi Ġ= Ġinitializer . source Psi Ġas ? ĠPsi Expression Ġ?: Ġreturn Ġnull ĊĊĠĠĠ Ġval Ġname Ġ= Ġcreate Name From Suggest ed ( ĊĠĠĠĠĠ Ġsuggested Name , ĊĠĠĠĠĠ ĠVariable Kind . LOCAL _ VARIABLE , ĊĠĠĠĠĠ Ġtype , ĊĠĠĠĠĠ Ġinitializer Ġ= Ġinitializer Psi , ĊĠĠĠĠĠ Ġcontext Ġ= Ġinitializer Psi ĊĠĠĠ Ġ) Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġval Ġvariable Ġ= Ġ( type Ġ?: Ġinitializer . get Expression Type ()) ?. let Ġ{ Ġvariable Type Ġ-> ĊĠĠĠĠĠ Ġpsi Factory . create Variable Declaration Statement ( name , Ġvariable Type , Ġinitializer Psi , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitializer Psi . context ). declared Elements . first OrNull () Ġas ? ĠPsi Local Variable ĊĠĠĠ Ġ} Ġ?: Ġreturn Ġnull ĊĊĠĠĠ Ġvariable . set Mut ability ( immutable ) ĊĊĠĠĠ Ġreturn ĠJava UL ocal Variable ( variable , Ġnull ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġcreate Block Expression ( expressions : ĠList < U Expression >): ĠU Block Expression ? Ġ{ ĊĠĠĠ Ġval Ġblock Statement Ġ= ĠBlock Utils . create Block Statement ( project ) ĊĊĠĠĠ Ġfor Ġ( expression Ġin Ġexpressions ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( expression Ġis ĠJava U Declarations Expression ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( declaration Ġin Ġexpression . declarations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( declaration . source Psi Ġis ĠPsi Local Variable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock Statement . code Block . add ( declaration . source Psi ?. parent Ġas ? ĠPsi Declaration Statement Ġ?: Ġreturn Ġnull ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġexpression . source Psi ?. let Ġ{ Ġpsi Ġ-> ĊĠĠĠĠĠĠĠ Ġpsi Ġas ? ĠPsi Statement Ġ?: Ġ( psi Ġas ? ĠPsi Expression )?. let Ġ{ Ġpsi Factory . create Exp res ion Statement ( it ) Ġ} ĊĠĠĠĠĠ Ġ} ?. let Ġ{ Ġblock Statement . code Block . add ( it ) Ġ} Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠJava U Block Expression ( block Statement , Ġnull ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġcreate Lambda Expression ( parameters : ĠList < U Parameter Info >, Ġbody : ĠU Expression ): ĠU Lambda Expression ? Ġ{ ĊĠĠĠ Ġ// TODO : Ġsmart Ġhandling Ġcases , Ġwhen Ġparameters Ġtypes Ġshould Ġexist Ġin Ġcode ĊĠĠĠ Ġval Ġlambda Ġ= Ġpsi Factory . create Expression FromText ( ĊĠĠĠĠĠ Ġbuild String Ġ{ ĊĠĠĠĠĠĠĠ Ġparameters . join To ( this , Ġseparator Ġ= Ġ",", Ġprefix Ġ= Ġ" (", Ġpostfix Ġ= Ġ") ") Ġ{ Ġ" x Ġx " Ġ} ĊĠĠĠĠĠĠĠ Ġappend (" -> {} ") ĊĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ) Ġas ? ĠPsi Lambda Expression Ġ?: Ġreturn Ġnull ĊĊĠĠĠ Ġval Ġneeds Type Ġ= Ġparameters . all Ġ{ Ġit . type Ġ!= Ġnull Ġ} ĊĠĠĠ Ġlambda . parameter List . parameters . forEach Indexed Ġ{ Ġi , Ġparameter Ġ-> ĊĠĠĠĠĠ Ġparameters [ i ]. also Ġ{ Ġparameter Info Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġcreate Name From Suggest ed ( ĊĠĠĠĠĠĠĠĠĠ Ġparameter Info . suggest ed Name , ĊĠĠĠĠĠĠĠĠĠ ĠVariable Kind . PARAMETER , ĊĠĠĠĠĠĠĠĠĠ Ġparameter Info . type , ĊĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= Ġbody . source Psi ĊĠĠĠĠĠĠĠ Ġ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġparameter . name Identifier ?. replace ( psi Factory . create Identifier ( name )) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( needs Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġparameter . type Element ?. replace ( psi Factory . create Type Element ( parameter Info . type !! )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġparameter . remove Type Element () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( lambda . parameter List . parameters Count Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠ Ġlambda . parameter List . parameters [ 0 ]. remove Type Element () ĊĠĠĠĠĠ Ġlambda . parameter List . firstChild . delete () ĊĠĠĠĠĠ Ġlambda . parameter List . last Child . delete () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġnormalized Body Ġ= Ġwhen Ġ( val Ġbody Psi Ġ= Ġbody . source Psi ) Ġ{ ĊĠĠĠĠĠ Ġis ĠPsi Expression Ġ-> Ġbody Psi ĊĠĠĠĠĠ Ġis ĠPsi Code Block Ġ-> Ġnormalize Block For Lambda ( body Psi ) ĊĠĠĠĠĠ Ġis ĠPsi Block Statement Ġ-> Ġnormalize Block For Lambda ( body Psi . code Block ) ĊĠĠĠĠĠ Ġelse Ġ-> Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġlambda . body ?. replace ( normalized Body ) Ġ?: Ġreturn Ġnull ĊĊĠĠĠ Ġreturn ĠJava UL ambda Expression ( lambda , Ġnull ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġnormalize Block For Lambda ( block : ĠPsi Code Block ): ĠPsi Element Ġ= ĊĠĠĠ Ġblock ĊĠĠĠĠĠ Ġ. take If Ġ{ Ġblock . statement Count Ġ== Ġ 1 Ġ} ĊĠĠĠĠĠ Ġ? . let Ġ{ Ġblock . statements [ 0 ] Ġas ? ĠPsi Return Statement Ġ} ĊĠĠĠĠĠ Ġ? . let Ġ{ Ġit . returnValue Ġ} Ġ?: Ġblock ĊĊĠ Ġoverride Ġfun Ġcreate Parent hesized Expression ( expression : ĠU Expression ): ĠU Parent hesized Expression ? Ġ{ ĊĠĠĠ Ġval Ġparent hesized Expression Ġ= Ġpsi Factory . create Expression FromText (" ()", Ġnull ) Ġas ? ĠPsi Parent hesized Expression Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġparent hesized Expression . children . get OrNull ( 1 )?. replace ( expression . source Psi Ġ?: Ġreturn Ġnull ) Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġreturn ĠJava UP arent hesized Expression ( parent hesized Expression , Ġnull ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġcreate Simple Reference ( name : ĠString ): ĠU Simple Name Reference Expression ? Ġ{ ĊĠĠĠ Ġval Ġreference Ġ= Ġpsi Factory . create Expression FromText ( name , Ġnull ) ĊĠĠĠ Ġreturn ĠJava US imple Name Reference Expression ( reference , Ġname , Ġnull ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġcreate Simple Reference ( variable : ĠU Variable ): ĠU Simple Name Reference Expression ? Ġ{ ĊĠĠĠ Ġreturn Ġcreate Simple Reference ( variable . name Ġ?: Ġreturn Ġnull ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġcreate Binary Expression ( left Operand : ĠU Expression , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Operand : ĠU Expression , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperator : ĠU ast Binary Operator ): ĠU Binary Expression ? Ġ{ ĊĠĠĠ Ġval Ġleft Psi Ġ= Ġleft Operand . source Psi Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġval Ġright Psi Ġ= Ġright Operand . source Psi Ġ?: Ġreturn Ġnull ĊĊĠĠĠ Ġval Ġoperator Symbol Ġ= Ġwhen Ġ( operator ) Ġ{ ĊĠĠĠĠĠ ĠU ast Binary Operator . LOG ICAL _ AND Ġ-> Ġ" && " ĊĠĠĠĠĠ Ġelse Ġ-> Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġpsi Binary Expression Ġ= Ġpsi Factory . create Expression FromText (" a Ġ$ operator Symbol Ġb ", Ġnull ) Ġas ? ĠPsi Binary Expression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġpsi Binary Expression . l Operand . replace ( left Psi ) ĊĠĠĠ Ġpsi Binary Expression . r Operand ?. replace ( right Psi ) ĊĊĠĠĠ Ġreturn ĠJava UB inary Expression ( psi Binary Expression , Ġnull ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġcreate Flat Binary Expression ( left Operand : ĠU Expression , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġright Operand : ĠU Expression , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperator : ĠU ast Binary Operator ): ĠU Poly adic Expression ? Ġ{ ĊĠĠĠ Ġval Ġbinary Expression Ġ= Ġcreate Binary Expression ( left Operand , Ġright Operand , Ġoperator ) Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġval Ġbinary Source Psi Ġ= Ġbinary Expression . source Psi Ġas ? ĠPsi Binary Expression Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġval Ġdummy Parent Ġ= Ġpsi Factory . createStatement FromText (" a ;", Ġnull ) ĊĠĠĠ Ġdummy Parent . firstChild . replace ( binary Source Psi ) ĊĠĠĠ ĠParent heses Utils . remove Parent heses ( dummy Parent . firstChild Ġas ĠPsi Expression , Ġfalse ) ĊĠĠĠ Ġreturn Ġwhen Ġ( val Ġresult Ġ= Ġdummy Parent . firstChild ) Ġ{ ĊĠĠĠĠĠ Ġis ĠPsi Binary Expression Ġ-> ĠJava UB inary Expression ( result , Ġnull ) ĊĠĠĠĠĠ Ġis ĠPsi Poly adic Expression Ġ-> ĠJava UP oly adic Expression ( result , Ġnull ) ĊĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Unexpected Ġtype Ġ" Ġ+ Ġresult . java Class ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġval ĠPsi Element . branch Statement : ĠPsi Statement ? ĊĠĠĠ Ġget () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠ Ġis ĠPsi Expression Ġ-> ĠJava Psi Facade . getElement Factory ( project ). create Exp res ion Statement ( this ) ĊĠĠĠĠĠ Ġis ĠPsi Code Block Ġ-> ĠBlock Utils . create Block Statement ( project ). also Ġ{ Ġit . code Block . replace ( this ) Ġ} ĊĠĠĠĠĠ Ġis ĠPsi Statement Ġ-> Ġthis ĊĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠPsi Variable . remove Type Element () Ġ{ ĊĠĠĠ Ġthis . type Element ?. delete () ĊĠĠĠ Ġif Ġ( this . children . get OrNull ( 1 ) Ġ! is ĠPsi Identifier ) Ġ{ ĊĠĠĠĠĠ Ġthis . children . get OrNull ( 1 )?. delete () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate Name From Suggest ed ( suggest ed Name : ĠString ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvariable Kind : ĠVariable Kind , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype : ĠPsi Type ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitializer : ĠPsi Expression ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext : ĠPsi Element ? Ġ= Ġnull ): ĠString ? Ġ{ ĊĠĠĠ Ġval Ġcode Style Manager Ġ= ĠJava Code Style Manager . getInstance ( project ) ĊĠĠĠ Ġval Ġname Ġ= Ġsuggested Name Ġ?: Ġcode Style Manager . generate Variable Name ( type , Ġinitializer , Ġvariable Kind ) Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġreturn Ġcode Style Manager . suggest Unique Variable Name ( name , Ġcontext , Ġfalse ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠJava Code Style Manager . generate Variable Name ( type : ĠPsi Type ?, Ġinitializer : ĠPsi Expression ?, Ġkind : ĠVariable Kind ) Ġ= ĊĠĠĠ Ġsuggest Variable Name ( kind , Ġnull , Ġinitializer , Ġtype ). names . first OrNull () Ċ }