/* Ċ Ġ* Ġ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 . fir . resolve . transformers . body . resolve Ċ Ċ import Ġorg . jetbrains . kotlin . fir . F ir Target Element Ċ import Ġorg . jetbrains . kotlin . fir . diagnostics . Con e Simple Diagnostic Ċ import Ġorg . jetbrains . kotlin . fir . diagnostics . Diagnostic Kind Ċ import Ġorg . jetbrains . kotlin . fir . expressions .* Ċ import Ġorg . jetbrains . kotlin . fir . expressions . impl . F ir Else If True Condition Ċ import Ġorg . jetbrains . kotlin . fir . expressions . impl . F ir Empty Expression Block Ċ import Ġorg . jetbrains . kotlin . fir . references . F ir Resolved Named Reference Ċ import Ġorg . jetbrains . kotlin . fir . resolve .* Ċ import Ġorg . jetbrains . kotlin . fir . resolve . calls . is Unit Or Flex ible Unit Ċ import Ġorg . jetbrains . kotlin . fir . resolve . transformers . F ir Synt hetic Call Generator Ċ import Ġorg . jetbrains . kotlin . fir . resolve . transformers . F ir When Ex haust iveness Transformer Ċ import Ġorg . jetbrains . kotlin . fir . resolved Type From Prototype Ċ import Ġorg . jetbrains . kotlin . fir . types .* Ċ import Ġorg . jetbrains . kotlin . fir . types . builder . build ErrorType Ref Ċ import Ġorg . jetbrains . kotlin . fir . visitor s . transform Single Ċ Ċ class ĠF ir Control Flow Statements Resolve Transformer ( transformer : ĠF ir Body Resolve Transformer ) Ġ: ĊĠĠĠ ĠF ir Partial Body Resolve Transformer ( transformer ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġsynthetic Call Generator : ĠF ir Synt hetic Call Generator Ġget () Ġ= Ġcomponents . synt hetic Call Generator ĊĠĠĠ Ġprivate Ġval Ġwhen Ex haust iveness Transformer Ġ= ĠF ir When Ex haust iveness Transformer ( components ) ĊĊĊĠĠĠ Ġ// Ġ---------------- --------------- ĠLo ops Ġ---------------- --------------- ĊĊĠĠĠ Ġoverride Ġfun Ġtransform While Loop ( while Loop : ĠF ir While Loop , Ġdata : ĠResolution Mode ): ĠF ir Statement Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠResolution Mode . Context In dependent ĊĠĠĠĠĠĠĠ Ġreturn Ġwhile Loop . also ( data Flow Analyzer :: enter While Loop ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. transform Condition ( transformer , Ġcontext ). also ( data Flow Analyzer :: exit While Loop Condition ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. transform Block ( transformer , Ġcontext ). also ( data Flow Analyzer :: exit While Loop ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. transform Other Children ( transformer , Ġcontext ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform Do While Loop ( do While Loop : ĠF ir Do While Loop , Ġdata : ĠResolution Mode ): ĠF ir Statement Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDo - while Ġhas Ġa Ġspecific Ġscope Ġstructure Ġ( its Ġblock Ġand Ġcondition Ġeffectively Ġshare Ġthe Ġscope ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcontext . for Block ( session ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠResolution Mode . Context In dependent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo While Loop . also ( data Flow Analyzer :: enter Do While Loop ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtransformer . expressions Transformer . transform Block In Current Scope ( it . block , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also ( data Flow Analyzer :: enter Do While Loop Condition ). transform Condition ( transformer , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also ( data Flow Analyzer :: exit Do While Loop ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. transform Other Children ( transformer , Ġcontext ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ---------------- --------------- ĠWhen Ġexpressions Ġ---------------- --------------- ĊĊĠĠĠ Ġoverride Ġfun Ġtransform When Expression ( when Expression : ĠF ir When Expression , Ġdata : ĠResolution Mode ): ĠF ir Statement Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( when Expression . callee Reference Ġis ĠF ir Resolved Named Reference Ġ&& Ġwhen Expression . result Type Ġ! is ĠF ir Implicit Type Ref ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Expression ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Expression . annotations . forEach Ġ{ Ġit . accept ( this , Ġdata ) Ġ} ĊĠĠĠĠĠĠĠ Ġdata Flow Analyzer . enter When Expression ( when Expression ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcontext . with When Expression ( when Expression , Ġsession ) Ġwith @{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" NAME _ SH ADO WING ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġwhen Expression Ġ= Ġwhen Expression . transform Subject ( transformer , ĠResolution Mode . Context In dependent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubject Type Ġ= Ġwhen Expression . subject ?. type Ref ?. cone Type ?. fully Expanded Type ( session ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . with When Subject Type ( subject Type , Ġcomponents ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Expression . branches . isEmpty () Ġ-> Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Expression . is One Branch () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Expression Ġ= Ġwhen Expression . transform Branches ( transformer , ĠResolution Mode . Context In dependent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Expression . result Type Ġ= Ġwhen Expression . branches . first (). result . result Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Expression Ġ= Ġwhen Expression . transform Branches ( transformer , ĠResolution Mode . Context Dependent ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Expression Ġ= Ġsynthetic Call Generator . generate Cal lee For When Expression ( when Expression , Ġresolution Context ) Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Expression Ġ= Ġwhen Expression . transform Single ( when Ex haust iveness Transformer , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Flow Analyzer . exit When Expression ( when Expression ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Expression . result Type Ġ= Ġbuild ErrorType Ref Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdiagnostic Ġ= ĠC one Simple Diagnostic (" Can 't Ġresolve Ġwhen Ġexpression ", ĠDiagnostic Kind . Inference Error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ with When Subject Type Ġwhen Expression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompletion Result Ġ= Ġcall Comp leter . complete Call ( when Expression , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Expression Ġ= Ġcompletion Result . result ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Expression Ġ= Ġwhen Expression . transform Single ( when Ex haust iveness Transformer , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Flow Analyzer . exit When Expression ( when Expression ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Expression Ġ= Ġwhen Expression . replace ReturnType IfNot Ex haustive () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Expression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠF ir When Expression . replace ReturnType IfNot Ex haustive (): ĠF ir When Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! is Pro per ly Ex haustive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Type Ġ= Ġresult Type . resolved Type From Prototype ( session . builtin Types . unit Type . type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠF ir When Expression . is One Branch (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( branches . size Ġ== Ġ 1 ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( branches . size Ġ> Ġ 2 ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġlast Branch Ġ= Ġbranches . last () ĊĠĠĠĠĠĠĠ Ġreturn Ġlast Branch . source Ġ!= Ġnull Ġ&& Ġlast Branch . condition Ġis ĠF ir Else If True Condition Ġ&& Ġlast Branch . result Ġis ĠF ir Empty Expression Block ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform When Branch ( when Branch : ĠF ir When Branch , Ġdata : ĠResolution Mode ): ĠF ir When Branch Ġ{ ĊĠĠĠĠĠĠĠ Ġdata Flow Analyzer . enter When Branch Condition ( when Branch ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcontext . with When Subject Import ing Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Branch . transform Condition ( transformer , Ġwith Expected Type ( session . builtin Types . boolean Type )) ĊĠĠĠĠĠĠĠ Ġ}. also Ġ{ Ġdata Flow Analyzer . exit When Branch Condition ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. transform Result ( transformer , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġdata Flow Analyzer . exit When Branch Result ( it ) Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform When Subject Expression ( ĊĠĠĠĠĠĠĠ Ġwhen Subject Expression : ĠF ir When Subject Expression , ĊĠĠĠĠĠĠĠ Ġdata : ĠResolution Mode ĊĠĠĠ Ġ): ĠF ir Statement Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparent When Ġ= Ġwhen Subject Expression . when Ref . value ĊĠĠĠĠĠĠĠ Ġval Ġsubject Type Ġ= Ġparent When . subject ?. result Type Ġ?: Ġparent When . subject Variable ?. returnType Ref ĊĠĠĠĠĠĠĠ Ġif Ġ( subject Type Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Subject Expression . result Type Ġ= Ġsubject Type ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdata Flow Analyzer . exit When Subject Expression ( when Subject Expression ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcomponents . transform When Subject Expression Using Smart cast Info ( when Subject Expression ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ---------------- --------------- ĠTry / catch Ġexpressions Ġ---------------- --------------- ĊĊĠĠĠ Ġoverride Ġfun Ġtransform Try Expression ( try Expression : ĠF ir Try Expression , Ġdata : ĠResolution Mode ): ĠF ir Statement Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( try Expression . callee Reference Ġis ĠF ir Resolved Named Reference Ġ&& Ġtry Expression . result Type Ġ! is ĠF ir Implicit Type Ref ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Expression ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Expression . transform Annotations ( transformer , ĠResolution Mode . Context In dependent ) ĊĠĠĠĠĠĠĠ Ġdata Flow Analyzer . enter Try Expression ( try Expression ) ĊĠĠĠĠĠĠĠ Ġtry Expression . transform Try Block ( transformer , ĠResolution Mode . Context Dependent ) ĊĠĠĠĠĠĠĠ Ġdata Flow Analyzer . exit Try Main Block () ĊĠĠĠĠĠĠĠ Ġtry Expression . transform Cat ches ( this , ĠResolution Mode . Context Dependent ) ĊĊĠĠĠĠĠĠĠ Ġvar Ġcall Completed : ĠBoolean ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" NAME _ SH ADO WING ") ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġsynthetic Call Generator . generate Cal lee For Try Expression ( try Expression , Ġresolution Context ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompletion Result Ġ= Ġcall Comp leter . complete Call ( it , Ġdata ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall Completed Ġ= Ġcompletion Result . call Completed ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompletion Result . result ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġif Ġ( result . finally Block Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . also Ġ{ Ġdata Flow Analyzer . enter Finally Block () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. transform Finally Block ( transformer , ĠResolution Mode . Context In dependent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġdata Flow Analyzer . exit Finally Block () Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdata Flow Analyzer . exit Try Expression ( call Completed ) ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform Catch ( catch : ĠF ir Catch , Ġdata : ĠResolution Mode ): ĠF ir Catch Ġ{ ĊĠĠĠĠĠĠĠ Ġdata Flow Analyzer . enter Catch Clause ( catch ) ĊĠĠĠĠĠĠĠ Ġcatch . parameter . transform ReturnType Ref ( transformer , ĠResolution Mode . Context In dependent ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcontext . for Block ( session ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcatch . transform Parameter ( transformer , ĠResolution Mode . Context In dependent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcatch . transform Block ( transformer , ĠResolution Mode . Context Dependent ) ĊĠĠĠĠĠĠĠ Ġ}. also Ġ{ Ġdata Flow Analyzer . exit Catch Clause ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ---------------- --------------- ĠJump s Ġ---------------- --------------- ĊĊĠĠĠ Ġoverride Ġfun Ġ< E Ġ: ĠF ir Target Element > Ġtransform Jump ( jump : ĠF ir Jump < E >, Ġdata : ĠResolution Mode ): ĠF ir Statement Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġtransformer . transform Expression ( jump , Ġdata ) ĊĠĠĠĠĠĠĠ Ġdata Flow Analyzer . exit Jump ( jump ) ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform Return Expression ( ĊĠĠĠĠĠĠĠ Ġreturn Expression : ĠF ir Return Expression , ĊĠĠĠĠĠĠĠ Ġdata : ĠResolution Mode ĊĠĠĠ Ġ): ĠF ir Statement Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlabeled Element Ġ= Ġreturn Expression . target . labeled Element ĊĠĠĠĠĠĠĠ Ġval Ġexpected Type Ref Ġ= Ġlabeled Element . returnType Ref ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" Intro duce When Subject ") ĊĠĠĠĠĠĠĠ Ġval Ġmode Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlabeled Element . symbol Ġin Ġcontext . anonymous Functions Analy zed In Dependent Context Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResolution Mode . Context Dependent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResolution Mode . With Expected Type ( expected Type Ref , Ġexpected Type Mismatch Is Reported In Checker Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtransform Jump ( return Expression , Ġmode ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġtransform Throw Expression ( ĊĠĠĠĠĠĠĠ Ġthrow Expression : ĠF ir Throw Expression , ĊĠĠĠĠĠĠĠ Ġdata : ĠResolution Mode ĊĠĠĠ Ġ): ĠF ir Statement Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtransformer . transform Expression ( throw Expression , ĠResolution Mode . Context In dependent ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Flow Analyzer . exit Throw Exception Node ( it Ġas ĠF ir Throw Expression ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġ---------------- --------------- ĠEl vis Ġ---------------- --------------- ĊĊĠĠĠ Ġoverride Ġfun Ġtransform El vis Expression ( ĊĠĠĠĠĠĠĠ Ġel vis Expression : ĠF ir El vis Expression , ĊĠĠĠĠĠĠĠ Ġdata : ĠResolution Mode ĊĠĠĠ Ġ): ĠF ir Statement Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( el vis Expression . callee Reference Ġis ĠF ir Resolved Named Reference ) Ġreturn Ġel vis Expression ĊĠĠĠĠĠĠĠ Ġel vis Expression . transform Annotations ( transformer , Ġdata ) ĊĊĠĠĠĠĠĠĠ Ġval Ġexpected Type Ġ= Ġdata . expected Type ?. cone Type Safe < Con e Kotlin Type >() ĊĠĠĠĠĠĠĠ Ġval Ġmay Be Co erc ion To Unit Applied Ġ= Ġ( data Ġas ? ĠResolution Mode . With Expected Type )?. may Be Co erc ion To Unit Applied Ġ== Ġtrue ĊĊĠĠĠĠĠĠĠ Ġval Ġresolution Mode For L hs Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( may Be Co erc ion To Unit Applied Ġ&& Ġexpected Type ?. is Unit Or Flex ible Unit Ġ== Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Expected Type ( expected Type , Ġmay Be Co erc ion To Unit Applied Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith Expected Type ( expected Type ?. with Null ability ( Con e Null ability . NULL ABLE , Ġsession . type Context )) ĊĠĠĠĠĠĠĠ Ġdata Flow Analyzer . enter El vis ( el vis Expression ) ĊĠĠĠĠĠĠĠ Ġel vis Expression . transform L hs ( transformer , Ġresolution Mode For L hs ) ĊĠĠĠĠĠĠĠ Ġdata Flow Analyzer . exit El vis L hs ( el vis Expression ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresolution Mode For R hs Ġ= Ġwith Expected Type ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmay Be Co erc ion To Unit Applied Ġ= Ġmay Be Co erc ion To Unit Applied ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġel vis Expression . transform R hs ( transformer , Ġresolution Mode For R hs ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġsynthetic Call Generator . generate Cal lee For El vis Expression ( el vis Expression , Ġresolution Context )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall Comp leter . complete Call ( it , Ġdata ). result ĊĠĠĠĠĠĠĠ Ġ} Ġ?: Ġel vis Expression . also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . result Type Ġ= Ġbuild ErrorType Ref Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdiagnostic Ġ= ĠC one Simple Diagnostic (" Can 't Ġresolve Ġ?: Ġoperator Ġcall ", ĠDiagnostic Kind . Inference Error ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġis L hs NotNull Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( result . rhs . type Ref . cone Type Safe < Con e Kotlin Type >() ?. is Nothing Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlhs Type Ġ= Ġresult . lhs . type Ref . cone Type Safe < Con e Kotlin Type >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lhs Type Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew ReturnType Ġ= Ġlhs Type . make Con e TypeDef initely NotNull Or NotNull ( session . type Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . replace Type Ref ( result . type Ref . resolved Type From Prototype ( new ReturnType )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis L hs NotNull Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsession . type Context . run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result . type Ref . cone Type Safe < Con e Kotlin Type >() ?. is Nullable Type () Ġ== Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġresult . rhs . type Ref . cone Type Safe < Con e Kotlin Type >() ?. is Nullable Type () Ġ== Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSometimes Ġreturn Ġtype Ġfor Ġspecial Ġcall Ġfor Ġel vis Ġoperator Ġmight Ġbe Ġnullable , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbut Ġresult Ġis Ġnot Ġnullable Ġif Ġthe Ġright Ġtype Ġis Ġnot Ġnullable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . replace Type Ref ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . type Ref . with Re placed Con e Type ( result . type Ref . cone Type . make Con e TypeDef initely NotNull Or NotNull ( session . type Context )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdata Flow Analyzer . exit El vis ( el vis Expression , Ġis L hs NotNull Ġ= Ġis L hs NotNull ) ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ } Ċ