package Ġcom . a em tools . completion . client lib . provider Ċ Ċ import Ġcom . a em tools . common . completion . lookup Element Ċ import Ġcom . a em tools . common . util .* Ċ import Ġcom . a em tools . index . Client lib Declaration Index Facade Ċ import Ġcom . a em tools . lang . client lib . Cd Language Ċ import Ġcom . a em tools . lang . client lib . psi . Cd BasePath Ċ import Ġcom . a em tools . lang . client lib . psi . Cd Include Ċ import Ġcom . a em tools . lang . client lib . psi . Cd Psi File Ċ import Ġcom . a em tools . lang . util . basePath Element Ċ import Ġcom . intellij . code Insight . completion . Completion Parameters Ċ import Ġcom . intellij . code Insight . completion . Completion Provider Ċ import Ġcom . intellij . code Insight . completion . Completion ResultSet Ċ import Ġcom . intellij . openapi . project . D umb Aware Ċ import Ġcom . intellij . openapi . vfs . Virtual File Ċ import Ġcom . intellij . psi . Psi Directory Ċ import Ġcom . intellij . psi . Psi File Ċ import Ġcom . intellij . util . Processing Context Ċ import Ġjavax . swing . Icon Ċ Ċ /** Ċ Ġ* Ġ@ author ĠD my tro ĠPrim sh y ts Ċ Ġ*/ Ċ object ĠClient lib Declaration Include Completion Provider Ġ: ĠCompletion Provider < Completion Parameters >(), ĠD umb Aware Ġ{ ĊĠ Ġoverride Ġfun Ġadd Comp letions ( ĊĠĠĠĠĠ Ġparameters : ĠCompletion Parameters , ĊĠĠĠĠĠ Ġcontext : ĠProcessing Context , ĊĠĠĠĠĠ Ġresult : ĠCompletion ResultSet ) Ġ{ ĊĠĠĠ Ġif Ġ( result . is Stopped ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġcurrent Element Ġ= Ġparameters . position . find Parent ByType ( Cd Include :: class . java ) ĊĠĠĠĠĠĠĠ Ġ?: Ġreturn ĊĠĠĠ Ġval ĠbasePath Ġ= Ġcurrent Element . basePath Element ()?. include ?. text ĊĠĠĠ Ġval Ġstart Dir Ġ= Ġfind Start Directory ( parameters . original File , ĠbasePath ) ĊĠĠĠĠĠĠĠ Ġ?: Ġreturn ĊĊĠĠĠ Ġval Ġraw Variants Ġ= Ġcollect Raw Variants ( parameters , Ġstart Dir , ĠbasePath ) ĊĊĠĠĠ Ġval Ġfile Ġ= Ġparameters . original File . get Psi ( Cd Language ) Ġas ? ĠC d Psi File ĊĠĠĠĠĠĠĠ Ġ?: Ġreturn ĊĊĠĠĠ Ġval Ġpresent Variants Ġ= Ġextract Present Variants ( file ) ĊĊĠĠĠ Ġval Ġfiltered Variants Ġ= Ġraw Variants . filter Not Ġ{ ĊĠĠĠĠĠ Ġpresent Variants . any Ġ{ Ġpresent Ġ-> Ġpresent . real Path Ġ== Ġit . real Path Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġresult . addAll Elements ( filtered Variants . map Ġ{ ĊĠĠĠĠĠ Ġlookup Element ( it . relative Path ) ĊĠĠĠĠĠĠĠĠĠ Ġ. with Icon ( it . icon ) ĊĠĠĠ Ġ}) ĊĠĠĠ Ġresult . stop Here () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġextract Present Variants ( cd File : ĠC d Psi File ): ĠCollection < Cd Import > Ġ{ ĊĠĠĠ Ġval Ġelements Ġ= Ġcd File . children . filter Ġ{ ĊĠĠĠĠĠ Ġit Ġis ĠC d BasePath ĊĠĠĠĠĠĠĠĠĠ Ġ|| Ġit Ġis ĠC d Include ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġreal Path : ĠString Ġ= Ġcd File . containing Directory ĊĠĠĠĠĠĠĠ Ġ? . virtual File ĊĠĠĠĠĠĠĠ Ġ? . path ĊĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġempty List () ĊĊĠĠĠ Ġval Ġresult : ĠArrayList < Cd Import > Ġ= ĠArrayList () ĊĠĠĠ Ġvar Ġcurrent BasePath : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġelements . forEach Ġ{ ĊĠĠĠĠĠ Ġif Ġ( it Ġis ĠC d BasePath ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent BasePath Ġ= Ġfind Start Directory ( cd File , Ġit . include ?. text )?. virtual File ?. path ĊĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( it Ġis ĠC d Include ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( current BasePath Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġresult . add ( Cd Import ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreal Path Ġ= Ġ"$ real Path /${ it . text }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelative Path Ġ= Ġit . text ĊĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġresult . add ( Cd Import ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreal Path Ġ= Ġ"$ current BasePath /${ it . text }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelative Path Ġ= Ġit . text , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠbasePath Ġ= Ġcurrent BasePath ĊĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġresult ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcollect Raw Variants ( parameters : ĠCompletion Parameters , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Dir : ĠPsi Directory , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠbasePath : ĠString ?): ĠList < Cd Import > Ġ{ ĊĠĠĠ Ġval Ġcurrent File Ġ= Ġparameters . original File ĊĊĠĠĠ Ġfun Ġvariants Collector ( dir : ĠPsi Directory ): ĠList < Cd Import > Ġ{ ĊĠĠĠĠĠ Ġval Ġresult Ġ= ĠArrayList < Cd Import >() ĊĠĠĠĠĠ Ġdir . files . filter Ġ{ ĊĠĠĠĠĠĠĠ ĠClient lib Declaration Index Facade . is Matched By Extension ( it , Ġcurrent File . name ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( Cd Import ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . virtual File . path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . virtual File . path . relative To ( start Dir . virtual File . path ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠbasePath , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . virtual File . to Psi File ( parameters . position . project )?. get Icon ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġresult . addAll ( dir . sub directories . flatMap (:: variants Collector )) ĊĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġvariants Collector ( start Dir ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġfind Start Directory ( current File : ĠPsi File , ĠbasePath : ĠString ?): ĠPsi Directory ? Ġ{ ĊĠĠĠ Ġif Ġ( basePath Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġcurrent File . containing Directory ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( is AbsolutePath ( basePath )) Ġ{ ĊĠĠĠĠĠ Ġreturn Ġget Absolute DirectoryPath ( current File , ĠbasePath )?. to Psi Directory ( current File . project ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġget Relative DirectoryPath ( basePath , Ġcurrent File ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Relative DirectoryPath ( basePath : ĠString , Ġcurrent File : ĠPsi File ): ĠPsi Directory ? Ġ{ ĊĠĠĠ Ġvar Ġresult : ĠPsi Directory ? Ġ= Ġcurrent File . containing Directory ĊĠĠĠ Ġval Ġparts Ġ= ĠbasePath . split ("\\ ", Ġ"/") ĊĊĠĠĠ Ġparts . forEach Ġ{ ĊĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ".. " Ġ-> Ġresult Ġ= Ġresult ?. parent Directory ĊĠĠĠĠĠĠĠ Ġ"." Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġresult Ġ= Ġresult ?. sub directories ?. find Ġ{ Ġsubdirectory Ġ-> Ġsubdirectory . name Ġ== Ġit Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġresult ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġget Absolute DirectoryPath ( file : ĠPsi File , ĠbasePath : ĠString ): ĠVirtual File ? Ġ{ ĊĠĠĠ Ġreturn ĠClient lib Declaration Index Facade . findAll Typed Files ( file ) ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ ĠPair ( it . parent , Ġit . parent . path . normalize To J cr Root ()) Ġ} ĊĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . second . startsWith ( basePath ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. min By OrNull Ġ{ Ġit . second . replace First ( basePath , Ġ""). split ("/ "). size Ġ} ĊĠĠĠĠĠĠĠ Ġ? . let Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġvar Ġdirectory Ġ= Ġit . first ĊĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( directory . path . normalize To J cr Root () Ġ!= ĠbasePath ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdirectory Ġ= Ġdirectory . parent ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġreturn Ġdirectory ĊĠĠĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġis AbsolutePath ( basePath : ĠString ) Ġ= ĠbasePath . startsWith ("/") ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠFile Ġimport Ġdata Ġclass . ĊĠĠ Ġ*/ ĊĠ Ġdata Ġclass ĠC d Import ( ĊĠĠĠĠĠ Ġval Ġreal Path : ĠString , ĊĠĠĠĠĠ Ġval Ġrelative Path : ĠString , ĊĠĠĠĠĠ Ġval ĠbasePath : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠ Ġval Ġicon : ĠIcon ? Ġ= Ġnull ) Ċ Ċ } Ċ