
    5 fV                       d Z ddlmZ ddlmZ ddlmZmZmZ ddl	m
Z
mZmZ ddlmZ ddlmZmZ ddlmZmZm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 edeed         ej         f         eed         ej!        f         f         Z" e#d          Z$dZ% e#d          Z&dZ'e$fdJdZ(dKdZ)	 dLdMd Z*dNd!Z+dOd#Z,dPd(Z-dQd,Z.dRd0Z/	 dSdTd5Z0	 dSdUd7Z1e$fdVd9Z2dWd:Z3	 dXdYd=Z4dZd@Z5d[dAZ6d[dBZ7d[dCZ8 e#dD          Z9	 dSd\dFZ:d]dIZ;dS )^a>  
Astroid hook for the dataclasses library.

Support built-in dataclasses, pydantic.dataclasses, and marshmallow_dataclass-annotated
dataclasses. References:
- https://docs.python.org/3/library/dataclasses.html
- https://pydantic-docs.helpmanual.io/usage/dataclasses/
- https://lovasoa.github.io/marshmallow_dataclass/
    )annotations)Iterator)LiteralTupleUnion)basescontextnodes)parse)	PY39_PLUS
PY310_PLUS)AstroidSyntaxErrorInferenceErrorUseInferenceDefault)inference_tip)AstroidManager)InferenceResult)UninferableUninferableBase
safe_inferNdefaultdefault_factory)	dataclassfield)dataclassesmarshmallow_dataclasszpydantic.dataclasses_HAS_DEFAULT_FACTORYnodenodes.ClassDefdecorator_namesfrozenset[str]returnboolc                    t          | t          j                  r| j        sdS t	          fd| j        j        D                       S )zDReturn True if a decorated node has a `dataclass` decorator applied.Fc              3  8   K   | ]}t          |          V  d S N)_looks_like_dataclass_decorator).0decorator_attributer    s     U/var/www/equiseq/venv/lib/python3.11/site-packages/astroid/brain/brain_dataclasses.py	<genexpr>z.is_decorated_with_dataclass.<locals>.<genexpr>2   sB         	((;_MM         )
isinstancer
   ClassDef
decoratorsany)r   r    s    `r*   is_decorated_with_dataclassr1   +   sd     dEN++ 4? u    #'?#8     r,   Nonec           	        d| _         t          |           D ][}|j        j        }t	          j        |j        |j        |          }t                      	                    |          }|g| j
        |<   \t          |           sdS d}t          rg| j        j        r[| j        j        D ]N}t          |t          j                  sd} n/|j        D ]&}|j        dk    r|j                                        }'Ot)          | t+          t          | d                    |          }	 t-          |          d         }| |_        d\  |_        |_        |g| j        d<   |                                 }	t4          |	j        vrFt-          t4           d	          j        d
         }
|	|
_        |
j        d
         g|	j        t4          <   dS dS # t:          $ r Y dS w xY w)z6Rewrite a dataclass to be easily understood by pylint.T)lineno
col_offsetparentNFkw_only)init__init__NNz = object()r   )is_dataclass_get_dataclass_attributestargetnamer
   Unknownr4   r5   r   visit_transformsinstance_attrs_check_generate_dataclass_initr   r/   r-   Callkeywordsargvalue
bool_value_generate_dataclass_initlistr   r6   localsrootDEFAULT_FACTORYbodytargetsr   )r   assign_noder>   rhs_nodekw_only_decorated	decoratorkeywordinit_str	init_noderK   
new_assigns              r*   dataclass_transformrW   8   s   D066 	/ 	/!&=%"-
 
 

 "##44X>>%-JD!!)$//  Cdo+ C. 	C 	CIi44 $)!$- C C;)++(/(@(@(B(B%C (&t$77788 HC(OOJ/	  	1;.	).#,+Jyy{{$+--/>>>??DQGJ $J,6,>q,A+BDK((( .-    s   "G 
GGFr8   Iterator[nodes.AnnAssign]c              #    K   | j         D ]}t          |t          j                  rt          |j        t          j                  s<t          |j                  rQt          |j                  rf|st          |j                  r}|V  dS )zqYield the AnnAssign nodes of dataclass attributes for the node.

    If init is True, also include InitVars.
    N)
rM   r-   r
   	AnnAssignr=   
AssignName_is_class_var
annotation_is_keyword_only_sentinel_is_init_var)r   r8   rO   s      r*   r<   r<   j   s       y  +u77 	z 0@
 @
 	  /00 	$[%;<< 	  	[%;<< 	# r,   c                    d| j         v rdS d}| j        j        D ].}t          |t          j                  st          |          r|}/|dS t          d |j        D                        S )zReturn True if we should generate an __init__ method for node.

    This is True when:
        - node doesn't define its own __init__ method
        - the dataclass decorator was called *without* the keyword argument init=False
    r9   FNTc              3  `   K   | ])}|j         d k    o|j                                         V  *dS r8   NrE   rF   rG   r(   rS   s     r*   r+   z1_check_generate_dataclass_init.<locals>.<genexpr>   sX          	v 	+((***     r,   )rJ   r/   r
   r-   rC   r'   r0   rD   )r   foundr)   s      r*   rB   rB      s     T[  uE#4 ( (-uz:: 	*+>?? 	('E}t    ~      r,   Ytuple[dict[str, tuple[str | None, str | None]], dict[str, tuple[str | None, str | None]]]c                h   i }i }t          |                                           D ]}|j        s
	 |j        d         d         }n# t          $ r Y +w xY w|j                                        \  }}|                                D ]
