§
    ŒŸjg  ã                   ó>  — d Z ddlmZ ddlmZ ddlmZ ddlmZmZm	Z	m
Z
 ddlmZ ddlmZ ddlmZ  e¦   «         Zd	„ Z ee¬
¦  «        ej        d„ ¦   «         ¦   «         Zd„ Z G d„ de	¦  «        Z G d„ de
¦  «        Z G d„ de¦  «        Z G d„ de¦  «        ZdS )aü  
A module to deal with stuff like `list.append` and `set.add`.

Array modifications
*******************

If the content of an array (``set``/``list``) is requested somewhere, the
current module will be checked for appearances of ``arr.append``,
``arr.insert``, etc.  If the ``arr`` name points to an actual array, the
content will be added

This can be really cpu intensive, as you can imagine. Because |jedi| has to
follow **every** ``append`` and check whether it's the right array. However this
works pretty good, because in *slow* cases, the recursion detector and other
settings will stop this process.

It is important to note that:

1. Array modifications work only in the current module.
2. Jedi only checks Array additions; ``list.pop``, etc are ignored.
é    )Údebug)Úsettings)Ú	recursion)ÚValueSetÚ	NO_VALUESÚHelperValueMixinÚValueWrapper)ÚLazyKnownValues)Úinfer_call_of_leaf)Úinference_state_method_cachec                 óB   — |j         dvrt          S t          | |¦  «        S )zI Just a mapper function for the internal _internal_check_array_additions )ÚlistÚset)Ú
array_typer   Ú_internal_check_array_additions)ÚcontextÚsequences     úp/var/www/finuniver-perm.ru/html/student/venv/lib/python3.11/site-packages/jedi/inference/value/dynamic_arrays.pyÚcheck_array_additionsr   "   s&   € àÔ /Ð1Ð1åÐå*¨7°HÑ=Ô=Ð=ó    )Údefaultc           	      óh  ‡— ddl mŠ t          j        d|z  d¬¦  «         |                      ¦   «         }t
          j        r|                     ¦   «         rt          j        dd¬¦  «         t          S ˆfd„}t
          j	        dc}t
          _	        |j
        j        d	k    }|rg d
¢nddg}t          ¦   «         }|D �]S}	 |j                             ¦   «         |         }	|	D �]}
| j        }|j        |
j        cxk     r|j        k     sn Œ)|
j        }|j        }|j                             |¦  «        }	 |j        |dz            }|j        dk    s"|j        d         dk    s|j        d         dk    rŒ�n# t*          $ r Y Œ�w xY w|                      |
¦  «        }t/          j        | j        |¦  «        5 }|r1t5          ||
d¬¦  «        }||v r| |||j        d         |¦  «        z  }ddd¦  «         n# 1 swxY w Y   �Œ�ŒD# t6          $ r Y �ŒQw xY w|t
          _	        t          j        d|d¬¦  «         |S )zr
    Checks if a `Array` has "add" (append, insert, extend) statements:

    >>> a = [""]
    >>> a.append(1)
    r   ©Ú	argumentszDynamic array search for %sÚMAGENTA)ÚcolorzDynamic array search aborted.c                 ó~  •— t          ‰                     | j        | |¦  «                             ¦   «         ¦  «        }t	          ¦   «         }|dv r
