/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 0 Ġ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 . ir . backend . py . transformers . ir To Py Ċ Ċ import Ġgenerated . Python . Module Ċ import Ġgenerated . Python . stmt Ċ import Ġorg . jetbrains . kotlin . ir . backend . py . Compiler Result Ċ import Ġorg . jetbrains . kotlin . ir . backend . py . Js Ir Backend Context Ċ import Ġorg . jetbrains . kotlin . ir . backend . py . Py Code Ċ import Ġorg . jetbrains . kotlin . ir . backend . py . elim inate Dead Declarations Ċ import Ġorg . jetbrains . kotlin . ir . backend . py . lower . Static Members Lower ing Ċ import Ġorg . jetbrains . kotlin . ir . backend . py . utils .* Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Module Fragment Ċ import Ġto python . to Python Ċ Ċ // ĠTODO Ċ class ĠIr Module To Py Transformer ( ĊĠĠĠ Ġprivate Ġval Ġbackend Context : ĠJs Ir Backend Context , ĊĠĠĠ Ġprivate Ġval Ġgenerate Script Module : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġvar Ġn amer : ĠName Tables Ġ= ĠName Tables ( emptyList ()), ĊĠĠĠ Ġprivate Ġval Ġfull Js : ĠBoolean Ġ= Ġtrue , ĊĠĠĠ Ġprivate Ġval Ġd ce Js : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġprivate Ġval Ġrelative Require Path : ĠBoolean Ġ= Ġfalse Ċ ) Ġ{ ĊĠĠĠ Ġfun Ġgenerate Module ( modules : ĠIterable < Ir Module Fragment >): ĠCompiler Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġadditional Packages Ġ= Ġwith ( backend Context ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexternal Package Fragment . values Ġ+ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb od ile ss Built Ins Package Fragment , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ+ Ġpackage Level Js Modules ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmodules . forEach Ġ{ Ġmodule Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodule . files . forEach Ġ{ ĠStatic Members Lower ing ( backend Context ). lower ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġmodules . forEach Ġ{ Ġmodule Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn amer . merge ( module . files , Ġadditional Packages ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġjs Code Ġ= Ġif Ġ( full Js ) Ġgenerate Wrapped Module Body ( modules , Ġn amer ) Ġelse Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġd ce Js Code Ġ= Ġif Ġ( dce Js ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeliminate Dead Declarations ( modules , Ġbackend Context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUse Ġa Ġfresh Ġn amer Ġfor ĠD CE Ġso Ġthat Ġwe Ġcould Ġcompare Ġthe Ġresult Ġwith ĠD CE - driven ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġis Ġthis Ġmode Ġrelevant Ġfor Ġscripting ? ĠIf Ġyes , Ġrefactor Ġso Ġthat Ġthe Ġexternal Ġname Ġtables Ġare Ġused Ġhere Ġwhen Ġneeded . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn amer Ġ= ĠName Tables ( emptyList ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġn amer . merge ( modules . flatMap Ġ{ Ġit . files Ġ}, Ġadditional Packages ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Wrapped Module Body ( modules , Ġn amer ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĊĠĠĠĠĠĠĠ Ġreturn ĠCompiler Result ( js Code , Ġd ce Js Code ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Wrapped Module Body ( modules : ĠIterable < Ir Module Fragment >, Ġn amer : ĠName Tables ): ĠPy Code Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPy Code ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Wrapped Module Body 2 ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodules , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn amer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEmpty Cross Module Reference Info ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Wrapped Module Body 2 ( ĊĠĠĠĠĠĠĠ Ġmodules : ĠIterable < Ir Module Fragment >, ĊĠĠĠĠĠĠĠ Ġn amer : ĠName Tables , ĊĠĠĠĠĠĠĠ Ġref Info : ĠCross Module Reference Info ĊĠĠĠ Ġ): ĠString Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġname Generator Ġ= Ġref Info . with Reference Tracking ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr N amer Impl ( new Name Tables Ġ= Ġn amer , Ġbackend Context ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodules ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġstatic Context Ġ= ĠJs Static Context ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbackend Context Ġ= Ġbackend Context , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir N amer Ġ= Ġname Generator , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġglobal Name Scope Ġ= Ġn amer . global Names ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġroot Context Ġ= ĠJs Generation Context ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Function Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatic Context Ġ= Ġstatic Context , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Names Ġ= ĠLocal Name Generator ( Name Scope . Empty Scope ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval Ġmodule Body Ġ= Ġgenerate Module Body ( modules , Ġroot Context ) ĊĠĠĠĠĠĠĠ Ġval Ġprogram Ġ= ĠModule ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġmodule Body , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype _ ign ores Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġprogram . to Python () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Module Body ( modules : ĠIterable < Ir Module Fragment >, Ġcontext : ĠJs Generation Context ): ĠList < stmt > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmodules . flatMap Ġ{ Ġmodule : ĠIr Module Fragment Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodule . files . flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . accept ( Ir File To Py Transformer (), Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