diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index dda4b85b..7538e091 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -170,6 +170,7 @@ class Evaluator(object): if trailer == '**': # has a power operation. raise NotImplementedError types = self.eval_trailer(types, trailer) + return types else: raise NotImplementedError @@ -191,6 +192,8 @@ class Evaluator(object): def eval_trailer(self, types, trailer): trailer_op, node = trailer.children[:2] + if node == ')': # `arglist` is optional. + node = None new_types = [] for typ in types: if trailer_op == '.': @@ -202,15 +205,16 @@ class Evaluator(object): return new_types @debug.increase_indent - def execute(self, obj, params=()): + def execute(self, obj, arguments=()): + arguments = er.Arguments(self, arguments) if obj.isinstance(er.Function): obj = obj.get_decorated_func() - debug.dbg('execute: %s %s', obj, params) + debug.dbg('execute: %s %s', obj, arguments) try: # Some stdlib functions like super(), namedtuple(), etc. have been # hard-coded in Jedi to support them. - return stdlib.execute(self, obj, params) + return stdlib.execute(self, obj, arguments) except stdlib.NotInStdLib: pass @@ -220,7 +224,7 @@ class Evaluator(object): debug.warning("no execution possible %s", obj) return [] else: - types = func(self, params) + types = func(self, arguments) debug.dbg('execute result: %s in %s', types, obj) return types diff --git a/jedi/evaluate/representation.py b/jedi/evaluate/representation.py index f5f28d99..1cf2703c 100644 --- a/jedi/evaluate/representation.py +++ b/jedi/evaluate/representation.py @@ -335,6 +335,31 @@ class InstanceElement(use_metaclass(CachedMetaClass, pr.Base)): return "<%s of %s>" % (type(self).__name__, self.var) +class Arguments(object): + def __init__(self, evaluator, argument_node): + self._argument_node = argument_node + self._evaluator = evaluator + + def _split(self): + iterator = iter(self._argument_node.children) + for child in iterator: + if child == ',': + continue + elif child in ('*', '**'): + yield len(child), next(iterator) + else: + yield 0, child + + def kwargs(self): + return [] + + def args(self): + return [] + + def eval_args(self): + return [self._evaluator.eval_element(el) for stars, el in self._split()] + + class Wrapper(pr.Base): def is_scope(self): return True diff --git a/jedi/parser/representation.py b/jedi/parser/representation.py index 79fd0074..c91540a2 100644 --- a/jedi/parser/representation.py +++ b/jedi/parser/representation.py @@ -581,7 +581,9 @@ class SubModule(Scope, Module): string = re.sub('\.[a-z]+-\d{2}[mud]{0,3}$', '', r.group(1)) # Positions are not real, but a module starts at (1, 0) p = (1, 0) - return Name(self, string, self.use_as_parent, p) + name = Name(string, p) + name.parent = self + return name @property def has_explicit_absolute_import(self):