From 0b99473886bca96dcc4dc27bafb0abe88a100e66 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Mon, 30 Jun 2014 15:22:53 +0200 Subject: [PATCH] ExecutedParams should never be additionally faked, even if they are the first params. They have been legitimately created by a caller. --- jedi/evaluate/finder.py | 4 +++- jedi/evaluate/param.py | 2 +- jedi/evaluate/recursion.py | 2 +- test/static_analysis/descriptors.py | 13 +++++++++++++ 4 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 test/static_analysis/descriptors.py diff --git a/jedi/evaluate/finder.py b/jedi/evaluate/finder.py index bd03c618..735bfb02 100644 --- a/jedi/evaluate/finder.py +++ b/jedi/evaluate/finder.py @@ -296,7 +296,9 @@ class NameFinder(object): cls = func.parent.get_parent_until((pr.Class, pr.Function)) - if isinstance(cls, pr.Class) and param.position_nr == 0: + from jedi.evaluate.param import ExecutedParam + if isinstance(cls, pr.Class) and param.position_nr == 0 \ + and not isinstance(param, ExecutedParam): # This is where we add self - if it has never been # instantiated. if isinstance(self.scope, er.InstanceElement): diff --git a/jedi/evaluate/param.py b/jedi/evaluate/param.py index 8f4f8fad..b55b7f1a 100644 --- a/jedi/evaluate/param.py +++ b/jedi/evaluate/param.py @@ -356,7 +356,7 @@ def _gen_param_name_copy(func, var_args, param, keys=(), values=(), array_type=N def _error_argument_count(func, actual_count): - default_arguments = sum(1 for p in func.params if p.assignment_details) + default_arguments = sum(1 for p in func.params if p.assignment_details or p.stars) if default_arguments == 0: before = 'exactly ' diff --git a/jedi/evaluate/recursion.py b/jedi/evaluate/recursion.py index e67f8fd6..a07299bb 100644 --- a/jedi/evaluate/recursion.py +++ b/jedi/evaluate/recursion.py @@ -39,7 +39,7 @@ class RecursionDetector(object): def push_stmt(self, stmt): self.current = _RecursionNode(stmt, self.current) check = self._check_recursion() - if check: # TODO remove False!!!! + if check: debug.warning('catched stmt recursion: %s against %s @%s', stmt, check.stmt, stmt.start_pos) self.pop_stmt() diff --git a/test/static_analysis/descriptors.py b/test/static_analysis/descriptors.py new file mode 100644 index 00000000..0fc5d159 --- /dev/null +++ b/test/static_analysis/descriptors.py @@ -0,0 +1,13 @@ +# classmethod +class TarFile(): + @classmethod + def open(cls, name, **kwargs): + return cls.taropen(name, **kwargs) + + @classmethod + def taropen(cls, name, **kwargs): + return name + + +# should just work +TarFile.open('hallo')