/* Ċ Ġ* Ġ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 . resolve . lazy Ċ Ċ import Ġcom . google . common . collect . ImmutableList Multimap Ċ import Ġcom . google . common . collect . List Multimap Ċ import Ġorg . jetbrains . kotlin . descriptors .* Ċ import Ġorg . jetbrains . kotlin . diagnostics . Errors Ċ import Ġorg . jetbrains . kotlin . name . Name Ċ import Ġorg . jetbrains . kotlin . psi . Jet Import Directive Ċ import Ġorg . jetbrains . kotlin . psi . Jet Psi Util Ċ import Ġorg . jetbrains . kotlin . resolve . Binding Trace Ċ import Ġorg . jetbrains . kotlin . resolve . Platform Types Mapped To Kotlin Checker Ċ import Ġorg . jetbrains . kotlin . resolve . Qualified Expression Resolver Ċ import Ġorg . jetbrains . kotlin . resolve . Qualified Expression Resolver . Lookup Mode Ċ import Ġorg . jetbrains . kotlin . resolve . scopes . Descriptor Kind Filter Ċ import Ġorg . jetbrains . kotlin . resolve . scopes . Jet Scope Ċ import Ġorg . jetbrains . kotlin . resolve . scopes . Usage Location Ċ import Ġorg . jetbrains . kotlin . resolve . scopes . re ceiv ers . Receiver Value Ċ import Ġorg . jetbrains . kotlin . storage . Storage Manager Ċ import Ġorg . jetbrains . kotlin . types . Jet Type Ċ import Ġorg . jetbrains . kotlin . util . collection Utils . concat Ċ import Ġorg . jetbrains . kotlin . utils . Printer Ċ import Ġjava . util . Linked HashSet Ċ Ċ interface ĠIndexed Imports Ġ{ ĊĠĠĠ Ġval Ġimports : ĠList < Jet Import Directive > ĊĠĠĠ Ġfun Ġimports For Name ( name : ĠName ): ĠCollection < Jet Import Directive > Ċ } Ċ Ċ class ĠAll Under Imports Indexed ( all Imports : ĠCollection < Jet Import Directive >) Ġ: ĠIndexed Imports Ġ{ ĊĠĠĠ Ġoverride Ġval Ġimports Ġ= Ġall Imports . filter Ġ{ Ġit . is All Under () Ġ} ĊĠĠĠ Ġoverride Ġfun Ġimports For Name ( name : ĠName ) Ġ= Ġimports Ċ } Ċ Ċ class ĠAlias Imports Indexed ( all Imports : ĠCollection < Jet Import Directive >) Ġ: ĠIndexed Imports Ġ{ ĊĠĠĠ Ġoverride Ġval Ġimports Ġ= Ġall Imports . filter Ġ{ Ġ! it . is All Under () Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġname To Directives : ĠList Multimap < Name , ĠJet Import Directive > Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠImmutableList Multimap . builder < Name , ĠJet Import Directive >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( directive Ġin Ġimports ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġdirective . get Import Path () Ġ?: Ġcontinue Ġ// Ġparse Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimported Name Ġ= Ġpath . get Imported Name () Ġ?: Ġcontinue Ġ// Ġparse Ġerror ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . put ( imported Name , Ġdirective ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġbuilder . build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġimports For Name ( name : ĠName ) Ġ= Ġname To Directives . get ( name ) Ċ } Ċ Ċ class ĠLazy Import Resolver ( ĊĠĠĠĠĠĠĠ Ġval Ġstorage Manager : ĠStorage Manager , ĊĠĠĠĠĠĠĠ Ġval Ġqualified Expression Resolver : ĠQual ified Expression Resolver , ĊĠĠĠĠĠĠĠ Ġval Ġfile Scope Provider : ĠFile Scope Provider , ĊĠĠĠĠĠĠĠ Ġval Ġmodule Descriptor : ĠModule Descriptor , ĊĠĠĠĠĠĠĠ Ġval Ġindexed Imports : ĠIndexed Imports , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtrace For Import Resolve : ĠBinding Trace Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġimported Scopes Provider Ġ= Ġstorage Manager . create Memo ized Function Ġ{ ĊĠĠĠĠĠĠĠ Ġdirective : ĠJet Import Directive Ġ-> ĠImport Directive Resolve Cache ( directive ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġdirective Under Resolve : ĠJet Import Directive ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġclass ĠImport Resolve Status ( val Ġlookup Mode : ĠLookup Mode , Ġval Ġscope : ĠJet Scope , Ġval Ġdescriptors : ĠCollection < Declaration Descriptor >) ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠImport Directive Resolve Cache ( private Ġval Ġdirective : ĠJet Import Directive ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvolatile Ġvar Ġimport Resolve Status : ĠImport Resolve Status ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġfun Ġscope For Mode ( mode : ĠLookup Mode ): ĠJet Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= Ġimport Resolve Status ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( status Ġ!= Ġnull Ġ&& Ġ( status . lookup Mode Ġ== Ġmode Ġ|| Ġstatus . lookup Mode Ġ== ĠLookup Mode . E VERY TH ING )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstatus . scope ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstorage Manager . compute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcached Status Ġ= Ġimport Resolve Status ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cached Status Ġ!= Ġnull Ġ&& Ġ( cached Status . lookup Mode Ġ== Ġmode Ġ|| Ġcached Status . lookup Mode Ġ== ĠLookup Mode . E VERY TH ING )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcached Status . scope ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirective Under Resolve Ġ= Ġdirective ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdirective Import Scope Ġ= Ġqualified Expression Resolver . process Import Reference ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirective , Ġmodule Descriptor , Ġtrace For Import Resolve , Ġmode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptors Ġ= Ġif Ġ( directive . is All Under ()) Ġempty List () Ġelse Ġdirective Import Scope . getAll Descriptors () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mode Ġ== ĠLookup Mode . E VERY TH ING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlatform Types Mapped To Kotlin Checker . check Platform Types Mapped To Kotlin ( module Descriptor , Ġtrace For Import Resolve , Ġdirective , Ġdescriptors ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimport Resolve Status Ġ= ĠImport Resolve Status ( mode , Ġdirective Import Scope , Ġdescriptors ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirective Import Scope ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirective Under Resolve Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġforce Resolve All Contents () Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( import Directive Ġin Ġindexed Imports . imports ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġforce Resolve Import Directive ( import Directive ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġforce Resolve Import Directive ( import Directive : ĠJet Import Directive ) Ġ{ ĊĠĠĠĠĠĠĠ Ġget Import Scope ( import Directive , ĠLookup Mode . E VERY TH ING ) ĊĊĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= Ġimported Scopes Provider ( import Directive ). import Resolve Status ĊĠĠĠĠĠĠĠ Ġif Ġ( status Ġ!= Ġnull Ġ&& Ġ! status . descriptors . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Scope Ġ= Ġfile Scope Provider . getFile Scope ( import Directive . get Containing Jet File ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreport Conflict ing Import ( import Directive , Ġfile Scope , Ġstatus . descriptors , Ġtrace For Import Resolve ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreport Conflict ing Import ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Directive : ĠJet Import Directive , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Scope : ĠJet Scope , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolved To : ĠCollection < Declaration Descriptor > ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrace : ĠBinding Trace ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġimported Reference Ġ= Ġimport Directive . get Imported Reference () ĊĠĠĠĠĠĠĠ Ġif Ġ( imported Reference Ġ== Ġnull Ġ|| Ġresolved To Ġ== Ġnull ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġalias Name Ġ= ĠJet Psi Util . get Alias Name ( import Directive ) Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġif Ġ( resolved To . size () Ġ!= Ġ 1 ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( resolved To . single ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠClass Descriptor Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Scope . getClass ifier ( alias Name ) Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrace . report ( Errors . CONF LI CT ING _ IMPORT . on ( imported Reference , Ġalias Name . asString ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPackage View Descriptor Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Scope . get Package ( alias Name ) Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrace . report ( Errors . CONF LI CT ING _ IMPORT . on ( imported Reference , Ġalias Name . asString ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġpublic Ġfun Ġ< D Ġ: ĠDeclaration Descriptor > Ġselect Single From Imports ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname : ĠName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlookup Mode : ĠLookup Mode , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor Selector : Ġ( Jet Scope , ĠName ) Ġ-> ĠD ? ĊĠĠĠ Ġ): ĠD ? Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġcompute (): ĠD ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimports Ġ= Ġindexed Imports . imports For Name ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( imports . contains ( directive Under Resolve )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġthe Ġrecursion Ġin Ġimports Ġanalysis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtarget : ĠD ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( directive Ġin Ġimports ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresolved Ġ= Ġdescriptor Selector ( get Import Scope ( directive , Ġlookup Mode ), Ġname ) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( target Ġ!= Ġnull Ġ&& Ġtarget Ġ!= Ġresolved ) Ġreturn Ġnull Ġ// Ġamb iguity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Ġ= Ġresolved ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtarget ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġstorage Manager . compute (:: compute ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġ< D Ġ: ĠDeclaration Descriptor > Ġcollect From Imports ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname : ĠName , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlookup Mode : ĠLookup Mode , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptors Selector : Ġ( Jet Scope , ĠName ) Ġ-> ĠCollection < D > ĊĠĠĠ Ġ): ĠCollection < D > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstorage Manager . compute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdescriptors : ĠCollection < D >? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( directive Ġin Ġindexed Imports . imports For Name ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( directive Ġ== Ġdirective Under Resolve ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġthe Ġrecursion Ġin Ġimports Ġanalysis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Recursion Ġwhile Ġresolving Ġmany Ġimports : Ġ" Ġ+ Ġdirective . getText ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptors For Import Ġ= Ġdescriptors Selector ( get Import Scope ( directive , Ġlookup Mode ), Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptors Ġ= Ġdescriptors . concat ( descriptors For Import ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptors Ġ?: Ġempty Set < D >() ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġget Import Scope ( directive : ĠJet Import Directive , Ġlookup Mode : ĠLookup Mode ): ĠJet Scope Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġimported Scopes Provider ( directive ). scope For Mode ( lookup Mode ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠLazy Import Scope ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcontaining Declaration : ĠDeclaration Descriptor , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġimport Resolver : ĠLazy Import Resolver , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġfiltering Kind : ĠLazy Import Scope . Filtering Kind , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdebug Name : ĠString Ċ ) Ġ: ĠJet Scope Ġ{ ĊĊĠĠĠ Ġenum Ġclass ĠFiltering Kind Ġ{ ĊĠĠĠĠĠĠĠ ĠALL , ĊĠĠĠĠĠĠĠ ĠVIS IBLE _ CLASSES , ĊĠĠĠĠĠĠĠ ĠIN VISIBLE _ CLASSES ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis Class Visible ( descriptor : ĠClass Descriptor ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( filtering Kind Ġ== ĠFiltering Kind . ALL ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġvisibility Ġ= Ġdescriptor . get Visibility () ĊĠĠĠĠĠĠĠ Ġval Ġinclude Visible Ġ= Ġfiltering Kind Ġ== ĠFiltering Kind . VISIBLE _ CLASSES ĊĠĠĠĠĠĠĠ Ġif Ġ(! visibility . must Check In Imports ()) Ġreturn Ġinclude Visible ĊĠĠĠĠĠĠĠ Ġreturn ĠVis ibilities . isVisible ( Receiver Value . IR RE LE V ANT _ RECE IVER , Ġdescriptor , Ġimport Resolver . module Descriptor ) Ġ== Ġinclude Visible ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Classifier ( name : ĠName , Ġlocation : ĠUsage Location ): ĠClass ifier Descriptor ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġimport Resolver . select Single From Imports ( name , ĠLookup Mode . ONLY _ CLASSES _ AND _ PACK AGES ) Ġ{ Ġscope , Ġname Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġscope . getClass ifier ( name , Ġlocation ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( descriptor Ġ!= Ġnull Ġ&& Ġis Class Visible ( descriptor Ġas ĠClass Descriptor /* no Ġtype Ġparameter Ġcan Ġbe Ġimported */ )) Ġdescriptor Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Package ( name : ĠName ): ĠPackage View Descriptor ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( filtering Kind Ġ== ĠFiltering Kind . IN VISIBLE _ CLASSES ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġimport Resolver . select Single From Imports ( name , ĠLookup Mode . ONLY _ CLASSES _ AND _ PACK AGES ) Ġ{ Ġscope , Ġname Ġ-> Ġscope . get Package ( name ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Properties ( name : ĠName , Ġlocation : ĠUsage Location ): ĠCollection < Variable Descriptor > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( filtering Kind Ġ== ĠFiltering Kind . IN VISIBLE _ CLASSES ) Ġreturn ĠlistOf () ĊĠĠĠĠĠĠĠ Ġreturn Ġimport Resolver . collect From Imports ( name , ĠLookup Mode . E VERY TH ING ) Ġ{ Ġscope , Ġname Ġ-> Ġscope . getProperties ( name , Ġlocation ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Local Variable ( name : ĠName ) Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġget Functions ( name : ĠName , Ġlocation : ĠUsage Location ): ĠCollection < Function Descriptor > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( filtering Kind Ġ== ĠFiltering Kind . IN VISIBLE _ CLASSES ) Ġreturn ĠlistOf () ĊĠĠĠĠĠĠĠ Ġreturn Ġimport Resolver . collect From Imports ( name , ĠLookup Mode . E VERY TH ING ) Ġ{ Ġscope , Ġname Ġ-> Ġscope . get Functions ( name , Ġlocation ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Synt hetic Extension Properties ( receiver Types : ĠCollection < Jet Type >, Ġname : ĠName ): ĠCollection < Property Descriptor > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( filtering Kind Ġ== ĠFiltering Kind . IN VISIBLE _ CLASSES ) Ġreturn ĠlistOf () ĊĠĠĠĠĠĠĠ Ġreturn Ġimport Resolver . collect From Imports ( name , ĠLookup Mode . E VERY TH ING ) Ġ{ Ġscope , Ġname Ġ-> Ġscope . getS ynt hetic Extension Properties ( receiver Types , Ġname ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Synt hetic Extension Properties ( receiver Types : ĠCollection < Jet Type >): ĠCollection < Property Descriptor > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġwe Ġdo Ġnot Ġperform Ġany Ġfiltering Ġby Ġvisibility Ġhere Ġbecause Ġall Ġdescriptors Ġfrom Ġboth Ġvisible / invisible Ġfilter Ġscopes Ġare Ġto Ġbe Ġadded Ġanyway ĊĠĠĠĠĠĠĠ Ġif Ġ( filtering Kind Ġ== ĠFiltering Kind . IN VISIBLE _ CLASSES ) Ġreturn ĠlistOf () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġimport Resolver . storage Manager . compute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimport Resolver . indexed Imports . imports . flatMap To ( Linked HashSet < Property Descriptor >()) Ġ{ Ġimport Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimport Resolver . get Import Scope ( import , ĠLookup Mode . E VERY TH ING ). getS ynt hetic Extension Properties ( receiver Types ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Declarations By Label ( label Name : ĠName ): ĠCollection < Declaration Descriptor > Ġ= ĠlistOf () ĊĊĠĠĠ Ġoverride Ġfun Ġget Descriptors ( kind Filter : ĠDescriptor Kind Filter , Ġname Filter : Ġ( Name ) Ġ-> ĠBoolean ): ĠCollection < Declaration Descriptor > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġwe Ġdo Ġnot Ġperform Ġany Ġfiltering Ġby Ġvisibility Ġhere Ġbecause Ġall Ġdescriptors Ġfrom Ġboth Ġvisible / invisible Ġfilter Ġscopes Ġare Ġto Ġbe Ġadded Ġanyway ĊĠĠĠĠĠĠĠ Ġif Ġ( filtering Kind Ġ== ĠFiltering Kind . IN VISIBLE _ CLASSES ) Ġreturn ĠlistOf () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġimport Resolver . storage Manager . compute Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptors Ġ= ĠLinked HashSet < Declaration Descriptor >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( directive Ġin Ġimport Resolver . indexed Imports . imports ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimport Path Ġ= Ġdirective . get Import Path () Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimported Name Ġ= Ġimport Path . get Imported Name () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( imported Name Ġ== Ġnull Ġ|| Ġname Filter ( imported Name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptors . addAll ( import Resolver . get Import Scope ( directive , ĠLookup Mode . E VERY TH ING ). get Descriptors ( kind Filter , Ġname Filter )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptors ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Implicit Re ceiv ers Hierarchy () Ġ= ĠlistOf < Receiver Parameter Descriptor >() ĊĊĠĠĠ Ġoverride Ġfun Ġget Own Declared Descriptors () Ġ= ĠlistOf < Declaration Descriptor >() ĊĊĠĠĠ Ġoverride Ġfun Ġget Containing Declaration () Ġ= Ġcontaining Declaration ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ" Lazy Import Scope : Ġ" Ġ+ Ġdebug Name ĊĊĠĠĠ Ġoverride Ġfun Ġprint Scope Structure ( p : ĠPrinter ) Ġ{ ĊĠĠĠĠĠĠĠ Ġp . println ( java Class . getSimpleName (), Ġ": Ġ", Ġdebug Name , Ġ" Ġ{ ") ĊĠĠĠĠĠĠĠ Ġp . push Indent () ĊĊĠĠĠĠĠĠĠ Ġp . println (" containing Declaration Ġ= Ġ", Ġcontaining Declaration ) ĊĊĠĠĠĠĠĠĠ Ġp . pop Indent () ĊĠĠĠĠĠĠĠ Ġp . println (" }") ĊĠĠĠ Ġ} Ċ } Ċ