\  }}|||<   |                                D ]
\  }	}|||	<   ||fS )z<Iterate through all bases and get their typing and defaults.r9   r   )reversedmror;   rJ   KeyErrorargs_get_arguments_dataitems)
r   pos_only_storekw_only_storebase	base_initpos_onlyr7   posargdatakwargs
             r*   !_find_arguments_from_base_classesrv      s     @BN>@M $$ ( (  		+/;z+B1+EII 	 	 	H	 &N>>@@'$NN,, 	* 	*LFD &*N6"""==?? 	( 	(KE4#'M%  	(=((s   A
AArn   (dict[str, tuple[str | None, str | None]]ro   tuple[str, str]c                T   d\  }}|                                  D ];\  }}||z  }|d         r|d|d         z   z  }|d         r|d|d         z   z  }|dz  }<|                                 D ];\  }}||z  }|d         r|d|d         z   z  }|d         r|d|d         z   z  }|dz  }<||fS )zKParse positional and keyword arguments into strings for an __init__ method.) rz   r   :     = , )rm   )rn   ro   rr   r7   pos_argrt   kw_args          r*   _parse_arguments_into_stringsr      s    
 Hg'--//  G7 	'tAw&H7 	(Q'HD%++--  67 	&td1g~%G7 	'utAw&G4Wr,   r>   strnodes.NodeNG | Nonec                   t          |                                           D ]}|j        s
||j        v r|j        |         D ]}t	          |j        t          j                  rp|j        j        rdt	          |j        j        t          j	                  r@t          |j        j                  r't          |j        j                  }|r|d         c c S dS )z4Get the default value of a previously defined field.r|   N)rh   ri   r;   rJ   r-   r6   r
   rZ   rF   rC    _looks_like_dataclass_field_call_get_field_default)r   r>   rp   assignr   s        r*   _get_previous_field_defaultr      s    $$ * *  	4;+d+ 	* 	*v}eo>>*+* #6=#6
CC* 99LMM	* 11DEEG *&qz)))))4r,   assignslist[nodes.AnnAssign]rQ   c                   g }g }g }t          |           \  }}|D ]5}|j        j        |j        |j        }}
}	d}| j        |	         D ]?}t          |t          j                  s|j	        s%d|
                                v r|} n@t          |t          j                  ot          |d          }|rKt          d |j        D                       r-|                    |	d           |                    |	d           t!          |
          r)d}t          |
