/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 9 Ġ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 . kotlin . idea . actions . generate Ċ Ċ import Ġcom . intellij . code Insight . Code Insight Bundle Ċ import Ġcom . intellij . ide . util . Member Chooser Ċ import Ġcom . intellij . openapi . application . Application Manager Ċ import Ġcom . intellij . openapi . editor . Editor Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . refactor ing . util . Common Ref actor ing Util Ċ import Ġorg . jetbrains . kotlin . descriptors . Class Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Constructor Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Property Descriptor Ċ import Ġorg . jetbrains . kotlin . diagnostics . Errors Ċ import Ġorg . jetbrains . kotlin . idea . Kotlin Bundle Ċ import Ġorg . jetbrains . kotlin . idea . cache s . resolve . analyze With Content Ċ import Ġorg . jetbrains . kotlin . idea . code Insight . Descriptor To Source Utils Ide Ċ import Ġorg . jetbrains . kotlin . idea . core .* Ċ import Ġorg . jetbrains . kotlin . idea . core . util . Descriptor Member Chooser Object Ċ import Ġorg . jetbrains . kotlin . idea . util . Ide Descriptor Render ers Ċ import Ġorg . jetbrains . kotlin . psi .* Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . siblings Ċ import Ġorg . jetbrains . kotlin . resolve . Binding Context Ċ import Ġorg . jetbrains . kotlin . resolve . descriptor Util . built Ins Ċ import Ġorg . jetbrains . kotlin . resolve . descriptor Util . get Super Class Not Any Ċ import Ġorg . jetbrains . kotlin . resolve . source . get Psi Ċ import Ġorg . jetbrains . kotlin . types . Kotlin Type Ċ import Ġorg . jetbrains . kotlin . types . Type Subst it utor Ċ import Ġorg . jetbrains . kotlin . types . Variance Ċ import Ġorg . jetbrains . kotlin . types . checker . Kotlin Type Checker Ċ import Ġorg . jetbrains . kotlin . types . subst itution s . getType Subst it utor Ċ import Ġorg . jetbrains . kotlin . utils . addTo Std lib . first Is Instance OrNull Ċ import Ġorg . jetbrains . kotlin . utils . addTo Std lib . last Is Instance OrNull Ċ import Ġjava . util .* Ċ Ċ class ĠKotlin Generate Secondary Constructor Action Ġ: ĠKotlin Generate Member Action Base < Kotlin Generate Secondary Constructor Action . Info >() Ġ{ ĊĠĠĠ Ġclass ĠInfo ( ĊĠĠĠĠĠĠĠ Ġval Ġproperties To Initialize : ĠList < Property Descriptor >, ĊĠĠĠĠĠĠĠ Ġval Ġsuper Construct ors : ĠList < Constructor Descriptor >, ĊĠĠĠĠĠĠĠ Ġval Ġclass Descriptor : ĠClass Descriptor ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun ĠisValid For Class ( target Class : ĠK t Class Or Object ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtarget Class Ġis ĠK t Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġtarget Class Ġ! is ĠK t Enum Entry ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ! target Class . is Interface () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ! target Class . is Annotation () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ! target Class . has Explicit Primary Constructor () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshould Pre select ( element : ĠPsi Element ) Ġ= Ġelement Ġis ĠK t Property Ġ&& Ġ! element . is Var ĊĊĠĠĠ Ġprivate Ġfun Ġchoose Super Construct ors ( klass : ĠK t Class Or Object , Ġclass Descriptor : ĠClass Descriptor ): ĠList < Descriptor Member Chooser Object > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproject Ġ= Ġklass . project ĊĠĠĠĠĠĠĠ Ġval ĠsuperClass Descriptor Ġ= Ġclass Descriptor . get Super Class Not Any () Ġ?: Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġval Ġcandidates Ġ= ĠsuperClass Descriptor . construct ors ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . isVisible ( class Descriptor ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠDescriptor Member Chooser Object ( Descriptor To Source Utils Ide . get Any Declaration ( project , Ġit ) Ġ?: Ġklass , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( Application Manager . getApplication (). is UnitTest Mode Ġ|| Ġcandidates . size Ġ<= Ġ 1 ) Ġreturn Ġcandidates ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwith ( Member Chooser ( candidates . to Typed Array (), Ġfalse , Ġtrue , Ġklass . project )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= ĠCode Insight Bundle . message (" generate . constructor . super . constructor . cho oser . title ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Copy Javadoc Visible ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġselected Elements Ġ?: Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġchoose Properties To Initialize ( klass : ĠK t Class Or Object , Ġcontext : ĠBinding Context ): ĠList < Descriptor Member Chooser Object > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcandidates Ġ= Ġklass . declarations ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Is Instance < Kt Property >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . is Var Ġ|| Ġcontext . diagnostics . for Element ( it ). any Ġ{ Ġit . factory Ġin ĠErrors . MUST _ BE _ INITIAL IZED _ DIAG NO ST ICS Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġcontext . get ( Binding Context . VARIABLE , Ġit ) Ġas ĠProperty Descriptor Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠDescriptor Member Chooser Object ( it . source . get Psi () !! , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠ Ġif Ġ( Application Manager . getApplication (). is UnitTest Mode Ġ|| Ġcandidates . isEmpty ()) Ġreturn Ġcandidates ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwith ( Member Chooser ( candidates . to Typed Array (), Ġtrue , Ġtrue , Ġklass . project , Ġfalse , Ġnull )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Ġ= ĠKotlin Bundle . message (" action . generate . secondary . constructor . choose . properties ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Copy Javadoc Visible ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġselect Elements ( candidates . filter Ġ{ Ġshould Pre select ( it . element ) Ġ}. to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġselected Elements Ġ?: Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprepare Members Info ( klass : ĠK t Class Or Object , Ġproject : ĠProject , Ġeditor : ĠEditor ?): ĠInfo ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġklass . analyze With Content () ĊĠĠĠĠĠĠĠ Ġval Ġclass Descriptor Ġ= Ġcontext . get ( Binding Context . CLASS , Ġklass ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġsuper Construct ors Ġ= Ġchoose Super Construct ors ( klass , Ġclass Descriptor ). map Ġ{ Ġit . descriptor Ġas ĠConstructor Descriptor Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġproperties To Initialize Ġ= Ġchoose Properties To Initialize ( klass , Ġcontext ). map Ġ{ Ġit . descriptor Ġas ĠProperty Descriptor Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠInfo ( properties To Initialize , Ġsuper Construct ors , Ġclass Descriptor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġgenerate Members ( project : ĠProject , Ġeditor : ĠEditor ?, Ġinfo : ĠInfo ): ĠList < Kt Declaration > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtarget Class Ġ= Ġinfo . class Descriptor . source . get Psi () Ġas ? ĠK t Class Ġ?: Ġreturn Ġempty List () ĊĊĠĠĠĠĠĠĠ Ġfun ĠInfo . find Anchor (): ĠPsi Element ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Class . declarations . last Is Instance OrNull < Kt Secondary Constructor >() ?. let Ġ{ Ġreturn Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Property To Initialize Ġ= Ġproperties To Initialize . last OrNull ()?. source ?. get Psi () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeclarations After Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Property To Initialize ?. siblings ()?. filter Is Instance < Kt Declaration >() Ġ?: Ġtarget Class . declarations . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Non Property Ġ= Ġdeclarations After . first OrNull Ġ{ Ġit Ġ! is ĠK t Property Ġ} Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfirst Non Property . siblings ( forward Ġ= Ġfalse ). first Is Instance OrNull < Kt Property >() Ġ?: Ġtarget Class . get OrCreate Body (). l Brace ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwith ( info ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpro totypes Ġ= Ġif Ġ( super Construct ors . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper Construct ors . map NotNull Ġ{ Ġgenerate Constructor ( class Descriptor , Ġproperties To Initialize , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf NotNull ( generate Constructor ( class Descriptor , Ġproperties To Initialize , Ġnull )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prot otypes . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Text Ġ= ĠKotlin Bundle . message (" action . generate . secondary . constructor . error . already . exists ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCommon Ref actor ing Util . show Error Hint ( target Class . project , Ġeditor , Ġerror Text , Ġcommand Name , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Members After And Re format ( editor , Ġtarget Class , Ġpro totypes , Ġfind Anchor ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Constructor ( ĊĠĠĠĠĠĠĠ Ġclass Descriptor : ĠClass Descriptor , ĊĠĠĠĠĠĠĠ Ġproperties To Initialize : ĠList < Property Descriptor >, ĊĠĠĠĠĠĠĠ Ġsuper Constructor : ĠConstructor Descriptor ? ĊĠĠĠ Ġ): ĠK t Secondary Constructor ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġequal Types ( types 1 : ĠCollection < Kotlin Type >, Ġtypes 2 : ĠCollection < Kotlin Type >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtypes 1 . size Ġ== Ġtypes 2 . size Ġ&& Ġ( types 1 . zip ( types 2 )). all Ġ{ ĠKotlin Type Checker . DEFAULT . equal Types ( it . first , Ġit . second ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġconstructor Param Types Ġ= Ġproperties To Initialize . map Ġ{ Ġit . type Ġ} Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( super Constructor ?. value Parameters ?. map Ġ{ Ġit . var arg ElementType Ġ?: Ġit . type Ġ} Ġ?: Ġempty List ()) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( class Descriptor . construct ors . any Ġ{ Ġdescriptor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . source . get Psi () Ġis ĠK t Constructor < *> Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġequal Types ( descriptor . value Parameters . map Ġ{ Ġit . var arg ElementType Ġ?: Ġit . type Ġ}, Ġconstructor Param Types ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġtarget Class Ġ= Ġclass Descriptor . source . get Psi () Ġas ĠK t Class ĊĠĠĠĠĠĠĠ Ġval Ġpsi Factory Ġ= ĠK t Psi Factory ( target Class ) ĊĊĠĠĠĠĠĠĠ Ġval Ġvalidator Ġ= ĠCollect ing Name Validator () ĊĊĠĠĠĠĠĠĠ Ġval Ġconstructor Ġ= Ġpsi Factory . create Secondary Constructor (" constructor () ") ĊĠĠĠĠĠĠĠ Ġval Ġparameter List Ġ= Ġconstructor . value Parameter List !! ĊĊĠĠĠĠĠĠĠ Ġif Ġ( super Constructor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubstit utor Ġ= ĠgetType Subst it utor ( super Constructor . containing Declaration . default Type , Ġclass Descriptor . default Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠType Subst it utor . EMPTY ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeleg ation Call Arguments Ġ= ĠArrayList < String >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( parameter Ġin Ġsuper Constructor . value Parameters ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Var arg Ġ= Ġparameter . var arg ElementType Ġ!= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparam Name Ġ= ĠKotlin Name Suggest er . suggest Name ByName ( parameter . name . asString (), Ġvalidator ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype ToUse Ġ= Ġparameter . var arg ElementType Ġ?: Ġparameter . type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparam Type Ġ= ĠIde Descriptor Render ers . SOURCE _ CODE . render Type ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubstit utor . substitute ( type ToUse , ĠVari ance . IN VARIANT ) Ġ?: Ġclass Descriptor . built Ins . any Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodifiers Ġ= Ġif Ġ( is Var arg ) Ġ" var arg Ġ" Ġelse Ġ"" ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter List . add Parameter ( psi Factory . create Parameter ("$ modifiers $ param Name : Ġ$ param Type ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeleg ation Call Arguments . add ( if Ġ( is Var arg ) Ġ"* $ param Name " Ġelse Ġparam Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeleg ation Call Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpsi Factory . cre are Deleg ated Super Type Entry ( deleg ation Call Arguments . join ToString ( prefix Ġ= Ġ" super (", Ġpostfix Ġ= Ġ") ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor . replace Implicit Deleg ation Call With Explicit ( false ). replace ( deleg ation Call ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( properties To Initialize . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= Ġpsi Factory . create Empty Body () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( property Ġin Ġproperties To Initialize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpropertyName Ġ= Ġproperty . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparam Name Ġ= ĠKotlin Name Suggest er . suggest Name ByName ( propertyName . asString (), Ġvalidator ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparam Type Ġ= ĠIde Descriptor Render ers . SOURCE _ CODE . render Type ( property . type ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter List . add Parameter ( psi Factory . create Parameter ("$ param Name : Ġ$ param Type ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody . append Element ( psi Factory . create Expression (" this .$ propertyName Ġ= Ġ$ param Name "), Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor . add ( body ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġconstructor ĊĠĠĠ Ġ} Ċ }