From 7607db801f7d8d89b044cfba97fdcc81af7780fa Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Sat, 3 Dec 2016 02:54:09 +0100 Subject: [PATCH] Rewrite the next function. --- jedi/evaluate/__init__.py | 1 + jedi/evaluate/compiled/fake/builtins.pym | 11 ----------- jedi/evaluate/iterable.py | 2 +- jedi/evaluate/stdlib.py | 20 ++++++++++++++++++++ 4 files changed, 22 insertions(+), 12 deletions(-) diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index 4bc9af16..e51eb769 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -93,6 +93,7 @@ class Evaluator(object): self.analysis = [] self.dynamic_params_depth = 0 self.is_analysis = False + self.python_version = sys.version_info[:2] if sys_path is None: sys_path = sys.path diff --git a/jedi/evaluate/compiled/fake/builtins.pym b/jedi/evaluate/compiled/fake/builtins.pym index 2fc50ce1..692c8f8b 100644 --- a/jedi/evaluate/compiled/fake/builtins.pym +++ b/jedi/evaluate/compiled/fake/builtins.pym @@ -6,17 +6,6 @@ possible for the auto completion. """ -def next(iterator, default=None): - if random.choice([0, 1]): - if hasattr("next"): - return iterator.next() - else: - return iterator.__next__() - else: - if default is not None: - return default - - def iter(collection, sentinel=None): if sentinel: yield collection() diff --git a/jedi/evaluate/iterable.py b/jedi/evaluate/iterable.py index ebc6645d..568dd4e1 100644 --- a/jedi/evaluate/iterable.py +++ b/jedi/evaluate/iterable.py @@ -123,7 +123,7 @@ def has_builtin_methods(cls): def register_builtin_method(method_name, python_version_match=None): def wrapper(func): - if python_version_match and python_version_match + int(is_py3) == 3: + if python_version_match and python_version_match == 2 + int(is_py3): # Some functions do only apply to certain versions. return func dct = func.__dict__.setdefault('registered_builtin_methods', {}) diff --git a/jedi/evaluate/stdlib.py b/jedi/evaluate/stdlib.py index 451fb395..eb220fa4 100644 --- a/jedi/evaluate/stdlib.py +++ b/jedi/evaluate/stdlib.py @@ -106,6 +106,25 @@ def argument_clinic(string, want_obj=False, want_context=False, want_arguments=F return f +@argument_clinic('iterator[, default], /') +def builtins_next(evaluator, iterators, defaults): + if evaluator.python_version[0] == 2: + name = 'next' + else: + name = '__next__' + + types = set() + for iterator in iterators: + if isinstance(iterator, AbstractInstanceContext): + for filter in iterator.get_filters(include_self_names=True): + for n in filter.get(name): + for context in n.infer(): + types |= context.execute_evaluated() + if types: + return types + return defaults + + @argument_clinic('object, name[, default], /') def builtins_getattr(evaluator, objects, names, defaults=None): # follow the first param @@ -249,6 +268,7 @@ def _return_first_param(evaluator, firsts): _implemented = { 'builtins': { + 'next': builtins_next, 'getattr': builtins_getattr, 'type': builtins_type, 'super': builtins_super,