/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 0 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . idea . fir . low . level . api . file . builder Ċ Ċ import Ġorg . jetbrains . kotlin . fir . F ir Session Ċ import Ġorg . jetbrains . kotlin . fir . declarations . F ir Class Like Declaration Ċ import Ġorg . jetbrains . kotlin . fir . declarations . F ir Declaration Ċ import Ġorg . jetbrains . kotlin . fir . declarations . F ir File Ċ import Ġorg . jetbrains . kotlin . fir . psi Ċ import Ġorg . jetbrains . kotlin . fir . symbols . Callable Id Ċ import Ġorg . jetbrains . kotlin . fir . symbols . impl . F ir Callable Symbol Ċ import Ġorg . jetbrains . kotlin . name . Class Id Ċ import Ġorg . jetbrains . kotlin . psi . Kt File Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ import Ġjava . util . concurrent . locks . Re entrant Lock Ċ import Ġjava . util . concurrent . locks . Re entrant ReadWrite Lock Ċ import Ġorg . jetbrains . kotlin . idea . fir . low . level . api . annotations . Thread Safe Ċ import Ġkotlin . concurrent . with Lock Ċ Ċ /** Ċ Ġ* ĠCache s Ġmapping Ġ[ Kt File ] Ġ-> Ġ[ F ir File ] Ġof Ġmodule Ġ[ module Info ] Ċ Ġ*/ Ċ @ Thread Safe Ċ internal Ġabstract Ġclass ĠModule File Cache Ġ{ ĊĠĠĠ Ġabstract Ġval Ġsession : ĠF ir Session ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMaps Ġ[ Class Id ] Ġto Ġcorresponding Ġclassifiers ĊĠĠĠĠ Ġ* ĠIf Ġclassifier Ġwith Ġrequired Ġ[ Class Id ] Ġis Ġnot Ġfound Ġin Ġgiven Ġmodule Ġthen Ġmap Ġcontains Ġ[ Optional . EMPTY ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġval Ġclassifier By Class Id : ĠConcurrent HashMap < Class Id , ĠOptional < F ir Class Like Declaration <* >>> ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMaps Ġ[ Callable Id ] Ġto Ġcorresponding Ġcallable ĊĠĠĠĠ Ġ* ĠIf Ġcallable Ġwith Ġrequired Ġ[ Callable Id ]] Ġis Ġnot Ġfound Ġin Ġgiven Ġmodule Ġthen Ġmap Ġcontains Ġempty List ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġval Ġcallable By Callable Id : ĠConcurrent HashMap < Callable Id , ĠList < F ir Callable Symbol <* >>> ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return Ġ[ F ir File ] Ġby Ġ[ file ] Ġif Ġit Ġwas Ġpreviously Ġbuilt Ġor Ġruns Ġ[ create Value ] Ġotherwise ĊĠĠĠĠ Ġ* ĠThe Ġ[ create Value ] Ġis Ġrun Ġunder Ġthe Ġlock Ġso Ġ[ create Value ] Ġis Ġexecuted Ġat Ġmost Ġonce Ġfor Ġeach Ġ[ Kt File ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġfile Cached ( file : ĠK t File , Ġcreate Value : Ġ() Ġ-> ĠF ir File ): ĠF ir File ĊĊĠĠĠ Ġabstract Ġfun Ġget Container F ir File ( declaration : ĠF ir Declaration ): ĠF ir File ? ĊĊĠĠĠ Ġabstract Ġfun Ġget Cached F ir File ( kt File : ĠK t File ): ĠF ir File ? ĊĊĠĠĠ Ġ// Ġtodo Ġmake Ġit ĠRead Write Lock Ġand Ġallow Ġaccess Ġfir Ġelements Ġonly Ġunder Ġread Ġlock ĊĠĠĠ Ġ// Ġfor Ġnow Ġlocks Ġonly Ġheld Ġfor Ġresolve ĊĠĠĠ Ġ// Ġbut Ġthere Ġcan Ġbe Ġa Ġsituation Ġwhen Ġwe Ġare Ġaccessing Ġsome Ġfir Ġelement Ġin Ġone Ġthread Ġwithout Ġlock ĊĠĠĠ Ġ// Ġin Ġthe Ġsame Ġtime Ġother Ġthread Ġperforms Ġresolve Ġof Ġit ĊĠĠĠ Ġ// Ġwhich Ġcan Ġcause Ġweird Ġerrors Ġon Ġuser Ġside ĊĠĠĠ Ġabstract Ġval Ġfir File Lock Provider : ĠLock Provider < F ir File , ĠRe entrant Lock > Ċ } Ċ Ċ internal Ġclass ĠModule File Cache Impl ( override Ġval Ġsession : ĠF ir Session ) Ġ: ĠModule File Cache () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġkt File To F ir File Ġ= ĠConcurrent HashMap < Kt File , ĠF ir File >() ĊĊĠĠĠ Ġoverride Ġval Ġclassifier By Class Id : ĠConcurrent HashMap < Class Id , ĠOptional < F ir Class Like Declaration <* >>> Ġ= ĠConcurrent HashMap () ĊĠĠĠ Ġoverride Ġval Ġcallable By Callable Id : ĠConcurrent HashMap < Callable Id , ĠList < F ir Callable Symbol <* >>> Ġ= ĠConcurrent HashMap () ĊĊĠĠĠ Ġoverride Ġfun Ġfile Cached ( file : ĠK t File , Ġcreate Value : Ġ() Ġ-> ĠF ir File ): ĠF ir File Ġ= ĊĠĠĠĠĠĠĠ Ġkt File To F ir File . compute If Absent ( file ) Ġ{ Ġcreate Value () Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Cached F ir File ( kt File : ĠK t File ): ĠF ir File ? Ġ= Ġkt File To F ir File [ kt File ] ĊĊĠĠĠ Ġoverride Ġfun Ġget Container F ir File ( declaration : ĠF ir Declaration ): ĠF ir File ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkt File Ġ= Ġdeclaration . psi ?. containing File Ġas ? ĠK t File Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġget Cached F ir File ( kt File ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġfir File Lock Provider : ĠLock Provider < F ir File , ĠRe entrant Lock > Ġ= ĠLock Provider Ġ{ ĠRe entrant Lock () Ġ} Ċ } Ċ