
    %^g"                      U d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	m
Z
mZmZ ddlZddlZddlZddlZddlZddlZddlmZ ddlmZmZ ddlmZmZ ddlmZmZmZmZm Z  dd	l!m"Z"m#Z# dd
l$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZO ddlPmQZR ddlSmTZT ddlUmVZVmWZW ddlXmYZYmZZZ ddl[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZemfZfmgZgmhZhmiZi ddlmjZjmkZkmlZlmmZm ddlnmoZompZpmqZqmrZrmsZsmtZtmuZumvZvmwZwmxZx ddlymzZz g dZ{de|d<   g dZ}de|d<   h dZ~de|d<    G d d      ZQ G d d      ZdZde|d<   dZde|d<   d Zde|d <   d!Zde|d!<   d"Zde|d"<   d#Zde|d#<   d$Zde|d%<    G d& d'eze         ZdMd(ZdNd)Z G d* d+ej                  j                        ZdMd,ZdOd-Z G d. d/ej                   j"                        Z G d0 d1e]ej                  j                        ZdPd2Z G d3 d4ej                  j                        ZdQd5ZdRd6ZdSd7ZdTd8ZdUd9ZdVd:Z	 	 	 	 	 	 dWd;Z	 	 	 	 	 	 	 	 	 	 dXd<ZdYd=ZdZd>Z	 	 	 	 	 	 	 	 	 	 d[d?Zd\d@Zd]dAZ	 	 	 	 	 	 	 	 	 	 d^dBZdCdCdCdCdCdDdE	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d_dFZd`dGZdHZdIZdadJZdbdcdKZedLk(  r e        yy)da,  Generator of dynamically typed draft stubs for arbitrary modules.

The logic of this script can be split in three steps:
* parsing options and finding sources:
  - use runtime imports be default (to find also C modules)
  - or use mypy's mechanisms, if importing is prohibited
* (optionally) semantically analysing the sources using mypy (as a single set)
* emitting the stubs text:
  - for Python modules: from ASTs using ASTStubGenerator
  - for C modules using runtime introspection and (optionally) Sphinx docs

During first and third steps some problematic files can be skipped, but any
blocking error during second step will cause the whole program to stop.

Basic usage:

  $ stubgen foo.py bar.py some_directory
  => Generate out/foo.pyi, out/bar.pyi, and stubs for some_directory (recursively).

  $ stubgen -m urllib.parse
  => Generate out/urllib/parse.pyi.

  $ stubgen -p urllib
  => Generate stubs for whole urllib package (recursively).

For C modules, you can get more precise function signatures by parsing .rst (Sphinx)
documentation for extra information. For this, use the --doc-dir option:

  $ stubgen --doc-dir <DIR>/Python-3.4.2/Doc/library -m curses

Note: The generated stubs should be verified manually.

TODO:
 - maybe use .rst docs also for Python modules
 - maybe export more imported names if there is no __all__ (this affects ssl.SSLError, for example)
   - a quick and dirty heuristic would be to turn this on if a module has something like
     'from x import y as _y'
 - we don't seem to always detect properties ('closed' in 'io', for example)
    )annotationsN)FinalIterableIterator)build)CompileErrorErrors)InvalidSourceListcreate_source_list)BuildSourceFindModuleCacheModuleNotFoundReasonSearchPathsdefault_lib_path)ModuleInspectis_pyc_only)+	ARG_NAMEDARG_POSARG_STAR	ARG_STAR2IS_ABSTRACTNOT_ABSTRACTAssignmentStmtBlock	BytesExprCallExprClassDefComparisonExprComplexExpr	DecoratorDictExprEllipsisExpr
ExpressionExpressionStmt	FloatExprFuncBaseFuncDefIfStmtImport	ImportAll
ImportFrom	IndexExprIntExprListExpr
MemberExprMypyFileNameExprOpExprOverloadedFuncDefSetExprStarExpr	StatementStrExprTempNode	TupleExprTypeAliasStmtTypeInfo	UnaryExprVar)Options)MAGIC_METHODS_POS_ARGS_ONLY)ArgSigFunctionSig)InspectionStubGeneratorgenerate_stub_for_c_module)TYPING_BUILTIN_REPLACEMENTSBaseStubGenerator
CantImport	ClassInfoFunctionContextcommon_dir_prefixfail_missingfind_module_path_and_all_py3generate_guardedinfer_method_arg_typesinfer_method_ret_typeremove_misplaced_type_commentsreport_missingwalk_packages)all_yield_expressionshas_return_statementhas_yield_expressionhas_yield_from_expression)
OVERLOAD_NAMESTPDICT_NAMESTYPED_NAMEDTUPLE_NAMESAnyTypeCallableTypeInstance	TupleTypeTypeUnboundTypeget_proper_type)NodeVisitor)packagesvendorvendored_vendor_vendored_packagesr   VENDOR_PACKAGES)z/six.py
z
/vendored/z/vendor/z	/_vendor/z/_vendored_packages/	BLACKLIST>   __eq____ge____gt____le____lt____ne____hash____iter__METHODS_WITH_RETURN_VALUEc                  `    e Zd ZdZ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZy)r>   zPRepresents stubgen options.

    This class is mutable to simplify testing.
    c                    || _         || _        || _        || _        || _        || _        || _        || _        || _        |	| _	        |
| _
        || _        || _        || _        || _        || _        || _        || _        y N)	pyversion	no_importinspectdoc_dirsearch_pathinterpreterdecointerpreter
parse_onlyignore_errorsinclude_private
output_dirmodulesra   filesverbosequietexport_lessinclude_docstrings)selfrt   ru   rv   rw   rx   ry   r{   r|   r}   r~   r   ra   r   r   r   r   r   s                     ,lib/python3.12/site-packages/mypy/stubgen.py__init__zOptions.__init__   s    * #"&&*$*.$ 

&"4    N)$rt   tuple[int, int]ru   boolrv   r   rw   strrx   	list[str]ry   r   r{   r   r|   r   r}   r   r~   r   r   r   ra   r   r   r   r   r   r   r   r   r   r   r   returnNone)__name__
__module____qualname____doc__r    r   r   r>   r>      s    
&5"&5 &5 	&5
 &5 &5 &5 &5 &5 &5 &5 &5 &5 &5 &5  !&5" #&5$ !%&5& 
'&5r   r>   c                  V    e Zd ZdZ	 d	 	 	 	 	 	 	 ddZd	dZed	d       Zed
d       Zy)
StubSourcezA single source for stub: can be a Python or C module.

    A simple extension of BuildSource that also carries the AST and
    the value of __all__ detected at runtime.
    Nc                D    t        ||d       | _        || _        d | _        y rs   )r   sourceruntime_allast)r   modulepathr   s       r   r   zStubSource.__init__   s#     "$5&$(r   c                "    d| j                    dS )NzStubSource())r   r   s    r   __repr__zStubSource.__repr__   s    T[[M++r   c                .    | j                   j                  S rs   )r   r   r   s    r   r   zStubSource.module   s    {{!!!r   c                .    | j                   j                  S rs   )r   r   r   s    r   r   zStubSource.path   s    {{r   )NN)r   r   r   
str | Noner   list[str] | Noner   r   )r   r   )r   r   )	r   r   r   r   r   r   propertyr   r   r   r   r   r   r      s`     UY))!+)AQ)	), " "    r   r   EMPTYFUNCCLASSEMPTY_CLASSVAR
NOT_IN_ALLz<ERROR>ERROR_MARKERc                       e Zd ZdZd fdZddZddZddZddZ	 	 	 	 ddZ	ddZ
dd	Zdd
ZddZddZddZd dZd!dZd"dZd#dZd$dZd%dZ xZS )&AliasPrinterzVisitor used to collect type aliases _and_ type variable definitions.

    Visit r.h.s of the definition to get the string representation of type alias.
    c                0    || _         t        | 	          y rs   )stubgensuperr   )r   r   	__class__s     r   r   zAliasPrinter.__init__  s    r   c                T   |j                   j                  |       }g }t        |j                  |j                  |j
                        D ]  \  }}}|t        k(  r!|j                  |j                  |              1|t        k(  r$|j                  d|j                  |       z          ^|t        k(  r$|j                  d|j                  |       z          |t        k(  r&|j                  | d|j                  |               t        d| d       | ddj                  |       dS )	N***=zUnknown argument kind z in call(, r   )calleeacceptzip	arg_namesargs	arg_kindsr   appendr   r   r   
ValueErrorjoin)r   noder   r   nameargkinds          r   visit_call_exprzAliasPrinter.visit_call_expr  s     ##D)"4>>499dnnMOD#twCJJt,-!C#**T"223"D3::d#334"tfAcjj&6%789 #9$x!HII  N 499T?+1--r   c                    | j                   j                  |      }|t        v r$| j                   j                  t        |   d      S t	        |      }| j                   j
                  j                  |       |S )NF)require)r   get_fullnamerD   add_nameget_qualified_nameimport_trackerrequire_name)r   r   fullnamequalnames       r   _visit_ref_exprzAliasPrinter._visit_ref_expr'  sg    <<,,T222<<(()DX)NX](^^%d+##00:r   c                $    | j                  |      S rs   r   r   r   s     r   visit_name_exprzAliasPrinter.visit_name_expr/  s    ##D))r   c                $    | j                  |      S rs   r   r   os     r   visit_member_exprzAliasPrinter.visit_member_expr2  s    ##A&&r   c                ,    t        |j                        S rs   )reprvaluer   s     r   _visit_literal_nodez AliasPrinter._visit_literal_node5  s     DJJr   c                $    | j                  |      S rs   r   r   s     r   visit_str_exprzAliasPrinter.visit_str_expr:      ''--r   c                *    d| j                  |       S )Nbr   r   s     r   visit_bytes_exprzAliasPrinter.visit_bytes_expr=  s    4++D1233r   c                $    | j                  |      S rs   r   r   s     r   visit_int_exprzAliasPrinter.visit_int_expr@  r   r   c                $    | j                  |      S rs   r   r   s     r   visit_float_exprzAliasPrinter.visit_float_exprC  r   r   c                $    | j                  |      S rs   r   r   s     r   visit_complex_exprzAliasPrinter.visit_complex_exprF  r   r   c                   | j                   j                  |j                        }|dk(  rwt        |j                  t
              rBdj                  |j                  j                  D cg c]  }|j                  |        c}      S |j                  j                  |       S |dk(  rSt        |j                  t
              r| j                   j                  d      S |j                  j                  |        dS |j                  j                  |       }|j                  j                  |       }t        |      dkD  r'|j                  d      r|j                  d      r|d	d
 }| d| dS c c}w )Nztyping.Unionz | ztyping.Optional_typeshed.Incomplete | None   r   r      [])r   r   base
