o
    Rcc!                     @   s  d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lm	Z
 d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlm Z  d dl!m"Z" d dl#m$Z$ d dl#m%Z% d d	l#m	Z	 d d l#m&Z& d d!l#m'Z' d d"l#m(Z( ed#eeef d$Z)G d%d& d&Z*d'd( Z+d)ed*e,d+ed,dfd-d.Z-d)ed*e,d,ee fd/d0Z.d)ed*e,d,ee fd1d2Z/d)ed,dfd3d4Z0d)ed,dfd5d6Z1d)ed,e2fd7d8Z3d)ed,e2fd9d:Z4d)ed,dfd;d<Z5d)ed,e2fd=d>Z6d)ed?ed,eee*  fd@dAZ7d)edBee* d,dfdCdDZ8d?edEe,dFed,dfdGdHZ9dFeeef dIe,dJe,dKe,d,df
dLdMZ:edNdOdPedQe,dRdd,eeeef  fdSdTZ;edPedQe,dRee
e) dNf d,ee) fdUdTZ;ddOdPedQe,dReee
e dNf  d,ee fdVdTZ;dWee d,ee fdXdYZ<d?edZe	d,e	fd[d\Z=d]ed?ed,ee fd^d_Z>d`ed,efdadbZ?dS )c    N)Any)Iterable)Iterator)List)Optional)overload)Tuple)Type)TypeVar)Union)ARG_POS)CallExpr)ClassDef)CLASSDEF_NO_INFO)Context)
Expression)IfStmt)JsonDict)
MemberExpr)NameExpr)	Statement)SymbolTableNode)TypeInfo)ClassDefContext)DynamicClassDefContext)SemanticAnalyzerPluginInterface)deserialize_and_fixup_type)map_type_from_supertype)Instance)NoneType)TypeVarType)UnboundType)	UnionType	_TArgType)boundc                   @   sp   e Zd Zdedededee deddfdd	Zde	fd
dZ
deddfddZedede	dedd fddZdS )SQLAlchemyAttributenamelinecolumntypinforeturnNc                 C   s"   || _ || _|| _|| _|| _d S N)r&   r'   r(   typer*   )selfr&   r'   r(   r)   r*    r/   :D:\Flask\env\Lib\site-packages\sqlalchemy/ext/mypy/util.py__init__+   s
   
zSQLAlchemyAttribute.__init__c                 C   s$   | j sJ | j| j| j| j  dS )N)r&   r'   r(   r-   )r-   r&   r'   r(   	serialize)r.   r/   r/   r0   r2   9   s   
zSQLAlchemyAttribute.serializesub_typec                 C   s&   t | jtsdS t| j|| j| _dS )zxExpands type vars in the context of a subtype when an attribute is
        inherited from a generic super type.
        N)
isinstancer-   r    r   r*   )r.   r3   r/   r/   r0   expand_typevar_from_subtypeB   s   z/SQLAlchemyAttribute.expand_typevar_from_subtypedataapic                 C   s,   |  }t|d|}| d||d|S )Nr-   )r)   r*   r/   )copyr   pop)clsr*   r6   r7   r)   r/   r/   r0   deserializeK   s   zSQLAlchemyAttribute.deserialize)__name__
__module____qualname__strintr   r	   r   r1   r   r2   r5   classmethodr   r;   r/   r/   r/   r0   r%   *   s4    
		r%   c                 C   s   t td| S )Nz	^__.+?__$)boolrematch)r&   r/   r/   r0   name_is_dunderW      rE   r*   keyr6   r+   c                 C   s   || j di |< d S NZ
sqlalchemymetadata
setdefault)r*   rG   r6   r/   r/   r0   _set_info_metadata[      rL   c                 C   s   | j di |d S rH   )rJ   get)r*   rG   r/   r/   r0   _get_info_metadata_   rM   rO   c                 C   s0   | j r| j D ]}t||}|d ur|  S qd S r,   )mrorO   )r*   rG   baserJ   r/   r/   r0   _get_info_mro_metadatac   s   

rR   c                 C   s   | j di  d S rH   rI   r*   r/   r/   r0   establish_as_sqlalchemyl   s   rT   c                 C      t | dd d S Nis_baseTrL   rS   r/   r/   r0   set_is_basep   rF   rY   c                 C      t | d}|du S rV   rO   r*   rW   r/   r/   r0   get_is_baset      
r]   c                 C   rZ   rV   )rR   r\   r/   r/   r0   has_declarative_basey   r^   r_   c                 C   rU   NZ	has_tableTrX   rS   r/   r/   r0   set_has_table~   rF   ra   c                 C   rZ   r`   r[   r\   r/   r/   r0   get_has_table   r^   rb   r7   c                 C   sJ   t | d}|d u rd S g }|D ]}t| ||}||  || q|S )Nmapped_attributes)rO   r%   r;   r5   append)r*   r7   rc   
attributesr6   attrr/   r/   r0   get_mapped_attributes   s   
rg   re   c                 C   s   t | ddd |D  d S )Nrc   c                 S   s   g | ]}|  qS r/   )r2   ).0	attributer/   r/   r0   
<listcomp>   s    z)set_mapped_attributes.<locals>.<listcomp>rX   )r*   re   r/   r/   r0   set_mapped_attributes   s
   rk   msgctxc                 C   s   d| }|  ||S )Nz[SQLAlchemy Mypy plugin] %s)fail)r7   rl   rm   r/   r/   r0   rn      s   rn   modulesymbol_nameasnamec                 C   s<   | j j| j j j}||vr| j j| j| }|||< d S d S r,   )r7   modulesZ
