o
    7f                     @  s   U 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mZmZmZmZmZmZmZ ddlmZ ddlmZmZmZ dd	d
d
dZded< d%ddZd&ddZd'ddZd(d"d#Zd$S ))zfCalculate some properties of classes.

These happen after semantic analysis and before type checking.
    )annotations)Final)Errors)IMPLICITLY_ABSTRACTIS_ABSTRACTCallExpr	DecoratorFuncDefNodeOverloadedFuncDefPromoteExprSymbolTableTypeInfoVar)Options)MYPYC_NATIVE_INT_NAMESInstance
ProperTypefloatcomplexbytes)zbuiltins.intzbuiltins.floatbuiltins.bytearraybuiltins.memoryviewr   TYPE_PROMOTIONStypr   is_stub_fileboolerrorsr   returnNonec                   s  d_ g _jrdS t }g }g }jrdS jD ]s}|j D ]k\}}|j}	t	|	t
r9|	jr6|	jd }
nd}
n|	}
t	|
trC|
j}
t	|
trh|
jttfv rg||vrgd_ |||
jf |u rg|| nt	|	tr|	jr||vrd_ ||tf |u r|| || q!qt|_|rψjrjjdrdS jrdS |r|sd fdd}ddd t|D }|dj d| d |dd jr|rddd t|D } jjdj d|  dS dS dS )zCalculate abstract status of a class.

    Set is_abstract of the type to True if the type has an unimplemented
    abstract attribute.  Also compute a list of abstract attributes.
    Report error is required ABCMeta metaclass is missing.
    FNr   Tzabc.ABCMetamessagestrseverityr   r   c                       j jj| |d d S N)r"   reportlinecolumnr    r"   r   r    O/home/ertert/spirit/venv/lib/python3.10/site-packages/mypy/semanal_classprop.pyr&   i      z/calculate_class_abstract_status.<locals>.reportz, c                 s       | ]\}}d | d V  qdS "Nr+   .0attr_r+   r+   r,   	<genexpr>l       z2calculate_class_abstract_status.<locals>.<genexpr>zClass z has abstract attributes errorzIIf it is meant to be abstract, add 'abc.ABCMeta' as an explicit metaclassnotec                 s  r.   r/   r+   r1   r+   r+   r,   r5   r   r6   zFinal class r    r!   r"   r!   r   r   ) is_abstractabstract_attributestypeddict_typeset
is_newtypemronamesitemsnode
isinstancer   r   funcr	   abstract_statusr   r   appendr   is_abstract_varaddsorteddeclared_metaclasstypehas_baseis_protocoljoinfullnameis_finalr&   r'   r(   )r   r   r   concreteabstractabstract_in_this_classbasenamesymnoderB   rD   r&   attrsr+   r*   r,   calculate_class_abstract_status*   sl   







"
rX   infoc                   sH   j r jD ]}|jj s|jjdkrd fdd}|d	d
 qdS dS )z9Check that all classes in MRO of a protocol are protocolszbuiltins.objectr    r!   r"   r   r   c                   r#   r$   r%   r)   r   rY   r+   r,   r&   ~   r-   z%check_protocol_status.<locals>.reportz)All bases of a protocol must be protocolsr7   Nr9   )rM   basesrK   rO   )rY   r   rK   r&   r+   rZ   r,   check_protocol_statusx   s   

r\   c                 C  s|   | j  D ]6\}}|j}t|tr;|jr;|jr;|js;| jdd D ]}|j 	|}|dur:t|jtr:|jjr:d|_q!qdS )aH  Try to infer additional class variables.

    Subclass attribute assignments with no type annotation are assumed
    to be classvar if overriding a declared classvar from the base
    class.

    This must happen after the main semantic analysis pass, since
    this depends on base class bodies having been fully analyzed.
       NT)
r@   rA   rB   rC   r   rY   is_inferredis_classvarr?   get)rY   rU   symrB   rT   memberr+   r+   r,   calculate_class_vars   s   
rc   module_namesr   optionsr   builtin_namesc                 C  s  | j }g }|jD ]}t|tr|j}t|tr||j q|sV|jt	v rV|
t	|j }|jdkr8|jr8d}n
|jdkrB|jrBd}|rV|j}	t|	tsNJ |t|	g  |jtv rz|d }
t|
jtsgJ |
jjt|jg  t|
jg |j_|r|jj| dS dS )zSetup extra, ad-hoc subtyping relationships between classes (promotion).

    This includes things like 'int' being compatible with 'float'.
    r   Nr   int)defn
decoratorsrC   r   analyzedr   rF   rK   rO   r   r`   disable_bytearray_promotiondisable_memoryview_promotionrB   r   r   r   _promoterY   alt_promoteextend)rY   rd   re   rf   rh   promote_targets	decoratorrj   
target_symtarget_infoint_symr+   r+   r,   add_type_promotion   s6   




ru   N)r   r   r   r   r   r   r   r   )rY   r   r   r   r   r   )rY   r   r   r   )
rY   r   rd   r   re   r   rf   r   r   r   )__doc__
__future__r   typingr   mypy.errorsr   
mypy.nodesr   r   r   r   r	   r
   r   r   r   r   r   mypy.optionsr   
mypy.typesr   r   r   r   __annotations__rX   r\   rc   ru   r+   r+   r+   r,   <module>   s     4


N
