/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 0 Ġ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 . builder Ċ Ċ import Ġorg . jetbrains . kotlin . descriptors . Modal ity Ċ import Ġorg . jetbrains . kotlin . descriptors . Vis ibilities Ċ import Ġorg . jetbrains . kotlin . fir .* Ċ import Ġorg . jetbrains . kotlin . fir . declarations . F ir Declaration Origin Ċ import Ġorg . jetbrains . kotlin . fir . declarations . F ir Variable Ċ import Ġorg . jetbrains . kotlin . fir . declarations . builder . build Property Ċ import Ġorg . jetbrains . kotlin . fir . declarations . impl . F ir Declaration Status Impl Ċ 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 . builder .* Ċ import Ġorg . jetbrains . kotlin . fir . symbols . impl . F ir Property Symbol Ċ import Ġorg . jetbrains . kotlin . fir . types . F ir Type Ref Ċ import Ġorg . jetbrains . kotlin . psi .* Ċ Ċ internal Ġfun ĠK t When Condition . to F ir When Condition ( ĊĠĠĠ Ġwhen Ref With Si bject : ĠF ir Expression Ref < F ir When Expression >, ĊĠĠĠ Ġconvert : ĠK t Expression ?. ( String ) Ġ-> ĠF ir Expression , ĊĠĠĠ Ġto F ir Or ErrorType Ref : ĠK t Type Reference ?. () Ġ-> ĠF ir Type Ref , Ċ ): ĠF ir Expression Ġ{ ĊĠĠĠ Ġval Ġfir Subject Source Ġ= Ġthis . to F ir Psi Source Element ( F ir Fake Source Element Kind . When Generated Subject ) ĊĠĠĠ Ġval Ġfir Subject Expression Ġ= Ġbuild When Subject Expression Ġ{ ĊĠĠĠĠĠĠĠ Ġsource Ġ= Ġfir Subject Source ĊĠĠĠĠĠĠĠ Ġwhen Ref Ġ= Ġwhen Ref With Si bject ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠK t When Condition With Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Equality Operator Call Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġexpression ?. to F ir Psi Source Element ( F ir Fake Source Element Kind . When Condition ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperation Ġ= ĠF ir Operation . EQ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargument List Ġ= Ġbuild Binary ArgumentList ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfir Subject Expression , Ġexpression . convert (" No Ġexpression Ġin Ġcondition Ġwith Ġexpression ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠK t When Condition InRange Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfir Range Ġ= Ġrange Expression . convert (" No Ġrange Ġin Ġcondition Ġwith Ġrange ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfir Range . generate Contains Operation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfir Subject Expression , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Neg ated , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrange Expression ?. to F ir Psi Source Element ( F ir Fake Source Element Kind . When Condition ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperation Reference . to F ir Psi Source Element () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠK t When Condition Is Pattern Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Type Operator Call Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġthis @ to F ir When Condition . to F ir Psi Source Element () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoperation Ġ= Ġif Ġ( is Neg ated ) ĠF ir Operation . NOT _ IS Ġelse ĠF ir Operation . IS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconversion Type Ref Ġ= Ġtype Reference . to F ir Or ErrorType Ref () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargument List Ġ= Ġbuild Unary ArgumentList ( fir Subject Expression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Error Expression ( fir Subject Source , ĠC one Simple Diagnostic (" Unsupported Ġwhen Ġcondition : Ġ${ this . java Class }", ĠDiagnostic Kind . Syntax )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġfun ĠArray < Kt When Condition >. to F ir When Condition ( ĊĠĠĠ Ġsubject : ĠF ir Expression Ref < F ir When Expression >, ĊĠĠĠ Ġconvert : ĠK t Expression ?. ( String ) Ġ-> ĠF ir Expression , ĊĠĠĠ Ġto F ir Or ErrorType Ref : ĠK t Type Reference ?. () Ġ-> ĠF ir Type Ref , Ċ ): ĠF ir Expression Ġ{ ĊĠĠĠ Ġvar Ġfir Condition : ĠF ir Expression ? Ġ= Ġnull ĊĠĠĠ Ġfor Ġ( condition Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfir Condition Element Ġ= Ġcondition . to F ir When Condition ( subject , Ġconvert , Ġto F ir Or ErrorType Ref ) ĊĠĠĠĠĠĠĠ Ġfir Condition Ġ= Ġwhen Ġ( fir Condition ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġfir Condition Element ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfir Condition . generate Lazy Logical Operation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfir Condition Element , Ġfalse , Ġcondition . to F ir Psi Source Element ( F ir Fake Source Element Kind . When Condition ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġfir Condition !! Ċ } Ċ Ċ internal Ġfun Ġgenerate Dest ruct uring Block ( ĊĠĠĠ Ġsession : ĠF ir Session , ĊĠĠĠ Ġmulti Declaration : ĠK t Dest ruct uring Declaration , ĊĠĠĠ Ġcontainer : ĠF ir Variable <* >, ĊĠĠĠ Ġtmp Variable : ĠBoolean , ĊĠĠĠ Ġextract Annotations To : ĠK t Annotated .( F ir Annotation Container Builder ) Ġ-> ĠUnit , ĊĠĠĠ Ġto F ir Or Implicit Type Ref : ĠK t Type Reference ?. () Ġ-> ĠF ir Type Ref , Ċ ): ĠF ir Expression Ġ{ ĊĠĠĠ Ġreturn Ġbuild Block Ġ{ ĊĠĠĠĠĠĠĠ Ġsource Ġ= Ġmulti Declaration . to F ir Psi Source Element () ĊĠĠĠĠĠĠĠ Ġif Ġ( tmp Variable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatements Ġ+= Ġcontainer ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġis Var Ġ= Ġmulti Declaration . is Var ĊĠĠĠĠĠĠĠ Ġfor Ġ(( index , Ġentry ) Ġin Ġmulti Declaration . entries . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( entry . name Identifier ?. text Ġ== Ġ"_ ") Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Source Ġ= Ġentry . to F ir Psi Source Element () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġentry . name As Safe Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatements Ġ+= Ġbuild Property Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġentry Source ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . session Ġ= Ġsession ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorigin Ġ= ĠF ir Declaration Origin . Source ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ref Ġ= Ġentry . type Reference . to F ir Or Implicit Type Ref () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . name Ġ= Ġname ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitializer Ġ= Ġbuild Component Call Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcomponent Call Source Ġ= Ġentry Source . fake Element ( F ir Fake Source Element Kind . Des ug ared Component Function Call ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġcomponent Call Source ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexplicit Receiver Ġ= Ġgenerate Resolved Access Expression ( component Call Source , Ġcontainer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcomponent Index Ġ= Ġindex Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . is Var Ġ= Ġis Var ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Local Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= ĠF ir Declaration Status Impl ( Vis ibilities . Local , ĠMod ality . FINAL ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsymbol Ġ= ĠF ir Property Symbol ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry . extract Annotations To ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