Move lazy contexts to a separate module not in contexts

This commit is contained in:
Dave Halter
2017-09-30 18:02:02 +02:00
parent 16011a91af
commit 39b24ff2df
11 changed files with 41 additions and 38 deletions

View File

@@ -14,6 +14,7 @@ from jedi.cache import underscore_memoization, memoize_method
from jedi.evaluate.filters import AbstractFilter, AbstractNameDefinition, \ from jedi.evaluate.filters import AbstractFilter, AbstractNameDefinition, \
ContextNameMixin ContextNameMixin
from jedi.evaluate.base_context import Context, ContextSet from jedi.evaluate.base_context import Context, ContextSet
from jedi.evaluate.lazy_context import LazyKnownContext
from jedi.evaluate.compiled.getattr_static import getattr_static from jedi.evaluate.compiled.getattr_static import getattr_static
from . import fake from . import fake
@@ -231,7 +232,6 @@ class CompiledObject(Context):
# Get rid of side effects, we won't call custom `__getitem__`s. # Get rid of side effects, we won't call custom `__getitem__`s.
return return
from jedi.evaluate.context import LazyKnownContext
for i, part in enumerate(self.obj): for i, part in enumerate(self.obj):
if i > 20: if i > 20:
# Should not go crazy with large iterators # Should not go crazy with large iterators

View File

@@ -1,4 +1,3 @@
from jedi.evaluate.context.lazy import AbstractLazyContext, LazyKnownContext, \
LazyKnownContexts, LazyTreeContext, LazyUnknownContext, get_merged_lazy_context
from jedi.evaluate.context.module import ModuleContext from jedi.evaluate.context.module import ModuleContext
from jedi.evaluate.context.klass import ClassContext from jedi.evaluate.context.klass import ClassContext
#from jedi.evaluate.context.function import FunctionContext

View File

@@ -14,7 +14,8 @@ from jedi.evaluate.filters import ParserTreeFilter, FunctionExecutionFilter, \
ContextName, AbstractNameDefinition, ParamName ContextName, AbstractNameDefinition, ParamName
from jedi.evaluate.base_context import ContextualizedNode, NO_CONTEXTS, \ from jedi.evaluate.base_context import ContextualizedNode, NO_CONTEXTS, \
ContextSet, TreeContext ContextSet, TreeContext
from jedi.evaluate.context import LazyKnownContexts, LazyKnownContext, LazyTreeContext from jedi.evaluate.lazy_context import LazyKnownContexts, LazyKnownContext, \
LazyTreeContext
from jedi.evaluate.context import iterable from jedi.evaluate.context import iterable
from jedi import parser_utils from jedi import parser_utils
from jedi.evaluate.parser_cache import get_yield_exprs from jedi.evaluate.parser_cache import get_yield_exprs

View File

@@ -6,7 +6,7 @@ from jedi.evaluate import compiled
from jedi.evaluate import filters from jedi.evaluate import filters
from jedi.evaluate.base_context import Context, NO_CONTEXTS, ContextSet, \ from jedi.evaluate.base_context import Context, NO_CONTEXTS, ContextSet, \
iterator_to_context_set iterator_to_context_set
from jedi.evaluate.context import LazyKnownContext, LazyKnownContexts from jedi.evaluate.lazy_context import LazyKnownContext, LazyKnownContexts
from jedi.evaluate.cache import evaluator_method_cache from jedi.evaluate.cache import evaluator_method_cache
from jedi.evaluate.param import AbstractArguments, AnonymousArguments from jedi.evaluate.param import AbstractArguments, AnonymousArguments
from jedi.cache import memoize_method from jedi.cache import memoize_method

View File