|dd …         }|dv r|D ]\  }}|                     |¦  «         ŒnB|dv r>|D ];\  }}|t	          |                     ¦   «                              ¦   «         ¦  «        z  }Œ<|S )N)Úinserté   )ÚappendÚaddr   )ÚextendÚupdate)r   ÚTreeArgumentsÚinference_stateÚunpackr   r!   ÚinferÚiterate)r   ÚarglistÚadd_nameÚparamsÚresultÚkeyÚ
lazy_valuer   s          €r   Úfind_additionsz7_internal_check_array_additions.<locals>.find_additions<   sÜ   ø€ Ý�i×-Ò-¨gÔ.EÀwÐPWÑXÔX×_Ò_ÑaÔaÑbÔbˆÝ‘”ˆØ�zÐ!Ð!Ø˜A˜B˜B”ZˆFØÐ2Ð2Ð2Ø#)ð 'ð '‘��ZØ—
’
˜:Ñ&Ô&Ð&Ð&ð'àÐ-Ð-Ð-Ø#)ð <ð <‘��ZØ�#˜j×.Ò.Ñ0Ô0×8Ò8Ñ:Ô:Ñ;Ô;Ñ;��Øˆr   Fr   )r    r"   r   r!   r#   r   Útrailerú(ú)T)Úcut_own_trailerNzDynamic array result %s)Újedi.inferencer   r   ÚdbgÚget_root_contextr   Údynamic_array_additionsÚis_compiledr   Ú dynamic_params_for_other_modulesÚnameÚstring_namer   Ú	tree_nodeÚget_used_namesÚ	start_posÚend_posÚparentÚchildrenÚindexÚtypeÚ
IndexErrorÚcreate_contextr   Úexecution_allowedr%   r   ÚKeyError)r   r   Úmodule_contextr/   Útemp_param_addÚis_listÚsearch_namesÚadded_typesr*   Úpossible_namesr:   Ú
value_noder0   ÚpowerÚtrailer_posÚexecution_trailerÚrandom_contextÚallowedÚfoundr   s                      @r   r   r   +   s  ø€ ð )Ð(Ð(Ð(Ð(Ð(å	„IÐ+¨hÑ6¸iÐHÑHÔHÐHØ×-Ò-Ñ/Ô/€NÝÔ+ð ¨~×/IÒ/IÑ/KÔ/Kð ÝŒ	Ð1¸ÐCÑCÔCÐCÝÐðð ð ð ð õ 	Ô1°5ð >€N•HÔ=ð ŒmÔ'¨6Ò1€GØ6=ÐTÐ2Ð2Ð2Ð2ÀEÈ8ÐCT€Lå‘%”%€KØ ð &ñ &ˆð%	Ø+Ô5×DÒDÑFÔFÀxÔPˆNð 'ð  ñ  �Ø$Ô.�
Ø"Ô,¨t¬~ÐRÐRÒRÐRÀ
Ô@RÒRÐRÐRÐRØØœ+�Øœ�Ø#œn×2Ò2°7Ñ;Ô;�ð!Ø(-¬°{ÀQ±Ô(GÐ%ð )Ô-°Ò:Ð:Ø0Ô9¸!Ô<ÀÒCÐCØ0Ô9¸!Ô<ÀÒCÐCØ ð  Døõ "ð ð ð Ø�Hðøøøð ")×!7Ò!7¸Ñ!=Ô!=�åÔ0°Ô1HÈ%ÑPÔPð ÐT[Øð Ý 2Ø*Ø Ø,0ð!ñ !ô !˜ð
 $ uÐ,Ð,à'¨>¨>Ø .Ø 1Ô :¸1Ô =Ø (ñ,ô ,ñ ˜Kðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ùñ' øõ ð 	ð 	ð 	Ø‰Hð	øøøðL 1?…HÔ-Ý	„IÐ'¨¸IÐFÑFÔFÐFØÐs6   Â>G>Ä1E0Å0
E=Å<E=Æ/4G/Ç/G3Ç6G3Ç>
HÈHc                 óv   — t          | |¦  «        }ddlm} |                     t	          |g¦  «        g¦  «        S )z$Used for set() and list() instances.r   r   )Ú_DynamicArrayAdditionsr4   r   ÚValuesArgumentsr   )Úinstancer   Úais      r   Úget_dynamic_array_instancerZ   ~   sB   € å	 ¨)Ñ	4Ô	4€BØ(Ð(Ð(Ð(Ð(Ð(Ø×$Ò$¥h°¨t¡n¤nÐ%5Ñ6Ô6Ð6r   c                   ó.   — e Zd ZdZd„ Zd„ Zdd„Zd	d„ZdS )
rV   aj  
    Used for the usage of set() and list().
    This is definitely a hack, but a good one :-)
    It makes it possible to use set/list conversions.

    This is not a proper context, because it doesn't have to be. It's not used
    in the wild, it's just used within typeshed as an argument to `__init__`
    for set/list and never used in any other place.
    c                 ó"   — || _         || _        d S ©N)Ú	_instanceÚ
_arguments)ÚselfrX   r   s      r   Ú__init__z_DynamicArrayAdditions.__init__�   s   € Ø!ˆŒØ#ˆŒˆˆr   c                 óR   — | j         j        j                             d¦  «        \  }|S )NÚtuple)r^   r%   Úbuiltins_moduleÚpy__getattribute__)r`   Útuple_s     r   Úpy__class__z"_DynamicArrayAdditions.py__class__“   s%   € Ø”.Ô0Ô@×SÒSÐT[Ñ\Ô\‰ˆØˆr   Nc              #   óP  K  — | j         }	 t          |                     ¦   «         ¦  «        \  }}|                     ¦   «                              ¦   «         E d {V —† n# t
          $ r Y nw xY wddlm} t          ||¦  «        r$t          |j
        | j        ¦  «        }|E d {V —† d S d S )Nr   )r$   )r_   Únextr&   r'   r(   ÚStopIterationÚjedi.inference.argumentsr$   Ú
