// ĠCopyright Ġ 2 0 0 0 - 2 0 2 1 ĠJetBrains Ġs . r . o . Ġand Ġcontributors . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ package Ġorg . jetbrains . kotlin . idea . core Ċ Ċ import Ġorg . jetbrains . kotlin . backend . common . output . OutputFile Ċ import Ġorg . jetbrains . kotlin . backend . common . ph aser . Phase Config Ċ import Ġorg . jetbrains . kotlin . backend . jvm . Jvm Ir Code gen Factory Ċ import Ġorg . jetbrains . kotlin . backend . jvm . jvm Ph ases Ċ import Ġorg . jetbrains . kotlin . cache s . resolve . Kotlin Cache Service Ċ import Ġorg . jetbrains . kotlin . codegen . Class Builder Factories Ċ import Ġorg . jetbrains . kotlin . codegen . Class BuilderFactory Ċ import Ġorg . jetbrains . kotlin . codegen . Default Code gen Factory Ċ import Ġorg . jetbrains . kotlin . codegen . Kotlin Code gen Facade Ċ import Ġorg . jetbrains . kotlin . codegen . state . Generation State Ċ import Ġorg . jetbrains . kotlin . config . Common Configuration Keys Ċ import Ġorg . jetbrains . kotlin . config . Compiler Configuration Ċ import Ġorg . jetbrains . kotlin . config . JVM Configuration Keys Ċ import Ġorg . jetbrains . kotlin . config . language Version Settings Ċ import Ġorg . jetbrains . kotlin . idea . cache s . resolve . get Resolution Facade Ċ import Ġorg . jetbrains . kotlin . idea . core . util . analyze In lined Functions Ċ import Ġorg . jetbrains . kotlin . idea . project . language Version Settings Ċ import Ġorg . jetbrains . kotlin . idea . project . platform Ċ import Ġorg . jetbrains . kotlin . idea . resolve . Resolution Facade Ċ import Ġorg . jetbrains . kotlin . platform . is Common Ċ import Ġorg . jetbrains . kotlin . platform . jvm . is Jvm Ċ import Ġorg . jetbrains . kotlin . psi .* Ċ import Ġjava . io . File Ċ import Ġjava . util . zip . Zip Entry Ċ import Ġjava . util . zip . Zip OutputStream Ċ Ċ class ĠKotlin Compiler Ide ( ĊĠĠĠ Ġprivate Ġval Ġfile : ĠK t File , ĊĠĠĠ Ġprivate Ġval Ġinitial Configuration : ĠCompiler Configuration Ġ= ĠgetDefault Compiler Configuration ( file ), ĊĠĠĠ Ġprivate Ġval Ġfactory : ĠClass BuilderFactory Ġ= ĠClass Builder Factories . BIN ARIES , ĊĠĠĠ Ġprivate Ġval Ġresolution Facade Provider : Ġ( Kt File ) Ġ-> ĠResolution Facade ? Ġ= Ġ:: getDefault Resolution Facade , ĊĠĠĠ Ġprivate Ġval Ġclass Files Only : ĠBoolean Ġ= Ġfalse Ċ ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠgetDefault Compiler Configuration ( file : ĠK t File ): ĠCompiler Configuration Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠCompiler Configuration (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlanguage Version Settings Ġ= Ġfile . language Version Settings ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠgetDefault Resolution Facade ( file : ĠK t File ): ĠResolution Facade ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfile . get Resolution Facade () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠComp iled File ( val Ġpath : ĠString , Ġval Ġbytecode : ĠByteArray ) ĊĊĠĠĠ Ġfun Ġcompile To Directory ( destination : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdestination . mkdir s () ĊĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġcompile () Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( outputFile Ġin Ġget Files ( state )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= ĠFile ( destination , ĠoutputFile . relative Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( target . parent File Ġ?: Ġerror (" Can 't Ġfind Ġparent Ġfor Ġfile Ġ$ target ")). mkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget . write Bytes ( outputFile . as ByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . destroy () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcompile To Jar ( destination : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdestination . output Stream (). buffered (). use Ġ{ Ġos Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠZip OutputStream ( os ). use Ġ{ Ġz os Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġcompile () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( outputFile Ġin Ġget Files ( state )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġz os . put Next Entry ( Zip Entry ( outputFile . relative Path )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġz os . write ( outputFile . as ByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġz os . close Entry () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . destroy () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcompile To Byte code (): ĠList < Compiled File > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġcompile () Ġ?: Ġreturn Ġempty List () ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Files ( state ). map Ġ{ ĠComp iled File ( it . relative Path , Ġit . as ByteArray ()) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate . destroy () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcompile (): ĠGeneration State ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproject Ġ= Ġfile . project ĊĠĠĠĠĠĠĠ Ġval Ġplatform Ġ= Ġfile . platform ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! platform . is Common () Ġ&& Ġ! platform . is Jvm ()) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġresolution Facade Ġ= Ġresolution Facade Provider ( file ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġbinding Context For Files Ġ= Ġresolution Facade . analyze With All Compiler Checks ( listOf ( file )). binding Context ĊĊĠĠĠĠĠĠĠ Ġval Ġconfiguration Ġ= Ġinitial Configuration . copy (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput ( JVM Configuration Keys . DO _ NOT _ CLEAR _ BINDING _ CONTEXT , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġ( binding Context , Ġto Process ) Ġ= Ġanalyze In lined Functions ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolution Facade , Ġfile , Ġconfiguration . getBoolean ( Common Configuration Keys . DISABLE _ INLINE ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbinding Context For Files ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġgenerate Class Filter Ġ= Ġobject Ġ: ĠGeneration State . Generate Class Filter () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġshould Generate Package Part ( kt File : ĠK t File ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfile Ġ=== Ġkt File ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġshould Annot ate Class ( processing Class Or Object : ĠK t Class Or Object ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġshould Generate Class ( processing Class Or Object : ĠK t Class Or Object ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġprocessing Class Or Object . containing Kt File Ġ=== Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġshould Generate Script ( script : ĠK t Script ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġscript . containing Kt File Ġ=== Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġshould Generate Code Fragment ( script : ĠK t Code Fragment ) Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcodegen Factory Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfiguration . getBoolean ( JVM Configuration Keys . IR ) Ġ-> ĠJ vm Ir Code gen Factory ( Phase Config ( jvm Ph ases )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠDefault Code gen Factory ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġstate Ġ= ĠGeneration State . Builder ( project , Ġfactory , Ġresolution Facade . module Descriptor , Ġbinding Context , Ġto Process , Ġconfiguration ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. generate Declared Class Filter ( generate Class Filter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. codegen Factory ( codegen Factory ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ ĠKotlin Code gen Facade . compile Correct Files ( state ) ĊĠĠĠĠĠĠĠ Ġreturn Ġstate ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Files ( state : ĠGeneration State ): ĠList < OutputFile > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġall Files Ġ= Ġstate . factory . asList () ĊĠĠĠĠĠĠĠ Ġif Ġ( class Files Only ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġall Files . filter Ġ{ Ġit . relative Path . endsWith (". class ") Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġall Files ĊĠĠĠ Ġ} Ċ }