// ĠCopyright Ġ 2 0 0 0 - 2 0 1 8 Ġ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 . plugins . groovy . lang . resolve . processors Ċ Ċ import Ġcom . intellij . psi .* Ċ import Ġcom . intellij . psi . scope . Element Class Hint Ċ import Ġcom . intellij . psi . scope . Element Class Hint . Declaration Kind Ċ import Ġcom . intellij . psi . scope . Java Scope Processor Event Ċ import Ġcom . intellij . psi . scope . Name Hint Ċ import Ġcom . intellij . psi . scope . Processor With Hints Ċ import Ġcom . intellij . psi . scope . Psi Scope Processor . Event Ċ import Ġcom . intellij . util . Smart List Ċ import Ġcom . intellij . util . containers . isNull OrEmpty Ċ import Ġorg . jetbrains . plugins . groovy . lang . psi . api . Gro ovy MethodResult Ċ import Ġorg . jetbrains . plugins . groovy . lang . psi . util . element Info Ċ import Ġorg . jetbrains . plugins . groovy . lang . resolve .* Ċ import Ġorg . jetbrains . plugins . groovy . lang . resolve . api . Arguments Ċ import Ġorg . jetbrains . plugins . groovy . lang . resolve . impl .* Ċ import Ġorg . jetbrains . plugins . groovy . lang . resolve . processors . inference . put All Ċ Ċ class ĠMethod Processor ( ĊĠ Ġprivate Ġval Ġname : ĠString , ĊĠ Ġprivate Ġval Ġplace : ĠPsi Element , ĊĠ Ġprivate Ġval Ġarguments : ĠArguments ?, ĊĠ Ġprivate Ġval Ġtype Arguments : ĠArray < out ĠPsi Type > Ċ ) Ġ: ĠProcessor With Hints (), ĊĠĠĠ ĠName Hint , ĊĠĠĠ ĠGro ovy Resolve Kind . Hint , ĊĠĠĠ ĠElement Class Hint , ĊĠĠĠ ĠDynamic Members Hint Ġ{ ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġhint ( Name Hint . KEY , Ġthis ) ĊĠĠĠ Ġhint ( Gro ovy Resolve Kind . HINT _ KEY , Ġthis ) ĊĠĠĠ Ġhint ( Element Class Hint . KEY , Ġthis ) ĊĠĠĠ Ġhint ( Dynamic Members Hint . KEY , Ġthis ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun ĠgetName ( state : ĠResolve State ): ĠString ? Ġ= Ġname ĊĊĠ Ġoverride Ġfun Ġshould Process ( kind : ĠGro ovy Resolve Kind ): ĠBoolean Ġ= Ġkind Ġ== ĠGro ovy Resolve Kind . METHOD Ġ&& Ġaccept More ĊĊĠ Ġoverride Ġfun Ġshould Process ( kind : ĠDeclaration Kind ): ĠBoolean Ġ= Ġkind Ġ== ĠDeclaration Kind . METHOD Ġ&& Ġaccept More ĊĊĠ Ġoverride Ġfun Ġshould Process Methods (): ĠBoolean Ġ= Ġmy Candidates . isEmpty () ĊĊĠ Ġprivate Ġval Ġmy Candidates Ġ= ĠSmart List < Gro ovy MethodResult >() ĊĠ Ġprivate Ġvar Ġmy Applicable : ĠApplic abilities Result ? Ġ= Ġnull ĊĠ Ġprivate Ġval Ġaccept More : ĠBoolean Ġget () Ġ= Ġmy Applicable ?. first . isNull OrEmpty () ĊĊĠ Ġoverride Ġfun Ġexecute ( element : ĠPsi Element , Ġstate : ĠResolve State ): ĠBoolean Ġ{ ĊĠĠĠ Ġif Ġ(! accept More ) Ġ{ ĊĠĠĠĠĠ Ġlog . warn (" Don 't Ġpass Ġmore Ġmethods Ġif Ġprocessor Ġdoesn 't Ġwant Ġto Ġaccept Ġthem ") ĊĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( element Ġ! is ĠPsi Method ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( state [ sor ry Cannot K now Element Kind ] Ġ!= Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . warn (" Unexpected Ġelement . Ġ${ element Info ( element )} ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( name Ġ!= ĠgetName ( state , Ġelement )) Ġreturn Ġtrue ĊĊĠĠĠ Ġmy Candidates Ġ+= Ġwhen Ġ{ ĊĠĠĠĠĠ Ġ! element . has Type Parameters () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġignore Ġexplicit Ġtype Ġarguments Ġif Ġthere Ġare Ġno Ġtype Ġparameters Ġ=> Ġno Ġinference Ġneeded ĊĠĠĠĠĠĠĠ ĠBase Method Resolve Result ( element , Ġplace , Ġstate , Ġarguments ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġtype Arguments . isEmpty () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgeneric Ġmethod Ġcall Ġwithout Ġexplicit Ġtype Ġarguments Ġ=> Ġneeds Ġinference ĊĠĠĠĠĠĠĠ ĠMethod Resolve Result ( element , Ġplace , Ġstate , Ġarguments ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġgeneric Ġmethod Ġcall Ġwith Ġexplicit Ġtype Ġarguments Ġ=> Ġinference Ġhappens Ġright Ġhere ĊĠĠĠĠĠĠĠ Ġval Ġsubstit utor Ġ= Ġstate [ Psi Subst it utor . KEY ]. put All ( element . type Parameters , Ġtype Arguments ) ĊĠĠĠĠĠĠĠ ĠBase Method Resolve Result ( element , Ġplace , Ġstate . put ( Psi Subst it utor . KEY , Ġsubstit utor ), Ġarguments ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġmy Applicable Ġ= Ġnull ĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġhandle Event ( event : ĠEvent , Ġassociated : ĠAny ?) Ġ{ ĊĠĠĠ Ġif Ġ( Java Scope Processor Event . CHANGE _ LEVEL Ġ=== Ġevent Ġ&& Ġmy Applicable Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġmy Applicable Ġ= Ġcompute Applicable Candidates () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcompute Applicable Candidates (): ĠPair < List < Gro ovy MethodResult >, ĠBoolean > Ġ{ ĊĠĠĠ Ġreturn Ġmy Candidates ĊĠĠĠĠĠ Ġ. correct Static Scope () ĊĠĠĠĠĠ Ġ. find Applicable () ĊĠ Ġ} ĊĊĠ Ġval Ġapplicable Candidates : ĠList < Gro ovy MethodResult >? ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠ Ġval Ġ( applic able Candidates , Ġcan Choose Over load ) Ġ= Ġmy Applicable Ġ?: Ġcompute Applicable Candidates () ĊĠĠĠĠĠ Ġif Ġ( applic able Candidates . isEmpty ()) Ġreturn Ġnull ĊĠĠĠĠĠ Ġif Ġ( can Choose Over load ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġchoose Over loads ( applic able Candidates , ĠDefault Method Comparator Context ( place , Ġarguments )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfilter By Signature ( applic able Candidates ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠ Ġval Ġall Candidates : ĠList < Gro ovy MethodResult > Ġget () Ġ= Ġmy Candidates Ċ } Ċ