/* Ċ Ġ* Ġ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 . js . translate . declaration Ċ Ċ import Ġcom . google . dart . compiler . backend . js . ast .* Ċ import Ġcom . intellij . util . Smart List Ċ import Ġorg . jetbrains . kotlin . backend . common . Code gen Util Ċ import Ġorg . jetbrains . kotlin . backend . common . brid ges . Bridge Ċ import Ġorg . jetbrains . kotlin . backend . common . brid ges . generate B rid ges For Function Descriptor Ċ import Ġorg . jetbrains . kotlin . builtins . Kotlin Built Ins Ċ import Ġorg . jetbrains . kotlin . descriptors .* Ċ import Ġorg . jetbrains . kotlin . js . descriptor Utils . has Primary Constructor Ċ import Ġorg . jetbrains . kotlin . js . translate . call Translator . Call Translator Ċ import Ġorg . jetbrains . kotlin . js . translate . context . Definition Place Ċ import Ġorg . jetbrains . kotlin . js . translate . context . N amer Ċ import Ġorg . jetbrains . kotlin . js . translate . context . Translation Context Ċ import Ġorg . jetbrains . kotlin . js . translate . declaration . property Translator . translate Accessors Ċ import Ġorg . jetbrains . kotlin . js . translate . expression . Function Translator Ċ import Ġorg . jetbrains . kotlin . js . translate . expression . with Capt ured Parameters Ċ import Ġorg . jetbrains . kotlin . js . translate . general . Abstract Translator Ċ import Ġorg . jetbrains . kotlin . js . translate . initializer . Class Initializer Translator Ċ import Ġorg . jetbrains . kotlin . js . translate . reference . Reference Translator . translate As FQ Reference Ċ import Ġorg . jetbrains . kotlin . js . translate . utils .* Ċ import Ġorg . jetbrains . kotlin . js . translate . utils . Binding Utils . getClass Descriptor Ċ import Ġorg . jetbrains . kotlin . js . translate . utils . Binding Utils . getProperty Descriptor For Constructor Parameter Ċ import Ġorg . jetbrains . kotlin . js . translate . utils . Js Descriptor Utils . get Receiver Parameter For Declaration Ċ import Ġorg . jetbrains . kotlin . js . translate . utils . Js Descriptor Utils . get Sup ert ypes Without F akes Ċ import Ġorg . jetbrains . kotlin . js . translate . utils . Psi Utils . get Primary Constructor Parameters Ċ import Ġorg . jetbrains . kotlin . js . translate . utils . Translation Utils . simple Return Function Ċ import Ġorg . jetbrains . kotlin . js . translate . utils . js Ast Utils . to Invocation With Ċ import Ġorg . jetbrains . kotlin . psi . Kt Class Ċ import Ġorg . jetbrains . kotlin . psi . Kt Class Or Object Ċ import Ġorg . jetbrains . kotlin . psi . Kt Object Declaration Ċ import Ġorg . jetbrains . kotlin . psi . Kt Secondary Constructor Ċ import Ġorg . jetbrains . kotlin . resolve . Binding Context Utils Ċ import Ġorg . jetbrains . kotlin . resolve . Descriptor Utils .* Ċ import Ġorg . jetbrains . kotlin . types . Kotlin Type Ċ import Ġorg . jetbrains . kotlin . types . Type Constructor Ċ import Ġorg . jetbrains . kotlin . types . Type Utils . topo logic ally Sort Super classes And Record All Instances Ċ import Ġorg . jetbrains . kotlin . utils . identity Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠGenerates Ġa Ġdefinition Ġof Ġa Ġsingle Ġclass . Ċ Ġ*/ Ċ public Ġclass ĠClass Translator Ġprivate Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġclass Declaration : ĠK t Class Or Object , ĊĠĠĠĠĠĠĠ Ġcontext : ĠTranslation Context Ċ ) Ġ: ĠAbstract Translator ( context ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġdescriptor Ġ= ĠgetClass Descriptor ( context . binding Context (), Ġclass Declaration ) ĊĊĠĠĠ Ġprivate Ġfun Ġtranslate Object Literal Expression (): ĠJs Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġget Containing Class ( descriptor ) Ġ?: Ġreturn Ġtranslate ( context ()) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtranslate Object Inside Class ( context ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtranslate ( declaration Context : ĠTranslation Context Ġ= Ġcontext ()): ĠJs Invocation Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠJs Invocation ( context (). nam er (). class Create Invocation ( descriptor ), ĠgetClass Create Invocation Arguments ( declaration Context )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Trait (): ĠBoolean Ġ= Ġdescriptor . get Kind () Ġ== ĠClass Kind . INTERFACE ĊĊĠĠĠ Ġprivate Ġfun ĠgetClass Create Invocation Arguments ( declaration Context : ĠTranslation Context ): ĠList < Js Expression > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcontext Ġ= Ġdeclaration Context ĊĠĠĠĠĠĠĠ Ġval Ġinvocation Arguments Ġ= ĠArrayList < Js Expression >() ĊĊĠĠĠĠĠĠĠ Ġval Ġproperties Ġ= ĠSmart List < Js Property Initializer >() ĊĠĠĠĠĠĠĠ Ġval Ġstatic Properties Ġ= ĠSmart List < Js Property Initializer >() ĊĊĠĠĠĠĠĠĠ Ġval Ġis TopLevel Declaration Ġ= Ġcontext () Ġ== Ġcontext ĊĊĠĠĠĠĠĠĠ Ġvar Ġqualified Reference : ĠJs Name Ref ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( is TopLevel Declaration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdefinition Place : ĠDefinition Place ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! descriptor . get Kind (). is Singleton () Ġ&& Ġ! is Anonymous Object ( descriptor )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqualified Reference Ġ= Ġcontext . get Qualified Reference ( descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscope Ġ= Ġcontext (). get Scope For Descriptor ( descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefinition Place Ġ= ĠDefinition Place ( scope Ġas ĠJs Object Scope , Ġqualified Reference , Ġstatic Properties ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ= Ġcontext . new Declaration ( descriptor , Ġdefinition Place ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcontext Ġ= Ġfix Context For Companion Object Access ing ( context ) ĊĊĠĠĠĠĠĠĠ Ġinvocation Arguments . add ( get Super class References ( context )) ĊĠĠĠĠĠĠĠ Ġval Ġdeleg ation Translator Ġ= ĠDeleg ation Translator ( class Declaration , Ġcontext ()) ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Trait ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinitializer Ġ= ĠClass Initializer Translator ( class Declaration , Ġcontext ). generate Initialize Method ( deleg ation Translator ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation Arguments . add ( if Ġ( initializer . getBody (). getState ments (). isEmpty ()) ĠJs Literal . NULL Ġelse Ġinitializer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtranslate Properties As Constructor Parameters ( context , Ġproperties ) ĊĠĠĠĠĠĠĠ Ġval Ġbody Visitor Ġ= ĠDeclaration Body Visitor ( properties , Ġstatic Properties ) ĊĠĠĠĠĠĠĠ Ġbody Visitor . traverse Container ( class Declaration , Ġcontext ) ĊĠĠĠĠĠĠĠ Ġdeleg ation Translator . generate Deleg ated ( properties ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( descriptor . is Data ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJs Data ClassGenerator ( class Declaration , Ġcontext , Ġproperties ). generate () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( is Enum Class ( descriptor )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenum Entries Ġ= ĠJs Object Literal ( body Visitor . get Enum Entry List (), Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunction Ġ= Ġsimple Return Function ( context . get Scope For Descriptor ( descriptor ), Ġenum Entries ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation Arguments . add ( function ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġgenerated Bridge Methods ( properties ) ĊĊĠĠĠĠĠĠĠ Ġval Ġhas Static Properties Ġ= Ġ! static Properties . isEmpty () ĊĠĠĠĠĠĠĠ Ġif Ġ(! properties . isEmpty () Ġ|| Ġhas Static Properties ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( properties . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation Arguments . add ( Js Literal . NULL ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( qualified Reference Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġabout Ġ" prototype " Ġ- Ġsee Ġhttp :// code . google . com / p / js doc - toolkit / wiki / Tag L ends ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation Arguments . add ( Js Doc Comment ( Js Ast Utils . L END S _ JS _ DOC _ TAG , ĠJs Name Ref (" prototype ", Ġqualified Reference ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation Arguments . add ( Js Object Literal ( properties , Ġtrue )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( has Static Properties ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation Arguments . add ( Js Doc Comment ( Js Ast Utils . L END S _ JS _ DOC _ TAG , Ġqualified Reference )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinvocation Arguments . add ( Js Object Literal ( static Properties , Ġtrue )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġinvocation Arguments ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfix Context For Companion Object Access ing ( context : ĠTranslation Context ): ĠTranslation Context Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIn ĠKotlin Ġwe Ġcan Ġaccess Ġto Ġcompanion Ġobject Ġmembers Ġwithout Ġqualifier Ġjust Ġby Ġname , Ġbut Ġwe Ġshould Ġtranslate Ġit Ġto Ġaccess Ġwith ĠF Q Ġname . ĊĠĠĠĠĠĠĠ Ġ// ĠSo Ġcreate Ġalias Ġfor Ġcompanion Ġobject Ġreceiver Ġparameter . ĊĠĠĠĠĠĠĠ Ġval Ġcompanion Object Descriptor Ġ= Ġdescriptor . get Companion Object Descriptor () ĊĠĠĠĠĠĠĠ Ġif Ġ( comp anion Object Descriptor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreference To Class Ġ= Ġtranslate As FQ Reference ( comp anion Object Descriptor . get Containing Declaration (), Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompanion Object Accessor Ġ= ĠN amer . get Companion Object Accessor ( reference To Class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompanion Object Receiver Ġ= Ġget Receiver Parameter For Declaration ( comp anion Object Descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . alias ing Context (). register Alias ( comp anion Object Receiver , Ġcompanion Object Accessor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠOver lap Ġalias Ġof Ġcompanion Ġobject Ġreceiver Ġfor Ġaccessing Ġfrom Ġcontaining Ġclass ( see Ġprevious Ġif Ġblock ), ĊĠĠĠĠĠĠĠ Ġ// Ġbecause Ġinside Ġcompanion Ġobject Ġwe Ġshould Ġuse Ġsimple Ġname Ġfor Ġaccess . ĊĠĠĠĠĠĠĠ Ġif Ġ( is Companion Object ( descriptor )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcontext . inner Context With Ali ased ( descriptor . get This As Receiver Parameter (), ĠJs Literal . THIS ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcontext ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Super class References ( declaration Context : ĠTranslation Context ): ĠJs Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠsuperClass References Ġ= Ġget Sup ert ypes Name References () ĊĠĠĠĠĠĠĠ Ġif Ġ( super Class References . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠJs Literal . NULL ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsimple Return Function ( declaration Context . scope (), ĠJs Array Literal ( super Class References )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Sup ert ypes Name References (): ĠList < Js Expression > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsup ert ypes Ġ= Ġget Sup ert ypes Without F akes ( descriptor ) ĊĠĠĠĠĠĠĠ Ġif Ġ( sup ert ypes . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( sup ert ypes . size () Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġsup ert ypes . get ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsup ertype Descriptor Ġ= ĠgetClass Descriptor ForType ( type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf < Js Expression >( getClass Reference ( sup ertype Descriptor )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġsup ertype Construct ors Ġ= ĠHashSet < Type Constructor >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( type Ġin Ġsup ert ypes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsup ertype Construct ors . add ( type . get Constructor ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġsorted All Super Types Ġ= Ġtopo logic ally Sort Super classes And Record All Instances ( descriptor . getDefault Type (), ĠHashMap < Type Constructor , ĠSet < Kotlin Type >> (), ĠHashSet < Type Constructor >()) ĊĠĠĠĠĠĠĠ Ġval Ġsup ert ypes Refs Ġ= ĠArrayList < Js Expression >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( type Constructor Ġin Ġsorted All Super Types ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sup ertype Construct ors . contains ( type Constructor )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsup ertype Descriptor Ġ= ĠgetClass Descriptor ForType Constructor ( type Constructor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsup ert ypes Refs . add ( getClass Reference ( sup ertype Descriptor )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsup ert ypes Refs ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetClass Reference ( super Class Descriptor : ĠClass Descriptor ): ĠJs Name Ref Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcontext (). get Qualified Reference ( super Class Descriptor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtranslate Properties As Constructor Parameters ( class Declaration Context : ĠTranslation Context , Ġresult : ĠMutable List < Js Property Initializer >) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( parameter Ġin Ġget Primary Constructor Parameters ( class Declaration )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= ĠgetProperty Descriptor For Constructor Parameter ( binding Context (), Ġparameter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( descriptor Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtranslate Accessors ( descriptor , Ġresult , Ġclass Declaration Context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtranslate Object Inside Class ( outer Class Context : ĠTranslation Context ): ĠJs Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfunction Ġ= ĠJs Function ( outer Class Context . scope (), ĠJs Block (), Ġ" initializer Ġfor Ġ" Ġ+ Ġdescriptor . getName (). asString ()) ĊĠĠĠĠĠĠĠ Ġval Ġfun Context Ġ= Ġouter Class Context . new Function Body With Usage Tracker ( function , Ġdescriptor ) ĊĊĠĠĠĠĠĠĠ Ġfunction . getBody (). getState ments (). add ( Js Return ( translate ( fun Context ))) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfunction . with Capt ured Parameters ( fun Context , Ġouter Class Context , Ġdescriptor ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerated Bridge Methods ( properties : ĠMutable List < Js Property Initializer >) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Trait ()) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġgenerate B rid ges To Trait Impl ( properties ) ĊĊĠĠĠĠĠĠĠ Ġgenerate Other B rid ges ( properties ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate B rid ges To Trait Impl ( properties : ĠMutable List < Js Property Initializer >) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin ĠCode gen Util . get Trait Methods ( descriptor ). entrySet ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! are Names Equal ( entry . getKey (), Ġentry . getValue ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperties . add ( generate Delegate Call ( entry . getValue (), Ġentry . getKey (), ĠJs Literal . THIS , Ġcontext ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Other B rid ges ( properties : ĠMutable List < Js Property Initializer >) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( member Descriptor Ġin Ġdescriptor . getDefault Type (). get Member Scope (). getAll Descriptors ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( member Descriptor Ġis ĠFunction Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb rid ges To Generate Ġ= Ġgenerate B rid ges For Function Descriptor ( member Descriptor , Ġidentity ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( bridge Ġin Ġb rid ges To Generate ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerate Bridge ( bridge , Ġproperties ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġgenerate Bridge ( bridge : ĠBridge < Function Descriptor >, Ġproperties : ĠMutable List < Js Property Initializer >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfrom Descriptor Ġ= Ġbridge . from ĊĠĠĠĠĠĠĠ Ġval Ġto Descriptor Ġ= Ġbridge . to ĊĠĠĠĠĠĠĠ Ġif Ġ( are Names Equal ( from Descriptor , Ġto Descriptor )) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġif Ġ( from Descriptor . get Kind (). is Real () Ġ&& Ġfrom Descriptor . get Modal ity () Ġ!= ĠMod ality . AB STR ACT Ġ&& Ġ! to Descriptor . get Kind (). is Real ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĊĠĠĠĠĠĠĠ Ġproperties . add ( generate Delegate Call ( from Descriptor , Ġto Descriptor , ĠJs Literal . THIS , Ġcontext ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġare Names Equal ( first : ĠFunction Descriptor , Ġsecond : ĠFunction Descriptor ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠfirstName Ġ= Ġcontext (). getName For Descriptor ( first ) ĊĠĠĠĠĠĠĠ Ġval Ġsecond Name Ġ= Ġcontext (). getName For Descriptor ( second ) ĊĠĠĠĠĠĠĠ Ġreturn ĠfirstName . getId ent () Ġ== Ġsecond Name . getId ent () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġfun Ġtranslate ( class Declaration : ĠK t Class , Ġcontext : ĠTranslation Context ): ĠList < Js Property Initializer > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġarray ListOf < Js Property Initializer >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass Descriptor Ġ= ĠgetClass Descriptor ( context . binding Context (), Ġclass Declaration ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠclassName Ref Ġ= Ġcontext . getName For Descriptor ( class Descriptor ). make Ref () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass Creation Ġ= Ġgenerate Class Creation ( class Declaration , Ġcontext ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( Js Property Initializer ( className Ref , Ġclass Creation )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Declaration . get Secondary Construct ors (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . add ( generate Secondary Constructor ( it , Ġcontext )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġpublic Ġfun Ġgenerate Class Creation ( class Declaration : ĠK t Class Or Object , Ġcontext : ĠTranslation Context ): ĠJs Invocation Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠClass Translator ( class Declaration , Ġcontext ). translate () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġpublic Ġfun Ġgenerate Object Literal ( object Declaration : ĠK t Object Declaration , Ġcontext : ĠTranslation Context ): ĠJs Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠClass Translator ( object Declaration , Ġcontext ). translate Object Literal Expression () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġgenerate Secondary Constructor ( constructor : ĠK t Secondary Constructor , Ġcontext : ĠTranslation Context ): ĠJs Property Initializer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstructor Descriptor Ġ= ĠBinding Utils . get Descriptor For Element ( context . binding Context (), Ġconstructor ) Ġas ĠConstructor Descriptor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass Descriptor Ġ= Ġconstructor Descriptor . get Containing Declaration () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstructor Scope Ġ= Ġcontext . get Scope For Descriptor ( constructor Descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthis Name Ġ= Ġconstructor Scope . declare Name ( N amer . AN OTHER _ THIS _ PARAMETER _ NAME ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthis Name Ref Ġ= Ġthis Name . make Ref () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreceiver Descriptor Ġ= ĠJs Descriptor Utils . get Receiver Parameter For Declaration ( class Descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtranslation Context Ġ= Ġcontext . inner Context With Ali ased ( receiver Descriptor , Ġthis Name Ref ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstructor Initializer Ġ= ĠFunction Translator . newInstance ( constructor , Ġtranslation Context ). translate As Method () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstructor Function Ġ= Ġconstructor Initializer . getValue Expr () Ġas ĠJs Function ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor Function . getParameters (). add ( Js Parameter ( this Name )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreference To Class Ġ= Ġcontext . get Qualified Reference ( class Descriptor ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfor AddTo Beginning : ĠList < Js Statement > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( array ListOf < Js Statement >()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd All ( Function Body Translator . set DefaultValue For Arguments ( constructor Descriptor , Ġcontext )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcreate Instance Ġ= ĠN amer . createObject With Prototype From ( reference To Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinstance Var Ġ= ĠJs Ast Utils . assignment ( this Name Ref , ĠJs Ast Utils . or ( this Name Ref , Ġcreate Instance )). make Stmt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( instance Var ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresolved Call Ġ= ĠBinding Context Utils . get Deleg ation Constructor Call ( context . binding Context (), Ġconstructor Descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeleg ation Class Descriptor Ġ= Ġresolved Call ?. getResult ing Descriptor ()?. get Containing Declaration () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( resolved Call Ġ!= Ġnull Ġ&& Ġ! Kotlin Built Ins . is Any ( deleg ation Class Descriptor !! )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsuper Call Ġ= ĠCall Translator . translate ( context , Ġresolved Call ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( super Call . to Invocation With ( this Name Ref ). make Stmt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeleg ation Ctor InThe Same Class Ġ= Ġdeleg ation Class Descriptor Ġ== Ġclass Descriptor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! deleg ation Ctor InThe Same Class Ġ&& Ġ! class Descriptor . has Primary Constructor ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Js Invocation ( N amer . get Function Call Ref ( reference To Class ), Ġthis Name Ref ). make Stmt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( constructor Function . getBody (). getState ments ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd All ( 0 , Ġfor AddTo Beginning ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd ( Js Return ( this Name Ref )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġconstructor Initializer ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