/* Ċ Ġ* Ġ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 . kotlin . idea . intent ions Ċ Ċ import Ġcom . intellij . code Insight . int ention . Low Priority Action Ċ import Ġcom . intellij . openapi . editor . Editor Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġorg . jetbrains . kotlin . descriptors . Function Descriptor Ċ import Ġorg . jetbrains . kotlin . idea . cache s . resolve . analyze Ċ import Ġorg . jetbrains . kotlin . idea . core . setType Ċ import Ġorg . jetbrains . kotlin . psi .* Ċ import Ġorg . jetbrains . kotlin . resolve . Binding Context Ċ import Ġorg . jetbrains . kotlin . resolve . lazy . Body Resolve Mode Ċ import Ġorg . jetbrains . kotlin . types . Kotlin Type Ċ import Ġorg . jetbrains . kotlin . types . isError Ċ import Ġorg . jetbrains . kotlin . types . type Util . is Nothing Ċ import Ġorg . jetbrains . kotlin . types . type Util . is Unit Ċ import Ġjava . lang . RuntimeException Ċ Ċ class ĠConvert To Block Body Int ention Ġ: ĠSelf Target ing Int ention < Kt Declaration With Body >( ĊĠĠĠĠĠĠĠ ĠK t Declaration With Body :: class . java , Ġ" Convert Ġto Ġblock Ġbody " Ċ ), ĠLow Priority Action Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġis Applicable To ( element : ĠK t Declaration With Body , Ġcaret Offset : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( element Ġis ĠK t Function Literal Ġ|| Ġelement . has Block Body () Ġ|| Ġ! element . has Body ()) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Named Function Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠreturnType Ġ= Ġelement . returnType () Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! element . has Declared ReturnType () Ġ&& ĠreturnType . isError ) Ġreturn Ġfalse // Ġdo Ġnot Ġconvert Ġwhen Ġtype Ġis Ġimplicit Ġand Ġunknown ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Property Accessor Ġ-> Ġreturn Ġtrue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Unknown Ġdeclaration Ġtype : Ġ$ element ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġallow Caret Inside Element ( element : ĠPsi Element ) Ġ= Ġelement Ġ! is ĠK t Declaration Ġ&& Ġsuper . allow Caret Inside Element ( element ) ĊĊĠĠĠ Ġoverride Ġfun Ġapply To ( element : ĠK t Declaration With Body , Ġeditor : ĠEditor ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġconvert ( element ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġconvert ( declaration : ĠK t Declaration With Body ): ĠK t Declaration With Body Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġdeclaration . body Expression !! ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġgenerate Body ( returns Value : ĠBoolean ): ĠK t Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Type Ġ= Ġbody . analyze (). getType ( body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfactory Ġ= ĠK t Psi Factory ( declaration ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( body Type Ġ!= Ġnull Ġ&& Ġbody Type . is Unit () Ġ&& Ġbody Ġis ĠK t Name Reference Expression ) Ġreturn Ġfactory . create Empty Body () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġunit When As Result Ġ= Ġ( body Type Ġ== Ġnull Ġ|| Ġbody Type . is Unit ()) Ġ&& Ġbody . result ing Wh ens (). isNotEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġneed Return Ġ= Ġreturns Value Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( body Type Ġ== Ġnull Ġ|| Ġ(! body Type . is Unit () Ġ&& Ġ! body Type . is Nothing ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatement Ġ= Ġif Ġ( need Return Ġ|| Ġunit When As Result ) Ġfactory . create Expression By Pattern (" return Ġ$ 0 ", Ġbody ) Ġelse Ġbody ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfactory . create Single Statement Block ( statement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Body Ġ= Ġwhen Ġ( declaration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Named Function Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠreturnType Ġ= Ġdeclaration . returnType () !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! declaration . has Declared ReturnType () Ġ&& Ġ! returnType . is Unit ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration . setType ( returnType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Body (! returnType . is Unit () Ġ&& Ġ! returnType . is Nothing ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Property Accessor Ġ-> Ġgenerate Body ( declaration . is Getter ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠRuntimeException (" Unknown Ġdeclaration Ġtype : Ġ$ declaration ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration . equals Token !!. delete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody . replace ( new Body ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdeclaration ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠK t Named Function . returnType (): ĠKotlin Type ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġanalyze ( Body Resolve Mode . PAR TIAL )[ Binding Context . DECL AR ATION _ TO _ DESCRIPTOR , Ġthis ] Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( descriptor Ġas ĠFunction Descriptor ). returnType ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