/* Ċ Ġ* Ġ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 . jvm . lower Ċ Ċ import Ġg nu . tro ve . T Object Int HashMap Ċ import Ġorg . jetbrains . kotlin . backend . common . Class Lower ing Pass Ċ import Ġorg . jetbrains . kotlin . backend . common . ir . copy To Ċ import Ġorg . jetbrains . kotlin . backend . common . ph aser . make Ir File Phase Ċ import Ġorg . jetbrains . kotlin . backend . jvm . Jvm Backend Context Ċ import Ġorg . jetbrains . kotlin . backend . jvm . Jvm Lower ed Declaration Origin Ċ import Ġorg . jetbrains . kotlin . backend . jvm . ir . create Jvm Ir Builder Ċ import Ġorg . jetbrains . kotlin . backend . jvm . ir . ir Array Ċ import Ġorg . jetbrains . kotlin . descriptors . Class Kind Ċ import Ġorg . jetbrains . kotlin . descriptors . Vis ibilities Ċ import Ġorg . jetbrains . kotlin . ir . Ir Statement Ċ import Ġorg . jetbrains . kotlin . ir . UNDEFINED _ OFFSET Ċ 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 . declarations . impl . Ir Value Parameter Impl Ċ import Ġorg . jetbrains . kotlin . ir . descriptors . Wrapped Class Constructor Descriptor Ċ import Ġorg . jetbrains . kotlin . ir . descriptors . Wrapped FieldDescriptor Ċ import Ġorg . jetbrains . kotlin . ir . descriptors . Wrapped Value Parameter Descriptor Ċ import Ġorg . jetbrains . kotlin . ir . expressions .* Ċ import Ġorg . jetbrains . kotlin . ir . expressions . impl .* Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Constructor Symbol Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Value Parameter Symbol Ċ 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 . symbols . impl . Ir Value Parameter Symbol Impl Ċ import Ġorg . jetbrains . kotlin . ir . types . type With Ċ import Ġorg . jetbrains . kotlin . ir . util .* Ċ import Ġorg . jetbrains . kotlin . ir . visitor s . Ir Element Transformer Void Ċ import Ġorg . jetbrains . kotlin . ir . visitor s . transform Children Void Ċ import Ġorg . jetbrains . kotlin . name . Name Ċ import Ġjava . util .* Ċ Ċ internal Ġval Ġenum Class Phase Ġ= Ġmake Ir File Phase ( ĊĠĠĠ Ġ:: Enum Class Lower ing , ĊĠĠĠ Ġname Ġ= Ġ" Enum Class ", ĊĠĠĠ Ġdescription Ġ= Ġ" Handle Ġenum Ġclasses " Ċ ) Ċ Ċ private Ġclass ĠEnum Class Lower ing ( val Ġcontext : ĠJ vm Backend Context ) Ġ: ĠClass Lower ing Pass Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġlower ( ir Class : ĠIr Class ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! ir Class . is Enum Class ) Ġreturn ĊĊĠĠĠĠĠĠĠ ĠEnum Class Transformer ( ir Class ). run () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinterface ĠEnum Constructor Call Transformer Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġtransform ( enum Constructor Call : ĠIr Enum Constructor Call ): ĠIr Expression ĊĠĠĠĠĠĠĠ Ġfun Ġtransform ( deleg ating Constructor Call : ĠIr Delegating Constructor Call ): ĠIr Expression ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠEnum Class Transformer ( val Ġir Class : ĠIr Class ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġenum Entry Ordinal s Ġ= ĠTObject Int HashMap < Ir Enum Entry >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġenum Entry Class To Entry Ġ= ĠHashMap < Ir Class , ĠIr Enum Entry >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlower ed Enum Construct ors Ġ= ĠHashMap < Ir Constructor Symbol , ĠIr Constructor Impl >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlower ed Enum Constructor Parameters Ġ= ĠHashMap < Ir Value Parameter Symbol , ĠIr Value Parameter >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġenum Entries By Field Ġ= ĠHashMap < Ir Field , ĠIr Enum Entry >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġenum Entry Fields Ġ= ĠArrayList < Ir Field >() ĊĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġvalues Field : ĠIr Field ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġvalues Function : ĠIr Function ĊĠĠĠĠĠĠĠ Ġprivate Ġlateinit Ġvar Ġvalue Of Function : ĠIr Function ĊĊĠĠĠĠĠĠĠ Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinsert Instance Initializer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassign Ordinal sTo Enum Entries () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlower Enum Construct ors ( ir Class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlower Enum Entries () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Synt hesized Enum Class Members () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlower Enum Class Body () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġthat Ġan Ġinstance Ġinitializer Ġcall Ġexists , Ġso Ġthat Ġfield Ġinitialization Ġcode Ġwill Ġbe Ġgenerated . ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠThis Ġfunction Ġis Ġidentical Ġto Ġthe Ġone Ġused Ġin Ġthe ĠJS Ġlower ings . ĠShare Ġthem . ĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġinsert Instance Initializer () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Class . transform Children Void ( object Ġ: ĠIr Element Transformer Void () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Class ( declaration : ĠIr Class ) Ġ= Ġdeclaration ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Constructor ( declaration : ĠIr Constructor ): ĠIr Statement Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration . transform Children Void ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġblock Body Ġ= Ġdeclaration . body Ġas ĠIr Block Body ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! block Body . statements . any Ġ{ Ġit Ġis ĠIr Instance Initializer Call Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblock Body . statements . transform Flat Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠIr Enum Constructor Call ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit , ĠIr Instance Initializer Call Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration . start Offset , Ġdeclaration . start Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Class . symbol , Ġcontext . ir Built Ins . unit Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdeclaration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġassign Ordinal sTo Enum Entries () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġordinal Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Class . declarations . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it Ġis ĠIr Enum Entry ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum Entry Ordinal s . put ( it , Ġordinal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . corre sponding Class ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum Entry Class To Entry . put ( this , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġordinal ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġlower Enum Construct ors ( ir Class : ĠIr Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Class . declarations . transform Ġ{ Ġdeclaration Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( declaration Ġis ĠIr Constructor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransform Enum Constructor ( declaration , Ġir Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġtransform Enum Constructor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenum Constructor : ĠIr Constructor , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenum Class : ĠIr Class ĊĠĠĠĠĠĠĠ Ġ): ĠIr Constructor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= ĠWr apped Class Constructor Descriptor ( enum Constructor . descriptor . annotations , Ġenum Constructor . descriptor . source ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIr Constructor Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum Constructor . start Offset , Ġenum Constructor . end Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum Constructor . origin , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr Constructor Symbol Impl ( descriptor ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum Constructor . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum Constructor . visibility , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ= Ġenum Constructor . returnType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Inline Ġ= Ġenum Constructor . is Inline , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis External Ġ= Ġenum Constructor . is External , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Primary Ġ= Ġenum Constructor . is Primary , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Expect Ġ= Ġenum Constructor . is Expect ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Constructor Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . bind ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġenum Class ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Parameter Ġ= Ġmake Name Value Parameter ( new Constructor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġordinal Parameter Ġ= Ġmake Ordinal Value Parameter ( new Constructor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Parameters . add ( 0 , Ġname Parameter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Parameters . add ( 1 , Ġordinal Parameter ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Parameters . addAll ( enum Constructor . value Parameters . map Ġ{ Ġparam Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparam . copy To ( new Constructor , Ġindex Ġ= Ġparam . index Ġ+ Ġ 2 ). also Ġ{ Ġnew Param Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlower ed Enum Constructor Parameters [ param . symbol ] Ġ= Ġnew Param ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġenum Constructor . body ?. patch Declaration Parents ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlower ed Enum Construct ors [ enum Constructor . symbol ] Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata Ġ= Ġenum Constructor . metadata ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġmake Name Value Parameter ( constructor : ĠIr Constructor ): ĠIr Value Parameter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= ĠWr apped Value Parameter Descriptor () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIr Value Parameter Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUN DEFINED _ OFFSET , ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJ vm Lower ed Declaration Origin . ENUM _ CON STRUCTOR _ SYN TH ET IC _ PARAMETER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr Value Parameter Symbol Impl ( descriptor ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠName . identifier ("\ $ enum \$ name "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġcontext . ir Built Ins . string Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar arg ElementType Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Cross inline Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis N oin line Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . bind ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġconstructor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġmake Ordinal Value Parameter ( constructor : ĠIr Constructor ): ĠIr Value Parameter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= ĠWr apped Value Parameter Descriptor () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIr Value Parameter Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUN DEFINED _ OFFSET , ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJ vm Lower ed Declaration Origin . ENUM _ CON STRUCTOR _ SYN TH ET IC _ PARAMETER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr Value Parameter Symbol Impl ( descriptor ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠName . identifier ("\ $ enum \$ ordinal "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġcontext . ir Built Ins . int Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar arg ElementType Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Cross inline Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis N oin line Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . bind ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent Ġ= Ġconstructor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġlower Enum Entries () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Class . transform Declarations Flat Ġ{ Ġdeclaration Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( declaration Ġis ĠIr Enum Entry ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf NotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Field For Enum Entry ( declaration ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlower Enum Entry Class ( declaration . corre sponding Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġlower Enum Entry Class ( enum Entry Class : ĠIr Class ?): ĠIr Class ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( enum Entry Class Ġ== Ġnull ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlower Enum Construct ors ( enum Entry Class ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġenum Entry Class ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcreate Field For Enum Entry ( enum Entry : ĠIr Enum Entry ): ĠIr Field Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . declaration Factory . getField For Enum Entry ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum Entry , Ġ( enum Entry . corre sponding Class Ġ?: Ġenum Entry . parent As Class ). default Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . initializer Ġ= ĠIr Expression Body Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum Entry . initializer Expression !!. patch Declaration Parents ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . annotations . addAll ( enum Entry . annotations ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum Entry Fields . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum Entries By Field [ it ] Ġ= Ġenum Entry ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġsetup Synt hesized Enum Class Members () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġir Field Ġ= Ġcreate Synt hetic Values Field Declaration () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Class . declarations . add ( ir Field ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalues Function Ġ= Ġfind Function For Member With Synt hetic Body Kind ( Ir Synt hetic Body Kind . ENUM _ VALUES ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Of Function Ġ= Ġfind Function For Member With Synt hetic Body Kind ( Ir Synt hetic Body Kind . ENUM _ VALUE OF ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġfind Function For Member With Synt hetic Body Kind ( kind : ĠIr Synt hetic Body Kind ): ĠIr Function Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Class . declarations . as Sequence (). filter Is Instance < Ir Function >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . body . let Ġ{ Ġbody Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġis ĠIr Synt hetic Body Ġ&& Ġbody . kind Ġ== Ġkind ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcreate Synt hetic Values Field Declaration (): ĠIr Field Impl Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues ArrayType Ġ= Ġcontext . ir Built Ins . array Class . type With ( ir Class . default Type ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġir Values Initializer Ġ= Ġcreate Synt hetic Values Field Initializer Expression () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= ĠWr apped FieldDescriptor () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIr Field Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUN DEFINED _ OFFSET , ĠUN DEFINED _ OFFSET , ĠIr Declaration Origin . FIELD _ FOR _ ENUM _ VALUES , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr Field Symbol Impl ( descriptor ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠName . identifier ("\ $ VALUES "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues ArrayType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVis ibilities . PRIVATE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Final Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis External Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Static Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Fake Override Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescriptor . bind ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . parent Ġ= Ġir Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . initializer Ġ= ĠIr Expression Body Impl ( UNDEFINED _ OFFSET , ĠUN DEFINED _ OFFSET , Ġir Values Initializer ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues Field Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcreate Synt hetic Values Field Initializer Expression (): ĠIr Expression Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . create Jvm Ir Builder ( ir Class . symbol ). ir Array ( context . ir Built Ins . array Class . type With ( ir Class . default Type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum Entry Fields . forEach Ġ{ Ġir Field Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ir GetField Impl ( UNDEFINED _ OFFSET , ĠUN DEFINED _ OFFSET , Ġir Field . symbol , Ġir Field . type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġlower Enum Class Body () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Class . transform Children Void ( Enum Class Body Transformer ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġinner Ġclass ĠIn Enum Class Constructor ( val Ġir Enum Constructor : ĠIr Constructor ) Ġ: ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEnum Constructor Call Transformer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġtransform ( enum Constructor Call : ĠIr Enum Constructor Call ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Offset Ġ= Ġenum Constructor Call . start Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Offset Ġ= Ġenum Constructor Call . end Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorigin Ġ= Ġenum Constructor Call . origin ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠIr Delegating Constructor Call Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . ir Built Ins . unit Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum Constructor Call . symbol , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum Constructor Call . type Arguments Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( enum Constructor Call . type Arguments Count Ġ== Ġ 1 ) Ġ{ Ġ" Enum < T > Ġcall Ġexpected :\ n ${ result . dump () }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . put Type Argument ( 0 , Ġenum Constructor Call . getType Argument ( 0 )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( result . symbol . owner . value Parameters . size Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Enum ( String , ĠInt ) Ġconstructor Ġcall Ġexpected :\ n ${ result . dump () }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Parameter Ġ= Ġir Enum Constructor . value Parameters . getOrElse ( 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAssertionError (" No Ġ' name ' Ġparameter Ġin Ġenum Ġconstructor : Ġ${ ir Enum Constructor . dump () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġordinal Parameter Ġ= Ġir Enum Constructor . value Parameters . getOrElse ( 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAssertionError (" No Ġ' ordinal ' Ġparameter Ġin Ġenum Ġconstructor : Ġ${ ir Enum Constructor . dump () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . put Value Argument ( 0 , ĠIr GetValue Impl ( start Offset , Ġend Offset , Ġname Parameter . symbol , Ġorigin )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . put Value Argument ( 1 , ĠIr GetValue Impl ( start Offset , Ġend Offset , Ġordinal Parameter . symbol , Ġorigin )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġtransform ( deleg ating Constructor Call : ĠIr Delegating Constructor Call ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Offset Ġ= Ġdeleg ating Constructor Call . start Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Offset Ġ= Ġdeleg ating Constructor Call . end Offset ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlower ed Deleg ated Constructor Ġ= Ġlower ed Enum Construct ors . getOrElse ( deleg ating Constructor Call . symbol ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAssertionError (" Constructor Ġcalled Ġin Ġenum Ġentry Ġinitializer Ġshould 've Ġbeen Ġlower ed : Ġ${ deleg ating Constructor Call . symbol }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠIr Delegating Constructor Call Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . ir Built Ins . unit Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlower ed Deleg ated Constructor . symbol , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlower ed Deleg ated Constructor . type Parameters . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( lower ed Deleg ated Constructor . type Parameters . size Ġ== Ġ 0 ) Ġ{ Ġ" Enum Ġdeleg ating Ġcall Ġexpected :\ n ${ result . dump () }" Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . put Value Argument ( 0 , ĠIr GetValue Impl ( start Offset , Ġend Offset , Ġir Enum Constructor . value Parameters [ 0 ]. symbol )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . put Value Argument ( 1 , ĠIr GetValue Impl ( start Offset , Ġend Offset , Ġir Enum Constructor . value Parameters [ 1 ]. symbol )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeleg ating Constructor Call . symbol . owner . value Parameters . forEach Ġ{ Ġvalue Parameter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġvalue Parameter . index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . put Value Argument ( i Ġ+ Ġ 2 , Ġdeleg ating Constructor Call . getValue Argument ( i )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġabstract Ġinner Ġclass ĠIn Enum Entry ( private Ġval Ġenum Entry : ĠIr Enum Entry ) Ġ: ĠEnum Constructor Call Transformer Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġtransform ( enum Constructor Call : ĠIr Enum Constructor Call ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġenum Entry . name . asString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġordinal Ġ= Ġenum Entry Ordinal s [ enum Entry ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstart Offset Ġ= Ġenum Constructor Call . start Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġend Offset Ġ= Ġenum Constructor Call . end Offset ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlower ed Constructor Ġ= Ġlower ed Enum Construct ors . getOrElse ( enum Constructor Call . symbol ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAssertionError (" Constructor Ġcalled Ġin Ġenum Ġentry Ġinitializer Ġshould 've Ġbeen Ġlower ed :\ n ${ enum Constructor Call . dump () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġcreate Constructor Call ( start Offset , Ġend Offset , Ġlower ed Constructor ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . put Value Argument ( 0 , ĠIr Const Impl . string ( start Offset , Ġend Offset , Ġcontext . ir Built Ins . string Type , Ġname )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . put Value Argument ( 1 , ĠIr Const Impl . int ( start Offset , Ġend Offset , Ġcontext . ir Built Ins . int Type , Ġordinal )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum Constructor Call . symbol . owner . value Parameters . forEach Ġ{ Ġvalue Parameter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi Ġ= Ġvalue Parameter . index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . put Value Argument ( i Ġ+ Ġ 2 , Ġenum Constructor Call . getValue Argument ( i )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġtransform ( deleg ating Constructor Call : ĠIr Delegating Constructor Call ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAssertionError (" Unexpected Ġdeleg ating Ġconstructor Ġcall Ġwithin Ġenum Ġentry : Ġ$ enum Entry ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġabstract Ġfun Ġcreate Constructor Call ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Offset : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Offset : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlower ed Constructor : ĠIr Constructor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ): ĠIr Member Access Expression ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġinner Ġclass ĠIn Enum Entry Class Constructor ( enum Entry : ĠIr Enum Entry ) Ġ: ĠIn Enum Entry ( enum Entry ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate Constructor Call ( start Offset : ĠInt , Ġend Offset : ĠInt , Ġlower ed Constructor : ĠIr Constructor ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr Delegating Constructor Call Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . ir Built Ins . unit Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlower ed Constructor . symbol , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlower ed Constructor . type Parameters . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġinner Ġclass ĠIn Enum Entry Initializer ( enum Entry : ĠIr Enum Entry ) Ġ: ĠIn Enum Entry ( enum Entry ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcreate Constructor Call ( start Offset : ĠInt , Ġend Offset : ĠInt , Ġlower ed Constructor : ĠIr Constructor ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr Constructor Call Impl . from Symbol Descriptor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlower ed Constructor . symbol . owner . parent As Class . default Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlower ed Constructor . symbol ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġinner Ġclass ĠEnum Class Body Transformer Ġ: ĠIr Element Transformer Void () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġvar Ġenum Constructor Call Transformer : ĠEnum Constructor Call Transformer ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Field ( declaration : ĠIr Field ): ĠIr Statement Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenum Entry Ġ= Ġenum Entries By Field [ declaration ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( enum Entry Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration . transform Children Void ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdeclaration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( enum Constructor Call Transformer Ġ== Ġnull ) Ġ{ Ġ" Nested Ġenum Ġentry Ġinitialization :\ n ${ declaration . dump () }" Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum Constructor Call Transformer Ġ= ĠIn Enum Entry Initializer ( enum Entry ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġsuper . visit Field ( declaration ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum Constructor Call Transformer Ġ= Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Constructor ( declaration : ĠIr Constructor ): ĠIr Statement Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontaining Class Ġ= Ġdeclaration . parent Ġas ĠIr Class ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO Ġlocal Ġ( non - enum ) Ġclass Ġin Ġenum Ġclass Ġconstructor ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprevious Ġ= Ġenum Constructor Call Transformer ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( containing Class . is Enum Entry ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( enum Constructor Call Transformer Ġ== Ġnull ) Ġ{ Ġ" Nested Ġenum Ġentry Ġinitialization :\ n ${ declaration . dump () }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum Constructor Call Transformer Ġ= ĠIn Enum Entry Class Constructor ( enum Entry Class To Entry [ containing Class ] !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( containing Class . is Enum Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( enum Constructor Call Transformer Ġ== Ġnull ) Ġ{ Ġ" Nested Ġenum Ġentry Ġinitialization :\ n ${ declaration . dump () }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum Constructor Call Transformer Ġ= ĠIn Enum Class Constructor ( declaration ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġsuper . visit Constructor ( declaration ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum Constructor Call Transformer Ġ= Ġprevious ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Enum Constructor Call ( expression : ĠIr Enum Constructor Call ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . transform Children Void ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Transformer Ġ= Ġenum Constructor Call Transformer Ġ?: Ġthrow ĠAssertionError ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Enum Ġconstructor Ġcall Ġoutside Ġof Ġenum Ġentry Ġinitialization Ġor Ġenum Ġclass Ġconstructor :\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Class . dump () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcall Transformer . transform ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Delegating Constructor Call ( expression : ĠIr Delegating Constructor Call ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . transform Children Void ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression . symbol . owner . parent As Class . kind Ġ== ĠClass Kind . ENUM _ CLASS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Transformer Ġ= Ġenum Constructor Call Transformer Ġ?: Ġthrow ĠAssertionError ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Enum Ġconstructor Ġcall Ġoutside Ġof Ġenum Ġentry Ġinitialization Ġor Ġenum Ġclass Ġconstructor :\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Class . dump () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcall Transformer . transform ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġexpression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit GetValue ( expression : ĠIr GetValue ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlower ed Parameter Ġ= Ġlower ed Enum Constructor Parameters [ expression . symbol ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( lower ed Parameter Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr GetValue Impl ( expression . start Offset , Ġexpression . end Offset , Ġlower ed Parameter . symbol , Ġexpression . origin ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Synt hetic Body ( body : ĠIr Synt hetic Body ): ĠIr Body Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( body . kind ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr Synt hetic Body Kind . ENUM _ VALUES Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Enum Values Body ( values Field ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr Synt hetic Body Kind . ENUM _ VALUE OF Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Enum ValueOf Body () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcreate Enum ValueOf Body (): ĠIr Body Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenum ValueOf Ġ= Ġcontext . ir Built Ins . enum ValueOf Symbol ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġir ValueOf Call Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr Call Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Class . default Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum ValueOf , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum ValueOf . owner . type Parameters . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir ValueOf Call . put Type Argument ( 0 , Ġir Class . default Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir ValueOf Call . put Value Argument ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĠIr GetValue Impl ( UNDEFINED _ OFFSET , ĠUN DEFINED _ OFFSET , Ġvalue Of Function . value Parameters [ 0 ]. symbol ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIr Block Body Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUN DEFINED _ OFFSET , ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr Return Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . ir Built Ins . nothing Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Of Function . symbol , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir ValueOf Call ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcreate Enum Values Body ( values Field : ĠIr Field ): ĠIr Body Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclone Fun Ġ= Ġcontext . ir Built Ins . array Class . owner . functions . find Ġ{ Ġit . name . asString () Ġ== Ġ" clone " Ġ} !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠreturnType Ġ= Ġvalues Function . symbol . owner . returnType ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġir Clone Values Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr Call Impl ( UNDEFINED _ OFFSET , ĠUN DEFINED _ OFFSET , ĠreturnType , Ġclone Fun . symbol , Ġ 1 ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Type Argument ( 0 , Ġir Class . default Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr GetField Impl ( UNDEFINED _ OFFSET , ĠUN DEFINED _ OFFSET , Ġvalues Field . symbol , Ġvalues Field . symbol . owner . type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠIr Block Body Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUN DEFINED _ OFFSET , ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr Return Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . ir Built Ins . nothing Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues Function . symbol , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Clone Values ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