/* Ċ Ġ* Ġ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 . code Insight Ċ Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġorg . jetbrains . kotlin . descriptors . Declaration Descriptor Ċ import Ġorg . jetbrains . kotlin . idea . de compiler . navigation . find De compiled Declaration Ċ import Ġorg . jetbrains . kotlin . resolve . Descriptor To Source Utils Ċ import Ġorg . jetbrains . kotlin . utils . addTo Std lib . sequence Of Lazy Values Ċ Ċ object ĠDescriptor To Source Utils Ide Ġ{ ĊĠĠĠ Ġ// ĠReturns ĠP SI Ġelement Ġfor Ġdescriptor . ĠIf Ġthere Ġare Ġmany Ġrelevant Ġelements Ġ( e . g . Ġit Ġis Ġfake Ġoverride ĊĠĠĠ Ġ// Ġwith Ġmultiple Ġdeclarations ), Ġfinds Ġany Ġof Ġthem . ĠIt Ġcan Ġfind Ġdeclarations Ġin Ġbuiltins Ġor Ġde compiled Ġcode . ĊĠĠĠ Ġfun Ġget Any Declaration ( project : ĠProject , Ġdescriptor : ĠDeclaration Descriptor ): ĠPsi Element ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Declarations Stream ( project , Ġdescriptor ). first OrNull () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠReturns Ġall ĠP SI Ġelements Ġfor Ġdescriptor . ĠIt Ġcan Ġfind Ġdeclarations Ġin Ġbuiltins Ġor Ġde compiled Ġcode . ĊĠĠĠ Ġfun ĠgetAll Declarations ( project : ĠProject , Ġtarget Descriptor : ĠDeclaration Descriptor ): ĠCollection < Psi Element > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġget Declarations Stream ( project , Ġtarget Descriptor ). to HashSet () ĊĠĠĠĠĠĠĠ Ġ// Ġfilter Ġout Ġelements Ġwhich Ġare Ġnavigate Ġto Ġsome Ġother Ġelement Ġof Ġthe Ġresult ĊĠĠĠĠĠĠĠ Ġ// Ġthis Ġis Ġneeded Ġto Ġavoid Ġduplicated Ġresults Ġfor Ġreferences Ġto Ġdeclaration Ġin Ġsame Ġlibrary Ġsource Ġfile ĊĠĠĠĠĠĠĠ Ġreturn Ġresult . filter Ġ{ Ġelement Ġ-> Ġresult . none Ġ{ Ġelement Ġ!= Ġit Ġ&& Ġit . navigation Element Ġ== Ġelement Ġ} Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Declarations Stream ( project : ĠProject , Ġtarget Descriptor : ĠDeclaration Descriptor ): ĠSequence < Psi Element > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġeffective Referenced Descriptors Ġ= ĠDescriptor To Source Utils . get Effective Referenced Descriptors ( target Descriptor ). as Sequence () ĊĠĠĠĠĠĠĠ Ġreturn Ġeffective Referenced Descriptors . flatMap Ġ{ Ġeffective Referenced Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠReferences Ġin Ġlibrary Ġsources Ġshould Ġbe Ġresolved Ġto Ġcorresponding Ġde compiled Ġdeclarations , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtherefore Ġwe Ġput Ġboth Ġsource Ġdeclaration Ġand Ġde compiled Ġdeclaration Ġto Ġstream , Ġand Ġafterwards Ġwe Ġfilter Ġit Ġin ĠgetAll Declarations ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsequence Of Lazy Values ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĠDescriptor To Source Utils . getSource From Descriptor ( effective Referenced ) Ġ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġfind De compiled Declaration ( project , Ġeffective Referenced ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}. filter NotNull () ĊĠĠĠ Ġ} Ċ } Ċ