isinstanceindexr9   r   itemsr   r   len
startswithendswith)r   r   base_fullnameitemr   r   s         r   visit_index_exprzAliasPrinter.visit_index_exprI  s1   11$))<N*$**i0zzAQAQ"RAQ4;;t#4AQ"RSS::$$T**--$**i0||,,-CDDjj''-.g66yy%

!!$'u:>e..s3s8K!BKEqq!! #Ss   (E-c                T     ddj                   fd|j                  D               dS )Nr   r   c              3  @   K   | ]  }|j                          y wrs   r   .0nr   s     r   	<genexpr>z0AliasPrinter.visit_tuple_expr.<locals>.<genexpr>Z       @ZQXXd^Z   r   r   r   r   s   ` r   visit_tuple_exprzAliasPrinter.visit_tuple_exprY  &    499@TZZ@@ACCr   c                T     ddj                   fd|j                  D               dS )Nr   r   c              3  @   K   | ]  }|j                          y wrs   r   r   s     r   r  z/AliasPrinter.visit_list_expr.<locals>.<genexpr>]  r  r  r   r  r   s   ` r   visit_list_exprzAliasPrinter.visit_list_expr\  r  r   c                    g }|j                   D ]K  \  }}t        |t              sJ |j                  |j	                  |        d|j	                  |               M ddj                  |       dS )N: {r   })r   r   r7   r   r   r   )r   r   
dict_itemskeyr   s        r   visit_dict_exprzAliasPrinter.visit_dict_expr_  sq    
''JCc7+++D!1 2"U\\$5G4HIJ " DIIj)*"--r   c                     y)N...r   r   s     r   visit_ellipsiszAliasPrinter.visit_ellipsisg  s    r   c                    |j                   j                  |        d|j                   d|j                  j                  |        S )N )leftr   oprightr   s     r   visit_op_exprzAliasPrinter.visit_op_exprj  s9    &&--%&avQqww~~d/C.DEEr   c                >    d|j                   j                  |        S )Nr   )exprr   r   s     r   visit_star_exprzAliasPrinter.visit_star_exprm  s    166==&'((r   )r   ASTStubGeneratorr   r   )r   r   r   r   )r   zNameExpr | MemberExprr   r   )r   r1   r   r   )r   r/   r   r   )r   z7StrExpr | BytesExpr | IntExpr | FloatExpr | ComplexExprr   r   )r   r7   r   r   )r   r   r   r   )r   r-   r   r   )r   r%   r   r   )r   r   r   r   )r   r,   r   r   )r   r9   r   r   )r   r.   r   r   )r   r!   r   r   )r   r"   r   r   )r   r2   r   r   )r   r5   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r	  r  r  r  r  __classcell__r   s   @r   r   r     su    
.$*' K 	 
.4..." DD.F)r   r   c                P    t               }| j                  |       |j                  S rs   )DefinitionFinderr   namesfilefinders     r   find_defined_namesr&  q  s     FKK<<r   c              #     K   | D ]O  }t        |t              r|j                   "t        |t              s3t	        |j
                        E d {    Q y 7 wrs   )r   r1   r   r9   get_assigned_namesr   )lvalueslvalues     r   r(  r(  w  sE     fh'++	*)&,,777	  8s   5AAAAc                  8    e Zd ZdZddZd	dZd
dZddZddZy)r!  z:Find names of things defined at the top level of a module.c                "    t               | _        y rs   )setr"  r   s    r   r   zDefinitionFinder.__init__  s    "u
r   c                N    | j                   j                  |j                         y rs   r"  addr   r   s     r   visit_class_defz DefinitionFinder.visit_class_def      

qvvr   c                N    | j                   j                  |j                         y rs   r/  r   s     r   visit_func_defzDefinitionFinder.visit_func_def  r2  r   c                n    t        |j                        D ]  }| j                  j                  |        y rs   )r(  r)  r"  r0  )r   r   r   s      r   visit_assignment_stmtz&DefinitionFinder.visit_assignment_stmt  s%    &qyy1DJJNN4  2r   c                b    | j                   j                  |j                  j                         y rs   r/  r   s     r   visit_type_alias_stmtz&DefinitionFinder.visit_type_alias_stmt  s    

qvv{{#r   Nr   r   r   r   r   r   r   r'   r   r   r   r   r   r   r   r:   r   r   )	r   r   r   r   r   r1  r4  r6  r8  r   r   r   r!  r!    s    D%!$r   r!  c                P    t               }| j                  |       |j                  S rs   )ReferenceFinderr   refsr#  s     r   find_referenced_namesrA    s     FKK;;r   c                D    t        | t              xr | j                  dk(  S )Nr   )r   r1   r   )r  s    r   is_none_exprrC    s    dH%=$))v*==r   c                  `     e Zd ZdZd
dZd fdZddZd fdZddZddZ	ddZ
dd	Z xZS )r?  z1Find all name references (both local and global).c                "    t               | _        y rs   )r-  r@  r   s    r   r   zReferenceFinder.__init__  s    !e	r   c                >    |j                   st        | 	  |       y y rs   is_unreachabler   visit_block)r   blockr   s     r   rI  zReferenceFinder.visit_block  s    ##G& $r   c                N    | j                   j                  |j                         y rs   )r@  r0  r   )r   es     r   r   zReferenceFinder.visit_name_expr  s    		affr   c                n    | j                  |j                  j                         t        |   |       y rs   )add_reftyper   r   visit_instance)r   tr   s     r   rP  zReferenceFinder.visit_instance  s$    QVV[[!q!r   c                T    |j                   r| j                  |j                          y y rs   )r   rN  )r   rQ  s     r   visit_unbound_typez"ReferenceFinder.visit_unbound_type  s    66LL  r   c                H    |j                   D ]  }|j                  |         y rs   )r   r   )r   rQ  r   s      r   visit_tuple_typez ReferenceFinder.visit_tuple_type  s    GGDKK r   c                ~    |j                   D ]  }|j                  |         |j                  j                  |        y rs   )	arg_typesr   ret_type)r   rQ  r   s      r   visit_callable_typez#ReferenceFinder.visit_callable_type  s.    ;;CJJt 	

