/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 6 Ġ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 . ir . builders Ċ Ċ import Ġorg . jetbrains . kotlin . ir . Ir Element Ċ import Ġorg . jetbrains . kotlin . ir . Ir Statement Ċ import Ġorg . jetbrains . kotlin . ir . UNDEFINED _ OFFSET Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Block Body Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Container Expression Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Expression Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Statement Origin Ċ import Ġorg . jetbrains . kotlin . ir . expressions . impl . Ir Block Body Impl Ċ import Ġorg . jetbrains . kotlin . ir . expressions . impl . Ir Block Impl Ċ import Ġorg . jetbrains . kotlin . ir . expressions . impl . Ir Composite Impl Ċ import Ġorg . jetbrains . kotlin . ir . types . Ir Type Ċ import Ġorg . jetbrains . kotlin . utils . addTo Std lib . safe As Ċ import Ġjava . util .* Ċ Ċ abstract Ġclass ĠIr Builder ( ĊĠĠĠ Ġoverride Ġval Ġcontext : ĠIr Generator Context , ĊĠĠĠ Ġvar Ġstart Offset : ĠInt , ĊĠĠĠ Ġvar Ġend Offset : ĠInt Ċ ) Ġ: ĠIr Generator Ċ Ċ abstract Ġclass ĠIr Builder With Scope ( ĊĠĠĠ Ġcontext : ĠIr Generator Context , ĊĠĠĠ Ġoverride Ġval Ġscope : ĠScope , ĊĠĠĠ Ġstart Offset : ĠInt , ĊĠĠĠ Ġend Offset : ĠInt Ċ ) Ġ: ĠIr Builder ( context , Ġstart Offset , Ġend Offset ), ĠIr Generator With Scope Ċ Ċ abstract Ġclass ĠIr Statements Builder < out ĠT Ġ: ĠIr Element >( ĊĠĠĠ Ġcontext : ĠIr Generator Context , ĊĠĠĠ Ġscope : ĠScope , ĊĠĠĠ Ġstart Offset : ĠInt , ĊĠĠĠ Ġend Offset : ĠInt Ċ ) Ġ: ĠIr Builder With Scope ( context , Ġscope , Ġstart Offset , Ġend Offset ), ĠIr Generator With Scope Ġ{ ĊĠĠĠ Ġoperator Ġfun ĠIr Statement . unary Plus () Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Statement ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġabstract Ġfun Ġadd Statement ( ir Statement : ĠIr Statement ) ĊĠĠĠ Ġabstract Ġfun Ġdo Build (): ĠT Ċ } Ċ Ċ open Ġclass ĠIr Block Body Builder ( ĊĠĠĠ Ġcontext : ĠIr Generator Context , ĊĠĠĠ Ġscope : ĠScope , ĊĠĠĠ Ġstart Offset : ĠInt , ĊĠĠĠ Ġend Offset : ĠInt Ċ ) Ġ: ĠIr Statements Builder < Ir Block Body >( context , Ġscope , Ġstart Offset , Ġend Offset ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġir Block Body Ġ= ĠIr Block Body Impl ( start Offset , Ġend Offset ) ĊĊĠĠĠ Ġinline Ġfun Ġblock Body ( body : ĠIr Block Body Builder . () Ġ-> ĠUnit ): ĠIr Block Body Ġ{ ĊĠĠĠĠĠĠĠ Ġbody () ĊĠĠĠĠĠĠĠ Ġreturn Ġdo Build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Statement ( ir Statement : ĠIr Statement ) Ġ{ ĊĠĠĠĠĠĠĠ Ġir Block Body . statements . add ( ir Statement ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdo Build (): ĠIr Block Body Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġir Block Body ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠIr Block Builder ( ĊĠĠĠ Ġcontext : ĠIr Generator Context , ĊĠĠĠ Ġscope : ĠScope , ĊĠĠĠ Ġstart Offset : ĠInt , ĊĠĠĠ Ġend Offset : ĠInt , ĊĠĠĠ Ġval Ġorigin : ĠIr Statement Origin ? Ġ= Ġnull , ĊĠĠĠ Ġvar Ġresult Type : ĠIr Type ? Ġ= Ġnull , ĊĠĠĠ Ġval Ġis Transparent : Boolean Ġ= Ġfalse Ċ ) Ġ: ĠIr Statements Builder < Ir Container Expression >( context , Ġscope , Ġstart Offset , Ġend Offset ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġstatements Ġ= ĠArrayList < Ir Statement >() ĊĊĠĠĠ Ġinline Ġfun Ġblock ( body : ĠIr Block Builder . () Ġ-> ĠUnit ): ĠIr Container Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġbody () ĊĠĠĠĠĠĠĠ Ġreturn Ġdo Build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Statement ( ir Statement : ĠIr Statement ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstatements . add ( ir Statement ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdo Build (): ĠIr Container Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Type Ġ= Ġthis . result Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġstatements . last OrNull (). safe As < Ir Expression >() ?. type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġcontext . ir Built Ins . unit Type ĊĠĠĠĠĠĠĠ Ġval Ġir Block Ġ= Ġif Ġ( is Transparent ) ĠIr Composite Impl ( start Offset , Ġend Offset , Ġresult Type , Ġorigin ) Ġelse ĠIr Block Impl ( start Offset , Ġend Offset , Ġresult Type , Ġorigin ) ĊĠĠĠĠĠĠĠ Ġir Block . statements . addAll ( statements ) ĊĠĠĠĠĠĠĠ Ġreturn Ġir Block ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠIr Single Statement Builder ( ĊĠĠĠ Ġcontext : ĠIr Generator Context , ĊĠĠĠ Ġscope : ĠScope , ĊĠĠĠ Ġstart Offset : ĠInt , ĊĠĠĠ Ġend Offset : ĠInt , ĊĠĠĠ Ġval Ġorigin : ĠIr Statement Origin ? Ġ= Ġnull Ċ ) Ġ: ĠIr Builder With Scope ( context , Ġscope , Ġstart Offset , Ġend Offset ) Ġ{ ĊĊĠĠĠ Ġinline Ġfun Ġ< T Ġ: ĠIr Element > Ġbuild ( statement Builder : ĠIr Single Statement Builder . () Ġ-> ĠT ): ĠT Ġ= ĊĠĠĠĠĠĠĠ Ġstatement Builder () Ċ } Ċ Ċ inline Ġfun Ġ< T Ġ: ĠIr Element > ĠIr Generator With Scope . build Statement ( ĊĠĠĠ Ġstart Offset : ĠInt , ĊĠĠĠ Ġend Offset : ĠInt , ĊĠĠĠ Ġorigin : ĠIr Statement Origin ?, ĊĠĠĠ Ġbuilder : ĠIr Single Statement Builder . () Ġ-> ĠT Ċ ) Ġ= ĊĠĠĠ ĠIr Single Statement Builder ( context , Ġscope , Ġstart Offset , Ġend Offset , Ġorigin ). builder () Ċ Ċ inline Ġfun Ġ< T Ġ: ĠIr Element > ĠIr Generator With Scope . build Statement ( ĊĠĠĠ Ġstart Offset : ĠInt , ĊĠĠĠ Ġend Offset : ĠInt , ĊĠĠĠ Ġbuilder : ĠIr Single Statement Builder . () Ġ-> ĠT Ċ ) Ġ= ĊĠĠĠ ĠIr Single Statement Builder ( context , Ġscope , Ġstart Offset , Ġend Offset ). builder () Ċ Ċ fun Ġ< T Ġ: ĠIr Builder > ĠT . at ( start Offset : ĠInt , Ġend Offset : ĠInt ) Ġ= Ġapply Ġ{ ĊĠĠĠ Ġthis . start Offset Ġ= Ġstart Offset ĊĠĠĠ Ġthis . end Offset Ġ= Ġend Offset Ċ } Ċ Ċ inline Ġfun ĠIr Generator With Scope . ir Block ( ĊĠĠĠ Ġstart Offset : ĠInt Ġ= ĠUN DEFINED _ OFFSET , ĊĠĠĠ Ġend Offset : ĠInt Ġ= ĠUN DEFINED _ OFFSET , ĊĠĠĠ Ġorigin : ĠIr Statement Origin ? Ġ= Ġnull , ĊĠĠĠ Ġresult Type : ĠIr Type ? Ġ= Ġnull , ĊĠĠĠ Ġbody : ĠIr Block Builder . () Ġ-> ĠUnit Ċ ): ĠIr Expression Ġ= ĊĠĠĠ ĠIr Block Builder ( ĊĠĠĠĠĠĠĠ Ġcontext , Ġscope , ĊĠĠĠĠĠĠĠ Ġstart Offset , ĊĠĠĠĠĠĠĠ Ġend Offset , ĊĠĠĠĠĠĠĠ Ġorigin , Ġresult Type ĊĠĠĠ Ġ). block ( body ) Ċ Ċ inline Ġfun ĠIr Generator With Scope . ir Composite ( ĊĠĠĠ Ġstart Offset : ĠInt Ġ= ĠUN DEFINED _ OFFSET , ĊĠĠĠ Ġend Offset : ĠInt Ġ= ĠUN DEFINED _ OFFSET , ĊĠĠĠ Ġorigin : ĠIr Statement Origin ? Ġ= Ġnull , ĊĠĠĠ Ġresult Type : ĠIr Type ? Ġ= Ġnull , ĊĠĠĠ Ġbody : ĠIr Block Builder . () Ġ-> ĠUnit Ċ ): ĠIr Expression Ġ= ĊĠĠĠ ĠIr Block Builder ( ĊĠĠĠĠĠĠĠ Ġcontext , Ġscope , ĊĠĠĠĠĠĠĠ Ġstart Offset , ĊĠĠĠĠĠĠĠ Ġend Offset , ĊĠĠĠĠĠĠĠ Ġorigin , Ġresult Type , Ġtrue ĊĠĠĠ Ġ). block ( body ) Ċ Ċ inline Ġfun ĠIr Generator With Scope . ir Block Body ( ĊĠĠĠ Ġstart Offset : ĠInt Ġ= ĠUN DEFINED _ OFFSET , Ġend Offset : ĠInt Ġ= ĠUN DEFINED _ OFFSET , ĊĠĠĠ Ġbody : ĠIr Block Body Builder . () Ġ-> ĠUnit Ċ ): ĠIr Block Body Ġ= ĊĠĠĠ ĠIr Block Body Builder ( ĊĠĠĠĠĠĠĠ Ġcontext , Ġscope , ĊĠĠĠĠĠĠĠ Ġstart Offset , ĊĠĠĠĠĠĠĠ Ġend Offset ĊĠĠĠ Ġ). block Body ( body ) ĊĊ