o
    2g                     @  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                   s    j jj| |d d S )Nr"   )reportlinecolumn)r    r"   r   r    N/home/garg/my-data/venv/lib/python3.10/site-packages/mypy/semanal_classprop.pyr$   i   s   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(   r-   r(   r(   r)   r1   r   r2   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symnoder=   r?   r$   attrsr(   r'   r)   calculate_class_abstract_status*   sl   







"
rS   infoc                 C  sD   | j r| jD ]}|jj s|jjdkr|j| j| jddd qdS dS )z9Check that all classes in MRO of a protocol are protocolszbuiltins.objectz)All bases of a protocol must be protocolsr3   r#   N)rH   basesrF   rJ   r$   r%   r&   )rT   r   rF   r(   r(   r)   check_protocol_statusx   s   
rV   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;   r<   r=   r>   r   rT   is_inferredis_classvarr:   get)rT   rP   symr=   rO   memberr(   r(   r)   calculate_class_vars   s   
r]   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
decoratorsr>   r   analyzedr   rA   rF   rJ   r   rZ   disable_bytearray_promotiondisable_memoryview_promotionr=   r   r   r   _promoterT   alt_promoteextend)rT   r^   r_   r`   rb   promote_targets	decoratorrd   
target_symtarget_infoint_symr(   r(   r)   add_type_promotion   s6   




ro   N)r   r   r   r   r   r   r   r   )rT   r   r   r   r   r   )rT   r   r   r   )
rT   r   r^   r   r_   r   r`   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__rS   rV   r]   ro   r(   r(   r(   r)   <module>   s     4


N
