ML iUdZddlmZddlmZmZddlmZmZm Z m Z m Z m Z m Z mZmZeeeeeefZeeeeefZded<d dZ ddZdd Zdd Zdd Zy )zTConstant folding of expressions. For example, 3 + 5 can be constant folded into 8. ) annotations)FinalUnion) ComplexExpr Expression FloatExprIntExprNameExprOpExprStrExpr UnaryExprVarr CONST_TYPEScBt|tr |jSt|tr |jSt|tr |jSt|t r |jSt|t r|jdk(ry|jdk(ry|j}t|trL|jr@|jjddd|k(r|j}t|tr|Syt|trHt!|j"|}t!|j$|}||t'|j(||Syt|t*r.t!|j,|}|t/|j(|Sy) aReturn the constant value of an expression for supported operations. Among other things, support int arithmetic and string concatenation. For example, the expression 3 + 5 has the constant value 8. Also bind simple references to final constants defined in the current module (cur_mod_id). Binding to references is best effort -- we don't bind references to other modules. Mypyc trusts these to be correct in compiled modules, so that it can replace a constant expression (or a reference to one) with the statically computed value. We don't want to infer constant values based on stubs, in particular, as these might not match the implementation (due to version skew, for example). Return None if unsuccessful. TrueTFalseF.rN) isinstancer valuer rrr namenoderis_finalfullnamersplit final_valuerr constant_fold_exprleftrightconstant_fold_binary_opopr exprconstant_fold_unary_op)r" cur_mod_idrrrrs X/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/mypy/constant_fold.pyrrsX$$ zz$ zz$ "zz$ $zz D( # 99  YY' !yy tS !  $$S!,Q/:=$$E%+/   D& !!$))Z8"4::z:   1*477D%@ @  D) $"499j9  )$''59 9 ct|trt|tr t|||St|trt|tr t |||St|trt|tr t |||St|trt|tr t |||S|dk(r%t|t rt|t r||zS|dk(r%t|t rt|tr||zS|dk(r%t|trt|t r||zS|dk(r+t|ttfrt|t r||zS|dk(r+t|t rt|ttfr||zS|dk(r+t|ttfrt|t r||z S|dk(r+t|t rt|ttfr||z Sy)N+*-)rintconstant_fold_binary_int_opfloatconstant_fold_binary_float_opstrcomplex)r!rrs r%r r Os$E3!7*2tU;;$:eU#;,Ru== D% Zs%;,Ru== D# :eU#;,Ru== SyZc*z%/Ee| sz$,E31Ge| sz$,E31Ge| SyZsEl3 5'8Re| sz$0ZU|5Te| sz$e 5*UG:Te| sz$0ZU|5Te| r&cb|dk(r||zS|dk(r||z S|dk(r||zS|dk(r |dk7r||z Sy|dk(r |dk7r||zSy|dk(r |dk7r||zSy|dk(r||zS|d k(r||zS|d k(r||z S|d k(r |dk\r||zSy|d k(r |dk\r||z Sy|d k(r|dk\r||z}t|tsJ|Sy)Nr(r*r)/r//%&|^z<>**)rr+r!rrrets r%r,r,rs2 Sye| Sye| se| s A:%< 0 / t A:5= * ) s A:%< $ # se| se| se| t A:5=   t A:5=  t A:+Cc3' ''J r&ct|trt|tr J|||f|dk(r||zS|dk(r||z S|dk(r||zS|dk(r |dk7r||z Sy|dk(r |dk7r||zSy|dk(r |dk7r||zSy|dk(r9|dkrt|ts|dkDr ||z}t|tsJ||Sy#t$rYywxYw) Nr(r*r)r2rr3r4r8)rr+r- OverflowErrorr9s r%r.r.s4%*UC*@TBeCTT A Sye| se| se| s A:%< " ! t A:5=   s A:%<   t 1HE3/D1H Ek"#u-2s2-  !  sB88 CCc|dk(rt|ttfr| S|dk(rt|tr|S|dk(rt|ttfr|Sy)Nr*~r()rr+r-)r!rs r%r#r#sP SyZU|4v sz%-v sz%#u6 r&N)r"rr$r/returnConstantValue | None)r!r/r ConstantValuerrAr?r@)r!r/rr+rr+r?int | float | None)r!r/r int | floatrrCr?z float | None)r!r/rrAr?rB)__doc__ __future__rtypingrr mypy.nodesrrrr r r r r rr+boolr-r0r/rAr__annotations__rr r,r.r#r&r%rKs #   c445 45 U51h     )6  F!H<r&