/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 9 Ġ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 Ċ Ċ import Ġcom . intellij . openapi . progress . Process Canceled Exception Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . psi . search . Global Search Scope Ċ import Ġorg . jetbrains . kotlin . fir . F ir Session Ċ import Ġorg . jetbrains . kotlin . fir . builder . Raw F ir Builder Ċ import Ġorg . jetbrains . kotlin . fir . declarations . F ir Class Like Declaration Ċ import Ġorg . jetbrains . kotlin . fir . declarations . F ir File Ċ import Ġorg . jetbrains . kotlin . fir . psi Ċ import Ġorg . jetbrains . kotlin . fir . resolve . providers . F ir Provider Ċ import Ġorg . jetbrains . kotlin . fir . resolve . providers . impl . F ir Provider Impl Ċ import Ġorg . jetbrains . kotlin . fir . scopes . F ir Scope Ċ import Ġorg . jetbrains . kotlin . fir . scopes . Kotlin Scope Provider Ċ import Ġorg . jetbrains . kotlin . fir . symbols . impl . F ir Callable Symbol Ċ import Ġorg . jetbrains . kotlin . fir . symbols . impl . F ir Class Like Symbol Ċ import Ġorg . jetbrains . kotlin . idea . stub index .* Ċ import Ġorg . jetbrains . kotlin . name . Class Id Ċ import Ġorg . jetbrains . kotlin . name . Fq Name Ċ import Ġorg . jetbrains . kotlin . name . Name Ċ import Ġorg . jetbrains . kotlin . psi . Kt Element Ċ import Ġorg . jetbrains . kotlin . psi . Kt File Ċ Ċ class ĠF ir Ide Provider ( ĊĠĠĠ Ġval Ġproject : ĠProject , ĊĠĠĠ Ġval Ġscope : ĠGlobal Search Scope , ĊĠĠĠ Ġval Ġsession : ĠF ir Session , ĊĠĠĠ Ġkotlin Scope Provider : ĠKotlin Scope Provider Ċ ) Ġ: ĠF ir Provider () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġcache Provider Ġ= ĠF ir Provider Impl ( session , Ġkotlin Scope Provider ) ĊĊĠĠĠ Ġdata Ġclass ĠF ir File With Stamp ( val Ġfile : ĠF ir File , Ġval Ġstamp : ĠLong ) ĊĊĠĠĠ Ġprivate Ġval Ġfiles Ġ= Ġmutable Map Of < Kt File , ĠF ir File With Stamp >() ĊĊĠĠĠ Ġoverride Ġval Ġis Phase d F ir Allowed : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġtrue ĊĊĠĠĠ Ġoverride Ġfun Ġget F ir Classifier By Fq Name ( class Id : ĠClass Id ): ĠF ir Class Like Declaration < *> ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcache Provider . getF ir Classifier By Fq Name ( class Id ) Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclasses Ġ= ĠKotlin Full ClassName Index . getInstance (). get ( class Id . as Single Fq Name (). asString (), Ġproject , Ġscope ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkt Class Ġ= Ġclasses . first OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Id . package Fq Name Ġ== Ġit . containing Kt File . package Fq Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġreturn Ġnull Ġ// ĠTODO : Ġwhat Ġif Ġtwo Ġof Ġthem ? ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkt File Ġ= Ġkt Class . containing Kt File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Or Build File ( kt File ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache Provider . getF ir Classifier By Fq Name ( class Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠProcess Canceled Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Or Build File ( kt File : ĠK t File ): ĠF ir File Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodification Stamp Ġ= Ġkt File . modification Stamp ĊĠĠĠĠĠĠĠ Ġfiles [ kt File ]?. let Ġ{ Ġ( fir File , Ġstamp ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stamp Ġ== Ġmodification Stamp ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfir File ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsynchronized ( kt File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfile With Stamp Ġ= Ġfiles [ kt File ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file With Stamp Ġ!= Ġnull Ġ&& Ġfile With Stamp . stamp Ġ== Ġmodification Stamp ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile With Stamp . file ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠRaw F ir Builder ( session , Ġcache Provider . kotlin Scope Provider , Ġstub Mode Ġ= Ġfalse ). build F ir File ( kt File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache Provider . record File ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile With Stamp Ġ= ĠF ir File With Stamp ( file , Ġmodification Stamp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles [ kt File ] Ġ= Ġfile With Stamp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetFile ( kt File : ĠK t File ): ĠF ir File ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( fir File , Ġstamp ) Ġ= Ġfiles [ kt File ] Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( stamp Ġ== Ġkt File . modification Stamp ) Ġreturn Ġfir File ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetClass Like Symbol By Fq Name ( class Id : ĠClass Id ): ĠF ir Class Like Symbol < *> ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget F ir Classifier By Fq Name ( class Id )?. symbol ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget TopLevel Callable Symbols ( package Fq Name : ĠF q Name , Ġname : ĠName ): ĠList < F ir Callable Symbol <* >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpackage Prefix Ġ= Ġif Ġ( package Fq Name . is Root ) Ġ"" Ġelse Ġ"$ package Fq Name ." ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtop Level Functions Ġ= ĠKotlin TopLevel Function F qn Name Index . getInstance ()[" $ package Prefix $ name ", Ġproject , Ġscope ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtop Level Properties Ġ= ĠKotlin TopLevel Property F qn Name Index . getInstance ()[" $ package Prefix $ name ", Ġproject , Ġscope ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop Level Functions . forEach Ġ{ Ġget Or Build File ( it . containing Kt File ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtop Level Properties . forEach Ġ{ Ġget Or Build File ( it . containing Kt File ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache Provider . get TopLevel Callable Symbols ( package Fq Name , Ġname ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠProcess Canceled Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget F ir Classifier Container File ( fq Name : ĠClass Id ): ĠF ir File Ġ{ ĊĠĠĠĠĠĠĠ Ġget F ir Classifier By Fq Name ( fq Name ) Ġ// ĠNe cessary Ġto Ġensure Ġcache Provider Ġcontains Ġthis Ġclassifier ĊĠĠĠĠĠĠĠ Ġreturn Ġcache Provider . getF ir Classifier Container File ( fq Name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget F ir Classifier Container File If Any ( fq Name : ĠClass Id ): ĠF ir File ? Ġ{ ĊĠĠĠĠĠĠĠ Ġget F ir Classifier By Fq Name ( fq Name ) Ġ// ĠNe cessary Ġto Ġensure Ġcache Provider Ġcontains Ġthis Ġclassifier ĊĠĠĠĠĠĠĠ Ġreturn Ġcache Provider . getF ir Classifier Container File If Any ( fq Name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget F ir Classifier Container File ( symbol : ĠF ir Class Like Symbol < *> ): ĠF ir File Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget F ir Classifier Container File If Any ( symbol ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġerror (" Couldn 't Ġfind Ġcontainer Ġfor Ġ${ symbol . class Id }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget F ir Classifier Container File If Any ( symbol : ĠF ir Class Like Symbol < *> ): ĠF ir File ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpsi Ġ= Ġsymbol . fir . source ?. psi ĊĠĠĠĠĠĠĠ Ġif Ġ( psi Ġis ĠK t Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkt File Ġ= Ġpsi . containing Kt File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Or Build File ( kt File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠProcess Canceled Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġget F ir Classifier Container File If Any ( symbol . class Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget F ir Callable Container File ( symbol : ĠF ir Callable Symbol < *> ): ĠF ir File ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcache Provider . getF ir Callable Container File ( symbol ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget F ir Files By Package ( fq Name : ĠF q Name ): ĠList < F ir File > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= ĠKotlin Exact Packages Index . getInstance ()[ fq Name . asString (), Ġproject , Ġscope ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfiles . forEach Ġ{ Ġget Or Build File ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache Provider . getF ir Files By Package ( fq Name ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠProcess Canceled Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Nested Classifier Scope ( class Id : ĠClass Id ): ĠF ir Scope ? Ġ{ ĊĠĠĠĠĠĠĠ Ġget F ir Classifier By Fq Name ( class Id ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcache Provider . get Nested Classifier Scope ( class Id ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ val ĠF ir Session . fir Ide Provider : ĠF ir Ide Provider Ġby ĠF ir Session . session Component Accessor ()