/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 5 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . serialization . builtins Ċ Ċ import Ġjava . io . File Ċ import Ġcom . intellij . openapi . util . Dis poser Ċ import Ġorg . jetbrains . kotlin . config . Compiler Configuration Ċ import Ġorg . jetbrains . kotlin . cli . jvm . compiler . Jet Core Environment Ċ import Ġorg . jetbrains . kotlin . serialization .* Ċ import Ġorg . jetbrains . kotlin . descriptors .* Ċ import Ġorg . jetbrains . kotlin . name . Name Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġorg . jetbrains . kotlin . builtins . Built Ins Serialization Util Ċ import Ġcom . intellij . openapi . Disposable Ċ import Ġorg . jetbrains . kotlin . cli . common . CLI Configuration Keys Ċ import Ġorg . jetbrains . kotlin . config . Common Configuration Keys Ċ import Ġorg . jetbrains . kotlin . cli . common . messages . Message Collector Ċ import Ġorg . jetbrains . kotlin . name . Fq Name Ċ import Ġorg . jetbrains . kotlin . utils . recur se Post Order Ċ import Ġcom . intellij . psi . search . Global Search Scope Ċ import Ġorg . jetbrains . kotlin . resolve . jvm . Jvm Analyzer Facade Ċ import Ġorg . jetbrains . kotlin . context . Global Context Ċ import Ġorg . jetbrains . kotlin . analyzer . Module Info Ċ import Ġorg . jetbrains . kotlin . resolve . jvm . Jvm Platform Parameters Ċ import Ġorg . jetbrains . kotlin . analyzer . Module Content Ċ import Ġorg . jetbrains . kotlin . resolve . scopes . Descriptor Kind Filter Ċ import Ġorg . jetbrains . kotlin . cli . jvm . compiler . Environment Config Files Ċ import Ġorg . jetbrains . kotlin . cli . jvm . JVM Configuration Keys Ċ import Ġorg . jetbrains . kotlin . resolve . constants . NullValue Ċ import Ġorg . jetbrains . kotlin . builtins . Kotlin Built Ins Ċ import Ġorg . jetbrains . kotlin . name . Class Id Ċ import Ġorg . jetbrains . kotlin . resolve . descriptor Util . class Id Ċ Ċ private Ġobject ĠBuilt Ins Serializer Extension Ġ: ĠSerializer Extension () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġserialize Class ( descriptor : ĠClass Descriptor , Ġproto : ĠProto Buf . Class . Builder , Ġstring Table : ĠString Table ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( annotation Ġin Ġdescriptor . get Annotations ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproto . add Extension ( Built Ins Proto Buf . class Annotation , ĠAnnotation Serializer . serialize Annotation ( annotation , Ġstring Table )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġserialize Package ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Fragments : ĠCollection < Package Fragment Descriptor >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproto : ĠProto Buf . Package . Builder , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstring Table : ĠString Table ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclasses Ġ= Ġpackage Fragments . flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . get Member Scope (). get Descriptors ( Descriptor Kind Filter . CLAS SI FI ERS ). filter Is Instance < Class Descriptor >() ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( descriptor Ġin ĠDescriptor Serializer . sort ( classes )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproto . add Extension ( Built Ins Proto Buf . className , Ġstring Table . getSimpleName Index ( descriptor . getName ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġserialize Callable ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcallable : ĠCallable Member Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproto : ĠProto Buf . Callable . Builder , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstring Table : ĠString Table ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( annotation Ġin Ġcallable . get Annotations ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproto . add Extension ( Built Ins Proto Buf . callable Annotation , ĠAnnotation Serializer . serialize Annotation ( annotation , Ġstring Table )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcompile Time Constant Ġ= Ġ( callable Ġas ? ĠProperty Descriptor )?. get Compile Time Initializer () ĊĠĠĠĠĠĠĠ Ġif Ġ( compile Time Constant Ġ!= Ġnull Ġ&& Ġcompile Time Constant Ġ! is ĠNull Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġcompile Time Constant . getType ( Kotlin Built Ins . getInstance ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproto . set Extension ( Built Ins Proto Buf . compile Time Value , ĠAnnotation Serializer . value Proto ( compile Time Constant , Ġtype , Ġstring Table ). build ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġserialize Value Parameter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor : ĠValue Parameter Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproto : ĠProto Buf . Callable . Value Parameter . Builder , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstring Table : ĠString Table ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( annotation Ġin Ġdescriptor . get Annotations ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproto . add Extension ( Built Ins Proto Buf . parameter Annotation , ĠAnnotation Serializer . serialize Annotation ( annotation , Ġstring Table )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ public Ġclass ĠBuilt Ins Serializer ( private Ġval Ġdepend On Old Built Ins : ĠBoolean ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġtotal Size Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġtotal Files Ġ= Ġ 0 ĊĊĠĠĠ Ġpublic Ġfun Ġserialize ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdest Dir : ĠFile , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Dirs : ĠCollection < File >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextra Class Path : ĠCollection < File >, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonComplete : Ġ( total Size : ĠInt , Ġtotal Files : ĠInt ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġroot Disposable Ġ= ĠDis poser . new Disposable () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserialize ( root Disposable , Ġdest Dir , Ġsrc Dirs , Ġextra Class Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠonComplete ( total Size , Ġtotal Files ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDis poser . dispose ( root Disposable ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠBuilt ins Sources Module Ġ: ĠModule Info Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġname Ġ= ĠName . special ("< module Ġfor Ġresolving Ġbuiltin Ġsource Ġfiles >") ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdependencies () Ġ= ĠlistOf ( this ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdependency On Built ins (): ĠModule Info . Dependency On Built ins Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( depend On Old Built Ins ) ĠModule Info . Dependencies On Built ins . LAST Ġelse ĠModule Info . Dependencies On Built ins . NONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġserialize ( dis posable : ĠDis posable , Ġdest Dir : ĠFile , Ġsrc Dirs : ĠCollection < File >, Ġextra Class Path : ĠCollection < File >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconfiguration Ġ= ĠCompiler Configuration () ĊĠĠĠĠĠĠĠ Ġconfiguration . put ( CLI Configuration Keys . MESSAGE _ COLLECT OR _ KEY , ĠMessage Collector . NONE ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsource Roots Ġ= Ġsrc Dirs Ġmap Ġ{ Ġit . path Ġ} ĊĠĠĠĠĠĠĠ Ġconfiguration . put ( Common Configuration Keys . SOURCE _ ROOT S _ KEY , Ġsource Roots ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( path Ġin Ġextra Class Path ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfiguration . add ( JVM Configuration Keys . CLAS SPATH _ KEY , Ġpath ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġenvironment Ġ= ĠJet Core Environment . create For Tests ( dis posable , Ġconfiguration , ĠEnvironment Config Files . JVM _ CONFIG _ FILES ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= Ġenvironment . getSource Files () ĊĊĠĠĠĠĠĠĠ Ġval Ġbuilt In Module Ġ= ĠBuilt ins Sources Module () ĊĠĠĠĠĠĠĠ Ġval Ġresolver Ġ= ĠJ vm Analyzer Facade . setup Resolver For Project ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGlobal Context (), Ġenvironment . getProject (), ĠlistOf ( built In Module ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĠModule Content ( files , ĠGlobal Search Scope . EMPTY _ SCOPE ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplatform Parameters Ġ= ĠJ vm Platform Parameters Ġ{ Ġthrow ĠIllegalStateException () Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmodule Descriptor Ġ= Ġresolver . descriptor For Module ( built In Module ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġdon 't Ġuse ĠFile Util Ġbecause Ġit Ġsp awns ĠJ NA Ġinitialization , Ġwhich Ġfails Ġbecause Ġwe Ġdon 't Ġhave Ġ( and Ġdon 't Ġwant Ġto Ġhave ) Ġits ĊĠĠĠĠĠĠĠ Ġ// Ġnative Ġlibraries Ġin Ġthe Ġcompiler Ġjar Ġ( lib jn id is patch . so Ġ/ Ġj nid is patch . dll Ġ/ Ġ...) ĊĠĠĠĠĠĠĠ Ġdest Dir . recur se Post Order Ġ{ Ġit . delete () Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! dest Dir . mkdir s ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println (" Could Ġnot Ġmake Ġdirectories : Ġ" Ġ+ Ġdest Dir ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfiles . map Ġ{ Ġit . get Package Fq Name () Ġ}. toSet (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfq Name Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserialize Package ( module Descriptor , Ġfq Name , Ġdest Dir ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġserialize Package ( module : ĠModule Descriptor , Ġfq Name : ĠF q Name , Ġdest Dir : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpackage View Ġ= Ġmodule . get Package ( fq Name ) Ġ?: Ġerror (" No Ġpackage Ġresolved Ġin Ġ$ module ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġperform Ġsome Ġkind Ġof Ġvalidation ? ĠAt Ġthe Ġmoment Ġnot Ġpossible Ġbecause ĠDescriptor Validator Ġis Ġin Ġcompiler - tests ĊĠĠĠĠĠĠĠ Ġ// ĠDescriptor Validator . validate ( package View ) ĊĊĠĠĠĠĠĠĠ Ġval Ġserializer Ġ= ĠDescriptor Serializer . create TopLevel ( Built Ins Serializer Extension ) ĊĊĠĠĠĠĠĠĠ Ġval Ġclassifier Descriptors Ġ= ĠDescriptor Serializer . sort ( package View . get Member Scope (). get Descriptors ( Descriptor Kind Filter . CLAS SI FI ERS )) ĊĊĠĠĠĠĠĠĠ Ġserialize Classes ( classifier Descriptors , Ġserializer ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( class Descriptor , Ġclass Proto ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstream Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Proto . writeTo ( stream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite ( dest Dir , Ġget FileName ( class Descriptor ), Ġstream ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġpackage Stream Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠ Ġval Ġfragments Ġ= Ġmodule . get Package Fragment Provider (). get Package Fragments ( fq Name ) ĊĠĠĠĠĠĠĠ Ġval Ġpackage Proto Ġ= Ġserializer . package Proto ( fragments ). build () Ġ?: Ġerror (" Package Ġfragments Ġnot Ġserialized : Ġ$ fragments ") ĊĠĠĠĠĠĠĠ Ġpackage Proto . writeTo ( package Stream ) ĊĠĠĠĠĠĠĠ Ġwrite ( dest Dir , ĠBuilt Ins Serialization Util . get Package FilePath ( fq Name ), Ġpackage Stream ) ĊĊĠĠĠĠĠĠĠ Ġval Ġname Stream Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠ ĠName Serialization Util . serialize String Table ( name Stream , Ġserializer . getString Table ()) ĊĠĠĠĠĠĠĠ Ġwrite ( dest Dir , ĠBuilt Ins Serialization Util . getString Table FilePath ( fq Name ), Ġname Stream ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite ( dest Dir : ĠFile , ĠfileName : ĠString , Ġstream : ĠByteArrayOutputStream ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtotal Size Ġ+= Ġstream . size () ĊĠĠĠĠĠĠĠ Ġtotal Files ++ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( dest Dir , ĠfileName ) ĊĠĠĠĠĠĠĠ Ġfile . getParent File ()?. mkdir s () ĊĠĠĠĠĠĠĠ Ġfile . write Bytes ( stream . toByteArray ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġserialize Class ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Descriptor : ĠClass Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserializer : ĠDescriptor Serializer , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Class : Ġ( Class Descriptor , ĠProto Buf . Class ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclass Proto Ġ= Ġserializer . class Proto ( class Descriptor ). build () Ġ?: Ġerror (" Class Ġnot Ġserialized : Ġ$ class Descriptor ") ĊĠĠĠĠĠĠĠ Ġwrite Class ( class Descriptor , Ġclass Proto ) ĊĊĠĠĠĠĠĠĠ Ġserialize Classes ( class Descriptor . getUn subst it uted Inner Classes Scope (). get Descriptors (), Ġserializer , Ġwrite Class ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġserialize Classes ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptors : ĠCollection < Declaration Descriptor >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserializer : ĠDescriptor Serializer , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Class : Ġ( Class Descriptor , ĠProto Buf . Class ) Ġ-> ĠUnit ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( descriptor Ġin Ġdescriptors ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( descriptor Ġis ĠClass Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserialize Class ( descriptor , Ġserializer , Ġwrite Class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget FileName ( class Descriptor : ĠClass Descriptor ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠBuilt Ins Serialization Util . getClass Metadata Path ( class Descriptor . class Id ) ĊĠĠĠ Ġ} Ċ } Ċ