@@ -24,8 +24,9 @@ from jedi import debug
from jedi import settings from jedi import settings
from jedi.evaluate import compiled from jedi.evaluate import compiled
from jedi.evaluate import analysis from jedi.evaluate import analysis
from jedi.evaluate import context
from jedi.evaluate import recursion from jedi.evaluate import recursion
from jedi.evaluate.lazy_context import LazyKnownContext, LazyKnownContexts, \
LazyTreeContext
from jedi.evaluate.helpers import is_string, predefine_names, evaluate_call_of_leaf from jedi.evaluate.helpers import is_string, predefine_names, evaluate_call_of_leaf
from jedi.evaluate.utils import safe_property from jedi.evaluate.utils import safe_property
from jedi.evaluate.utils import to_list from jedi.evaluate.utils import to_list
@@ -187,7 +188,7 @@ class Comprehension(AbstractIterable):
def py__iter__(self): def py__iter__(self):
for set_ in self._iterate(): for set_ in self._iterate():
yield context.LazyKnownContexts(set_) yield LazyKnownContexts(set_)
def __repr__(self): def __repr__(self):
return "<%s of %s>" % (type(self).__name__, self._atom) return "<%s of %s>" % (type(self).__name__, self._atom)
@@ -243,7 +244,7 @@ class DictComprehension(ArrayMixin, Comprehension):
def py__iter__(self): def py__iter__(self):
for keys, values in self._iterate(): for keys, values in self._iterate():
yield context.LazyKnownContexts(keys) yield LazyKnownContexts(keys)
def py__getitem__(self, index): def py__getitem__(self, index):
for keys, values in self._iterate(): for keys, values in self._iterate():
@@ -258,7 +259,7 @@ class DictComprehension(ArrayMixin, Comprehension):
@register_builtin_method('values') @register_builtin_method('values')
def _imitate_values(self): def _imitate_values(self):
lazy_context = context.LazyKnownContexts(self.dict_values()) lazy_context = LazyKnownContexts(self.dict_values())
return ContextSet(FakeSequence(self.evaluator, 'list', [lazy_context])) return ContextSet(FakeSequence(self.evaluator, 'list', [lazy_context]))
@register_builtin_method('items') @register_builtin_method('items')
@@ -266,7 +267,7 @@ class DictComprehension(ArrayMixin, Comprehension):
items = ContextSet.from_iterable( items = ContextSet.from_iterable(
FakeSequence( FakeSequence(
self.evaluator, 'tuple' self.evaluator, 'tuple'
(context.LazyKnownContexts(keys), context.LazyKnownContexts(values)) (LazyKnownContexts(keys), LazyKnownContexts(values))
) for keys, values in self._iterate() ) for keys, values in self._iterate()
) )
@@ -322,10 +323,10 @@ class SequenceLiteralContext(ArrayMixin, AbstractIterable):
# 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 context.LazyKnownContexts(types) yield LazyKnownContexts(types)
else: else:
for node in self._items(): for node in self._items():
yield context.LazyTreeContext(self._defining_context, node) yield LazyTreeContext(self._defining_context, node)
for addition in check_array_additions(self._defining_context, self): for addition in check_array_additions(self._defining_context, self):
yield addition yield addition
@@ -372,7 +373,7 @@ class SequenceLiteralContext(ArrayMixin, AbstractIterable):
for key_node, value in self._items(): for key_node, value in self._items():
for key in self._defining_context.eval_node(key_node): for key in self._defining_context.eval_node(key_node):
if is_string(key): if is_string(key):
yield key.obj, context.LazyTreeContext(self._defining_context, value) yield key.obj, LazyTreeContext(self._defining_context, value)
def __repr__(self): def __repr__(self):
return "<%s of %s>" % (self.__class__.__name__, self.atom) return "<%s of %s>" % (self.__class__.__name__, self.atom)
@@ -389,16 +390,16 @@ class DictLiteralContext(SequenceLiteralContext):
@register_builtin_method('values') @register_builtin_method('values')
def _imitate_values(self): def _imitate_values(self):
lazy_context = context.LazyKnownContexts(self.dict_values()) lazy_context = LazyKnownContexts(self.dict_values())
return ContextSet(FakeSequence(self.evaluator, 'list', [lazy_context])) return ContextSet(FakeSequence(self.evaluator, 'list', [lazy_context]))
@register_builtin_method('items') @register_builtin_method('items')
def _imitate_items(self): def _imitate_items(self):
lazy_contexts = [ lazy_contexts = [
context.LazyKnownContext(FakeSequence( LazyKnownContext(FakeSequence(
self.evaluator, 'tuple', self.evaluator, 'tuple',
(context.LazyTreeContext(self._defining_context, key_node), (LazyTreeContext(self._defining_context, key_node),
context.LazyTreeContext(self._defining_context, value_node)) LazyTreeContext(self._defining_context, value_node))
)) for key_node, value_node in self._items() )) for key_node, value_node in self._items()
] ]
@@ -441,7 +442,7 @@ class FakeDict(_FakeArray):
def py__iter__(self): def py__iter__(self):
for key in self._dct: for key in self._dct:
yield context.LazyKnownContext(compiled.create(self.evaluator, key)) yield LazyKnownContext(compiled.create(self.evaluator, key))
def py__getitem__(self, index): def py__getitem__(self, index):
return self._dct[index].infer() return self._dct[index].infer()

View File

