From 2dfbc2a0fda3c58491faa928fc2f9591ef2b03d1 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Mon, 17 Nov 2014 12:34:32 +0100 Subject: [PATCH] Start to rework dynamic params. However goto is now needed first. --- jedi/evaluate/__init__.py | 6 +++--- jedi/evaluate/dynamic.py | 35 ++++++++++++++++++++++------------- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index 8215bc1b..2ed640ec 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -177,7 +177,7 @@ class Evaluator(object): for trailer in element.children[1:]: if trailer == '**': # has a power operation. raise NotImplementedError - types = self._eval_trailer(types, trailer) + types = self.eval_trailer(types, trailer) return types elif pr.is_node(element, 'testlist_star_expr', 'testlist'): @@ -223,13 +223,13 @@ class Evaluator(object): return [iterable.Comprehension.from_atom(self, atom)] return [iterable.Array(self, atom)] - def _eval_trailer(self, types, trailer): + def eval_trailer(self, types, trailer): trailer_op, node = trailer.children[:2] if node == ')': # `arglist` is optional. node = () new_types = [] for typ in types: - debug.dbg('_eval_trailer: %s in scope %s', trailer, typ) + debug.dbg('eval_trailer: %s in scope %s', trailer, typ) if trailer_op == '.': new_types += self.find_types(typ, node) elif trailer_op == '(': diff --git a/jedi/evaluate/dynamic.py b/jedi/evaluate/dynamic.py index 52a4d3f3..7612eb48 100644 --- a/jedi/evaluate/dynamic.py +++ b/jedi/evaluate/dynamic.py @@ -56,6 +56,7 @@ def search_params(evaluator, param): """ if not settings.dynamic_params: return [] + from jedi.evaluate import representation as er def get_params_for_module(module): """ @@ -64,13 +65,30 @@ def search_params(evaluator, param): @memoize_default([], evaluator_is_first_arg=True) def get_posibilities(evaluator, module, func_name): try: - possible_stmts = module.used_names[func_name] + names = module.used_names[func_name] except KeyError: return [] - for stmt in possible_stmts: - if isinstance(stmt, pr.Import): + for name in names: + stmt = name.get_definition() + if not isinstance(stmt, pr.ExprStmt): continue + print(stmt, stmt.start_pos, name.parent) + try: + trailer = name.parent.children[1] + except IndexError: + continue + else: + types = evaluator.goto(name) + + if compare in types: + # Only if we have the correct function we execute + # it, otherwise just ignore it. + evaluator.eval_trailer(types, trailer) + + continue + + calls = helpers.scan_statement_for_calls(stmt, func_name) for c in calls: # no execution means that params cannot be set @@ -120,7 +138,7 @@ def search_params(evaluator, param): result = [] for params in get_posibilities(evaluator, module, func_name): for p in params: - if str(p) == param_name: + if str(p) == param.name: result += evaluator.eval_statement(p.get_definition()) return result @@ -132,15 +150,6 @@ def search_params(evaluator, param): func_name = unicode(func.parent.name) compare = func.parent - # get the param name - if param.assignment_details: - # first assignment details, others would be a syntax error - expression_list, op = param.assignment_details[0] - else: - expression_list = param.expression_list() - offset = 1 if expression_list[0] in ['*', '**'] else 0 - param_name = str(expression_list[offset].name) - # add the listener listener = ParamListener() func.listeners.add(listener)