ML i÷UdZddlmZddlmZddlmZmZmZddl m Z m Z ddl m Z mZddlmZddlmZdd lmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3dd l4m5Z5m6Z6m7Z7dd l8m9Z9m:Z:m;Z;mm?Z?m@Z@dd lAmBZBddlCmDZDddlEmFZFmGZGddlHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQmRZRmSZSmTZTmUZUmVZVmWZWddlXmYZYerddlZm[Z[ddhZ\de]d<dZ^de]d<dZ_de]d<e!dddde^Z`de]d<dZade]d <d!Zbde]d"<Gd#d$ZcGd%d&Zdd3d'Zed4d(Zfd5d)Zgd6d*Zhd7d+Zid8d,Zj d9d-Zkd:d.Zld;d/Zmd8d0Zndyy{(&)93?8$8$8C88roc|jctj|jjj 5t |j||j|_dddyy#1swYyxYw)zoExpands type vars in the context of a subtype when an attribute is inherited from a generic super type.N)rfr9r~rjrrr:rg)rksub_types rmexpand_typevar_from_subtypez.DataclassAttribute.expand_typevar_from_subtypesh 99 **499+<+<+L+LM T3DIIxS  T T ! T Ts 'A11A:N)r_strr`z str | Noneraboolrbrrcrrdintrerrf Type | Nonergr+rhrrirrlr0returnNone)rxr+ryz/Literal['__init__', 'replace', '__post_init__']rr)rxr+rr)rxr+rr-)rr")rgr+rr"rlr0rr\)rr+rr) __name__ __module__ __qualname__rnr{r rwr classmethodrrrrormr\r\bs     *.- 8  $  -\    D L  99#+92Q9 99Tror\ceZdZdZ ddZddZddZddZddZ ddZ ddZ dd Z dd Z dd Z dd Z d dd ZddZd dZd!dZd"dZd#dZ d$dZy)%DataclassTransformeraImplement the behavior of @dataclass. Note that this may be executed multiple times on the same class, so everything here must be idempotent. This runs after the main semantic analysis pass, so you can assume that there are no placeholders. c<||_||_||_||_yr^)_cls_reason_specrj)rkrreasonspecrls rmrnzDataclassTransformer.__init__s     roc 4|jj}|j}|y|D]}|jy|j dd|j d|j j |j d|j j|j d|j j|j dd|j d dd }|jjj}|drzd |jvs|jd jrR|rO|Dcgc]<}|jr.|j|js|j!|d >}}|j"r|D]!}|j$t&k(st(|_#|Dchc]}|j*j,}}d } | |vr | dz } | |vr d} | |vr | dz } | |vr t/t1| t3t4j6dt8g|t/t1| t3t4j6dt:}t=|j|jd |t?|dr|jAd|drz|jjCd} tEtF|jHdztFzg| t3t4jJ} tMtN| |jtF<|dr]|ds&|jjQd|jRdD],} |jjCd} tUtF|jHdtFtWd|jHd| g| t3t4jJ}|jjCd}t/t1d||dt&g}|jA| }|D|js8|jXsJ|jjQd| d|jXt=|j|j| ||||/g}|jZddD]=}|j\jAd}|s!t_|r-|ja|?|drStcd |Dr|jjQd!||je|d"|jg|n?tcd#|Dr|jjQd$||je||dr|ji|||d%k\&|jk|||d rd'|jvs|jd'jr|d%k\r|jjCd(}|Dcgc]0}|jr"|jlsto|j,|2}}tq||jjCd)}ts|j|jd'||ju|jw||jjjd*k\r|jy|d+|jvr|j{||Dcgc]}|j}c}|dd,|j\d<ycc}wcc}wcc}wcc}w)-zApply all the necessary transformations to the underlying dataclass so as to ensure it is fully type checked according to the rules in PEP 557. NFinitTeqorderfrozenslots match_args)rrrrrrrnrygenerated_args_generated_kwargsargs return_type__eq__zbuiltins.object.z$"eq" must be True if "order" is True)__lt____gt____le____ge__) namespace)rvalues upper_bounddefault builtins.boolotherzYou may not have a custom "z" method when "order" is True)rrr}tvar_defrMc3(K|] }|d  ywrNr.0parents rm z1DataclassTransformer.transform..isQFvh''Qsz;Frozen dataclass cannot inherit from a non-frozen dataclass)settablec3&K|] }|d ywrrrs rmrz1DataclassTransformer.transform..nsM6(#Msz;Non-frozen dataclass cannot inherit from a frozen dataclass) )correct_version__match_args__ builtins.strbuiltins.tuple)r rr) attributesr)?rrgcollect_attributesrf _get_bool_argrrSrTrVrjrpython_versionnamesplugin_generatedra_is_kw_only_typer{fallback_to_anyrvrrrsr_rr-r<rEexplicitrrr4rAget named_typer,rRfullnamefrom_omitted_genericsr(rfailrrGrFnodemrometadata)_has_direct_dataclass_transform_metaclassappendany_propertize_callables_freeze add_slotsreset_init_only_varsrhr@rCr3%_add_dataclass_fields_magic_attribute_add_internal_replace_method_add_dunder_replace_add_internal_post_init_methodr)rkrgrattrdecorator_arguments py_versionrargexisting_args_names gen_args_namegen_kwargs_nameobj_typeself_tvar_expr method_nameorder_tvar_deforder_return_type order_argsexisting_methodparent_decorator_argumentsr parent_argsstr_typeliteralsmatch_args_types rm transformzDataclassTransformer.transforms yy~~,,.   Dyy  &&vt4$$T4::+@+@A''1I1IJ((4::3L3LM''7,,\4@  YY&&55   '4::-J1G1X1X'??4+@+@+K  * 5D ## +Cxx7*#*+EI&ISs||'8'8&I#&I 0 #'::!S(M$'::"4%)<<#s*O&)<<S/9K9K1LdT\]S179;M;M3NPTV_`  499jt   %"*"7+yy++,=>H( #n4 778 N*9~)NDJJ~ & w '&t, Et||TG!   99//0AB!,"}}oQ~&67 $--+/OP (#I$C$CD "%)II$8$8$I!S.9>4QXY #'((;"7".7W7W*////IINN5k]B_`',, $IIII# 1,+3! F&("hhqn ?F //--k:K #LV#T*11+> ? x (Q6PQQ \^bc  & &zE & B LL $M2LMM \^bc  & &z 2 w ' NN4Z7=RN S !!$ 3 -  2djjAQ6R6c6cg%yy++N;H'$??4<<DIIx0$H$ ($))2F2FGW2XYO "499dii9I? [ 224 ))*5 99   + +w 6  $ $Z 0 djj (  / / ;9CC4>>+C)(3&  k" ['JT$"Ds9A\2\ "5\\c |Dcgc]5}|jr'|j|jjd7}}t |j |jd|t |jjycc}w)zbAdd a `__replace__` method to the class, which is used to replace attributes in the `copy` module.rqr __replace__rN)rar{rrgr4rjrK)rkrrrs rmrz(DataclassTransformer._add_dunder_replacess#    TYY^^  :   II II %diinn5   s:Bc t|j|jt|Dcgc])}|j |jj d+c}t dycc}w)z Stashes the signature of 'dataclasses.replace(...)' for this specific dataclass to be used later whenever 'dataclasses.replace' is called for this dataclass. rqrT)rris_staticmethodN)r4rjrrYr{rgrArkrrs rmrz1DataclassTransformer._add_internal_replace_methodsQ  II II &MWXT$""499>>i"@X   Ys.A&c t|j|jt|Dcgc]5}|jr'|j |jj d7c}tycc}w)Nrrrr)r4rjrrZrbr{rgrArs rmrz3DataclassTransformer._add_internal_post_init_methods` II II ('##  O D !  s:A1c|s'|jjd|jy|Dchc]}|j}}|j|j|k7s|j j drJ|jjdj|jj|jytd|jddDry||_t|Dcgc]}|jjdc}|jjd}t|j|jd|ycc}wcc}w) NzPKeyword argument "slots" for "dataclass" is only valid in Python 3.10 and higher __slots__z;"{}" both defines "__slots__" and is used with "slots=True"c38K|]}|jduywr^)r)rps rmrz1DataclassTransformer.add_slots..s71qww$7srrrr)rjrrr_rrrformatrrrrCrr3)rkrgrrrgenerated_slotsr slots_types rmrzDataclassTransformer.add_slotss# IINNb   1;<499<< JJ "tzz_'D J  IINNMTTIINN    727 7 $ ;J KaTYY ! !. 1 K II !1 2  tyy$))[*M9=2 Ls E3"Ec|D]}|js|j|jvr|j|j=n|jsJ|jjj D]a}t |ts|js!|jd}t |tsA|j|jk(s[d|_ cy)zERemove init-only vars from the class and reset init var declarations.rN) rbr_rdefndefsbody isinstancerunanalyzed_typelvaluesr#r)rkrgrrstmtlvalues rmrz)DataclassTransformer.reset_init_only_varss /D99 * 499- ++++ IINN///D!$7D> %dnn.K.KAA$..Q Q Q/L %L Qs'BBBAB:B;BBc#K|jD]A}t|tr|t|ts)|j |Ed{Cy7wr^)rrrr!r)rkblockrs rmrz:DataclassTransformer._get_assignment_statements_from_blocksNJJ SD$/ D&)LLTRRR  SSs5AA A Ac|j}i}t|jjddD]1}d|jvrd|jvryd|jvr1|j j t|j|jddD]}|d}tj|||j }|j|j|||<|jjj|}|sq|js~t|jt r|j j#d|j4t%}|j'd |j(j*} |j-|j.D]9} | j0s| j2d } t| t4s1|jjj| j6} | c| j} t| t8rJt| t:r|j j#d | t| t<rt| t sJ| | j>rd }tA| jB}t|tDr/|jBjd k(rd}|jFd | _!|jI|rd} |jK| jL\}}|jd}||jO| jL}n$tQ|j jS|}d }|rd|vxs d|vxsd|v}nt| jLtTsd}|s|j(tVurd| _,| }|jd }|F|j jS|}||}n&|j j#d| jL| jB| jZrw| j\rk|j j_| jLd}|r|| _!n:|j j#d| tatbjd| _!d}d|vrd|j jg|d}|D|j j#thjj| jLtljn|jq| j6tsjt|j jvjx5|j{| | j6| }dddt| j6||||| j|| j~|j|t|j|j  || j6<<t|j}|jdd }d }|D]}|rq|jre|jsY|jsM|}|j6|vr!t|j||j~}|j j#d||xs|jxr |j}|rh|jI|jBrM|}|j6|vr!t|j||j~}|j j#d||xs|jI|jB} |S#1swYxYw)a@Collect all attributes declared in the dataclass and its parents. All assignments of the form a: SomeType b: SomeOtherType = ... are collected. Return None if some dataclass base class hasn't been processed yet and thus we'll need to ask for another pass. rr dataclass_tagrMNrr_z?Dataclass attribute may only be overridden by another attributerhrzFType aliases inside dataclass definitions are not supported at runtimeFzdataclasses.InitVarTrrdefault_factoryfactoryz,"kw_only" argument must be a boolean literal)is_finalzGNeed type argument for Final[...] with non-literal default in dataclassr`)code) r_r`rarbrcrdrerfrgrhrirlc|jSr^)rh)as rmz9DataclassTransformer.collect_attributes..s QYYro)key)rdrez>Attributes without a default cannot follow attributes with onez:There may not be more than one field with the KW_ONLY type)Hrreversedrgrrrjadd_plugin_dependencyr8rr\rrrrrrr-rsetrrrUrr new_syntaxrr#r_r%r*r is_classvarrJrfr?rr_collect_field_argsrvalue+_get_default_init_value_for_field_specifierr parse_boolr)rXimplicitr  is_inferredanalyze_simple_literal_typer<rE from_errorparse_str_literalr %DATACLASS_FIELD_ALIAS_MUST_BE_LITERALr LITERAL_REQaddr9r~rr_infer_dataclass_attr_init_typerdrerlistrsortrarcrhr)rkr found_attrsrgrr_rsym_nodecurrent_attr_namesrhrlhssymrrb node_typehas_field_call field_argsis_in_init_paramrarc is_kw_onlyfield_kw_only_paramvaluerr` init_type all_attrs found_defaultfound_kw_sentinelcontexts rmrz'DataclassTransformer.collect_attributes sAii68 SXX\\!B/0 D$--/Kt}}4T$--/ II + +,A$--,P Q k2<@  L)55dD$))L00:$( D!88>>--d3 jPS6TIINNY   8(+u$$Y 0J0JK>>sxxHK D??,,q/Cc8,((..$$SXX.C{88D!$8 88$ * ]$ *dC( .$ .( K' 2I9h/NN++/DD" %NN1- $$Y/)-)A)A$++)N &NJ)~~f5 '!MMdkkZ !$))"6"67G"HI K+/(J6/!J.   X6" 4::1P#P $  J#-.."; ". ,,-@A$!&JIINN#QSWS^S^_xxDMMd6F6F ii;;DKKRV;W #DIIINNa!( (<(< =DIE*$ 33Jw4GH=IINN(NN '33#  " "388 ,**499+<+<+L+LM V @@chhPTU  V$6XX%''YY{{XX"0YHH1II%K !yK Z++-. ./  ! VD9I9IRVR^R^$'99 22%499T[[IG TV]*Sd.>.>.R4??M T%:%:499%E99 22%499T[[IG PRY!2 UT5J5J4995U - V.e V Vs ]] c|jj}|D]}|jr|jj |j }|2|j }t|tsT|jrad|_ i|j|}||_d|_ |jdz|j z|_ tt||j|j <y)zaConverts all attributes to @property methods in order to emulate frozen classes. NTr)rrgrirrr_rrr-r  is_propertyrwr _fullnamer(r)rkrrgrr;vars rmrzDataclassTransformer._freezesyy~~ BD 33zz~~dii0H#mmc3'|| &*COkk$'"& $  3chh > '6tS'A 388$) Brocb|jj}|D]}tt|jt s'|j |}||_d|_||_|jdz|jz|_ tt||j|j<y)aConverts all attributes with callable types to @property methods. This avoids the typechecker getting confused and thinking that `my_dataclass_instance.callable_attr(foo)` is going to receive a `self` argument (it is not). TrN)rrgrrJrfr=rwrLis_settable_propertyrr_rMr(rr)rkrrrgrrNs rmrz*DataclassTransformer._propertize_callables syy~~ BD/$))4lCkk$'"&+3( $  3chh > '6tS'A 388$ Brocr|yt|}t|tsy|jjdk(S)z=Checks if the type of the node is the KW_ONLY sentinel value.Fzdataclasses.KW_ONLY)rJrr?rfr)rkrr?s rmrz%DataclassTransformer._is_kw_only_types7 <#D) )X.~~&&*???roc.d}ttj}|jtur"|j j d|gxs|}n|}|j jd|j jd|g}t||}|jj|_ |jjjdz|z|_ d|_ tt|d|jjj |<y) N__dataclass_fields__rOz builtins.dictr)r_rfrT)rvrr)r<rErrrXrjnamed_type_or_nonerr-rrgrrMr*r(rr)rk attr_nameany_type field_type attr_typerNs rmrz:DataclassTransformer._add_dataclass_fields_magic_attribute(s* 9--. ::8 8556IH:VbZbJ!JII(( dii22>BJO yy199>> //#5 A *9C$+  Y'roct|trt|jtr|jj|j j vri}t|j|j|jD]k\}}}|jsL|jdrd}n|j tur?d}|jj||difcS|J|||<md|fSdifS)zReturns a tuple where the first value represents whether or not the expression is a call to dataclass.field and the second is a dictionary of the keyword arguments that field() was called with. T)starz0Unpacking **kwargs in "field()" is not supportedz."field()" does not accept positional argumentsF)rrcalleer&rrrWzip arg_namesr arg_kindsis_namedrXrjr)rkexprrr_rrvmessages rmr+z(DataclassTransformer._collect_field_args@s tX &4;;0 $$ (C(CCD#&t~~tyy$..#Q !c4}}}}$}/#U+JJ !"RIINN7D18O''' T % !&: byroc$t|jtr6tt |j |j|j ||S|j jj|}|t|j |||S|Sr^) rrrr2r.rrjkeywordsrr7)rkr_r expressions rmrz"DataclassTransformer._get_bool_argbsw dllJ // 4<<CT7  YY''++D1  !0JgV Vroct|tsyt|}|y|jd}|yt |j t d}|t|dk7ry|dS)aX Find a default value for the `init` parameter of the specifier being called. If the specifier's type signature includes an `init` parameter with a type of `Literal[True]` or `Literal[False]`, return the appropriate boolean value from the literal. Otherwise, fall back to the standard default of `True`. Trrrr)rrr1argument_by_namer;rrlen)rkcallspecifier_type parameterrs rmr-z@DataclassTransformer._get_default_init_value_for_field_specifierqsm$))$/  !"33F;  1)--W  s8}1{roc8|j}|jr|St|j}t|ts|S|jj d}|r:t|j tr|jjd}|sJ|jr+tt|j|j|}nttjSt|tr7|jtttgk(rt!|j"d|S|j$j'd|jj(d||S|j$j'd|jj(d||S)zvInfer __init__ argument type for an attribute. In particular, possibly use the signature of __set__. __set__z(Unsupported signature for "__set__" in ""zUnsupported "__set__" in ")rfr/rJrr?rrrget_containing_type_infor:r<rE unannotatedr=r^rr arg_typesrjrr_) rkr>r_rJrtsetter super_info setter_types rmr7z4DataclassTransformer._infer_dataclass_attr_init_typesH(( <<N CHH % !X&NI& &++w/VV< 3;3H3H3KQOOIINNB166;;-qQSZ  !;AFFKK=JGTroN) rrrzExpression | Statementrrrlr0rr)rr)rlist[DataclassAttribute]rr)rgr+rrvrrrr)rgr+rrvrr)rr!rIterator[AssignmentStmt])rrrrw)rzlist[DataclassAttribute] | None)T)rrvrrrr)rrrr)rr)r`rrz"tuple[bool, dict[str, Expression]])r_rrrrr)rhrrr)r>r(r_rrJrrr)rrr__doc__rnrrrrrrrrrrrrrr+rr-r7rrormrrs    '  % -   m^      (N(N*B(NX\(N (NT/"RR !RScJB8FJB2B>BB B(@ 0 D 0*"**-*8?* *rorc"i|jd<y)Nr)rrgs rmadd_dataclass_tagr{s%'DMM/"rocBt|jjy)zRecord that we have a dataclass in the main semantic analysis pass. The later pass implemented by DataclassTransformer will use this to detect dataclasses in base classes. N)r{rrgctxs rmdataclass_tag_callbackrs cggll#rocdtd|jjjDr2|jj d|jjyt |j|jt|j|j}|jS)zIHooks into the class typechecking process to add support for dataclasses.c34K|]}|jywr^)is_named_tuple)ris rmrz1dataclass_class_maker_callback..s 61   6sz"A NamedTuple cannot be a dataclassr}T) rrrgrrlrrr_get_transform_specr)r~ transformers rmdataclass_class_maker_callbackrsx 6SWW\\%5%5 66  9sww|| L& 0g}|jD]'}t|}t ||||}||||z }&d})|St|t r!t |t|j ||St|tr_|jjt}|y|j}t|tsJt|tsJt||gSy)a  For a given type, determine what dataclasses it can be: for each class, return the field types. For generic classes, the field types are expanded. If the type contains Any or a non-dataclass, returns None; in the latter case, also reports an error. N)rrIrelevant_itemsrJ _get_expanded_dataclasses_fieldsrGrr?rf get_methodrYrBr=r ) r~r display_typ parent_typretitem item_types replace_sym replace_sigs rmrrs#y!)+&&( D"4(D9#tT:VJ:#9z!   C %/ 1;    C "hh))*DE  !&& +z222+|444' S9::roc ~t|dj|dj|djDcic] \}}}|||f }}}}|ddD]}t|j|j|jDcic] \}}}|||f }}}}g|j |j D]u}|j |t tf\}}|j |t tf\} } t|| || cxk(r tk(r nntntf||<w|djt|j |jD cgc]\}} | c} }|jD cgc]\} }| c}} Scc}}}wcc}}}wcc} }wcc}} w)zX Produces the lowest bound of the 'replace' signatures of multiple dataclasses. rrN)r]rqr^) r\r]rqr^keysrrHrr r copy_modifiedr8r) sigsr_rrvrsigsig_argssig_typsig_kindsig2_typ sig2_kindrs rm_meet_replace_sigsrs #47#4#4d1g6G6GaIZIZ[   D#t sDk D  ABx $'s}}cmmS]]#S  c4 3+   5diik4HMMO4 D $0A=/Q R GX"*,,to6G5W"X Hi7H-!)Y!G-!G YDJ   7 tyy{#%)[[]36333'+{{}5GAt45 ! %   45sF%F, . F3  F9c t|jdk7rJ|jjd|jj d|j |jSt|jddk7r |jS|jdd}t|jj|}t||jj}t||||}| |jSt|}|jdg|jtg|j |g|j"||jj$|jj d|S) z Returns a signature for the 'dataclasses.replace' function that's dependent on the type of the first positional argument. rmrnz " has unexpected type annotationrrNz of )r]r^rqret_typefallbackr_)rgrrlrdefault_signaturer_rJrJget_expression_typer rrrrr]rr^rqr)r~obj_argr inst_type_str replace_sigsrs rmreplace_function_sig_callbackr4sS  388}  q..3344TUWZWbWbc$$$ 388A;1$$$hhqk!nGsww::7CDH$Xsww?M3C8XVL$$$$\2K  $ $0+//03[2234k334&&//%%**+4  ? % roc8t|xrd|jvS)NrM)rrrzs rmis_processed_dataclassrTs : 6+66roc j|jyt|jtsJ|jt}| |jJ|j}t|t sJt|t sJ|jd}|j|j|ddddd|y)Nrr)r_rMF)overrideoriginalr_ name_in_super supertypeoriginal_class_or_staticoverride_class_or_staticr) rfrr>rrZrBr=rcheck_override)rlr rgideal_sig_method ideal_sigs rmcheck_post_initrXs yy dii .. .'CD  ',<,A,A,MM M %%I i ,, , i .. .''_'=I %!&!&  roN)rgr+rr)r~r.rr)r~r.rr)rrrr)rr$rr)rgr+rr) r~r/rrBrrBrrBrzlist[CallableType] | None)rzlist[CallableType]rr=)r~r/rr=)rlrLr r rgr+rr)prx __future__rcollections.abcrtypingrrrmypyrr mypy.expandtyper r mypy.meetr mypy.messagesr mypy.nodesrrrrrrrrrrrrrrrrrrr r!r"r#r$r%r&r'r(r)r*r+r,r- mypy.pluginr.r/r0mypy.plugins.commonr1r2r3r4r5mypy.semanal_sharedr6r7mypy.server.triggerr8 mypy.stater9 mypy.typeopsr:r; mypy.typesr<r=r>r?r@rArBrCrDrErFrGrHrIrJ mypy.typevarsrK mypy.checkerrLrN__annotations__rPrRrXrYrZr\rr{rrrrrrrrrrrrormrst3"$00-@ *!!!!!!!!!D]\]5P"(('(?@%@$NEN)?/ *%5E4&8e8jTjTZd d N( $#( ",;ES]J:@7ro