@@ -40,6 +40,7 @@ py__doc__(include_call_signature: Returns the docstring for a context.
from jedi._compatibility import use_metaclass from jedi._compatibility import use_metaclass
from jedi.evaluate.cache import evaluator_method_cache, CachedMetaClass from jedi.evaluate.cache import evaluator_method_cache, CachedMetaClass
from jedi.evaluate import compiled from jedi.evaluate import compiled
from jedi.evaluate.lazy_context import LazyKnownContext
from jedi.evaluate.filters import ParserTreeFilter, TreeNameDefinition, \ from jedi.evaluate.filters import ParserTreeFilter, TreeNameDefinition, \
ContextName, AnonymousInstanceParamName ContextName, AnonymousInstanceParamName
from jedi.evaluate.base_context import ContextSet, iterator_to_context_set, \ from jedi.evaluate.base_context import ContextSet, iterator_to_context_set, \
@@ -138,7 +139,6 @@ class ClassContext(use_metaclass(CachedMetaClass, TreeContext)):
args = param.TreeArguments(self.evaluator, self, arglist) args = param.TreeArguments(self.evaluator, self, arglist)
return [value for key, value in args.unpack() if key is None] return [value for key, value in args.unpack() if key is None]
else: else:
from jedi.evaluate.context import LazyKnownContext
return [LazyKnownContext(compiled.create(self.evaluator, object))] return [LazyKnownContext(compiled.create(self.evaluator, object))]
def py__call__(self, params): def py__call__(self, params):

View File

@@ -25,7 +25,7 @@ from jedi.evaluate.utils import indent_block
from jedi.evaluate.cache import evaluator_method_cache from jedi.evaluate.cache import evaluator_method_cache
from jedi.evaluate.base_context import iterator_to_context_set, ContextSet, \ from jedi.evaluate.base_context import iterator_to_context_set, ContextSet, \
NO_CONTEXTS NO_CONTEXTS
from jedi.evaluate.context import LazyKnownContexts from jedi.evaluate.lazy_context import LazyKnownContexts
DOCSTRING_PARAM_PATTERNS = [ DOCSTRING_PARAM_PATTERNS = [

View File

@@ -5,7 +5,8 @@ from jedi import debug
from jedi.evaluate.utils import PushBackIterator from jedi.evaluate.utils import PushBackIterator
from parso.python import tree from parso.python import tree
from jedi.evaluate import analysis from jedi.evaluate import analysis
from jedi.evaluate import context from jedi.evaluate.lazy_context import LazyKnownContext, LazyKnownContexts, \
LazyTreeContext, LazyUnknownContext, get_merged_lazy_context
from jedi.evaluate import docstrings from jedi.evaluate import docstrings
from jedi.evaluate import pep0484 from jedi.evaluate import pep0484
from jedi.evaluate.filters import ParamName from jedi.evaluate.filters import ParamName
@@ -14,7 +15,7 @@ from jedi.evaluate.context import iterable
def add_argument_issue(parent_context, error_name, lazy_context, message): def add_argument_issue(parent_context, error_name, lazy_context, message):
if isinstance(lazy_context, context.LazyTreeContext): if isinstance(lazy_context, LazyTreeContext):
node = lazy_context.data node = lazy_context.data
if node.parent.type == 'argument': if node.parent.type == 'argument':
node = node.parent node = node.parent
@@ -141,7 +142,7 @@ class TreeArguments(AbstractArguments):
for values in list(zip_longest(*iterators)): for values in list(zip_longest(*iterators)):
# TODO zip_longest yields None, that means this would raise # TODO zip_longest yields None, that means this would raise
# an exception? # an exception?
yield None, context.get_merged_lazy_context( yield None, get_merged_lazy_context(
[v for v in values if v is not None] [v for v in values if v is not None]
) )
elif star_count == 2: elif star_count == 2:
@@ -153,14 +154,14 @@ class TreeArguments(AbstractArguments):
if el.type == 'argument': if el.type == 'argument':
c = el.children c = el.children
if len(c) == 3: # Keyword argument. if len(c) == 3: # Keyword argument.
named_args.append((c[0].value, context.LazyTreeContext(self.context, c[2]),)) named_args.append((c[0].value, LazyTreeContext(self.context, c[2]),))
else: # Generator comprehension. else: # Generator comprehension.
# Include the brackets with the parent. # Include the brackets with the parent.
comp = iterable.GeneratorComprehension( comp = iterable.GeneratorComprehension(
self._evaluator, self.context, self.argument_node.parent) self._evaluator, self.context, self.argument_node.parent)
yield None, context.LazyKnownContext(comp) yield None, LazyKnownContext(comp)
else: else:
yield None, context.LazyTreeContext(self.context, el) yield None, LazyTreeContext(self.context, el)
# Reordering var_args is necessary, because star args sometimes appear # Reordering var_args is necessary, because star args sometimes appear
# after named argument, but in the actual order it's prepended. # after named argument, but in the actual order it's prepended.
@@ -217,7 +218,7 @@ class ValuesArguments(AbstractArguments):
def unpack(self, funcdef=None): def unpack(self, funcdef=None):
for values in self._values_list: for values in self._values_list:
yield None, context.LazyKnownContexts(values) yield None, LazyKnownContexts(values)
def get_calling_nodes(self): def get_calling_nodes(self):
return [] return []
@@ -307,30 +308,30 @@ def get_params(execution_context, var_args):
break break
lazy_context_list.append(argument) lazy_context_list.append(argument)
seq = iterable.FakeSequence(execution_context.evaluator, 'tuple', lazy_context_list) seq = iterable.FakeSequence(execution_context.evaluator, 'tuple', lazy_context_list)
result_arg = context.LazyKnownContext(seq) result_arg = LazyKnownContext(seq)
elif param.star_count == 2: elif param.star_count == 2:
# **kwargs param # **kwargs param
dct = iterable.FakeDict(execution_context.evaluator, dict(non_matching_keys)) dct = iterable.FakeDict(execution_context.evaluator, dict(non_matching_keys))
result_arg = context.LazyKnownContext(dct) result_arg = LazyKnownContext(dct)
non_matching_keys = {} non_matching_keys = {}
else: else:
# normal param # normal param
if argument is None: if argument is None:
# No value: Return an empty container # No value: Return an empty container
if param.default is None: if param.default is None:
result_arg = context.LazyUnknownContext() result_arg = LazyUnknownContext()
if not keys_only: if not keys_only:
for node in var_args.get_calling_nodes(): for node in var_args.get_calling_nodes():
m = _error_argument_count(funcdef, len(unpacked_va)) m = _error_argument_count(funcdef, len(unpacked_va))
analysis.add(parent_context, 'type-error-too-few-arguments', analysis.add(parent_context, 'type-error-too-few-arguments',
node, message=m) node, message=m)
else: else:
result_arg = context.LazyTreeContext(parent_context, param.default) result_arg = LazyTreeContext(parent_context, param.default)
else: else:
result_arg = argument result_arg = argument
result_params.append(ExecutedParam(execution_context, param, result_arg)) result_params.append(ExecutedParam(execution_context, param, result_arg))
if not isinstance(result_arg, context.LazyUnknownContext): if not isinstance(result_arg, LazyUnknownContext):
keys_used[param.name.value] = result_params[-1] keys_used[param.name.value] = result_params[-1]
if keys_only: if keys_only:
@@ -414,17 +415,17 @@ def _error_argument_count(funcdef, actual_count):
def _create_default_param(execution_context, param): def _create_default_param(execution_context, param):
if param.star_count == 1: if param.star_count == 1:
result_arg = context.LazyKnownContext( result_arg = LazyKnownContext(
iterable.FakeSequence(execution_context.evaluator, 'tuple', []) iterable.FakeSequence(execution_context.evaluator, 'tuple', [])
) )
elif param.star_count == 2: elif param.star_count == 2:
result_arg = context.LazyKnownContext( result_arg = LazyKnownContext(
iterable.FakeDict(execution_context.evaluator, {}) iterable.FakeDict(execution_context.evaluator, {})
) )
elif param.default is None: elif param.default is None:
result_arg = context.LazyUnknownContext() result_arg = LazyUnknownContext()
else: else:
result_arg = context.LazyTreeContext(execution_context.parent_context, param.default) result_arg = LazyTreeContext(execution_context.parent_context, param.default)
return ExecutedParam(execution_context, param, result_arg) return ExecutedParam(execution_context, param, result_arg)

View File

@@ -28,7 +28,7 @@ from parso.python import tree
from jedi.evaluate.cache import evaluator_method_cache from jedi.evaluate.cache import evaluator_method_cache
from jedi.evaluate import compiled from jedi.evaluate import compiled
from jedi.evaluate.base_context import NO_CONTEXTS, ContextSet from jedi.evaluate.base_context import NO_CONTEXTS, ContextSet
from jedi.evaluate.context import LazyTreeContext from jedi.evaluate.lazy_context import LazyTreeContext
from jedi.evaluate.context import ModuleContext from jedi.evaluate.context import ModuleContext
from jedi import debug from jedi import debug
from jedi import _compatibility from jedi import _compatibility

View File

@@ -21,8 +21,9 @@ from jedi.evaluate.context.instance import InstanceFunctionExecution, \
AnonymousInstanceFunctionExecution AnonymousInstanceFunctionExecution
from jedi.evaluate.base_context import ContextualizedNode, \ from jedi.evaluate.base_context import ContextualizedNode, \
NO_CONTEXTS, ContextSet NO_CONTEXTS, ContextSet
from jedi.evaluate.context import ClassContext, ModuleContext, LazyTreeContext from jedi.evaluate.context import ClassContext, ModuleContext
from jedi.evaluate.context import iterable from jedi.evaluate.context import iterable
from jedi.evaluate.lazy_context import LazyTreeContext
from jedi.evaluate.syntax_tree import is_string from jedi.evaluate.syntax_tree import is_string
# Now this is all part of fake tuples in Jedi. However super doesn't work on # Now this is all part of fake tuples in Jedi. However super doesn't work on