$r   c                    | j                   j                  |       d|v r6|j                  dd      d   }| j                   j                  |       d|v r5y y )N.r   r   )r@  r0  rsplit)r   r   s     r   rN  zReferenceFinder.add_ref  sG    		hXosA.q1HIIMM(# Xor   r9  )rJ  r   r   r   )rL  r1   r   r   )rQ  r[   r   r   )rQ  r^   r   r   )rQ  r\   r   r   )rQ  rZ   r   r   )r   r   r   r   )r   r   r   r   r   rI  r   rP  rS  rU  rY  rN  r  r  s   @r   r?  r?    s.    ;$'"!
 $r   r?  c                      e Zd ZdZ	 	 	 	 	 d+	 	 	 	 	 	 	 	 	 	 	 d, fdZed-d       Zd. fdZd/dZd0dZ	d1dZ
d2dZd3d	Zd4d
Zd5dZd5dZd6dZd7 fdZd8dZd8dZd9dZd: fdZd;dZd<dZd<dZd=dZd>dZd<dZd>dZd?dZd@dAdZdBdZdCdZ dD fdZ!dEdZ"dFd Z#dGd!Z$	 dH	 	 	 	 	 	 	 dId"Z%dJd#Z&dKdLd$Z'dMd%Z(dNd&Z)	 dO	 	 	 	 	 	 	 dPd'Z*dQd(Z+dRd)Z,dS fd*Z- xZ.S )Tr  z#Generate stub text from a mypy AST.c                    t         |   ||||       g | _        g g| _        t        | _        g | _        || _        t               | _	        d| _
        d| _        y NF)r   r   _decorators_varsr   _state_class_stackanalyzedr-  method_namesprocessing_enumprocessing_dataclass)r   _all_r}   rd  r   r   r   s         r   r   zASTStubGenerator.__init__  sZ     	>PQ&(')d
,. &)e$$)!r   c                <    | j                   r| j                   d   S d S )Nr   )rc  r   s    r   _current_classzASTStubGenerator._current_class  s     (,(9(9t  $CtCr   c                    |j                   | _        |j                  | _        | j                  t	        |             t        |      | _        t        | !  |       | j                          y rs   )
r   module_namer   set_defined_namesr&  rA  referenced_namesr   visit_mypy_filecheck_undefined_namesr   r   r   s     r   ro  z ASTStubGenerator.visit_mypy_file  sT    ::FF	1!45 5a 8"""$r   c                   d}|j                   D ]  }t        |t              s| j                  |j                  j
                  |j                  j                        rO| j                  |       |s5| j                  |j                         |j                  j                  sd}|j                  j                  r| j                  |j                         | j                           y)zD@property with setters and getters, @overload chain and some others.FTN)r   r   r    is_private_namefuncr   r   process_decoratorr4  is_overloadclear_decorators)r   r   overload_chainr   s       r   visit_overloaded_func_defz*ASTStubGenerator.visit_overloaded_func_def  s    GGDdI.##DIINNDII4F4FG""4(!##DII.99((%)N&&##DII. %%' r   c                    | j                  ||      }| j                  ||      }| j                  |      }t        |j                  |||      S rs   )_get_func_args_get_func_returnformat_type_argsrA   r   )r   func_defctxr   retname	type_argss         r   get_default_function_sigz)ASTStubGenerator.get_default_function_sig  sK    ""8S1''#6))(3	8==$CCr   c           
        g }|j                   t        v}d}t        |j                        D ]  \  }}|j                  }|j
                  }	|j                   }
t        |j                  t              r|j                  j                  |   nd }|dk(  xr |
dk(  }|dk(  xr |
dk(  }d }|r.|s,|s*t        t        |      t              s| j                  |      }|r|j                  r|dz  }|	j                         r,t        d |D              s|j!                  t#        d             d}|j$                  rP|s| j'                  |j$                  dd	      }| j)                  |j$                        \  }}|r.t+        |      d
k  r |}n|	t,        k(  rd|
 }
n|	t.        k(  rd|
 }
|j!                  t#        |
|t1        |j$                        |              |r|j3                  |t#        d             |j4                  Yt7        d |D              rGt9        |j                   |j4                  j:                  |D cg c]  }|j                    c}      }||}|S c c}w )Nr   r   clsr   c              3  R   K   | ]  }|j                   j                  d        ! yw)r   N)r   r   r   r   s     r   r  z2ASTStubGenerator._get_func_args.<locals>.<genexpr>&  s      *Tt388+>+>s+Cts   %'r   r  TF   r   )defaultdefault_value/c              3  X   K   | ]"  }|j                   d u xr |j                  du  $ y wr_  )rO  r  r  s     r   r  z2ASTStubGenerator._get_func_args.<locals>.<genexpr>;  s.      .
AE#CHH5!55s   (*)r   r?   	enumerate	argumentsvariabler   r   unanalyzed_typerZ   rW  r_   rY   print_annotationpos_onlyis_namedanyr   r@   initializerget_str_type_of_nodeget_str_default_of_noder   r   r   r   insert
class_infoallrM   self_var)r   r   r  r   actually_pos_only_argspos_only_marker_positioniarg_varr   r   annotated_typeis_self_arg
is_cls_argtypenamer  potential_defaultvalidr   new_argss                       r   r{  zASTStubGenerator._get_func_args	  s;    "#/J!J#$  -GAt--C99D88D a//> !!++A.  q&3TV^Ka1DEMJ#'Hk* "/."A7K#44^DH%$--(A-(}}s*Tt*T'TF3K(G#889I9I4QVWH+/+G+GHXHX+Y(!5S!23s:/G!4&z"D6{KKtXtD4D4D/EU\]M .R $KK0&+>>>%# .
AE.
 +
 .#..113MCHH3MH # 4Ns   8Ic                   |j                   dk7  rmt        |j                  t              rSt        t	        |j                  j
                        t              ry | j                  |j                  j
                        S |j                  t        k(  s|j                   t        v ry t        |j                         }||S t        |      st        |      r| j                  d      }d}d }d }t        |      r| j                  d      x}}nYt        |      D ]K  \  }}	|j                   &t#        |j                         s| j                  d      }|	s;| j                  d      }M t%        |      r| j                  d      }||d}| d| d| d| dS || d| d| dS | d| dS t%        |      s|j                  t&        k(  ryy )Nr   zcollections.abc.Generatorr   r   r   r   r   )r   r   r  rZ   r_   rX  rY   r  abstract_statusr   rp   rN   rT   rU   r   rR   r  rC  rS   r   )
r   r   r  r  generator_name
yield_name	send_namereturn_namer  in_assignments
             r   r|  z!ASTStubGenerator._get_func_returnF  s   66ZJq/@/@,$O/!*;*;*D*DEwO ,,Q->->-G-GHH+qvv9R/R '/N"&?&B!]]+FGNJ$(I&*K(+)-7M)NN
Y+@+C'D-yy,\$))5L%)]]3I%J
$$(MM2H$I		 ,D
 $A&"mm,BC&$ &I():,b2k]RSTT&():,b1EE():,a88#A&1+<+<+Lr   c                    |j                   j                   sy |j                   j                   d   }t        |t              r0t        |j                  t              r|j                  j
                  S y )Nr   )bodyr   r$   r  r7   r   )r   r   r  s      r   _get_func_docstringz$ASTStubGenerator._get_func_docstringp  sJ    yy~~yy~~a dN+
499g0N99??"r   c                   | j                   xr; | j                  xr- |j                  j                  |j                     j
                  }|r|j                  dk7  ry | j                  |j                  |j                        sB| j                  |j                        s'| j                  |j                        r|j                  s| j                          y | j                         r)| j                  t        t        fvr| j!                  d       | j                         sJt#        |      }|D ]:  \  }}|| j$                  v r| j'                  ||      }|s*| j!                  |       < | j(                  rgt+        |j,                        r$|j,                  d   j.                  j                  }nd}d }| j(                  D ]  }	t1        |	j                  ||      } nd }t3        | j4                  |j                  | j7                  |      |j8                  t:        k7  |      }
| j=                  |j                         | j?                  ||
      }| jA                  || jB                  |
      }| jE                  ||jF                  | jH                  |
jJ                        D ]  }| j!                  |dz           | j                          t        | _        y )Nr   
r   r   )parent)rl  r   	docstringis_abstractr  )is_coroutine
decoratorsr  )&rd  rg  infor"  r   plugin_generatedrs  r   is_not_in_allis_recorded_namerv  rw  is_top_levelrb  r   r   r0  find_self_initializersre  get_initrc  r   r  r  rG   rH   rl  r  r  r   record_namer  get_signaturessig_generatorsformat_func_defr  r`  r  )r   r   is_dataclass_generated
self_initsinitr   	init_coder  r  	class_defr  default_sigsigsoutputs                 r   r4  zASTStubGenerator.visit_func_defx  sJ   MMad77aAFFLL<P<a<a 	 "aff
&:  4!!!&&)%%aff-amm!!#4;;udm#CHHTN  "/2J)e4,,, MM$6	HHY'  * 1;;;;q>2277!+/J!..	&y~~x
S
 / J((..q1))\9!
 	 33As;"";0C0CSI**q~~$:J:JVYVcVc + 
F HHVd]#

 	r   c                    | j                  |j                  j                  |j                  j                        ry | j	                  |       | j                  |j                         y rs   )rs  rt  r   r   ru  r4  r   s     r   visit_decoratorz ASTStubGenerator.visit_decorator  sE    QVV__=q!AFF#r   c                F   d|j                   _        |j                  D ]  }t        |t        t
        f      st        |      }| j                  |      }|dv r| j                  |d       O|dv r%d|j                   _	        | j                  |d       x|dk(  r)| j                  |d       t        |j                   _        |dv r|j                  d      d	   }|s| j                  j                  d
       |t        d      d }| j                  |d       | j                  |xs d
 dd       t        |j                   _        -|t         v r&| j                  |d       d|j                   _        [|j#                  d      sn| j                  |d        y)zsProcess a series of decorators.

        Only preserve certain special decorators such as @abstractmethod.
        F)zbuiltins.propertyzbuiltins.staticmethodzbuiltins.classmethodzfunctools.cached_propertyT)r   )zasyncio.coroutinezasyncio.coroutines.coroutineztypes.coroutinezabc.abstractmethod)zabc.abstractpropertyzabc.abstractstaticmethodzabc.abstractclassmethodr[  r   abczabc.abstractNz.abstractmethod)z.setterz.deleter)rt  rv  original_decoratorsr   r1   r/   r   r   add_decoratoris_awaitable_coroutiner   r  
rpartitionr   
add_importr   rV   r   )r   r   	decoratorr   r   
abc_modulebuiltin_decorator_replacements          r   ru  z"ASTStubGenerator.process_decorator  s   
 #..Ii(J)?@))4H((3H   ""8$"?  
 15-""8$"?11""8$"?)4&  
 &005a8
!''225908^9L9N0O-""#@u"U""j&9E%:/#JY]"^)4&^+""8$"?%)"""#:;""8%"@M /r   c                   | j                   r^t        |t        t        f      rH|j                  r<t        |j
                  t              r|j
                  j                  s|j                  S t        |      }| j                  |      S )z"Return the expression's full name.)
