
    c,V                    >   d Z ddlmZ ddlZddlmZ ddlmZmZ ddl	m
Z
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 ej        dk    rddlm Z  nddl!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.Z0dRd2Z1	 dSdTd7Z2	 dSdUd9Z3e&fdVd;Z4dWd<Z5	 dXdYd?Z6dZdBZ7d[dCZ8d[dDZ9d[dEZ: e%dF          Z;	 dSd\dHZ< e            =                    ej>        e+e*            e            =                    ej#         ee3d=I          e6            e            =                    ej?         ee2d=I          e5           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/
    )annotationsN)Iterator)TupleUnion)basescontexthelpersnodes)parse)	PY39_PLUS
PY310_PLUS)AstroidSyntaxErrorInferenceErrorUseInferenceDefault)inference_tip)AstroidManager)InferenceResult)Uninferable)      )Literal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     ?lib/python3.11/site-packages/astroid/brain/brain_dataclasses.py	<genexpr>z.is_decorated_with_dataclass.<locals>.<genexpr>8   sB         	((;_MM         )
isinstancer
   ClassDef
decoratorsany)r   r!   s    `r+   is_decorated_with_dataclassr2   1   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
   Unknownr6   r7   r   visit_transformsinstance_attrs_check_generate_dataclass_initr   r0   r.   Callkeywordsargvalue
bool_value_generate_dataclass_initlistr   r8   localsrootDEFAULT_FACTORYbodytargetsr   )r   assign_noder@   rhs_nodekw_only_decorated	decoratorkeywordinit_str	init_noderM   
new_assigns              r+   dataclass_transformrY   >   s!   D066 	/ 	/!&=%"-
 
 

 "##44X>>%-JD!!)$//  Cdo+ C. 	C 	CIi44 $)!$- C C;)+ C(/(@(@(B(B%C (&t$77788 HC(OOJ/	  	1;.	).#,+Jyy{{$+- 	C/>>>??DQGJ $J,6,>q,A+BDK(((	C 	C    s   "G 
GGFr:   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)
rO   r.   r
   	AnnAssignr?   
AssignName_is_class_var
annotation_is_keyword_only_sentinel_is_init_var)r   r:   rQ   s      r+   r>   r>   p   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
    r;   FNTc              3  `   K   | ])}|j         d k    o|j                                         V  *dS r:   NrG   rH   rI   r)   rU   s     r+   r,   z1_check_generate_dataclass_init.<locals>.<genexpr>   sX          	v 	+((***     r-   )rL   r0   r
   r.   rE   r(   r1   rF   )r   foundr*   s      r+   rD   rD      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.r;   r   )reversedmror=   rL   KeyErrorargs_get_arguments_dataitems)
r   pos_only_storekw_only_storebase	base_initpos_onlyr9   posargdatakwargs
             r+   !_find_arguments_from_base_classesrx      s     @BN>@M $$ ( (  		+/;z+B1+EII 	 	 	H	 &N>>@@'$NN,, 	* 	*LFD &*N6"""==?? 	( 	(KE4#'M%  	(=((s   A
AArp   (dict[str, tuple[str | None, str | None]]rq   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.) r|   r   :     = , )ro   )rp   rq   rt   r9   pos_argrv   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)rj   rk   r=   rL   r.   r8   r
   r\   rH   rE    _looks_like_dataclass_field_call_get_field_default)r   r@   rr   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]rS   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|rY	 t-          t/          |                                                                                    }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||	<   nW|                    |           nA|	|v r||f||	<   n5|	|v r|	g|z   }|                    |	           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 rd   re   rf   s     r+   r,   z+_generate_dataclass_init.<locals>.<genexpr>  sS         v%Hgm.F.F.H.H*H     r-   Tr|   zself.r   r<   r   r   z if z is z else r}   c                (    g | ]}|j         d k    |S )r9   )rG   )r)   ks     r+   
