/* Ċ Ġ* ĠCopyright Ġ 2 0 0 0 - 2 0 1 6 Ġ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 . plugins . groovy . ext . log back Ċ Ċ import Ġcom . intellij . openapi . util . Key Ċ import Ġcom . intellij . psi .* Ċ import Ġcom . intellij . psi . Common ClassNames . JAVA _ LANG _ STRING Ċ import Ġcom . intellij . psi . scope . Base Scope Processor Ċ import Ġcom . intellij . psi . scope . Element Class Hint Ċ import Ġcom . intellij . psi . scope . Name Hint Ċ import Ġcom . intellij . psi . scope . Psi Scope Processor Ċ import Ġcom . intellij . psi . util . Psi Tree Util Ċ import Ġgro ovy . lang . Closure . DE LEG ATE _ FIRST Ċ import Ġorg . jetbrains . plugins . groovy . lang . psi . api . statements . blocks . Gr C losable Block Ċ import Ġorg . jetbrains . plugins . groovy . lang . psi . api . statements . expressions . Gr Reference Expression Ċ import Ġorg . jetbrains . plugins . groovy . lang . psi . impl . synt hetic . Gr Light Method Builder Ċ import Ġorg . jetbrains . plugins . groovy . lang . psi . impl . synt hetic . Gr Method Wrapper Ċ import Ġorg . jetbrains . plugins . groovy . lang . psi . util . Gro ovy Common ClassNames . GRO OV Y _ LANG _ CLO S URE Ċ import Ġorg . jetbrains . plugins . groovy . lang . psi . util . Gro ovy Property Utils Ċ import Ġorg . jetbrains . plugins . groovy . lang . psi . util . Psi Util Ċ import Ġorg . jetbrains . plugins . groovy . lang . resolve . Non Code Members Contributor Ċ import Ġorg . jetbrains . plugins . groovy . lang . resolve . Resolve Util Ċ import Ġorg . jetbrains . plugins . groovy . lang . resolve . deleg ates To . DE LEG ATES _ TO _ KEY Ċ import Ġorg . jetbrains . plugins . groovy . lang . resolve . deleg ates To . DE LEG ATES _ TO _ STR ATE GY _ KEY Ċ import Ġorg . jetbrains . plugins . groovy . lang . resolve . deleg ates To . get Containing Call Ċ import Ġorg . jetbrains . plugins . groovy . lang . resolve . wrap ClassType Ċ Ċ class ĠLog back Delegate Member Contributor Ġ: ĠNon Code Members Contributor () Ġ{ ĊĊĠ Ġoverride Ġfun ĠgetParent ClassName () Ġ= Ġcomponent Delegate F qn ĊĊĠ Ġoverride Ġfun Ġprocess Dynamic Elements ( qual ifier Type : ĠPsi Type , Ġprocessor : ĠPsi Scope Processor , Ġplace : ĠPsi Element , Ġstate : ĠResolve State ) Ġ{ ĊĠĠĠ Ġval Ġname Ġ= Ġprocessor . get Hint ( Name Hint . KEY )?. getName ( state ) ĊĠĠĠ Ġval Ġcomponent Class Ġ= Ġget Component Class ( place ) Ġ?: Ġreturn ĊĠĠĠ Ġval Ġcomponent Processor Ġ= ĠComponent Processor ( processor , Ġplace , Ġname ) ĊĠĠĠ Ġif Ġ( name Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġcomponent Class . process Declarations ( component Processor , Ġstate , Ġnull , Ġplace ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġfor Ġ( prefix Ġin ĠarrayOf (" add ", Ġ" set ")) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( method Ġin Ġcomponent Class . find Methods ByName ( prefix Ġ+ Ġname . capitalize (), Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ(! component Processor . execute ( method , Ġstate )) Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġget Component Class ( place : ĠPsi Element ): ĠPsi Class ? Ġ{ ĊĠĠĠ Ġval Ġreference Ġ= Ġplace Ġas ? ĠGr Reference Expression Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġif Ġ( reference . is Qualified ) Ġreturn Ġnull ĊĊĠĠĠ Ġval Ġclosure Ġ= ĠPsi Tree Util . getParent OfType ( reference , ĠGr C losable Block :: class . java ) Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġval Ġcall Ġ= Ġget Containing Call ( closure ) Ġ?: Ġreturn Ġnull ĊĊĠĠĠ Ġval Ġarguments Ġ= ĠPsi Util . getAll Arguments ( call ) ĊĠĠĠ Ġif Ġ( arguments . isEmpty ()) Ġreturn Ġnull ĊĊĠĠĠ Ġval Ġlast Is Closure Ġ= Ġ( arguments . last (). type Ġas ? ĠPsi ClassType )?. resolve ()?. qualified Name Ġ== ĠGRO OV Y _ LANG _ CLO S URE ĊĠĠĠ Ġval Ġcomponent Argument Index Ġ= Ġ( if Ġ( last Is Closure ) Ġarguments . size Ġ- Ġ 1 Ġelse Ġarguments . size ) Ġ- Ġ 1 ĊĠĠĠ Ġval Ġcomponent Argument Ġ= Ġarguments . get OrNull ( component Argument Index ) ĊĠĠĠ Ġval Ġcomponent Type Ġ= ĠResolve Util . unwrap ClassType ( component Argument ?. type ) Ġas ? ĠPsi ClassType ĊĠĠĠ Ġreturn Ġcomponent Type ?. resolve () ĊĠ Ġ} ĊĊĠ Ġclass ĠComponent Processor ( val Ġdelegate : ĠPsi Scope Processor , Ġval Ġplace : ĠPsi Element , Ġval Ġname : ĠString ?) Ġ: ĠBase Scope Processor () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġexecute ( method : ĠPsi Element , Ġstate : ĠResolve State ): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġmethod Ġas ? ĠPsi Method Ġ?: Ġreturn Ġtrue ĊĊĠĠĠĠĠ Ġval Ġprefix Ġ= Ġif Ġ( Gro ovy Property Utils . is Setter Like ( method , Ġ" set ")) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! delegate . execute ( method , Ġstate )) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ" set " ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġif Ġ( Gro ovy Property Utils . is Setter Like ( method , Ġ" add ")) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠnewName Ġ= Ġmethod . name . replace First (" add ", Ġ" set ") ĊĠĠĠĠĠĠĠ Ġval Ġwrapper Ġ= ĠGr Method Wrapper . wrap ( method , ĠnewName ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! delegate . execute ( wrapper , Ġstate )) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ" add " ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval ĠpropertyName Ġ= Ġmethod . name . remove Prefix ( prefix ). de capitalize () ĊĠĠĠĠĠ Ġif Ġ( name Ġ!= Ġnull Ġ&& Ġname Ġ!= ĠpropertyName ) Ġreturn Ġtrue ĊĊĠĠĠĠĠ Ġval Ġparameter Ġ= Ġmethod . parameter List . parameters . single OrNull () Ġ?: Ġreturn Ġtrue ĊĠĠĠĠĠ Ġval Ġclass Type Ġ= Ġwrap ClassType ( parameter . type , Ġplace ) Ġ?: Ġreturn Ġtrue ĊĠĠĠĠĠ Ġval Ġwrapped Base Ġ= ĠGr Light Method Builder ( place . manager , ĠpropertyName ). apply Ġ{ ĊĠĠĠĠĠĠĠ ĠreturnType Ġ= ĠPsi Type . VOID ĊĠĠĠĠĠĠĠ Ġnavigation Element Ġ= Ġmethod ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ// Ġ( name , Ġclazz ) ĊĠĠĠĠĠ Ġ// Ġ( name , Ġclazz , Ġconfiguration ) ĊĠĠĠĠĠ Ġwrapped Base . copy (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Parameter (" name ", ĠJAVA _ LANG _ STRING ) ĊĠĠĠĠĠĠĠ Ġadd Parameter (" clazz ", Ġclass Type ) ĊĠĠĠĠĠĠĠ Ġadd Parameter (" configuration ", ĠGRO OV Y _ LANG _ CLO S URE , Ġtrue ) ĊĠĠĠĠĠ Ġ}. let Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! delegate . execute ( it , Ġstate )) Ġreturn Ġfalse ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ// Ġ( clazz ) ĊĠĠĠĠĠ Ġ// Ġ( clazz , Ġconfiguration ) ĊĠĠĠĠĠ Ġwrapped Base . copy (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Parameter (" clazz ", Ġclass Type ) ĊĠĠĠĠĠĠĠ Ġadd AndGet Parameter (" configuration ", ĠGRO OV Y _ LANG _ CLO S URE , Ġtrue ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġput UserData ( DE LEG ATES _ TO _ KEY , Ġcomponent Delegate F qn ) ĊĠĠĠĠĠĠĠĠĠ Ġput UserData ( DE LEG ATES _ TO _ STR ATE GY _ KEY , ĠDE LEG ATE _ FIRST ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ}. let Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! delegate . execute ( it , Ġstate )) Ġreturn Ġfalse ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġ< T Ġ: ĠAny ?> Ġget Hint ( hint Key : ĠKey < T >) Ġ= Ġif Ġ( hint Key Ġ== ĠElement Class Hint . KEY ) Ġ{ ĊĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠ ĠElement Class Hint Ġ{ Ġit Ġ== ĠElement Class Hint . Declaration Kind . METHOD Ġ} Ġas ĠT ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ }