/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 9 Ġ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 . wasm . lower Ċ Ċ import Ġorg . jetbrains . kotlin . backend . common . File Lower ing Pass Ċ import Ġorg . jetbrains . kotlin . backend . common . Ir Element Transformer Void WithContext Ċ import Ġorg . jetbrains . kotlin . backend . common . lower . create Ir Builder Ċ import Ġorg . jetbrains . kotlin . backend . common . lower . ir Composite Ċ import Ġorg . jetbrains . kotlin . backend . wasm . W asm Backend Context Ċ import Ġorg . jetbrains . kotlin . backend . wasm . ir 2 wasm . er ased Upper Bound Ċ import Ġorg . jetbrains . kotlin . ir . backend . js . utils . real Override Target Ċ import Ġorg . jetbrains . kotlin . ir . builders . ir Implicit Cast Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir File Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Simple Function Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Call Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Expression Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Symbol Ċ import Ġorg . jetbrains . kotlin . ir . types .* Ċ import Ġorg . jetbrains . kotlin . ir . util . default Type Ċ import Ġorg . jetbrains . kotlin . ir . util . ir Call Ċ import Ġorg . jetbrains . kotlin . ir . util . is Type Parameter Ċ import Ġorg . jetbrains . kotlin . ir . visitor s . transform Children Void Ċ Ċ /** Ċ Ġ* ĠThis Ġlower ing Ġadds Ġimplicit Ġcast s Ġin Ġplaces Ġwhere Ġer ased Ġgeneric Ġfunction Ġreturn Ġtype Ċ Ġ* Ġdiffers Ġfrom Ġexpected Ġtype Ġon Ġthe Ġcall Ġsite . Ċ Ġ*/ Ċ class ĠGeneric ReturnType Lower ing ( val Ġcontext : ĠW asm Backend Context ) Ġ: ĠFile Lower ing Pass Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġlower ( ir File : ĠIr File ) Ġ{ ĊĠĠĠĠĠĠĠ Ġir File . transform Children Void ( object Ġ: ĠIr Element Transformer Void WithContext () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Call ( expression : ĠIr Call ): ĠIr Expression Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransform Generic Call ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Call ( expression ) Ġas ĠIr Call , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Scope !!. scope . scope Owner Symbol ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠIr Type . erase Upper Bound Type (): ĠIr Type Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġer ased Upper Bound ?. default Type Ġ?: Ġreturn Ġcontext . ir Built Ins . any N Type ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( this . is Nullable ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype . make Nullable () ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtransform Generic Call ( call : ĠIr Call , Ġscope Owner Symbol : ĠIr Symbol ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfunction : ĠIr Simple Function Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . symbol . owner Ġas ? ĠIr Simple Function Ġ?: Ġreturn Ġcall ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! function . real Override Target . returnType . is Type Parameter ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcall ĊĊĠĠĠĠĠĠĠ Ġval Ġer ased ReturnType : ĠIr Type Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . real Override Target . returnType . erase Upper Bound Type () ĊĊĠĠĠĠĠĠĠ Ġval Ġcall Type Ġ= Ġcall . type ĊĊĠĠĠĠĠĠĠ Ġif Ġ( er ased ReturnType Ġ!= Ġcall . type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( call Type . is Nothing ()) Ġreturn Ġcall ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( er ased ReturnType . is Subtype Of ( call Type , Ġcontext . type System )) Ġreturn Ġcall ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠE rase Ġtype Ġparameter Ġfrom Ġcall Ġreturn Ġtype ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Call Ġ= Ġir Call ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . symbol , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew ReturnType Ġ= Ġer ased ReturnType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Super Qualifier Symbol Ġ= Ġcall . super Qualifier Symbol ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . create Ir Builder ( scope Owner Symbol ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( call . type . is Unit ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġir Composite ( call ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ new Call ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġir Implicit Cast ( new Call , Ġcall . type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcall ĊĠĠĠ Ġ} Ċ } Ċ