t          j                  r|
j        }
nd}
d}n
d}d|	 d	|	 }d
\  }}|
|
                                }|r~|rgt)          |          }|rU|\  }}|dk    r|                                }n|dk    r/t*          }d|	 d	|                                 d|	 dt*           d|	 
}n|                                }n|rZ	 t-          t/          |                    d                                                              }n=# t2          t4          f$ r Y n*w xY wt7          | |	          }|r|                                }|	}||d| z  }||d	| z  }|r_d |j        D             }|rL|d         j                                        r|                    |           n|                    |           |r"|	|v r||f||	<   nV|                    |           n@|	|v r||f||	<   n4|	|v r|	g|}|                    |	           n|                    |           |s|                    |           7t=          ||          \  }}d|v rdnd}||d                    |          z   z  }|                     d          s|dz  }|s|r|dz  }|| d                    |           z  }|rd                    |          nd}d| d| S )z8Return an init method for a dataclass given the targets.Nzbuiltins.propertyF)check_scopec              3  `   K   | ])}|j         d k    o|j                                         V  *dS rb   rc   rd   s     r*   r+   z+_generate_dataclass_init.<locals>.<genexpr>  sS         v%Hgm.F.F.H.H*H     r,   Trz   zself.r}   r:   r   r   z if z is z else r{   c                (    g | ]}|j         d k    |S )r7   )rE   )r(   ks     r*   
<listcomp>z,_generate_dataclass_init.<locals>.<listcomp>T  s$    GGGQAEY4F4Fq4F4F4Fr,   r   selfzself, r~   z*, z
    passzdef __init__(z) -> None:
    )!rv   r=   r>   r]   rF   rJ   r-   r
   FunctionDefr/   decoratornamesrC   r   r0   rD   popr_   	Subscriptslice	as_stringr   rL   r   nextinfer_call_resultr   StopIterationr   rG   appendr   joinendswith)r   r   rQ   paramskw_only_paramsassignmentsprev_pos_only_storeprev_kw_only_storer   r>   r]   rF   property_nodeadditional_assignis_fieldinit_varassignment_strann_strdefault_strresultdefault_typedefault_nodeprevious_default	param_strr7   prev_pos_onlyprev_kw_onlyparams_stringassignments_strings                                r*   rH   rH      ss    F "NK.OPT.U.U++ r/ r/"(-"4f6G%j 37!%T!2 	 	/1BCC $/ "&7&F&F&H&HHH 1 I eUZ00 
5Uu6
 6
 6
  		  $~     
 $''d333"&&tT222
## 
	5H*eo66 "'-

 "
NNH4T44d44N)! **,,G  	; 0+E22 	17.L,#y00&2&<&<&>&>%):::&5JD J J\-C-C-E-E J J"&J J,;J JCGJ J '
 $oo// 	;!88>>??IIKK  #M2     ;4FF ;.88:: 	g'I",{,,,I  	GG%.GGGG 1:#..00 -")))4444MM),,, 	)))),3[+A"4((%%i0000 ***-4k,B#D))+++"&&t,,,,i((( 	/~..."?/# #M< !M11BBxM]TYYv%6%666M!!$''   ~ Adii&?&?AAAM7BN{333N=NN:LNNNs   AH!!H54H5nodes.Unknownctxcontext.InferenceContext | NoneIterator[InferenceResult]c              #    K   | j         }t          |t          j                  st          V  dS |j        |j        }}||                    |          E d{V  |t          ||          E d{V  dS t          V  dS )zInference tip for an Unknown node that was dynamically generated to
    represent a dataclass attribute.

    In the case that a default value is provided, that is inferred first.
    Then, an Instance of the annotated class is yielded.
    Nr	   )r   )	r6   r-   r
   rZ   r   r]   rF   infer_infer_instance_from_annotation)r   r   r   r]   rF   s        r*   infer_dataclass_attributer     s       [Ffeo.. )6<J;;s;+++++++++2:3GGGGGGGGGGGGr,   
