ML i dddlmZddlmZddlmZmZddlmZddl m Z m Z m Z m Z mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,ddl-m.Z.ddl/m0Z0m1Z1ddl2m3Z3m4Z4dd l5m6Z6dd l7m8Z8m9Z9m:Z:Gd d Z;Gd dZ<GddeZ=GddZ>GddZ?GddZ@Gdde6ZAy)) annotations)Enum)checker errorcodes)MessageBuilder)# AssertStmtAssignmentExprAssignmentStmt BreakStmtClassDefContext ContinueStmtDictionaryComprehension ExpressionExpressionStmtForStmtFuncDefFuncItem GeneratorExpr GlobalDeclIfStmtImport ImportFrom LambdaExprListExprLvalue MatchStmtMypyFileNameExpr NonlocalDecl RaiseStmt ReturnStmtStarExpr SymbolTableTryStmt TupleExpr TypeAliasStmt WhileStmtWithStmtimplicit_module_attrs)Options) AsPatternStarredPattern) ALWAYS_TRUEinfer_pattern_value)ExtendedTraverserVisitor)TypeUninhabitedTypeget_proper_typec6eZdZdZ d ddZddZy) BranchStatea=BranchState contains information about variable definition at the end of a branching statement. `if` and `match` are examples of branching statements. `may_be_defined` contains variables that were defined in only some branches. `must_be_defined` contains variables that were defined in all branches. Nc| t}| t}t||_t||_||_yN)setmay_be_definedmust_be_definedskipped)selfr:r9r;s \/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/mypy/partially_defined.py__init__zBranchState.__init__;s?  ! UN  "!eO!.1"?3 c~tt|jt|j|jS)Nr:r9r;)r5r8r:r9r;r<s r=copyzBranchState.copyJs2 4 45t223LL  r?)NNF)r:set[str] | Noner9rDr;boolreturnNonerFr5)__name__ __module__ __qualname____doc__r>rCr?r=r5r53sB,0*. ( (     r?r5cfeZdZd ddZddZddZddZddZddZddZ dd Z dd Z dd Z dd Z y)BranchStatementNc| t}||_t|jj|jjg|_yN)r:r9)r5 initial_stater:r9branches)r<rRs r=r>zBranchStatement.__init__SsF  'MM*  $ 2 2 B B#11@@ ,  r?ct|j}|jDcgc]}|jc}|_|Scc}wr7)rOrRrSrC)r<resultbs r=rCzBranchStatement.copy^s8 !3!34-1]];1668; rCrYrbrdrjrlrnrqrsrzrMr?r=rOrORs;    7 7 X)8X  r?rOceZdZdZdZdZdZy) ScopeTyperuN)rIrJrKGlobalClassFunc GeneratorrMr?r=rrs F E DIr?rc,eZdZddZddZddZd dZy) Scopec.||_||_i|_yr7) branch_stmts scope_typeundefined_refs)r<stmtsrs r=r>zScope.__init__s38$8:r?ct|jDcgc]}|jc}|j}|jj|_|Scc}wr7)rrrCrr)r<srUs r=rCz Scope.copysJ$*;*;rCrrrMr?r=rrs;  + 4r?rceZdZdZddZddZddZddZddZddZ ddZ dd Z dd Z dd Z dd Zdd ZddZddZddZddZddZy)DefinedVariableTrackerzUDefinedVariableTracker manages the state and scope for the UndefinedVariablesVisitor.cdttgtjg|_d|_yNF)rrOrrscopesdisable_branch_skiprBs r=r>zDefinedVariableTracker.__init__s)$)?+<*=y?O?O$P#Q $) r?ct}|jDcgc]}|jc}|_|j|_|Scc}wr7)rrrCr)r<rUrs r=rCzDefinedVariableTracker.copys>')+/;;7a7 %)%=%=" 8sA cTt|jdkDsJ|jdSr[)r]rrBs r=_scopezDefinedVariableTracker._scopes'4;;!###{{2r?c0t|jjdkDsJd}|tjk(r*|jjdj d}|j jtt|g|yr[) r]rrrrrSrrXrrO)r<rrRs r= enter_scopez"DefinedVariableTracker.enter_scopesv4;;=--.222 ,, , KKM66r:CCBGM 5/-"@!A:NOr?c8|jjyr7)rrrBs r= exit_scopez!DefinedVariableTracker.exit_scopes r?c<|jj|k(Sr7)rr)r<rs r=in_scopezDefinedVariableTracker.in_scopes{{}'':55r?ct|jjdkDsJ|jjjt |jjdj dyr[)r]rrrXrOrSrBs r=start_branch_statementz-DefinedVariableTracker.start_branch_statements_4;;=--.222 "")) DKKM66r:CCBG H r?ct|jjdkDsJ|jjdjyNrur\)r]rrrYrBs r=rYz"DefinedVariableTracker.next_branchs>4;;=--.222 ""2&224r?ct|jjdkDsJ|jjjj }|jjdj |yr)r]rrrrzrj)r<rUs r=end_branch_statementz+DefinedVariableTracker.end_branch_statementsc4;;=--.222++//1668 ""2&;;FCr?ct|jjdkDr9|js,|jjdj yyyr)r]rrrrlrBs r=rlz"DefinedVariableTracker.skip_branchsI t{{})) *Q .t7O7O KKM & &r * 6 6 88P .r?ct|jdkDsJt|jdjdkDsJ|jjdj |yr[)r]rrrrbr`s r=rbz(DefinedVariableTracker.record_definitionsY4;;!###4;;r?//01444 ""2&88>r?ct|jdkDsJt|jdjdkDsJ|jjdj |yr[)r]rrrrdr`s r=rdz!DefinedVariableTracker.delete_varsY4;;!###4;;r?//01444 ""2&11$7r?cvt|jdkDsJ|jj|y)zURecords an undefined reference. These can later be retrieved via `pop_undefined_ref`.rN)r]rrrrs r=rz+DefinedVariableTracker.record_undefined_refs-4;;!### **1-r?ctt|jdkDsJ|jj|S)zaIf name has previously been reported as undefined, the NameExpr that was called will be returned.r)r]rrrr`s r=rz(DefinedVariableTracker.pop_undefined_ref s04;;!###{{}..t44r?ct|jjdkDsJ|jjdj|Sr[)r]rrrnr`s r=rnz,DefinedVariableTracker.is_possibly_undefinedsC4;;=--.222{{}))"-CCDIIr?ct|jjdkDsJ|jjd}|j|sy|jjD]}|j |syy)zYThis will return true if a variable is defined in a branch that's not the current branch.rr\FT)r]rrrqrs)r<rastmts r=is_defined_in_different_branchz5DefinedVariableTracker.is_defined_in_different_branchsy4;;=--.222{{}))"-  &KKM.. D**40 r?ct|jjdkDsJ|jjdj|Sr[)r]rrrqr`s r=rqz#DefinedVariableTracker.is_undefined"sC4;;=--.222{{}))"-::4@@r?Nr{)rFrr)rrrFrG)rrrFrEr|rrr~)rIrJrKrLr>rCrrrrrrYrrlrbrdrrrnrrqrMr?r=rrs^_) P6 5D 9 ? 8 . 5 J Ar?rceZdZddZy)Loopcd|_yr) has_breakrBs r=r>z Loop.__init__(s r?Nr{)rIrJrKr>rMr?r=rr'sr?rceZdZdZ d$dZd%dZd%dZd&dZd'fd Zd(fd Z d)dZ d*fd Z d+d Z d,d Z d-d Zd.fd Zd/fd Zd0fd Zd1fd Zd2dZd3fd Zd4fd Zd5fd Zd6fd Zd7fd Zd8fd Zd9fd Zd:dZd:dZd;dZd<fd Zd=fd Zd>fd Z d?dZ!d@fd Z"dAfd! Z#dBfd" Z$dCd#Z%xZ&S)D PossiblyUndefinedVariableVisitoraDetects the following cases: - A variable that's defined only part of the time. - If a variable is used before definition An example of a partial definition: if foo(): x = 1 print(x) # Error: "x" may be undefined. Example of a used before definition: x = y y: int = 2 Note that this code does not detect variables not defined in any of the branches -- that is handled by the semantic analyzer. ch||_||_||_t|_|j dd}|r7t |jtsJ|jj|_g|_ d|_ t|_ tD]}|jj|y)N __builtins__r)msgtype_mapoptionsr$builtinsget isinstancenodernamesloops try_depthrtrackerr*rb)r<rrrr builtins_modras r=r>z)PossiblyUndefinedVariableVisitor.__init__>s   #  yy6 l//: ::(--33DM!# -/ ) 1D LL * *4 0 1r?c|jjjtjr|jj ||yyr7)rerrorsis_error_code_enabledrUSED_BEFORE_DEFvar_used_before_defr<racontexts r=rz4PossiblyUndefinedVariableVisitor.var_used_before_defSs8 88?? 0 01K1K L HH ( (w 7 Mr?c|jjjtjr|jj ||yyr7)rrrrPOSSIBLY_UNDEFINEDvariable_may_be_undefinedrs r=rz:PossiblyUndefinedVariableVisitor.variable_may_be_undefinedWs8 88?? 0 01N1N O HH . .tW = Pr?c6|jjtjsT|jj |}|D]3}|j r|j ||"|j||5n |jj|yr7) rrrrrrrrrb)r<rarefsrefs r=process_definitionz3PossiblyUndefinedVariableVisitor.process_definition[sy||$$Y__5<<11$7D 8::224=,,T37  8  &&t,r?ch|jD]}|j|t| |yr7)rrsupervisit_global_declr<rra __class__s r=rz2PossiblyUndefinedVariableVisitor.visit_global_declis1GG *D  # #D ) * !!$r?ch|jD]}|j|t| |yr7)rrrvisit_nonlocal_declrs r=rz4PossiblyUndefinedVariableVisitor.visit_nonlocal_declns1GG *D  # #D ) * #A&r?c&t|tr|j|jyt|tr|j |j yt|ttfr#|jD]}|j |yyr7) rrrrar#process_lvalueexprrr&items)r<lvalueitems r=rz/PossiblyUndefinedVariableVisitor.process_lvaluesso fh '  # #FKK 0  )    , 9 5 6  *##D) *7r?ch|jD]}|j|t| |yr7)lvaluesrrvisit_assignment_stmt)r<rrrs r=rz6PossiblyUndefinedVariableVisitor.visit_assignment_stmt|s1ii (F    ' ( %a(r?cp|jj||j|jyr7)valueacceptrtargetrs r=visit_assignment_exprz6PossiblyUndefinedVariableVisitor.visit_assignment_exprs$ t AHH%r?c|jD]}|j||jj|jD]:}|j r|j||jj <|jrL|jj s|jj|n|jj|jjyr7) rrrrbodyis_unreachablerY else_bodyrlr)r<rerVs r= visit_if_stmtz.PossiblyUndefinedVariableVisitor.visit_if_stmts A HHTN  ++- 'A HHTN LL $ $ &  ' ;;;;-- ""4( ((* ))+r?cn|jj||jjt t |j D]}|j |}|j||j|}||j||j|js|j|j|n|jjt|tk(}|r|jj|jjyr7)subjectrrrranger]patternsguardsbodiesrrlr/r.rYr)r<ripatternguard is_catchalls r=visit_match_stmtz1PossiblyUndefinedVariableVisitor.visit_match_stmts  ++-s1::' +AjjmG NN4 HHQKE  T"88A;-- ""4( ((*-g6+EK ((* + ))+r?cZ|j|jt| |yr7)rrarvisit_func_defr<rrs r=rz/PossiblyUndefinedVariableVisitor.visit_func_defs" ' q!r?c|jr|jjsy|jxsg}|D]*}|j|jj |,|j jtj|D]@}|j|jjt|9|jB|jj ||j j!yr7) is_dynamicrcheck_untyped_defs arguments initializerrrrrrrvariablerar visit_varrr)r<rargsargrs r= visit_funcz+PossiblyUndefinedVariableVisitor.visit_funcs <<>$,,"A"A {{ b -C*&&t, -   0 ,C  # #CLL$5$5 6 G cll + ,  d !r?c|jjtj|jD]}|j |t |||jjyr7) rrrrindicesrrvisit_generator_exprrr<ridxrs r=rz5PossiblyUndefinedVariableVisitor.visit_generator_exprsY   !4!4599 %C    $ % $Q' !r?c|jjtj|jD]}|j |t |||jjyr7) rrrrrrrvisit_dictionary_comprehensionrrs r=rz?PossiblyUndefinedVariableVisitor.visit_dictionary_comprehensionsY   !4!4599 %C    $ % .q1 !r?c|jj||j|j|jj||jj t }|jj||jj||jj|jj|jy|j}|r4|jj |jj|jj||r|jj|jjyr7)rrrindexrrrrrXrrYrrrrr<rlooprs r=visit_for_stmtz/PossiblyUndefinedVariableVisitor.visit_for_stmts  d AGG$ t ++-v $  d   " ))+ ;; "I 335 ((* KK  t $ 113 r?cXt|||jjyr7)rvisit_return_stmtrrlrs r=rz2PossiblyUndefinedVariableVisitor.visit_return_stmts  !!$   "r?c|jjtjt|||jj yr7)rrrrrvisit_lambda_exprrrs r=rz2PossiblyUndefinedVariableVisitor.visit_lambda_exprs6   0 !!$ !r?ct||tj|jr|j j yyr7)rvisit_assert_stmtris_false_literalrrrlrs r=r z2PossiblyUndefinedVariableVisitor.visit_assert_stmts7 !!$  # #AFF + LL $ $ & ,r?cXt|||jjyr7)rvisit_raise_stmtrrlrs r=r#z1PossiblyUndefinedVariableVisitor.visit_raise_stmts   #   "r?cXt|||jjyr7)rvisit_continue_stmtrrlrs r=r%z4PossiblyUndefinedVariableVisitor.visit_continue_stmts  #A&   "r?ct|||jrd|jd_|jj y)NTr\)rvisit_break_stmtrrrrlrs r=r'z1PossiblyUndefinedVariableVisitor.visit_break_stmts7  # ::'+DJJrN $   "r?c|jj|j}|tt |t r|j jt|%|yr7) rrrrr3r2rrlrvisit_expression_stmt)r<rtyprs r=r)z6PossiblyUndefinedVariableVisitor.visit_expression_stmtsKmm' ;*_S%9?K LL $ $ & %a(r?c|xjdz c_|jC|jj}d|j_|j |||_|j ||xjdzc_y)a Note that finding undefined vars in `finally` requires different handling from the rest of the code. In particular, we want to disallow skipping branches due to jump statements in except/else clauses for finally but not for other cases. Imagine a case like: def f() -> int: try: x = 1 except: # This jump statement needs to be handled differently depending on whether or # not we're trying to process `finally` or not. return 0 finally: # `x` may be undefined here. pass # `x` is always defined here. return x ruNT)r finally_bodyrrCrprocess_try_stmt)r<r old_trackers r=visit_try_stmtz/PossiblyUndefinedVariableVisitor.visit_try_stmtsm$ ! >> % ,,++-K/3DLL ,  ! !! $&DL a  !r?c|jj|jj||j|jj|t |j dkDr+t |j t |jcxk(rt |jk(sJJtt |j D]}|jj|j|}||j||j|}|,|j|j|j||j |j|||jj|j|jj|j|jj|yy)a Processes try statement decomposing it into the following: if ...: body else_body elif ...: except 1 elif ...: except 2 else: except n finally Nr)rrrrrr]handlersvarstypesrrYrrardrr,)r<rrexc_typevars r=r-z1PossiblyUndefinedVariableVisitor.process_try_stmt#s` ++-  d ;; " KK  t $ qzz?Q qzz?c!&&kAS\A AA AA3qzz?+ 6 ((*771:'OOD)ffQi?++CHH5JJt$ 1 $$T*?LL++CHH5 6 ))+ >> % NN ! !$ ' &r?c|jj||jjt }|j j ||jj||j}tj|js|jj|jj|jy|r4|jj|jj|jr|jj||r|jj|j jyr7)rrrrrrrXrrris_true_literalrYrrrrs r=visit_while_stmtz1PossiblyUndefinedVariableVisitor.visit_while_stmtHs  d ++-v $  dNN &&qvv. LL $ $ & ))+ ;; " 335 ((*{{ ""4( 113 r?cr|j|j|jt| |yr7)rarrvisit_as_patternrs r=r:z1PossiblyUndefinedVariableVisitor.visit_as_patternbs, 66     '  #r?cr|j|j|jt| |yr7)capturerrvisit_starred_patternrs r=r=z6PossiblyUndefinedVariableVisitor.visit_starred_patterngs, 99    * %a(r?c|j|jvr*|jjtj ry|jj |jrB|j|j||jj|jn|jj|jrU|js|jdkDr|j|j|n]|j|j|n@|jj|jr|jj|t|A|y)Nr)rarrrrrrnrrbrrrrrqrrvisit_name_exprrs r=r?z0PossiblyUndefinedVariableVisitor.visit_name_exprls 66T]] "t||'<'rrrrrrrrrrrrrrrrrr r#r%r'r)r/r-r8r:r=r?rBrDrIrMrO __classcell__)rs@r=rr,s"1 1)1 1  1  1*8> -% ' *) &, ,$""""".#" ' ### ) @#(J4$ ) #4 "  %4r?rN)B __future__renumrmypyrr mypy.messagesr mypy.nodesrr r r r r rrrrrrrrrrrrrrrrrrr r!r"r#r$r%r&r'r(r)r* mypy.optionsr+ mypy.patternsr,r-mypy.reachabilityr.r/mypy.traverserr0 mypy.typesr1r2r3r5rOrrrrrrMr?r=r[s"$($$$$$$$$$$J!3>3==  >X X v44(\A\A~ }4'?}4r?