/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 1 Ġ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 . analysis . api . fir . components Ċ Ċ import Ġorg . jetbrains . kotlin . analysis . api . base . Kt Constant Value Ċ import Ġorg . jetbrains . kotlin . analysis . api . components . Kt Compile Time Constant Provider Ċ import Ġorg . jetbrains . kotlin . analysis . api . components . Kt Constant Evaluation Mode Ċ import Ġorg . jetbrains . kotlin . analysis . api . fir . Kt F ir Analysis Session Ċ import Ġorg . jetbrains . kotlin . analysis . api . fir . evaluate . F ir Compile Time Constant Evaluator Ċ import Ġorg . jetbrains . kotlin . analysis . api . tokens . Validity Token Ċ import Ġorg . jetbrains . kotlin . analysis . api . with Validity Assertion Ċ import Ġorg . jetbrains . kotlin . analysis . low . level . api . fir . api . get Or Build F ir Ċ import Ġorg . jetbrains . kotlin . analysis . low . level . api . fir . api . throw Unexpected F ir Element Error Ċ import Ġorg . jetbrains . kotlin . fir . F ir Element Ċ import Ġorg . jetbrains . kotlin . fir . expressions . F ir Expression Ċ import Ġorg . jetbrains . kotlin . fir . expressions . F ir Property Access Expression Ċ import Ġorg . jetbrains . kotlin . fir . expressions . F ir When Branch Ċ import Ġorg . jetbrains . kotlin . fir . references . F ir Named Reference Ċ import Ġorg . jetbrains . kotlin . psi . Kt Expression Ċ Ċ internal Ġclass ĠK t F ir Compile Time Constant Provider ( ĊĠĠĠ Ġoverride Ġval Ġanalysis Session : ĠK t F ir Analysis Session , ĊĠĠĠ Ġoverride Ġval Ġtoken : ĠValid ity Token , Ċ ) Ġ: ĠK t Compile Time Constant Provider (), ĠK t F ir Analysis Session Component Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġevaluate ( ĊĠĠĠĠĠĠĠ Ġexpression : ĠK t Expression , ĊĠĠĠĠĠĠĠ Ġmode : ĠK t Constant Evaluation Mode , ĊĠĠĠ Ġ): ĠK t Constant Value ? Ġ= Ġwith Validity Assertion Ġ{ ĊĠĠĠĠĠĠĠ Ġevaluate F ir ( expression . get Or Build F ir ( fir Resolve State ), Ġexpression , Ġmode ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġevaluate F ir ( ĊĠĠĠĠĠĠĠ Ġfir : ĠF ir Element ?, ĊĠĠĠĠĠĠĠ Ġcontext : ĠK t Expression , ĊĠĠĠĠĠĠĠ Ġmode : ĠK t Constant Evaluation Mode , ĊĠĠĠ Ġ): ĠK t Constant Value ? Ġ= Ġwith Validity Assertion Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( fir ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF ir Property Access Expression , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF ir Expression , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF ir Named Reference Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠF ir Compile Time Constant Evaluator . evaluate As Kt Constant Value ( fir , Ġmode ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠArithmetic Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠK t Constant Value . Kt Error Constant Value ( e . localized Message , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFor Ġinvalid Ġcode Ġlike Ġthe Ġfollowing , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ``` ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠĠ Ġtrue , Ġfalse Ġ-> Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ``` ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ` false ` Ġdoes Ġnot Ġhave Ġa Ġcorresponding Ġelements Ġon Ġthe ĠFIR Ġside Ġand Ġhence Ġthe Ġcontaining Ġ` F ir When Branch ` Ġis Ġreturned . ĠIn Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcase , Ġwe Ġsimply Ġreport Ġnull Ġsince ĠFIR Ġdoes Ġnot Ġknow Ġabout Ġit . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF ir When Branch Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow Unexpected F ir Element Error ( fir , Ġcontext ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