1
0
forked from VimPlug/jedi

Array fixes except for conversions.

This commit is contained in:
Dave Halter
2016-11-13 16:18:46 +01:00
parent 21cfe4fc21
commit b2bdfe4a28
7 changed files with 21 additions and 16 deletions

View File

@@ -341,9 +341,9 @@ class Evaluator(object):
c = atom.children c = atom.children
if c[0].type == 'string': if c[0].type == 'string':
# Will be one string. # Will be one string.
types = self._eval_atom(c[0]) types = self._eval_atom(context, c[0])
for string in c[1:]: for string in c[1:]:
right = self._eval_atom(string) right = self._eval_atom(context, string)
types = precedence.calculate(self, types, '+', right) types = precedence.calculate(self, types, '+', right)
return types return types
# Parentheses without commas are not tuples. # Parentheses without commas are not tuples.

View File

@@ -3,7 +3,11 @@ from jedi.common import unite
class Context(object): class Context(object):
type = None # TODO remove type = None # TODO remove
api_type = '' api_type = 'instance'
"""
Most contexts are just instances of something, therefore make this the
default to make subclassing a lot easier.
"""
def __init__(self, evaluator, parent_context=None): def __init__(self, evaluator, parent_context=None):
self.evaluator = evaluator self.evaluator = evaluator

View File

@@ -671,9 +671,8 @@ def check_tuple_assignments(evaluator, types, name):
# index number is high. Therefore break if the loop is # index number is high. Therefore break if the loop is
# finished. # finished.
return set() return set()
if lazy_context is None: types = lazy_context.infer()
return types return types
return lazy_context.infer()
def filter_private_variable(scope, origin_node): def filter_private_variable(scope, origin_node):

View File

@@ -16,8 +16,6 @@ class AbstractInstanceContext(Context):
""" """
This class is used to evaluate instances. This class is used to evaluate instances.
""" """
api_type = 'instance'
def __init__(self, evaluator, parent_context, class_context, var_args): def __init__(self, evaluator, parent_context, class_context, var_args):
super(AbstractInstanceContext, self).__init__(evaluator, parent_context) super(AbstractInstanceContext, self).__init__(evaluator, parent_context)
# Generated instances are classes that are just generated by self # Generated instances are classes that are just generated by self

View File

@@ -265,7 +265,7 @@ class ArrayMixin(object):
return self.evaluator.BUILTINS return self.evaluator.BUILTINS
def dict_values(self): def dict_values(self):
return unite(self.evaluator.eval_element(v) for k, v in self._items()) return unite(self._defining_context.eval_node(v) for k, v in self._items())
@register_builtin_method('values', type='dict') @register_builtin_method('values', type='dict')
def _imitate_values(self): def _imitate_values(self):
@@ -386,7 +386,7 @@ class ArrayLiteralContext(ArrayMixin, AbstractSequence):
# We don't know which dict index comes first, therefore always # We don't know which dict index comes first, therefore always
# yield all the types. # yield all the types.
for _ in types: for _ in types:
yield types yield context.LazyKnownContexts(types)
else: else:
for node in self._items(): for node in self._items():
yield context.LazyTreeContext(self._defining_context, node) yield context.LazyTreeContext(self._defining_context, node)
@@ -847,8 +847,8 @@ class _ArrayInstance(IterableWrapper):
class Slice(object): class Slice(object):
def __init__(self, evaluator, start, stop, step): def __init__(self, context, start, stop, step):
self._evaluator = evaluator self._context = context
# all of them are either a Precedence or None. # all of them are either a Precedence or None.
self._start = start self._start = start
self._stop = stop self._stop = stop
@@ -864,7 +864,7 @@ class Slice(object):
if element is None: if element is None:
return None return None
result = self._evaluator.eval_element(element) result = self._context.eval_node(element)
if len(result) != 1: if len(result) != 1:
# For simplicity, we want slices to be clear defined with just # For simplicity, we want slices to be clear defined with just
# one type. Otherwise we will return an empty slice object. # one type. Otherwise we will return an empty slice object.
@@ -886,7 +886,7 @@ def create_index_types(evaluator, context, index):
""" """
if index == ':': if index == ':':
# Like array[:] # Like array[:]
return set([Slice(evaluator, None, None, None)]) return set([Slice(context, None, None, None)])
elif tree.is_node(index, 'subscript'): # subscript is a slice operation. elif tree.is_node(index, 'subscript'): # subscript is a slice operation.
# Like array[:3] # Like array[:3]
result = [] result = []
@@ -901,7 +901,7 @@ def create_index_types(evaluator, context, index):
result.append(el) result.append(el)
result += [None] * (3 - len(result)) result += [None] * (3 - len(result))
return set([Slice(evaluator, *result)]) return set([Slice(context, *result)])
# No slices # No slices
return context.eval_node(index) return context.eval_node(index)

View File

@@ -131,7 +131,7 @@ def _element_calculate(evaluator, left, operator, right):
r_is_num = _is_number(right) r_is_num = _is_number(right)
if operator == '*': if operator == '*':
# for iterables, ignore * operations # for iterables, ignore * operations
if isinstance(left, iterable.Array) or is_string(left): if isinstance(left, iterable.AbstractSequence) or is_string(left):
return set([left]) return set([left])
elif isinstance(right, iterable.Array) or is_string(right): elif isinstance(right, iterable.Array) or is_string(right):
return set([right]) return set([right])

View File

@@ -409,6 +409,8 @@ class ClassContext(use_metaclass(CachedMetaClass, context.TreeContext, Wrapper))
This class is not only important to extend `tree.Class`, it is also a This class is not only important to extend `tree.Class`, it is also a
important for descriptors (if the descriptor methods are evaluated or not). important for descriptors (if the descriptor methods are evaluated or not).
""" """
api_type = 'class'
def __init__(self, evaluator, classdef, parent_context): def __init__(self, evaluator, classdef, parent_context):
super(ClassContext, self).__init__(evaluator, parent_context=parent_context) super(ClassContext, self).__init__(evaluator, parent_context=parent_context)
self.classdef = classdef self.classdef = classdef
@@ -519,6 +521,8 @@ class FunctionContext(use_metaclass(CachedMetaClass, context.TreeContext, Wrappe
""" """
Needed because of decorators. Decorators are evaluated here. Needed because of decorators. Decorators are evaluated here.
""" """
api_type = 'function'
def __init__(self, evaluator, parent_context, funcdef): def __init__(self, evaluator, parent_context, funcdef):
""" This should not be called directly """ """ This should not be called directly """
super(FunctionContext, self).__init__(evaluator, parent_context) super(FunctionContext, self).__init__(evaluator, parent_context)