@@ -152,42 +152,54 @@ def resolve_import(self, files: dict[Path, File], lsp: SyncLanguageServer, file_
152152 """
153153 res = []
154154
155- # For import statements like "import os" or "from pathlib import Path"
156- # We need to find the dotted_name nodes that represent the imported modules/names
157- import warnings
158- with warnings .catch_warnings ():
159- warnings .simplefilter ("ignore" )
155+ try :
160156 if import_node .type == 'import_statement' :
161157 # Handle "import module" or "import module as alias"
162- # Look for dotted_name or aliased_import
163- query = self .language .query ("(dotted_name) @module (aliased_import) @aliased" )
164- else : # import_from_statement
165- # Handle "from module import name"
166- # Get the imported names (after the 'import' keyword)
167- query = self .language .query ("""
168- (import_from_statement
169- (dotted_name) @imported_name)
170- """ )
171-
172- captures = query .captures (import_node )
173-
174- # Try to resolve each imported name
175- if 'module' in captures :
176- for module_node in captures ['module' ]:
177- resolved = self .resolve_type (files , lsp , file_path , path , module_node )
178- res .extend (resolved )
179-
180- if 'aliased' in captures :
181- for aliased_node in captures ['aliased' ]:
182- # Get the actual module name from the aliased import
183- if aliased_node .child_count > 0 :
184- module_name_node = aliased_node .children [0 ]
185- resolved = self .resolve_type (files , lsp , file_path , path , module_name_node )
186- res .extend (resolved )
158+ # Find all dotted_name and aliased_import nodes
159+ for child in import_node .children :
160+ if child .type == 'dotted_name' :
161+ # Try to resolve the module/name
162+ identifier = child .children [0 ] if child .child_count > 0 else child
163+ resolved = self .resolve_type (files , lsp , file_path , path , identifier )
164+ res .extend (resolved )
165+ elif child .type == 'aliased_import' :
166+ # Get the actual name from aliased import (before 'as')
167+ if child .child_count > 0 :
168+ actual_name = child .children [0 ]
169+ if actual_name .type == 'dotted_name' and actual_name .child_count > 0 :
170+ identifier = actual_name .children [0 ]
171+ else :
172+ identifier = actual_name
173+ resolved = self .resolve_type (files , lsp , file_path , path , identifier )
174+ res .extend (resolved )
175+
176+ elif import_node .type == 'import_from_statement' :
177+ # Handle "from module import name1, name2"
178+ # Find the 'import' keyword to know where imported names start
179+ import_keyword_found = False
180+ for child in import_node .children :
181+ if child .type == 'import' :
182+ import_keyword_found = True
183+ continue
184+
185+ # After 'import' keyword, dotted_name nodes are the imported names
186+ if import_keyword_found and child .type == 'dotted_name' :
187+ # Try to resolve the imported name
188+ identifier = child .children [0 ] if child .child_count > 0 else child
189+ resolved = self .resolve_type (files , lsp , file_path , path , identifier )
190+ res .extend (resolved )
191+ elif import_keyword_found and child .type == 'aliased_import' :
192+ # Handle "from module import name as alias"
193+ if child .child_count > 0 :
194+ actual_name = child .children [0 ]
195+ if actual_name .type == 'dotted_name' and actual_name .child_count > 0 :
196+ identifier = actual_name .children [0 ]
197+ else :
198+ identifier = actual_name
199+ resolved = self .resolve_type (files , lsp , file_path , path , identifier )
200+ res .extend (resolved )
187201
188- if 'imported_name' in captures :
189- for name_node in captures ['imported_name' ]:
190- resolved = self .resolve_type (files , lsp , file_path , path , name_node )
191- res .extend (resolved )
202+ except Exception as e :
203+ logger .debug (f"Failed to resolve import: { e } " )
192204
193205 return res
0 commit comments