/* Ċ Ġ* Ġ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 . ir . util Ċ Ċ import Ġorg . jetbrains . kotlin . descriptors .* Ċ import Ġorg . jetbrains . kotlin . ir . Ir Element Ċ import Ġorg . jetbrains . kotlin . ir . Ir Statement Ċ import Ġorg . jetbrains . kotlin . ir . Obsolete Descriptor Based API Ċ import Ġorg . jetbrains . kotlin . ir . declarations .* Ċ import Ġorg . jetbrains . kotlin . ir . descriptors . Ir Built Ins Ċ import Ġorg . jetbrains . kotlin . ir . expressions .* Ċ 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 Type Operator Call Impl Ċ import Ġorg . jetbrains . kotlin . ir . symbols .* Ċ import Ġorg . jetbrains . kotlin . ir . types .* Ċ import Ġorg . jetbrains . kotlin . name . Fq Name Ċ import Ġorg . jetbrains . kotlin . name . Special Names Ċ import Ġorg . jetbrains . kotlin . utils . DFS Ċ import Ġorg . jetbrains . kotlin . utils . addTo Std lib . safe As Ċ Ċ /** Ċ Ġ* ĠBind s Ġthe Ġarguments Ġexplicitly Ġrepresented Ġin Ġthe ĠIR Ġto Ġthe Ġparameters Ġof Ġthe Ġaccessed Ġfunction . Ċ Ġ* ĠThe Ġarguments Ġare Ġto Ġbe Ġevaluated Ġin Ġthe Ġsame Ġorder Ġas Ġthey Ġappear Ġin Ġthe Ġresulting Ġlist . Ċ Ġ*/ Ċ @ Obsolete Descriptor Based API Ċ fun ĠIr Member Access Expression <* >. get Arguments (): ĠList < Pair < Parameter Descriptor , ĠIr Expression >> Ġ{ ĊĠĠĠ Ġval Ġres Ġ= Ġmutable ListOf < Pair < Parameter Descriptor , ĠIr Expression >>() ĊĠĠĠ Ġval Ġdescriptor Ġ= Ġsymbol . descriptor Ġas ĠCallable Descriptor ĊĊĠĠĠ Ġ// ĠTODO : Ġensure Ġthe Ġorder Ġbelow Ġcorresponds Ġto Ġthe Ġone Ġdefined Ġin ĠKotlin Ġspecs . ĊĊĠĠĠ Ġdispatch Receiver ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġres Ġ+= Ġ( descriptor . dispatch Receiver Parameter !! Ġto Ġit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġextension Receiver ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġres Ġ+= Ġ( descriptor . extension Receiver Parameter !! Ġto Ġit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdescriptor . value Parameters . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarg Ġ= ĠgetValue Argument ( it . index ) ĊĠĠĠĠĠĠĠ Ġif Ġ( arg Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġres Ġ+= Ġ( it Ġto Ġarg ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġres Ċ } Ċ Ċ /** Ċ Ġ* ĠBind s Ġthe Ġarguments Ġexplicitly Ġrepresented Ġin Ġthe ĠIR Ġto Ġthe Ġparameters Ġof Ġthe Ġaccessed Ġfunction . Ċ Ġ* ĠThe Ġarguments Ġare Ġto Ġbe Ġevaluated Ġin Ġthe Ġsame Ġorder Ġas Ġthey Ġappear Ġin Ġthe Ġresulting Ġlist . Ċ Ġ*/ Ċ @ Obsolete Descriptor Based API Ċ @ Suppress (" unused ") Ġ// ĠUsed Ġin Ġkotlin - native Ċ fun ĠIr Function Access Expression . get Arguments With Symbols (): ĠList < Pair < Ir Value Parameter Symbol , ĠIr Expression >> Ġ{ ĊĠĠĠ Ġval Ġres Ġ= Ġmutable ListOf < Pair < Ir Value Parameter Symbol , ĠIr Expression >>() ĊĠĠĠ Ġval Ġir Function Ġ= Ġsymbol . owner ĊĊĠĠĠ Ġdispatch Receiver ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġres Ġ+= Ġ( ir Function . dispatch Receiver Parameter !!. symbol Ġto Ġit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġextension Receiver ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġres Ġ+= Ġ( ir Function . extension Receiver Parameter !!. symbol Ġto Ġit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġir Function . value Parameters . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarg Ġ= ĠgetValue Argument ( it . descriptor Ġas ĠValue Parameter Descriptor ) ĊĠĠĠĠĠĠĠ Ġif Ġ( arg Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġres Ġ+= Ġ( it . symbol Ġto Ġarg ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġres Ċ } Ċ Ċ /** Ċ Ġ* ĠBind s Ġthe Ġarguments Ġexplicitly Ġrepresented Ġin Ġthe ĠIR Ġto Ġthe Ġparameters Ġof Ġthe Ġaccessed Ġfunction . Ċ Ġ* ĠThe Ġarguments Ġare Ġto Ġbe Ġevaluated Ġin Ġthe Ġsame Ġorder Ġas Ġthey Ġappear Ġin Ġthe Ġresulting Ġlist . Ċ Ġ*/ Ċ fun ĠIr Member Access Expression <* >. get Arguments With Ir (): ĠList < Pair < Ir Value Parameter , ĠIr Expression >> Ġ{ ĊĠĠĠ Ġval Ġres Ġ= Ġmutable ListOf < Pair < Ir Value Parameter , ĠIr Expression >>() ĊĠĠĠ Ġval Ġir Function Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠIr Function Access Expression Ġ-> Ġthis . symbol . owner ĊĠĠĠĠĠĠĠ Ġis ĠIr Function Reference Ġ-> Ġthis . symbol . owner ĊĠĠĠĠĠĠĠ Ġis ĠIr Property Reference Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( this . field Ġ== Ġnull ) Ġ{ Ġ" Field Ġshould Ġbe Ġnull Ġto Ġuse Ġ` get Arguments With Ir ` Ġon ĠIr Property Reference : Ġ${ this . dump () }}" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . getter !!. owner ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdispatch Receiver ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġres Ġ+= Ġ( ir Function . dispatch Receiver Parameter !! Ġto Ġit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġextension Receiver ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġres Ġ+= Ġ( ir Function . extension Receiver Parameter !! Ġto Ġit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġir Function . value Parameters . forEach Indexed Ġ{ Ġindex , Ġit Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġarg Ġ= ĠgetValue Argument ( index ) ĊĠĠĠĠĠĠĠ Ġif Ġ( arg Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġres Ġ+= Ġ( it Ġto Ġarg ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġres Ċ } Ċ Ċ /** Ċ Ġ* ĠSets Ġarguments Ġthat Ġare Ġspecified Ġby Ġgiven Ġmapping Ġof Ġparameters . Ċ Ġ*/ Ċ @ Obsolete Descriptor Based API Ċ fun ĠIr Member Access Expression <* >. add Arguments ( args : ĠMap < Parameter Descriptor , ĠIr Expression >) Ġ{ ĊĠĠĠ Ġval Ġdescriptor Ġ= Ġsymbol . descriptor Ġas ĠCallable Descriptor ĊĠĠĠ Ġdescriptor . dispatch Receiver Parameter ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarg Ġ= Ġargs [ it ] ĊĠĠĠĠĠĠĠ Ġif Ġ( arg Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . dispatch Receiver Ġ= Ġarg ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdescriptor . extension Receiver Parameter ?. let Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarg Ġ= Ġargs [ it ] ĊĠĠĠĠĠĠĠ Ġif Ġ( arg Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . extension Receiver Ġ= Ġarg ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdescriptor . value Parameters . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarg Ġ= Ġargs [ it ] ĊĠĠĠĠĠĠĠ Ġif Ġ( arg Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . put Value Argument ( it . index , Ġarg ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Obsolete Descriptor Based API Ċ @ Suppress (" unused ") Ġ// ĠUsed Ġin Ġkotlin - native Ċ fun ĠIr Member Access Expression <* >. add Arguments ( args : ĠList < Pair < Parameter Descriptor , ĠIr Expression >>) Ġ= ĊĠĠĠ Ġthis . add Arguments ( args . toMap ()) Ċ Ċ fun ĠIr Expression . isNull Const () Ġ= Ġthis Ġis ĠIr Const < *> Ġ&& Ġthis . kind Ġ== ĠIr Const Kind . Null Ċ Ċ fun ĠIr Expression . isTrue Const () Ġ= Ġthis Ġis ĠIr Const < *> Ġ&& Ġthis . kind Ġ== ĠIr Const Kind . Boolean Ġ&& Ġthis . value Ġ== Ġtrue Ċ Ċ fun ĠIr Expression . isFalse Const () Ġ= Ġthis Ġis ĠIr Const < *> Ġ&& Ġthis . kind Ġ== ĠIr Const Kind . Boolean Ġ&& Ġthis . value Ġ== Ġfalse Ċ Ċ fun ĠIr Expression . is Integer Const ( value : ĠInt ) Ġ= Ġthis Ġis ĠIr Const < *> Ġ&& Ġthis . kind Ġ== ĠIr Const Kind . Int Ġ&& Ġthis . value Ġ== Ġvalue Ċ Ċ fun ĠIr Expression . coerce To Unit ( builtins : ĠIr Built Ins ): ĠIr Expression Ġ{ ĊĠĠĠ Ġreturn Ġco erce To Unit IfNeeded ( type , Ġbuiltins ) Ċ } Ċ Ċ fun ĠIr Expression . coerce To Unit IfNeeded ( valueType : ĠIr Type , Ġir Built Ins : ĠIr Built Ins ): ĠIr Expression Ġ{ ĊĠĠĠ Ġreturn Ġif Ġ( valueType . is Subtype Of ( ir Built Ins . unit Type , Ġir Built Ins )) ĊĠĠĠĠĠĠĠ Ġthis ĊĠĠĠ Ġelse ĊĠĠĠĠĠĠĠ ĠIr Type Operator Call Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Offset , Ġend Offset , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Built Ins . unit Type , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Type Operator . IMP LICIT _ CO ERC ION _ TO _ UNIT , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġir Built Ins . unit Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ĊĠĠĠĠĠĠĠ Ġ) Ċ } Ċ Ċ @ Obsolete Descriptor Based API Ċ fun ĠIr Member Access Expression <* >. uses Default Arguments (): ĠBoolean Ġ= ĊĠĠĠ Ġ( symbol . descriptor Ġas ĠCallable Descriptor ). value Parameters . any Ġ{ Ġthis . getValue Argument ( it ) Ġ== Ġnull Ġ} Ċ Ċ val ĠIr Class . functions : ĠSequence < Ir Simple Function > ĊĠĠĠ Ġget () Ġ= Ġdeclarations . as Sequence (). filter Is Instance < Ir Simple Function >() Ċ Ċ val ĠIr Class Symbol . functions : ĠSequence < Ir Simple Function Symbol > ĊĠĠĠ Ġget () Ġ= Ġowner . functions . map Ġ{ Ġit . symbol Ġ} Ċ Ċ val ĠIr Class . construct ors : ĠSequence < Ir Constructor > ĊĠĠĠ Ġget () Ġ= Ġdeclarations . as Sequence (). filter Is Instance < Ir Constructor >() Ċ Ċ val ĠIr Class Symbol . construct ors : ĠSequence < Ir Constructor Symbol > ĊĠĠĠ Ġget () Ġ= Ġowner . construct ors . map Ġ{ Ġit . symbol Ġ} Ċ Ċ val ĠIr Class . fields : ĠSequence < Ir Field > ĊĠĠĠ Ġget () Ġ= Ġdeclarations . as Sequence (). filter Is Instance < Ir Field >() Ċ Ċ val ĠIr Class Symbol . fields : ĠSequence < Ir Field Symbol > ĊĠĠĠ Ġget () Ġ= Ġowner . fields . map Ġ{ Ġit . symbol Ġ} Ċ Ċ val ĠIr Class . primary Constructor : ĠIr Constructor ? ĊĠĠĠ Ġget () Ġ= Ġthis . declarations . single OrNull Ġ{ Ġit Ġis ĠIr Constructor Ġ&& Ġit . is Primary Ġ} Ġas ĠIr Constructor ? Ċ Ċ val ĠIr Declaration Container . properties : ĠSequence < Ir Property > ĊĠĠĠ Ġget () Ġ= Ġdeclarations . as Sequence (). filter Is Instance < Ir Property >() Ċ Ċ val ĠIr Function . explicit Parameters : ĠList < Ir Value Parameter > ĊĠĠĠ Ġget () Ġ= Ġ( listOf NotNull ( dispatch Receiver Parameter , Ġextension Receiver Parameter ) Ġ+ Ġvalue Parameters ) Ċ Ċ val ĠIr Body . statements : ĠList < Ir Statement > ĊĠĠĠ Ġget () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠIr Block Body Ġ-> Ġstatements ĊĠĠĠĠĠĠĠ Ġis ĠIr Expression Body Ġ-> ĠlistOf ( expression ) ĊĠĠĠĠĠĠĠ Ġis ĠIr Synt hetic Body Ġ-> Ġerror (" Synt hetic Ġbody Ġcontains Ġno Ġstatements : Ġ$ this ") ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Unknown Ġsubclass Ġof ĠIr Body : Ġ$ this ") ĊĠĠĠ Ġ} Ċ Ċ val ĠIr Class . default Type : ĠIr Simple Type ĊĠĠĠ Ġget () Ġ= Ġthis . this Receiver !!. type Ġas ĠIr Simple Type Ċ Ċ fun ĠIr Class . is Subclass Of ( ancestor : ĠIr Class ): ĠBoolean Ġ{ ĊĊĠĠĠ Ġval Ġalready Vis ited Ġ= Ġmutable Set Of < Ir Class >() ĊĊĠĠĠ Ġfun ĠIr Class . has Ancestor In Super Types (): ĠBoolean Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġthis Ġ=== Ġancestor Ġ-> Ġtrue ĊĠĠĠĠĠĠĠ Ġthis Ġin Ġalready Vis ited Ġ-> Ġfalse ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalready Vis ited . add ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper Types . map NotNull Ġ{ Ġ(( it Ġas ? ĠIr Simple Type )?. classifier Ġas ? ĠIr Class Symbol )?. owner Ġ}. any Ġ{ Ġit . has Ancestor In Super Types () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġthis . has Ancestor In Super Types () Ċ } Ċ Ċ fun ĠIr Simple Function . find Interface Implementation (): ĠIr Simple Function ? Ġ{ ĊĠĠĠ Ġif Ġ( is Real ) Ġreturn Ġnull ĊĊĠĠĠ Ġreturn Ġresolve Fake Override ()?. run Ġ{ Ġif Ġ( parent As Class . is Interface ) Ġthis Ġelse Ġnull Ġ} Ċ } Ċ Ċ fun ĠIr Property . resolve Fake Override (): ĠIr Property ? Ġ= Ġgetter ?. resolve Fake Override ()?. corre sponding Property Symbol ?. owner Ċ Ċ val ĠIr Class . is Annotation Class Ġget () Ġ= Ġkind Ġ== ĠClass Kind . AN NOT ATION _ CLASS Ċ val ĠIr Class . is Enum Class Ġget () Ġ= Ġkind Ġ== ĠClass Kind . ENUM _ CLASS Ċ val ĠIr Class . is Enum Entry Ġget () Ġ= Ġkind Ġ== ĠClass Kind . ENUM _ ENTRY Ċ val ĠIr Class . is Interface Ġget () Ġ= Ġkind Ġ== ĠClass Kind . INTERFACE Ċ val ĠIr Class . is Class Ġget () Ġ= Ġkind Ġ== ĠClass Kind . CLASS Ċ val ĠIr Class . isObject Ġget () Ġ= Ġkind Ġ== ĠClass Kind . OBJECT Ċ val ĠIr Class . is Anonymous Object Ġget () Ġ= Ġis Class Ġ&& Ġname Ġ== ĠSpecial Names . NO _ NAME _ PROVIDED Ċ val ĠIr Declaration WithName . fq Name When Available : ĠF q Name ? ĊĠĠĠ Ġget () Ġ= Ġwhen Ġ( val Ġparent Ġ= Ġparent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠIr Declaration WithName Ġ-> Ġparent . fq Name When Available ?. child ( name ) ĊĠĠĠĠĠĠĠ Ġis ĠIr Package Fragment Ġ-> Ġparent . fq Name . child ( name ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠ Ġ} Ċ Ċ val ĠIr Declaration . parent As Class : ĠIr Class ĊĠĠĠ Ġget () Ġ= Ġparent Ġas ? ĠIr Class ĊĠĠĠĠĠĠĠ Ġ?: Ġerror (" Parent Ġof Ġthis Ġdeclaration Ġis Ġnot Ġa Ġclass : Ġ${ render () }") Ċ Ċ tail rec Ġfun ĠIr Element . get Package Fragment (): ĠIr Package Fragment ? Ġ{ ĊĠĠĠ Ġif Ġ( this Ġis ĠIr Package Fragment ) Ġreturn Ġthis ĊĠĠĠ Ġreturn Ġwhen Ġ( val Ġparent Ġ= Ġ( this Ġas ? ĠIr Declaration )?. parent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠIr Package Fragment Ġ-> Ġparent ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġparent ?. get Package Fragment () ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠIr Annotation Container . getAnnotation ( name : ĠF q Name ): ĠIr Constructor Call ? Ġ= ĊĠĠĠ Ġannotations . find Ġ{ ĊĠĠĠĠĠĠĠ Ġit . symbol . owner . parent As Class . fq Name When Available Ġ== Ġname ĊĠĠĠ Ġ} Ċ Ċ fun ĠIr Annotation Container . has Annotation ( name : ĠF q Name ) Ġ= ĊĠĠĠ Ġannotations . any Ġ{ ĊĠĠĠĠĠĠĠ Ġit . symbol . owner . parent As Class . fq Name When Available Ġ== Ġname ĊĠĠĠ Ġ} Ċ Ċ fun ĠIr Annotation Container . has Annotation ( symbol : ĠIr Class Symbol ) Ġ= ĊĠĠĠ Ġannotations . any Ġ{ ĊĠĠĠĠĠĠĠ Ġit . symbol . owner . parent As Class . symbol Ġ== Ġsymbol ĊĠĠĠ Ġ} ĊĊ Ċ val ĠIr Constructor . construct ed ClassType Ġget () Ġ= Ġ( parent Ġas ĠIr Class ). this Receiver ?. type !! Ċ Ċ fun ĠIr Function . is Fake Over ridden From Any (): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġsimple Function Ġ= Ġthis Ġas ? ĠIr Simple Function Ġ?: Ġreturn Ġfalse ĊĊĠĠĠ Ġif Ġ(! simple Function . is Fake Override ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( parent Ġas ? ĠIr Class )?. this Receiver ?. type ?. is Any () Ġ?: Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġsimple Function . over ridden Symbols . all Ġ{ Ġit . owner . is Fake Over ridden From Any () Ġ} Ċ } Ċ Ċ fun ĠIr Call . is Super To Any () Ġ= Ġsuper Qualifier Symbol ?. let Ġ{ Ġthis . symbol . owner . is Fake Over ridden From Any () Ġ} Ġ?: Ġfalse ĊĊ Ċ fun ĠIr Declaration . has Interface Parent () Ġ= ĊĠĠĠ Ġparent . safe As < Ir Class >() ?. is Interface Ġ== Ġtrue Ċ Ċ fun ĠIr Declaration . is Effect ively External (): ĠBoolean Ġ{ ĊĊĠĠĠ Ġfun ĠIr Function . effective Parent Declaration (): ĠIr Declaration ? Ġ= ĊĠĠĠĠĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Simple Function Ġ-> Ġcorresponding Property Symbol ?. owner Ġ?: Ġparent Ġas ? ĠIr Declaration ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġparent Ġas ? ĠIr Declaration ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġparent Ġ= Ġparent ĊĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠIr Function Ġ-> Ġis External Ġ|| Ġ( effective Parent Declaration ()?. is Effect ively External () Ġ?: Ġfalse ) ĊĠĠĠĠĠĠĠ Ġis ĠIr Field Ġ-> Ġis External Ġ|| Ġparent Ġis ĠIr Declaration Ġ&& Ġparent . is Effect ively External () ĊĠĠĠĠĠĠĠ Ġis ĠIr Property Ġ-> Ġis External Ġ|| Ġparent Ġis ĠIr Declaration Ġ&& Ġparent . is Effect ively External () ĊĠĠĠĠĠĠĠ Ġis ĠIr Class Ġ-> Ġis External Ġ|| Ġparent Ġis ĠIr Declaration Ġ&& Ġparent . is Effect ively External () ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠIr Function . is External Or Inherited From External (): ĠBoolean Ġ{ ĊĠĠĠ Ġfun Ġis External Or Inherited From External Impl ( f : ĠIr Simple Function ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġf . is Effect ively External () Ġ|| Ġf . over ridden Symbols . any Ġ{ Ġis External Or Inherited From External Impl ( it . owner ) Ġ} ĊĊĠĠĠ Ġreturn Ġis Effect ively External () Ġ|| Ġ( this Ġis ĠIr Simple Function Ġ&& Ġis External Or Inherited From External Impl ( this )) Ċ } Ċ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠIr Declaration > ĠIr Declaration Container . find Declaration ( predicate : Ġ( T ) Ġ-> ĠBoolean ): ĠT ? Ġ= ĊĠĠĠ Ġdeclarations . find Ġ{ Ġit Ġis ĠT Ġ&& Ġpredicate ( it ) Ġ} Ġas ? ĠT Ċ Ċ fun ĠIr Value Parameter . has DefaultValue (): ĠBoolean Ġ= ĠDFS . if Any ( ĊĠĠĠ ĠlistOf ( this ), ĊĠĠĠ Ġ{ Ġcurrent Ġ-> Ġ( current . parent Ġas ? ĠIr Simple Function )?. over ridden Symbols ?. map Ġ{ Ġit . owner . value Parameters [ current . index ] Ġ} Ġ?: ĠlistOf () Ġ}, ĊĠĠĠ Ġ{ Ġcurrent Ġ-> Ġcurrent . defaultValue Ġ!= Ġnull Ġ} Ċ ) Ċ Ċ fun ĠReference Symbol Table . reference Classifier ( classifier : ĠClass ifier Descriptor ): ĠIr Classifier Symbol Ġ= ĊĠĠĠ Ġwhen Ġ( classifier ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠType Parameter Descriptor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreference Type Parameter ( classifier ) ĊĠĠĠĠĠĠĠ Ġis ĠClass Descriptor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreference Class ( classifier ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Unexpected Ġclassifier Ġdescriptor : Ġ$ classifier ") ĊĠĠĠ Ġ} Ċ Ċ fun ĠReference Symbol Table . reference Function ( callable : ĠCallable Descriptor ): ĠIr Function Symbol Ġ= ĊĠĠĠ Ġwhen Ġ( callable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠClass Constructor Descriptor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreference Constructor ( callable ) ĊĠĠĠĠĠĠĠ Ġis ĠFunction Descriptor Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreference Simple Function ( callable ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Unexpected Ġcallable Ġdescriptor : Ġ$ callable ") ĊĠĠĠ Ġ} Ċ Ċ /** Ċ Ġ* ĠCreate Ġnew Ġcall Ġbased Ġon Ġgiven Ġ[ call ] Ġand Ġ[ new Symbol ] Ċ Ġ* Ġ[ re ceiv ers As Arguments ]: Ġoptionally Ġconvert Ġcall Ġwith Ġdispatch Ġreceiver Ġto Ġstatic Ġcall Ċ Ġ* Ġ[ arguments As Dispatch ers ]: Ġoptionally Ġconvert Ġstatic Ġcall Ġto Ġcall Ġwith Ġdispatch Ġreceiver Ċ Ġ*/ Ċ fun Ġir Constructor Call ( ĊĠĠĠ Ġcall : ĠIr Function Access Expression , ĊĠĠĠ Ġnew Symbol : ĠIr Constructor Symbol , ĊĠĠĠ Ġreceiv ers As Arguments : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġarguments As Dispatch ers : ĠBoolean Ġ= Ġfalse Ċ ): ĠIr Constructor Call Ġ= ĊĠĠĠ Ġcall . run Ġ{ ĊĠĠĠĠĠĠĠ ĠIr Constructor Call Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Offset , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Offset , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Symbol , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Arguments Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . value Arguments Count , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorigin ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Type And Value Arguments From ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceiv ers As Arguments , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments As Dispatch ers ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ fun Ġir Call ( ĊĠĠĠ Ġcall : ĠIr Function Access Expression , ĊĠĠĠ Ġnew Function : ĠIr Simple Function , ĊĠĠĠ Ġreceiv ers As Arguments : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġarguments As Re ceiv ers : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġnew Super Qualifier Symbol : ĠIr Class Symbol ? Ġ= Ġnull Ċ ): ĠIr Call Ġ= ĊĠĠĠ Ġir Call ( ĊĠĠĠĠĠĠĠ Ġcall , ĊĠĠĠĠĠĠĠ Ġnew Function . symbol , ĊĠĠĠĠĠĠĠ Ġreceiv ers As Arguments , ĊĠĠĠĠĠĠĠ Ġarguments As Re ceiv ers , ĊĠĠĠĠĠĠĠ Ġnew Super Qualifier Symbol ĊĠĠĠ Ġ) Ċ Ċ fun Ġir Call ( ĊĠĠĠ Ġcall : ĠIr Function Access Expression , ĊĠĠĠ Ġnew Symbol : ĠIr Simple Function Symbol , ĊĠĠĠ Ġreceiv ers As Arguments : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġarguments As Re ceiv ers : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġnew Super Qualifier Symbol : ĠIr Class Symbol ? Ġ= Ġnull Ċ ): ĠIr Call Ġ= ĊĠĠĠ Ġcall . run Ġ{ ĊĠĠĠĠĠĠĠ ĠIr Call Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Offset , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Offset , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Symbol , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Arguments Count , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Arguments Count Ġ= Ġnew Symbol . owner . value Parameters . size , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ= Ġorigin , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper Qualifier Symbol Ġ= Ġnew Super Qualifier Symbol ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Type And Value Arguments From ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceiv ers As Arguments , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments As Re ceiv ers ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ fun ĠIr Member Access Expression < Ir Function Symbol >. copy Type And Value Arguments From ( ĊĠĠĠ Ġsrc : ĠIr Member Access Expression < Ir Function Symbol >, ĊĠĠĠ Ġreceiv ers As Arguments : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġarguments As Re ceiv ers : ĠBoolean Ġ= Ġfalse Ċ ) Ġ{ ĊĠĠĠ Ġcopy Type Arguments From ( src ) ĊĠĠĠ Ġcopy Value Arguments From ( src , Ġsymbol . owner , Ġreceiv ers As Arguments , Ġarguments As Re ceiv ers ) Ċ } Ċ Ċ fun ĠIr Member Access Expression < Ir Function Symbol >. copy Value Arguments From ( ĊĠĠĠ Ġsrc : ĠIr Member Access Expression < Ir Function Symbol >, ĊĠĠĠ Ġdest Function : ĠIr Function , ĊĠĠĠ Ġreceiv ers As Arguments : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġarguments As Re ceiv ers : ĠBoolean Ġ= Ġfalse Ċ ) Ġ{ ĊĠĠĠ Ġvar Ġdest Value Argument Index Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġsrc Value Argument Index Ġ= Ġ 0 ĊĊĠĠĠ Ġval Ġsrc Function Ġ= Ġsrc . symbol . owner ĊĊĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġreceiv ers As Arguments Ġ&& Ġsrc Function . dispatch Receiver Parameter Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( dest Value Argument Index ++, Ġsrc . dispatch Receiver ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġarguments As Re ceiv ers Ġ&& Ġdest Function . dispatch Receiver Parameter Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġsrc . getValue Argument ( src Value Argument Index ++) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdispatch Receiver Ġ= Ġsrc . dispatch Receiver ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġreceiv ers As Arguments Ġ&& Ġsrc Function . extension Receiver Parameter Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput Value Argument ( dest Value Argument Index ++, Ġsrc . extension Receiver ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġarguments As Re ceiv ers Ġ&& Ġdest Function . extension Receiver Parameter Ġ!= Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextension Receiver Ġ= Ġsrc . getValue Argument ( src Value Argument Index ++) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextension Receiver Ġ= Ġsrc . extension Receiver ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġwhile Ġ( src Value Argument Index Ġ< Ġsrc . value Arguments Count ) Ġ{ ĊĠĠĠĠĠĠĠ Ġput Value Argument ( dest Value Argument Index ++, Ġsrc . getValue Argument ( src Value Argument Index ++ )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ val ĠIr Declaration . file OrNull : ĠIr File ? ĊĠĠĠ Ġget () Ġ= Ġwhen Ġ( val Ġparent Ġ= Ġparent ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠIr File Ġ-> Ġparent ĊĠĠĠĠĠĠĠ Ġis ĠIr Package Fragment Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġis ĠIr Declaration Ġ-> Ġparent . file OrNull ĊĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTODO (" Unexpected Ġdeclaration Ġparent ") ĊĠĠĠ Ġ} Ċ Ċ val ĠIr Declaration . file : ĠIr File ĊĠĠĠ Ġget () Ġ= Ġfile OrNull Ġ?: ĠTODO (" Unknown Ġfile ") Ċ Ċ val ĠIr Declaration . parent Class OrNull : ĠIr Class ? ĊĠĠĠ Ġget () Ġ= Ġparent . let Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Class Ġ-> Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Declaration Ġ-> Ġit . parent Class OrNull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ val ĠIr Function . all Type Parameters : ĠList < Ir Type Parameter > ĊĠĠĠ Ġget () Ġ= Ġif Ġ( this Ġis ĠIr Constructor ) ĊĠĠĠĠĠĠĠ Ġparent As Class . type Parameters Ġ+ Ġtype Parameters ĊĠĠĠ Ġelse ĊĠĠĠĠĠĠĠ Ġtype Parameters Ċ Ċ fun ĠIr Member Access Expression <* >. getType Substitution Map ( ir Function : ĠIr Function ): ĠMap < Ir Type Parameter Symbol , ĠIr Type > Ġ= ĊĠĠĠ Ġir Function . all Type Parameters . with Index (). associate Ġ{ ĊĠĠĠĠĠĠĠ Ġit . value . symbol Ġto ĠgetType Argument ( it . index ) !! ĊĠĠĠ Ġ} Ċ Ċ val ĠIr Function Reference . type Substitution Map : ĠMap < Ir Type Parameter Symbol , ĠIr Type > ĊĠĠĠ Ġget () Ġ= ĠgetType Substitution Map ( symbol . owner ) Ċ Ċ val ĠIr Function Access Expression . type Substitution Map : ĠMap < Ir Type Parameter Symbol , ĠIr Type > ĊĠĠĠ Ġget () Ġ= ĠgetType Substitution Map ( symbol . owner ) Ċ Ċ val ĠIr Declaration . isFile Class : ĠBoolean ĊĠĠĠ Ġget () Ġ= Ġorigin Ġ== ĠIr Declaration Origin . FILE _ CLASS Ġ|| Ġorigin Ġ== ĠIr Declaration Origin . SYN TH ET IC _ FILE _ CLASS Ċ Ċ val ĠIr Value Declaration . is Immutable : ĠBoolean ĊĠĠĠ Ġget () Ġ= Ġthis Ġis ĠIr Value Parameter Ġ|| Ġthis Ġis ĠIr Variable Ġ&& Ġ! is Var Ċ Ċ fun ĠIr Expression . is Safe ToUse Without Copy ing () Ġ= ĊĠĠĠ Ġthis Ġis ĠIr GetObject Value Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġis ĠIr Get EnumValue Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġis ĠIr Const < *> Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġis ĠIr GetValue Ġ&& Ġsymbol . is Bound Ġ&& Ġsymbol . owner . is Immutable Ċ Ċ val ĠIr Statement Origin ?. is Lambda : ĠBoolean ĊĠĠĠ Ġget () Ġ= Ġthis Ġ== ĠIr Statement Origin . L AMBDA Ġ|| Ġthis Ġ== ĠIr Statement Origin . AN ONY MO US _ FUNCTION Ċ Ċ val ĠIr Function . original Function : ĠIr Function ĊĠĠĠ Ġget () Ġ= Ġ( this Ġas ? ĠIr Attribute Container )?. attribute OwnerId Ġas ? ĠIr Function Ġ?: Ġthis Ċ Ċ val ĠIr Property . original Property : ĠIr Property ĊĠĠĠ Ġget () Ġ= Ġattribute OwnerId Ġas ? ĠIr Property Ġ?: Ġthis