cur_mod_idnames)rm   ro   rp   rq   module_globalsZ
lookup_symr/   r/   r0   
add_global   s   ru   .)
expr_typescallexprr&   rv   c                C      d S r,   r/   rw   r&   rv   r/   r/   r0   get_callexpr_kwarg   s   rz   c                C   rx   r,   r/   ry   r/   r/   r0   rz      s   c                C   sR   z| j |}W n
 ty   Y d S w | j| }t||d ur |nttfr'|S d S r,   )	arg_namesindex
ValueErrorargsr4   r   r   )rw   r&   rv   Zarg_idxkwargr/   r/   r0   rz      s   
stmtsc                 c   sZ    | D ]'}t |tr't |jd tr'|jd jdkr'|jd jD ]}|V  q q|V  qd S )Nr   ztyping.TYPE_CHECKING)r4   r   exprr   fullnamebody)r   stmtZsubstmtr/   r/   r0   flatten_typechecking   s   r   r)   c                    s   t |ts|S |jdkrt t fdd|jD t g S  |j|}|durEt |trEt |j	t
rE|j	}t| fdd|jD S |S )zTake the UnboundType that we seem to get as the ret_type from a FuncDef
    and convert it into an Instance/TypeInfo kind of structure that seems
    to work as the left-hand type of an AssignmentStatement.

    r   c                    s   g | ]}t  |qS r/   )unbound_to_instance)rh   Ztyp_argr7   r/   r0   rj      s    z'unbound_to_instance.<locals>.<listcomp>Nc                    s$   g | ]}t |trt |n|qS r/   )r4   r!   r   )rh   argr   r/   r0   rj     s    )r4   r!   r&   r   r"   r~   r   lookup_qualifiedr   noder   r   )r7   r)   r   Z
bound_typer/   r   r0   r      s4   
	



r   r:   c                 C   sD   | j tu r|| j| }|d u rd S |rt|jtsJ |jS | j S r,   )r*   r   r   r&   r4   r   r   )r:   r7   symr/   r/   r0   info_for_cls  s   
r   r   c                 C   s,   t d}d|_t|d}t|| gtgdgS )NZ__sa_Mappedz sqlalchemy.orm.attributes.MappedZ_empty_constructorZarg1)r   r   r   r   r   )r   Zcolumn_descriptorZmember_exprr/   r/   r0   expr_to_mapped_constructor(  s   
r   )@rC   typingr   r   r   r   r   r   r   r	   Z
TypingTyper
   r   Z
mypy.nodesr   r   r   r   r   r   r   r   r   r   r   r   r   Zmypy.pluginr   r   r   Zmypy.plugins.commonr   Zmypy.typeopsr   Z
mypy.typesr   r   r    r!   r"   r#   r%   rE   r?   rL   rO   rR   rT   rY   rB   r]   r_   ra   rb   rg   rk   rn   ru   rz   r   r   r   r   r/   r/   r/   r0   <module>   s    -	







0
