/* Ċ Ġ* Ġ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 . resolve . calls . check ers Ċ Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġorg . jetbrains . kotlin . config . Language Feature Ċ import Ġorg . jetbrains . kotlin . config . Language Version Settings Ċ import Ġorg . jetbrains . kotlin . descriptors . Module Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Simple Function Descriptor Ċ import Ġorg . jetbrains . kotlin . diagnostics . Errors Ċ import Ġorg . jetbrains . kotlin . lexer . Kt Tokens Ċ import Ġorg . jetbrains . kotlin . name . Fq Name Ċ import Ġorg . jetbrains . kotlin . psi . Kt Constant Expression Ċ import Ġorg . jetbrains . kotlin . psi . Kt Expression Ċ import Ġorg . jetbrains . kotlin . psi . Kt Psi Util Ċ import Ġorg . jetbrains . kotlin . psi . Kt Unary Expression Ċ import Ġorg . jetbrains . kotlin . resolve . Binding Context Ċ import Ġorg . jetbrains . kotlin . resolve . Binding Trace Ċ import Ġorg . jetbrains . kotlin . resolve . calls . call Util . get Resolved Call Ċ import Ġorg . jetbrains . kotlin . resolve . calls . components . is Var arg Ċ import Ġorg . jetbrains . kotlin . resolve . calls . model . Resolved Call Ċ import Ġorg . jetbrains . kotlin . resolve . constants . Error Value Ċ import Ġorg . jetbrains . kotlin . resolve . constants . Integer Literal Type Constructor Ċ import Ġorg . jetbrains . kotlin . resolve . constants . Integer ValueType Constant Ċ import Ġorg . jetbrains . kotlin . resolve . constants . Typed Compile Time Constant Ċ import Ġorg . jetbrains . kotlin . resolve . descriptor Util . fq Name Safe Ċ import Ġorg . jetbrains . kotlin . types . Kotlin Type Ċ import Ġorg . jetbrains . kotlin . types . Simple Type Ċ import Ġorg . jetbrains . kotlin . types . lower If Flex ible Ċ import Ġorg . jetbrains . kotlin . types . type Util . is Primitive Number Or Nullable Type Ċ import Ġorg . jetbrains . kotlin . types . type Util . make NotNull able Ċ Ċ object ĠNew Scheme Of Integer Operator Resolution Checker Ġ: ĠCall Checker Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcheck ( resolved Call : ĠResolved Call <* >, Ġreport On : ĠPsi Element , Ġcontext : ĠCall Checker Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! context . language Version Settings . need Report ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġfor Ġ(( value Parameter , Ġarguments ) Ġin Ġresolved Call . value Arguments ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Type Ġ= Ġif Ġ( value Parameter . is Var arg ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Parameter . var arg ElementType Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Parameter . type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. unwrap (). lower If Flex ible () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! expected Type . is Primitive Number Or Nullable Type ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( argument Ġin Ġarguments . arguments ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpression Ġ= ĠK t Psi Util . de parent hesize ( argument . get Argument Expression ()) Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Argument Impl ( expected Type , Ġexpression , Ġcontext . trace , Ġcontext . module Descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠLanguage Version Settings . need Report (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsupports Feature ( Language Feature . Report Changing Integer Operator Resolve ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! supports Feature ( Language Feature . Approx imate Integer Literal Types In Receiver Position ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġcheck Argument ( ĊĠĠĠĠĠĠĠ Ġexpected Type : ĠKotlin Type , ĊĠĠĠĠĠĠĠ Ġargument : ĠK t Expression , ĊĠĠĠĠĠĠĠ Ġlanguage Version Settings : ĠLanguage Version Settings , ĊĠĠĠĠĠĠĠ Ġtrace : ĠBinding Trace , ĊĠĠĠĠĠĠĠ Ġmodule Descriptor : ĠModule Descriptor ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! language Version Settings . need Report ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġexpected Type . lower If Flex ible () ĊĠĠĠĠĠĠĠ Ġif Ġ( type . is Primitive Number Or Nullable Type ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Argument Impl ( type , ĠK t Psi Util . de parent hesize ( argument ) !! , Ġtrace , Ġmodule Descriptor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Argument Impl ( ĊĠĠĠĠĠĠĠ Ġexpected Type : ĠSimple Type , ĊĠĠĠĠĠĠĠ Ġargument Expression : ĠK t Expression , ĊĠĠĠĠĠĠĠ Ġtrace : ĠBinding Trace , ĊĠĠĠĠĠĠĠ Ġmodule Descriptor : ĠModule Descriptor ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbinding Context Ġ= Ġtrace . binding Context ĊĠĠĠĠĠĠĠ Ġval Ġcall For Argument Ġ= Ġargument Expression . get Resolved Call ( binding Context ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ(! call For Argument . is Int Operator ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġcall Element Ġ= Ġcall For Argument . call . call Element Ġas ? ĠK t Expression Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġde parent hesized Element Ġ= ĠK t Psi Util . de parent hesize ( call Element ) !! ĊĠĠĠĠĠĠĠ Ġif Ġ( de parent hesized Element Ġis ĠK t Constant Expression ) Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( de parent hesized Element Ġis ĠK t Unary Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġde parent hesized Element . operation Token ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( token Ġ== ĠK t Tokens . PLUS Ġ|| Ġtoken Ġ== ĠK t Tokens . MINUS ) Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcompile Time Value Ġ= Ġbinding Context [ Binding Context . COMPILE _ TIME _ VALUE , Ġargument Expression ] Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġexpression Type Ġ= Ġwhen Ġ( compile Time Value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠInteger ValueType Constant Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Type Constructor Ġ= Ġcompile Time Value . unknown Integer Type . constructor Ġas ? ĠInteger Literal Type Constructor Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Type Constructor . get Approx imated Type () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTyped Compile Time Constant Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype From Call Ġ= Ġcall For Argument . result ing Descriptor . returnType ?. lower If Flex ible () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type From Call Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype From Call ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconstant Value Ġ= Ġcompile Time Value . constant Value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( constant Value Ġis ĠError Value ) Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠValues Ġof Ġall Ġnumeric Ġconstants Ġare Ġheld Ġin ĠLong Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġconstant Value . value Ġas ? ĠLong Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠInteger Literal Type Constructor ( value , Ġmodule Descriptor , Ġcompile Time Value . parameters ). get Approx imated Type () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( expression Type . constructor Ġ!= Ġexpected Type . constructor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrace . report ( Errors . INTEGER _ OPERATOR _ RESOL VE _ W ILL _ CHANGE . on ( argument Expression , Ġexpression Type )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠResolved Call <* >. is Int Operator (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdescriptor Ġ= Ġresulting Descriptor Ġas ? ĠSimple Function Descriptor Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġdescriptor . fq Name Safe Ġin Ġliteral Operators Fq Names ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġliteral Operators Fq Names : ĠSet < Fq Name > Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠ Ġ" plus ", Ġ" minus ", Ġ" times ", Ġ" div ", Ġ" rem ", Ġ" plus ", Ġ" minus ", ĊĠĠĠĠĠĠĠ Ġ" times ", Ġ" div ", Ġ" rem ", Ġ" sh l ", Ġ" shr ", Ġ" ush r ", Ġ" and ", Ġ" or ", ĊĠĠĠĠĠĠĠ Ġ" xor ", Ġ" unary Plus ", Ġ" unary Minus ", Ġ" inv ", ĊĠĠĠ Ġ). map To ( mutable Set Of ()) Ġ{ ĠF q Name . from Segments ( listOf (" kotlin ", Ġ" Int ", Ġit )) Ġ} Ċ Ċ } ĊĊ