forked from VimPlug/jedi
Array fixes except for conversions.
This commit is contained in:
@@ -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.
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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])
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user