2222 => Generate out/urllib/parse.pyi.
2323
2424 $ stubgen -p urllib
25- => Generate stubs for whole urlib package (recursively).
25+ => Generate stubs for whole urllib package (recursively).
2626
2727For C modules, you can get more precise function signatures by parsing .rst (Sphinx)
2828documentation for extra information. For this, use the --doc-dir option:
@@ -306,6 +306,13 @@ def visit_str_expr(self, node: StrExpr) -> str:
306306 return repr (node .value )
307307
308308 def visit_index_expr (self , node : IndexExpr ) -> str :
309+ base_fullname = self .stubgen .get_fullname (node .base )
310+ if base_fullname == "typing.Union" :
311+ if isinstance (node .index , TupleExpr ):
312+ return " | " .join ([item .accept (self ) for item in node .index .items ])
313+ return node .index .accept (self )
314+ if base_fullname == "typing.Optional" :
315+ return f"{ node .index .accept (self )} | None"
309316 base = node .base .accept (self )
310317 index = node .index .accept (self )
311318 if len (index ) > 2 and index .startswith ("(" ) and index .endswith (")" ):
@@ -682,7 +689,7 @@ def process_decorator(self, o: Decorator) -> None:
682689 self .add_decorator (qualname , require_name = False )
683690
684691 def get_fullname (self , expr : Expression ) -> str :
685- """Return the full name resolving imports and import aliases ."""
692+ """Return the expression's full name."""
686693 if (
687694 self .analyzed
688695 and isinstance (expr , (NameExpr , MemberExpr ))
@@ -691,16 +698,7 @@ def get_fullname(self, expr: Expression) -> str:
691698 ):
692699 return expr .fullname
693700 name = get_qualified_name (expr )
694- if "." not in name :
695- real_module = self .import_tracker .module_for .get (name )
696- real_short = self .import_tracker .reverse_alias .get (name , name )
697- if real_module is None and real_short not in self .defined_names :
698- real_module = "builtins" # not imported and not defined, must be a builtin
699- else :
700- name_module , real_short = name .split ("." , 1 )
701- real_module = self .import_tracker .reverse_alias .get (name_module , name_module )
702- resolved_name = real_short if real_module is None else f"{ real_module } .{ real_short } "
703- return resolved_name
701+ return self .resolve_name (name )
704702
705703 def visit_class_def (self , o : ClassDef ) -> None :
706704 self ._current_class = o
0 commit comments