/* Ċ Ġ* Ġ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 . k doc Ċ Ċ import Ġcom . intellij . openapi . util . Text Range Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġorg . jetbrains . kotlin . descriptors .* Ċ import Ġorg . jetbrains . kotlin . idea . cache s . resolve . get Resolution Facade Ċ import Ġorg . jetbrains . kotlin . idea . references . Kt Multi Reference Ċ import Ġorg . jetbrains . kotlin . idea . resolve . Resolution Facade Ċ import Ġorg . jetbrains . kotlin . idea . util . getFile Resolution Scope Ċ import Ġorg . jetbrains . kotlin . k doc . parser . K Doc Known Tag Ċ import Ġorg . jetbrains . kotlin . k doc . psi . impl . K Doc Link Ċ import Ġorg . jetbrains . kotlin . k doc . psi . impl . K Doc Name Ċ import Ġorg . jetbrains . kotlin . k doc . psi . impl . K Doc Tag Ċ import Ġorg . jetbrains . kotlin . psi . Kt File Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . get Strict Parent OfType Ċ import Ġorg . jetbrains . kotlin . resolve . Binding Context Ċ import Ġorg . jetbrains . kotlin . resolve . Function Descriptor Util Ċ import Ġorg . jetbrains . kotlin . resolve . scopes .* Ċ import Ġorg . jetbrains . kotlin . resolve . scopes . utils . collect Descriptors Filtered Ċ import Ġorg . jetbrains . kotlin . resolve . scopes . utils . member Scope As Import ing Scope Ċ import Ġorg . jetbrains . kotlin . resolve . source . Psi Source Element Ċ Ċ public Ġclass ĠK Doc Reference ( element : ĠK Doc Name ): ĠK t Multi Reference < K Doc Name >( element ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġget Target Descriptors ( context : ĠBinding Context ): ĠCollection < Declaration Descriptor > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdeclaration Ġ= Ġget Element (). get Containing Doc (). getOwner () ĊĠĠĠĠĠĠĠ Ġif Ġ( declaration Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġarray ListOf () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdeclaration Descriptor Ġ= Ġcontext [ Binding Context . DECL AR ATION _ TO _ DESCRIPTOR , Ġdeclaration ] ĊĠĠĠĠĠĠĠ Ġif Ġ( declaration Descriptor Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġarray ListOf () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġk doc Link Ġ= Ġget Element (). get Strict Parent OfType < K Doc Link >() !! ĊĠĠĠĠĠĠĠ Ġreturn Ġresolve K Doc Link ( getElement (). get Resolution Facade (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġk doc Link . getTag If Subject (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Element (). get QualifiedName ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Range In Element (): ĠText Range Ġ= Ġget Element (). getName Text Range () ĊĊĠĠĠ Ġoverride Ġfun Ġcan Rename (): ĠBoolean Ġ= Ġtrue ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Element Rename ( new ElementName : ĠString ?): ĠPsi Element ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtext Range Ġ= Ġget Element (). getName Text Range () ĊĠĠĠĠĠĠĠ Ġval Ġnew Text Ġ= Ġtext Range . replace ( getElement (). getText (), Ġnew ElementName !! ) ĊĠĠĠĠĠĠĠ Ġval Ġnew Link Ġ= ĠK Doc Element Factory ( getElement (). getProject ()). create Name FromText ( new Text ) ĊĠĠĠĠĠĠĠ Ġreturn Ġget Element (). replace ( new Link ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Canonical Text (): ĠString Ġ= Ġget Element (). getName Text () Ċ } Ċ Ċ public Ġfun Ġresolve K Doc Link ( resolution Facade : ĠResolution Facade , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Descriptor : ĠDeclaration Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Subject Of Tag : ĠK Doc Tag ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqualified Name : ĠList < String >): ĠCollection < Declaration Descriptor > Ġ{ ĊĠĠĠ Ġif Ġ( from Subject Of Tag ?. known Tag Ġ== ĠK Doc Known Tag . PARAM ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġresolve Param Link ( from Descriptor , Ġqualified Name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠTry Ġto Ġfind Ġa Ġmatching Ġlocal Ġdescriptor Ġ( parameter Ġor Ġtype Ġparameter ) Ġfirst . ĊĠĠĠ Ġif Ġ( qualified Name . size () Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlocal Result Ġ= Ġresolve In Local Scope ( from Descriptor , Ġqualified Name . single (), Ġresolution Facade ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! local Result . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlocal Result ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġresult : ĠCollection < Declaration Descriptor > Ġ= ĠlistOf ( from Descriptor ) ĊĠĠĠ Ġqualified Name . forEach Ġ{ Ġname Component Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġscope Ġ= Ġget Resolution Scope ( resolution Facade , Ġresult . single OrNull () Ġ?: Ġreturn Ġempty List ()) ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġscope . collect Descriptors Filtered ( name Filter Ġ= Ġ{ Ġit . asString () Ġ== Ġname Component }) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ private Ġfun Ġresolve In Local Scope ( from Descriptor : ĠDeclaration Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolution Facade : ĠResolution Facade ): ĠList < Declaration Descriptor > Ġ{ ĊĠĠĠ Ġval Ġscope Ġ= Ġget Resolution Scope ( resolution Facade , Ġfrom Descriptor ) ĊĠĠĠ Ġreturn Ġscope . collect Descriptors Filtered ( name Filter Ġ= Ġ{ Ġit . asString () Ġ== Ġname Ġ}). filter Ġ{ ĊĠĠĠĠĠĠĠ Ġit . containing Declaration Ġ== Ġfrom Descriptor ĊĠĠĠ Ġ} Ċ } Ċ Ċ public Ġfun Ġget Param Descriptors ( from Descriptor : ĠDeclaration Descriptor ): ĠList < Declaration Descriptor > Ġ{ ĊĠĠĠ Ġ// ĠTODO Ġresolve Ġparameters Ġof Ġfunctions Ġpassed Ġas Ġparameters ĊĠĠĠ Ġwhen Ġ( from Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠCallable Descriptor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfrom Descriptor . getValue Parameters () ĊĠĠĠĠĠĠĠ Ġis ĠClass ifier Descriptor Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Params Ġ= Ġfrom Descriptor . getType Constructor (). getParameters () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( from Descriptor Ġis ĠClass Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstructor Descriptor Ġ= Ġfrom Descriptor . getUn subst it uted Primary Constructor () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( constructor Descriptor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtype Params Ġ+ Ġconstructor Descriptor . getValue Parameters () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtype Params ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠlistOf () Ċ } Ċ Ċ private Ġfun Ġresolve Param Link ( from Descriptor : ĠDeclaration Descriptor , Ġqualified Name : ĠList < String >): ĠList < Declaration Descriptor > Ġ{ ĊĠĠĠ Ġval Ġname Ġ= Ġqualified Name . single OrNull () Ġ?: Ġreturn ĠlistOf () ĊĠĠĠ Ġreturn Ġget Param Descriptors ( from Descriptor ). filter Ġ{ Ġit . getName (). asString () Ġ== Ġname Ġ} Ċ } Ċ Ċ private Ġfun Ġget Package Inner Scope ( descriptor : ĠPackage Fragment Descriptor ): ĠMember Scope Ġ{ ĊĠĠĠ Ġreturn Ġdescriptor . get Containing Declaration (). get Package ( descriptor . fq Name ). member Scope Ċ } Ċ Ċ private Ġfun ĠgetClass Inner Scope ( outer Scope : ĠLex ical Scope , Ġdescriptor : ĠClass Descriptor ): ĠLex ical Scope Ġ{ ĊĊĠĠĠ Ġval Ġheader Scope Ġ= ĠLex ical Scope Impl ( outer Scope , Ġdescriptor , Ġfalse , Ġdescriptor . this As Receiver Parameter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Class Ġ${ descriptor . getName ()} Ġheader Ġscope ") Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( type Parameter Ġin Ġdescriptor . getType Constructor (). getParameters ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Classifier Descriptor ( type Parameter ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( constructor Ġin Ġdescriptor . get Construct ors ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Function Descriptor ( constructor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠLex ical Chain ed Scope ( header Scope , Ġdescriptor , Ġfalse , Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Class Ġ${ descriptor . getName ()} Ġscope ", Ġdescriptor . getDefault Type (). get Member Scope ()) Ċ } Ċ Ċ public Ġfun Ġget Resolution Scope ( resolution Facade : ĠResolution Facade , Ġdescriptor : ĠDeclaration Descriptor ): ĠLex ical Scope Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( descriptor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠPackage Fragment Descriptor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLex ical Scope . empty ( get Package Inner Scope ( descriptor ). member Scope As Import ing Scope (), Ġdescriptor ) ĊĊĠĠĠĠĠĠĠ Ġis ĠPackage View Descriptor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLex ical Scope . empty ( descriptor . member Scope . member Scope As Import ing Scope (), Ġdescriptor ) ĊĊĠĠĠĠĠĠĠ Ġis ĠClass Descriptor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetClass Inner Scope ( get Outer Scope ( descriptor , Ġresolution Facade ), Ġdescriptor ) ĊĊĠĠĠĠĠĠĠ Ġis ĠFunction Descriptor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFunction Descriptor Util . get Function Inner Scope ( get Outer Scope ( descriptor , Ġresolution Facade ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor , ĠRe declaration Handler . DO _ NOTH ING ) ĊĊĠĠĠĠĠĠĠ Ġis ĠProperty Descriptor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJet Scope Utils . getProperty Declaration Inner Scope ( descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Outer Scope ( descriptor , Ġresolution Facade ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRe declaration Handler . DO _ NOTH ING ) ĊĊĠĠĠĠĠĠĠ Ġis ĠDeclaration Descriptor Non Root Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Outer Scope ( descriptor , Ġresolution Facade ) ĊĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Cannot Ġfind Ġresolution Ġscope Ġfor Ġroot Ġ$ descriptor ") ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġget Outer Scope ( descriptor : ĠDeclaration Descriptor With Source , Ġresolution Facade : ĠResolution Facade ): ĠLex ical Scope Ġ{ ĊĠĠĠ Ġval Ġparent Ġ= Ġdescriptor . get Containing Declaration () ĊĠĠĠ Ġif Ġ( parent Ġis ĠPackage Fragment Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontaining File Ġ= Ġ( descriptor . getSource () Ġas ? ĠPsi Source Element )?. psi ?. get Containing File () Ġas ? ĠK t File ĊĠĠĠĠĠĠĠ Ġif Ġ( containing File Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresolution Facade . getFile Resolution Scope ( containing File ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġget Resolution Scope ( resolution Facade , Ġparent !! ) Ċ } Ċ