rd  r   r1   r/   r   r   r=   is_suppressed_importr   resolve_name)r   r  r   s      r   r   zASTStubGenerator.get_fullname  s`     MM4(J!78		3/DII4R4R== !$'  &&r   c                n   | j                   j                  |       t        |j                  j                        | _        d }| j                         r9| j                  t        k7  r&t        | j                        }| j                  d       | j                  |      }|D ]#  }| j                  | j                   d| d       % | j                  |j                         | j!                  |      }|r"|D ]  }| j"                  j%                  |        | j&                  r|j(                  j*                  rd| _        t/        |j0                  t2        t4        f      r9|j0                  j7                  t9        |             }|j                  d|z          n| j&                  rs|j(                  j:                  r]|j(                  j<                  sG|j                  d       | j"                  j?                  d       | j"                  j%                  d       |rddjA                  |       d	nd
}| jC                  |      }	| j                  | j                   d|j                   |	 | d       | jE                          | jF                  rU|jH                  rItJ        jL                  jO                  |jH                        }
| j                  | j                   |
 d       t        | j                        }| jP                  j                  g        tR        |   |       | jW                          | jP                  jY                          | jP                  d   j                  |j                         t        | j                        |k(  rj| j                  tZ        k(  r|d
| j                  |<   | jF                  r|jH                  s"| j                  d   d d dz   | j                  d<   tZ        | _        nt\        | _        t_               | _        d| _0        | j                   jY                  d       d| _        y )Nr  @Tz
metaclass=zmetaclass=abc.ABCMetar  r   r   r    class z:
r    ...
F)1rc  r   find_method_namesdefsr  re  r  rb  r   r   _outputr0  get_class_decorators_indentr  r   get_base_typesr   r   rd  r  is_enumrf  r   	metaclassr1   r/   r   r   r  is_protocolr  r   r}  indent_include_docstringsr  mypyutilquote_docstringra  r   r1  dedentpopr   r   r-  rg  )r   r   sepr  d
base_typesr   metabasesr  r  r   r   s               r   r1  z ASTStubGenerator.visit_class_def  s$     #-affkk:4;;%#7dll#CHHTN..q1
AHH~Qqc,-  ((+
"##006 #==QVV^^#'D akkHj#9:;;%%l4&89DlT12]]qvv11!&&:L:L56**51,,U30:!DIIj)*!,))!,	DLL>x	{5'EF##		11!++>IHH~i[34

""



2aff%t||!{{k)co$&S!,,#'<<#3CR#88#CR %DKDKE$)!b!$r   c           	     B   g }t        |       }|j                  |j                  z   D ]  }t        |t        t
        f      r0| j                  |      dk7  s/|j                  t        |             Jt        |t              r!|j                  |j                  |             {t        |t              s| j                  |      r| j                  |      }t        |j                  d   t              sJ |j                  d   j                   }|"|j                  | j#                  d             
dj%                  d |D              }| j#                  d      }|j                  | d|d| d	       O| j'                  |      r"|j                  |j                  |             |j                  | j#                  d              |j(                  j+                         D ]6  \  }	}
|	d
k(  r|
j                  |      xs d}|j                  |	 d|        8 |S )z%Get list of base classes for a class.zbuiltins.objectr   r   r   c              3  4   K   | ]  \  }}d |d| d  yw)r   r   r   Nr   )r   frQ  s      r   r  z2ASTStubGenerator.get_base_types.<locals>.<genexpr>@  s#     *Qytq!Qqe2aS?y   typing.NamedTupler   z, [z])r  r  r   )r   base_type_exprsremoved_base_type_exprsr   r1   r/   r   r   r   r,   r   r   is_namedtuple_get_namedtuple_fieldsr   r7   r   r   r   is_typed_namedtuplekeywordsr   )r   cdefr  pr   	nt_fieldsr  
fields_strnamedtuple_namer   r   processed_values               r   r  zASTStubGenerator.get_base_types$  s    "
((4+G+GGD$: 67$$T*.??%%&8&>?D),!!$++a.1D(+ %%d+ $ ; ;D AI%diilG<<<#yy|11H ("))$--8N*OP !%*Qy*Q!QJ&*mm4G&HO%%(98,c*UW&XY--d3%%dkk!n5 %%dmm4J&KLA HB  ==..0KD%{"#ll1o6Oa'89:	 1
 r   c                    g }t        |       }|j                  D ]_  }| j                  |      s|j                  |j	                  |             | j
                  j                  t        |             d| _        a |S )NT)	r   r  is_dataclassr   r   r   r   r   rg  )r   r  r  r   r  s        r   r  z%ASTStubGenerator.get_class_decoratorsP  sm     "
A  #!!!((1+.##001CA1FG,0)	 !
 r   c                b    t        |t              r|j                  }| j                  |      dk(  S )Nzdataclasses.dataclass)r   r   r   r   r   r  s     r   r  zASTStubGenerator.is_dataclassZ  s,    dH%;;D  &*AAAr   c                >    |j                   st        | 	  |       y y rs   rG  rq  s     r   rI  zASTStubGenerator.visit_block_  s      G"  r   c                V   g }|j                   D ]  }t        |t              rt        |j                  t              r| j                  |j                        s| j                  |j                        r.| j                  ||j                         |j                  d       | j                  |j                        r.| j                  ||j                         |j                  d       t        |t              r`| j                  |j                        sE|j                  s9| j                  |j                        r| j                  ||j                         Kt        |t         t"        f      rM|j$                  }t        |j                  t&              r|j                  j$                  }n d gt)        |      z  }n|g}|j                  g}d}d}t+        ||      D ]  \  }}	t        |t              s| j-                  |j                  |j                  |	      }
|
sAd}|s/| j/                         r| j0                  t2        t4        fvrd|
z   }
d}| j7                  |
       | j9                  |j                          |j                  |        t;        |      rt4        | _        y y )NFTr  )r)  r   r1   rvaluer   r  r  process_namedtupler   is_typeddictprocess_typeddictrs  r   r  is_alias_expressionprocess_typealiasr9   r.   r   r\   r   r   r  r  rb  r   r   r0  r  r  )r   r   foundlr*  r   r   r  foundr   
annotationr  s              r   r6  z&ASTStubGenerator.visit_assignment_stmte  s   iiF&(+
188X0N%%ahh/43K3KAHH3U++FAHH=MM%($$QXX.**6188<MM%(68,,,V[[9)),,QXX6&&vqxx8&9h"78a//;9:9J9J9P9PK#'&3u:"5K 001CE$'{$; jdH-==AHHjID $"t'8'8':t{{SXZ]R^?^#'$;D"&C((3 %< MM% Q  T v;DK r   c                >    | j                  |j                        dk(  S )Nzcollections.namedtuple)r   r   r  s     r   r  zASTStubGenerator.is_namedtuple  s      -1IIIr   c                D    | j                  |j                        t        v S rs   )r   r   rX   r  s     r   r  z$ASTStubGenerator.is_typed_namedtuple  s      -1GGGr   c                ^   | j                  |      r|j                  d   }t        |t              r+|j                  j                  dd      j                         }nXt        |t        t        f      rAg }|j                  D ]/  }t        |t              s y |j                  |j                         1 ny |r#| j                  d      }|D cg c]  }||f c}S g S | j                  |      r|j                  d   }t        |t        t        f      sy g }t        |       }|j                  D ]y  }t        |t              rt        |j                        dk(  s y |j                  \  }}	t        |t              s y |j                  |j                  |	j                  |      f       { |S y c c}w )Nr   ,r  r   r   )r  r   r   r7   r   replacesplitr.   r9   r   r   r   r  r   r   r   )
r   call
fields_argfield_namesfield
incomplete
field_namefieldsr   
field_types
             r   r  z'ASTStubGenerator._get_namedtuple_fields  sw   d#1J*g.(..66sC@FFHJ9(=> '--E%eW5#&&u{{3 .
 !]]+AB
CNO;ZZ0;OO	%%d+1Jj8Y*?@,.FT"A#))"5)4U[[9IQ9N).&
J!*g6z//1B1B11EFG * M' Ps   F*c           	        | j                   t        k(  r| j                  d       t        |j                  d   t
              s| j                  |       y | j                  |      }|| j                  |       y | j                  d      }| j                   d|j                   d| d}t        |      dk(  r | j                  | d       t        | _         y | j                   t        t        fvr| j                  d       | j                  | d       |D ])  \  }}| j                  | j                   d| d	| d       + t        | _         y )
