package Ġorg . jav acs . kt . external sources Ċ Ċ import Ġorg . jav acs . kt . Compiler Class Path Ċ import Ġorg . jav acs . kt . External Sources Configuration Ċ import Ġorg . jav acs . kt . LOG Ċ import Ġorg . jav acs . kt . util . describe URI Ċ import Ġorg . jav acs . kt . util . Kotlin LS Exception Ċ import Ġorg . jav acs . kt . util . Temporary Directory Ċ import Ġorg . jav acs . kt . j 2 k . convert Java To Kotlin Ċ import Ġjava . io . BufferedReader Ċ import Ġjava . io . FileNotFoundException Ċ import Ġjava . nio . file . Files Ċ import Ġjava . util . Linked HashMap Ċ Ċ /** Ċ Ġ* ĠProvides Ġthe Ġsource Ġcode Ġfor Ġclasses Ġlocated Ġinside Ċ Ġ* Ġcompiled Ġor Ġsource ĠJ AR s . Ċ Ġ*/ Ċ class ĠJar Class Content Provider ( ĊĠĠĠ Ġprivate Ġval Ġconfig : ĠExternal Sources Configuration , ĊĠĠĠ Ġprivate Ġval Ġcp : ĠCompiler Class Path , ĊĠĠĠ Ġprivate Ġval Ġtemp Dir : ĠTemporary Directory , ĊĠĠĠ Ġprivate Ġval Ġsource Jar Provider : ĠSource Jar Provider , ĊĠĠĠ Ġprivate Ġval Ġde compiler : ĠDe compiler Ġ= ĠF ern flower De compiler () Ċ ) Ġ{ ĊĠĠĠ Ġ/** ĠMaps Ġrecently Ġused Ġ( source -) K LS - UR Is Ġto Ġtheir Ġsource Ġcontents Ġ( e . g . Ġde compiled Ġcode ) Ġand Ġthe Ġfile Ġextension . Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġcached Contents Ġ= Ġobject Ġ: ĠLinkedHashMap < String , ĠPair < String , ĠString >>() Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġremove El dest Entry ( el dest : ĠMutable Map . Mutable Entry < String , ĠPair < String , ĠString >>) Ġ= Ġsize Ġ> Ġ 5 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠF etches Ġthe Ġcontents Ġof Ġa Ġcompiled Ġclass / source Ġfile Ġin Ġa ĠJ AR ĊĠĠĠĠ Ġ* Ġand Ġanother ĠURI Ġwhich Ġcan Ġbe Ġused Ġto Ġrefer Ġto Ġthese Ġextracted ĊĠĠĠĠ Ġ* Ġcontents . ĊĠĠĠĠ Ġ* ĠIf Ġthe Ġfile Ġis Ġinside Ġa Ġsource ĠJ AR , Ġthe Ġsource Ġcode Ġis Ġreturned Ġas Ġis . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġfun Ġcontent Of ( uri : ĠK ls URI ): ĠPair < K ls URI , ĠString > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresolved Uri Ġ= Ġsource Jar Provider . fetch Source Jar ( uri . jar Path )?. let ( uri . with Source ( true ):: with Jar Path ) Ġ?: Ġuri ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġresolved Uri . toString () ĊĠĠĠĠĠĠĠ Ġval Ġ( contents , Ġextension ) Ġ= Ġcached Contents [ key ] Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" Finding Ġcontents Ġof Ġ{}", Ġdescribe URI ( uri . file Uri )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Read Content Of ( resolved Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġtry Read Content Of ( resolved Uri . with File Extension (" class ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġtry Read Content Of ( resolved Uri . with File Extension (" java ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġtry Read Content Of ( resolved Uri . with File Extension (" kt ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠKotlin LS Exception (" Could Ġnot Ġfind Ġ$ uri ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. also Ġ{ Ġcached Contents [ key ] Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsource Uri Ġ= Ġresolved Uri . with File Extension ( extension ) ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( source Uri , Ġcontents ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠconvertTo Kotlin IfNeeded ( java Code : ĠString ): ĠString Ġ= Ġif Ġ( config . auto ConvertTo Kotlin ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconvert Java To Kotlin ( java Code , Ġcp . compiler ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġjava Code ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtry Read Content Of ( uri : ĠK ls URI ): ĠPair < String , ĠString >? Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( uri . file Extension ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" class " Ġ-> ĠPair ( uri . extract To Temporary File ( temp Dir ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let ( de compiler :: de compile Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let Ġ{ ĠFiles . new InputStream ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. buffered Reader () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. use ( BufferedReader :: read Text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. let ( this :: convertTo Kotlin IfNeeded ), Ġif Ġ( config . auto ConvertTo Kotlin ) Ġ" kt " Ġelse Ġ" java ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" java " Ġ-> Ġif Ġ( uri . source ) ĠPair ( uri . read Contents (), Ġ" java ") Ġelse ĠPair ( convertTo Kotlin IfNeeded ( uri . read Contents ()), Ġ" kt ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠPair ( uri . read Contents (), Ġ" kt ") Ġ// Ġe . g . Ġfor ĠKotlin Ġsource Ġfiles ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠFileNotFoundException ) Ġ{ Ġnull Ġ} Ċ } Ċ