isinstancer   r   r^   )r`   Úcontextualized_noder   Ú_r.   r$   Ú	additionss          r   Ú
py__iter__z!_DynamicArrayAdditions.py__iter__—   sè   è è € Ø”Oˆ	ð	4Ý  ×!1Ò!1Ñ!3Ô!3Ñ4Ô4‰MˆAˆzð "×'Ò'Ñ)Ô)×1Ò1Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3øõ ð 	ð 	ð 	ØˆDð	øøøð
 	;Ð:Ð:Ð:Ð:Ð:Ý�i Ñ/Ô/ð 	!Ý7¸	Ô8IÈ4Ì>ÑZÔZˆIØ Ð Ð Ð Ð Ð Ð Ð Ð Ð ð	!ð 	!s   ‹$A Á
A)Á(A)Fc                 ó,   — |                       |¦  «        S r]   )rp   )r`   rm   Úis_asyncs      r   r(   z_DynamicArrayAdditions.iterate¥   s   € Ø�ŠÐ2Ñ3Ô3Ð3r   r]   )NF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ra   rg   rp   r(   © r   r   rV   rV   …   sd   € € € € € ðð ð$ð $ð $ðð ð ð!ð !ð !ð !ð4ð 4ð 4ð 4ð 4ð 4r   rV   c                   ó*   ‡ — e Zd Zˆ fd„Zd„ Zd„ Zˆ xZS )Ú_Modificationc                 óf   •— t          ¦   «                              |¦  «         || _        || _        d S r]   )Úsuperra   Ú_assigned_valuesÚ_contextualized_key)r`   Úwrapped_valueÚassigned_valuesÚcontextualized_keyÚ	__class__s       €r   ra   z_Modification.__init__ª   s1   ø€ Ý‰Œ×Ò˜Ñ'Ô'Ð'Ø /ˆÔØ#5ˆÔ Ð Ð r   c                 ó6   —  | j         j        |i |¤Ž| j        z  S r]   )Ú_wrapped_valueÚpy__getitem__r|   )r`   ÚargsÚkwargss      r   r„   z_Modification.py__getitem__¯   s%   € Ø0ˆtÔ"Ô0°$ÐA¸&ÐAÐAÀDÔDYÑYÐYr   c                 ó’   — d„ | j                              ¦   «         D ¦   «         }||v r| j        S | j                             |¦  «        S )Nc                 óB   — g | ]}|                      t          ¦  «        ‘ŒS rw   )Úget_safe_valueÚ	_sentinel)Ú.0Úvs     r   ú
<listcomp>z6_Modification.py__simple_getitem__.<locals>.<listcomp>³   s6   € ð 
ð 
ð 
àð ×Ò�YÑ'Ô'ð
ð 
ð 
r   )r}   r'   r|   rƒ   Úpy__simple_getitem__)r`   rB   Úactuals      r   rŽ   z"_Modification.py__simple_getitem__²   sZ   € ð
ð 
àÔ-×3Ò3Ñ5Ô5ð
ñ 
ô 
ˆð �Fˆ?ˆ?ØÔ(Ð(ØÔ"×7Ò7¸Ñ>Ô>Ð>r   )rs   rt   ru   ra   r„   rŽ   Ú__classcell__)r�   s   @r   ry   ry   ©   sY   ø€ € € € € ð6ð 6ð 6ð 6ð 6ð
Zð Zð Zð?ð ?ð ?ð ?ð ?ð ?ð ?r   ry   c                   ó   — e Zd Zdd„Zd„ ZdS )ÚDictModificationNc              #   ó\   K  — | j                              |¦  «        E d {V —† | j        V — d S r]   )rƒ   rp   r}   ©r`   rm   s     r   rp   zDictModification.py__iter__½   sE   è è € ØÔ&×1Ò1Ð2EÑFÔFÐFÐFÐFÐFÐFÐFÐFØÔ&Ð&Ð&Ð&Ð&Ð&r   c                 óh   — | j                              ¦   «         | j                             ¦   «         z  S r]   )rƒ   Úget_key_valuesr}   r'   )r`   s    r   r–   zDictModification.get_key_valuesÁ   s+   € ØÔ"×1Ò1Ñ3Ô3°dÔ6N×6TÒ6TÑ6VÔ6VÑVÐVr   r]   )rs   rt   ru   rp   r–   rw   r   r   r’   r’   ¼   s<   € € € € € ð'ð 'ð 'ð 'ðWð Wð Wð Wð Wr   r’   c                   ó   — e Zd Zdd„ZdS )ÚListModificationNc              #   óv   K  — | j                              |¦  «        E d {V —† t          | j        ¦  «        V — d S r]   )rƒ   rp   r
   r|   r”   s     r   rp   zListModification.py__iter__Æ   sM   è è € ØÔ&×1Ò1Ð2EÑFÔFÐFÐFÐFÐFÐFÐFÐFÝ˜dÔ3Ñ4Ô4Ð4Ð4Ð4Ð4Ð4r   r]   )rs   rt   ru   rp   rw   r   r   r˜   r˜   Å   s(   € € € € € ð5ð 5ð 5ð 5ð 5ð 5r   r˜   N)rv   Újedir   r   r4   r   Újedi.inference.base_valuer   r   r   r	   Újedi.inference.lazy_valuer
   Újedi.inference.helpersr   Újedi.inference.cacher   ÚobjectrŠ   r   Úincrease_indentr   rZ   rV   ry   r’   r˜   rw   r   r   ú<module>r¡      sÚ  ððð ð* Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø $Ð $Ð $Ð $Ð $Ð $ðð ð ð ð ð ð ð ð ð ð ð à 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø =Ð =Ð =Ð =Ð =Ð =àˆF‰HŒH€	ð>ð >ð >ð Ð iÐ0Ñ0Ô0ØÔðNð Nñ Ôñ 1Ô0ðNðb7ð 7ð 7ð!4ð !4ð !4ð !4ð !4Ð-ñ !4ô !4ð !4ðH?ð ?ð ?ð ?ð ?�Lñ ?ô ?ð ?ð&Wð Wð Wð Wð W�}ñ Wô Wð Wð5ð 5ð 5ð 5ð 5�}ñ 5ô 5ð 5ð 5ð 5r   