Nr  r   r  r  r   ):r      r  )rb  r   r0  r   r   r7   annotate_as_incompleter  r   r  r   r   r   r   )r   r*  r  r   r  r  f_namef_types           r   r  z#ASTStubGenerator.process_namedtuple  s   ;;%HHTN&++a.'2''/,,V4>''/12||nF6;;-qrB	v;!HH	{&)*%DK{{5%.0HH	{"%&"(DLL>fXRxrBC #)DKr   c                D    | j                  |j                        t        v S rs   )r   r   rW   r  s     r   r  zASTStubGenerator.is_typeddict  s      -==r   c           
        | j                   t        k(  r| j                  d       t        |j                  d   t
              s| j                  |       y g }d }t        |j                        dkD  r|j                  d   t        k(  rt        |j                  d   t              s| j                  |       y |j                  d   j                  D ]E  \  }}t        |t
              s| j                  |        y |j                  |j                  |f       G t        |j                        dkD  r|j                  d   t        k7  s|j                  d   dk7  r| j                  |       y |j                  d   }nlt!        |j                  dd  |j                  dd        D ]C  \  }}t        |t"              s| j                  |        y |dk(  r|}1|j                  ||f       E t%        |       }	t'        d |D              rH| j                  | j(                   |j*                   d|j-                  |	       d       t.        | _         y | j1                  d      }
||
d	|j-                  |	       z  }
| j(                   d
|j*                   d|
 d}t        |      dk(  r | j                  | d       t2        | _         y | j                   t4        t        fvr| j                  d       | j                  | d       |D ]8  \  }}| j                  | j(                   d| d|j-                  |	       d       : t        | _         y )Nr  r   r   r   totalc              3  r   K   | ]/  \  }}|j                          xs t        j                  |       1 y wrs   )isidentifierkeyword	iskeyword)r   r  _s      r   r  z5ASTStubGenerator.process_typeddict.<locals>.<genexpr>  s4     TeFC3##%%?):):3)??es   57 = ztyping_extensions.TypedDictz, total=r  r   r#  r  r$  r  )rb  r   r0  r   r   r7   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*  	attr_name	attr_typearg_namer   r   r  r  r  key_types                 r   r  z"ASTStubGenerator.process_typeddict  s   ;;%HHTN&++a.'2''/.0#'v{{aF$4$4Q$77$Bfkk!nh7++F3(.A(<(<$	9!)W5//7iooy9:	 )=
 6;;!###A&)3v7G7G7Jg7U//7A!$V%5%5ab%96;;qr?!K#!(C0//7w&ELL(C1 "L TeTTHH~fkk]#fmmA6F5GrJKDKMM"?@E 8ELLO#455<<.v{{m1UG2FI5zQI;f-.);;uen4HHTNI;b)*%*MCHH~T#b9K8LBOP &+#r   c                    | j                  d      }| j                  | j                   |j                   d| d       t        | _        y )Nr   r  r  )r   r0  r  r   r   rb  )r   r*  r  s      r   r%  z'ASTStubGenerator.annotate_as_incomplete  s=    ]]#9:
DLL>&++bB?@r   c                    t        |t              r j                  |j                        dv ryt        |t              r| S t        |t
              r=|j                  dv ry|j                  dk(  r| S  j                  |j                         S t        |t              ry j                  rm|xr% t        |j                  t        t        t        f      xs t        |j                  t              xr&  j                  |j                  j                          S t        |t"              r\t        |j$                  t
              r% j                  |j$                  j                        rit        |j$                  t              r j                  t'        |j$                              sމ j                  |j$                        j)                  d      rt        |j*                  t,              r|j*                  j.                  }n|j*                  g}|j$                  j                  dk(  rIt1        |      dk(  r;|\  }}t        |t              r|g}n"t        |t2              r|j.                  |gz   }nyt5         fd	|D              S t        |t6              rK|j8                  d
k(  r< j;                  |j<                  d      xr  j;                  |j>                  d      S y)zReturn True for things that look like target for an alias.

        Used to know if assignments look like type aliases, function alias,
        or module alias.
        )ztyping.TypeVarztyping_extensions.TypeVarztyping.ParamSpecztyping_extensions.ParamSpecztyping.TypeVarTupleztyping_extensions.TypeVarTupleTTrueFalseFr   )z	builtins.ztyping.ztyping_extensions.zcollections.abc.Callabler   c              3  D   K   | ]  }j                  |d         yw)F	top_levelN)r  )r   r  r   s     r   r  z7ASTStubGenerator.is_alias_expression.<locals>.<genexpr>N  s"     UWt//U/CWs    |r<  ) r   r   r   r   r"   r1   r   rs  r/   rd  r   r'   r    r0   r;   is_private_memberr   r,   r   r   r   r   r9   r   r   r.   r  r2   r  r  r  r  )r   r  r=  indicesr   rets   `     r   r  z$ASTStubGenerator.is_alias_expression  sN    dH%$*;*;DKK*H M
 +
 l+ = h'yy--f$$}$//		:::j)dmm  Jtyy7Ix*HI3dii2A ,,TYY-?-?@@	A
 i(		8,T5I5I$))..5Y499j1../A$))/LM%%dii0;;V
 $**i0****::,yy~~+G0A#	cdL1"eGh/"jjC50G UWUUUf%$''S.++		U ,  H**4::*GH r   c                   t        |       }| j                  | j                   |j                   d|j	                  |       d       | j                  |j                         | j                  d   j                  |j                         y )Nr0  r  r   )r   r0  r  r   r   r  ra  r   )r   r*  r  r   s       r   r  z"ASTStubGenerator.process_typealiasV  sg    DLL>&++c&--2B1C2FG%

2fkk*r   c           
     d   t        |       }|j                  j                  }|j                  j                         }| j	                  |      }| j                  | j                   d| | d|j                  |       d       | j                  |       | j                  d   j                  |       y)z7Type aliases defined with the `type` keyword (PEP 695).ztype r0  r  r   N)r   r   r   r  r}  r0  r  r   r  ra  r   )r   r   r   r   r  r  s         r   r8  z&ASTStubGenerator.visit_type_alias_stmt\  s    vv{{))!,	DLL>tfYKs6==;K:LBOP

2d#r   c                F   |j                   d   }t        |t              rrt        |j                  d   t              rUt        |j                  d   t
              r8|j                  d   j                  dk(  rd|j                  d   j                  v ry t        | %  |       y )Nr   r   r   __main__)
r  r   r   operandsr1   r7   r   r   r   visit_if_stmt)r   r   r  r   s      r   rG  zASTStubGenerator.visit_if_stmtf  s~    vvayt^,4==+X64==+W5a %%3dmmA.444a r   c                `    | j                  dd|j                  z   |j                   d       y )Nzfrom r[  z
 import *
)add_import_linerelativeidr   s     r   visit_import_allz!ASTStubGenerator.visit_import_alls  s+    uS1::%5$6qttfKHIr   c                   t               }g }t        |j                  |j                        \  }}| j                  rMt
        j                  j                  | j                  ||| j                  j                  d            \  }}|s|}n|}|dk(  ry |j                  D ]k  \  }}	|dk(  r| j                  t        dg             '| j                  |||	d u      r| j                  j                  |       |}	|j!                  ||	f       m | j                  j#                  d|z  |z   |       | j$                  d   j'                  d |D               |D ]  \  }}
| j)                  |
xs |        | j*                  rN|j                  D 
cg c]%  \  }}
|| j*                  v r|
|| j,                  vr|' }}}
|j/                  |       y y c c}
}w )Nz.__init__.py
__future__six)rO  Nr[  r   c              3  .   K   | ]  \  }}|xs |  y wrs   r   )r   r   aliass      r   r  z5ASTStubGenerator.visit_import_from.<locals>.<genexpr>  s     L|eemtm|s   )r-  translate_module_namerK  rJ  rl  r  r  correct_relative_importr   r   r"  visit_importr)   should_reexportr   reexportr   add_import_fromra  extendr  rh  IGNORED_DUNDERSupdate)r   r   exported_namesimport_namesr   rJ  full_moduleokr   as_namerQ  r"  s               r   visit_import_fromz"ASTStubGenerator.visit_import_fromv  s   #&50qzzB"ii??  (FDII4F4F~4VOK $ K\!WWMD'u}!!&-"9:##D+wd7JK##,,T2w0 % 	++C(NV,C\R

2L|LL'KD%U]d+ ( :: $%77#*KD%4::%%-DH\H\<\ #*  
 !!%( s   *Gc                    |j                   D ]i  \  }}| j                  j                  ||       ||j                  d      d   }n|}| j                  d   j                  |       | j                  |       k y )Nr[  r   r   )idsr   r  r  ra  r   r  )r   r   rK  as_idtarget_names        r   rT  zASTStubGenerator.visit_import  sj    IB**2u5} hhsmA.#JJrN!!+.[) r   c                   || j                   d   v ry| j                  |      s| j                  |      ry| j                   d   j                  |       || j	                  |      }t        |t              r|j                  s|j                  dk(  r| j                  j                  j                  d      | j                  v r}| j                  |      }|d| dz  }nb| j                  r(| j                  |      \  }}| j                    | d| dS | j"                  r| j                    | dS | j                  |      }| j%                  |      }| j                    | d	| | dS )
zReturn initializer for a variable.

        Return None if we've generated one already or if the variable is internal.
        r   Nr   r   r   r0  r  z = ...
r  )ra  rs  r  r   r  r   r^   r   r   r   
module_forgetTYPING_MODULE_NAMESr  rf  r  r  rg  get_assign_initializer)r   r*  r  r  r  	final_argr  r/  s           r   r  zASTStubGenerator.get_init  s]    TZZ^#'4+=+=f+E

2f%!,,Z8H:{3"OOw.''2266w?4C[C[[ !55f=	a	{!,,!!!99&ANKll^F83{m2>>&&ll^F8844008H11&9,,xr(K=CCr   c                    | j                   sy| j                   j                  r1| j                   j                  j                  rt        |t              sy| j
                  rt        |t              r|j                  syy)z5Does this rvalue need some special initializer value?r  z = ...)rj  r  is_named_tupler   r8   rg  no_rhs)r   r  s     r   ri  z'ASTStubGenerator.get_assign_initializer  sa    ""
 $$##((77vx0$$j.Jv}} r   c                z    |r| j                   j                  |       | j                  j                  d|        y )Nr  )r   r   r`  r   )r   r   r   s      r   r  zASTStubGenerator.add_decorator  s3    ,,T2!D6