nodes.Callc              #    K   t          | j        t          j        t          j        f          st
          t          |           }|st          V  dS |\  }}|dk    r|                    |          E d{V  dS t          |
                                          j        d         j        }| j        |_        |                    |          E d{V  dS )z(Inference tip for dataclass field calls.r   r   Nr   )r-   r6   r
   rZ   Assignr   r   r   r   r   r   rM   rF   )r   r   r   r   r   new_calls         r*   infer_dataclass_field_callr     s       dkEOU\#BCC "!!%%F 	3 &g9$$}}S}11111111111W..00116q9?H"kHO~~c~22222222222r,   nodes.NodeNGc                   t          | t          j                  r| j        } 	 t	          |                                           }n# t          t          f$ r
 t          }Y nw xY wt          |t                    rHt          | t          j
                  r	| j        |v S t          | t          j                  r	| j        |v S dS t          |t          j                  o(|j        |v o|                                j        t           v S )zReturn True if node looks like a dataclass decorator.

    Uses inference to lookup the value of the node, and if that fails,
    matches against specific names.
    F)r-   r
   rC   funcr   r   r   r   r   r   Namer>   	Attributeattrnamer   rK   DATACLASS_MODULES)r   r    inferreds      r*   r'   r'     s     $
## y

%%M*    (O,, dEJ'' 	09//dEO,, 	4=O33u 	8U.// 	6M_,	6MMOO $55s   !A A A c                    | j         }|sdS |                                }t          |t          j                  o(t          |t          j                  ot          |          S )z^Return True if node was dynamically generated as the child of an AnnAssign
    statement.
    F)r6   scoper-   r
   rZ   r.   r1   )r   r6   r   s      r*   _looks_like_dataclass_attributer     s]     [F uLLNNE65?++ 	/uen--	/'..r,   Tr   c                   |rt|                                  }|                                }t          |t          j                  r0|j        )t          |t          j                  rt          |          sdS 	 t          | j	        
                                          }n# t          t          f$ r Y dS w xY wt          |t          j                  sdS |j        t          k    o|                                j        t"          v S )zReturn True if node is calling dataclasses field or Field
    from an AnnAssign statement directly in the body of a ClassDef.

    If check_scope is False, skips checking the statement and body.
    NF)	statementr   r-   r
   rZ   rF   r.   r1   r   r   r   r   r   r   r>   
FIELD_NAMErK   r   )r   r   stmtr   r   s        r*   r   r     s      	~~

tU_--	
&5%.11 '+E22 ' 5	))**M*   uu h 122 u=J&T8==??+?CT+TTs   8&B B43B4
field_call_FieldDefaultReturnc                "   d\  }}| j         D ]'}|j        dk    r|j        }|j        dk    r|j        }(||d|fS |P|Nt          j        | j        | j        | j        | j        | j	                  }|
                    |g g            d|fS dS )ah  Return a the default value of a field call, and the corresponding keyword
    argument name.

    field(default=...) results in the ... node
    field(default_factory=...) results in a Call node with func ... and no arguments

    If neither or both arguments are present, return ("", None) instead,
    indicating that there is not a valid default value.
    r:   r   r   N)r4   r5   r6   
end_linenoend_col_offset)r   rk   rD   )rD   rE   rF   r
   rC   r4   r5   r6   r   r   postinit)r   r   r   rS   r   s        r*   r   r     s      *G_& , ,;)##mGG[---%mO6'!!?6:$!,$!,%4
 
 
 	R"EEE (**4r,   c                   t           rP	 t          |                                           }n# t          t          f$ r Y dS w xY wt          |dd          dk    S t          | t          j                  o]t          | j	        t          j
                  r| j	        j        dk    p.t          | j	        t          j                  o| j	        j        dk    S )z@Return True if node is a ClassVar, with or without subscripting.Fr>   rz   ClassVar)r   r   r   r   r   getattrr-   r
   r   rF   r   r>   r   r   r   r   s     r*   r\   r\     s     ;	DJJLL))HH. 	 	 	55	 x,,
