// ĠCopyright Ġ 2 0 0 0 - 2 0 2 0 Ġ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 . typing Ċ Ċ import Ġcom . intellij . pom . java . Language Level Ċ import Ġcom . intellij . psi . Psi ClassType Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi Type Ċ import Ġcom . intellij . util . containers . minimal Elements Ċ import Ġcom . intellij . util . recursion Safe Lazy Ċ import Ġorg . jetbrains . annotations . Non N ls Ċ import Ġorg . jetbrains . plugins . groovy . lang . psi . impl . Gr Literal ClassType Ċ import Ġorg . jetbrains . plugins . groovy . lang . psi . impl . statements . expressions . Types Util Ċ 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 . resolve . api . Argument Mapping Ċ import Ġorg . jetbrains . plugins . groovy . lang . resolve . api . Arguments Ċ import Ġorg . jetbrains . plugins . groovy . lang . resolve . api . Call Signature Ċ import Ġorg . jetbrains . plugins . groovy . lang . resolve . impl . compare Ċ import Ġorg . jetbrains . plugins . groovy . lang . resolve . impl . filter Applicable Ċ Ċ abstract Ġclass ĠGro ovy Closure Type ( ĊĠ Ġprivate Ġval Ġmy Context : ĠPsi Element Ċ ) Ġ: ĠGr Literal ClassType ( Language Level . JDK _ 1 _ 5 , Ġmy Context ) Ġ{ ĊĊĠ Ġoverride Ġfun ĠisValid (): ĠBoolean Ġ= Ġmy Context . isValid ĊĠ Ġfinal Ġoverride Ġfun Ġget Java ClassName (): ĠString Ġ= ĠGRO OV Y _ LANG _ CLO S URE ĊĠ Ġfinal Ġoverride Ġfun Ġset Language Level ( language Level : ĠLanguage Level ): ĠPsi ClassType Ġ= Ġerror (" must Ġnot Ġbe Ġcalled ") ĊĠ Ġ@ Non N ls Ġfinal Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" Closure " ĊĊĠ Ġfinal Ġoverride Ġfun Ġget Parameters (): ĠArray < out ĠPsi Type ?> Ġ= Ġmy Type Arguments Ġ?: ĠPsi Type . EMPTY _ ARRAY ĊĊĠ Ġprivate Ġval Ġmy Type Arguments : ĠArray < out ĠPsi Type ?> ? Ġby Ġrecursion Safe Lazy Ġ{ ĊĠĠĠ Ġval Ġclosure Clazz Ġ= Ġresolve () ĊĠĠĠ Ġif Ġ( closure Clazz Ġ== Ġnull Ġ|| Ġclosure Clazz . type Parameters . size Ġ!= Ġ 1 ) Ġ{ ĊĠĠĠĠĠ Ġreturn @ recursion Safe Lazy ĠPsi Type . EMPTY _ ARRAY ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġtype : ĠPsi Type ? Ġ= ĠreturnType ( null ) ĊĠĠĠ Ġif Ġ( type Ġ== Ġnull Ġ|| Ġtype Ġ=== ĠPsi Type . NULL ) Ġ{ ĊĠĠĠĠĠ ĠarrayOf < Psi Type ? >( null ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ ĠarrayOf ( Types Util . box Primitive Type ( type , Ġpsi Manager , Ġresolve Scope , Ġtrue )) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġabstract Ġval Ġsignatures : ĠList < @ Jvm Wildcard ĠCall Signature <* >> ĊĊĠ Ġopen Ġfun Ġcur ry ( position : ĠInt , Ġarguments : ĠArguments , Ġcontext : ĠPsi Element ): ĠPsi Type Ġ{ ĊĠĠĠ Ġreturn ĠGro ovy Cur ried Closure Type ( this , Ġposition , Ġarguments , Ġ 0 , Ġcontext ) ĊĠ Ġ} ĊĊĠ Ġopen Ġfun ĠreturnType ( arguments : ĠArguments ?): ĠPsi Type ? Ġ{ ĊĠĠĠ Ġval Ġreturn Types Ġ= Ġapplicable Signatures ( arguments ). map Ġ{ ĊĠĠĠĠĠ Ġit . returnType ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġwhen Ġ( return Types . size ) Ġ{ ĊĠĠĠĠĠĠ 0 Ġ-> Ġnull ĊĠĠĠĠĠĠ 1 Ġ-> Ġreturn Types [ 0 ] ĊĠĠĠĠĠ Ġelse Ġ-> ĠTypes Util . get Least Upper Bound Nullable ( return Types , Ġmy Context . manager ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġapplicable Signatures ( arguments : ĠArguments ?): ĠCollection < Call Signature <* >> Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( arguments Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġsignatures ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġdo Apply To ( arguments ). map Ġ{ ĊĠĠĠĠĠĠĠ Ġit . first ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġapply To ( arguments : ĠArguments ): ĠCollection < Argument Mapping <* >> Ġ{ ĊĠĠĠ Ġreturn Ġdo Apply To ( arguments ). map Ġ{ ĊĠĠĠĠĠ Ġit . second ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġdo Apply To ( arguments : ĠArguments ): ĠCollection < Signature Mapping > Ġ{ ĊĠĠĠ Ġval Ġall Mappings : ĠList < Signature Mapping > Ġ= Ġsignatures . map NotNull Ġ{ ĊĠĠĠĠĠ Ġit . apply To ( arguments , Ġmy Context )?. let Ġ{ Ġmapping Ġ-> ĊĠĠĠĠĠĠĠ ĠSignature Mapping ( it , Ġmapping ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġ( applic able , Ġcan Choose Over load ) Ġ= Ġall Mappings . filter Applicable Ġ{ Ġ(_, Ġmapping ) Ġ-> ĊĠĠĠĠĠ Ġmapping . applic ability () ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( applic able . isEmpty ()) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġall Mappings ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġif Ġ( can Choose Over load ) Ġ{ ĊĠĠĠĠĠ Ġapplicable . minimal Elements ( comparator ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠ Ġapplicable ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ private Ġtype alias ĠSignature Mapping Ġ= ĠPair < Call Signature <* >, ĠArgument Mapping <* >> Ċ Ċ private Ġval Ġcomparator : ĠComparator < Signature Mapping > Ġ= ĠComparator . comp aring ( ĊĠ Ġ{ Ġit . second Ġ}, ĊĠ Ġ{ Ġleft : ĠArgument Mapping <* >, Ġright : ĠArgument Mapping < *> Ġ-> Ġcompare ( left , Ġright ) Ġ} Ċ ) Ċ