+r   c                8    | j                   j                          y rs   )r`  clearr   s    r   rw  z!ASTStubGenerator.clear_decorators  s     r   c                N     |j                  d      }t         fd|D              S )Nr[  c              3  @   K   | ]  }j                  |        y wrs   )rs  )r   partr   s     r   r  z5ASTStubGenerator.is_private_member.<locals>.<genexpr>  s     @%$4''-%r  )r  r  )r   r   partss   `  r   r?  z"ASTStubGenerator.is_private_member  s"    s#@%@@@r   c                   | j                  |      }t        |t              ryt        |t              ryt        |t              ryt        |t
              ryt        |t              ryt        |t              ra|j                  dv rSt        | j                  |j                        t              s)t        | j                  |j                        t              ryt        |t              r|j                  dv ry|r3t        |t              r#|j                  d	k(  r| j                  d
       dS |r| j                  d
      S y)Nintr   bytesfloatcomplex)-+r7  r   r   r   r   r  )maybe_unwrap_unary_exprr   r-   r7   r   r%   r   r2   r  r  r  r1   r   r   )r   r  can_infer_optional
can_be_anys       r   r  z%ASTStubGenerator.get_str_type_of_node  s    --f5fg&fg&fi(fi(fk*ff%&))z*A$66v{{C[QU_,,V\\:KV !fh'FKK;L,L*VX">6;;RXCXmm$:;<GDD==!788r   c                h   t        |t              s|S d}|j                  |v rjt        |t              rX|j                  |vs*t        |j                  t        t
        t        t        f      s	 |S |j                  }t        |t              rX|S |j                  dk(  rt        |t              r|j                  dk7  s t        |j                  t        t        f      s	 |S t        |j                  t              r|j                  j                  dvr	 |S |j                  }t        |t              r|S |S )a
  Unwrap (possibly nested) unary expressions.

        But, some unary expressions can change the type of expression.
        While we want to preserve it. For example, `~True` is `int`.
        So, we only allow a subset of unary expressions to be unwrapped.
        )r{  rz  notr7  )	r   r<   r  r  r-   r%   r   r1   r   )r   r  math_opss      r   r|  z(ASTStubGenerator.maybe_unwrap_unary_expr  s
    $	*K 77hT9-77(**IIKK3 K yy T9- K 77eT9-77e#:dii(IAV+W K dii2tyy~~M^7^K yy T9- K r   c                   t        |t              r|j                  dv r|j                  dfS yt        |t        t        f      r|j
                   dfS t        |t              rGt        |j                  t        t        f      r&|j                   |j                  j
                   dfS yt        |t              rt        |j
                        dfS t        |t              r*dt        |j
                        j                  dd      z   dfS t        |t              rig }|j                  D ]+  }| j                  |      \  }}|s y|j!                  |       - t#        |      dk(  rdnd}d	d
j%                  |      z   |z   }|dfS t        |t&              rWg }|j                  D ]+  }| j                  |      \  }}|s y|j!                  |       - dd
j%                  |      z   dz   }|dfS t        |t(              rZg }|j                  D ]+  }| j                  |      \  }}|s y|j!                  |       - |rdd
j%                  |      z   dz   }|dfS yt        |t*              ryg }|j                  D ]M  \  }}	| y| j                  |      \  }
}| j                  |	      \  }}|r|s y|j!                  |
 d|        O dd
j%                  |      z   dz   }|dfS y)zGet a string representation of the default value of a node.

        Returns a 2-tuple of the default and whether or not it is valid.
        )r   r8  r9  Tr   z\\\r   z,)r   r   r   r   r   r  r  r  )r  F)r   r1   r   r-   r%   r   r<   r  r  r7   r   r   r  r9   r   r  r   r   r   r.   r4   r!   )r   r  items_defaultsrL  	e_defaultr  closingr  kv	k_defaultk_valid	v_defaultv_valids                 r   r  z(ASTStubGenerator.get_str_default_of_node(  s   
 fh'{{77{{D((n m ) 45ll^d**	*&++';< ))V[[%6%6$78$>>d c (%t++	*fll+33FDAA4GG	*N\\#'#?#?#B 	5P O %%i0	 " #&n"5":$		. 99GC}$)N\\#'#?#?#B 	5: 9 %%i0	 " 		. 99C?}$(N\\#'#?#?#B 	5& % %%i0	 " "!DIIn$==CG"D=(  )N19  &*%A%A!%D"	7%)%A%A!%D"	7G
 	 %%2i[&AB % 		. 99C?}$r   c                    | j                  ||dz   |z         }|s<|| j                  vr.| j                  r|| j                  v r|s|d| j                  z   vryt
        |   |||      S )Nr[  )r  asyncioT)rs  rn  rh  rY  rh  r   rU  )r   r   r]  name_is_alias
is_privater   s        r   rU  z ASTStubGenerator.should_reexporth  st    ))$c0AD0HI
D111ZZ44+?+?#?#58P8P#PP
 w&t[-HHr   )NFFFF)rh  r   r}   r   rd  r   r   r   r   r   r   r   )r   zClassDef | None)r   r0   r   r   )r   r3   r   r   )r~  r'   r  rH   r   rA   )r   r'   r  rH   r   zlist[ArgSig])r   r'   r  rH   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   r   r   r<  )r  r   r   r   )r  r   r   zlist[tuple[str, str]] | None)r*  r1   r  r   r   r   )r*  r1   r   r   )T)r  r#   r=  r   r   r   )r*  r1   r  r#   r   r   r=  )r   r(   r   r   )r   r*   r   r   )r   r+   r   r   )r   r)   r   r   rs   )r*  r   r  r#   r  zType | Noner   r   )r  r#   r   r   )F)r   r   r   r   r   r   r9  )r   r   r   r   )FT)r  r#   r}  r   r~  r   r   r   )r  r#   r   r#   )r  r#   r   ztuple[str, bool])r   r   r]  r   r  r   r   r   )/r   r   r   r   r   r   rj  ro  ry  r  r{  r|  r  r4  r  ru  r   r1  r  r  r  rI  r6  r  r  r  r  r  r  r%  r  r  r8  rG  rL  r`  rT  r  ri  r  rw  r?  r  r|  r  rU  r  r  s   @r   r  r    s   - #' %!#(** * 	*
 * !* 
*, D D%((D;z(T8t$,A\
'0%d*XB
#.`JH"H 4>5$n
<|+$!J#)J* JN"D"D#-"D;F"D	"DH(,
!A
 X\ 6:PT	: D>@I Ir   r  c                f   t               }| D ]  }t        |t              r|j                  |j                         /t        |t
              r&|j                  |j                  j                         et        |t              sv|j                  D ]  }|j                  t        |g               |S rs   )r-  r   r'   r0  r   r    rt  r3   r   rZ  r  )r  resultdefnr   s       r   r  r  x  s    UFdG$JJtyy!i(JJtyy~~&/0