:: dEO,, 4:uz** 	*JOz)	.dj%/22 .J:-	s   !+ A A c                    t           sdS t          |           }t          |t          j                  o|                                dk    S )z,Return True if node is the KW_ONLY sentinel.Fzdataclasses._KW_ONLY_TYPE)r   r   r-   r   Instanceqnamer   s     r*   r^   r^   0  sH     u$H8U^,, 	<NN ;;r,   c                    	 t          |                                           }n# t          t          f$ r Y dS w xY wt	          |dd          dk    S )z@Return True if node is an InitVar, with or without subscripting.Fr>   rz   InitVar)r   r   r   r   r   r   s     r*   r_   r_   ;  s^    

%%M*   uu 8VR((I55s   !$ 99)Dict	FrozenSetListSetr   *Iterator[UninferableBase | bases.Instance]c              #    K   d}	 t          |                     |                    }n # t          t          f$ r t          V  Y nw xY wt          |t          j                  st          V  dS |                                j	        dv r1|j	        t          v r|                                V  dS t          V  dS |                                V  dS )zInfer an instance corresponding to the type annotation represented by node.

    Currently has limited support for the typing module.
    Nr   >   rz   typing_collections_abc)r   r   r   r   r   r-   r
   r.   rK   r>   _INFERABLE_TYPING_TYPESinstantiate_class)r   r   klasss      r*   r   r   Q  s      ETZZZ,,--M*   eU^,, (		  
 

 :000))+++++++%%'''''''s   #* AAmanagerr   c                D   |                      t          j        t          t                     |                      t          j        t          t          d          t                     |                      t          j	        t          t          d          t                     d S )NT)raise_on_overwrite)register_transformr
   r.   rW   r1   rC   r   r   r   r?   r   r   )r   s    r*   registerr   l  s    +-H   
0TJJJ(   /DIII'    r,   )r   r   r    r!   r"   r#   )r   r   r"   r2   )F)r   r   r8   r#   r"   rX   )r   r   r"   r#   )r   r   r"   rf   )rn   rw   ro   rw   r"   rx   )r   r   r>   r   r"   r   )r   r   r   r   rQ   r#   r"   r   r&   )r   r   r   r   r"   r   )r   r   r   r   r"   r   )r   r   r    r!   r"   r#   )r   r   r"   r#   )T)r   r   r   r#   r"   r#   )r   r   r"   r   )r   r   r"   r#   )r   r   r   r   r"   r   )r   r   r"   r2   )<__doc__
__future__r   collections.abcr   r   r   r   r   astroidr   r	   r
   astroid.builderr   astroid.constr   r   astroid.exceptionsr   r   r   astroid.inference_tipr   astroid.managerr   astroid.typingr   astroid.utilr   r   r   NodeNGrC   r   	frozensetDATACLASSES_DECORATORSr   r   rL   r1   rW   r<   rB   rv   r   r   rH   r   r   r'   r   r   r   r\   r^   r_   r   r   r    r,   r*   <module>r      s}  
  # " " " " " $ $ $ $ $ $ ( ( ( ( ( ( ( ( ( ( ) ) ) ) ) ) ) ) ) ) ! ! ! ! ! ! / / / / / / / / V V V V V V V V V V / / / / / / * * * * * * * * * * * * A A A A A A A A A A	')
el
*+	'#
$ej
013  #>22 
ID   ) =S
 
 
 
 
/C /C /C /Cf (-    6   < )  )  )  )F   0   &PO PO PO POh AE    0 >B3 3 3 3 3( ;Q    <   " +/U U U U U<   D   (   6 6 6 6 $)   @D( ( ( ( (6     r,   