/* Ċ Ġ* Ġ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 . fir . analysis . check ers . expression Ċ Ċ import Ġorg . jetbrains . kotlin . fir . F ir Session Ċ import Ġorg . jetbrains . kotlin . fir . analysis . check ers . Constant Argument Kind Ċ import Ġorg . jetbrains . kotlin . fir . analysis . check ers . check Constant Arguments Ċ import Ġorg . jetbrains . kotlin . fir . analysis . check ers . context . Checker Context Ċ import Ġorg . jetbrains . kotlin . fir . analysis . diagnostics . Diagnostic Reporter Ċ import Ġorg . jetbrains . kotlin . fir . analysis . diagnostics . F ir Diagnostic Factory 0 Ċ import Ġorg . jetbrains . kotlin . fir . analysis . diagnostics . F ir Errors Ċ import Ġorg . jetbrains . kotlin . fir . analysis . diagnostics . report On Ċ import Ġorg . jetbrains . kotlin . fir . expressions .* Ċ import Ġorg . jetbrains . kotlin . psi . Kt Expression Ċ Ċ object ĠF ir Annotation Argument Checker Ġ: ĠF ir Annotation Call Checker () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcheck ( expression : ĠF ir Annotation Call , Ġcontext : ĠCheck er Context , Ġreporter : ĠDiagnostic Reporter ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġargument Mapping Ġ= Ġexpression . argument Mapping Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġfor Ġ(( arg , Ġ_) Ġin Ġargument Mapping ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarg Expression Ġ= Ġ( arg Ġas ? ĠF ir Named Argument Expression )?. expression Ġ?: Ġarg ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Annotation Argument With Sub Elements ( arg Expression , Ġcontext . session , Ġreporter , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġreporter . report On ( arg Expression . source , Ġit , Ġcontext ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Annotation Argument With Sub Elements ( ĊĠĠĠĠĠĠĠ Ġexpression : ĠF ir Expression , ĊĠĠĠĠĠĠĠ Ġsession : ĠF ir Session , ĊĠĠĠĠĠĠĠ Ġreporter : ĠDiagnostic Reporter , ĊĠĠĠĠĠĠĠ Ġcontext : ĠCheck er Context ĊĠĠĠ Ġ): ĠF ir Diagnostic Factory 0 < Kt Expression >? Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF ir ArrayOf Call Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġused Non Const Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( arg Ġin Ġexpression . argument List . arguments ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource For Report Ġ= Ġarg . source ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġerr Ġ= Ġcheck Annotation Argument With Sub Elements ( arg , Ġsession , Ġreporter , Ġcontext )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// DO ĠNOT H ING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( err Ġ!= ĠF ir Errors . AN NOT ATION _ ARGUMENT _ MUST _ BE _ K CLASS _ LITERAL ) Ġused Non Const Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreporter . report On ( source For Report , Ġerr , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( used Non Const ) Ġreturn ĠF ir Errors . NON _ CONST _ VAL _ USED _ IN _ CONSTANT _ EXPRESSION ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠF ir Var arg Arguments Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( arg Ġin Ġexpression . arguments ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Annotation Argument With Sub Elements ( arg , Ġsession , Ġreporter , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġreporter . report On ( arg . source , Ġit , Ġcontext ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( check Constant Arguments ( expression , Ġsession )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConstant Argument Kind . NOT _ CONST Ġ-> ĠF ir Errors . AN NOT ATION _ ARGUMENT _ MUST _ BE _ CONST ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConstant Argument Kind . ENUM _ NOT _ CONST Ġ-> ĠF ir Errors . AN NOT ATION _ ARGUMENT _ MUST _ BE _ ENUM _ CONST ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConstant Argument Kind . NOT _ K CLASS _ LITERAL Ġ-> ĠF ir Errors . AN NOT ATION _ ARGUMENT _ MUST _ BE _ K CLASS _ LITERAL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConstant Argument Kind . K CLASS _ LITERAL _ OF _ TYPE _ PARAMETER _ ERROR Ġ-> ĠF ir Errors . AN NOT ATION _ ARGUMENT _ K CLASS _ LITERAL _ OF _ TYPE _ PARAMETER _ ERROR ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠConstant Argument Kind . NOT _ CONST _ VAL _ IN _ CONST _ EXPRESSION Ġ-> ĠF ir Errors . NON _ CONST _ VAL _ USED _ IN _ CONSTANT _ EXPRESSION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} Ċ } Ċ