From 73682b95f557767dc3f2d84aebc0599604a1f776 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Fri, 10 Aug 2018 19:50:21 +0200 Subject: [PATCH] Move get_item to a separate function --- jedi/evaluate/__init__.py | 3 + jedi/evaluate/base_context.py | 103 ++++++++++++++++++---------------- 2 files changed, 57 insertions(+), 49 deletions(-) diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index 78aea1e1..7e1ba08e 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -67,6 +67,7 @@ from parso.python import tree import parso from parso import python_bytes_to_unicode +from jedi._compatibility import unicode from jedi import debug from jedi import parser_utils from jedi.evaluate.utils import unite @@ -83,6 +84,8 @@ from jedi.evaluate.context import ClassContext, FunctionContext, \ from jedi.evaluate.context.iterable import CompForContext from jedi.evaluate.syntax_tree import eval_trailer, eval_expr_stmt, \ eval_node, check_tuple_assignments +from jedi.evaluate.helpers import EvaluatorIndexError, EvaluatorKeyError, \ + EvaluatorTypeError def _execute(context, arguments): diff --git a/jedi/evaluate/base_context.py b/jedi/evaluate/base_context.py index 78db6615..a45b487f 100644 --- a/jedi/evaluate/base_context.py +++ b/jedi/evaluate/base_context.py @@ -52,55 +52,6 @@ class Context(BaseContext): else: return iter_method() - def get_item(self, index_contexts, contextualized_node): - from jedi.evaluate.compiled import CompiledObject - from jedi.evaluate.context.iterable import Slice, Sequence - result = ContextSet() - - for index in index_contexts: - if isinstance(index, Slice): - index = index.obj - if isinstance(index, CompiledObject): - try: - index = index.get_safe_value() - except ValueError: - pass - - if type(index) not in (float, int, str, unicode, slice, bytes): - # If the index is not clearly defined, we have to get all the - # possiblities. - if isinstance(self, Sequence) and self.array_type == 'dict': - result |= self.dict_values() - else: - result |= iterate_contexts(ContextSet(self)) - continue - - # The actual getitem call. - try: - getitem = self.py__simple_getitem__ - except AttributeError: - from jedi.evaluate import analysis - # TODO this context is probably not right. - analysis.add( - contextualized_node.context, - 'type-error-not-subscriptable', - contextualized_node.node, - message="TypeError: '%s' object is not subscriptable" % self - ) - else: - try: - result |= getitem(index) - except EvaluatorIndexError: - result |= iterate_contexts(ContextSet(self)) - except EvaluatorKeyError: - # Must be a dict. Lists don't raise KeyErrors. - result |= self.dict_values() - except EvaluatorTypeError: - # The type is wrong and therefore it makes no sense to do - # anything anymore. - result = NO_CONTEXTS - return result - def eval_node(self, node): return self.evaluator.eval_element(self, node) @@ -216,6 +167,57 @@ class ContextualizedName(ContextualizedNode): return indexes +def _get_item(context, index_contexts, contextualized_node): + from jedi.evaluate.compiled import CompiledObject + from jedi.evaluate.context.iterable import Slice, Sequence + + # The actual getitem call. + try: + getitem = context.py__simple_getitem__ + except AttributeError: + from jedi.evaluate import analysis + # TODO this context is probably not right. + analysis.add( + contextualized_node.context, + 'type-error-not-subscriptable', + contextualized_node.node, + message="TypeError: '%s' object is not subscriptable" % context + ) + return NO_CONTEXTS + + result = ContextSet() + for index in index_contexts: + if isinstance(index, Slice): + index = index.obj + if isinstance(index, CompiledObject): + try: + index = index.get_safe_value() + except ValueError: + pass + + if type(index) not in (float, int, str, unicode, slice, bytes): + # If the index is not clearly defined, we have to get all the + # possiblities. + if isinstance(context, Sequence) and context.array_type == 'dict': + result |= context.dict_values() + else: + result |= iterate_contexts(ContextSet(context)) + continue + else: + try: + result |= getitem(index) + except EvaluatorIndexError: + result |= iterate_contexts(ContextSet(context)) + except EvaluatorKeyError: + # Must be a dict. Lists don't raise KeyErrors. + result |= context.dict_values() + except EvaluatorTypeError: + # The type is wrong and therefore it makes no sense to do + # anything anymore. + result = NO_CONTEXTS + return result + + class ContextSet(BaseContextSet): def py__class__(self): return ContextSet.from_iterable(c.py__class__() for c in self._set) @@ -234,6 +236,9 @@ class ContextSet(BaseContextSet): def execute_evaluated(self, *args, **kwargs): return ContextSet.from_sets(execute_evaluated(c, *args, **kwargs) for c in self._set) + def get_item(self, *args, **kwargs): + return ContextSet.from_sets(_get_item(c, *args, **kwargs) for c in self._set) + NO_CONTEXTS = ContextSet()