/78 #  Mr   c                      e Zd ZddZddZy)SelfTraverserc                    g | _         y rs   )resultsr   s    r   r   zSelfTraverser.__init__  s	    57r   c                   |j                   d   }t        |t              rgt        |j                  t              rL|j                  j
                  dk(  r2| j                  j                  |j
                  |j                  f       y y y y )Nr   r   )	r)  r   r/   r  r1   r   r  r   r  )r   r   r*  s      r   r6  z#SelfTraverser.visit_assignment_stmt  sg    1vz*6;;1  F*LLahh 78 + 2 +r   Nr9  r<  )r   r   r   r   r6  r   r   r   r  r    s    89r   r  c                P    t               }| j                  |       |j                  S )znFind attribute initializers in a method.

    Return a list of pairs (attribute name, r.h.s. expression).
    )r  r   r  )fdef	traversers     r   r  r    s#    
 IKK	r   c                    t        | t              r| j                  S t        | t              r$t	        | j
                         d| j                   S t        S )Nr[  )r   r1   r   r/   r   r  r   )r   s    r   r   r     sD    !Xvv	Az	"$QVV,-Qqvvh77r   c                p    | D cg c]&  }|j                   t        |j                         r%|( c}S c c}w rs   )r   is_blacklisted_path)r   r   s     r   remove_blacklisted_modulesr    s;    $$6(;CVW]WbWbCcW  s   &33c                    g }g }| D ]:  }t        |j                        r|j                  |       *|j                  |       < ||fS rs   )r   r   r   )r   
py_modulespyc_modulesmods       r   split_pyc_from_pyr    sK    JKsxx s#c"	 
 
""r   c                4     t         fdt        D              S )Nc              3  >   K   | ]  }|t              d z   v   yw)r  N)normalize_path_separators)r   substrr   s     r   r  z&is_blacklisted_path.<locals>.<genexpr>  s$     ZPYfv3D9D@APYs   )r  rg   r   s   `r   r  r    s    ZPYZZZr   c                P    t         j                  dk(  r| j                  dd      S | S )Nwin32r  r  )sysplatformr  r  s    r   r  r    s$    
||w||D#&&Kr   c                N   | j                   s| j                  r| j                  r9t        | j                  | j                   | j                  | j
                        }g }nt        | j                  | j                   | j                  | j                        \  }}nF	 t        | j                  |      }|D cg c]"  }t        |j                  |j                         $ }}g }t#        |      }t%        |      \  }}|||fS # t        $ r}t        t        |            |d}~ww xY wc c}w )zsCollect files for which we need to generate stubs.

    Return list of py modules, pyc modules, and C modules.
    N)ra   r   ru   find_module_paths_using_searchrx   rt   find_module_paths_using_importsr   r   r   r   r
   
SystemExitr   r   r   r   r  r  )	options	mypy_optsr  	c_modulessource_listrL  mpyc_modpy_mods	            r   collect_build_targetsr    s    7??7!1!173F3FHYHYJ +-I %D!1!17??GMM%!J	
	,,W]]IFK =HHKqj1662K
H	+J7J'
3OGV7I%% ! 	,SV$!+	,Hs   C< 3'D"<	DDDc           	     6   t               5 }g }g }t        t        |||            }| |z   } | D cg c]  }t        |      r| } }| D ]N  }	 t	        |||      }	|	s|j                  t        |             .|	\  }}|j                  t        |||             P ||fcddd       S c c}w # t
        $ rX}
t        j                         }|rt        j                  j                  |       |st        ||
j                  |       Y d}
~
d}
~
ww xY w# 1 sw Y   yxY w)zFind path and runtime value of __all__ (if possible) for modules and packages.

    This function uses runtime Python imports to get the information.
    N)r   listrQ   is_non_library_modulerK   rF   	traceback
format_excr  stdoutwriterP   messager   r   )r   ra   r   r   rv   r  r  r  r  r  rL  tbr   r   s                 r   r  r    s    
G')
&(	]7Hg>?E/"
"C*?*DC7 	 
 C5gsGL   C1$*!k!!*S$"DE  9$/ 


  ))+JJ$$R("3		26 
sN   $DB& B&DB+AD&D+	D4ADDDDDc                    | j                  d      ry| j                  d      d   j                  d      ryd| v sd| v sd| v sd	| v ryy
)z0Does module look like a test module or a script?)z.testsz.testz.testing_tests_test_suite	test_util
test_utils	test_basez	.__main__z	.conftestz.setupTr[  r   test_z.tests.z.test.z	.testing.z
.SelfTest.F)r   r  r   r   s    r   r  r    s]    	
 ||C''0Vv& 6!r   c                    t         D ]c  }dD ]\  }| d| }| j                  d|z         s| |k(  r
|r|dfc c S d|z   dz   | v s8|dz   | j                  d|z   dz         d   z   dfc c S  e | |fS )N)z	six.movesrO  r[  r   r   )rf   r   	partition)r   rJ  pkgaltr  s        r   rR  rR  !  s    %CuAcU^FsV|,61AhAvV|c!V+Sy6#3#3C&L34F#G#JJAMM &  8r   c                   g }t        t        j                  j                         |d      }t	        dt        |      z   ddt        |            }t        |dd      }| D ]O  }|j                  |      }	t        |	t              rt        ||	       d}
n|	}
|j                  t        ||
             Q |D ]m  }|j                  |      }|rt        |t        j                         |D cg c]"  }t        |j                  |j                         $ }}|j#                  |       o |D cg c]  }t%        |j                        r| }}|S c c}w c c}w )a  Find sources for modules and packages requested.

    This function just looks for source files at the file system level.
    This is used if user passes --no-import, and will not find C modules.
    Exit if some of the modules or packages can't be found.
    N)r[  r   )fscacher  )r   r  r   default_data_dirr   tupler   find_moduler   r   rJ   r   r   find_modules_recursive	NOT_FOUNDr   r   rX  r  )r   ra   rx   rt   r  typeshed_pathsearch_pathscacher   m_resultmodule_pathpackagep_resultr  sourcess                  r   r  r  ,  s/     "F$TZZ%@%@%BItTMvk(::BE-DXYLL$EE$$V,h 45*K"Kj56  //8"6"@"@A9ABA:ahh/Bg   GA'<QXX'FaFGM C Hs   ''E
'EEc                ~   t               }d|_        d|_        d|_        d|_        | j
                  |_        d|_        t        |_	        d|_
        | j                  |_        t        j                  dd      }|j                         r||_        t        j                   j#                  |j                        |_        |S )z4Generate mypy options using the flag passed by user.skipFTMYPY_CACHE_DIRr  )MypyOptionsfollow_importsincrementalr|   semantic_analysis_onlyrt   python_versionshow_tracebackrO   transform_sourcepreserve_astsr   osgetenvstrip	cache_dirr   
expanduser)stubgen_optionsr  environ_cache_dirs      r   mypy_optionsr  M  s    mG#GG G%)G",66G!G=G G!0!C!CG 		"2B7 -**7+<+<=GNr   c                ^   | j                   J d       t        | j                   d      5 }|j                         }ddd       t        j                  j                        }t        |      }t        j                  j                  || j                   | j                  ||      | _	        | j                  | j                  _
        |j                         rM|j                         D ]$  }t        j                  j                  | d       & t        j                   d       yy# 1 sw Y   xY w)zParse a source file.

    On success, store AST in the corresponding attribute of the stub source.
    If there are syntax errors, print them and exit.
    N Not found module was not skippedrb)fnamr   errorsr  r  r   )r   openreadr  r  decode_python_encodingr	   parser   r   	_fullnameis_blockersnew_messagesr  stderrr  exit)r  r  r  datar   r  r  s          r   parse_source_filer  c  s     88C!CC	chh	vvx 
YY--d3FL!FjjSXXcjj  CG 

CGG$$&AJJs"X& '	  
	s   D##D,c                   | sy|rt        dt        |        d       |r| D ]  }t        ||        y	 t        | D cg c]  }|j                   c}|      }| D ]i  }|j                  |j                     j                  |_
        |j                  8|j                  j                  j                  |j                     |_        k yc c}w # t
        $ r}t        d|       |d}~ww xY w)z8Use mypy to parse (and optionally analyze) source files.NzProcessing z	 files...z)Critical error during semantic analysis: )printr   r  r   r   r   r  graphr   treer   r   managersemantic_analyzer
export_map)r  r{   r  r   r  r   resrL  s           r   generate_asts_for_modulesr
  y  s     C
O,I67Cc<0 Q<vV]]<lK ))CJJ',,??"!kk;;FFszzRCO	 	 = QDQCHIqPQs(   	C CC C 	C*C%%C*Fr  )r{   rv   r}   r   r   rw   c          	     Z   |rGt        | j                  || j                  ||||      }	|	j                          |	j	                         }
nYt        | j                  || ||      }| j                  J d       | j                  j                  |       |j	                         }
t        j                  j                  |      }|r4t        j                  j                  |      st        j                  |       t        |dd      5 }|j                  |
       ddd       y# 1 sw Y   yxY w)zUse analysed (or just parsed) AST to generate type stub for single file.

    If directory for target doesn't exist it will created. Existing stub
    will be overwritten.
    )rl  known_modulesrh  rw   r}   r   r   )r}   rd  r   r   Nz5This function must be used only with analyzed moduleswzutf-8)encoding)rB   r   r   generate_moduler  r  r   r   r  r   dirnameisdirmakedirsr  r  )r  targetr{   rv   r}   r   r   rw   all_modulesngenr  gensubdirr$  s                 r   generate_stub_for_py_moduler    s    " &

%//+#1
 	 OO+#^#1
 ww"[$[["s WW__V$FbggmmF+
F	fcG	,

6 
-	,	,s   D!!D*c                b  
 t        |       }t        | |      \  }}}||z   |z   }t        d |D              }t        || j                  || j
                         g }||z   D ].  

j                  J d       
j                  j                  dd      }t        j                  j                  
j                        dv r|dz  }n|dz  }t        j                  j                  | j                  |      }|j                  |       t        
j                  || j                  | j
                        5  t!        
|| j                  | j"                  xs 
|v | j$                  | j&                  | j(                  | j*                  |		       ddd       1 |D ]
  
t-        
fd
|D              r 
j                  j                  dd      dz   }n
j                  j                  dd      dz   }t        j                  j                  | j                  |      }|j                  |       t        
j                  || j                  | j
                        5  t/        
j                  ||| j*                  | j$                  | j&                  | j(                         ddd        t1        |      }	| j2                  s]|	dkD  rWt5        d|	z         t1        |      dk(  rt5        d|d           yt5        dt7        |       t        j8                  z          yyy# 1 sw Y   xY w# 1 sw Y   xY w)z!Main entry point for the program.c              3  4   K   | ]  }|j                     y wrs   r  )r   r  s     r   r  z!generate_stubs.<locals>.<genexpr>  s     <1ahhr  Nr  r[  r  )z__init__.pyz__init__.pycz/__init__.pyiz.pyi)r{   rv   r}   r   r   rw   r  c              3  n   K   | ],  }|j                   j                  j                   d z          . yw)r[  N)r   r   )r   r  r  s     r   r  z!generate_stubs.<locals>.<genexpr>  s*     Tfv}}''

S(89s   25)r  rw   r}   r   r   r   zProcessed %d modulesr   z
Generated zGenerated files under )r  r  sortedr
  r{   r   r   r   r  r  basenamer   r~   r   rL   r|   r  rv   r}   r   r   rw   r  rC   r   r   r  rI   r  )r  r  r  r  r  r  all_module_namesr   r  num_modulesr  s             @r   generate_stubsr     s   W%I)>w	)R&JY{*Y6K<<<j'*<*<iYEK'xx#G%GG###C-77CHH%)HHo%FfFg00&9Vcjj&'2G2GY'"--=3++= ' 7 7#//#*#=#=,
 ZY (. TTTZZ''S1OCFZZ''S1F:Fg00&9Vcjj&'2G2GY&

. ' 7 7#//#*#=#= ZY " k"K==[1_${23u:?JuQxj)**+<U+C*DENO -=A ZY* ZYs   0ALAL$L!	$L.	z^%(prog)s [-h] [more options, see -h]
                     [-m MODULE] [-p PACKAGE] [files ...]z
Generate draft stubs for modules.

Stubs are generated in directory ./out, to avoid overriding files with
manual changes.  This directory is assumed to exist.
c           	        t        j                  dt        t        d      }|j	                  ddd       |j	                  ddd	       |j	                  d
dddd       |j	                  dddd       |j	                  ddd       |j	                  ddd       |j	                  ddd       |j	                  dddd       |j	                  dddd       |j	                  ddd d!"       |j	                  d#dd d$"       |j	                  d%d&dd'd(d)*       |j	                  d+d,d-d.d/g d01       |j	                  d2d3d-d4d5g d61       |j	                  d7d8d7d9:       |j	                  d;d<d=t
        j                  j                  z   >       |j                  |       }t        j                  d d? }t        j                  |_        |j                  |j                  z   r|j                  r|j!                  d@       |j"                  r|j$                  r|j!                  dA       |j&                  r|j(                  r|j!                  dB       t+        j,                  |j.                  dCD       t1        dQi dE|dF|j2                  d|j&                  dG|j4                  dH|j6                  j9                  dI      dJ|j                  dK|j:                  d|j(                  dL|j<                  d'|j.                  d/|j                  d5|j                  d7|j                  dM|j$                  dN|j"                  dO|j>                  dP|j@                  S )RNr   r  )progusagedescriptionfromfile_prefix_charsz--ignore-errors
store_truez7ignore errors when trying to generate stubs for modules)actionhelpz--no-importz{don't import the modules, just parse and analyze them (doesn't work with C extension modules and might not respect __all__)z--no-analysisz--parse-onlyr{   zdon't perform semantic analysis of sources, just parse them (only applies to Python modules, might affect quality of stubs. Not compatible with --inspect-mode))destr'  r(  z--inspect-moderv   zimport and inspect modules instead of parsing source code.This is the default behavior for c modules and pyc-only packages, but it is also useful for pure python modules with dynamically generated members.z--include-privatezqgenerate stubs for objects and members considered private (single leading underscore and no trailing underscores)z--export-lesszQdon't implicitly export all names imported from other modules in the same packagez--include-docstringsz*include existing docstrings with the stubsz-vz	--verbosezshow more verbose messagesz-qz--quietzshow fewer messagesz	--doc-dirPATHr  zuse .rst documentation in PATH (this may result in better stubs in some cases; consider setting this to DIR/Python-X.Y.Z/Doc/library))metavarr  r(  z--search-pathzaspecify module search directories, separated by ':' (currently only used if --no-import is given)z-oz--outputr~   outz2change the output directory [default: %(default)s])r+  r)  r  r(  z-mz--moduler   MODULEr   z5generate stub for module; can repeat for more modules)r'  r+  r)  r  r(  z-pz	--packagePACKAGEra   z7generate stubs for package recursively; can be repeatedr   r   z-generate stubs for given files or directories)r+  nargsr)  r(  z	--versionversionz	%(prog)s )r'  r0  r   z3May only specify one of: modules/packages or files.z.Cannot specify both quiet and verbose messageszACannot specify both --parse-only/--no-analysis and --inspect-modeT)exist_okrt   ru   rw   rx   :ry   r|   r}   r   r   r   r   r   )!argparseArgumentParserHEADERDESCRIPTIONadd_argumentr  r0  __version__
parse_argsr  version_info
executablery   r   ra   r   errorr   r   rv   r{   r  r  r~   r>   ru   rw   rx   r  r|   r}   r   r   )r   parsernsrt   s       r   parse_optionsr?  	  s   $$f+UXF F  
    .   X	   B   `  
 9  
 k,Eab
