package Ġarrow . meta . ph ases . codegen . ir Ċ Ċ import Ġarrow . meta . ph ases . Compiler Context Ċ import Ġorg . jetbrains . kotlin . backend . common . extensions . Ir Plugin Context Ċ import Ġorg . jetbrains . kotlin . descriptors . Callable Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Callable Member Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Class Constructor Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Class Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Function Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Property Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Value Parameter Descriptor Ċ import Ġorg . jetbrains . kotlin . ir . Ir Element Ċ import Ġorg . jetbrains . kotlin . ir . UNDEFINED _ OFFSET Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Call Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Constructor Call Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Expression Ċ 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 GetObject Value Impl Ċ import Ġorg . jetbrains . kotlin . ir . types . Ir Type Ċ import Ġorg . jetbrains . kotlin . ir . types . impl . original Kotlin Type Ċ import Ġorg . jetbrains . kotlin . ir . util . Constant Value Generator Ċ import Ġorg . jetbrains . kotlin . ir . util . Reference Symbol Table Ċ import Ġorg . jetbrains . kotlin . ir . util . Type Translator Ċ import Ġorg . jetbrains . kotlin . ir . util . construct ors Ċ import Ġorg . jetbrains . kotlin . ir . util . default Type Ċ import Ġorg . jetbrains . kotlin . ir . util . reference Function Ċ import Ġorg . jetbrains . kotlin . ir . visitor s . Ir Element Visitor Ċ import Ġorg . jetbrains . kotlin . resolve . calls . inference . components . New Type Subst it utor By Constructor Map Ċ import Ġorg . jetbrains . kotlin . resolve . calls . util . Fake Callable Descriptor For Object Ċ import Ġorg . jetbrains . kotlin . resolve . descriptor Util . module Ċ import Ġorg . jetbrains . kotlin . types . Kotlin Type Ċ import Ġorg . jetbrains . kotlin . types . as Simple Type Ċ import Ġorg . jetbrains . kotlin . types . type Util . is Type Parameter Ċ Ċ class ĠIr Utils ( ĊĠ Ġval Ġplugin Context : ĠIr Plugin Context , ĊĠ Ġval Ġcompiler Context : ĠCompiler Context Ċ ) Ġ: ĠReference Symbol Table Ġby Ġplugin Context . symbols . external Symbol Table Ġ{ ĊĊĠ Ġval Ġtype Translator : ĠType Translator Ġ= ĊĠĠĠ ĠType Translator ( ĊĠĠĠĠĠ Ġsymbol Table Ġ= Ġplugin Context . symbols . external Symbol Table , ĊĠĠĠĠĠ Ġlanguage Version Settings Ġ= Ġplugin Context . language Version Settings , ĊĠĠĠĠĠ Ġbuilt Ins Ġ= Ġplugin Context . built Ins ĊĠĠĠ Ġ). apply Ġtranslator @{ ĊĠĠĠĠĠ Ġconstant Value Generator Ġ= ĊĠĠĠĠĠĠĠ ĠConstant Value Generator ( ĊĠĠĠĠĠĠĠĠĠ Ġmodule Descriptor Ġ= Ġplugin Context . built Ins . built Ins Module . module , ĊĠĠĠĠĠĠĠĠĠ Ġsymbol Table Ġ= Ġplugin Context . symbols . external Symbol Table ĊĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthis . type Translator Ġ= Ġthis @ translator ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠ Ġfun ĠCallable Descriptor . ir Call (): ĠIr Expression Ġ= ĊĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠ Ġis ĠProperty Descriptor Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġir Field Ġ= Ġplugin Context . symbols . external Symbol Table . reference Field ( this ) ĊĠĠĠĠĠĠĠ Ġir Field . owner . corre sponding Property Symbol ?. owner ?. getter ?. symbol ?. let Ġ{ Ġir Simple Function Symbol Ġ-> ĊĠĠĠĠĠĠĠĠĠ ĠIr Call Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Offset Ġ= ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġend Offset Ġ= ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġir Simple Function Symbol . owner . returnType , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Ġ= Ġir Simple Function Symbol , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Arguments Count Ġ= Ġir Simple Function Symbol . owner . descriptor . type Parameters . size , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Arguments Count Ġ= Ġir Simple Function Symbol . owner . descriptor . value Parameters . size ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: ĠTODO (" Unsupported Ġir Call Ġfor Ġ$ this ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġis ĠClass Constructor Descriptor Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġir Symbol Ġ= Ġplugin Context . symbols . external Symbol Table . reference Constructor ( this ) ĊĠĠĠĠĠĠĠ ĠIr Constructor Call Impl ( ĊĠĠĠĠĠĠĠĠĠ Ġstart Offset Ġ= ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠĠĠ Ġend Offset Ġ= ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġir Symbol . owner . returnType , ĊĠĠĠĠĠĠĠĠĠ Ġsymbol Ġ= Ġir Symbol , ĊĠĠĠĠĠĠĠĠĠ Ġtype Arguments Count Ġ= Ġir Symbol . owner . descriptor . type Parameters . size , ĊĠĠĠĠĠĠĠĠĠ Ġvalue Arguments Count Ġ= Ġir Symbol . owner . descriptor . value Parameters . size , ĊĠĠĠĠĠĠĠĠĠ Ġconstructor Type Arguments Count Ġ= Ġir Symbol . owner . descriptor . type Parameters . size ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġis ĠFunction Descriptor Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġir Symbol Ġ= Ġplugin Context . symbols . external Symbol Table . reference Function ( this ) ĊĠĠĠĠĠĠĠ ĠIr Call Impl ( ĊĠĠĠĠĠĠĠĠĠ Ġstart Offset Ġ= ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠĠĠ Ġend Offset Ġ= ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġir Symbol . owner . returnType , ĊĠĠĠĠĠĠĠĠĠ Ġsymbol Ġ= Ġir Symbol , ĊĠĠĠĠĠĠĠĠĠ Ġtype Arguments Count Ġ= Ġir Symbol . owner . descriptor . type Parameters . size , ĊĠĠĠĠĠĠĠĠĠ Ġvalue Arguments Count Ġ= Ġir Symbol . owner . descriptor . value Parameters . size ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġis ĠFake Callable Descriptor For Object Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġir Symbol Ġ= Ġplugin Context . symbols . external Symbol Table . reference Class ( class Descriptor ) ĊĠĠĠĠĠĠĠ ĠIr GetObject Value Impl ( ĊĠĠĠĠĠĠĠĠĠ Ġstart Offset Ġ= ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠĠĠ Ġend Offset Ġ= ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġir Symbol . owner . default Type , ĊĠĠĠĠĠĠĠĠĠ Ġsymbol Ġ= Ġir Symbol ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ ĠTODO (" Unsupported Ġir Ġcall Ġfor Ġ$ this ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠ Ġfun ĠProperty Descriptor . ir Getter Call (): ĠIr Call ? Ġ{ ĊĠĠĠ Ġval Ġir Field Ġ= Ġplugin Context . symbols . external Symbol Table . reference Field ( this ) ĊĠĠĠ Ġreturn Ġir Field . owner . corre sponding Property Symbol ?. owner ?. getter ?. symbol ?. let Ġ{ Ġir Simple Function Symbol Ġ-> ĊĠĠĠĠĠ ĠIr Call Impl ( ĊĠĠĠĠĠĠĠ Ġstart Offset Ġ= ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠ Ġend Offset Ġ= ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠ Ġtype Ġ= Ġir Simple Function Symbol . owner . returnType , ĊĠĠĠĠĠĠĠ Ġsymbol Ġ= Ġir Simple Function Symbol , ĊĠĠĠĠĠĠĠ Ġtype Arguments Count Ġ= Ġir Simple Function Symbol . owner . descriptor . type Parameters . size , ĊĠĠĠĠĠĠĠ Ġvalue Arguments Count Ġ= Ġir Simple Function Symbol . owner . descriptor . value Parameters . size ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun ĠClass Descriptor . ir Constructor Call (): ĠIr Constructor Call ? Ġ{ ĊĠĠĠ Ġval Ġir Class Ġ= Ġplugin Context . symbols . external Symbol Table . reference Class ( this ) ĊĠĠĠ Ġreturn Ġir Class . construct ors . first OrNull ()?. let Ġ{ Ġir Constructor Symbol Ġ-> ĊĠĠĠĠĠ ĠIr Constructor Call Impl ( ĊĠĠĠĠĠĠĠ Ġstart Offset Ġ= ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠ Ġend Offset Ġ= ĠUN DEFINED _ OFFSET , ĊĠĠĠĠĠĠĠ Ġtype Ġ= Ġir Constructor Symbol . owner . returnType , ĊĠĠĠĠĠĠĠ Ġsymbol Ġ= Ġir Constructor Symbol , ĊĠĠĠĠĠĠĠ Ġtype Arguments Count Ġ= Ġir Constructor Symbol . owner . descriptor . type Parameters . size , ĊĠĠĠĠĠĠĠ Ġvalue Arguments Count Ġ= Ġir Constructor Symbol . owner . descriptor . value Parameters . size , ĊĠĠĠĠĠĠĠ Ġconstructor Type Arguments Count Ġ= Ġdeclared Type Parameters . size ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun ĠCallable Descriptor . subst it uted Ir Types ( type Subst it utor : ĠNew Type Subst it utor By Constructor Map ): ĠList < Ir Type ?> Ġ= ĊĠĠĠ Ġtype Parameters . map Indexed Ġ{ Ġ_, Ġtype Param Descriptor Ġ-> ĊĠĠĠĠĠ Ġval Ġnew Type Ġ= Ġtype Subst it utor . map . entries . find Ġ{ ĊĠĠĠĠĠĠĠ Ġit . key . toString () Ġ== Ġtype Param Descriptor . default Type . toString () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġnew Type ?. value ?. let ( type Translator :: translate Type ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ fun ĠIr Call . dfs Calls (): ĠList < Ir Call > Ġ{ ĊĠ Ġval Ġcalls Ġ= Ġarray ListOf < Ir Call >() ĊĠ Ġval Ġrecursive Visitor Ġ= Ġobject Ġ: ĠIr Element Visitor < Unit , ĠUnit > Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġvisit Element ( element : ĠIr Element , Ġdata : ĠUnit ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( element Ġis ĠIr Call ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcalls . addAll ( element . dfs Calls ()) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĠ Ġaccept Children ( recursive Visitor , ĠUnit ) ĊĠ Ġcalls . add ( this ) ĊĠ Ġreturn Ġcalls Ċ } Ċ Ċ /** Ċ Ġ* Ġreturns Ġthe Ġindex Ġand Ġthe Ġvalue Ġargument Ċ Ġ*/ Ċ val ĠIr Call . value Arguments : ĠList < Pair < Int , ĠIr Expression ? >> ĊĠ Ġget () Ġ{ ĊĠĠĠ Ġval Ġargs Ġ= Ġarray ListOf < Pair < Int , ĠIr Expression ? >>() ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġvalue Arguments Count ) Ġ{ ĊĠĠĠĠĠ Ġargs . add ( i Ġto ĠgetValue Argument ( i )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġargs . toList () ĊĠ Ġ} Ċ Ċ /** Ċ Ġ* Ġreturns Ġthe Ġindex Ġand Ġthe Ġtype Ġargument Ċ Ġ*/ Ċ val ĠIr Call . type Arguments : ĠList < Pair < Int , ĠIr Type ? >> ĊĠ Ġget () Ġ{ ĊĠĠĠ Ġval Ġargs Ġ= Ġarray ListOf < Pair < Int , ĠIr Type ? >>() ĊĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġtype Arguments Count ) Ġ{ ĊĠĠĠĠĠ Ġargs . add ( i Ġto ĠgetType Argument ( i )) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġargs . toList () ĊĠ Ġ} Ċ Ċ val ĠIr Call . un subst it uted Descriptor : ĠFunction Descriptor ĊĠ Ġget () Ġ= Ġsymbol . owner . descriptor Ċ Ċ val ĠIr Call . subst it uted Value Parameters : ĠList < Pair < Value Parameter Descriptor , ĠKotlin Type >> ĊĠ Ġget () Ġ= Ġun subst it uted Descriptor . subst it uted Value Parameters ( this ) Ċ Ċ /** Ċ Ġ* Ġreturns Ġa ĠPair Ġof Ġthe Ġdescriptor Ġand Ġit 's Ġsubstit uted ĠKotlin Type Ġat Ġthe Ġcall - site Ċ Ġ*/ Ċ fun ĠCallable Member Descriptor . subst it uted Value Parameters ( call : ĠIr Call ): ĠList < Pair < Value Parameter Descriptor , ĠKotlin Type >> Ġ= ĊĠ Ġvalue Parameters . filter NotNull () ĊĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠ Ġval Ġtype Ġ= Ġit . type ĊĠĠĠĠĠ Ġit Ġto Ġ( type . take If Ġ{ Ġt Ġ-> Ġ! t . is Type Parameter () Ġ} ĊĠĠĠĠĠĠĠ Ġ?: Ġtype Parameters . filter NotNull () ĊĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ Ġtype Param Ġ-> Ġtype Param . default Type Ġ== Ġtype . as Simple Type () Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġtype Param Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . getType Argument ( type Param . index )?. original Kotlin Type ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġtype Ġ// ĠCould Ġnot Ġresolve Ġthe Ġsubstit uted ĠKotlin Type ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ}