/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* Ġ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 Ġandroidx . compose . compiler . plugins . kotlin . lower Ċ Ċ import Ġandroidx . compose . compiler . plugins . kotlin . Compose Fq Names Ċ import Ġorg . jetbrains . kotlin . backend . common . extensions . Ir Plugin Context Ċ import Ġorg . jetbrains . kotlin . backend . common . ir . addChild Ċ import Ġorg . jetbrains . kotlin . backend . common . ir . copy To Ċ import Ġorg . jetbrains . kotlin . backend . common . ir . create Parameter Declarations Ċ import Ġorg . jetbrains . kotlin . backend . common . lower . Declaration Ir Builder Ċ import Ġorg . jetbrains . kotlin . descriptors . Class Kind Ċ import Ġorg . jetbrains . kotlin . descriptors . Descriptor Vis ibilities Ċ import Ġorg . jetbrains . kotlin . ir . Ir Statement Ċ import Ġorg . jetbrains . kotlin . ir . Obsolete Descriptor Based API Ċ import Ġorg . jetbrains . kotlin . ir . UNDEFINED _ OFFSET Ċ import Ġorg . jetbrains . kotlin . ir . builders . declarations . Ir Function Builder Ċ import Ġorg . jetbrains . kotlin . ir . builders . declarations . add Constructor Ċ import Ġorg . jetbrains . kotlin . ir . builders . declarations . addFunction Ċ import Ġorg . jetbrains . kotlin . ir . builders . declarations . add Getter Ċ import Ġorg . jetbrains . kotlin . ir . builders . declarations . addProperty Ċ import Ġorg . jetbrains . kotlin . ir . builders . declarations . add Value Parameter Ċ import Ġorg . jetbrains . kotlin . ir . builders . declarations . build Class Ċ import Ġorg . jetbrains . kotlin . ir . builders . declarations . build Field Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir Block Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir Block Body Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir Call Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir Delegating Constructor Call Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir Get Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir GetField Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir If Null Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir Return Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir Set Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir Set Field Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir String Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir Temporary Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Annotation Container Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Class Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Declaration Origin Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Enum Entry Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Factory Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir File Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Module Fragment Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Property Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Simple Function Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Value Parameter Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Variable Ċ import Ġorg . jetbrains . kotlin . ir . declarations . lazy . Ir Lazy Function Ċ import Ġorg . jetbrains . kotlin . ir . descriptors . Wrapped Function Descriptor With Container Source Ċ import Ġorg . jetbrains . kotlin . ir . descriptors . Wrapped Simple Function Descriptor Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Block Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Block Body Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Body Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Branch Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Call Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Composite Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Const Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Const Kind Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Constructor Call Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Delegating Constructor Call Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Else Branch Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Enum Constructor Call Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Expression Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Loop Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Set Field Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir SetValue Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Statement Origin Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir String Concatenation Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Try Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Var arg Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Var arg Element Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir When Ċ import Ġorg . jetbrains . kotlin . ir . expressions . impl . Ir Branch Impl Ċ import Ġorg . jetbrains . kotlin . ir . expressions . impl . Ir Call Impl Ċ import Ġorg . jetbrains . kotlin . ir . expressions . impl . Ir Constructor Call Impl Ċ import Ġorg . jetbrains . kotlin . ir . expressions . impl . Ir Else Branch Impl Ċ import Ġorg . jetbrains . kotlin . ir . expressions . impl . Ir Expression Body Impl Ċ import Ġorg . jetbrains . kotlin . ir . expressions . impl . Ir GetObject Value Impl Ċ import Ġorg . jetbrains . kotlin . ir . expressions . impl . Ir String Concatenation Impl Ċ import Ġorg . jetbrains . kotlin . ir . expressions . impl . Ir Var arg Impl Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Simple Function Symbol Ċ import Ġorg . jetbrains . kotlin . ir . symbols . impl . Ir Simple Function Symbol Impl Ċ import Ġorg . jetbrains . kotlin . ir . types . Ir Type Ċ import Ġorg . jetbrains . kotlin . ir . types . default Type Ċ import Ġorg . jetbrains . kotlin . ir . types . make Nullable Ċ import Ġorg . jetbrains . kotlin . ir . types . type With Ċ import Ġorg . jetbrains . kotlin . ir . util . DeepCopy Symbol Rem apper Ċ import Ġorg . jetbrains . kotlin . ir . util . SYN TH ET IC _ OFFSET Ċ import Ġorg . jetbrains . kotlin . ir . util . construct ors Ċ import Ġorg . jetbrains . kotlin . ir . util . default Type Ċ import Ġorg . jetbrains . kotlin . ir . util . getProperty Getter Ċ import Ġorg . jetbrains . kotlin . ir . util . is Annotation Class Ċ import Ġorg . jetbrains . kotlin . ir . util . parent As Class Ċ import Ġorg . jetbrains . kotlin . ir . util . primary Constructor Ċ import Ġorg . jetbrains . kotlin . ir . visitor s . transform Children Void Ċ import Ġorg . jetbrains . kotlin . load . kotlin . Package Part Class Utils Ċ import Ġorg . jetbrains . kotlin . name . Name Ċ import Ġorg . jetbrains . kotlin . resolve . Binding Trace Ċ Ċ /** Ċ Ġ* ĠThis Ġtransformer Ġtransforms Ġconstant Ġliteral Ġexpressions Ġinto Ġexpressions Ġwhich Ġread Ġa Ċ Ġ* ĠMutable State Ġinstance Ġso Ġthat Ġchanges Ġto Ġthe Ġsource Ġcode Ġof Ġthe Ġconstant Ġliteral Ġcan Ġbe Ċ Ġ* Ġcommunic ated Ġto Ġthe Ġruntime Ġwithout Ġa Ġre compile . ĠThis Ġtransformation Ġis Ġintended Ġto Ġimprove Ċ Ġ* Ġdeveloper Ġexperience Ġand Ġshould Ġnever Ġbe Ġenabled Ġin Ġa Ġrelease Ġbuild Ġas Ġit Ġwill Ġsignificantly Ċ Ġ* Ġslow Ġdown Ġperformance - con sc ious Ġcode . Ċ Ġ* Ċ Ġ* ĠThe Ġn ont rivial Ġpiece Ġof Ġthis Ġtransform Ġis Ġto Ġcreate Ġa Ġstable Ġ" dur able " Ġunique Ġkey Ġfor Ġevery Ċ Ġ* Ġsingle Ġconstant Ġin Ġthe Ġmodule . ĠIt Ġdoes Ġthis Ġby Ġcreating Ġa Ġpath - based Ġkey Ġwhich Ġroughly Ġmaps Ġto Ċ Ġ* Ġthe Ġsemantic Ġstructure Ġof Ġthe Ġcode , Ġand Ġuses Ġan Ġincrement ing Ġindex Ġon Ġsibling Ġconstants Ġas Ġa Ċ Ġ* Ġlast Ġres ort . ĠThe Ġconstant Ġexpressions Ġin Ġthe ĠIR Ġwill Ġbe Ġtransformed Ġinto Ġproperty Ġgetter Ġcalls Ċ Ġ* Ġto Ġa Ġsynthetic Ġ" Live ĠL iterals " Ġclass Ġthat Ġis Ġgenerated Ġper Ġfile . ĠThe Ġclass Ġis Ġan Ġobject Ċ Ġ* Ġsingleton Ġwhere Ġeach Ġproperty Ġis Ġl az ily Ġbacked Ġby Ġa ĠMutable State Ġinstance Ġwhich Ġis Ġaccessed Ċ Ġ* Ġusing Ġthe Ġruntime 's Ġ` live Literal ( String , T )` Ġtop Ġlevel ĠAPI . Ċ Ġ* Ċ Ġ* ĠR ough ly Ġspeaking , Ġthe Ġtransform Ġwill Ġturn Ġthe Ġfollowing : Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġ// Ġfile : ĠFoo . kt Ċ Ġ* ĠĠĠĠ Ġfun ĠFoo () Ġ{ Ċ Ġ* ĠĠĠĠĠĠ Ġprint (" Hello ĠWorld ") Ċ Ġ* ĠĠĠĠ Ġ} Ċ Ġ* Ċ Ġ* Ġinto Ġthe Ġfollowing Ġequivalent Ġrepresentation : Ċ Ġ* Ċ Ġ* ĠĠĠ Ġ// Ġfile : ĠFoo . kt Ċ Ġ* ĠĠĠ Ġfun ĠFoo () Ġ{ Ċ Ġ* ĠĠĠĠĠ Ġprint ( Live L iterals $ Foo Kt .` getString $ arg - 0 $ call - print $ fun - Foo ` ()) Ċ Ġ* ĠĠĠ Ġ} Ċ Ġ* ĠĠĠ Ġobject ĠLive L iterals $ Foo Kt Ġ{ Ċ Ġ* ĠĠĠĠĠ Ġvar Ġ` String $ arg - 0 $ call - print $ fun - Foo `: ĠString Ġ= Ġ" Hello ĠWorld " Ċ Ġ* ĠĠĠĠĠ Ġvar Ġ` State $ String $ arg - 0 $ call - print $ fun - Foo `: ĠMutable State < String >? Ġ= Ġnull Ċ Ġ* ĠĠĠĠĠ Ġfun Ġ` getString $ arg - 0 $ call - print $ fun - Foo ` (): ĠString Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠ Ġval Ġfield Ġ= Ġthis .` String $ arg - 0 $ call - print $ fun - Foo ` Ċ Ġ* ĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġif Ġ( field Ġ== Ġnull ) Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= Ġlive Literal ( Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" String $ arg - 0 $ call - print $ fun - Foo ", Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis .` String $ arg - 0 $ call - print $ fun - Foo ` Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġ) Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġthis .` String $ arg - 0 $ call - print $ fun - Foo ` Ġ= Ġtmp Ċ Ġ* ĠĠĠĠĠĠĠĠĠ Ġtmp Ċ Ġ* ĠĠĠĠĠĠĠ Ġ} Ġelse Ġfield Ċ Ġ* ĠĠĠĠĠĠĠ Ġreturn Ġfield . value Ċ Ġ* ĠĠĠĠĠ Ġ} Ċ Ġ* ĠĠĠ Ġ} Ċ Ġ* Ċ Ġ* Ġ@ see ĠDur able Key Visitor Ċ Ġ*/ Ċ open Ġclass ĠLive Literal Transformer ( ĊĠĠĠ Ġprivate Ġval Ġlive L iterals Enabled : ĠBoolean , ĊĠĠĠ Ġprivate Ġval Ġuse Per File Enabled Flag : ĠBoolean , ĊĠĠĠ Ġprivate Ġval Ġkey Visitor : ĠDur able Key Visitor , ĊĠĠĠ Ġcontext : ĠIr Plugin Context , ĊĠĠĠ Ġsymbol Rem apper : ĠDeepCopy Symbol Rem apper , ĊĠĠĠ Ġbinding Trace : ĠBinding Trace Ċ ) Ġ: ĊĠĠĠ ĠAbstract Compose Lower ing ( context , Ġsymbol Rem apper , Ġbinding Trace ), ĊĠĠĠ ĠModule Lower ing Pass Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġlower ( module : ĠIr Module Fragment ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmodule . transform Children Void ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġlive Literal Ġ= ĊĠĠĠĠĠĠĠ Ġget Internal Function (" live Literal ") ĊĠĠĠ Ġprivate Ġval Ġderived State Of Ġ= ĊĠĠĠĠĠĠĠ Ġget TopLevel Function ( Compose Fq Names . fq Name For (" derived State Of ")) ĊĠĠĠ Ġprivate Ġval Ġis Live L iterals Enabled Ġ= ĊĠĠĠĠĠĠĠ Ġget Internal Property (" is Live L iterals Enabled ") ĊĠĠĠ Ġprivate Ġval Ġlive Literal Info Annotation Ġ= ĊĠĠĠĠĠĠĠ Ġget Internal Class (" Live Literal Info ") ĊĠĠĠ Ġprivate Ġval Ġlive Literal FileInfo Annotation Ġ= ĊĠĠĠĠĠĠĠ Ġget Internal Class (" Live Literal FileInfo ") ĊĠĠĠ Ġprivate Ġval Ġstate Interface Ġ= ĊĠĠĠĠĠĠĠ Ġget TopLevel Class ( Compose Fq Names . fq Name For (" State ")) ĊĠĠĠ Ġprivate Ġval ĠNo Live L iterals Annotation Ġ= ĊĠĠĠĠĠĠĠ Ġget TopLevel Class ( Compose Fq Names . fq Name For (" No Live L iterals ")) ĊĊĠĠĠ Ġprivate Ġfun ĠIr Annotation Container . has No Live L iterals Annotation (): ĠBoolean Ġ= Ġannotations . any Ġ{ ĊĠĠĠĠĠĠĠ Ġit . symbol . owner Ġ== ĠNo Live L iterals Annotation . owner . primary Constructor ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġenter ( key : ĠString , Ġblock : Ġ() Ġ-> ĠT ) Ġ= Ġkey Visitor . enter ( key , Ġblock ) ĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġs iblings ( key : ĠString , Ġblock : Ġ() Ġ-> ĠT ) Ġ= Ġkey Visitor . siblings ( key , Ġblock ) ĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġs iblings ( block : Ġ() Ġ-> ĠT ) Ġ= Ġkey Visitor . siblings ( block ) ĊĠĠĠ Ġprivate Ġvar Ġlive L iterals Class : ĠIr Class ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġlive L iterals Enabled Symbol : ĠIr Simple Function Symbol ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcurrent File : ĠIr File ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġfun Ġir Get Live L iterals Class (): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠIr GetObject Value Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Offset Ġ= ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Offset Ġ= ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġlive L iterals Class !!. default Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Ġ= Ġlive L iterals Class !!. symbol ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠName . as Jvm Friendly String (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ(! is Special ) Ġidentifier ĊĠĠĠĠĠĠĠ Ġelse Ġas String (). replace ('< ', Ġ'$ '). replace (' >', Ġ'$ '). replace (' Ġ', Ġ'-') ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġir Live Literal Info Annotation ( ĊĠĠĠĠĠĠĠ Ġkey : ĠString , ĊĠĠĠĠĠĠĠ Ġoffset : ĠInt ĊĠĠĠ Ġ): ĠIr Constructor Call Ġ= ĠIr Constructor Call Impl ( ĊĠĠĠĠĠĠĠ ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠ ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠ Ġlive Literal Info Annotation . default Type , ĊĠĠĠĠĠĠĠ Ġlive Literal Info Annotation . construct ors . single (), ĊĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠ 2 ĊĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġput Value Argument ( 0 , Ġir Const ( key )) ĊĠĠĠĠĠĠĠ Ġput Value Argument ( 1 , Ġir Const ( offset )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġir Live Literal FileInfo Annotation ( ĊĠĠĠĠĠĠĠ Ġfile : ĠString ĊĠĠĠ Ġ): ĠIr Constructor Call Ġ= ĠIr Constructor Call Impl ( ĊĠĠĠĠĠĠĠ ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠ ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠ Ġlive Literal FileInfo Annotation . default Type , ĊĠĠĠĠĠĠĠ Ġlive Literal FileInfo Annotation . construct ors . single (), ĊĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠ 1 ĊĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġput Value Argument ( 0 , Ġir Const ( file )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Opt In ( Obsolete Descriptor Based API :: class ) ĊĠĠĠ Ġprivate Ġfun Ġir Live Literal Getter ( ĊĠĠĠĠĠĠĠ Ġkey : ĠString , ĊĠĠĠĠĠĠĠ Ġliteral Value : ĠIr Expression , ĊĠĠĠĠĠĠĠ Ġliteral Type : ĠIr Type ĊĠĠĠ Ġ): ĠIr Simple Function Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclazz Ġ= Ġlive L iterals Class !! ĊĠĠĠĠĠĠĠ Ġval Ġstate Type Ġ= Ġstate Interface . owner . type With ( literal Type ). make Nullable () ĊĠĠĠĠĠĠĠ Ġval Ġstate GetValue Ġ= Ġstate Interface . getProperty Getter (" value ") !! ĊĠĠĠĠĠĠĠ Ġval Ġdefault Prop Ġ= Ġclazz . addProperty Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠName . identifier ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠDescriptor Vis ibilities . PRIVATE ĊĠĠĠĠĠĠĠ Ġ}. also Ġ{ Ġp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp . back ing Field Ġ= Ġcontext . ir Factory . build Field Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠName . identifier ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Static Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġliteral Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠDescriptor Vis ibilities . PRIVATE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. also Ġ{ Ġf Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf . corre sponding Property Symbol Ġ= Ġp . symbol ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf . parent Ġ= Ġclazz ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf . initializer Ġ= ĠIr Expression Body Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġliteral Value . start Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġliteral Value . end Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġliteral Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp . add Getter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ= Ġliteral Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠDescriptor Vis ibilities . PRIVATE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ= ĠIr Declaration Origin . DEFAULT _ PROPERTY _ ACCESS OR ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. also Ġ{ Ġfn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthis Param Ġ= Ġclazz . this Receiver !!. copy To ( fn ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfn . dispatch Receiver Parameter Ġ= Ġthis Param ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfn . body Ġ= ĠDeclaration Ir Builder ( context , Ġfn . symbol ). ir Block Body Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Return ( ir GetField ( ir Get ( this Param ), Ġp . back ing Field !! )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstate Prop Ġ= Ġclazz . addProperty Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠName . identifier (" State \ $$ key ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠDescriptor Vis ibilities . PRIVATE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Var Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ}. also Ġ{ Ġp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp . back ing Field Ġ= Ġcontext . ir Factory . build Field Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠName . identifier (" State \ $$ key ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġstate Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠDescriptor Vis ibilities . PRIVATE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Static Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. also Ġ{ Ġf Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf . corre sponding Property Symbol Ġ= Ġp . symbol ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf . parent Ġ= Ġclazz ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp . add Getter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ= Ġstate Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠDescriptor Vis ibilities . PRIVATE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ= ĠIr Declaration Origin . DEFAULT _ PROPERTY _ ACCESS OR ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. also Ġ{ Ġfn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthis Param Ġ= Ġclazz . this Receiver !!. copy To ( fn ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfn . dispatch Receiver Parameter Ġ= Ġthis Param ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfn . body Ġ= ĠDeclaration Ir Builder ( context , Ġfn . symbol ). ir Block Body Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Return ( ir GetField ( ir Get ( this Param ), Ġp . back ing Field !! )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġp . add Setter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ= Ġcontext . ir Built Ins . unit Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠDescriptor Vis ibilities . PRIVATE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ= ĠIr Declaration Origin . DEFAULT _ PROPERTY _ ACCESS OR ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. also Ġ{ Ġfn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthis Param Ġ= Ġclazz . this Receiver !!. copy To ( fn ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfn . dispatch Receiver Parameter Ġ= Ġthis Param ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Param Ġ= Ġfn . add Value Parameter (" value ", Ġstate Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfn . body Ġ= ĠDeclaration Ir Builder ( context , Ġfn . symbol ). ir Block Body Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Set Field ( ir Get ( this Param ), Ġp . back ing Field !! , Ġir Get ( value Param )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġclazz . addFunction ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġkey , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ= Ġliteral Type ĊĠĠĠĠĠĠĠ Ġ). also Ġ{ Ġfn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthis Param Ġ= Ġfn . dispatch Receiver Parameter !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfn . annotations Ġ+= Ġir Live Literal Info Annotation ( key , Ġliteral Value . start Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfn . body Ġ= ĠDeclaration Ir Builder ( context , Ġfn . symbol ). ir Block Body Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġ(! is Live L iterals Enabled ) Ġreturn ĠdefaultValue Field ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġval Ġa Ġ= Ġstate Field ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġval Ġb Ġ= Ġif Ġ( a Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġval Ġc Ġ= Ġlive Literal State (" key ", ĠdefaultValue Field ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġstate Field Ġ= Ġc ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠĠĠ Ġc ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ} Ġelse Ġa ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreturn Ġb . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcondition Ġ= Ġif Ġ( use Per File Enabled Flag ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Not ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Get ( built Ins . boolean Type , Ġir Get ( this Param ), Ġlive L iterals Enabled Symbol !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Not ( ir Call ( is Live L iterals Enabled )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir If ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcondition Ġ= Ġcondition , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Ġ= Ġir Return ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Get ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġliteral Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Get ( this Param ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Prop . getter !!. symbol ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġa Ġ= Ġir Temporary ( ir Get ( state Type , Ġir Get ( this Param ), Ġstate Prop . getter !!. symbol )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Ġ= Ġir If Null ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġstate Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubject Ġ= Ġir Get ( a ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthen Part Ġ= Ġir Block ( result Type Ġ= Ġstate Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlive Literal Call Ġ= Ġir Call ( live Literal ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( 0 , Ġir String ( key )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Get ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġliteral Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Get ( this Param ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Prop . getter !!. symbol ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput Type Argument ( 0 , Ġliteral Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġir Temporary ( live Literal Call ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Set ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Get ( this Param ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Prop . setter !!. symbol , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Get ( c ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Get ( c ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Part Ġ= Ġir Get ( a ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcall Ġ= ĠIr Call Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġliteral Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate GetValue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate GetValue . owner . type Parameters . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate GetValue . owner . value Parameters . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIr Statement Origin . FOR _ LOOP _ ITERATOR ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġb ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Return ( call ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Opt In ( Obsolete Descriptor Based API :: class ) ĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġvisit Const ( expression : ĠIr Const < T >): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( expression . kind ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Const Kind . Null Ġ-> Ġreturn Ġexpression ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġ( key , Ġsuccess ) Ġ= Ġkey Visitor . build Path ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprefix Ġ= Ġexpression . kind . asString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath Separator Ġ= Ġ"\ $", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsibling Separator Ġ= Ġ"-" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ// ĠNOTE : ĠEven Ġif Ġ` live L iterals Enabled ` Ġis Ġfalse , Ġwe Ġare Ġstill Ġgoing Ġto Ġthrow Ġan Ġexception ĊĠĠĠĠĠĠĠ Ġ// Ġhere Ġbecause Ġthe Ġpresence Ġof Ġa Ġduplicate Ġkey Ġrepresents Ġa Ġbug Ġin Ġthis Ġtransform Ġsince ĊĠĠĠĠĠĠĠ Ġ// Ġit Ġshould Ġbe Ġimpossible . ĠBy Ġchecking Ġthis Ġalways , Ġwe Ġare Ġmaking Ġit Ġso Ġthat Ġbugs Ġin ĊĠĠĠĠĠĠĠ Ġ// Ġthis Ġtransform Ġwill Ġget Ġcaught Ġ_ early _ Ġand Ġthat Ġthere Ġwill Ġbe Ġimplicitly Ġhigh Ġcoverage ĊĠĠĠĠĠĠĠ Ġ// Ġof Ġthe Ġkey Ġgeneration Ġalgorithm Ġdespite Ġthis Ġtransform Ġonly Ġbeing Ġused Ġby Ġtool ing . ĊĠĠĠĠĠĠĠ Ġ// ĠDevelopers Ġhave Ġthe Ġability Ġto Ġ" sil ence " Ġthis Ġexception Ġby Ġmarking Ġthe Ġsurrounding ĊĠĠĠĠĠĠĠ Ġ// Ġclass / file / function Ġwith Ġthe Ġ`@ No Live L iterals ` Ġannotation . ĊĠĠĠĠĠĠĠ Ġif Ġ(! success ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġcurrent File Ġ?: Ġreturn Ġexpression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= Ġfile . file Entry . getSource Range Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . start Offset , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . end Offset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Duplicate Ġlive Ġliteral Ġkey Ġfound : Ġ$ key \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Cause d Ġby Ġelement Ġat : Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ src . filePath }:${ src . start LineNumber }:${ src . start Column Number }\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" If Ġyou Ġencounter Ġthis Ġerror , Ġplease Ġfile Ġa Ġbug Ġat Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" https :// issue tracker . google . com / issues ? q = component id : 6 1 0 7 6 4 \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Try Ġadding Ġthe Ġ`@ No Live L iterals ` Ġannotation Ġaround Ġthe Ġsurrounding Ġcode Ġto Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" avoid Ġthis Ġexception ." ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġlive Ġliterals Ġare Ġenabled , Ġdon 't Ġdo Ġanything ĊĠĠĠĠĠĠĠ Ġif Ġ(! live L iterals Enabled ) Ġreturn Ġexpression ĊĊĠĠĠĠĠĠĠ Ġ// Ġcreate Ġthe Ġgetter Ġfunction Ġon Ġthe Ġlive Ġliterals Ġclass ĊĠĠĠĠĠĠĠ Ġval Ġgetter Ġ= Ġir Live Literal Getter ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= Ġkey , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġliteral Value Ġ= Ġexpression . copy (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġliteral Type Ġ= Ġexpression . type ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// Ġreturn Ġa Ġcall Ġto Ġthe Ġgetter Ġin Ġplace Ġof Ġthe Ġconstant ĊĠĠĠĠĠĠĠ Ġreturn ĠIr Call Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . start Offset , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . end Offset , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgetter . symbol , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgetter . symbol . owner . type Parameters . size , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgetter . symbol . owner . value Parameters . size ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġir Get Live L iterals Class () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Class ( declaration : ĠIr Class ): ĠIr Statement Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( declaration . has No Live L iterals Annotation ()) Ġreturn Ġdeclaration ĊĠĠĠĠĠĠĠ Ġ// Ġconstants Ġin Ġannotations Ġneed Ġto Ġbe Ġcompile - time Ġvalues , Ġso Ġwe Ġcan Ġnever Ġtransform Ġthem ĊĠĠĠĠĠĠĠ Ġif Ġ( declaration . is Annotation Class ) Ġreturn Ġdeclaration ĊĠĠĠĠĠĠĠ Ġreturn Ġs iblings (" class -${ declaration . name . as Jvm Friendly String () }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Class ( declaration ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġfun Ġmake Key Set (): ĠMutable Set < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmutable Set Of () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit File ( declaration : ĠIr File ): ĠIr File Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( declaration . has No Live L iterals Annotation ()) Ġreturn Ġdeclaration ĊĠĠĠĠĠĠĠ Ġval ĠfilePath Ġ= Ġdeclaration . file Entry . name ĊĠĠĠĠĠĠĠ Ġval ĠfileName Ġ= ĠfilePath . split ('/ '). last () ĊĠĠĠĠĠĠĠ Ġval Ġkeys Ġ= Ġmake Key Set () ĊĠĠĠĠĠĠĠ Ġreturn Ġkey Visitor . root ( keys ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Enabled Symbol Ġ= Ġlive L iterals Enabled Symbol ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnext Enabled Symbol : ĠIr Simple Function Symbol ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Class Ġ= Ġlive L iterals Class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Class Ġ= Ġcontext . ir Factory . build Class Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkind Ġ= ĠClass Kind . OBJECT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠDescriptor Vis ibilities . INTERNAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġshort Name Ġ= ĠPackage Part Class Utils . getFile Part ShortName ( fileName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġname Ġof Ġthe ĠLive L iterals Ġclass Ġis Ġper - file , Ġso Ġwe Ġuse Ġthe Ġsame Ġname Ġthat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġkotlin Ġfile Ġclass Ġlower ing Ġproduces , Ġprefixed Ġwith Ġ` Live L iterals $ `. ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠName . identifier (" Live L iterals ${ "$ "} $ short Name ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . create Parameter Declarations () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġstore Ġthe Ġfull Ġfile Ġpath Ġto Ġthe Ġfile Ġthat Ġthis Ġclass Ġis Ġassociated Ġwith Ġin Ġan ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġannotation Ġon Ġthe Ġclass . ĠThis Ġwill Ġbe Ġused Ġby Ġtool ing Ġto Ġassociate Ġthe Ġkeys ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinside Ġof Ġthis Ġclass Ġwith Ġactual ĠP SI Ġin Ġthe Ġeditor . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . annotations Ġ+= Ġir Live Literal FileInfo Annotation ( declaration . file Entry . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . add Constructor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Primary Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. also Ġ{ Ġctor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctor . body Ġ= ĠDeclaration Ir Builder ( context , Ġit . symbol ). ir Block Body Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Delegating Constructor Call ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. ir Built Ins ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. any Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. owner ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. primary Constructor !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( use Per File Enabled Flag ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenabled Prop Ġ= Ġit . addProperty Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠName . identifier (" enabled ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠDescriptor Vis ibilities . PRIVATE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. also Ġ{ Ġp Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . back ing Field Ġ= Ġcontext . ir Factory . build Field Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠName . identifier (" enabled ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Static Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġbuilt Ins . boolean Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠDescriptor Vis ibilities . PRIVATE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. also Ġ{ Ġf Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf . corre sponding Property Symbol Ġ= Ġp . symbol ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf . parent Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf . initializer Ġ= ĠIr Expression Body Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSYN TH ET IC _ OFFSET , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSYN TH ET IC _ OFFSET , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Const ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġp . add Getter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ= Ġbuilt Ins . boolean Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility Ġ= ĠDescriptor Vis ibilities . PRIVATE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ= ĠIr Declaration Origin . DEFAULT _ PROPERTY _ ACCESS OR ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. also Ġ{ Ġfn Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthis Param Ġ= Ġit . this Receiver !!. copy To ( fn ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfn . dispatch Receiver Parameter Ġ= Ġthis Param ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfn . body Ġ= ĠDeclaration Ir Builder ( context , Ġfn . symbol ). ir Block Body Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Return ( ir GetField ( ir Get ( this Param ), Ġp . back ing Field !! )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext Enabled Symbol Ġ= Ġenabled Prop . getter ?. symbol ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlive L iterals Class Ġ= Ġnext Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent File Ġ= Ġdeclaration ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlive L iterals Enabled Symbol Ġ= Ġnext Enabled Symbol ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= Ġsuper . visit File ( declaration ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġif Ġthere Ġwere Ġno Ġconstants Ġfound Ġin Ġthe Ġentire Ġfile , Ġthen Ġwe Ġdon 't Ġneed Ġto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcreate Ġthis Ġclass Ġat Ġall ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( live L iterals Enabled Ġ&& Ġkeys . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . addChild ( next Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlive L iterals Class Ġ= Ġprev Class ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlive L iterals Enabled Symbol Ġ= Ġprev Enabled Symbol ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Try ( a Try : ĠIr Try ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġa Try . try Result Ġ= Ġenter (" try ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa Try . try Result . transform ( this , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġs iblings Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa Try . cat ches . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . result Ġ= Ġenter (" catch ") Ġ{ Ġit . result . transform ( this , Ġnull ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġa Try . finally Expression Ġ= Ġenter (" finally ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa Try . finally Expression ?. transform ( this , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġa Try ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Delegating Constructor Call ( ĊĠĠĠĠĠĠĠ Ġexpression : ĠIr Delegating Constructor Call ĊĠĠĠ Ġ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġowner Ġ= Ġexpression . symbol . owner ĊĊĠĠĠĠĠĠĠ Ġ// Ġannotations Ġare Ġrepresented Ġas Ġconstructor Ġcalls Ġin ĠIR , Ġbut Ġthe Ġparameters Ġneed Ġto Ġbe ĊĠĠĠĠĠĠĠ Ġ// Ġcompile - time Ġvalues Ġonly , Ġso Ġwe Ġcan 't Ġtransform Ġthem Ġat Ġall . ĊĠĠĠĠĠĠĠ Ġif Ġ( owner . parent As Class . is Annotation Class ) Ġreturn Ġexpression ĊĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġowner . name . as Jvm Friendly String () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġenter (" call -$ name ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . dispatch Receiver Ġ= Ġenter ("\ $ this ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . dispatch Receiver ?. transform ( this , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . extension Receiver Ġ= Ġenter ("\ $\ $ this ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . extension Receiver ?. transform ( this , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġexpression . value Arguments Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarg Ġ= Ġexpression . getValue Argument ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( arg Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenter (" arg -$ i ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . put Value Argument ( i , Ġarg . transform ( this , Ġnull )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Enum Constructor Call ( expression : ĠIr Enum Constructor Call ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġowner Ġ= Ġexpression . symbol . owner ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġowner . name . as Jvm Friendly String () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġenter (" call -$ name ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . dispatch Receiver Ġ= Ġenter ("\ $ this ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . dispatch Receiver ?. transform ( this , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . extension Receiver Ġ= Ġenter ("\ $\ $ this ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . extension Receiver ?. transform ( this , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġexpression . value Arguments Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarg Ġ= Ġexpression . getValue Argument ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( arg Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenter (" arg -$ i ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . put Value Argument ( i , Ġarg . transform ( this , Ġnull )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Constructor Call ( expression : ĠIr Constructor Call ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġowner Ġ= Ġexpression . symbol . owner ĊĊĠĠĠĠĠĠĠ Ġ// Ġannotations Ġare Ġrepresented Ġas Ġconstructor Ġcalls Ġin ĠIR , Ġbut Ġthe Ġparameters Ġneed Ġto Ġbe ĊĠĠĠĠĠĠĠ Ġ// Ġcompile - time Ġvalues Ġonly , Ġso Ġwe Ġcan 't Ġtransform Ġthem Ġat Ġall . ĊĠĠĠĠĠĠĠ Ġif Ġ( owner . parent As Class . is Annotation Class ) Ġreturn Ġexpression ĊĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġowner . name . as Jvm Friendly String () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġenter (" call -$ name ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . dispatch Receiver Ġ= Ġenter ("\ $ this ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . dispatch Receiver ?. transform ( this , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . extension Receiver Ġ= Ġenter ("\ $\ $ this ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . extension Receiver ?. transform ( this , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġexpression . value Arguments Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarg Ġ= Ġexpression . getValue Argument ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( arg Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenter (" arg -$ i ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . put Value Argument ( i , Ġarg . transform ( this , Ġnull )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Call ( expression : ĠIr Call ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġowner Ġ= Ġexpression . symbol . owner ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġowner . name . as Jvm Friendly String () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġenter (" call -$ name ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . dispatch Receiver Ġ= Ġenter ("\ $ this ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . dispatch Receiver ?. transform ( this , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . extension Receiver Ġ= Ġenter ("\ $\ $ this ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . extension Receiver ?. transform ( this , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġexpression . value Arguments Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarg Ġ= Ġexpression . getValue Argument ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( arg Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenter (" arg -$ i ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . put Value Argument ( i , Ġarg . transform ( this , Ġnull )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Enum Entry ( declaration : ĠIr Enum Entry ): ĠIr Statement Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġenter (" entry -${ declaration . name . as Jvm Friendly String () }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Enum Entry ( declaration ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Var arg ( expression : ĠIr Var arg ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( expression Ġ! is ĠIr Var arg Impl ) Ġreturn Ġexpression ĊĠĠĠĠĠĠĠ Ġreturn Ġenter (" var arg ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . elements . forEach Indexed Ġ{ Ġi , Ġarg Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . elements [ i ] Ġ= Ġenter ("$ i ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarg . transform ( this , Ġnull ) Ġas ĠIr Var arg Element ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Simple Function ( declaration : ĠIr Simple Function ): ĠIr Statement Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( declaration . has No Live L iterals Annotation ()) Ġreturn Ġdeclaration ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġdeclaration . name . as Jvm Friendly String () ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġif Ġ( name Ġ== Ġ"< anonymous >") Ġ" lambda " Ġelse Ġ" fun -$ name " ĊĠĠĠĠĠĠĠ Ġreturn Ġenter ( path ) Ġ{ Ġsuper . visit Simple Function ( declaration ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Loop ( loop : ĠIr Loop ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( loop . origin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġin Ġthese Ġcases , Ġthe Ġcompiler Ġrelies Ġon Ġa Ġcertain Ġstructure Ġfor Ġthe Ġcondition ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġexpression , Ġso Ġwe Ġonly Ġtouch Ġthe Ġbody ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Statement Origin . WH ILE _ LOOP , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Statement Origin . FOR _ LOOP _ INNER _ WH ILE Ġ-> Ġenter (" loop ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloop . body Ġ= Ġenter (" body ") Ġ{ Ġloop . body ?. transform ( this , Ġnull ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloop ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġenter (" loop ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloop . condition Ġ= Ġenter (" cond ") Ġ{ Ġloop . condition . transform ( this , Ġnull ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloop . body Ġ= Ġenter (" body ") Ġ{ Ġloop . body ?. transform ( this , Ġnull ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġloop ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit String Concatenation ( expression : ĠIr String Concatenation ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( expression Ġ! is ĠIr String Concatenation Impl ) Ġreturn Ġexpression ĊĠĠĠĠĠĠĠ Ġreturn Ġenter (" str ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġs iblings Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . arguments . forEach Indexed Ġ{ Ġindex , Ġexpr Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . arguments [ index ] Ġ= Ġenter ("$ index ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpr . transform ( this , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit When ( expression : ĠIr When ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( expression . origin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAND AND Ġneeds Ġto Ġhave Ġan Ġ' if Ġtrue Ġthen Ġfalse ' Ġbody Ġon Ġits Ġsecond Ġbranch , Ġso Ġonly ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtransform Ġthe Ġfirst Ġbranch ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Statement Origin . AND AND Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . branches [ 0 ] Ġ= Ġexpression . branches [ 0 ]. transform ( this , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠOR OR Ġcondition Ġshould Ġhave Ġan Ġ' if Ġa Ġthen Ġtrue ' Ġbody Ġon Ġits Ġfirst Ġbranch , Ġso Ġonly ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtransform Ġthe Ġsecond Ġbranch ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Statement Origin . OR OR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . branches [ 1 ] Ġ= Ġexpression . branches [ 1 ]. transform ( this , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Statement Origin . IF Ġ-> Ġs iblings (" if ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit When ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġs iblings (" when ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit When ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Value Parameter ( declaration : ĠIr Value Parameter ): ĠIr Statement Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġenter (" param -${ declaration . name . as Jvm Friendly String () }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Value Parameter ( declaration ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Else Branch ( branch : ĠIr Else Branch ): ĠIr Else Branch Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠIr Else Branch Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Offset Ġ= Ġbranch . start Offset , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Offset Ġ= Ġbranch . end Offset , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġcondition Ġof Ġan Ġelse Ġbranch Ġis Ġa Ġconstant Ġboolean Ġbut Ġwe Ġdon 't Ġwant ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġto Ġconvert Ġit Ġinto Ġa Ġlive Ġliteral , Ġso Ġwe Ġdon 't Ġtransform Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcondition Ġ= Ġbranch . condition , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġenter (" else ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbranch . result . transform ( this , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Branch ( branch : ĠIr Branch ): ĠIr Branch Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠIr Branch Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Offset Ġ= Ġbranch . start Offset , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Offset Ġ= Ġbranch . end Offset , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcondition Ġ= Ġenter (" cond ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbranch . condition . transform ( this , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġonly Ġtranslate Ġthe Ġresult , Ġas Ġthe Ġbranch Ġis Ġa Ġconstant Ġboolean Ġbut Ġwe Ġdon 't Ġwant ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġto Ġconvert Ġit Ġinto Ġa Ġlive Ġliteral ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġenter (" branch ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbranch . result . transform ( this , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Composite ( expression : ĠIr Composite ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġs iblings Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Composite ( expression ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Block ( expression : ĠIr Block ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( expression . origin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġcompiler Ġrelies Ġon Ġa Ġcertain Ġstructure Ġfor Ġthe Ġ" iterator " Ġinstantiation Ġin ĠFor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġloops , Ġso Ġwe Ġavoid Ġtransform ing Ġthe Ġfirst Ġstatement Ġin Ġthis Ġcase ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Statement Origin . FOR _ LOOP , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Statement Origin . FOR _ LOOP _ INNER _ WH ILE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . statements [ 1 ] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . statements [ 1 ]. transform ( this , Ġnull ) Ġas ĠIr Statement ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠIr Statement Origin . SAFE _ CALL Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠIr Statement Origin . WHEN Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠIr Statement Origin . IF Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠIr Statement Origin . EL VIS Ċ // ĠĠĠĠĠĠĠĠĠĠĠ ĠIr Statement Origin . ARGUMENT S _ RE ORDER ING _ FOR _ CALL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġs iblings Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Block ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit SetValue ( expression : ĠIr SetValue ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġowner Ġ= Ġexpression . symbol . owner ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġowner . name ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( owner . origin ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfor Ġthese Ġsynthetic Ġvariable Ġdeclarations Ġwe Ġwant Ġto Ġavoid Ġtransform ing Ġthem Ġsince ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġcompiler Ġwill Ġrely Ġon Ġtheir Ġcompile Ġtime Ġvalue Ġin Ġsome Ġcases . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Declaration Origin . FOR _ LOOP _ IMP LICIT _ VARIABLE Ġ-> Ġexpression ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Declaration Origin . IR _ TEMP OR ARY _ VARIABLE Ġ-> Ġexpression ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Declaration Origin . FOR _ LOOP _ VARIABLE Ġ-> Ġexpression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġenter (" set -$ name ") Ġ{ Ġsuper . visit SetValue ( expression ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Set Field ( expression : ĠIr Set Field ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġexpression . symbol . owner . name ĊĠĠĠĠĠĠĠ Ġreturn Ġenter (" set -$ name ") Ġ{ Ġsuper . visit Set Field ( expression ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Block Body ( body : ĠIr Block Body ): ĠIr Body Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġs iblings Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Block Body ( body ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Variable ( declaration : ĠIr Variable ): ĠIr Statement Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġenter (" val -${ declaration . name . as Jvm Friendly String () }") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Variable ( declaration ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Property ( declaration : ĠIr Property ): ĠIr Statement Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( declaration . has No Live L iterals Annotation ()) Ġreturn Ġdeclaration ĊĠĠĠĠĠĠĠ Ġval Ġbacking Field Ġ= Ġdeclaration . back ing Field ĊĠĠĠĠĠĠĠ Ġval Ġgetter Ġ= Ġdeclaration . getter ĊĠĠĠĠĠĠĠ Ġval Ġsetter Ġ= Ġdeclaration . setter ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġdeclaration . name . as Jvm Friendly String () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġenter (" val -$ name ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġturn Ġthem Ġinto Ġlive Ġliterals . ĠWe Ġshould Ġconsider Ġtransform ing Ġsome Ġsimple Ġcases Ġlike ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ` val Ġfoo Ġ= Ġ 1 2 3 `, Ġbut Ġin Ġgeneral Ġturning Ġthis Ġinitializer Ġinto Ġa Ġgetter Ġis Ġnot Ġa ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsafe Ġoperation . ĠWe Ġshould Ġfigure Ġout Ġa Ġway Ġto Ġdo Ġthis Ġfor Ġ" static " Ġexpressions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthough Ġsuch Ġas Ġ` val Ġfoo Ġ= Ġ 1 6 . dp `. ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration . back ing Field Ġ= Ġbacking Field ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration . getter Ġ= Ġenter (" get ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgetter ?. transform ( this , Ġnull ) Ġas ? ĠIr Simple Function ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration . setter Ġ= Ġenter (" set ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsetter ?. transform ( this , Ġnull ) Ġas ? ĠIr Simple Function ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeclaration ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun ĠIr Property . add Setter ( builder : ĠIr Function Builder . () Ġ-> ĠUnit Ġ= Ġ{} ): ĠIr Simple Function Ġ= ĊĠĠĠĠĠĠĠ ĠIr Function Builder (). run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠName . special ("< set -${ this @ add Setter . name }> ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . ir Factory . build Function ( this ). also Ġ{ Ġsetter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ add Setter . setter Ġ= Ġsetter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsetter . parent Ġ= Ġthis @ add Setter . parent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠIr Factory . build Function ( builder : ĠIr Function Builder ): ĠIr Simple Function Ġ= Ġwith ( builder ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwith Container Source Ġ= Ġoriginal Declaration Ġis ĠIr Lazy Function Ġ|| Ġcontainer Source Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġwrapped Descriptor Ġ= Ġif Ġ( with Container Source ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠWr apped Function Descriptor With Container Source () ĊĠĠĠĠĠĠĠ Ġelse ĠWr apped Simple Function Descriptor () ĊĠĠĠĠĠĠĠ Ġcreate Function ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Offset , Ġend Offset , Ġorigin , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Simple Function Symbol Impl ( wrapped Descriptor ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname , Ġvisibility , Ġmod ality , ĠreturnType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Inline , Ġis External , Ġis Tail rec , Ġis Suspend , Ġis Operator , ĠisIn fix , Ġis Expect , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Fake Override , Ġcontainer Source , ĊĠĠĠĠĠĠĠ Ġ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrapped Descriptor . bind ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