/* Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠMIT Ġlicense Ġthat Ġcan Ġbe Ċ Ġ* Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . rust . lang . core . macros Ċ Ċ import Ġcom . intellij . openapi . application . Application Manager Ċ import Ġcom . intellij . openapi . application . Write Action Ċ import Ġcom . intellij . openapi . application . run Read Action Ċ import Ġcom . intellij . openapi . file Editor . File Document Manager Ċ import Ġcom . intellij . openapi . progress . Progress Manager Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . util . Key Ċ import Ġcom . intellij . openapi . util . Modification Tracker Ċ import Ġcom . intellij . openapi . util . Simple Modification Tracker Ċ import Ġcom . intellij . openapi . vfs . Virtual File Ċ import Ġcom . intellij . openapi . vfs . Virtual FileManager Ċ import Ġcom . intellij . openapi . vfs . new vfs . File Attribute Ċ import Ġcom . intellij . psi . Psi Anchor Ċ import Ġcom . intellij . psi . Psi Document Manager Ċ import Ġcom . intellij . psi . Stub Based Psi Element Ċ import Ġcom . intellij . psi . impl . source . Stub bed Sp ine Ċ import Ġcom . intellij . util . io . IO Util Ċ import Ġg nu . tro ve . T Int Object HashMap Ċ import Ġorg . rust . cargo . project . workspace . Package Origin Ċ import Ġorg . rust . lang . Rs FileType Ċ import Ġorg . rust . lang . core . macros . Macro Expansion ManagerImpl . Test marks Ċ import Ġorg . rust . lang . core . macros . decl . Decl Macro Expand er Ċ import Ġorg . rust . lang . core . macros . errors . EM I Get Expansion Error Ċ import Ġorg . rust . lang . core . macros . errors . Expansion Pipeline Error Ċ import Ġorg . rust . lang . core . macros . errors . read Expansion Pipeline Error Ċ import Ġorg . rust . lang . core . macros . errors . write Expansion Pipeline Error Ċ import Ġorg . rust . lang . core . macros . proc . Proc Macro Expand er Ċ import Ġorg . rust . lang . core . psi . Rs File Ċ import Ġorg . rust . lang . core . psi . Rs Macro Call Ċ import Ġorg . rust . lang . core . psi . ext .* Ċ import Ġorg . rust . lang . core . psi . should Index File Ċ import Ġorg . rust . lang . core . resolve . DEFAULT _ REC UR SION _ LIMIT Ċ import Ġorg . rust . lang . core . stubs . Rs File Stub Ċ import Ġorg . rust . openapi ext .* Ċ import Ġorg . rust . st dex t .* Ċ import Ġorg . rust . st dex t . Rs Result . Err Ċ import Ġorg . rust . st dex t . Rs Result . Ok Ċ import Ġjava . io .* Ċ import Ġjava . lang . ref . Weak Reference Ċ import Ġjava . util . concurrent . locks . Re entrant Lock Ċ import Ġkotlin . concurrent . with Lock Ċ Ċ class ĠEx pan ded Macro Storage ( val Ġproject : ĠProject ) Ġ{ ĊĠĠĠ Ġ// ĠData Ġstructures Ġare Ġgu arded Ġby Ġthe Ġplatform ĠRW Lock ĊĠĠĠ Ġprivate Ġval Ġsource Files : ĠT Int Object HashMap < SourceFile > Ġ= ĠT Int Object HashMap () ĊĠĠĠ Ġprivate Ġval Ġexpanded File To Info : ĠT Int Object HashMap < Expanded Macro Info Impl > Ġ= ĠT Int Object HashMap () ĊĠĠĠ Ġprivate Ġval Ġste pped : ĠArray < Mutable List < SourceFile > ?> Ġ= ĠarrayOf Null s ( DEFAULT _ REC UR SION _ LIMIT ) ĊĠĠĠ Ġprivate Ġval Ġ_ modification Tracker : ĠSimple Modification Tracker Ġ= ĠSimple Modification Tracker () ĊĊĠĠĠ Ġval ĠisEmpty : ĠBoolean Ġget () Ġ= Ġsource Files . isEmpty ĊĠĠĠ Ġval Ġmodification Tracker : ĠMod ification Tracker Ġget () Ġ= Ġ_ modification Tracker ĊĊĠĠĠ Ġfun Ġdeserialize ( s fs : ĠList < SourceFile >) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( sf Ġin Ġs fs ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Files . put ( sf . file Id , Ġsf ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Or Put St aged List ( sf . depth Not Sync ). add ( sf ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsf . forEach Info Not Sync Ġ{ Ġif Ġ( it . file Id Ġ> Ġ 0 ) Ġexpanded File To Info . put ( it . file Id , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġclear () Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Write Access Allowed () ĊĠĠĠĠĠĠĠ Ġ_ modification Tracker . inc Modification Count () ĊĠĠĠĠĠĠĠ Ġsource Files . clear () ĊĠĠĠĠĠĠĠ Ġexpanded File To Info . clear () ĊĠĠĠĠĠĠĠ Ġste pped . fill ( null ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġprocess Expanded Macro Infos ( action : Ġ( Expanded Macro Info ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Read Access Allowed () ĊĠĠĠĠĠĠĠ Ġexpanded File To Info . forEach Value Ġ{ Ġaction ( it ); Ġtrue Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Or Put St aged List ( sf : ĠSource File ): ĠMutable List < SourceFile > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Or Put St aged List ( sf . depth ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Or Put St aged List ( step : ĠInt ): ĠMutable List < SourceFile > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġlist Ġ= Ġste pped [ step ] ĊĠĠĠĠĠĠĠ Ġif Ġ( list Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlist Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġste pped [ step ] Ġ= Ġlist ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġlist ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmake Expansion Task ( map : ĠMap < Virtual File , ĠList < Rs Possible Macro Call >> ): ĠSequence < List < Extract able >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġv 2 Ġ= ĠWrite Action . compute And Wait < Mutable Map < SourceFile , ĠList < Rs Possible Macro Call >>, ĠThrowable > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap . map Keys To ( hash Map Of ()) Ġ{ Ġ( file , Ġ_) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget OrCreate SourceFile ( file ) Ġ?: Ġerror (" Non - root Ġsource Ġfiles Ġare Ġnot Ġsupported ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġrun Read Action Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmake Validation Task ( false , Ġv 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmake Validation Task ( ĊĠĠĠĠĠĠĠ Ġworkspace Only : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġmap : ĠMutable Map < SourceFile , ĠList < Rs Possible Macro Call >> Ġ= Ġmutable Map Of () ĊĠĠĠ Ġ): ĠSequence < List < Extract able >> Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Read Access Allowed () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġste pped . as Sequence (). with Index (). map Ġ{ Ġ( i , Ġstep ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRelease Ġmemory . Ġ[ map ] Ġcontains Ġpref etched Ġcalls Ġonly Ġfor Ġthe Ġfirst Ġstep , Ġso Ġclear Ġit Ġon Ġthe Ġsecond Ġstep ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġ 1 ) Ġmap . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstep ?. map Ġ{ Ġsf Ġ-> ĠExtract able ( sf , Ġworkspace Only , Ġmap [ sf ]) Ġ}. or Empty () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmove Source Files To Step ( files : ĠCollection < SourceFile >, Ġstep : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Write Access Allowed () ĊĠĠĠĠĠĠĠ Ġval Ġgrouped By Step Ġ= Ġfiles . groupBy Ġ{ Ġit . depth Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ(( current Step , Ġgroup ) Ġin Ġgrouped By Step ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġste pped [ current Step ]?. removeAll ( group . to HashSet ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgroup . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . depth Ġ= Ġstep ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Or Put St aged List ( step ). addAll ( group ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd Expanded Macro ( ĊĠĠĠĠĠĠĠ Ġold Info : ĠEx pan ded Macro Info , ĊĠĠĠĠĠĠĠ Ġcall Hash : ĠHash Code ?, ĊĠĠĠĠĠĠĠ Ġdef Hash : ĠHash Code ?, ĊĠĠĠĠĠĠĠ Ġresult : ĠRs Result < Stage 3 Ok < Virtual File >, ĠExp ansion Pipeline Error > ĊĠĠĠ Ġ): ĠEx pan ded Macro Info Impl Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Write Access Allowed () ĊĠĠĠĠĠĠĠ Ġ_ modification Tracker . inc Modification Count () ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" NAME _ SH ADO WING ") ĊĠĠĠĠĠĠĠ Ġval Ġold Info Ġ= Ġold Info Ġas ĠEx pan ded Macro Info Impl ĊĊĠĠĠĠĠĠĠ Ġval Ġsource File Ġ= Ġold Info . source File ĊĠĠĠĠĠĠĠ Ġval Ġnew Info Ġ= ĠEx pan ded Macro Info Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource File , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . ok ()?. expansion File , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdef Hash , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall Hash , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . err (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . ok ()?. expansion Bytes Hash Ġ?: Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Info . macro Call Stub Index , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Info . macro Call Strong Ref ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġsource File . replace Info ( old Info , Ġnew Info ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( old Info . expansion Result Ġ!= Ġnew Info . expansion Result Ġ&& Ġold Info . file Id Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpanded File To Info . remove ( old Info . file Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( new Info . file Id Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpanded File To Info . put ( new Info . file Id , Ġnew Info ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( result Ġis ĠOk ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget OrCreate SourceFile ( result . ok . expansion File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . ok . expansion File . write Range Map ( result . ok . ranges ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . ok . expansion File . write Mix Hash ( result . ok . mix Hash ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnew Info ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Invalid Info ( old Info : ĠEx pan ded Macro Info , Ġclean : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Write Access Allowed () ĊĠĠĠĠĠĠĠ Ġ_ modification Tracker . inc Modification Count () ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" NAME _ SH ADO WING ") ĊĠĠĠĠĠĠĠ Ġval Ġold Info Ġ= Ġold Info Ġas ĠEx pan ded Macro Info Impl ĊĊĠĠĠĠĠĠĠ Ġexpanded File To Info . remove ( old Info . file Id ) ĊĠĠĠĠĠĠĠ Ġval Ġsf Ġ= Ġold Info . source File ĊĠĠĠĠĠĠĠ Ġsf . remove Info ( old Info ) ĊĠĠĠĠĠĠĠ Ġif Ġ( clean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove SourceFile If Empty ( sf ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove SourceFile If Empty ( sf : ĠSource File ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Write Access Allowed () ĊĠĠĠĠĠĠĠ Ġif Ġ( sf . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Files . remove ( sf . file Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġste pped [ sf . depth ]?. remove ( sf ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget OrCreate SourceFile ( call File : ĠVirtual File ): ĠSource File ? Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Write Access Allowed () ĊĠĠĠĠĠĠĠ Ġval Ġfile Id Ġ= Ġcall File . file Id ĊĠĠĠĠĠĠĠ Ġreturn Ġsource Files [ file Id ] Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdepth Ġ= Ġ( getInfo For Expanded File ( call File )?. source File ?. depth Ġ?: Ġ- 1 ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( depth Ġ>= ĠDEFAULT _ REC UR SION _ LIMIT ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsf Ġ= ĠSource File ( this , Ġcall File , Ġdepth ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Or Put St aged List ( sf ). add ( sf ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Files . put ( file Id , Ġsf ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsf ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget SourceFile ( call File : ĠVirtual File ): ĠSource File ? Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Read Access Allowed () ĊĠĠĠĠĠĠĠ Ġreturn Ġsource Files [ call File . file Id ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Info For Expanded File ( file : ĠVirtual File ): ĠEx pan ded Macro Info ? Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Read Access Allowed () ĊĠĠĠĠĠĠĠ Ġreturn Ġexpanded File To Info [ file . file Id ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Info For Call ( call : ĠRs Possible Macro Call ): ĠEx pan ded Macro Info ? Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Read Access Allowed () ĊĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcall . containing File . virtual File Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġsf Ġ= Ġget SourceFile ( file ) Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsf . getInfo For Call ( call ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġsave Storage ( storage : ĠEx pan ded Macro Storage , Ġdata : ĠData OutputStream ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . writeInt ( STORAGE _ VERSION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . writeInt ( Decl Macro Expand er . EXPAND ER _ VERSION Ġ+ ĠProc Macro Expand er . EXPAND ER _ VERSION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . writeInt ( Rs File Stub . Type . stub Version ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . writeInt ( RANGE _ MAP _ ATTRIBUTE _ VERSION ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata . writeInt ( storage . source Files . size ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstorage . source Files . forEach Value Ġ{ Ġit . writeTo ( data ); Ġtrue Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġconst Ġval ĠSTORAGE _ VERSION Ġ= Ġ 1 3 Ċ private Ġconst Ġval ĠR ANGE _ MAP _ ATTRIBUTE _ VERSION Ġ= Ġ 2 Ċ Ċ class ĠSerialized Expanded Macro Storage Ġprivate Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġser Source Files : ĠList < Serialized SourceFile > Ċ ) Ġ{ ĊĠĠĠ Ġfun Ġdeserialize In Read Action ( project : ĠProject ): ĠEx pan ded Macro Storage Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Read Access Allowed () ĊĠĠĠĠĠĠĠ Ġval Ġstorage Ġ= ĠEx pan ded Macro Storage ( project ) ĊĠĠĠĠĠĠĠ Ġval Ġsource Files Ġ= Ġser Source Files . map NotNull Ġ{ Ġit . to SourceFile ( storage ) Ġ} ĊĠĠĠĠĠĠĠ Ġstorage . deserialize ( source Files ) ĊĠĠĠĠĠĠĠ Ġreturn Ġstorage ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠ Ġfun Ġload ( data : ĠData InputStream ): ĠSerialized Expanded Macro Storage ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data . readInt () Ġ!= ĠSTORAGE _ VERSION ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data . readInt () Ġ!= ĠDecl Macro Expand er . EXPAND ER _ VERSION Ġ+ ĠProc Macro Expand er . EXPAND ER _ VERSION ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data . readInt () Ġ!= ĠRs File Stub . Type . stub Version ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data . readInt () Ġ!= ĠR ANGE _ MAP _ ATTRIBUTE _ VERSION ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Files Size Ġ= Ġdata . readInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġser Source Files Ġ= ĠArrayList < Serialized SourceFile >( source Files Size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġsource Files Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġser Source Files Ġ+= ĠSerialized SourceFile . read From ( data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSerialized Expanded Macro Storage ( ser Source Files ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġ[ SourceFile ] Ġobject Ġis Ġassociated Ġto Ġany ĠRust Ġfile Ġthat Ġcontains Ġmacro Ġcalls . ĠThe Ġmain Ġpurpose Ċ Ġ* Ġof Ġ[ SourceFile ] Ġis Ġto Ġmap Ġbetween Ġmacro Ġcalls Ġand Ġexp ans ions Ġ([ Rs Macro Call ] Ġ< -> Ġ[ Expanded Macro Info Impl ]). Ċ Ġ* Ċ Ġ* ĠThere Ġare Ġ 3 Ġbasic Ġmechanisms Ġto Ġkeep Ġmapping Ġbetween Ġmacro Ġcall Ġand Ġexpansion : Ċ Ġ* Ġ- Ġ** Via Ġstub Ġids **. ĠEach Ġstub Ġhas Ġan Ġindex Ġ( aka Ġ* id *, Ġincremental Ġinteger Ġgiven Ġin ĠDFS Ġorder ; Ġsee Ċ Ġ* ĠĠ Ġ[ calc Stub Index ]). ĠA ĠP SI Ġelement Ġcan Ġbe Ġretrieved Ġby Ġsuch Ġindex Ġif Ġthe ĠP SI Ġfile Ġhas Ġnot Ġbeen Ġchanged Ċ Ġ* ĠĠ Ġsince Ġreceipt Ġof Ġthe Ġstub Ġindex . ĠWe Ġcheck Ġthat ĠP SI Ġfile Ġis Ġnot Ġchanged Ġby Ġthe Ġmodification Ġstamp , Ċ Ġ* ĠĠ Ġsee Ġ[ get Actual Mod Stamp ] Ċ Ġ* Ġ- Ġ** Via Ġstrong ĠP SI Ġrefs **. ĠBefore Ġany ĠP SI Ġmodification , Ġa Ġstrong Ġref Ġto Ġeach Ġknown Ġ[ Rs Macro Call ] Ġin Ċ Ġ* ĠĠ Ġthe Ġfile Ġis Ġstored Ġ( see Ġ[ Expanded Macro Info Impl . macro Call Strong Ref ]). ĠThen , Ġafter Ġthe Ġend Ġof ĠP SI Ċ Ġ* ĠĠ Ġmodification , Ġstub Ġindices Ġare Ġrestored Ġfrom Ġthe Ġstored Ġrefs . ĠSee Ġ[ switch To Strong Refs Temporary ] Ċ Ġ* Ġ- Ġ** Hash - based Ġrecover **. ĠIf Ġthe Ġrefs Ġare Ġlost , Ġthey Ġcan Ġbe Ġre covered . ĠEach Ġ[ Expanded Macro Info Impl ] Ġstores Ċ Ġ* ĠĠ Ġhashes Ġof Ġa Ġmacro Ġcall Ġand Ġa Ġmacro Ġdefinition . ĠThey Ġare Ġmostly Ġused Ġto Ġcheck Ġwhether Ġa Ġmacro Ġshould Ġbe Ċ Ġ* ĠĠ Ġre - expanded Ġ( if Ġthe Ġhash Ġof Ġthe Ġbody / definition Ġis Ġchanged ) Ġbut Ġcan Ġbe Ġalso Ġused Ġto Ġrecover Ċ Ġ* ĠĠ Ġlinks Ġto Ġa ĠP SI . ĠSee Ġ[ recover Refs ]. ĠReferences Ġmay Ġbe Ġlost Ġwhen Ġmodifying Ġstub - based ĠP SI . Ċ Ġ* Ċ Ġ* Ġ# ĠThread ing Ġnotes : Ċ Ġ* ĠThere Ġare Ġsome Ġmutable Ġfields : Ċ Ġ* Ġ- Ġ[ modification Stamp ] Ċ Ġ* Ġ- Ġ[ infos ] Ġ( list Ġcontent ) Ċ Ġ* Ġ- Ġ[ Expanded Macro Info Impl . macro Call Stub Index ] Ċ Ġ* Ġ- Ġ[ Expanded Macro Info Impl . macro Call Strong Ref ] Ċ Ġ* Ċ Ġ* ĠThey : Ċ Ġ* Ġ- Ġcan Ġbe Ġaccessed Ġ( read Ġor Ġmut ated ) Ġin Ġthe Ġwrite Ġaction Ġwithout Ġany Ġadditional Ġsynchronization Ċ Ġ* Ġ- Ġcan Ġbe Ġaccessed Ġ( read Ġor Ġmut ated ) Ġin Ġthe Ġread Ġaction Ġunder Ġthe Ġ[ lock ] Ċ Ġ* Ġ- Ġcannot Ġbe Ġaccessed Ġoutside Ġof Ġread / write Ġaction Ċ Ġ* Ċ Ġ* ĠThese Ġin variants Ġare Ġchecked Ġby Ġ[ assert Sync ] Ġmethod . Ċ Ġ*/ Ċ class ĠSource File ( ĊĠĠĠ Ġval Ġstorage : ĠEx pan ded Macro Storage , ĊĠĠĠ Ġval Ġfile : ĠVirtual File , ĊĠĠĠ Ġprivate Ġvar Ġ_ depth : ĠInt , ĊĠĠĠ Ġprivate Ġvar Ġ_ modification Stamp : ĠLong Ġ= ĠF RESH _ FLAG , ĊĠĠĠ Ġprivate Ġval Ġ_ infos : ĠMutable List < Expanded Macro Info Impl > Ġ= Ġmutable ListOf () Ċ ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlock Ġ= ĠRe entrant Lock () ĊĊĠĠĠ Ġprivate Ġval Ġfile Url : ĠString Ġget () Ġ= Ġfile . url ĊĠĠĠ Ġval Ġfile Id : ĠInt Ġget () Ġ= Ġfile . file Id ĊĠĠĠ Ġval Ġproject : ĠProject Ġget () Ġ= Ġstorage . project ĊĊĠĠĠ Ġ// ĠUsed Ġonly Ġfor Ġde serialization ĊĠĠĠ Ġval Ġdepth Not Sync : ĠInt Ġget () Ġ= Ġ_ depth ĊĊĠĠĠ Ġvar Ġdepth : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Sync () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ_ depth ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Sync () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ depth Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġmodification Stamp : ĠLong ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Sync () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ_ modification Stamp ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Sync () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ_ modification Stamp Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġinfos : ĠMutable List < Expanded Macro Info Impl > ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġreally Ġshould Ġcheck Ġaccess Ġto Ġ[_ infos ] Ġcontents Ġinstead Ġof Ġ[_ infos ] Ġitself ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert Sync () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ_ infos ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġroot SourceFile : ĠSource File Ġby Ġlazy ( Lazy Thread Safety Mode . PUBLIC ATION ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfind Root SourceFile () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠShould Ġnot Ġbe Ġlazy Ġb / c Ġtarget / pkg / origin Ġcan Ġbe Ġchanged ĊĠĠĠ Ġprivate Ġval Ġis Bel ong To Workspace : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġroot SourceFile . load Psi ()?. containing C rate ?. origin Ġ== ĠPackage Origin . WORK SPACE ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġthat Ġ[ modification Stamp ], Ġ[ infos ] Ġcontent , Ġ[ Expanded Macro Info Impl . macro Call Strong Ref ] Ġor ĊĠĠĠĠ Ġ* Ġ[ Expanded Macro Info Impl . macro Call Stub Index ] Ġcan Ġbe Ġaccessed . ĠSee Ġdocs Ġfor Ġ[ SourceFile ] Ġfor Ġmore Ġinfo ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġassert Sync () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapp Ġ= ĠApplication Manager . getApplication () ĊĠĠĠĠĠĠĠ Ġcheck ( app . is Write Access Allowed Ġ|| Ġlock . is Hel d By Current Thread Ġ&& Ġapp . is Read Access Allowed ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< T > Ġsync ( action : Ġ() Ġ-> ĠT ): ĠT Ġ= ĊĠĠĠĠĠĠĠ Ġlock . with Lock ( action ) ĊĊĠĠĠ Ġprivate Ġfun Ġswitch To Stub Refs In Read Action ( ĊĠĠĠĠĠĠĠ Ġkind : ĠRef Kind , ĊĠĠĠĠĠĠĠ Ġaction : Ġ( Mutable List < Expanded Macro Info Impl >) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Read Access Allowed () ĊĠĠĠĠĠĠĠ Ġsync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( get Ref Kind () Ġ!= Ġkind ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProgress Manager . getInstance (). execute Non Cancel able Section Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction ( infos ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodification Stamp Ġ= Ġget Actual Mod Stamp () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġswitch Refs In Write Action ( action : Ġ( Mutable List < Expanded Macro Info Impl >) Ġ-> ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠNo Ġsynchronization Ġneeded Ġin Ġthe Ġwrite Ġaction ĊĠĠĠĠĠĠĠ Ġcheck Write Access Allowed () ĊĠĠĠĠĠĠĠ Ġmodification Stamp Ġ= Ġaction ( infos ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinline Ġfun Ġ< T > Ġsync And Map Infos ( mapper : Ġ( Expanded Macro Info Impl ) Ġ-> ĠT ): ĠList < T > Ġ= Ġsync Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Read Access Allowed () ĊĠĠĠĠĠĠĠ Ġreturn Ġinfos . map ( mapper ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠUsed Ġonly Ġduring Ġde serialization ĊĠĠĠ Ġfun ĠforEach Info Not Sync ( action : Ġ( Expanded Macro Info Impl ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ infos . forEach ( action ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠisEmpty (): ĠBoolean Ġ= Ġsync Ġ{ ĊĠĠĠĠĠĠĠ Ġinfos . isEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġenum Ġclass ĠRef Kind Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĠThe Ġ[ file ] Ġis Ġnot Ġvalid Ġ( e . g . Ġis Ġdeleted ) Ġ*/ ĊĠĠĠĠĠĠĠ ĠINVALID , ĊĊĠĠĠĠĠĠĠ Ġ/** ĠNo Ġrefs Ġcreated Ġyet Ġ*/ ĊĠĠĠĠĠĠĠ ĠF RESH , ĊĊĠĠĠĠĠĠĠ Ġ/** ĠUses Ġ[ Expanded Macro Info Impl . macro Call Strong Ref ] Ġ*/ ĊĠĠĠĠĠĠĠ ĠSTR ONG , ĊĊĠĠĠĠĠĠĠ Ġ/** ĠUses Ġ[ Expanded Macro Info Impl . macro Call Stub Index ] Ġ*/ ĊĠĠĠĠĠĠĠ ĠST UB , ĊĊĠĠĠĠĠĠĠ Ġ/** ĠRe fs Ġwas Ġlost Ġand Ġshould Ġbe Ġre covered Ġwith Ġ[ recover Refs ] Ġ*/ ĊĠĠĠĠĠĠĠ ĠLO ST ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Ref Kind (): ĠRef Kind Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Sync () ĊĠĠĠĠĠĠĠ Ġif Ġ(! file . isValid Ġ|| Ġproject . is Disposed ) Ġreturn ĠRef Kind . INVALID ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( modification Stamp ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSTR ONG _ REF S _ FLAG Ġ-> ĠRef Kind . STRONG ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFOR CE _ RE LINK _ FLAG Ġ-> ĠRef Kind . LO ST ĊĠĠĠĠĠĠĠĠĠĠĠ ĠF RESH _ FLAG Ġ-> ĠRef Kind . F RESH ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Actual Mod Stamp () Ġ-> ĠRef Kind . ST UB ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġif Ġ( infos . isEmpty ()) ĠRef Kind . F RESH Ġelse ĠRef Kind . LO ST ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinterface ĠRef Matcher < T > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġallow Fresh Re bind : ĠBoolean Ġget () Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġfun Ġnone (): ĠT ĊĠĠĠĠĠĠĠ Ġfun Ġstrong ( infos : ĠList < Expanded Macro Info Impl >): ĠT ĊĠĠĠĠĠĠĠ Ġfun Ġstub ( psi : ĠRs File , Ġinfos : ĠList < Expanded Macro Info Impl >): ĠT ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġmatch Refs ( ĊĠĠĠĠĠĠĠ Ġmatcher : ĠRef Matcher < T >, ĊĠĠĠĠĠĠĠ Ġpref etched Calls : ĠList < Rs Possible Macro Call >? Ġ= Ġnull ĊĠĠĠ Ġ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Read Access Allowed () ĊĠĠĠĠĠĠĠ Ġval Ġpsi Ġ= Ġload Psi () Ġ?: Ġreturn Ġmatcher . none () ĊĠĠĠĠĠĠĠ Ġval Ġkind Ġ= Ġsync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkind Ġ= Ġget Ref Kind () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ` STRONG Ġ-> ĠST UB ` Ġtransition Ġis Ġallowed Ġin Ġthe Ġread Ġaction , Ġso Ġthis Ġmust ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbe Ġcalled Ġin Ġthe Ġsame Ġ` sync ` Ġsection Ġwhere Ġ` get Ref Kind ` Ġcalled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( kind Ġ== ĠRef Kind . STRONG ) Ġreturn Ġmatcher . strong ( infos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkind ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( kind ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRef Kind . INVALID Ġ-> Ġmatcher . none () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRef Kind . F RESH Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! matcher . allow Fresh Re bind ) Ġreturn Ġmatcher . none () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOnly Ġ` F RESH Ġ-> ĠST UB ` Ġtransition Ġis Ġallowed Ġin Ġthe Ġread Ġaction , Ġso Ġsynchronization ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġisn 't Ġneeded Ġ- Ġmultiple Ġconcurrent Ġinv ocations Ġwill Ġresult Ġto Ġthe Ġsame Ġvalues ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfresh Extract Macros ( pref etched Calls ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatcher . stub ( psi , Ġ_ infos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRef Kind . STRONG Ġ-> Ġerror (" unreachable ") Ġ// Ġhandled Ġabove ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRef Kind . ST UB Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTest marks . Stub Based Ref Match . hit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTransition Ġto Ġany Ġstate Ġfrom Ġ` ST UB ` Ġis Ġforbidden Ġin Ġthe Ġread Ġaction ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatcher . stub ( psi , Ġ_ infos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRef Kind . LO ST Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOnly Ġ` LO ST Ġ-> ĠST UB ` Ġtransition Ġallowed Ġin Ġthe Ġread Ġaction , Ġso Ġsynchronization ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġisn 't Ġneeded Ġ- Ġmultiple Ġconcurrent Ġinv ocations Ġwill Ġresult Ġto Ġthe Ġsame Ġvalues ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrecover Refs ( pref etched Calls ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatcher . stub ( psi , Ġ_ infos ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġreplace Info ( old Info : ĠEx pan ded Macro Info Impl , Ġnew Info : ĠEx pan ded Macro Info Impl ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Write Access Allowed () ĊĠĠĠĠĠĠĠ Ġval Ġinfos Ġ= Ġinfos Ġ// ĠNo Ġsynchronization Ġneeded Ġin Ġthe Ġwrite Ġaction ĊĠĠĠĠĠĠĠ Ġval Ġold Info Index Ġ= Ġinfos . indexOf ( old Info ) ĊĠĠĠĠĠĠĠ Ġif Ġ( old Info Index Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfos [ old Info Index ] Ġ= Ġnew Info ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfos . add ( new Info ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġremove Info ( info : ĠEx pan ded Macro Info Impl ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Write Access Allowed () ĊĠĠĠĠĠĠĠ Ġinfos . remove ( info ) Ġ// ĠNo Ġsynchronization Ġneeded Ġin Ġthe Ġwrite Ġaction ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġextract ( workspace Only : ĠBoolean , Ġcalls : ĠList < Rs Possible Macro Call >? ): ĠList < Pipeline . Stage 1 Resolve And Expand >? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( workspace Only Ġ&& Ġ! is Bel ong To Workspace ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġvery Ġhot Ġpath ; Ġthe Ġcondition Ġshould Ġbe Ġas Ġfast Ġas Ġpossible ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġextract ( calls ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġextract ( calls : ĠList < Rs Possible Macro Call >? ): ĠList < Pipeline . Stage 1 Resolve And Expand >? Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Read Access Allowed () Ġ// ĠN eeded Ġto Ġaccess ĠP SI ĊĠĠĠĠĠĠĠ Ġcheck Is Smart Mode ( project ) ĊĊĠĠĠĠĠĠĠ Ġval Ġis Expansion File Ġ= ĠMacro Expansion Manager . is Expansion File ( file ) ĊĠĠĠĠĠĠĠ Ġval Ġis Indexed File Ġ= Ġfile . isValid Ġ&& Ġ( is Expansion File Ġ|| Ġshould Index File ( project , Ġfile )) ĊĊĠĠĠĠĠĠĠ Ġval Ġinvalidate File Infos Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsync And Map Infos Ġ{ Ġinfo Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . mark Invalid () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . make Invalid ation Pipeline () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġstages 1 Ġ= Ġif Ġ(! is Indexed File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġfile Ġis Ġnow Ġoutside Ġof Ġthe Ġproject , Ġso Ġwe Ġshould Ġnot Ġaccess Ġit . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAll Ġinfos Ġof Ġthis Ġfile Ġshould Ġbe Ġinvalid ated ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvalidate File Infos () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Expansion File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpsi File Ġ= Ġload Psi () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( psi File Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġproject Ġfile Ġdoesn 't Ġhave Ġcrate Ġroot ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġshouldn 't Ġtry Ġto Ġexpand Ġits Ġmacro Ġcalls ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( psi File . crate Root Ġ== Ġnull ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! psi File . is Dee ply Enabled By Cfg ) Ġreturn @ run Ġinvalidate File Infos () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmatch Refs ( Make Pipeline (), Ġcalls ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġstages 1 . take If Ġ{ Ġit . isNotEmpty () Ġ} Ġ?: ĠlistOf ( Remove SourceFile If Empty Pipeline ( this )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠMake Pipeline Ġ: ĠRef Matcher < List < Pipeline . Stage 1 Resolve And Expand >> Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġallow Fresh Re bind : ĠBoolean Ġget () Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnone (): ĠList < Pipeline . Stage 1 Resolve And Expand > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsync And Map Infos Ġ{ Ġit . make Invalid ation Pipeline () Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġstrong ( infos : ĠList < Expanded Macro Info Impl >): ĠList < Pipeline . Stage 1 Resolve And Expand > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfos . map Ġ{ Ġit . make Pipeline ( it . deref Macro Call ()) Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġstub ( psi : ĠRs File , Ġinfos : ĠList < Expanded Macro Info Impl >): ĠList < Pipeline . Stage 1 Resolve And Expand > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinfos . map Ġ{ Ġinfo Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstub Index Ġ= Ġinfo . macro Call Stub Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Ġ= Ġif Ġ( stub Index Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpsi . stub bed Sp ine . get Macro Call ( stub Index ) Ġ?: Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . make Pipeline ( call ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfresh Extract Macros ( pref etched Calls : ĠList < Rs Possible Macro Call > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpsi Ġ= Ġload Psi () Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġcalls Ġ= Ġpref etched Calls Ġ?: Ġpsi . stub Desc endants OfType Strict < Rs Possible Macro Call >(). filter Ġ{ Ġit . is TopLevel Expansion Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnew Infos Ġ= Ġcalls . map Ġ{ Ġcall Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEx pan ded Macro Info Impl . new Stub Linked ( this , Ġcall ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġswitch To Stub Refs In Read Action ( Ref Kind . F RESH ) Ġ{ Ġinfos Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck ( infos . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfos . addAll ( new Infos ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThread ing Ġnotes : ĊĠĠĠĠ Ġ* ĠWe Ġdon 't Ġwant Ġto Ġexecute Ġthe Ġentire Ġmethod Ġin Ġsynchronized Ġsection Ġbecause Ġit Ġperforms Ġmacro Ġname ĊĠĠĠĠ Ġ* Ġresolution Ġ( heavy Ġstuff ). ĠAll Ġchanges Ġare Ġpublished Ġin Ġthe Ġlast Ġ[ switch To Stub Refs In Read Action ] Ġcall ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġrecover Refs ( pref etched Calls : ĠList < Rs Possible Macro Call > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Read Access Allowed () ĊĠĠĠĠĠĠĠ ĠTest marks . Refs Recover . hit () ĊĊĠĠĠĠĠĠĠ Ġval Ġpsi Ġ= Ġload Psi () Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġcalls Ġ= Ġpref etched Calls Ġ?: Ġpsi . stub Desc endants OfType Strict < Rs Possible Macro Call >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . is TopLevel Expansion Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġun bound Infos Ġ= Ġsync Ġ{ Ġinfos . to Mutable List () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġor ph ans Ġ= Ġmutable ListOf < Rs Possible Macro Call >() ĊĠĠĠĠĠĠĠ Ġval Ġbind List Ġ= Ġmutable ListOf < Pair < Expanded Macro Info Impl , ĠInt >>() ĊĠĠĠĠĠĠĠ Ġfor Ġ( call Ġin Ġcalls ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= Ġun bound Infos . find Ġ{ Ġit . is Up ToDate ( call , Ġcall . resolve To Macro Without Psi ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( info Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTest marks . Refs Recover Exact Hit . hit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun bound Infos . remove ( info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbind List Ġ+= ĠPair ( info , Ġcall . calc Stub Index ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġor ph ans Ġ+= Ġcall ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġinfos ToAdd Ġ= Ġmutable ListOf < Expanded Macro Info Impl >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( call Ġin Ġor ph ans ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= Ġun bound Infos . find Ġ{ Ġit . call Hash Ġ== Ġcall . body Hash Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( info Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTest marks . Refs Recover Call Hit . hit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun bound Infos . remove ( info ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbind List Ġ+= ĠPair ( info , Ġcall . calc Stub Index ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTest marks . Refs Recover Not Hit . hit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfos ToAdd Ġ+= ĠEx pan ded Macro Info Impl . new Stub Linked ( this , Ġcall ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġswitch To Stub Refs In Read Action ( Ref Kind . LO ST ) Ġ{ Ġinfos Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( info , Ġcall Stub Index ) Ġin Ġbind List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . macro Call Strong Ref Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . macro Call Stub Index Ġ= Ġcall Stub Index ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġun bound Infos . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . mark Invalid () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfos . addAll ( infos ToAdd ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġare Stub Indices Actual (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodification Stamp Ġ= Ġmodification Stamp ĊĠĠĠĠĠĠĠ Ġreturn Ġmodification Stamp Ġ>= Ġ 0 Ġ&& Ġmodification Stamp Ġ== Ġget Actual Mod Stamp () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Actual Mod Stamp (): ĠLong Ġ= ĊĠĠĠĠĠĠĠ Ġload Psi ()?. view Provider ?. modification Stamp Ġ?: ĠFOR CE _ RE LINK _ FLAG ĊĊĠĠĠ Ġprivate Ġfun Ġload Psi (): ĠRs File ? Ġ= ĊĠĠĠĠĠĠĠ Ġfile . take If Ġ{ Ġit . isValid Ġ} ?. to Psi File ( project ) Ġas ? ĠRs File ĊĊĠĠĠ Ġfun Ġget Info For Call ( see king Call : ĠRs Possible Macro Call ): ĠEx pan ded Macro Info ? Ġ{ ĊĠĠĠĠĠĠĠ Ġtest Assert Ġ{ Ġsee king Call . containing File . virtual File Ġ== Ġfile Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmatch Refs ( object Ġ: ĠRef Matcher < Expanded Macro Info Impl ?> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnone (): ĠEx pan ded Macro Info Impl ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġstrong ( infos : ĠList < Expanded Macro Info Impl >): ĠEx pan ded Macro Info Impl ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfos . find Ġ{ Ġit . macro Call Strong Ref Ġ== Ġsee king Call Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġstub ( psi : ĠRs File , Ġinfos : ĠList < Expanded Macro Info Impl >): ĠEx pan ded Macro Info Impl ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTest marks . Stub Based Lookup . hit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsee king Stub Index Ġ= Ġsee king Call . calc Stub Index () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġinfos . find Ġ{ Ġit . macro Call Stub Index Ġ== Ġsee king Stub Index Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Call For Info ( info : ĠEx pan ded Macro Info Impl ): ĠRs Possible Macro Call ? Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( info . source File Ġ== Ġthis ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmatch Refs ( object Ġ: ĠRef Matcher < Rs Possible Macro Call ?> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnone (): ĠRs Possible Macro Call ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġstrong ( infos : ĠList < Expanded Macro Info Impl >): ĠRs Possible Macro Call ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . deref Macro Call () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġstub ( psi : ĠRs File , Ġinfos : ĠList < Expanded Macro Info Impl >): ĠRs Possible Macro Call ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstub Index Ġ= Ġinfo . macro Call Stub Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stub Index Ġ== Ġ- 1 ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpsi . stub bed Sp ine . get Macro Call ( stub Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnew Macro Calls Added ( new Macro Calls : ĠCollection < Rs Possible Macro Call >) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Write Access Allowed () ĊĠĠĠĠĠĠĠ Ġval Ġref Kind Ġ= Ġget Ref Kind () ĊĠĠĠĠĠĠĠ Ġif Ġ( ref Kind Ġ== ĠRef Kind . STRONG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfos Ġ= Ġinfos Ġ// ĠNo Ġsynchronization Ġneeded Ġin Ġthe Ġwrite Ġaction ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( call Ġin Ġnew Macro Calls ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( call . is TopLevel Expansion Ġ&& Ġinfos . none Ġ{ Ġit . macro Call Strong Ref Ġ== Ġcall Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfos Ġ+= ĠEx pan ded Macro Info Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpansion File Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdef Hash Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall Hash Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpansion Error Ġ= ĠExp ansion Pipeline Error . Not Y et Expanded , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmacro Call Strong Ref Ġ= Ġcall ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( ref Kind Ġ!= ĠRef Kind . F RESH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġswitch Refs In Write Action Ġ{ ĠFOR CE _ RE LINK _ FLAG Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġswitch To Strong Refs Temporary () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( switch To Strong Refs ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPsi Document Manager . getInstance ( project ). perform Later When All Commit ted Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelease Strong Refs () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġswitch To Strong Refs (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Write Access Allowed () ĊĠĠĠĠĠĠĠ Ġif Ġ( get Ref Kind () Ġ== ĠRef Kind . ST UB ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpsi Ġ= Ġload Psi () Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUsed Ġinstead Ġof Ġ` psi . stub bed Sp ine ` Ġto Ġavoid Ġswitching Ġto Ġsp ine Ġrefs Ġduring ĠP SI Ġevent Ġprocessing ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhich Ġis Ġforbidden Ġ( see Ġ` Psi File Impl . sub tree Changed `) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsp ine Ġ= Ġpsi . green Stub Tree ?. sp ine ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġpsi . tree Element ?. stub bed Sp ine ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġswitch Refs In Write Action Ġ{ Ġinfos Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( info Ġin Ġinfos ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstub Index Ġ= Ġinfo . macro Call Stub Index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stub Index Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . macro Call Strong Ref Ġ= Ġsp ine . get Macro Call ( stub Index ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn @ switch Refs In Write Action ĠFOR CE _ RE LINK _ FLAG ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSTR ONG _ REF S _ FLAG ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrelease Strong Refs () Ġ{ ĊĠĠĠĠĠĠĠ Ġswitch To Stub Refs In Read Action ( Ref Kind . STRONG ) Ġ{ Ġinfos Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġare Stub Indices Actual Ġ= Ġare Stub Indices Actual () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( info Ġin Ġinfos ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! are Stub Indices Actual ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . macro Call Stub Index Ġ= Ġinfo . deref Macro Call ()?. calc Stub Index () Ġ?: Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinfo . macro Call Strong Ref Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠStub bed Sp ine . get Macro Call ( stub Index : ĠInt ): ĠRs Possible Macro Call ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġget Stub Psi ( stub Index ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( element Ġis ĠRs Possible Macro Call ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= ĠFile Document Manager . getInstance (). get Cached Document ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Commit ted Doc Stamp Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocument ?. let Ġ{ ĠPsi Document Manager . getInstance ( project ). getLast Commit ted Stamp ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMAC RO _ LOG . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Detected Ġbroken Ġstub Ġreference Ġto Ġa Ġmacro !", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThrowable (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" File : Ġ`${ file . path }`, ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Stored Ġstamp : Ġ${ sync Ġ{ Ġmodification Stamp Ġ}}, ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Actual Ġstamp : Ġ${ get Actual Mod Stamp ()}, ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" P SI Ġstamp : Ġ${ load Psi ()?. view Provider ?. modification Stamp }, ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" File Ġstamp : Ġ${ file . modification Stamp }, ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Document Ġstamp : Ġ${ document ?. modification Stamp }, ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Last Ġcommitted Ġdocument Ġstamp : Ġ$ last Commit ted Doc Stamp ,", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Stub Ġindex : Ġ$ stub Index ,", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Found Ġelement : Ġ$ element , Ġ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Found Ġelement Ġtext : Ġ`${ element ?. text }` " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmark For Re bind () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmark For Re bind () Ġ= Ġsync Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( modification Stamp Ġ!= ĠF RESH _ FLAG ) Ġmodification Stamp Ġ= ĠFOR CE _ RE LINK _ FLAG ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠEx pan ded Macro Info Impl . deref Macro Call (): ĠRs Possible Macro Call ? Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Sync () ĊĠĠĠĠĠĠĠ Ġreturn Ġmacro Call Strong Ref ?. take If Ġ{ Ġit . isValid Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠEx pan ded Macro Info Impl . mark Invalid () Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Sync () ĊĠĠĠĠĠĠĠ Ġmacro Call Strong Ref Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġmacro Call Stub Index Ġ= Ġ- 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠwriteTo ( data : ĠData OutputStream ): ĠUnit Ġ= Ġsync Ġ{ ĊĠĠĠĠĠĠĠ Ġdata . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite UTF ( file Url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Int ( depth ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Long ( modification Stamp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Int ( infos . size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfos . forEach Ġ{ Ġit . writeTo ( data ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġconst Ġval ĠFOR CE _ RE LINK _ FLAG : ĠLong Ġ= Ġ- 1 L Ċ private Ġconst Ġval ĠSTR ONG _ REF S _ FLAG : ĠLong Ġ= Ġ- 2 L Ċ private Ġconst Ġval ĠF RESH _ FLAG : ĠLong Ġ= Ġ- 3 L Ċ Ċ private Ġdata Ġclass ĠSerialized SourceFile ( ĊĠĠĠ Ġval Ġfile Url : ĠString , ĊĠĠĠ Ġval Ġdepth : ĠInt , ĊĠĠĠ Ġprivate Ġvar Ġmodification Stamp : ĠLong , ĊĠĠĠ Ġprivate Ġval Ġser Infos : ĠList < Serialized Expanded Macro Info > Ċ ) Ġ{ ĊĠĠĠ Ġfun Ġto SourceFile ( storage : ĠEx pan ded Macro Storage ): ĠSource File ? Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Read Access Allowed () Ġ// ĠN eeded Ġto Ġaccess ĠV FS ĊĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠVirtual FileManager . getInstance (). find File By Url ( file Url ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġinfos Ġ= ĠArrayList < Expanded Macro Info Impl >( ser Infos . size ) ĊĠĠĠĠĠĠĠ Ġval Ġsf Ġ= ĠSource File ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstorage , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdepth , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodification Stamp , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfos ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġser Infos . map NotNull To ( infos ) Ġ{ Ġit . to Expanded Macro Info ( sf ) Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( infos . size Ġ!= Ġser Infos . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsf . mark For Re bind () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsf ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġread From ( data : ĠData InputStream ): ĠSerialized SourceFile Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Url Ġ= Ġdata . read UTF () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdepth Ġ= Ġdata . readInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodification Stamp Ġ= Ġdata . read Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinfos Size Ġ= Ġdata . readInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġser Infos Ġ= Ġ( 0 Ġuntil Ġinfos Size ). map Ġ{ ĠSerialized Expanded Macro Info . read From ( data ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSerialized SourceFile ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Url , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdepth , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodification Stamp , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġser Infos ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġtail rec Ġfun ĠSource File . find Root SourceFile (): ĠSource File Ġ{ ĊĠĠĠ Ġval Ġfile Ġ= Ġfile . take If Ġ{ Ġit . isValid Ġ} Ġ?: Ġreturn Ġthis ĊĠĠĠ Ġval Ġparent SF Ġ= Ġstorage . getInfo For Expanded File ( file )?. source File Ġ?: Ġreturn Ġthis ĊĠĠĠ Ġreturn Ġparent SF . find Root SourceFile () Ċ } Ċ Ċ interface ĠEx pan ded Macro Info Ġ{ ĊĠĠĠ Ġval Ġsource File : ĠSource File ĊĠĠĠ Ġval Ġexpansion Result : ĠRs Result < Virtual File , ĠExp ansion Pipeline Error > ĊĠĠĠ Ġval Ġexpansion File Hash : ĠLong ĊĠĠĠ Ġfun Ġget Macro Call (): ĠRs Possible Macro Call ? ĊĠĠĠ Ġfun Ġis Up ToDate ( call : ĠRs Possible Macro Call , Ġdef : ĠRs Macro Data With Hash < *> ?): ĠBoolean ĊĠĠĠ Ġfun Ġget Expansion (): ĠRs Result < Macro Expansion , ĠE MI Get Expansion Error > Ċ } Ċ Ċ class ĠEx pan ded Macro Info Impl ( ĊĠĠĠ Ġoverride Ġval Ġsource File : ĠSource File , ĊĠĠĠ Ġprivate Ġval Ġexpansion File : ĠVirtual File ?, ĊĠĠĠ Ġprivate Ġval Ġdef Hash : ĠHash Code ?, ĊĠĠĠ Ġval Ġcall Hash : ĠHash Code ?, ĊĠĠĠ Ġprivate Ġval Ġexpansion Error : ĠExp ansion Pipeline Error ?, ĊĠĠĠ Ġoverride Ġval Ġexpansion File Hash : ĠLong Ġ= Ġ 0 , ĊĠĠĠ Ġvar Ġmacro Call Stub Index : ĠInt Ġ= Ġ- 1 , ĊĠĠĠ Ġvar Ġmacro Call Strong Ref : ĠRs Possible Macro Call ? Ġ= Ġnull Ċ ) Ġ: ĠEx pan ded Macro Info Ġ{ ĊĠĠĠ Ġval Ġfile Id : ĠInt Ġget () Ġ= Ġexpansion File ?. file Id Ġ?: Ġ- 1 ĊĊĠĠĠ Ġoverride Ġval Ġexpansion Result : ĠRs Result < Virtual File , ĠExp ansion Pipeline Error > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġexpansion File . to Result (). map Err Ġ{ Ġexpansion Error !! Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Macro Call (): ĠRs Possible Macro Call ? Ġ= ĊĠĠĠĠĠĠĠ Ġsource File . get Call For Info ( this ) ĊĊĠĠĠ Ġoverride Ġfun Ġis Up ToDate ( call : ĠRs Possible Macro Call , Ġdef : ĠRs Macro Data With Hash < *> ?): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġcall Hash Ġ== Ġcall . body Hash Ġ&& Ġdef ?. body Hash Ġ== Ġdef Hash ĊĊĠĠĠ Ġoverride Ġfun Ġget Expansion (): ĠRs Result < Macro Expansion , ĠE MI Get Expansion Error > Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Read Access Allowed () ĊĠĠĠĠĠĠĠ Ġreturn Ġget Expansion Psi (). map Ġ{ Ġpsi Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Expansion From Expanded File ( Macro Expansion Context . ITEM , Ġpsi ) !! ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Expansion Psi (): ĠRs Result < Rs File , ĠE MI Get Expansion Error > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġexpansion Result . and Then Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . isValid ) Ġreturn @ and Then ĠErr ( EM I Get Expansion Error . Invalid Expansion File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Assert Ġ{ Ġit . fileType Ġ== ĠRs FileType Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpsi Ġ= Ġit . to Psi File ( source File . project ) Ġas ? ĠRs File ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( psi Ġ!= Ġnull ) ĠOk ( psi ) Ġelse ĠErr ( EM I Get Expansion Error . Invalid Expansion File ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmake Pipeline ( call : ĠRs Possible Macro Call ?): ĠPipeline . Stage 1 Resolve And Expand Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( call Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExp ansion Pipeline . Stage 1 ( call , Ġthis ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIn validation Pipeline . Stage 1 ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġmake Invalid ation Pipeline (): ĠPipeline . Stage 1 Resolve And Expand Ġ= ĊĠĠĠĠĠĠĠ Ġmake Pipeline ( null ) ĊĊĠĠĠ Ġfun ĠwriteTo ( data : ĠData OutputStream ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdata . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Rs Result ( expansion Result . map Ġ{ Ġit . url Ġ}, ĠIO Util :: write UTF , ĠData Output :: write Expansion Pipeline Error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite HashCode Nullable ( def Hash ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite HashCode Nullable ( call Hash ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Long ( expansion File Hash ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Int ( macro Call Stub Index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġnew Stub Linked ( sf : ĠSource File , Ġcall : ĠRs Possible Macro Call ): ĠEx pan ded Macro Info Impl Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEx pan ded Macro Info Impl ( sf , Ġnull , Ġnull , Ġcall . body Hash , ĠExp ansion Pipeline Error . Not Y et Expanded , Ġmacro Call Stub Index Ġ= Ġcall . calc Stub Index ()) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġdata Ġclass ĠSerialized Expanded Macro Info ( ĊĠĠĠ Ġval Ġexpansion File Url : ĠRs Result < String , ĠExp ansion Pipeline Error >, ĊĠĠĠ Ġval Ġcall Hash : ĠHash Code ?, ĊĠĠĠ Ġval Ġdef Hash : ĠHash Code ?, ĊĠĠĠ Ġval Ġexpansion File Hash : ĠLong , ĊĠĠĠ Ġval Ġstub Index : ĠInt Ċ ) Ġ{ ĊĠĠĠ Ġfun Ġto Expanded Macro Info ( source File : ĠSource File ): ĠEx pan ded Macro Info Impl ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġexpansion File Url . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠVirtual FileManager . getInstance (). find File By Url ( it ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠEx pan ded Macro Info Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource File , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . ok (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall Hash , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdef Hash , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . err (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpansion File Hash , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstub Index ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġread From ( data : ĠData InputStream ): ĠSerialized Expanded Macro Info Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠSerialized Expanded Macro Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . read Rs Result ( IO Util :: read UTF , ĠData Input :: read Expansion Pipeline Error ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . read HashCode Nullable (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . read HashCode Nullable (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . read Long (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . readInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠRs Possible Macro Call . calc Stub Index (): ĠInt Ġ= ĊĠĠĠ Ġ( this Ġas ĠStub Based Psi Element < *> ). calc Stub Index () Ċ Ċ private Ġfun ĠStub Based Psi Element <* >. calc Stub Index (): ĠInt Ġ{ ĊĠĠĠ ĠProgress Manager . check Canceled () ĊĠĠĠ Ġval Ġindex Ġ= ĠPsi Anchor . calc Stub Index ( this ) ĊĠĠĠ Ġif Ġ( index Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġshould Create Stub Ġ= Ġelement Type . should Create Stub ( node ) ĊĠĠĠĠĠĠĠ Ġerror (" Failed Ġto Ġcalc Ġstub Ġindex Ġfor Ġthe Ġelement : Ġ${ this }, Ġshould Create Stub : Ġ$ should Create Stub ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġindex Ċ } ĊĊ Ċ /** ĠWe Ġuse Ġ[ Weak Reference ] Ġbecause Ġun cached Ġ[ load Range Map ] Ġis Ġquite Ġche ap Ġ*/ Ċ private Ġval ĠMAC RO _ RANGE _ MAP _ CACHE _ KEY : ĠKey < Weak Reference < Range Map >> Ġ= ĠKey . create (" MACRO _ RANGE _ MAP _ CACHE _ KEY ") Ċ private Ġval ĠR ANGE _ MAP _ ATTRIBUTE Ġ= ĠFile Attribute ( ĊĠĠĠ Ġ" org . rust . macro . Range Map ", ĊĠĠĠ ĠR ANGE _ MAP _ ATTRIBUTE _ VERSION , ĊĠĠĠ Ġ/* fixed Size Ġ= Ġ*/ Ġtrue Ġ// Ġdon 't Ġallocate Ġextra Ġspace Ġfor Ġeach Ġrecord Ċ ) Ċ private Ġval ĠMAC RO _ MIX _ HASH _ ATTRIBUTE Ġ= ĠFile Attribute ( ĊĠĠĠ Ġ" org . rust . macro . hash ", ĊĠĠĠĠ 0 , ĊĠĠĠ Ġ/* fixed Size Ġ= Ġ*/ Ġtrue Ċ ) Ċ Ċ private Ġfun ĠVirtual File . write Range Map ( ranges : ĠRange Map ) Ġ{ ĊĠĠĠ Ġcheck Write Access Allowed () ĊĊĠĠĠ ĠR ANGE _ MAP _ ATTRIBUTE . write Attribute ( this ). use Ġ{ ĊĠĠĠĠĠĠĠ Ġranges . writeTo ( it ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( getUser Data ( MACRO _ RANGE _ MAP _ CACHE _ KEY )?. get () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġput UserData ( MACRO _ RANGE _ MAP _ CACHE _ KEY , ĠWeak Reference ( ranges )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠVirtual File . load Range Map (): ĠRange Map ? Ġ{ ĊĠĠĠ Ġcheck Read Access Allowed () ĊĊĠĠĠ Ġget UserData ( MACRO _ RANGE _ MAP _ CACHE _ KEY )?. get ()?. let Ġ{ Ġreturn Ġit Ġ} ĊĊĠĠĠ Ġval Ġdata Ġ= ĠR ANGE _ MAP _ ATTRIBUTE . read Attribute ( this ) Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġval Ġranges Ġ= ĠRange Map . read From ( data ) ĊĠĠĠ Ġput UserData ( MACRO _ RANGE _ MAP _ CACHE _ KEY , ĠWeak Reference ( ranges )) ĊĠĠĠ Ġreturn Ġranges Ċ } Ċ Ċ private Ġfun ĠVirtual File . write Mix Hash ( hash : ĠHash Code ) Ġ{ ĊĠĠĠ Ġcheck Write Access Allowed () ĊĊĠĠĠ ĠMAC RO _ MIX _ HASH _ ATTRIBUTE . write Attribute ( this ). use Ġ{ ĊĠĠĠĠĠĠĠ Ġit . write HashCode ( hash ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠVirtual File . load Mix Hash (): ĠHash Code ? Ġ{ ĊĠĠĠ Ġval Ġdata Ġ= ĠMAC RO _ MIX _ HASH _ ATTRIBUTE . read Attribute ( this ) Ġ?: Ġreturn Ġnull ĊĠĠĠ Ġreturn Ġdata . read HashCode () Ċ } Ċ