/* Ċ Ġ* Ġ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 . quick fix . createFrom Usage . create Callable Ċ Ċ import Ġcom . intellij . code Insight . int ention . Low Priority Action Ċ import Ġcom . intellij . openapi . editor . Editor Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . psi . Psi Class Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi File Ċ import Ġorg . jetbrains . kotlin . builtins . functions . Function Class Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Classifier Descriptor Ċ import Ġorg . jetbrains . kotlin . idea . code Insight . Descriptor To Source Utils Ide Ċ import Ġorg . jetbrains . kotlin . idea . core . refactor ing . can Ref actor Ċ import Ġorg . jetbrains . kotlin . idea . core . refactor ing . choose Container Element If Ne cessary Ċ import Ġorg . jetbrains . kotlin . idea . quick fix . createFrom Usage . CreateFrom Usage Fix Base Ċ import Ġorg . jetbrains . kotlin . idea . quick fix . createFrom Usage . callable Builder .* Ċ import Ġorg . jetbrains . kotlin . idea . util . Ide Descriptor Render ers Ċ import Ġorg . jetbrains . kotlin . idea . util . application . execute Command Ċ import Ġorg . jetbrains . kotlin . psi .* Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . getElement Text WithContext Ċ import Ġjava . util . HashSet Ċ Ċ public Ġclass ĠCreate Callable From Usage Fix < E Ġ: ĠK t Element >( ĊĠĠĠĠĠĠĠ Ġoriginal Expression : ĠE , ĊĠĠĠĠĠĠĠ Ġcallable Infos : ĠList < Callable Info > Ċ ) Ġ: ĠCreate Callable From Usage Fix Base < E >( original Expression , Ġcallable Infos , Ġfalse ) Ċ Ċ public Ġclass ĠCreate Extension Callable From Usage Fix < E Ġ: ĠK t Element >( ĊĠĠĠĠĠĠĠ Ġoriginal Expression : ĠE , ĊĠĠĠĠĠĠĠ Ġcallable Infos : ĠList < Callable Info > Ċ ) Ġ: ĠCreate Callable From Usage Fix Base < E >( original Expression , Ġcallable Infos , Ġtrue ), ĠLow Priority Action Ċ Ċ public Ġabstract Ġclass ĠCreate Callable From Usage Fix Base < E Ġ: ĠK t Element >( ĊĠĠĠĠĠĠĠ Ġoriginal Expression : ĠE , ĊĠĠĠĠĠĠĠ Ġval Ġcallable Infos : ĠList < Callable Info >, ĊĠĠĠĠĠĠĠ Ġval Ġis Extension : ĠBoolean Ċ ) Ġ: ĠCreate From Usage Fix Base < E >( original Expression ) Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Ġ( callable Infos . isNotEmpty ()) Ġ{ Ġ" No ĠCallable Infos : Ġ${ original Expression . getElement Text WithContext () }" Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( callable Infos . size () Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreceiver Set Ġ= Ġcallable Infos . map To ( HashSet < TypeInfo >()) Ġ{ Ġit . receiver TypeInfo Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( receiver Set . size () Ġ> Ġ 1 ) Ġthrow ĠAssertionError (" All Ġfunctions Ġmust Ġhave Ġcommon Ġreceiver : Ġ$ receiver Set ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpossible Container Set Ġ= Ġcallable Infos . map To ( HashSet < List < Kt Element >> ()) Ġ{ Ġit . possible Containers Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( possible Container Set . size () Ġ> Ġ 1 ) Ġthrow ĠAssertionError (" All Ġfunctions Ġmust Ġhave Ġcommon Ġcontainers : Ġ$ possible Container Set ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Declaration ( descriptor : ĠClass ifier Descriptor , Ġproject : ĠProject ): ĠPsi Element ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( descriptor Ġis ĠFunction Class Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpsi Factory Ġ= ĠK t Psi Factory ( project ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsynthetic Class Ġ= Ġpsi Factory . createClass ( Ide Descriptor Render ers . SOURCE _ CODE _ SHORT _ NAMES _ IN _ TYPES . render ( descriptor )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpsi Factory . create Analy z able File ("${ descriptor . name . asString ()}. kt ", Ġ"", Ġelement ). add ( synt hetic Class ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠDescriptor To Source Utils Ide . get Any Declaration ( project , Ġdescriptor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Declaration If Applicable ( project : ĠProject , Ġcandidate : ĠType Candidate ): ĠPsi Element ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġcandidate . the Type . constructor . declaration Descriptor Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġdeclaration Ġ= Ġget Declaration ( descriptor , Ġproject ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( declaration Ġ! is ĠK t Class Or Object Ġ&& Ġdeclaration Ġ! is ĠPsi Class ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Extension Ġ|| Ġdeclaration . can Ref actor ()) Ġdeclaration Ġelse Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetText (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrendered Call ables Ġ= Ġcallable Infos . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkind Ġ= Ġwhen Ġ( it . kind ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCallable Kind . FUNCTION Ġ-> Ġ" function " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCallable Kind . PROPERTY Ġ-> Ġ" property " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCallable Kind . SECOND ARY _ CON STRUCTOR Ġ-> Ġ" secondary Ġconstructor " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠAssertionError (" Unexpected Ġcallable Ġinfo : Ġ$ it ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . name . isNotEmpty ()) Ġ"$ kind Ġ'${ it . name } '" Ġelse Ġkind ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠStringBuilder Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" Create Ġ") ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreceiver Info Ġ= Ġcallable Infos . first (). receiver TypeInfo ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Extension ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" extension Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( receiver Info Ġ! is ĠType Info . Empty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġappend (" member Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġrendered Call ables . join To ( this ) ĊĠĠĠĠĠĠĠ Ġ}. toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Available ( project : ĠProject , Ġeditor : ĠEditor ?, Ġfile : ĠPsi File ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! super . is Available ( project , Ġeditor , Ġfile )) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( file Ġ! is ĠK t File ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġreceiver Info Ġ= Ġcallable Infos . first (). receiver TypeInfo ĊĊĠĠĠĠĠĠĠ Ġif Ġ( receiver Info Ġis ĠType Info . Empty ) Ġreturn Ġ! is Extension ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠRemove Ġafter Ġcompanion Ġobject Ġextensions Ġare Ġsupported ĊĠĠĠĠĠĠĠ Ġif Ġ( is Extension Ġ&& Ġreceiver Info . static Context Required ) Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠ Ġval Ġcallable Builder Ġ= ĠCallable Builder Configuration ( callable Infos , Ġelement , Ġfile , Ġnull , Ġis Extension ). create Builder () ĊĠĠĠĠĠĠĠ Ġval Ġreceiver Type Candidates Ġ= Ġcallable Builder . compute Type Candidates ( callable Infos . first (). receiver TypeInfo ) ĊĠĠĠĠĠĠĠ Ġval Ġproperty Info Ġ= Ġcallable Infos . first OrNull Ġ{ Ġit Ġis ĠProperty Info Ġ} Ġas ĠProperty Info ? ĊĠĠĠĠĠĠĠ Ġval Ġis Function Ġ= Ġcallable Infos . any Ġ{ Ġit . kind Ġ== ĠCallable Kind . FUNCTION Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġreceiver Type Candidates . any Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeclaration Ġ= Ġget Declaration If Applicable ( project , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinsert To Java Interface Ġ= Ġdeclaration Ġis ĠPsi Class Ġ&& Ġdeclaration . is Interface ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! is Extension Ġ&& Ġproperty Info Ġ!= Ġnull Ġ&& Ġinsert To Java Interface Ġ&& Ġ(! receiver Info . static Context Required Ġ|| Ġproperty Info . writable ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Function Ġ&& Ġinsert To Java Interface Ġ&& Ġreceiver Info . static Context Required Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġinvoke ( project : ĠProject , Ġeditor : ĠEditor ?, Ġfile : ĠK t File ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcallable Info Ġ= Ġcallable Infos . first () ĊĊĠĠĠĠĠĠĠ Ġval Ġcallable Builder Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCallable Builder Configuration ( callable Infos , Ġelement Ġas ĠK t Element , Ġfile , Ġeditor !! , Ġis Extension ). create Builder () ĊĊĠĠĠĠĠĠĠ Ġfun Ġrun Builder ( placement : ĠCallable Placement ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallable Builder . placement Ġ= Ġplacement ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject . execute Command ( text ) Ġ{ Ġcallable Builder . build () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( callable Info Ġis ĠSecondary Constructor Info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Builder ( Callable Placement . No Receiver ( callable Info . target Class )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpopup Title Ġ= Ġ" Choose Ġtarget Ġclass Ġor Ġinterface " ĊĠĠĠĠĠĠĠ Ġval Ġreceiver Type Candidates Ġ= Ġcallable Builder . compute Type Candidates ( callable Info . receiver TypeInfo ) ĊĠĠĠĠĠĠĠ Ġif Ġ( receiver Type Candidates . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontainers Ġ= Ġreceiver Type Candidates ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġcandidate Ġ-> Ġget Declaration If Applicable ( project , Ġcandidate )?. let Ġ{ Ġcandidate Ġto Ġit Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter NotNull () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġchoose Container Element If Ne cessary ( containers , Ġeditor , Ġpopup Title , Ġfalse , Ġ{ Ġit . second Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Builder ( Callable Placement . With Receiver ( it . first )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( callable Info . receiver TypeInfo Ġis ĠType Info . Empty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" No Ġreceiver Ġtype Ġcandidates : Ġ${ element . text } Ġin Ġ${ file . text }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġchoose Container Element If Ne cessary ( callable Info . possible Containers , Ġeditor , Ġpopup Title , Ġtrue , Ġ{ Ġit Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontainer Ġ= Ġif Ġ( it Ġis ĠK t Class Body ) Ġit . parent Ġas ĠK t Class Or Object Ġelse Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrun Builder ( Callable Placement . No Receiver ( container )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