/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 9 Ġ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 . backend . jvm Ċ Ċ import Ġorg . jetbrains . kotlin . backend . common . Code gen Util Ċ import Ġorg . jetbrains . kotlin . backend . common . extensions . Ir Generation Extension Ċ import Ġorg . jetbrains . kotlin . backend . common . extensions . Ir Plugin Context Impl Ċ import Ġorg . jetbrains . kotlin . backend . common . ir . Builtin Symbols Base Ċ import Ġorg . jetbrains . kotlin . backend . common . ph aser . Phase Config Ċ import Ġorg . jetbrains . kotlin . backend . jvm . codegen . Class Code gen Ċ import Ġorg . jetbrains . kotlin . backend . jvm . lower . Mult if ile Facade File Entry Ċ import Ġorg . jetbrains . kotlin . backend . jvm . serialization . Jvm Id Signature Descriptor Ċ import Ġorg . jetbrains . kotlin . codegen . state . Generation State Ċ import Ġorg . jetbrains . kotlin . descriptors . Module Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . kon an . Deserial ized K lib Module Origin Ċ import Ġorg . jetbrains . kotlin . descriptors . kon an . K lib Module Origin Ċ import Ġorg . jetbrains . kotlin . idea . Main Function Detector Ċ import Ġorg . jetbrains . kotlin . ir . backend . jvm . serialization . Empty Logging Context Ċ import Ġorg . jetbrains . kotlin . ir . backend . jvm . serialization . Jvm Ir Link er Ċ import Ġorg . jetbrains . kotlin . ir . backend . jvm . serialization . Jvm M ang ler Desc Ċ import Ġorg . jetbrains . kotlin . ir . builders . Translation Plugin Context Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Class Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Function Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Module Fragment Ċ import Ġorg . jetbrains . kotlin . ir . declarations . impl . Ir Factory Impl Ċ import Ġorg . jetbrains . kotlin . ir . descriptors . Ir Built Ins Ċ import Ġorg . jetbrains . kotlin . ir . descriptors . Ir Function Factory Ċ import Ġorg . jetbrains . kotlin . ir . link age . Ir Provider Ċ import Ġorg . jetbrains . kotlin . ir . types . default Type Ċ import Ġorg . jetbrains . kotlin . ir . util .* Ċ import Ġorg . jetbrains . kotlin . psi . Kt File Ċ import Ġorg . jetbrains . kotlin . psi 2 ir . Psi 2 Ir Configuration Ċ import Ġorg . jetbrains . kotlin . psi 2 ir . Psi 2 Ir Translator Ċ import Ġorg . jetbrains . kotlin . psi 2 ir . Psi Source Manager Ċ import Ġorg . jetbrains . kotlin . resolve . Binding Context Ċ Ċ object ĠJ vm Backend Facade Ġ{ ĊĠĠĠ Ġfun Ġdo Generate Files ( files : ĠCollection < Kt File >, Ġstate : ĠGeneration State , Ġphase Config : ĠPhase Config ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġextensions Ġ= ĠJ vm Generator Extensions () ĊĠĠĠĠĠĠĠ Ġval Ġm ang ler Ġ= ĠJ vm M ang ler Desc ( Main Function Detector ( state . binding Context , Ġstate . language Version Settings )) ĊĠĠĠĠĠĠĠ Ġval Ġpsi 2 ir Ġ= ĠPsi 2 Ir Translator ( state . language Version Settings , ĠPsi 2 Ir Configuration ()) ĊĠĠĠĠĠĠĠ Ġval Ġsymbol Table Ġ= ĠSymbol Table ( Jvm Id Signature Descriptor ( m ang ler ), ĠIr Factory Impl , ĠJ vm Name Provider ) ĊĠĠĠĠĠĠĠ Ġval Ġpsi 2 ir Context Ġ= Ġpsi 2 ir . create Generator Context ( state . module , Ġstate . binding Context , Ġsymbol Table , Ġextensions ) ĊĠĠĠĠĠĠĠ Ġval Ġplugin Extensions Ġ= ĠIr Generation Extension . get Instances ( state . project ) ĊĠĠĠĠĠĠĠ Ġval Ġfunction Factory Ġ= ĠIr Function Factory ( psi 2 ir Context . ir Built Ins , Ġsymbol Table ) ĊĠĠĠĠĠĠĠ Ġpsi 2 ir Context . ir Built Ins . function Factory Ġ= Ġfunction Factory ĊĊĠĠĠĠĠĠĠ Ġval Ġstub Generator Ġ= ĠDeclaration Stub Generator ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpsi 2 ir Context . module Descriptor , Ġsymbol Table , Ġpsi 2 ir Context . ir Built Ins . language Version Settings , Ġextensions ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġfront End Context Ġ= Ġobject Ġ: ĠTranslation Plugin Context Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġmodule Descriptor : ĠModule Descriptor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġpsi 2 ir Context . module Descriptor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġbinding Context : ĠBinding Context ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġpsi 2 ir Context . binding Context ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġsymbol Table : ĠReference Symbol Table ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġsymbol Table ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġtype Translator : ĠType Translator ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġpsi 2 ir Context . type Translator ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġir Built Ins : ĠIr Built Ins ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġpsi 2 ir Context . ir Built Ins ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġir Link er Ġ= ĠJ vm Ir Link er ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpsi 2 ir Context . module Descriptor , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEmpty Logging Context , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpsi 2 ir Context . ir Built Ins , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Table , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Factory , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfront End Context , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstub Generator , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm ang ler ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġplugin Context Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpsi 2 ir Context . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsymbols Ġ= ĠBuiltin Symbols Base ( ir Built Ins , Ġmodule Descriptor . built Ins , Ġsymbol Table . lazy Wrapper ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr Plugin Context Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodule Descriptor , Ġbinding Context , Ġlanguage Version Settings , Ġsymbol Table , Ġtype Translator , Ġir Built Ins , Ġir Link er , Ġsymbols ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( extension Ġin Ġplugin Extensions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpsi 2 ir . add Post processing Step Ġ{ Ġmodule Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġold Ġ= Ġstub Generator . un bound Symbol Generation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstub Generator . un bound Symbol Generation Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġextension . generate ( module , Ġplugin Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstub Generator . un bound Symbol Generation Ġ= Ġold ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdependencies Ġ= Ġpsi 2 ir Context . module Descriptor . all Dependency Modules . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkotlin Library Ġ= Ġ( it . get Capability ( K lib Module Origin . CAP ABILITY ) Ġas ? ĠDeserial ized K lib Module Origin )?. library ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Link er . deserialize Ir Module Header ( it , Ġkotlin Library ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġir Providers Ġ= ĠlistOf ( ir Link er ) ĊĊĠĠĠĠĠĠĠ Ġstub Generator . set Ir Providers ( ir Providers ) ĊĊĠĠĠĠĠĠĠ Ġval Ġir Module Fragment Ġ= Ġpsi 2 ir . generate Module Fragment ( psi 2 ir Context , Ġfiles , Ġir Providers , Ġplugin Extensions , Ġexpect Descriptor To Symbol Ġ= Ġnull ) ĊĠĠĠĠĠĠĠ Ġir Link er . post Process () ĊĊĠĠĠĠĠĠĠ Ġstub Generator . un bound Symbol Generation Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġneed Ġto Ġcompile Ġall Ġfiles Ġwe Ġreference Ġin ĠK libs ĊĠĠĠĠĠĠĠ Ġir Module Fragment . files . addAll ( dependencies . flatMap Ġ{ Ġit . files Ġ}) ĊĊĠĠĠĠĠĠĠ Ġdo Generate Files Internal ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate , Ġir Module Fragment , Ġpsi 2 ir Context . symbol Table , Ġpsi 2 ir Context . source Manager , Ġphase Config , Ġir Providers , Ġextensions ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġdo Generate Files Internal ( ĊĠĠĠĠĠĠĠ Ġstate : ĠGeneration State , ĊĠĠĠĠĠĠĠ Ġir Module Fragment : ĠIr Module Fragment , ĊĠĠĠĠĠĠĠ Ġsymbol Table : ĠSymbol Table , ĊĠĠĠĠĠĠĠ Ġsource Manager : ĠPsi Source Manager , ĊĠĠĠĠĠĠĠ Ġphase Config : ĠPhase Config , ĊĠĠĠĠĠĠĠ Ġir Providers : ĠList < Ir Provider >, ĊĠĠĠĠĠĠĠ Ġextensions : ĠJ vm Generator Extensions , ĊĠĠĠĠĠĠĠ Ġcreate Code gen : Ġ( Ir Class , ĠJ vm Backend Context , ĠIr Function ?) Ġ-> ĠClass Code gen ? Ġ= Ġ{ Ġ_, Ġ_, Ġ_ Ġ-> Ġnull Ġ}, ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠJ vm Backend Context ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate , Ġsource Manager , Ġir Module Fragment . ir Built ins , Ġir Module Fragment , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Table , Ġphase Config , Ġextensions . className Override , Ġcreate Code gen ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ/* ĠJ vm Backend Context Ġcreates Ġnew Ġun bound Ġsymbols , Ġhave Ġto Ġresolve Ġthem . Ġ*/ ĊĠĠĠĠĠĠĠ ĠExternal Dependencies Generator ( symbol Table , Ġir Providers , Ġstate . language Version Settings ). generate Un bound Symbols As Dependencies () ĊĊĠĠĠĠĠĠĠ Ġstate . map Inline Class Ġ= Ġ{ Ġdescriptor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . type Mapper . map Type ( context . reference Class ( descriptor ). default Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠJ vm Lower ( context ). lower ( ir Module Fragment ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( generate Mult if ile Facade Ġin ĠlistOf ( true , Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( ir File Ġin Ġir Module Fragment . files ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGenerate Ġmult if ile Ġfac ades Ġfirst , Ġto Ġcompute Ġand Ġstore ĠJVM Ġsignatures Ġof Ġconst Ġproperties Ġwhich Ġare Ġlater Ġused ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhen Ġserial izing Ġmetadata Ġin Ġthe Ġmult if ile Ġparts . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġconsider Ġdiv iding Ġcodegen Ġitself Ġinto Ġseparate Ġphases Ġ( byte code Ġgeneration , Ġmetadata Ġserialization ) Ġto Ġavoid Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Mult if ile Facade Ġ= Ġir File . file Entry Ġis ĠMult if ile Facade File Entry ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Mult if ile Facade Ġ!= Ġgenerate Mult if ile Facade ) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( lower ed Class Ġin Ġir File . declarations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lower ed Class Ġ! is ĠIr Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAssertionError (" File - level Ġdeclaration Ġshould Ġbe ĠIr Class Ġafter ĠJ vm Lower , Ġgot : Ġ" Ġ+ Ġlower ed Class . render ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass Code gen . get OrCreate ( lower ed Class , Ġcontext ). generate () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCode gen Util . report Backend Exception ( e , Ġ" code Ġgeneration ", Ġir File . file Entry . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġsplit Ġclasses Ġinto Ġgroups Ġconnected Ġby Ġinline Ġcalls ; Ġcall Ġthis Ġafter Ġevery Ġgroup ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠĠĠĠ Ġand Ġclear Ġ` Jvm Backend Context . class Code gens ` ĊĠĠĠĠĠĠĠ Ġstate . after In dependent Part () ĊĠĠĠ Ġ} Ċ } Ċ