/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 1 Ġ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 . load . kotlin Ċ Ċ import Ġcom . intellij . ide . highlighter . Java Class FileType Ċ import Ġcom . intellij . openapi . diagnostic . Control Flow Exception Ċ import Ġcom . intellij . openapi . diagnostic . Logger Ċ import Ġcom . intellij . openapi . vfs . Virtual File Ċ import Ġorg . jetbrains . kotlin . load . kotlin . Kotlin Class Finder Ċ import Ġorg . jetbrains . kotlin . load . kotlin . Kotlin Class Finder . Result . Kotlin Class Ċ import Ġorg . jetbrains . kotlin . load . kotlin . header . Kotlin Class Header Ċ import Ġorg . jetbrains . kotlin . name . Class Id Ċ import Ġorg . jetbrains . kotlin . util . Performance Counter Ċ import Ġjava . io . FileNotFoundException Ċ import Ġjava . io . IOException Ċ Ċ class ĠVirtual File Kotlin Class Ġprivate Ġconstructor ( ĊĠĠĠ Ġval Ġfile : ĠVirtual File , ĊĠĠĠ ĠclassName : ĠClass Id , ĊĠĠĠ Ġclass Version : ĠInt , ĊĠĠĠ Ġclass Header : ĠKotlin Class Header , ĊĠĠĠ Ġinner Classes : ĠInner Classes Info Ċ ) Ġ: ĠFile Based Kotlin Class ( className , Ġclass Version , Ġclass Header , Ġinner Classes ) Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġlocation : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfile . path ĊĊĠĠĠ Ġoverride Ġval Ġcontaining Library : ĠString ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġfile . path . split (" !/ "). first OrNull () ĊĊĠĠĠ Ġoverride Ġfun ĠgetFile Contents (): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfile . contents To ByteArray () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġlog File Reading ErrorMessage ( e , Ġfile ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?) Ġ= Ġother Ġis ĠVirtual File Kotlin Class Ġ&& Ġother . file Ġ== Ġfile ĊĠĠĠ Ġoverride Ġfun ĠhashCode () Ġ= Ġfile . hashCode () ĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġ"${ this :: class . java . simple Name }: Ġ$ file " ĊĊĠĠĠ Ġcompanion Ġobject ĠFactory Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOG Ġ= ĠLogger . getInstance ( Virtual File Kotlin Class :: class . java ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġperf Counter Ġ= ĠPerformance Counter . create (" Binary Ġclass Ġfrom ĠKotlin Ġfile ") ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġcreate ( file : ĠVirtual File , Ġfile Content : ĠByteArray ?): ĠKotlin Class Finder . Result ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġperf Counter . time Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( file . fileType Ġ== ĠJava Class FileType . INSTANCE ) Ġ{ Ġ" Trying Ġto Ġread Ġbinary Ġdata Ġfrom Ġa Ġnon - class Ġfile Ġ$ file " Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbyte Content Ġ= Ġfile Content Ġ?: Ġfile . contents To ByteArray ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( byte Content . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkotlin Jvm Binary Class Ġ= Ġcreate ( byte Content ) Ġ{ Ġname , Ġclass Version , Ġheader , Ġinner Classes Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVirtual File Kotlin Class ( file , Ġname , Ġclass Version , Ġheader , Ġinner Classes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ time Ġkotlin Jvm Binary Class ?. let Ġ{ ĠKotlin Class ( it , Ġbyte Content ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠKotlin Class Finder . Result . Class FileContent ( byte Content ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠValid Ġsituation . ĠUser Ġcan Ġdelete Ġjar Ġfile . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠControl Flow Exception ) Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġlog File Reading ErrorMessage ( e , Ġfile ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġlog File Reading ErrorMessage ( e : ĠThrowable , Ġfile : ĠVirtual File ): ĠThrowable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠerrorMessage Ġ= Ġrender File Reading ErrorMessage ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . warn ( errorMessage , Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIllegalStateException ( errorMessage , Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġrender File Reading ErrorMessage ( file : ĠVirtual File ): ĠString Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Could Ġnot Ġread Ġfile : Ġ${ file . path }; Ġsize Ġin Ġbytes : Ġ${ file . length }; Ġfile Ġtype : Ġ${ file . fileType . name }" ĊĠĠĠ Ġ} Ċ } Ċ