/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 8 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ċ Ġ* Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . backend . kon an . lower Ċ Ċ import Ġorg . jetbrains . kotlin . backend . common . Common Backend Context Ċ import Ġorg . jetbrains . kotlin . backend . common . Function Lower ing Pass Ċ import Ġorg . jetbrains . kotlin . backend . common . lower . at Ċ import Ġorg . jetbrains . kotlin . backend . common . lower . create Ir Builder Ċ import Ġorg . jetbrains . kotlin . backend . common . lower . ir Block Ċ import Ġorg . jetbrains . kotlin . ir . util . is Simple Type With Question Mark Ċ import Ġorg . jetbrains . kotlin . backend . kon an . ir . contains Null Ċ import Ġorg . jetbrains . kotlin . backend . kon an . ir . is Subtype Of Ċ import Ġorg . jetbrains . kotlin . ir . Ir Statement Ċ import Ġorg . jetbrains . kotlin . ir . builders .* Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Function Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Expression Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Type Operator Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Type Operator Call Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Class Symbol Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Function Symbol Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Type Parameter Symbol Ċ import Ġorg . jetbrains . kotlin . ir . types . Ir Simple Type Ċ import Ġorg . jetbrains . kotlin . ir . types . Ir Type Ċ import Ġorg . jetbrains . kotlin . ir . types . make NotNull Ċ import Ġorg . jetbrains . kotlin . ir . types . make Nullable Ċ import Ġorg . jetbrains . kotlin . ir . util . ir Call Ċ import Ġorg . jetbrains . kotlin . ir . visitor s . Ir Element Transformer Void Ċ import Ġorg . jetbrains . kotlin . ir . visitor s . transform Children Void Ċ import Ġorg . jetbrains . kotlin . types . Kotlin Type Ċ import Ġorg . jetbrains . kotlin . types . Type Utils Ċ Ċ /** Ċ Ġ* ĠThis Ġlower ing Ġpass Ġlow ers Ġsome Ġ[ Ir Type Operator Call ] s . Ċ Ġ*/ Ċ internal Ġclass ĠType Operator Lower ing ( val Ġcontext : ĠCommon Backend Context ) Ġ: ĠFunction Lower ing Pass Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġlower ( ir Function : ĠIr Function ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtransformer Ġ= ĠType Operator Transformer ( context , Ġir Function . symbol ) ĊĠĠĠĠĠĠĠ Ġir Function . transform Children Void ( transformer ) ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ private Ġclass ĠType Operator Transformer ( val Ġcontext : ĠCommon Backend Context , Ġval Ġfunction : ĠIr Function Symbol ) Ġ: ĠIr Element Transformer Void () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġbuilder Ġ= Ġcontext . create Ir Builder ( function ) ĊĊĠĠĠ Ġval Ġthrow NullPointerException Ġ= Ġcontext . ir . symbols . Throw NullPointerException ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Function ( declaration : ĠIr Function ): ĠIr Statement Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġignore Ġinner Ġfunctions Ġduring Ġthis Ġpass ĊĠĠĠĠĠĠĠ Ġreturn Ġdeclaration ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠIr Type . er asure (): ĠIr Type Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ! is ĠIr Simple Type ) Ġreturn Ġthis ĊĊĠĠĠĠĠĠĠ Ġval Ġclassifier Ġ= Ġthis . classifier ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( classifier ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Class Symbol Ġ-> Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Type Parameter Symbol Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġupper Bound Ġ= Ġclassifier . owner . super Types . first OrNull () Ġ?: ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTODO ("${ classifier . descriptor } Ġ: Ġ${ classifier . descriptor . upper Bounds }") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . has Question Mark ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ` T ?` ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupper Bound . er asure (). make Nullable () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupper Bound . er asure () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTODO ( classifier . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlower Cast ( expression : ĠIr Type Operator Call ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġbuilder . at ( expression ) ĊĠĠĠĠĠĠĠ Ġval Ġtype Operand Ġ= Ġexpression . type Operand . er asure () Ċ Ċ // ĠĠĠĠĠĠĠ Ġassert Ġ(! Type Utils . has Nullable Super Type ( type Operand )) Ġ// ĠSo Ġthat Ġ` is Nullable ()` Ġ< => Ġ` is Marked Nullable `. ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġconsider Ġthe Ġcase Ġwhen Ġexpression Ġtype Ġis Ġwrong Ġe . g . Ġdue Ġto Ġgener ics - related Ġunchecked Ġcast s . ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . argument . type . is Subtype Of ( type Operand ) Ġ-> Ġexpression . argument ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . argument . type . contains Null () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Ġ( builder ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Let S ( expression . argument ) Ġ{ Ġargument Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir If Then Else ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Ġ= Ġexpression . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcondition Ġ= Ġir Eq eq eq ( ir Get ( argument . owner ), Ġir Null ()), ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthen Part Ġ= Ġif Ġ( type Operand . is Simple Type With Question Mark ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Null () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir Call ( throw NullPointerException . owner ), ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Part Ġ= Ġir As ( ir Get ( argument . owner ), Ġtype Operand . make NotNull ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Operand . is Simple Type With Question Mark Ġ-> Ġbuilder . ir As ( expression . argument , Ġtype Operand . make NotNull ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Operand Ġ== Ġexpression . type Operand Ġ-> Ġexpression ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġbuilder . ir As ( expression . argument , Ġtype Operand ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠKotlin Type . is Nullable () Ġ= ĠType Utils . is Nullable Type ( this ) ĊĊĠĠĠ Ġprivate Ġfun Ġlower Safe Cast ( expression : ĠIr Type Operator Call ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtype Operand Ġ= Ġexpression . type Operand . er asure () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbuilder . ir Block ( expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ir Let S ( expression . argument ) Ġ{ Ġvariable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġir If Then Else ( expression . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcondition Ġ= Ġir Is ( ir Get ( variable . owner ), Ġtype Operand ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthen Part Ġ= Ġir Implicit Cast ( ir Get ( variable . owner ), Ġtype Operand ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Part Ġ= Ġir Null ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Type Operator ( expression : ĠIr Type Operator Call ): ĠIr Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġexpression . transform Children Void ( this ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( expression . operator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Type Operator . SAFE _ CAST Ġ-> Ġlower Safe Cast ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠIr Type Operator . CAST Ġ-> Ġlower Cast ( expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġexpression ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }