package Ġorg . jetbrains . dok ka Ċ Ċ import Ġcom . google . inject . Inject Ċ import Ġcom . google . inject . Singleton Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . Psi Method Ċ import Ġcom . intellij . util . io .* Ċ import Ġorg . jetbrains . dok ka . Formats . File Generator Based Format Descriptor Ċ import Ġorg . jetbrains . dok ka . Formats . Format Descriptor Ċ import Ġorg . jetbrains . dok ka . Utilities . Service Locator Ċ import Ġorg . jetbrains . dok ka . Utilities . lookup Ċ import Ġorg . jetbrains . kotlin . descriptors .* Ċ import Ġorg . jetbrains . kotlin . descriptors . impl . Enum Entry Synt hetic Class Descriptor Ċ import Ġorg . jetbrains . kotlin . load . java . descriptors .* Ċ import Ġorg . jetbrains . kotlin . name . Fq Name Ċ import Ġorg . jetbrains . kotlin . resolve . Descriptor Utils Ċ import Ġorg . jetbrains . kotlin . resolve . descriptor Util . fq Name Safe Ċ import Ġorg . jetbrains . kotlin . resolve . descriptor Util . parents Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . io . PrintWriter Ċ import Ġjava . net . Http URLConnection Ċ import Ġjava . net . URL Ċ import Ġjava . net . URLConnection Ċ import Ġjava . nio . file . Path Ċ import Ġjava . nio . file . Paths Ċ import Ġjava . security . Message Digest Ċ import Ġjavax . inject . Named Ċ import Ġkotlin . reflect . full . find Annotation Ċ Ċ fun ĠByteArray . to HexString () Ġ= Ġthis . join ToString ( separator Ġ= Ġ"") Ġ{ Ġ"% 0 2 x ". format ( it ) Ġ} Ċ Ċ type alias ĠPackage Fq Name To Location Ġ= ĠMutable Map < Fq Name , ĠPackage List Provider . External Documentation Root > Ċ Ċ @ Singleton Ċ class ĠPackage List Provider Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġval Ġconfiguration : ĠD ok ka Configuration , ĊĠĠĠ Ġval Ġlogger : ĠD ok ka Logger Ċ ) Ġ{ ĊĠĠĠ Ġval Ġstorage Ġ= Ġmutable Map Of < D ok ka Configuration . External Documentation Link , ĠPackage Fq Name To Location >() ĊĊĠĠĠ Ġval Ġcache Dir : ĠPath ? Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġconfiguration . cache Root Ġ== Ġ" default " Ġ-> ĠPaths . get ( System . getProperty (" user . home "), Ġ". cache ", Ġ" dok ka ") ĊĠĠĠĠĠĠĠ Ġconfiguration . cache Root Ġ!= Ġnull Ġ-> ĠPaths . get ( configuration . cache Root ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠ Ġ} ?. resolve (" package List Cache ") ?. apply Ġ{ Ġcreate Directories () Ġ} ĊĊĠĠĠ Ġval Ġcached Protocols Ġ= Ġset Of (" http ", Ġ" https ", Ġ" ftp ") ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( conf Ġin Ġconfiguration . passes Configurations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( link Ġin Ġconf . external Documentation Links ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( link Ġin Ġstorage ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload Package List ( link ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Exception Ġwhile Ġloading Ġpackage - list Ġfrom Ġ$ link ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġfun ĠURL . do Open Connection To Read Content ( timeout : ĠInt Ġ= Ġ 1 0 0 0 0 , Ġredirects Allowed : ĠInt Ġ= Ġ 1 6 ): ĠURL Connection Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= Ġthis . open Connection () ĊĠĠĠĠĠĠĠ Ġconnection . connect Timeout Ġ= Ġtimeout ĊĠĠĠĠĠĠĠ Ġconnection . read Timeout Ġ= Ġtimeout ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( connection ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠHttp URLConnection Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( connection . response Code ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Ġ 2 0 0 .. 2 9 9 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttp URLConnection . HTTP _ MOVED _ PERM , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttp URLConnection . HTTP _ MOVED _ TEMP , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttp URLConnection . HTTP _ SE E _ OTHER Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( redirects Allowed Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Url Ġ= Ġconnection . getHeader Field (" Location ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠURL ( new Url ). do Open Connection To Read Content ( timeout , Ġredirects Allowed Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Too Ġmany Ġredirects ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Unhandled Ġhttp Ġcode : Ġ${ connection . response Code }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn Ġconnection ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġload Package List ( link : ĠD ok ka Configuration . External Documentation Link ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġpackage List Url Ġ= Ġlink . package List Url ĊĠĠĠĠĠĠĠ Ġval Ġneeds Cache Ġ= Ġpackage List Url . protocol Ġin Ġcached Protocols ĊĊĠĠĠĠĠĠĠ Ġval Ġpackage List Stream Ġ= Ġif Ġ( cacheDir Ġ!= Ġnull Ġ&& Ġneeds Cache ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpackage List Link Ġ= Ġpackage List Url . to External Form () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdigest Ġ= ĠMessage Digest . getInstance (" SHA - 2 5 6 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhash Ġ= Ġdigest . digest ( package List Link . toByteArray ( Charsets . UTF _ 8 )). to HexString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcache Entry Ġ= Ġcache Dir . resolve ( hash ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cache Entry . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= Ġpackage List Url . do Open Connection To Read Content () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorigin ModifiedDate Ġ= Ġconnection . date ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcache Date Ġ= Ġcache Entry . lastModified (). to Millis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( origin ModifiedDate Ġ> Ġcache Date Ġ|| Ġorigin ModifiedDate Ġ== Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( origin ModifiedDate Ġ== Ġ 0 L ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" No Ġdate Ġheader Ġfor Ġ$ package List Url , Ġdownloading Ġanyway ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Renew ing Ġpackage - list Ġfrom Ġ$ package List Url ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . getInputStream (). copy To ( cache Entry . output Stream ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Failed Ġto Ġupdate Ġpackage - list Ġcache Ġfor Ġ$ link ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġba os Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPrintWriter ( ba os ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġba os . flush () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( ba os . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Downloading Ġpackage - list Ġfrom Ġ$ package List Url ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackage List Url . open Stream (). copy To ( cache Entry . output Stream ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache Entry . inputStream () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpackage List Url . do Open Connection To Read Content (). getInputStream () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġ( params , Ġpackages ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpackage List Stream ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. buffered Reader () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. use Lines Ġ{ Ġlines Ġ-> Ġlines . partition Ġ{ Ġit . startsWith ( External Documentation Link Resolver . DO K KA _ PARAM _ PREFIX ) Ġ} Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġparams Map Ġ= Ġparams . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . remove Prefix ( External Documentation Link Resolver . DO K KA _ PARAM _ PREFIX ). split (" :", Ġlimit Ġ= Ġ 2 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. groupBy ({ Ġ( key , Ġ_) Ġ-> Ġkey Ġ}, Ġ{ Ġ(_, Ġvalue ) Ġ-> Ġvalue Ġ}) ĊĊĠĠĠĠĠĠĠ Ġval Ġformat Ġ= Ġparams Map [" format "] ?. single OrNull () Ġ?: Ġ" javadoc " ĊĊĠĠĠĠĠĠĠ Ġval Ġlocations Ġ= Ġparams Map [" location "]. or Empty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . split ("\ u 0 0 1 f ", Ġlimit Ġ= Ġ 2 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( key , Ġvalue ) Ġ-> Ġkey Ġto Ġvalue Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toMap () ĊĊĊĠĠĠĠĠĠĠ Ġval Ġdefault Resolver Desc Ġ= ĠExternal Documentation Link Resolver . services . getValue (" dok ka - default ") ĊĠĠĠĠĠĠĠ Ġval Ġresolver Desc Ġ= ĠExternal Documentation Link Resolver . services [ format ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġdefault Resolver Desc . take If Ġ{ Ġformat Ġin Ġformat sWith Default Resolver Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġdefault Resolver Desc . also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Couldn 't Ġfind ĠIn bound External Link Resolution Service ( format Ġ= Ġ`$ format `) Ġfor Ġ$ link , Ġusing ĠD ok ka Ġdefault ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġval Ġresolver Class Ġ= Ġjava Class . class Loader . load Class ( resolver Desc . className ). kotlin ĊĊĠĠĠĠĠĠĠ Ġval Ġconstructors Ġ= Ġresolver Class . construct ors ĊĊĠĠĠĠĠĠĠ Ġval Ġconstructor Ġ= Ġconstructors . single OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġconstructors . first Ġ{ Ġit . find Annotation < Inject >() Ġ!= Ġnull Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġresolver Ġ= Ġconstructor . call ( params Map ) Ġas ĠIn bound External Link Resolution Service ĊĊĠĠĠĠĠĠĠ Ġval Ġroot Info Ġ= ĠExternal Documentation Root ( link . url , Ġresolver , Ġlocations ) ĊĊĠĠĠĠĠĠĠ Ġval Ġpackage Fq Name To Location Ġ= Ġmutable Map Of < Fq Name , ĠExternal Documentation Root >() ĊĠĠĠĠĠĠĠ Ġstorage [ link ] Ġ= Ġpackage Fq Name To Location ĊĊĠĠĠĠĠĠĠ Ġval Ġfq Names Ġ= Ġpackages . map Ġ{ ĠF q Name ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġfor ( name Ġin Ġfq Names ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Fq Name To Location [ name ] Ġ= Ġroot Info ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġclass ĠExternal Documentation Root ( val Ġroot Url : ĠURL , Ġval Ġresolver : ĠIn bound External Link Resolution Service , Ġval Ġlocations : ĠMap < String , ĠString >) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġroot Url . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġformat sWith Default Resolver Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠService Locator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. all Services (" format ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdesc Ġ= ĠService Locator . lookup < Format Descriptor >( it ) Ġas ? ĠFile Generator Based Format Descriptor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdesc ?. generator Service Class Ġ== ĠFile Generator :: class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. map Ġ{ Ġit . name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ class ĠExternal Documentation Link Resolver Ġ@ Inject Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġval Ġconfiguration : ĠD ok ka Configuration , ĊĠĠĠĠĠĠĠ Ġval Ġpass Configuration : ĠD ok ka Configuration . Pass Configuration , ĊĠĠĠĠĠĠĠ Ġ@ Named (" library Resolution Facade ") Ġval Ġlibrary Resolution Facade : ĠD ok ka Resolution Facade , ĊĠĠĠĠĠĠĠ Ġval Ġlogger : ĠD ok ka Logger , ĊĠĠĠĠĠĠĠ Ġval Ġpackage List Provider : ĠPackage List Provider Ċ ) Ġ{ ĊĊĠĠĠ Ġval Ġformats Ġ= Ġmutable Map Of < String , ĠIn bound External Link Resolution Service >() ĊĠĠĠ Ġval Ġpackage Fq Name To Location Ġ= Ġmutable Map Of < Fq Name , ĠPackage List Provider . External Documentation Root >() ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfq Name To Location Maps Ġ= Ġpass Configuration . external Documentation Links ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġpackage List Provider . storage [ it ] Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor ( map Ġin Ġfq Name To Location Maps ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠ Ġpackage Fq Name To Location . put All ( map ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild External Documentation Link ( element : ĠPsi Element ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġelement . extract Descriptor ( library Resolution Facade )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild External Documentation Link ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild External Documentation Link ( symbol : ĠDeclaration Descriptor ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpackage Fq Name : ĠF q Name Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( symbol ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPackage Fragment Descriptor Ġ-> Ġsymbol . fq Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDeclaration Descriptor Non Root Ġ-> Ġsymbol . parents . first OrNull Ġ{ Ġit Ġis ĠPackage Fragment Descriptor Ġ} ?. fq Name Safe Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġexternal Location Ġ= Ġpackage Fq Name To Location [ package Fq Name ] Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġexternal Location . locations [ symbol . signature ()] Ġ?: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexternal Location . resolver . getPath ( symbol ) Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġreturn ĠURL ( external Location . root Url , Ġpath ). to External Form () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠD OK KA _ PARAM _ PREFIX Ġ= Ġ"\ $ dok ka ." ĊĠĠĠĠĠĠĠ Ġval Ġservices Ġ= ĠService Locator . all Services (" inbound - link - resolver "). associate By Ġ{ Ġit . name Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ interface ĠIn bound External Link Resolution Service Ġ{ ĊĠĠĠ Ġfun ĠgetPath ( symbol : ĠDeclaration Descriptor ): ĠString ? ĊĊĠĠĠ Ġclass ĠJ avadoc ( params Map : ĠMap < String , ĠList < String >>) Ġ: ĠIn bound External Link Resolution Service Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetPath ( symbol : ĠDeclaration Descriptor ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( symbol Ġis ĠEnum Entry Synt hetic Class Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠgetPath ( symbol . containing Declaration )?. let Ġ{ Ġit Ġ+ Ġ"#" Ġ+ Ġsymbol . name . asString () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( symbol Ġis ĠJava Class Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDescriptor Utils . getF q Name ( symbol ). asString (). replace (".", Ġ"/") Ġ+ Ġ". html " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( symbol Ġis ĠJava Callable Member Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontaining Class Ġ= Ġsymbol . containing Declaration Ġas ? ĠJava Class Descriptor Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontaining Class Link Ġ= ĠgetPath ( containing Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( containing Class Link Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( symbol Ġis ĠJava MethodDescriptor Ġ|| Ġsymbol Ġis ĠJava Class Constructor Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpsi Ġ= Ġsymbol . source Psi () Ġas ? ĠPsi Method ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( psi Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġpsi . parameter List . parameters . join ToString Ġ{ Ġit . type . canonical Text Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcontaining Class Link Ġ+ Ġ"#" Ġ+ Ġsymbol . name Ġ+ Ġ"(" Ġ+ Ġparams Ġ+ Ġ")" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( symbol Ġis ĠJava Property Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"$ containing Class Link # ${ symbol . name }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO ĠKotlin Ġjavadoc ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠD ok ka ( val Ġparams Map : ĠMap < String , ĠList < String >>) Ġ: ĠIn bound External Link Resolution Service Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġextension Ġ= Ġparams Map [" link Extension "] ?. single OrNull () Ġ?: Ġerror (" link Extension Ġnot Ġprovided Ġfor ĠD ok ka Ġresolver ") ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetPath ( symbol : ĠDeclaration Descriptor ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleaf Element Ġ= Ġwhen Ġ( symbol ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCallable Descriptor , Ġis ĠType Alias Descriptor Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= ĠgetPath Without Extension ( symbol ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( leaf Element ) Ġreturn Ġ"$ path .$ extension " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġreturn Ġ"$ path / index .$ extension " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠgetPath Without Extension ( symbol : ĠDeclaration Descriptor ): ĠString Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol . containing Declaration Ġ== Ġnull Ġ-> Ġidentifier To Filename ( symbol . name . asString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Ġis ĠPackage Fragment Descriptor Ġ-> Ġidentifier To Filename ( symbol . fq Name . asString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠgetPath Without Extension ( symbol . containing Declaration !! ) Ġ+ Ġ'/' Ġ+ Ġidentifier To Filename ( symbol . name . asString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} Ċ } ĊĊ