<listcomp>z,_generate_dataclass_init.<locals>.<listcomp>X  s$    GGGQAEY4FGqGGGr-   r   selfzself, r   z*, z
    passzdef __init__(z) -> None:
    )!rx   r?   r@   r_   rH   rL   r.   r
   FunctionDefr0   decoratornamesrE   r   r1   rF   popra   	Subscriptslice	as_stringr   rN   r   nextinfer_call_resultr   StopIterationr   rI   appendr   joinendswith)r   r   rS   paramskw_only_paramsassignmentsprev_pos_only_storeprev_kw_only_storer   r@   r_   rH   property_nodeadditional_assignis_fieldinit_varassignment_strann_strdefault_strresultdefault_typedefault_nodeprevious_default	param_strr9   prev_pos_onlyprev_kw_onlyparams_stringassignments_strings                                r+   rJ   rJ      s{    F "NK.OPT.U.U++ p/ p/"(-"4f6G%j 37!%T!2 	 	/1BCC $/ "&7&F&F&H&HH  1 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 &2&<&<&>&>%):: &5JD J J\-C-C-E-E J J"&J J,;J JCGJ J '
 $oo// 	;!$}'F'F'H'H"I"I"S"S"U"UVV"M2     ;4FF ;.88:: 	 	(g'I 	-,{,,,I  	GG%.GGGG 1:#..00 -")))4444MM),,, 	))) 1,3[+A"4((%%i0000 ** )-4k,B#D))++ )&"&&t,,,,i((( 	/~..."?/# #M< !M1?BBxM]TYYv%6%666M!!$''   ~ Adii&?&?AAAM7BN{333N=NN:LNNNs   A H  H43H4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   )	r8   r.   r
   r\   r   r_   rH   infer_infer_instance_from_annotation)r   r   r   r_   rH   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.   r8   r
   r\   Assignr   r   r   r   r   r   rO   rH   )r   r   r   r   r   new_calls         r+   infer_dataclass_field_callr     s       dkEOU\#BCC "!!%%F 	3 &g9$ 	3}}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          u 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
   rE   funcr   r   r   r   r   Namer@   	Attributeattrnamer   rM   DATACLASS_MODULES)r   r!   inferreds      r+   r(   r(     s     $
## y

%%M*    ; 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)r8   scoper.   r
   r\   r/   r2   )r   r8   r   s      r+   _looks_like_dataclass_attributer     s]     [F uLLNNE65?++ 	/uen--	/'..r-   Tr   c                
   |rv|                      d          }|                                }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.
    T)futureNF)	statementr   r.   r
   r\   rH   r/   r2   r   r   r   r   r   r   r@   
FIELD_NAMErM   r   )r   r   stmtr   r   s        r+   r   r     s      	~~T~**

tU_--	
	 5%.11	 ,E22		 5	))**M*   uu h 122 u=J&T8==??+?CT+TTs   :&B! !B65B6
field_call_FieldDefaultReturnc                   d\  }}| j         D ]'}|j        dk    r|j        }|j        dk    r|j        }(||d|fS |B|@t          j        | j        | j        | j                  }|                    |           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   Nr5   )r   )	rF   rG   rH   r
   rE   r6   r7   r8   postinit)r   r   r   rU   r   s        r+   r   r     s      *G_& , ,;)# 	,mGG[-- 	,%mO " "'!! +? +:$!,$
 
 

 	/// (**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@   r|   ClassVar)r   r   r   r   r   getattrr.   r
   r   rH   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          j        |           }t          |t          j                  o|                                dk    S )z,Return True if node is the KW_ONLY sentinel.Fzdataclasses._KW_ONLY_TYPE)r   r	   
safe_inferr.   r   Instanceqnamer   s     r+   r`   r`   2  sK     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@   r|   InitVar)r   r   r   r   r   r   s     r+   ra   ra   =  s^    

%%M*   uu 8VR((I55s   !$ 99)Dict	FrozenSetListSetr   ,Iterator[type[Uninferable] | 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   >   r|   typing_collections_abc)r   r   r   r   r   r.   r
   r/   rM   r@   _INFERABLE_TYPING_TYPESinstantiate_class)r   r   klasss      r+   r   r   S  s      ETZZZ,,--M*   eU^,, (		  
 
(
 :00 	))+++++++%%'''''''s   #* AA)raise_on_overwrite)r   r    r!   r"   r#   r$   )r   r    r#   r3   )F)r   r    r:   r$   r#   rZ   )r   r    r#   r$   )r   r    r#   rh   )rp   ry   rq   ry   r#   rz   )r   r    r@   r   r#   r   )r   r    r   r   rS   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   )@__doc__
__future__r   syscollections.abcr   r   r   r   astroidr   r   r	   r
   astroid.builderr   astroid.constr   r   astroid.exceptionsr   r   r   astroid.inference_tipr   astroid.managerr   astroid.typingr   astroid.utilr   version_infor   typing_extensionsNodeNGrE   r   	frozensetDATACLASSES_DECORATORSr   r   rN   r2   rY   r>   rD   rx   r   r   rJ   r   r   r(   r   r   r   r^   r`   ra   r   r   register_transformr/   rA    r-   r+   <module>r     sD  
  # " " " " " 



 $ $ $ $ $ $         2 2 2 2 2 2 2 2 2 2 2 2 ! ! ! ! ! ! / / / / / / / / V V V V V V V V V V / / / / / / * * * * * * * * * * * * $ $ $ $ $ $v *))))))	')
el
*+	'#
$ej
013  #>22 
ID   ) =S
 
 
 
 
/C /C /C /Cf (-    6   < )  )  )  )F   0   &NO NO NO NOd AE    0 >B3 3 3 3 3( ;Q    <   " +/U U U U U<   @   (   6 6 6 6 $)   @D( ( ( ( (6    # #	N')D      # #	JM,FFF$      # #	MM+EEE#    r-   