/* Ċ Ġ* Ġ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 . scopes Ċ Ċ import Ġcom . intellij . util . Smart List Ċ import Ġorg . jetbrains . kotlin . descriptors .* Ċ import Ġorg . jetbrains . kotlin . incremental . components . Lookup Location Ċ import Ġorg . jetbrains . kotlin . name . Name Ċ import Ġorg . jetbrains . kotlin . resolve . scopes . utils . take Snapshot Ċ import Ġorg . jetbrains . kotlin . utils . Printer Ċ Ċ class ĠLex ical Writable Scope ( ĊĠĠĠĠĠĠĠ Ġparent : ĠLex ical Scope , ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġowner Descriptor : ĠDeclaration Descriptor , ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġis Owner Descriptor Accessible By Label : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġimplicit Receiver : ĠReceiver Parameter Descriptor ?, ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġre declaration Handler : ĠRe declaration Handler , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdebug Name : ĠString Ċ ) Ġ: ĠLex ical Scope , ĠWrit able Scope Storage Ġ{ ĊĠĠĠ Ġoverride Ġval Ġparent Ġ= Ġparent . take Snapshot () ĊĠĠĠ Ġoverride Ġval Ġadded Descriptors : ĠMutable List < Declaration Descriptor > Ġ= ĠSmart List () ĊĊĠĠĠ Ġoverride Ġvar Ġfunctions ByName : ĠMutable Map < Name , ĠWrit able Scope Storage . Int List >? Ġ= Ġnull ĊĠĠĠ Ġoverride Ġvar Ġvariables And Class ifiers ByName : ĠMutable Map < Name , ĠWrit able Scope Storage . Int List >? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġvar Ġlock Level : ĠWrit able Scope . Lock Level Ġ= ĠWrit able Scope . Lock Level . WR IT ING ĊĠĠĠ Ġprivate Ġvar Ġlast Snapshot : ĠSnapshot ? Ġ= Ġnull ĊĊĠĠĠ Ġpublic Ġfun Ġchange Lock Level ( lock Level : ĠWrit able Scope . Lock Level ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( lock Level . ordinal () Ġ< Ġthis . lock Level . ordinal ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" cannot Ġlower Ġlock Ġlevel Ġfrom Ġ" Ġ+ Ġthis . lock Level Ġ+ Ġ" Ġto Ġ" Ġ+ Ġlock Level Ġ+ Ġ" Ġat Ġ" Ġ+ ĠtoString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . lock Level Ġ= Ġlock Level ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġtake Snapshot (): ĠLex ical Scope Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck May Read () ĊĠĠĠĠĠĠĠ Ġif Ġ( last Snapshot Ġ== Ġnull Ġ|| Ġlast Snapshot !!. descriptor Limit Ġ!= Ġadded Descriptors . size ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Snapshot Ġ= ĠSnapshot ( added Descriptors . size ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġlast Snapshot !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġadd Variable Descriptor ( variable Descriptor : ĠVariable Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck May Write () ĊĠĠĠĠĠĠĠ Ġadd Variable Or Class Descriptor ( variable Descriptor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġoverride Ġfun Ġadd Function Descriptor ( function Descriptor : ĠFunction Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck May Write () ĊĠĠĠĠĠĠĠ Ġsuper < Writable Scope Storage >. addFunction Descriptor ( function Descriptor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġadd Classifier Descriptor ( classifier Descriptor : ĠClass ifier Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck May Write () ĊĠĠĠĠĠĠĠ Ġadd Variable Or Class Descriptor ( classifier Descriptor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Cont ributed Descriptors ( kind Filter : ĠDescriptor Kind Filter , Ġname Filter : Ġ( Name ) Ġ-> ĠBoolean ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġcheck May Read (). added Descriptors ĊĊĠĠĠ Ġoverride Ġfun Ġget Cont ributed Classifier ( name : ĠName , Ġlocation : ĠLookup Location ) Ġ= Ġcheck May Read (). getDeclared Classifier ( name ) ĊĊĠĠĠ Ġoverride Ġfun Ġget Cont ributed Variables ( name : ĠName , Ġlocation : ĠLookup Location ) Ġ= Ġcheck May Read (). getDeclared Variables ( name ) ĊĊĠĠĠ Ġoverride Ġfun Ġget Cont ributed Functions ( name : ĠName , Ġlocation : ĠLookup Location ) Ġ= Ġcheck May Read (). getDeclared Functions ( name ) ĊĊĠĠĠ Ġprivate Ġfun Ġcheck May Read (): ĠLex ical Writable Scope Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( lock Level Ġ!= ĠWrit able Scope . Lock Level . READ ING Ġ&& Ġlock Level Ġ!= ĠWrit able Scope . Lock Level . BOTH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" cannot Ġread Ġwith Ġlock Ġlevel Ġ" Ġ+ Ġlock Level Ġ+ Ġ" Ġat Ġ" Ġ+ ĠtoString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck May Write () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( lock Level Ġ!= ĠWrit able Scope . Lock Level . WR IT ING Ġ&& Ġlock Level Ġ!= ĠWrit able Scope . Lock Level . BOTH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" cannot Ġwrite Ġwith Ġlock Ġlevel Ġ" Ġ+ Ġlock Level Ġ+ Ġ" Ġat Ġ" Ġ+ ĠtoString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠSnapshot ( val Ġdescriptor Limit : ĠInt ) Ġ: ĠLex ical Scope Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġparent : ĠLex ical Scope ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis @ Lex ical Writable Scope . parent ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġowner Descriptor : ĠDeclaration Descriptor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis @ Lex ical Writable Scope . owner Descriptor ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġis Owner Descriptor Accessible By Label : ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis @ Lex ical Writable Scope . is Owner Descriptor Accessible By Label ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġimplicit Receiver : ĠReceiver Parameter Descriptor ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġthis @ Lex ical Writable Scope . implicit Receiver ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Cont ributed Descriptors ( kind Filter : ĠDescriptor Kind Filter , Ġname Filter : Ġ( Name ) Ġ-> ĠBoolean ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġthis @ Lex ical Writable Scope . added Descriptors . sub List ( 0 , Ġdescriptor Limit ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Cont ributed Classifier ( name : ĠName , Ġlocation : ĠLookup Location ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġthis @ Lex ical Writable Scope . getDeclared Classifier ( name , Ġdescriptor Limit ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Cont ributed Variables ( name : ĠName , Ġlocation : ĠLookup Location ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġthis @ Lex ical Writable Scope . getDeclared Variables ( name , Ġdescriptor Limit ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Cont ributed Functions ( name : ĠName , Ġlocation : ĠLookup Location ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ= Ġthis @ Lex ical Writable Scope . getDeclared Functions ( name , Ġdescriptor Limit ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" Snapshot ($ descriptor Limit ) Ġfor Ġ$ debug Name " ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġprint Structure ( p : ĠPrinter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp . println (" Snapshot Ġwith Ġdescriptor Limit Ġ= Ġ$ descriptor Limit Ġfor Ġscope :") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Lex ical Writable Scope . print Structure ( p ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġdebug Name ĊĊĠĠĠ Ġoverride Ġfun Ġprint Structure ( p : ĠPrinter ) Ġ{ ĊĠĠĠĠĠĠĠ Ġp . println ( java Class . simple Name , Ġ": Ġ", Ġdebug Name , Ġ"; Ġfor Ġdescriptor : Ġ", Ġowner Descriptor . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġwith Ġimplicit Receiver : Ġ", Ġimplicit Receiver ?. value Ġ?: Ġ" NONE ", Ġ" Ġ{ ") ĊĠĠĠĠĠĠĠ Ġp . push Indent () ĊĊĠĠĠĠĠĠĠ Ġp . print (" parent Ġ= Ġ") ĊĠĠĠĠĠĠĠ Ġparent . print Structure ( p . with hold Indent Once ()) ĊĊĠĠĠĠĠĠĠ Ġp . pop Indent () ĊĠĠĠĠĠĠĠ Ġp . println (" }") ĊĠĠĠ Ġ} Ċ }