/* Ċ Ġ* ĠCopyright Ġ 2 0 0 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 / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . fir . builder Ċ Ċ import Ġorg . jetbrains . kotlin . Kt Node Types Ċ import Ġorg . jetbrains . kotlin . descriptors . Class Kind Ċ import Ġorg . jetbrains . kotlin . descriptors . Modal ity Ċ import Ġorg . jetbrains . kotlin . descriptors . Vis ibilities Ċ import Ġorg . jetbrains . kotlin . descriptors . Visibility Ċ import Ġorg . jetbrains . kotlin . fir . F ir Element Ċ import Ġorg . jetbrains . kotlin . fir . F ir Session Ċ import Ġorg . jetbrains . kotlin . fir . declarations .* Ċ import Ġorg . jetbrains . kotlin . fir . declarations . impl .* Ċ import Ġorg . jetbrains . kotlin . fir . expressions . F ir Annotation Call Ċ import Ġorg . jetbrains . kotlin . fir . expressions . F ir Body Ċ import Ġorg . jetbrains . kotlin . fir . expressions . F ir Deleg ated Constructor Call Ċ import Ġorg . jetbrains . kotlin . fir . expressions . F ir Expression Ċ import Ġorg . jetbrains . kotlin . fir . expressions . impl .* Ċ import Ġorg . jetbrains . kotlin . fir . symbols . impl . F ir Class Symbol Ċ import Ġorg . jetbrains . kotlin . fir . symbols . impl . F ir Type Alias Symbol Ċ import Ġorg . jetbrains . kotlin . fir . symbols . impl . F ir Type Parameter Symbol Ċ import Ġorg . jetbrains . kotlin . fir . types . F ir Type Ċ import Ġorg . jetbrains . kotlin . fir . types . F ir Type Projection Ċ import Ġorg . jetbrains . kotlin . fir . types . impl .* Ċ import Ġorg . jetbrains . kotlin . ir . expressions . Ir Const Kind Ċ import Ġorg . jetbrains . kotlin . lexer . Kt Tokens Ċ import Ġorg . jetbrains . kotlin . lexer . Kt Tokens .* Ċ import Ġorg . jetbrains . kotlin . name . Class Id Ċ import Ġorg . jetbrains . kotlin . name . Fq Name Ċ import Ġorg . jetbrains . kotlin . name . Name Ċ import Ġorg . jetbrains . kotlin . psi .* Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . has Actual Modifier Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . has Expect Modifier Ċ import Ġorg . jetbrains . kotlin . types . Variance Ċ Ċ class ĠRaw F ir Builder ( val Ġsession : ĠF ir Session ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġimplicit Unit Type Ġ= ĠF ir Implicit Unit Type ( session , Ġnull ) ĊĊĠĠĠ Ġprivate Ġval Ġimplicit Any Type Ġ= ĠF ir Implicit Any Type ( session , Ġnull ) ĊĊĠĠĠ Ġprivate Ġval Ġimplicit Enum Type Ġ= ĠF ir Implicit Enum Type ( session , Ġnull ) ĊĊĠĠĠ Ġfun Ġbuild F ir File ( file : ĠK t File ): ĠF ir File Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfile . accept ( Visitor (), ĠUnit ) Ġas ĠF ir File ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠK t Modifier List Owner . visibility : ĠVisibility ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġwith ( modifier List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġ== Ġnull Ġ-> ĠVis ibilities . UNKNOWN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Modifier ( PRIVATE _ KEYWORD ) Ġ-> ĠVis ibilities . PRIVATE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Modifier ( PUBLIC _ KEYWORD ) Ġ-> ĠVis ibilities . PUBLIC ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Modifier ( PROTECT ED _ KEYWORD ) Ġ-> ĠVis ibilities . PROTECT ED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġif Ġ( has Modifier ( INTERNAL _ KEYWORD )) ĠVis ibilities . INTERNAL Ġelse ĠVis ibilities . UNKNOWN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠK t Declaration . modal ity : ĠMod ality ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġwith ( modifier List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġ== Ġnull Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Modifier ( FINAL _ KEYWORD ) Ġ-> ĠMod ality . FINAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Modifier ( SE AL ED _ KEYWORD ) Ġ-> ĠMod ality . SE AL ED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Modifier ( AB STR ACT _ KEYWORD ) Ġ-> ĠMod ality . AB STR ACT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġif Ġ( has Modifier ( OPEN _ KEYWORD )) ĠMod ality . OPEN Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġinner Ġclass ĠVisitor Ġ: ĠK t Visitor < F ir Element , ĠUnit >() Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠR Ġ: ĠF ir Element > ĠK t Element ?. convert Safe (): ĠR ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ?. accept ( this @ Visitor , ĠUnit ) Ġas ? ĠR ĊĊĠĠĠĠĠĠĠ Ġprivate Ġinline Ġfun Ġ< re ified ĠR Ġ: ĠF ir Element > ĠK t Element . convert (): ĠR Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . accept ( this @ Visitor , ĠUnit ) Ġas ĠR ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠK t Type Reference ?. to F ir Or Implicit Type (): ĠF ir Type Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconvert Safe () Ġ?: ĠF ir Implicit Type Impl ( session , Ġthis ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠK t Type Reference ?. to F ir Or Unit Type (): ĠF ir Type Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconvert Safe () Ġ?: Ġimplicit Unit Type ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠK t Type Reference ?. to F ir Or ErrorType (): ĠF ir Type Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconvert Safe () Ġ?: ĠF ir ErrorType Impl ( session , Ġthis , Ġif Ġ( this Ġ== Ġnull ) Ġ" Incomplete Ġcode " Ġelse Ġ" Conversion Ġfailed ") ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠK t Declaration With Body . build F ir Body (): ĠF ir Body ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! has Body () Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Block Body () Ġ-> ĠF ir Block Body Impl ( session , Ġthis ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠF ir Expression Body Impl ( session , ĠF ir Expression Stub ( session , Ġnull )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠString . parse Character (): ĠChar ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠStrip Ġthe Ġquotes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( length Ġ< Ġ 2 Ġ|| Ġthis [ 0 ] Ġ!= Ġ'\'' Ġ|| Ġthis [ length Ġ- Ġ 1 ] Ġ!= Ġ'\' ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġsubstring ( 1 , Ġlength Ġ- Ġ 1 ) Ġ// Ġnow Ġthere 're Ġno Ġquotes ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( text [ 0 ] Ġ!= Ġ'\\ ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo Ġescape ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text . length Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġescaped StringTo Character ( text ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġescaped StringTo Character ( text : ĠString ): ĠChar ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( text . isNotEmpty () Ġ&& Ġtext [ 0 ] Ġ== Ġ'\\ ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Only Ġescaped Ġsequences Ġmust Ġbe Ġpassed Ġto Ġthis Ġroutine : Ġ$ text " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠE scape ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġescape Ġ= Ġtext . substring ( 1 ) Ġ// Ġstrip Ġthe Ġslash ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( escape . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġbare Ġslash ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġone - char Ġescape ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtranslate Escape ( escape [ 0 ]) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 5 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġunicode Ġescape ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( escape [ 0 ] Ġ== Ġ' u ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġint Value Ġ= ĠInteger . valueOf ( escape . substring ( 1 ), Ġ 1 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġint Value . toInt (). to Char () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWill Ġbe Ġreported Ġbelow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġtranslate Escape ( c : ĠChar ): ĠChar ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( c ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' t ' Ġ-> Ġ'\ t ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' b ' Ġ-> Ġ'\ b ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' n ' Ġ-> Ġ'\ n ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' r ' Ġ-> Ġ'\ r ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ'\'' Ġ-> Ġ'\'' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ'\" ' Ġ-> Ġ'\" ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ'\\ ' Ġ-> Ġ'\\ ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ'$ ' Ġ-> Ġ'$ ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠValue Argument ?. to F ir Expression (): ĠF ir Expression Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġ?: Ġreturn ĠF ir Error Expression Impl ( session , Ġthis Ġas ? ĠK t Element , Ġ" No Ġargument Ġgiven ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpression Ġ= Ġthis . get Argument Expression () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Constant Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġexpression . node . elementType ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext : ĠString Ġ= Ġexpression . text ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠK t Node Types . INTEGER _ CONSTANT Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text . last () Ġ== Ġ' l ' Ġ|| Ġtext . last () Ġ== Ġ' L ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ir Const Expression Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession , Ġexpression , ĠIr Const Kind . Long , Ġtext . drop Last ( 1 ). to Long OrNull (), Ġ" Incorrect Ġlong : Ġ$ text " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġsupport Ġbyte Ġ/ Ġshort ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ir Const Expression Impl ( session , Ġexpression , ĠIr Const Kind . Int , Ġtext . toInt OrNull (), Ġ" Incorrect Ġint : Ġ$ text ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠK t Node Types . FLOAT _ CONSTANT Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text . last () Ġ== Ġ' f ' Ġ|| Ġtext . last () Ġ== Ġ' F ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ir Const Expression Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession , Ġexpression , ĠIr Const Kind . Float , Ġtext . drop Last ( 1 ). toFloat OrNull (), Ġ" Incorrect Ġfloat : Ġ$ text " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ir Const Expression Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession , Ġexpression , ĠIr Const Kind . Double , Ġtext . toDouble OrNull (), Ġ" Incorrect Ġdouble : Ġ$ text " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠK t Node Types . CHARACTER _ CONSTANT Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ir Const Expression Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession , Ġexpression , ĠIr Const Kind . Char , Ġtext . parse Character (), Ġ" Incorrect Ġcharacter : Ġ$ text " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠK t Node Types . BOOLEAN _ CONSTANT Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ir Const Expression Impl ( session , Ġexpression , ĠIr Const Kind . Boolean , Ġtext . to Boolean ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠK t Node Types . NULL Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ir Const Expression Impl ( session , Ġexpression , ĠIr Const Kind . Null , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAssertionError (" Unknown Ġliteral Ġtype : Ġ$ type , Ġ$ text ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t String Template Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( entry Ġin Ġexpression . entries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( entry ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Literal String Template Entry Ġ-> Ġsb . append ( entry . text ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Escape String Template Entry Ġ-> Ġsb . append ( entry . unes caped Value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn ĠF ir Error Expression Impl ( session , Ġexpression , Ġ" Incorrect Ġtemplate Ġentry : Ġ${ entry . text }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠF ir Const Expression Impl ( session , Ġexpression , ĠIr Const Kind . String , Ġsb . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn ĠF ir Expression Stub ( session , Ġthis Ġas ? ĠK t Element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠK t Property Accessor ?. to F ir Property Accessor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperty : ĠK t Property , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Type : ĠF ir Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Getter : ĠBoolean ĊĠĠĠĠĠĠĠ Ġ): ĠF ir Property Accessor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Getter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ir Default Property Getter ( session , Ġproperty , Ġproperty Type , Ġproperty . visibility ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ir Default Property Setter ( session , Ġproperty , Ġproperty Type , Ġproperty . visibility ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfir Accessor Ġ= ĠF ir Property AccessorImpl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Getter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Getter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Reference ?. convert Safe () Ġ?: Ġproperty Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Reference . to F ir Or Unit Type () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . build F ir Body () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextract Annotations To ( fir Accessor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextract Value Parameters To ( fir Accessor , Ġproperty Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Getter Ġ&& Ġfir Accessor . value Parameters . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfir Accessor . value Parameters Ġ+= ĠF ir Default Setter Value Parameter ( session , Ġthis , Ġproperty Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfir Accessor ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠK t Parameter . to F ir Value Parameter ( default Type : ĠF ir Type ? Ġ= Ġnull ): ĠF ir Value Parameter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfir Value Parameter Ġ= ĠF ir Value Parameter Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname As Safe Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Reference Ġ!= Ġnull Ġ-> Ġtype Reference . to F ir Or ErrorType () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Type Ġ!= Ġnull Ġ-> Ġdefault Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull . to F ir Or ErrorType () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has DefaultValue ()) ĠF ir Expression Stub ( session , Ġthis ) Ġelse Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Cross inline Ġ= Ġhas Modifier ( Kt Tokens . CROSS INLINE _ KEYWORD ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis N oin line Ġ= Ġhas Modifier ( Kt Tokens . NO INLINE _ KEYWORD ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Var arg Ġ= Ġis Var Arg ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextract Annotations To ( fir Value Parameter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfir Value Parameter ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠK t Parameter . to F ir Property (): ĠF ir Property Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( has Val Or Var ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġtype Reference . to F ir Or ErrorType () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfir Property Ġ= ĠF ir Member Property Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname As Safe Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmod ality , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Expect Modifier (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Actual Modifier (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Override Ġ= Ġhas Modifier ( Kt Tokens . OVERRIDE _ KEYWORD ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Const Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Late Init Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreceiver Type Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType Ġ= Ġtype , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Var Ġ= Ġis Mutable , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitializer Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgetter Ġ= ĠF ir Default Property Getter ( session , Ġthis , Ġtype , Ġvisibility ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsetter Ġ= ĠF ir Default Property Setter ( session , Ġthis , Ġtype , Ġvisibility ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelegate Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextract Annotations To ( fir Property ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfir Property ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠK t Modifier List Owner . extract Annotations To ( container : ĠF ir Abstract Annotated Declaration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( annotation Entry Ġin Ġannotation Entries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . annotations Ġ+= Ġannotation Entry . convert < F ir Annotation Call >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠK t Type Parameter List Owner . extract Type Parameters To ( container : ĠF ir Abstract Member Declaration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( type Parameter Ġin Ġtype Parameters ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . type Parameters Ġ+= Ġtype Parameter . convert < F ir Type Parameter >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠK t Declaration With Body . extract Value Parameters To ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer : ĠF ir Function , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Type : ĠF ir Type ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( value Parameter Ġin Ġvalue Parameters ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( container . value Parameters Ġas ĠMutable List < F ir Value Parameter >) Ġ+= Ġvalue Parameter . to F ir Value Parameter ( default Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠK t Call Element . extract Arguments To ( container : ĠF ir Abstract Call ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( argument Ġin Ġthis . value Arguments ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . arguments Ġ+= Ġargument . to F ir Expression () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠK t Class Or Object . extract Super TypeList Entries To ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer : ĠF ir Class Impl , Ġdeleg ated Self Type : ĠF ir Type ĊĠĠĠĠĠĠĠ Ġ): ĠF ir Type ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsuper Type Call Entry : ĠK t Super Type Call Entry ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdeleg ated Super Type : ĠF ir Type ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( super TypeList Entry Ġin Ġsuper TypeList Entries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( super TypeList Entry ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Super Type Entry Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . super Types Ġ+= Ġsuper TypeList Entry . type Reference . to F ir Or ErrorType () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Super Type Call Entry Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeleg ated Super Type Ġ= Ġsuper TypeList Entry . callee Expression . type Reference . to F ir Or ErrorType () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . super Types Ġ+= Ġdeleg ated Super Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper Type Call Entry Ġ= Ġsuper TypeList Entry ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Deleg ated Super Type Entry Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġsuper TypeList Entry . type Reference . to F ir Or ErrorType () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . super Types Ġ+= ĠF ir Deleg ated Type Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ir Expression Stub ( session , Ġsuper TypeList Entry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġis ĠK t Class Ġ&& Ġthis . is Interface ()) Ġreturn Ġdeleg ated Super Type ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġis Enum () Ġ= Ġthis Ġis ĠK t Class Ġ&& Ġthis . is Enum () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġin Ġcase Ġwe Ġhave Ġno Ġprimary Ġconstructor , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġit Ġmay Ġbe Ġnot Ġpossible Ġto Ġdetermine Ġdeleg ated Ġsuper Ġtype Ġright Ġhere ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeleg ated Super Type Ġ= Ġdeleg ated Super Type Ġ?: Ġ( if Ġ( is Enum ()) Ġimplicit Enum Type Ġelse Ġimplicit Any Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! this . has Primary Constructor ()) Ġreturn Ġdeleg ated Super Type ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfir Primary Constructor Ġ= Ġprimary Constructor . to F ir Constructor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper Type Call Entry , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeleg ated Super Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeleg ated Self Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner Ġ= Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontainer . declarations Ġ+= Ġfir Primary Constructor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdeleg ated Super Type ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠK t Primary Constructor ?. to F ir Constructor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper Type Call Entry : ĠK t Super Type Call Entry ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeleg ated Super Type : ĠF ir Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeleg ated Self Type : ĠF ir Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġowner : ĠK t Class Or Object ĊĠĠĠĠĠĠĠ Ġ): ĠF ir Constructor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstructor Cal lee Ġ= Ġsuper Type Call Entry ?. callee Expression ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfir Deleg ated Call Ġ= ĠF ir Deleg ated Constructor Call Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstructor Cal lee Ġ?: Ġ( this Ġ?: Ġowner ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeleg ated Super Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis This Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġarguments Ġare Ġnot Ġneeded Ġfor Ġlight Ġclasses , Ġbut Ġwill Ġbe Ġneeded Ġlater ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// super Type Call Entry . extract Arguments To ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfir Constructor Ġ= ĠF ir Primary Constructor Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis Ġ?: Ġowner , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis ?. visibility Ġ?: ĠVis ibilities . UNKNOWN , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis ?. has Expect Modifier () Ġ?: Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis ?. has Actual Modifier () Ġ?: Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeleg ated Self Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfir Deleg ated Call ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ?. extract Annotations To ( fir Constructor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis ?. extract Value Parameters To ( fir Constructor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfir Constructor ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġpackage Fq Name : ĠF q Name ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Kt File ( file : ĠK t File , Ġdata : ĠUnit ): ĠF ir Element Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpackage Fq Name Ġ= Ġfile . package Fq Name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfir File Ġ= ĠF ir File Impl ( session , Ġfile , Ġfile . name , Ġpackage Fq Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( annotation Entry Ġin Ġfile . annotation Entries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfir File . annotations Ġ+= Ġannotation Entry . convert < F ir Annotation Call >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( import Directive Ġin Ġfile . import Directives ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfir File . imports Ġ+= ĠF ir Import Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimport Directive , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimport Directive . imported Fq Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimport Directive . is All Under , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimport Directive . alias Name ?. let Ġ{ ĠName . identifier ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( declaration Ġin Ġfile . declarations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfir File . declarations Ġ+= Ġdeclaration . convert < F ir Declaration >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfir File ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠK t Class Or Object . to Deleg ated Self Type (): ĠF ir Type Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠF ir User Type Impl ( session , Ġthis , Ġis Nullable Ġ= Ġfalse ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqualifier . add ( F ir Qualifier Part Impl ( name As Safe Name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Enum Entry ( enum Entry : ĠK t Enum Entry , Ġdata : ĠUnit ): ĠF ir Element Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwith Child ClassName ( enum Entry . name As Safe Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfir Enum Entry Ġ= ĠF ir Enum Entry Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum Entry , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ir Class Symbol ( current Class Id ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum Entry . name As Safe Name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenum Entry . extract Annotations To ( fir Enum Entry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeleg ated Self Type Ġ= Ġenum Entry . to Deleg ated Self Type () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeleg ated Super Type Ġ= Ġenum Entry . extract Super TypeList Entries To ( fir Enum Entry , Ġdeleg ated Self Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( declaration Ġin Ġenum Entry . declarations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfir Enum Entry . declarations Ġ+= Ġwhen Ġ( declaration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Secondary Constructor Ġ-> Ġdeclaration . to F ir Constructor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeleg ated Super Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeleg ated Self Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Primary Constructor Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġdeclaration . convert < F ir Declaration >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfir Enum Entry ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinline Ġfun Ġ< T > Ġwith Child ClassName ( name : ĠName , Ġl : Ġ() Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠclassName Ġ= ĠclassName . child ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt Ġ= Ġl () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠclassName Ġ= ĠclassName . parent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġt ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcurrent Class Id Ġget () Ġ= ĠClass Id ( package Fq Name , ĠclassName , Ġfalse ) ĊĊĠĠĠĠĠĠĠ Ġvar ĠclassName : ĠF q Name Ġ= ĠF q Name . ROOT ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Class Or Object ( class Or Object : ĠK t Class Or Object , Ġdata : ĠUnit ): ĠF ir Element Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwith Child ClassName ( class Or Object . name As Safe Name ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclass Kind Ġ= Ġwhen Ġ( class Or Object ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Object Declaration Ġ-> ĠClass Kind . OBJECT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Class Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Or Object . is Interface () Ġ-> ĠClass Kind . INTERFACE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Or Object . is Enum () Ġ-> ĠClass Kind . ENUM _ CLASS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Or Object . is Annotation () Ġ-> ĠClass Kind . AN NOT ATION _ CLASS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠClass Kind . CLASS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠAssertionError (" Unexpected Ġclass Ġor Ġobject : Ġ${ class Or Object . text }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfir Class Ġ= ĠF ir Class Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Or Object , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ir Class Symbol ( current Class Id ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Or Object . name As Safe Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Or Object . visibility , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Or Object . modal ity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Or Object . has Expect Modifier (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Or Object . has Actual Modifier (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Kind , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Inner Ġ= Ġclass Or Object . has Modifier ( Kt Tokens . INNER _ KEYWORD ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Companion Ġ= Ġ( class Or Object Ġas ? ĠK t Object Declaration )?. is Companion () Ġ== Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Data Ġ= Ġ( class Or Object Ġas ? ĠK t Class )?. is Data () Ġ== Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Inline Ġ= Ġclass Or Object . has Modifier ( Kt Tokens . INLINE _ KEYWORD ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Or Object . extract Annotations To ( fir Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Or Object . extract Type Parameters To ( fir Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeleg ated Self Type Ġ= Ġclass Or Object . to Deleg ated Self Type () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeleg ated Super Type Ġ= Ġclass Or Object . extract Super TypeList Entries To ( fir Class , Ġdeleg ated Self Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Or Object . primary Constructor ?. value Parameters ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . has Val Or Var ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfir Class . declarations Ġ+= Ġit . to F ir Property () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( declaration Ġin Ġclass Or Object . declarations ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfir Class . declarations Ġ+= Ġwhen Ġ( declaration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Secondary Constructor Ġ-> Ġdeclaration . to F ir Constructor ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeleg ated Super Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeleg ated Self Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass Or Object . primary Constructor Ġ!= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġdeclaration . convert < F ir Declaration >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfir Class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Type Alias ( type Alias : ĠK t Type Alias , Ġdata : ĠUnit ): ĠF ir Element Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwith Child ClassName ( type Alias . name As Safe Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfir Type Alias Ġ= ĠF ir Type Alias Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Alias , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ir Type Alias Symbol ( current Class Id ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Alias . name As Safe Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Alias . visibility , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Alias . has Expect Modifier (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Alias . has Actual Modifier (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Alias . getType Reference (). to F ir Or ErrorType () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Alias . extract Annotations To ( fir Type Alias ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Alias . extract Type Parameters To ( fir Type Alias ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfir Type Alias ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Named Function ( function : ĠK t Named Function , Ġdata : ĠUnit ): ĠF ir Element Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( function . name Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġreturn Ġanonymous Ġfunction Ġhere ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġwhat Ġif Ġname Ġis Ġnot Ġnull Ġbut Ġwe 're Ġin Ġexpression Ġposition ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠF ir Expression Stub ( session , Ġfunction ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Reference Ġ= Ġfunction . type Reference ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfir Function Ġ= ĠF ir Member Function Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . name As Safe Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . visibility , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . modal ity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . has Expect Modifier (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . has Actual Modifier (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . has Modifier ( Kt Tokens . OVERRIDE _ KEYWORD ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . has Modifier ( Kt Tokens . OPERATOR _ KEYWORD ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . has Modifier ( Kt Tokens . IN FIX _ KEYWORD ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . has Modifier ( Kt Tokens . INLINE _ KEYWORD ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . has Modifier ( Kt Tokens . TAIL REC _ KEYWORD ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . has Modifier ( Kt Tokens . EXTERNAL _ KEYWORD ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . has Modifier ( Kt Tokens . SUS PEND _ KEYWORD ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . receiver Type Reference . convert Safe (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( function . has Block Body ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Reference . to F ir Or Unit Type () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Reference . to F ir Or Implicit Type () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . build F ir Body () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . extract Annotations To ( fir Function ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . extract Type Parameters To ( fir Function ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( value Parameter Ġin Ġfunction . value Parameters ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfir Function . value Parameters Ġ+= Ġvalue Parameter . convert < F ir Value Parameter >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfir Function ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠK t Secondary Constructor . to F ir Constructor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeleg ated Super Type : ĠF ir Type ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeleg ated Self Type : ĠF ir Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Primary Constructor : ĠBoolean ĊĠĠĠĠĠĠĠ Ġ): ĠF ir Constructor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfir Constructor Ġ= ĠF ir Constructor Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvisibility , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Expect Modifier (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Actual Modifier (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeleg ated Self Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Deleg ation Call (). convert ( deleg ated Super Type , Ġdeleg ated Self Type , Ġhas Primary Constructor ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild F ir Body () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextract Annotations To ( fir Constructor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġextract Value Parameters To ( fir Constructor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfir Constructor ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠK t Constructor Deleg ation Call . convert ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeleg ated Super Type : ĠF ir Type ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeleg ated Self Type : ĠF ir Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhas Primary Constructor : ĠBoolean ĊĠĠĠĠĠĠĠ Ġ): ĠF ir Deleg ated Constructor Call Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis This Ġ= Ġis Call To This Ġ|| Ġ( is Implicit Ġ&& Ġhas Primary Constructor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeleg ated Type Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis This Ġ-> Ġdeleg ated Self Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġdeleg ated Super Type Ġ?: ĠF ir ErrorType Impl ( session , Ġthis , Ġ" No Ġsuper Ġtype ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfir Constructor Call Ġ= ĠF ir Deleg ated Constructor Call Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeleg ated Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis This ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġarguments Ġare Ġnot Ġneeded Ġfor Ġlight Ġclasses , Ġbut Ġwill Ġbe Ġneeded Ġlater ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcall . extract Arguments To ( fir Constructor Call ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfir Constructor Call ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Anonymous Initializer ( initializer : ĠK t Anonymous Initializer , Ġdata : ĠUnit ): ĠF ir Element Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠF ir Anonymous Initializer Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitializer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ir Block Body Impl ( session , Ġinitializer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Property ( property : ĠK t Property , Ġdata : ĠUnit ): ĠF ir Element Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperty Type Ġ= Ġproperty . type Reference . to F ir Or Implicit Type () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfir Property Ġ= ĠF ir Member Property Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . name As Safe Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . visibility , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . modal ity , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . has Expect Modifier (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . has Actual Modifier (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . has Modifier ( Kt Tokens . OVERRIDE _ KEYWORD ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . has Modifier ( Kt Tokens . CONST _ KEYWORD ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . has Modifier ( Kt Tokens . LATE INIT _ KEYWORD ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . receiver Type Reference . convert Safe (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . is Var , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( property . has Initializer ()) ĠF ir Expression Stub ( session , Ġproperty ) Ġelse Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . getter . to F ir Property Accessor ( property , Ġproperty Type , Ġis Getter Ġ= Ġtrue ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . setter . to F ir Property Accessor ( property , Ġproperty Type , Ġis Getter Ġ= Ġfalse ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( property . has Delegate ()) ĠF ir Expression Stub ( session , Ġproperty ) Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . extract Annotations To ( fir Property ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . extract Type Parameters To ( fir Property ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfir Property ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Type Reference ( type Reference : ĠK t Type Reference , Ġdata : ĠUnit ): ĠF ir Element Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Element Ġ= Ġtype Reference . type Element ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Nullable Ġ= Ġtype Element Ġis ĠK t Nullable Type ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun ĠK t Type Element ?. unwrap Nullable (): ĠK t Type Element ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġis ĠK t Nullable Type ) Ġthis . inner Type . unwrap Nullable () Ġelse Ġthis ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġun wrapped Element Ġ= Ġtype Element . unwrap Nullable () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfir Type Ġ= Ġwhen Ġ( un wrapped Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t Dynamic Type Ġ-> ĠF ir Dynamic Type Impl ( session , Ġtype Reference , Ġis Nullable ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t User Type Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġreference Expression Ġ= Ġun wrapped Element . reference Expression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( reference Expression Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuser Type Ġ= ĠF ir User Type Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession , Ġtype Reference , Ġis Nullable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġqualifier : ĠK t User Type ? Ġ= Ġun wrapped Element ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfir Qualifier Ġ= ĠF ir Qualifier Part Impl ( reference Expression !!. get Referenced Name As Name ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( type Argument Ġin Ġqualifier !!. type Arguments ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfir Qualifier . type Arguments Ġ+= Ġtype Argument . convert < F ir Type Projection >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Type . qual ifier . add ( fir Qualifier ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqualifier Ġ= Ġqualifier . qual ifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreference Expression Ġ= Ġqualifier ?. reference Expression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( reference Expression Ġ!= Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Type . qual ifier . reverse () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ir ErrorType Impl ( session , Ġtype Reference , Ġ" Incomplete Ġuser Ġtype ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠK t FunctionType Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfunction Type Ġ= ĠF ir FunctionType Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Reference , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Nullable , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun wrapped Element . receiver Type Reference . convert Safe (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġprobably Ġimplicit Ġtype Ġshould Ġnot Ġbe Ġhere ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun wrapped Element . returnType Reference . to F ir Or Implicit Type () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( value Parameter Ġin Ġun wrapped Element . parameters ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Type . value Parameters Ġ+= Ġvalue Parameter . convert < F ir Value Parameter >() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> ĠF ir ErrorType Impl ( session , Ġtype Reference , Ġ" Un wrapped Ġtype Ġis Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠAssertionError (" Unexpected Ġtype Ġelement : Ġ${ un wrapped Element . text }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( annotation Entry Ġin Ġtype Reference . annotation Entries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfir Type . annotations Ġ+= Ġannotation Entry . convert < F ir Annotation Call >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfir Type ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Annotation Entry ( annotation Entry : ĠK t Annotation Entry , Ġdata : ĠUnit ): ĠF ir Element Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfir Annotation Call Ġ= ĠF ir Annotation Call Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotation Entry , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotation Entry . use Site Target ?. getAnnotation Use Site Target (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotation Entry . type Reference . to F ir Or ErrorType () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġannotation Entry . extract Arguments To ( fir Annotation Call ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfir Annotation Call ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Type Parameter ( parameter : ĠK t Type Parameter , Ġdata : ĠUnit ): ĠF ir Element Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfir Type Parameter Ġ= ĠF ir Type Parameter Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ir Type Parameter Symbol (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter . name As Safe Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter . variance , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter . has Modifier ( Kt Tokens . RE IFI ED _ KEYWORD ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter . extract Annotations To ( fir Type Parameter ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextends Bound Ġ= Ġparameter . extends Bound ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġhandle Ġwhere , Ġhere Ġor Ġ( prefer able ) Ġin Ġparent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( extends Bound Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfir Type Parameter . bounds Ġ+= Ġextends Bound . convert < F ir Type >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfir Type Parameter ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Type Projection ( type Projection : ĠK t Type Projection , Ġdata : ĠUnit ): ĠF ir Element Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprojection Kind Ġ= Ġtype Projection . projection Kind ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( projection Kind Ġ== ĠK t Projection Kind . STAR ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠF ir Star Projection Impl ( session , Ġtype Projection ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Reference Ġ= Ġtype Projection . type Reference ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfir Type Ġ= Ġtype Reference . to F ir Or ErrorType () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠF ir Type Projection With Variance Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsession , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Projection , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( projection Kind ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠK t Projection Kind . IN Ġ-> ĠVari ance . IN _ VARI ANCE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠK t Projection Kind . OUT Ġ-> ĠVari ance . OUT _ VARI ANCE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠK t Projection Kind . NONE Ġ-> ĠVari ance . IN VARIANT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠK t Projection Kind . STAR Ġ-> Ġthrow ĠAssertionError ("* Ġshould Ġnot Ġbe Ġhere ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfir Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Parameter ( parameter : ĠK t Parameter , Ġdata : ĠUnit ): ĠF ir Element Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter . to F ir Value Parameter () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Block Expression ( expression : ĠK t Block Expression , Ġdata : ĠUnit ): ĠF ir Element Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠF ir Block Body Impl ( session , Ġexpression ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Expression ( expression : ĠK t Expression , Ġdata : ĠUnit ): ĠF ir Element Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠF ir Expression Stub ( session , Ġexpression ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }