
    eV                    ^   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jB                  f   f   Z" e#d      Z$dZ% e#d      Z&dZ'e$f	 	 	 	 	 d(dZ(d)dZ)	 d*	 	 	 	 	 d+dZ*d,dZ+	 	 	 	 d-dZ,	 	 	 	 	 	 d.dZ-d/dZ.	 	 	 	 	 	 	 	 d0dZ/	 d1	 	 	 	 	 d2dZ0	 d1	 	 	 	 	 d3dZ1e$f	 	 	 	 	 d4dZ2d5dZ3	 d6	 	 	 	 	 d7d Z4d8d!Z5d9d"Z6d9d#Z7d9d$Z8 e#d%      Z9	 d1	 	 	 	 	 d:d&Z:d;d'Z;y)<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_FACTORYc                    t        | t        j                        r| j                  syt	        fd| j                  j                  D              S )zDReturn True if a decorated node has a `dataclass` decorator applied.Fc              3  6   K   | ]  }t        |        y wN)_looks_like_dataclass_decorator).0decorator_attributedecorator_namess     A/usr/lib/python3/dist-packages/astroid/brain/brain_dataclasses.py	<genexpr>z.is_decorated_with_dataclass.<locals>.<genexpr>2   s!       	((;_Ms   )
isinstancer
   ClassDef
decoratorsany)noder$   s    `r%   is_decorated_with_dataclassr,   +   s@     dENN+4?? #'??#8#8      c           	        d| _         t        |       D ]m  }|j                  j                  }t	        j
                  |j                  |j                  |      }t               j                  |      }|g| j                  |<   o t        |       syd}t        r| j                  j                  rt| j                  j                  D ][  }t        |t        j                        sd} n=|j                   D ],  }|j"                  dk(  s|j$                  j'                         }. ] t)        | t+        t        | d            |      }	 t-        |      d   }| |_        d\  |_        |_        |g| j0                  d<   | j3                         }	t4        |	j0                  vrHt-        t4         d	      j6                  d
   }
|	|
_        |
j8                  d
   g|	j0                  t4        <   yy# t:        $ r Y y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
   Unknownr/   r0   r   visit_transformsinstance_attrs_check_generate_dataclass_initr   r)   r'   Callkeywordsargvalue
bool_value_generate_dataclass_initlistr   r1   localsrootDEFAULT_FACTORYbodytargetsr   )r+   assign_noder9   rhs_nodekw_only_decorated	decoratorkeywordinit_str	init_noderF   
new_assigns              r%   dataclass_transformrR   8   s   D06 	/!!&&==%%"--

 "#44X>%-JD!	/ *$/doo++.. 	CIi4$)!$-- C;;)+(/(@(@(B%C		C (&t$78HC(OJ/	  	1;.	).#,+Jyy{$++-/!2+>?DDQGJ $J,6,>,>q,A+BDKK( .  s   G" "	G.-G.c              #  <  K   | j                   D ]  }t        |t        j                        r$t        |j                  t        j
                        sBt        |j                        rXt        |j                        rn|st        |j                        r|  yw)zqYield the AnnAssign nodes of dataclass attributes for the node.

    If init is True, also include InitVars.
    N)
rH   r'   r
   	AnnAssignr8   
AssignName_is_class_var
annotation_is_keyword_only_sentinel_is_init_var)r+   r3   rJ   s      r%   r7   r7   j   s      yy +u7z 0 0@
  //0$[%;%;< [%;%;<#s   BBc                    d| j                   v ryd}| j                  j                  D ]+  }t        |t        j                        st        |      s*|}- |y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
    r4   FNTc              3  t   K   | ]0  }|j                   d k(  xr |j                  j                           2 ywr3   Nr@   rA   rB   r"   rN   s     r%   r&   z1_check_generate_dataclass_init.<locals>.<genexpr>   s@        	v 	+((**	+   68)rE   r)   r
   r'   r>   r!   r*   r?   )r+   foundr#   s      r%   r=   r=      s     T[[ E#44 (-uzz:*+>?'E( }   ~~   r-   c                Z   i }i }t        | j                               D ]y  }|j                  s	 |j                  d   d   }|j
                  j                         \  }}|j                         D ]
  \  }}|||<    |j                         D ]
  \  }	}|||	<    { ||fS # t        $ r Y w xY w)z<Iterate through all bases and get their typing and defaults.r4   r   )reversedmror6   rE   KeyErrorargs_get_arguments_dataitems)
r+   pos_only_storekw_only_storebase	base_initpos_onlyr2   posargdatakwargs
             r%   !_find_arguments_from_base_classesrp      s     @BN>@M $ (  	+/;;z+B1+EI &NN>>@'$NN, 	*LFD &*N6"	* #==? 	(KE4#'M% 	('(* =((!  		s   B	B*)B*c                   d\  }}| j                         D ]/  \  }}||z  }|d   r|d|d   z   z  }|d   r|d|d   z   z  }|dz  }1 |j                         D ]/  \  }}||z  }|d   r|d|d   z   z  }|d   r|d|d   z   z  }|dz  }1 ||fS )zKParse positional and keyword arguments into strings for an __init__ method.) rr   r   :     = , )rg   )rh   ri   rl   r2   pos_argrn   kw_args          r%   _parse_arguments_into_stringsry      s    
 Hg'--/ G7tAw&H7Q'HD &++- 67td1g~%G7utAw&G4 Wr-   c                
   t        | j                               D ]  }|j                  s||j                  v s|j                  |   D ]  }t	        |j
                  t        j                        s(|j
                  j                  s?t	        |j
                  j                  t        j                        snt        |j
                  j                        st        |j
                  j                        }|s|d   c c S   y)z4Get the default value of a previously defined field.rt   N)rb   rc   r6   rE   r'   r1   r
   rT   rA   r>    _looks_like_dataclass_field_call_get_field_default)r+   r9   rj   assignr   s        r%   _get_previous_field_defaultr~      s    $ *  4;;++d+ 	*v}}eoo>++"6==#6#6

C89L9LM01D1DEG&qz)	*	* r-   c                h   g }g }g }t        |       \  }}|D ]  }|j                  j                  |j                  |j                  }}
}	d}| j
                  |	   D ]@  }t        |t        j                        s|j                  s+d|j                         v s>|} n t        |t        j                        xr t        |d      }|rAt        d |j                  D              r%|j                  |	d       |j                  |	d       t!        |
      r.d}t        |
t        j"                        r|
j$                  }
nd}
d}n
d}d|	 d	|	 }d
\  }}|
|
j'                         }|rj|rWt)        |      }|r|\  }}|dk(  r|j'                         }n|dk(  rt*        }d|	 d	|j'                          d|	 dt*         d|	 
}nd|j'                         }nS|r3	 t-        t/        |j1                  d            j'                               }nt7        | |	      }|r|j'                         }|	}||d| z  }||d	| z  }|rm|j                  D cg c]  }|j8                  dk(  s| }}|rB|d   j                  j;                         r|j=                  |       n|j=                  |       |r|	|v r||f||	<   nJ|j=                  |       n8|	|v r||f||	<   n,|	|v r|	g|}|j                  |	       n|j=                  |       |r|j=                  |        t?        ||      \  }}d|v rdnd}||djA                  |      z   z  }|jC                  d      s|dz  }|s|r|dz  }|| djA                  |       z  }|rdjA                  |      nd}d| d| S # t2        t4        f$ r Y w xY wc c}w )z8Return an init method for a dataclass given the targets.Nzbuiltins.propertyF)check_scopec              3  t   K   | ]0  }|j                   d k(  xr |j                  j                           2 ywr\   r]   r^   s     r%   r&   z+_generate_dataclass_init.<locals>.<genexpr>  s9       v%Hgmm.F.F.H*HHr_   Trr   zself.ru   r5   r   r   z if z is z else rs   r2   r   selfzself, rv   z*, z
    passzdef __init__(z) -> None:
    )"rp   r8   r9   rW   rA   rE   r'   r
   FunctionDefr)   decoratornamesr>   r{   r*   r?   poprY   	Subscriptslice	as_stringr|   rG   strnextinfer_call_resultr   StopIterationr~   r@   rB   appendry   joinendswith)r+   assignsrL   paramskw_only_paramsassignmentsprev_pos_only_storeprev_kw_only_storer}   r9   rW   rA   property_nodeadditional_assignis_fieldinit_varassignment_strann_strdefault_strresultdefault_typedefault_nodeprevious_default	param_strkr2   prev_pos_onlyprev_kw_onlyparams_stringassignments_strings                                 r%   rC   rC      s;    F "NK.OPT.U++ r/"(--"4"4f6G6G%j 37!%T!2 	/1B1BC$//"&7&F&F&HH 1	 eUZZ0 
5Uu6
  $~~ 
 $''d3"&&tT2
#H*eoo6'--
 "
NH$TF#dV4N)! **,G+E217.L,#y0&2&<&<&>%)::&5#D6\-C-C-E,F G""&tO+<F4&J '
 $oo/!88>?IIK  ;4F.88: 	2gY'I"3{m,,I "'..GQAEEY4FqGGG1:##..0")))4MM),)),3[+A"4(%%i0 **-4k,B#D)++"&&t,i(~.er/h #@/#M< !M1BxM]TYYv%666M!!$' ~~dii&?%@AAM7B{3=/)9:L9MNNC #M2 ( Hs   1NN/N/N,+N,c              #    K   | j                   }t        |t        j                        s	t         y|j
                  |j                  }}||j                  |      E d{    |t        ||      E d{    yt         y7 %7 w)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	   )ctx)	r1   r'   r
   rT   r   rW   rA   infer_infer_instance_from_annotation)r+   r   r}   rW   rA   s        r%   infer_dataclass_attributer     sz      [[Ffeoo.))6<<J;;s;+++2:3GGG	 	,Gs$   AB!B"B8B	9B	Bc              #    K   t        | j                  t        j                  t        j                  f      st
        t        |       }|s	t         y|\  }}|dk(  r|j                  |      E d{    yt        |j                               j                  d   j                  }| j                  |_        |j                  |      E d{    y7 a7 w)z(Inference tip for dataclass field calls.r   r   Nr   )r'   r1   r
   rT   Assignr   r|   r   r   r   r   rH   rA   )r+   r   r   r   r   new_calls         r%   infer_dataclass_field_callr     s      dkkEOOU\\#BC!!%F &g9$}}S}111W..0166q9??H"kkHO~~c~222	 2 3s%   A0C2C3ACCCCc                   t        | t        j                        r| j                  } 	 t	        | j                               }t        |t              rQt        | t        j                        r| j                  |v S t        | t        j                        r| j                  |v S yt        |t        j                        xr0 |j                  |v xr  |j                         j                  t         v S # t        t        f$ r	 t        }Y w xY w)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
   r>   funcr   r   r   r   r   r   Namer9   	Attributeattrnamer   rF   DATACLASS_MODULES)r+   r$   inferreds      r%   r!   r!     s     $

#yy

% (O,dEJJ'99//dEOO,==O33 	8U../ 	6MM_,	6MMO  $55 M* s   C. .DDc                    | j                   }|sy|j                         }t        |t        j                        xr' t        |t        j
                        xr t        |      S )z^Return True if node was dynamically generated as the child of an AnnAssign
    statement.
    F)r1   scoper'   r
   rT   r(   r,   )r+   r1   r   s      r%   _looks_like_dataclass_attributer     sQ     [[FLLNE65??+ 	/uenn-	/'.r-   c                   |rl| j                         }|j                         }t        |t        j                        r1|j
                  %t        |t        j                        rt        |      sy	 t        | j                  j                               }t        |t        j                        sy|j                  t        k(  xr  |j!                         j                  t"        v S # t        t        f$ r Y yw xY w)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.
    F)	statementr   r'   r
   rT   rA   r(   r,   r   r   r   r   r   r   r9   
FIELD_NAMErF   r   )r+   r   stmtr   r   s        r%   r{   r{     s     ~~

tU__-

&5%..1+E2		)* h 1 12==J&T8==?+?+?CT+TT M* s   0#C# #C54C5c                   d\  }}| j                   D ]:  }|j                  dk(  r|j                  }|j                  dk(  s/|j                  }< ||d|fS |f|dt        j                  | j
                  | j                  | j                  | j                  | j                        }|j                  |g g        d|fS y)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.
    r5   r   r   N)r/   r0   r1   
end_linenoend_col_offset)r   re   r?   )r?   r@   rA   r
   r>   r/   r0   r1   r   r   postinit)
field_callr   r   rN   r   s        r%   r|   r|     s      *G_&& ,;;)#mmG[[--%mmO	, 6'!!?6::$$!,,$$!,,%44
 	R"E (**r-   c                   t         r*	 t        | j                               }t        |dd      dk(  S t        | t        j                        xr t        | j                  t        j                        xr | j                  j                  dk(  xs? t        | j                  t        j                        xr | j                  j                  dk(  S # t        t        f$ r Y yw xY w)z@Return True if node is a ClassVar, with or without subscripting.Fr9   rr   ClassVar)r   r   r   r   r   getattrr'   r
   r   rA   r   r9   r   r   r+   r   s     r%   rV   rV     s    	DJJL)H x,
:: dEOO, 4::uzz* 	*JJOOz)	.djj%//2 .JJ:-	 . 		s   C CCc                    t         syt        |       }t        |t        j                        xr |j                         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%   rX   rX   0  s:    $H8U^^, 	<NN ;;r-   c                    	 t        | j                               }t	        |dd      dk(  S # t        t        f$ r Y yw xY w)z@Return True if node is an InitVar, with or without subscripting.Fr9   rr   InitVar)r   r   r   r   r   r   s     r%   rY   rY   ;  sF    

% 8VR(I55 M* s   + ==)Dict	FrozenSetListSetr   c              #    K   d}	 t        | j                  |            }t        |t        j                        s	t         y|j                         j                  dv r.|j                  t        v r|j                          yt         y|j                          y# t        t        f$ r t         Y w xY ww)zInfer an instance corresponding to the type annotation represented by node.

    Currently has limited support for the typing module.
    Nr   >   rr   typing_collections_abc)r   r   r   r   r   r'   r
   r(   rF   r9   _INFERABLE_TYPING_TYPESinstantiate_class)r+   r   klasss      r%   r   r   Q  s      ETZZZ,- eU^^,			  

 ::00))++%%'' M* s(   B>B! B B>!B;8B>:B;;B>c                &   | j                  t        j                  t        t               | j                  t        j
                  t        t        d      t               | j                  t        j                  t        t        d      t               y )NT)raise_on_overwrite)register_transformr
   r(   rR   r,   r>   r   r   r{   r:   r   r   )managers    r%   registerr   l  sg    +-H 

0TJ( /DI'r-   )r+   nodes.ClassDefr$   frozenset[str]returnbool)r+   r   r   None)F)r+   r   r3   r   r   zIterator[nodes.AnnAssign])r+   r   r   r   )r+   r   r   zYtuple[dict[str, tuple[str | None, str | None]], dict[str, tuple[str | None, str | None]]])rh   (dict[str, tuple[str | None, str | None]]ri   r   r   ztuple[str, str])r+   r   r9   r   r   znodes.NodeNG | None)r+   r   r   zlist[nodes.AnnAssign]rL   r   r   r   r    )r+   nodes.Unknownr   context.InferenceContext | Noner   Iterator[InferenceResult])r+   
nodes.Callr   r   r   r   )r+   nodes.NodeNGr$   r   r   r   )r+   r   r   r   )T)r+   r   r   r   r   r   )r   r   r   _FieldDefaultReturn)r+   r   r   r   )r+   r   r   r   r   z*Iterator[UninferableBase | bases.Instance])r   r   r   r   )<__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   NodeNGr>   r   	frozensetDATACLASSES_DECORATORSr   r   rG   r,   rR   r7   r=   rp   ry   r~   rC   r   r   r!   r   r{   r|   rV   rX   rY   r   r   r    r-   r%   <module>r      sB  
 # $ ( ( ) ) ! / V V / * * A A	')
ell
*+	'#
$ejj
013  #>2 
D  ) =S


+9
	
/Cf (-
 $6< )
 ) )F<; 0&PO
PO#8POMQPOPOh AE
=0 >B3
3:33( ;Q
)7	<" +/U
U#'U	U<D(6 $  @D(
(<(/(6r-   