/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 8 Ġ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 . js Ċ Ċ import Ġorg . jetbrains . kotlin . backend . common . ir . Declaration Factory Ċ import Ġorg . jetbrains . kotlin . backend . common . ir . copy To Ċ import Ġorg . jetbrains . kotlin . backend . common . ir . copy Type Parameters From Ċ import Ġorg . jetbrains . kotlin . descriptors . Class Kind Ċ import Ġorg . jetbrains . kotlin . descriptors . Vis ibilities Ċ import Ġorg . jetbrains . kotlin . descriptors . Visibility Ċ import Ġorg . jetbrains . kotlin . ir . UNDEFINED _ OFFSET Ċ import Ġorg . jetbrains . kotlin . ir . backend . js . ir . Js Ir Builder Ċ import Ġorg . jetbrains . kotlin . ir . backend . js . utils . N amer Ċ import Ġorg . jetbrains . kotlin . ir . declarations .* Ċ import Ġorg . jetbrains . kotlin . ir . declarations . impl . Ir Constructor Impl Ċ import Ġorg . jetbrains . kotlin . ir . declarations . impl . Ir Field Impl Ċ import Ġorg . jetbrains . kotlin . ir . descriptors . Wrapped Class Constructor Descriptor Ċ import Ġorg . jetbrains . kotlin . ir . descriptors . Wrapped FieldDescriptor Ċ import Ġorg . jetbrains . kotlin . ir . symbols . impl . Ir Constructor Symbol Impl Ċ import Ġorg . jetbrains . kotlin . ir . symbols . impl . Ir Field Symbol Impl Ċ import Ġorg . jetbrains . kotlin . ir . types . Ir Type Ċ import Ġorg . jetbrains . kotlin . ir . util . default Type Ċ import Ġorg . jetbrains . kotlin . ir . util . dump Ċ import Ġorg . jetbrains . kotlin . name . Name Ċ import Ġjava . util .* Ċ Ċ class ĠJs Declaration Factory Ġ: ĠDeclaration Factory Ġ{ ĊĠĠĠ Ġprivate Ġval Ġsingleton Field Descriptors Ġ= ĠHashMap < Ir Class , ĠIr Field >() ĊĠĠĠ Ġprivate Ġval Ġouter This Field Symbols Ġ= ĠHashMap < Ir Class , ĠIr Field >() ĊĠĠĠ Ġprivate Ġval Ġinner Class Construct ors Ġ= ĠHashMap < Ir Constructor , ĠIr Constructor >() ĊĊĠĠĠ Ġoverride Ġfun Ġget Field For Enum Entry ( enum Entry : ĠIr Enum Entry , Ġentry Type : ĠIr Type ): ĠIr Field Ġ= ĠTODO () ĊĊĠĠĠ Ġoverride Ġfun Ġget Outer This Field ( inner Class : ĠIr Class ): ĠIr Field Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ(! inner Class . is Inner ) Ġthrow ĠAssertionError (" Class Ġis Ġnot Ġinner : Ġ${ inner Class . dump () }") ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġouter This Field Symbols . get Or Put ( inner Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġouter Class Ġ= Ġinner Class . parent Ġas ? ĠIr Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠAssertionError (" No Ġcontaining Ġclass Ġfor Ġinner Ġclass Ġ${ inner Class . dump () }") ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠName . identifier ("\ $ this ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfieldType Ġ= Ġouter Class . default Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvisibility Ġ= ĠVis ibilities . PROTECT ED ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Property With Backing Field ( name , Ġvisibility , Ġinner Class , ĠfieldType , ĠDeclaration Factory . FIELD _ FOR _ OUT ER _ THIS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Property With Backing Field ( name : ĠName , Ġvisibility : ĠVisibility , Ġparent : ĠIr Class , ĠfieldType : ĠIr Type , Ġorigin : ĠIr Declaration Origin ): ĠIr Field Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= ĠWr apped FieldDescriptor () ĊĠĠĠĠĠĠĠ Ġval Ġsymbol Ġ= ĠIr Field Symbol Impl ( descriptor ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠIr Field Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorigin , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfieldType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Final Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis External Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Static Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Fake Override Ġ= Ġorigin Ġ== ĠIr Declaration Origin . FA KE _ OVERRIDE ĊĠĠĠĠĠĠĠ Ġ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . bind ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . parent Ġ= Ġparent ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġget Inner Class Constructor With Outer This Parameter ( inner Class Constructor : ĠIr Constructor ): ĠIr Constructor Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinner Class Ġ= Ġinner Class Constructor . parent Ġas ĠIr Class ĊĠĠĠĠĠĠĠ Ġassert ( inner Class . is Inner ) Ġ{ Ġ" Class Ġis Ġnot Ġinner : Ġ$ inner Class " Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġinner Class Construct ors . get Or Put ( inner Class Constructor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Inner Class Constructor With Outer This Parameter ( inner Class Constructor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Inner Class Constructor With Outer This Parameter ( old Constructor : ĠIr Constructor ): ĠIr Constructor Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġir Class Ġ= Ġold Constructor . parent Ġas ĠIr Class ĊĠĠĠĠĠĠĠ Ġval Ġouter This Type Ġ= Ġ( ir Class . parent Ġas ĠIr Class ). default Type ĊĊĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= ĠWr apped Class Constructor Descriptor ( old Constructor . descriptor . annotations , Ġold Constructor . descriptor . source ) ĊĠĠĠĠĠĠĠ Ġval Ġsymbol Ġ= ĠIr Constructor Symbol Impl ( descriptor ) ĊĊĠĠĠĠĠĠĠ Ġval Ġnew Constructor Ġ= ĠIr Constructor Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Constructor . start Offset , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Constructor . end Offset , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Constructor . origin , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Constructor . name , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Constructor . visibility , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġold Constructor . returnType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Inline Ġ= Ġold Constructor . is Inline , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis External Ġ= Ġold Constructor . is External , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Primary Ġ= Ġold Constructor . is Primary , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Expect Ġ= Ġold Constructor . is Expect ĊĠĠĠĠĠĠĠ Ġ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . bind ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . parent Ġ= Ġold Constructor . parent ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnew Constructor . copy Type Parameters From ( old Constructor ) ĊĊĠĠĠĠĠĠĠ Ġval Ġouter This Value Parameter Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJs Ir Builder . build Value Parameter ( N amer . OUT ER _ NAME , Ġ 0 , Ġouter This Type ). also Ġ{ Ġit . parent Ġ= Ġnew Constructor Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠnewValue Parameters Ġ= Ġmutable ListOf ( outer This Value Parameter ) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( p Ġin Ġold Constructor . value Parameters ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠnewValue Parameters Ġ+= Ġp . copy To ( new Constructor , Ġindex Ġ= Ġp . index Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnew Constructor . value Parameters Ġ+= ĠnewValue Parameters ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnew Constructor ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Field For Object Instance ( singleton : ĠIr Class ): ĠIr Field Ġ= ĊĠĠĠĠĠĠĠ Ġsingleton Field Descriptors . get Or Put ( singleton ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Object Instance FieldDescriptor ( singleton , ĠJs Ir Builder . SYN TH ES IZED _ DECL AR ATION ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Object Instance FieldDescriptor ( singleton : ĠIr Class , Ġorigin : ĠIr Declaration Origin ): ĠIr Field Ġ{ ĊĠĠĠĠĠĠĠ Ġassert ( singleton . kind Ġ== ĠClass Kind . OBJECT ) Ġ{ Ġ" Should Ġbe Ġan Ġobject : Ġ$ singleton " Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠName . identifier (" INSTANCE ") ĊĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Property With Backing Field ( name , ĠVis ibilities . PUBLIC , Ġsingleton , Ġsingleton . default Type , Ġorigin ) ĊĠĠĠ Ġ} Ċ } Ċ