
    *e                        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Zd"dZd#dZ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                0    d _         g  _         j        rdS t                      }g }g } j        rdS  j        D ]R}|j                                        D ]4\  }}|j        }	t          |	t                    r|	j        r|	j        d         }
nd}
n|	}
t          |
t                    r|
j        }
t          |
t                    rV|
j        t          t           fv r@||vr<d _         |                    ||
j        f           | u r|                    |           n\t          |	t$                    rG|	j        r@||vr<d _         |                    |t          f           | u r|                    |           |                    |           6Tt+          |           _        |r j        r! j        j                            d          rdS  j        rdS |rX|sVd fd}d                    d t+          |          D                       } |d j         d| d            |dd            j        r\|r\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                N                         j        j        | |           d S N)r$   reportlinecolumn)r"   r$   r   r   s     6lib/python3.11/site-packages/mypy/semanal_classprop.pyr(   z/calculate_class_abstract_status.<locals>.reporti   s'    ch
GhOOOOO    z, c              3  (   K   | ]\  }}d | d V  dS "N .0attr_s      r+   	<genexpr>z2calculate_class_abstract_status.<locals>.<genexpr>l   s.      JJgdAk$kkkJJJJJJr,   zClass z has abstract attributes errorzIIf it is meant to be abstract, add 'abc.ABCMeta' as an explicit metaclassnotec              3  (   K   | ]\  }}d | d V  dS r.   r0   r1   s      r+   r5   z2calculate_class_abstract_status.<locals>.<genexpr>r   s.      FF'$+d+++FFFFFFr,   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(   attrss   ` `          r+   calculate_class_abstract_statusrX   *   sF    CO C
 H&(H(*
~  	  !Z--// 	 	MD'<D$ 122 

 :  (,
1DDDD$	** !y$(( <([:M,NNNH,,&*COOOT4+?$@AAAs{{.55d;;;D#&& <' <D,@,@&*COOOT;$7888s{{.55d;;;LL=	D %X..C ! 	c&<&A&J&J=&Y&Y 	F? 	F 		2 		P P P P P P P IIJJ9I9IJJJJJEFJCLJJ5JJGTTTF[]c   | 
 
		FFVH5E5EFFFFFHcj"_"_"_X]"_"_	
 	
 	
 	
 	

 
 
 
r,   infoc                      j         r9 j        D ]3}|j        j         s#|j        j        dk    rd fd} |dd	           2d
S d
S )z9Check that all classes in MRO of a protocol are protocolszbuiltins.objectr"   r#   r$   r   r    c                N                         j        j        | |           d S r&   r'   )r"   r$   r   rY   s     r+   r(   z%check_protocol_status.<locals>.report~   s'    MM$)T['HMUUUUUr,   z)All bases of a protocol must be protocolsr6   Nr9   )rM   basesrK   rO   )rY   r   rK   r(   s   ``  r+   check_protocol_statusr]   x   s     MJ 	M 	MD9( MTY-?CT-T-TV V V V V V V BGLLLM M	M 	Mr,   c                \   | j                                         D ]\  }}|j        }t          |t                    rp|j        ri|j        rb|j        s[| j        dd         D ]K}|j         	                    |          }|-t          |j        t                    r|j        j        rd|_        Ld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   members         r+   calculate_class_varsre      s     Z%%'' , ,	cxdC   	,TY 	,43C 	,DL\ 	, , ,--%*V[#*F*F%6;Kb%'+D$, ,r,   module_namesr   optionsr   builtin_namesc                P   | j         }g }|j        D ]M}t          |t                    r6|j        }t          |t
                    r|                    |j                   N|s|j        t          v r|
                    t          |j                           }|j        dk    r
|j        rd}n|j        dk    r	|j        rd}|rA|j        }	t          |	t                    sJ |                    t          |	g                      |j        t           v ru|d         }
t          |
j        t                    sJ |
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   rb   disable_bytearray_promotiondisable_memoryview_promotionrB   r   r   r   _promoterY   alt_promoteextend)rY   rf   rg   rh   rk   promote_targets	decoratorrm   
target_symtarget_infoint_syms              r+   add_type_promotionrx      s    9D(*O_ 6 6	i** 	6 )H(K00 6&&x}555 B=O++%))/$-*HIIJ} 4449\4!

"777G<`7!
 B(o!+x88888&&xR'@'@AAA }...&',11111$$Xdi%<%<=== (r : :	 3	!!/222223 3r,   N)r   r   r   r   r   r   r   r    )rY   r   r   r   r   r    )rY   r   r   r    )
rY   r   rf   r   rg   r   rh   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]   re   rx   r0   r,   r+   <module>r      s    
 # " " " " "                                      !           C C C C C C C C C C !"	     K
 K
 K
 K
\	M 	M 	M 	M, , , ,&$3 $3 $3 $3 $3 $3r,   