2828
2929from __future__ import annotations
3030
31- import importlib
3231import pkgutil
3332import tokenize
3433import warnings
6564TYPE_CHECKING = False
6665
6766if TYPE_CHECKING :
68- from typing import Any , Mapping
69- from types import ModuleType
67+ from typing import Any , Iterator , Mapping
7068
7169
7270MoreLinesCallable = Callable [[str ], bool ]
@@ -629,7 +627,7 @@ class ModuleCompleter:
629627 - from foo import (bar as baz, qux<tab>
630628 """
631629
632- def __init__ (self , namespace : Mapping [str , Any ] | None = None ):
630+ def __init__ (self , namespace : Mapping [str , Any ] | None = None ) -> None :
633631 self .namespace = namespace or {}
634632 self ._global_cache : list [str ] = []
635633 self ._curr_sys_path : list [str ] = sys .path [:]
@@ -679,7 +677,7 @@ def find_modules(self, path: str, prefix: str) -> list[str]:
679677 return [module .name for module in modules
680678 if module .name .startswith (prefix )]
681679
682- def iter_submodules (self , parent_modules ):
680+ def iter_submodules (self , parent_modules ) -> Iterator [ pkgutil . ModuleInfo ] :
683681 """Iterate over all submodules of the given parent modules."""
684682 specs = [info .module_finder .find_spec (info .name )
685683 for info in parent_modules if info .ispkg ]
@@ -716,7 +714,7 @@ def format_completion(self, path: str, module: str) -> str:
716714 return f'{ path } { module } '
717715 return f'{ path } .{ module } '
718716
719- def resolve_relative_name (self , name , package ):
717+ def resolve_relative_name (self , name , package ) -> str | None :
720718 """Resolve a relative module name to an absolute name.
721719
722720 Example: resolve_relative_name('.foo', 'bar') -> 'bar.foo'
@@ -765,7 +763,7 @@ class ImportParser:
765763 }
766764 _keywords = {'import' , 'from' , 'as' }
767765
768- def __init__ (self , code : str ):
766+ def __init__ (self , code : str ) -> None :
769767 self .code = code
770768 tokens = []
771769 try :
@@ -783,18 +781,18 @@ def __init__(self, code: str):
783781 tokens = []
784782 self .tokens = TokenQueue (tokens [::- 1 ])
785783
786- def parse (self ):
784+ def parse (self ) -> tuple [ str | None , str | None ] | None :
787785 if not (res := self ._parse ()):
788786 return None
789787 return res .from_name , res .name
790788
791- def _parse (self ):
789+ def _parse (self ) -> Result | None :
792790 with self .tokens .save_state ():
793791 return self .parse_from_import ()
794792 with self .tokens .save_state ():
795793 return self .parse_import ()
796794
797- def parse_import (self ):
795+ def parse_import (self ) -> Result :
798796 if self .code .rstrip ().endswith ('import' ) and self .code .endswith (' ' ):
799797 return Result (name = '' )
800798 if self .tokens .peek_string (',' ):
@@ -812,7 +810,7 @@ def parse_import(self):
812810 return Result (name = name )
813811 raise ParseError ('parse_import' )
814812
815- def parse_from_import (self ):
813+ def parse_from_import (self ) -> Result :
816814 if self .code .rstrip ().endswith ('import' ) and self .code .endswith (' ' ):
817815 return Result (from_name = self .parse_empty_from_import (), name = '' )
818816 if self .code .rstrip ().endswith ('from' ) and self .code .endswith (' ' ):
@@ -830,7 +828,7 @@ def parse_from_import(self):
830828 from_name = self .parse_empty_from_import ()
831829 return Result (from_name = from_name , name = name )
832830
833- def parse_empty_from_import (self ):
831+ def parse_empty_from_import (self ) -> str :
834832 if self .tokens .peek_string (',' ):
835833 self .tokens .pop ()
836834 self .parse_as_names ()
@@ -839,19 +837,19 @@ def parse_empty_from_import(self):
839837 self .tokens .pop_string ('import' )
840838 return self .parse_from ()
841839
842- def parse_from (self ):
840+ def parse_from (self ) -> str :
843841 from_name = self .parse_dotted_name ()
844842 self .tokens .pop_string ('from' )
845843 return from_name
846844
847- def parse_dotted_as_name (self ):
845+ def parse_dotted_as_name (self ) -> str :
848846 self .tokens .pop_name ()
849847 if self .tokens .peek_string ('as' ):
850848 self .tokens .pop ()
851849 with self .tokens .save_state ():
852850 return self .parse_dotted_name ()
853851
854- def parse_dotted_name (self ):
852+ def parse_dotted_name (self ) -> str :
855853 name = []
856854 if self .tokens .peek_string ('.' ):
857855 name .append ('.' )
@@ -873,13 +871,13 @@ def parse_dotted_name(self):
873871 self .tokens .pop ()
874872 return '' .join (name [::- 1 ])
875873
876- def parse_as_names (self ):
874+ def parse_as_names (self ) -> None :
877875 self .parse_as_name ()
878876 while self .tokens .peek_string (',' ):
879877 self .tokens .pop ()
880878 self .parse_as_name ()
881879
882- def parse_as_name (self ):
880+ def parse_as_name (self ) -> None :
883881 self .tokens .pop_name ()
884882 if self .tokens .peek_string ('as' ):
885883 self .tokens .pop ()
@@ -905,7 +903,7 @@ def __init__(self, tokens: list[TokenInfo]) -> None:
905903 self .stack : list [int ] = []
906904
907905 @contextmanager
908- def save_state (self ):
906+ def save_state (self ) -> Any :
909907 try :
910908 self .stack .append (self .index )
911909 yield
@@ -914,7 +912,7 @@ def save_state(self):
914912 else :
915913 self .stack .pop ()
916914
917- def __bool__ (self ):
915+ def __bool__ (self ) -> bool :
918916 return self .index < len (self .tokens )
919917
920918 def peek (self ) -> TokenInfo | None :
0 commit comments