1313import warnings
1414import sys
1515
16+ from jedi ._compatibility import unicode
1617from jedi .parser import load_grammar
1718from jedi .parser import tree
18- from jedi .parser .diff import FastParser
19+ from jedi .parser .fast import FastParser
1920from jedi .parser .utils import save_parser
2021from jedi import debug
2122from jedi import settings
3334from jedi .evaluate .helpers import get_module_names
3435from jedi .evaluate .sys_path import get_venv_path
3536from jedi .evaluate .iterable import unpack_tuple_to_dict
36- from jedi .evaluate .filters import TreeNameDefinition
3737
3838# Jedi uses lots and lots of recursion. By setting this a little bit higher, we
3939# can remove some "maximum recursion depth" errors.
@@ -135,20 +135,15 @@ def __init__(self, source=None, line=None, column=None, path=None,
135135 self ._evaluator = Evaluator (self ._grammar , sys_path = sys_path )
136136 debug .speed ('init' )
137137
138- @cache .memoize_method
139- def _get_module_node (self ):
138+ def _get_module (self ):
140139 cache .invalidate_star_import_cache (self ._path )
141140 parser = FastParser (self ._grammar , self ._source , self .path )
142141 save_parser (self .path , parser , pickling = False )
143142
143+ module = self ._evaluator .wrap (parser .module )
144+ imports .add_module (self ._evaluator , unicode (module .name ), module )
144145 return parser .module
145146
146- @cache .memoize_method
147- def _get_module (self ):
148- module = er .ModuleContext (self ._evaluator , self ._get_module_node ())
149- imports .add_module (self ._evaluator , module .name .string_name , module )
150- return module
151-
152147 @property
153148 def source_path (self ):
154149 """
@@ -191,15 +186,12 @@ def goto_definitions(self):
191186
192187 :rtype: list of :class:`classes.Definition`
193188 """
194- module_node = self ._get_module_node ()
195- leaf = module_node .name_for_position (self ._pos )
189+ leaf = self ._get_module ().name_for_position (self ._pos )
196190 if leaf is None :
197- leaf = module_node .get_leaf_for_position (self ._pos )
191+ leaf = self . _get_module () .get_leaf_for_position (self ._pos )
198192 if leaf is None :
199193 return []
200-
201- context = self ._evaluator .create_context (self ._get_module (), leaf )
202- definitions = helpers .evaluate_goto_definition (self ._evaluator , context , leaf )
194+ definitions = helpers .evaluate_goto_definition (self ._evaluator , leaf )
203195
204196 names = [s .name for s in definitions ]
205197 defs = [classes .Definition (self ._evaluator , name ) for name in names ]
@@ -219,9 +211,11 @@ def goto_assignments(self, follow_imports=False):
219211 """
220212 def filter_follow_imports (names ):
221213 for name in names :
222- if isinstance (name , (imports .ImportName , TreeNameDefinition )):
223- for context in name .infer ():
224- yield context .name
214+ definition = name .get_definition ()
215+ if definition .type in ('import_name' , 'import_from' ):
216+ imp = imports .ImportWrapper (self ._evaluator , name )
217+ for name in filter_follow_imports (imp .follow (is_goto = True )):
218+ yield name
225219 else :
226220 yield name
227221
@@ -236,11 +230,10 @@ def _goto(self):
236230 """
237231 Used for goto_assignments and usages.
238232 """
239- name = self ._get_module_node ().name_for_position (self ._pos )
233+ name = self ._get_module ().name_for_position (self ._pos )
240234 if name is None :
241235 return []
242- context = self ._evaluator .create_context (self ._get_module (), name )
243- return list (self ._evaluator .goto (context , name ))
236+ return list (self ._evaluator .goto (name ))
244237
245238 def usages (self , additional_module_paths = ()):
246239 """
@@ -256,33 +249,37 @@ def usages(self, additional_module_paths=()):
256249 temp , settings .dynamic_flow_information = \
257250 settings .dynamic_flow_information , False
258251 try :
259- module_node = self ._get_module_node ()
260- user_stmt = module_node .get_statement_for_position (self ._pos )
261- definition_names = self ._goto ()
262- if not definition_names and isinstance (user_stmt , tree .Import ):
252+ user_stmt = self ._get_module ().get_statement_for_position (self ._pos )
253+ definitions = self ._goto ()
254+ if not definitions and isinstance (user_stmt , tree .Import ):
263255 # For not defined imports (goto doesn't find something, we take
264256 # the name as a definition. This is enough, because every name
265257 # points to it.
266258 name = user_stmt .name_for_position (self ._pos )
267259 if name is None :
268260 # Must be syntax
269261 return []
270- definition_names = [TreeNameDefinition ( self . _get_module (), name ) ]
262+ definitions = [name ]
271263
272- if not definition_names :
264+ if not definitions :
273265 # Without a definition for a name we cannot find references.
274266 return []
275267
276- definition_names = usages .resolve_potential_imports (self ._evaluator ,
277- definition_names )
268+ if not isinstance (user_stmt , tree .Import ):
269+ # import case is looked at with add_import_name option
270+ definitions = usages .usages_add_import_modules (self ._evaluator ,
271+ definitions )
272+
273+ module = set ([d .get_parent_until () for d in definitions ])
274+ module .add (self ._get_module ())
275+ names = usages .usages (self ._evaluator , definitions , module )
278276
279- modules = set ([d .get_root_context () for d in definition_names ])
280- modules .add (self ._get_module ())
281- definitions = usages .usages (self ._evaluator , definition_names , modules )
277+ for d in set (definitions ):
278+ names .append (classes .Definition (self ._evaluator , d ))
282279 finally :
283280 settings .dynamic_flow_information = temp
284281
285- return helpers .sorted_definitions (set (definitions ))
282+ return helpers .sorted_definitions (set (names ))
286283
287284 def call_signatures (self ):
288285 """
@@ -301,18 +298,13 @@ def call_signatures(self):
301298 :rtype: list of :class:`classes.CallSignature`
302299 """
303300 call_signature_details = \
304- helpers .get_call_signature_details (self ._get_module_node (), self ._pos )
301+ helpers .get_call_signature_details (self ._get_module (), self ._pos )
305302 if call_signature_details is None :
306303 return []
307304
308- context = self ._evaluator .create_context (
309- self ._get_module (),
310- call_signature_details .bracket_leaf
311- )
312305 with common .scale_speed_settings (settings .scale_call_signatures ):
313306 definitions = helpers .cache_call_signatures (
314307 self ._evaluator ,
315- context ,
316308 call_signature_details .bracket_leaf ,
317309 self ._code_lines ,
318310 self ._pos
@@ -327,29 +319,27 @@ def call_signatures(self):
327319
328320 def _analysis (self ):
329321 self ._evaluator .is_analysis = True
330- module_node = self ._get_module_node ()
331- self ._evaluator .analysis_modules = [module_node ]
322+ self ._evaluator .analysis_modules = [self ._get_module ()]
332323 try :
333- for node in module_node .nodes_to_execute ():
334- context = self ._get_module ().create_context (node )
324+ for node in self ._get_module ().nodes_to_execute ():
335325 if node .type in ('funcdef' , 'classdef' ):
336- # TODO This is stupid, should be private
337- from jedi . evaluate . finder import _name_to_types
338- # Resolve the decorators.
339- _name_to_types (self ._evaluator , context , node . children [ 1 ] )
326+ if node . type == 'classdef' :
327+ continue
328+ raise NotImplementedError
329+ er . Function (self ._evaluator , node ). get_decorated_func ( )
340330 elif isinstance (node , tree .Import ):
341331 import_names = set (node .get_defined_names ())
342332 if node .is_nested ():
343333 import_names |= set (path [- 1 ] for path in node .paths ())
344334 for n in import_names :
345- imports .infer_import ( context , n )
335+ imports .ImportWrapper ( self . _evaluator , n ). follow ( )
346336 elif node .type == 'expr_stmt' :
347- types = context . eval_node (node )
337+ types = self . _evaluator . eval_element (node )
348338 for testlist in node .children [:- 1 :2 ]:
349339 # Iterate tuples.
350340 unpack_tuple_to_dict (self ._evaluator , types , testlist )
351341 else :
352- try_iter_content (self ._evaluator .goto_definitions (context , node ))
342+ try_iter_content (self ._evaluator .goto_definitions (node ))
353343 self ._evaluator .reset_recursion_limitations ()
354344
355345 ana = [a for a in self ._evaluator .analysis if self .path == a .path ]
@@ -396,13 +386,11 @@ def __init__(self, source, namespaces, **kwds):
396386 super (Interpreter , self ).__init__ (source , ** kwds )
397387 self .namespaces = namespaces
398388
389+ parser_module = super (Interpreter , self )._get_module ()
390+ self ._module = interpreter .MixedModule (self ._evaluator , parser_module , self .namespaces )
391+
399392 def _get_module (self ):
400- parser_module = super (Interpreter , self )._get_module_node ()
401- return interpreter .MixedModuleContext (
402- self ._evaluator ,
403- parser_module ,
404- self .namespaces
405- )
393+ return self ._module
406394
407395
408396def defined_names (source , path = None , encoding = 'utf-8' ):
@@ -442,21 +430,13 @@ def names(source=None, path=None, encoding='utf-8', all_scopes=False,
442430 ``definitions=True``. E.g. ``a = b`` returns ``b``.
443431 """
444432 def def_ref_filter (_def ):
445- is_def = _def ._name . tree_name . is_definition ()
433+ is_def = _def .is_definition ()
446434 return definitions and is_def or references and not is_def
447435
448436 # Set line/column to a random position, because they don't matter.
449437 script = Script (source , line = 1 , column = 0 , path = path , encoding = encoding )
450- module_context = script ._get_module ()
451- defs = [
452- classes .Definition (
453- script ._evaluator ,
454- TreeNameDefinition (
455- module_context .create_context (name .parent ),
456- name
457- )
458- ) for name in get_module_names (script ._get_module_node (), all_scopes )
459- ]
438+ defs = [classes .Definition (script ._evaluator , name_part )
439+ for name_part in get_module_names (script ._get_module (), all_scopes )]
460440 return sorted (filter (def_ref_filter , defs ), key = lambda x : (x .line , x .column ))
461441
462442
0 commit comments