package Ġio . kan ro . idea . plugin . protobuf . lang . file Ċ Ċ import Ġcom . intellij . openapi . module . Module Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . util . Key Ċ import Ġcom . intellij . openapi . vfs . V fs Util Core Ċ import Ġcom . intellij . openapi . vfs . Virtual File Ċ import Ġcom . intellij . openapi . vfs . new vfs . Archive FileSystem Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . search . Global Search Scope Ċ import Ġio . kan ro . idea . plugin . protobuf . lang . Protobuf FileType Ċ Ċ abstract Ġclass ĠRoot s File Resolver Ġ: ĠFile Resolver Ġ{ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġget Roots ( project : ĠProject , Ġelement : ĠPsi Element ): ĠIterable < Virtual File > ĊĊĠĠĠ Ġprotected Ġabstract Ġfun Ġget Roots ( module : ĠModule , Ġelement : ĠPsi Element ): ĠIterable < Virtual File > ĊĊĠĠĠ Ġoverride Ġfun Ġsearch Scope ( project : ĠProject , Ġelement : ĠPsi Element ): ĠGlobal Search Scope Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠGlobal Search Scope . files Scope ( project , Ġget Roots ( project , Ġelement ). toList ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsearch Scope ( module : ĠModule , Ġelement : ĠPsi Element ): ĠGlobal Search Scope Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠGlobal Search Scope . files Scope ( module . project , Ġget Roots ( module , Ġelement ). toList ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Import Path ( file : ĠVirtual File , Ġproject : ĠProject , Ġelement : ĠPsi Element ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġget Roots ( project , Ġelement ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠV fs Util Core . get RelativePath ( file , Ġit )?. let Ġ{ Ġreturn Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Import Path ( file : ĠVirtual File , Ġmodule : ĠModule , Ġelement : ĠPsi Element ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġget Roots ( module , Ġelement ). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠV fs Util Core . get RelativePath ( file , Ġit )?. let Ġ{ Ġreturn Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind File ( path : ĠString , Ġproject : ĠProject , Ġelement : ĠPsi Element ): ĠIterable < Virtual File > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfind File ( path , Ġget Roots ( project , Ġelement )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind File ( path : ĠString , Ġmodule : ĠModule , Ġelement : ĠPsi Element ): ĠIterable < Virtual File > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfind File ( path , Ġget Roots ( module , Ġelement )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcollect Protobuf ( path : ĠString , Ġproject : ĠProject , Ġelement : ĠPsi Element ): ĠIterable < Virtual File > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcollect Protobuf ( path , Ġproject , Ġget Roots ( project , Ġelement )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcollect Protobuf ( path : ĠString , Ġmodule : ĠModule , Ġelement : ĠPsi Element ): ĠIterable < Virtual File > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcollect Protobuf ( path , Ġmodule . project , Ġget Roots ( module , Ġelement )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġfind File ( path : ĠString , Ġroots : ĠIterable < Virtual File >): ĠIterable < Virtual File > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġroots . map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . find File By RelativePath ( path )?. take If Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . exists () Ġ&& Ġit . fileType Ġis ĠProtobuf FileType ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġopen Ġfun Ġcollect Protobuf ( ĊĠĠĠĠĠĠĠ Ġpath : ĠString , ĊĠĠĠĠĠĠĠ Ġproject : ĠProject , ĊĠĠĠĠĠĠĠ Ġroots : ĠIterable < Virtual File > ĊĠĠĠ Ġ): ĠIterable < Virtual File > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġmutable ListOf < Virtual File >() ĊĠĠĠĠĠĠĠ Ġroots . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! check Root Contains Protobuf File ( it )) Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdirectory Ġ= Ġit . find File By RelativePath ( path ) Ġ?: Ġreturn @ forEach ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! directory . isDirectory ) Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( child Ġin Ġdirectory . children ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child . isDirectory Ġ&& Ġcheck Directory Contains Protobuf File ( child )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ+= Ġchild ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( child . fileType Ġis ĠProtobuf FileType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ+= Ġchild ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Root Contains Protobuf File ( root : ĠVirtual File ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ( root . file System Ġas ? ĠArchive FileSystem )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjar File Ġ= Ġit . getLocal By Entry ( root ) Ġ?: Ġreturn @ let ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsynchronized ( jar File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexisting Ġ= Ġjar File . getUser Data ( Cached Jar Proto Scan Result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjar Root Ġ= Ġit . getRoot By Entry ( jar File ) Ġ?: Ġreturn @ let ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( existing ?. version Ġ== Ġjar File . modification Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġexisting . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcache Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCached Jar Proto Scan Result ( jar File . modification Count , Ġcheck Directory Contains Protobuf File ( jar Root )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjar File . put UserData ( Cached Jar Proto Scan Result , Ġcache ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcache . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcheck Directory Contains Protobuf File ( root ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠCached Jar Proto Scan Result ( val Ġversion : ĠLong , Ġval Ġvalue : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ: ĠKey < Cached Jar Proto Scan Result >( Cached Jar Proto Scan Result :: class . java . name ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Directory Contains Protobuf File ( file : ĠVirtual File ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( child Ġin Ġfile . children ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( check Directory Contains Protobuf File ( child )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( child . fileType Ġis ĠProtobuf FileType ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} Ċ } Ċ