bgddlmZddlmZddlmZddlmZmZddl m Z erddl m Z ddhZ d dhZGd d ejZddZdS)) annotations) TYPE_CHECKING)nodes)checkers interfaces)utils)PyLinterappendremoveaddceZdZdZdZddddZdZejdd d d#dZ d$dZ d%dZ e d&dZ e d'dZe d&dZd(dZd(dZd(dZd)d!Zd"S)*ModifiedIterationCheckerzChecks for modified iterators in for loops iterations. Currently supports `for` loops for Sets, Dictionaries and Lists. modified_iteration)zkIterated list '%s' is being modified inside for loop body, consider iterating through a copy of it instead.modified-iterating-listzEmitted when items are added or removed to a list being iterated through. Doing so can result in unexpected behaviour, that is why it is preferred to use a copy of the list.)z`Iterated dict '%s' is being modified inside for loop body, iterate through a copy of it instead.modified-iterating-dictziEmitted when items are added or removed to a dict being iterated through. Doing so raises a RuntimeError.)z_Iterated set '%s' is being modified inside for loop body, iterate through a copy of it instead.modified-iterating-setzhEmitted when items are added or removed to a set being iterated through. Doing so raises a RuntimeError.)W4701E4702E4703rrrnode nodes.ForreturnNonecT|j}|jD]}|||dSN)iterbody._modified_iterating_check_on_node_and_children)selfriter_obj body_nodes {/builddir/build/BUILD/cloudlinux-venv-1.0.7/venv/lib/python3.11/site-packages/pylint/checkers/modified_iterating_checker.py visit_forz"ModifiedIterationChecker.visit_for6sC9 U UI  ? ? 8 T T T T U Ur" nodes.NodeNGr!c||||D]}|||dS)zFSee if node or any of its children raises modified iterating messages.N)_modified_iterating_check get_childrenr)r r"r!childs r#rzGModifiedIterationChecker._modified_iterating_check_on_node_and_children>s\ &&y(;;;++-- Q QE  ? ?x P P P P Q Qr%cd}t|tjrtfd|jDrkt j}t|tjrd}nt|tjrd}nt|tj rd}nqttj tj fsnJ |rd}n1 |rd}n|rd}|rOttj rj}nj}|||ft$jdSdS)Nc3DK|]}|VdSr)_deleted_iteration_target_cond).0tr!r s r# zEModifiedIterationChecker._modified_iterating_check..JsD2 2 ABD / /8 < <2 2 2 2 2 2 r%rrr)rargs confidence) isinstancerDeleteanytargetsr safe_inferListDictSetName Attribute_modified_iterating_list_cond_modified_iterating_dict_cond_modified_iterating_set_condattrnamename add_messager INFERENCE)r rr!msg_idinferredobj_names` ` r#r(z2ModifiedIterationChecker._modified_iterating_checkFs dEL ) ) .c2 2 2 2 2 FJl2 2 2 / /  .'11H(EJ// 22Hej11 22Hei00 21Huz5?&CDD .   / /h ? ? ..FF  / /h ? ? ..FF  . .tX > > .-F  (EO44 )#,#=   [%/        r%boolct|tjokt|jtjoLt|jjtjo(t|jjjtjSr) r3rExprvalueCallfuncr<exprr;rs r#'_is_node_expr_that_calls_attribute_namez@ModifiedIterationChecker._is_node_expr_that_calls_attribute_namehsc tUZ ( ( =4:uz22 =4:?EO<< =4:?/<<  r% nodes.Exprnodes.Name | nodes.Attribute infer_valnodes.List | nodes.Setct|tjr|jn|j}|t j|ko|jjj j|kSr) r3rr<r@rArr7rJrLrM)rr!rR iter_obj_names r#_common_cond_list_setz.ModifiedIterationChecker._common_cond_list_setqs[(EO44 H    U-h777 JO % 6 r%ct|tjoNt|jdtjo)t|jdjtjS)Nr)r3rAssignr6 SubscriptrJr;rNs r#_is_node_assigns_subscript_namez8ModifiedIterationChecker._is_node_assigns_subscript_namesN$ -- t|A 8 8 @DLO15:>> r%c ||sdStj|jjj}t |tjsdS| |||o|jjj tvSNF) rOrr7rJrLrMr3rr8rVr@_LIST_MODIFIER_METHODSr rr!rRs r#r=z6ModifiedIterationChecker._modified_iterating_list_conds;;DAA 5$TZ_%9:: )UZ00 5  & &tXy A A C (,BB r%c||sdSt|tjr|j|jdjjkrzt|jjtj rVt|jdj tjr,|jjj|jdj jkrdStj |jdj}t|tj sdS|tj |krdSt|tjr|j}n|j}|jdjj|kS)NFr)rZr3rr;rAr6rJparenttarget AssignNameslicerr7r9r<r@)r rr!rRrUs r#r>z6ModifiedIterationChecker._modified_iterating_dict_conds433D99 5 x , ,  a!6!;;;8?153CDD<4<?0%*==<&+t|A/D/III5$T\!_%:;; )UZ00 5 (22 2 25 h 0 0 *$-MM$MM|A$)]::r%c ||sdStj|jjj}t |tjsdS| |||o|jjj tvSr\) rOrr7rJrLrMr3rr:rVr@_SET_MODIFIER_METHODSr^s r#r?z5ModifiedIterationChecker._modified_iterating_set_conds;;DAA 5$TZ_%9:: )UY// 5  & &tXy A A B (,AA r% nodes.DelNamecPttjsdSt|jtjsdSt|jjtjtjfsdStfdtj |jjDS)NFc3.K|]}|jkVdSr)rA)r.r/rs r#r0zJModifiedIterationChecker._deleted_iteration_target_cond..s=   N      r%) r3rDelNamer`Forrarb BaseContainerr5rfind_assigned_names_recursive)r rr!s ` r#r-z7ModifiedIterationChecker._deleted_iteration_target_conds$ .. 5(/5955 5 O "U%5u7J$K   5    89OPP      r%N)rrrr)r"r&r!r&rr)rr&r!r&rr)rr&rrG)rrPr!rQrRrSrrG)rr&r!rQrrG)rrfr!r&rrG)__name__ __module__ __qualname____doc__rAmsgsoptionsronly_required_for_messagesr$rr( staticmethodrOrVrZr=r>r?r-rr%r#rrsa D     D,G%U%!#<>VUUUU QQQQ    D   \     \     \     ;;;;2           r%rlinterr rrcJ|t|dSr)register_checkerr)rus r#registerrxs% 4V<<=====r%N)rur rr) __future__rtypingrastroidrpylintrrpylint.checkersr pylint.lintr r]re BaseCheckerrrxrr%r#rs #""""" ''''''''!!!!!!%$$$$$$#H-)r r r r r x3r r r j>>>>>>r%