iCXY
(	   8	   A   D   F   <	   I{T\\=U=U/U   
		4	 B  !$I^^BN	zzBKKBHHJK	xxBJJEF	zzbmmXY KK- ,, 

 

	
 NN((- NN && == ** == 

  hh 

 hh  NN!" 00# r   c                    t         j                  j                  d       dt        j                  v s2dt        j                  v s t        j                  j                  dd       t        | t        j                  dd  n|       }t        |       y )Nr   r  r[  r   r   )	r  r  check_python_versionr  r   r  r?  argvr   )r   r  s     r   mainrC    s_    II""9- #((NcSXXo2DLCHHQRLdCG7r   rE  )r$  r0   r   set[str])r)  zIterable[Expression]r   zIterator[str]r  )r  zlist[Statement]r   rD  )r  r&   r   zlist[tuple[str, Expression]])r   r#   r   r   )r   list[StubSource]r   rE  )r   rE  r   )tuple[list[StubSource], list[StubSource]])r   r   r   r   )r   r   r   r   )r  r>   r  r  r   z;tuple[list[StubSource], list[StubSource], list[StubSource]])
r   r   ra   r   r   r   r   r   r   rF  )r   r   r   r   )r   r   rJ  rv  r   ztuple[str, int])
r   r   ra   r   rx   r   rt   r   r   rE  )r  r>   r   r  )r  r   r  r  r   r   )
r  rE  r{   r   r  r  r   r   r   r   )r  r   r  r   r{   r   rv   r   r}   r   r   r   r   r   rw   r   r  r   r   r   )r  r>   r   r   )r   r   r   r>   rs   )r   r   r   r   )r   rN  r   r3  r-  r  os.pathr  r  typingr   r   r   
mypy.buildr  mypy.mixedtraverser
mypy.parsemypy.traverser	mypy.utilmypy.versionr   mypy.errorsr   r	   mypy.find_sourcesr
   r   mypy.modulefinderr   r   r   r   r   mypy.moduleinspectr   r   
mypy.nodesr   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-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   mypy.optionsr>   r  mypy.sharedparser?   mypy.stubdocr@   rA   mypy.stubgencrB   rC   mypy.stubutilrD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   
mypy.typesrV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   mypy.visitorr`   rf   __annotations__rg   rp   r   r   r   r   r   r   r   r   r   r   r&  r(  r  TraverserVisitorr!  rA  rC  mixedtraverserMixedTraverserVisitorr?  r  r  r  r  r   r  r  r  r  r  r  r  rR  r  r  r  r
  r  r   r5  r6  r?  rC  r   r   r   r   <module>r_     sw  &P #   	  
  , ,        , C  :, , , , , , , , , , , ,Z 0 8 , M        % ] \	5 	$ 5 	,5 ,5^   8 u e u "U "U  
E  
  e c);s# c)L8$t~~66 $.>'$d))?? '$TkI($..*I*I kI\9DNN33 9#[&&!,&@&@%%"+%6:%CG%.%B<"+:CP_B,,S S.2SBMSX\S	S: !$/	// 	/
 / / / / / / 
/d7Pt
=HV zF r   