Move the base Context stuff to another module to keep context free for imports.

This commit is contained in:
Dave Halter
2017-09-30 16:46:07 +02:00
parent 3c2221ec2d
commit 3c75f27376
27 changed files with 62 additions and 60 deletions

View File

@@ -33,7 +33,7 @@ from jedi.evaluate.sys_path import get_venv_path, dotted_path_in_sys_path
from jedi.evaluate.iterable import unpack_tuple_to_dict
from jedi.evaluate.filters import TreeNameDefinition
from jedi.evaluate.syntax_tree import tree_name_to_contexts
from jedi.evaluate.context.module import ModuleContext
from jedi.evaluate.context import ModuleContext
from jedi.evaluate.context.module import ModuleName
# Jedi uses lots and lots of recursion. By setting this a little bit higher, we

View File

@@ -2,10 +2,10 @@
TODO Some parts of this module are still not well documented.
"""
from jedi.evaluate.context.module import ModuleContext
from jedi.evaluate.context import ModuleContext
from jedi.evaluate import compiled
from jedi.evaluate.compiled import mixed
from jedi.evaluate.context import Context
from jedi.evaluate.base_context import Context
class NamespaceObject(object):

View File

@@ -2,7 +2,7 @@ from jedi.api import classes
from parso.python import tree
from jedi.evaluate import imports
from jedi.evaluate.filters import TreeNameDefinition
from jedi.evaluate.context.module import ModuleContext
from jedi.evaluate.context import ModuleContext
def compare_contexts(c1, c2):

View File

@@ -78,7 +78,7 @@ from jedi.evaluate import compiled
from jedi.evaluate import helpers
from jedi.evaluate.filters import TreeNameDefinition, ParamName
from jedi.evaluate.context.instance import AnonymousInstance, BoundMethod
from jedi.evaluate.context import ContextualizedName, ContextualizedNode, \
from jedi.evaluate.base_context import ContextualizedName, ContextualizedNode, \
ContextSet, NO_CONTEXTS, iterate_contexts
from jedi.evaluate.context.function import FunctionContext
from jedi.evaluate.syntax_tree import eval_trailer, eval_expr_stmt, \

View File

@@ -92,7 +92,7 @@ def _check_for_setattr(instance):
"""
Check if there's any setattr method inside an instance. If so, return True.
"""
from jedi.evaluate.context.module import ModuleContext
from jedi.evaluate.context import ModuleContext
module = instance.get_root_context()
if not isinstance(module, ModuleContext):
return False

View File

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

View File

@@ -9,7 +9,8 @@ from jedi import settings
from jedi.evaluate import compiled
from jedi.cache import underscore_memoization
from jedi.evaluate import imports
from jedi.evaluate.context import Context, ContextSet
from jedi.evaluate.base_context import Context, ContextSet
from jedi.evaluate.context import ModuleContext
from jedi.evaluate.cache import evaluator_function_cache
from jedi.evaluate.compiled.getattr_static import getattr_static
@@ -206,7 +207,6 @@ def _create(evaluator, obj, parent_context=None, *args):
if parent_context.tree_node.get_root_node() == module_node:
module_context = parent_context.get_root_context()
else:
from jedi.evaluate.context.module import ModuleContext
module_context = ModuleContext(evaluator, module_node, path=path)
# TODO this __name__ is probably wrong.
name = compiled_object.get_root_context().py__name__()

View File

@@ -1,5 +1,3 @@
from jedi.evaluate.context.base import Context, iterate_contexts, \
TreeContext, ContextualizedName, ContextualizedNode, ContextSet, \
NO_CONTEXTS, iterator_to_context_set
from jedi.evaluate.context.lazy import AbstractLazyContext, LazyKnownContext, \
LazyKnownContexts, LazyTreeContext, LazyUnknownContext, get_merged_lazy_context
from jedi.evaluate.context.module import ModuleContext

View File

@@ -13,8 +13,9 @@ from jedi.evaluate import helpers
from jedi.evaluate import iterable
from jedi.evaluate.filters import ParserTreeFilter, FunctionExecutionFilter, \
ContextName, AbstractNameDefinition, ParamName
from jedi.evaluate import context
from jedi.evaluate.context import ContextualizedNode, NO_CONTEXTS, ContextSet
from jedi.evaluate.base_context import ContextualizedNode, NO_CONTEXTS, \
ContextSet, TreeContext
from jedi.evaluate.context import LazyKnownContexts, LazyKnownContext, LazyTreeContext
from jedi import parser_utils
from jedi.evaluate.parser_cache import get_yield_exprs
@@ -33,7 +34,7 @@ class LambdaName(AbstractNameDefinition):
return ContextSet(self._lambda_context)
class FunctionContext(use_metaclass(CachedMetaClass, context.TreeContext)):
class FunctionContext(use_metaclass(CachedMetaClass, TreeContext)):
"""
Needed because of decorators. Decorators are evaluated here.
"""
@@ -98,7 +99,7 @@ class FunctionContext(use_metaclass(CachedMetaClass, context.TreeContext)):
for param in self.tree_node.get_params()]
class FunctionExecutionContext(context.TreeContext):
class FunctionExecutionContext(TreeContext):
"""
This class is used to evaluate functions and their returns.
@@ -155,7 +156,7 @@ class FunctionExecutionContext(context.TreeContext):
def _eval_yield(self, yield_expr):
if yield_expr.type == 'keyword':
# `yield` just yields None.
yield context.LazyKnownContext(compiled.create(self.evaluator, None))
yield LazyKnownContext(compiled.create(self.evaluator, None))
return
node = yield_expr.children[1]
@@ -164,7 +165,7 @@ class FunctionExecutionContext(context.TreeContext):
for lazy_context in cn.infer().iterate(cn):
yield lazy_context
else:
yield context.LazyTreeContext(self, node)
yield LazyTreeContext(self, node)
@recursion.execution_recursion_decorator(default=iter([]))
def get_yield_values(self):
@@ -192,7 +193,7 @@ class FunctionExecutionContext(context.TreeContext):
else:
types = self.get_return_values(check_yields=True)
if types:
yield context.LazyKnownContexts(types)
yield LazyKnownContexts(types)
return
last_for_stmt = for_stmt
@@ -222,5 +223,3 @@ class FunctionExecutionContext(context.TreeContext):
@evaluator_method_cache()
def get_params(self):
return self.var_args.get_params(self)

View File

@@ -4,8 +4,9 @@ from jedi._compatibility import is_py3
from jedi import debug
from jedi.evaluate import compiled
from jedi.evaluate import filters
from jedi.evaluate.context import Context, LazyKnownContext, LazyKnownContexts, \
ContextSet, iterator_to_context_set, NO_CONTEXTS
from jedi.evaluate.base_context import Context, NO_CONTEXTS, ContextSet, \
iterator_to_context_set
from jedi.evaluate.context import LazyKnownContext, LazyKnownContexts
from jedi.evaluate.cache import evaluator_method_cache
from jedi.evaluate.param import AbstractArguments, AnonymousArguments
from jedi.cache import memoize_method

View File

@@ -43,8 +43,9 @@ from jedi.evaluate import compiled
from jedi.evaluate import param
from jedi.evaluate.filters import ParserTreeFilter, TreeNameDefinition, \
ContextName, AnonymousInstanceParamName
from jedi.evaluate import context
from jedi.evaluate.context import ContextSet, iterator_to_context_set
from jedi.evaluate.base_context import ContextSet, iterator_to_context_set, \
TreeContext
from jedi.evaluate.context import LazyKnownContext
def apply_py__get__(context, base_context):
@@ -84,7 +85,7 @@ class ClassFilter(ParserTreeFilter):
for name in names]
class ClassContext(use_metaclass(CachedMetaClass, context.TreeContext)):
class ClassContext(use_metaclass(CachedMetaClass, TreeContext)):
"""
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).
@@ -138,7 +139,7 @@ class ClassContext(use_metaclass(CachedMetaClass, context.TreeContext)):
args = param.TreeArguments(self.evaluator, self, arglist)
return [value for key, value in args.unpack() if key is None]
else:
return [context.LazyKnownContext(compiled.create(self.evaluator, object))]
return [LazyKnownContext(compiled.create(self.evaluator, object))]
def py__call__(self, params):
from jedi.evaluate.context.instance import TreeInstance

View File

@@ -1,4 +1,4 @@
from jedi.evaluate.context import ContextSet, NO_CONTEXTS
from jedi.evaluate.base_context import ContextSet, NO_CONTEXTS
class AbstractLazyContext(object):
def __init__(self, data):

View File

@@ -10,7 +10,7 @@ from jedi.evaluate.cache import CachedMetaClass, evaluator_method_cache
from jedi.evaluate.filters import GlobalNameFilter, ContextNameMixin, \
AbstractNameDefinition, ParserTreeFilter, DictFilter
from jedi.evaluate import compiled
from jedi.evaluate.context import TreeContext
from jedi.evaluate.base_context import TreeContext
from jedi.evaluate.imports import SubModuleName, infer_import
class _ModuleAttributeName(AbstractNameDefinition):

View File

@@ -5,8 +5,7 @@ from jedi._compatibility import use_metaclass
from jedi.evaluate.cache import evaluator_method_cache, CachedMetaClass
from jedi.evaluate import imports
from jedi.evaluate.filters import DictFilter, AbstractNameDefinition
from jedi.evaluate import context
from jedi.evaluate.context import NO_CONTEXTS
from jedi.evaluate.base_context import NO_CONTEXTS, TreeContext
class ImplicitNSName(AbstractNameDefinition):
@@ -25,7 +24,7 @@ class ImplicitNSName(AbstractNameDefinition):
return self.implicit_ns_context
class ImplicitNamespaceContext(use_metaclass(CachedMetaClass, context.TreeContext)):
class ImplicitNamespaceContext(use_metaclass(CachedMetaClass, TreeContext)):
"""
Provides support for implicit namespace packages
"""

View File

@@ -24,8 +24,9 @@ from jedi._compatibility import u
from jedi.evaluate.utils import indent_block
from jedi.evaluate.cache import evaluator_method_cache
from jedi.evaluate.iterable import SequenceLiteralContext, FakeSequence
from jedi.evaluate.context import iterator_to_context_set, ContextSet, \
NO_CONTEXTS, LazyKnownContexts
from jedi.evaluate.base_context import iterator_to_context_set, ContextSet, \
NO_CONTEXTS
from jedi.evaluate.context import LazyKnownContexts
DOCSTRING_PARAM_PATTERNS = [

View File

@@ -25,10 +25,9 @@ from jedi.evaluate import imports
from jedi.evaluate.param import TreeArguments, create_default_params
from jedi.evaluate.helpers import is_stdlib_path
from jedi.evaluate.utils import to_list
from jedi.evaluate.context import ContextSet
from jedi.parser_utils import get_parent_scope
from jedi.evaluate.context.module import ModuleContext
from jedi.evaluate.context import instance
from jedi.evaluate.context import ModuleContext, instance
from jedi.evaluate.base_context import ContextSet

View File

@@ -6,7 +6,7 @@ from abc import abstractmethod
from parso.tree import search_ancestor
from jedi.evaluate import flow_analysis
from jedi.evaluate.context import ContextSet
from jedi.evaluate.base_context import ContextSet
from jedi.parser_utils import get_parent_scope
from jedi.evaluate.utils import to_list

View File

@@ -27,7 +27,7 @@ from jedi.evaluate import flow_analysis
from jedi.evaluate import param
from jedi.evaluate import helpers
from jedi.evaluate.filters import get_global_filters, TreeNameDefinition
from jedi.evaluate.context import ContextSet
from jedi.evaluate.base_context import ContextSet
from jedi.parser_utils import is_scope, get_parent_scope

View File

@@ -31,7 +31,7 @@ from jedi.evaluate import analysis
from jedi.evaluate.utils import unite
from jedi.evaluate.cache import evaluator_method_cache
from jedi.evaluate.filters import AbstractNameDefinition
from jedi.evaluate.context import ContextSet, NO_CONTEXTS
from jedi.evaluate.base_context import ContextSet, NO_CONTEXTS
# This memoization is needed, because otherwise we will infinitely loop on
@@ -420,7 +420,7 @@ class Importer(object):
:param only_modules: Indicates wheter it's possible to import a
definition that is not defined in a module.
"""
from jedi.evaluate.context.module import ModuleContext
from jedi.evaluate.context import ModuleContext
from jedi.evaluate.context.namespace import ImplicitNamespaceContext
names = []
if self.import_path:
@@ -490,7 +490,7 @@ def _load_module(evaluator, path=None, code=None, sys_path=None, parent_module=N
code=code, path=path, cache=True, diff_cache=True,
cache_path=settings.cache_directory)
from jedi.evaluate.context.module import ModuleContext
from jedi.evaluate.context import ModuleContext
return ModuleContext(evaluator, module_node, path=path)
else:
return compiled.load_module(evaluator, path)
@@ -509,7 +509,7 @@ def get_modules_containing_name(evaluator, modules, name):
"""
Search a name in the directories of modules.
"""
from jedi.evaluate.context.module import ModuleContext
from jedi.evaluate.context import ModuleContext
def check_python_file(path):
try:

View File

@@ -28,17 +28,18 @@ from jedi.evaluate.utils import to_list
from jedi.evaluate import compiled
from jedi.evaluate import helpers
from jedi.evaluate import analysis
from jedi.evaluate.helpers import is_string
from jedi.evaluate import context
from jedi.evaluate import recursion
from jedi.evaluate.helpers import is_string
from jedi.evaluate.cache import evaluator_method_cache
from jedi.evaluate.filters import DictFilter, AbstractNameDefinition, \
ParserTreeFilter
from jedi.evaluate import context
from jedi.evaluate.context import ContextSet, NO_CONTEXTS, Context
from jedi.evaluate.base_context import ContextSet, NO_CONTEXTS, Context, \
TreeContext, ContextualizedNode
from jedi.parser_utils import get_comp_fors
class AbstractSequence(context.Context):
class AbstractSequence(Context):
builtin_methods = {}
api_type = 'instance'
@@ -168,7 +169,7 @@ class GeneratorMixin(object):
return compiled.CompiledContextName(self, 'generator')
class Generator(GeneratorMixin, context.Context):
class Generator(GeneratorMixin, Context):
"""Handling of `yield` functions."""
def __init__(self, evaluator, func_execution_context):
super(Generator, self).__init__(evaluator, parent_context=evaluator.BUILTINS)
@@ -181,7 +182,7 @@ class Generator(GeneratorMixin, context.Context):
return "<%s of %s>" % (type(self).__name__, self._func_execution_context)
class CompForContext(context.TreeContext):
class CompForContext(TreeContext):
@classmethod
def from_comp_for(cls, parent_context, comp_for):
return cls(parent_context.evaluator, parent_context, comp_for)
@@ -244,7 +245,7 @@ class Comprehension(AbstractSequence):
parent_context = parent_context or self._defining_context
input_types = parent_context.eval_node(input_node)
cn = context.ContextualizedNode(parent_context, input_node)
cn = ContextualizedNode(parent_context, input_node)
iterated = input_types.iterate(cn)
exprlist = comp_for.children[1]
for i, lazy_context in enumerate(iterated):
@@ -739,7 +740,7 @@ class _ArrayInstance(object):
return self.py__iter__()
class Slice(context.Context):
class Slice(Context):
def __init__(self, context, start, stop, step):
super(Slice, self).__init__(
context.evaluator,

View File

@@ -10,7 +10,7 @@ from jedi.evaluate import context
from jedi.evaluate import docstrings
from jedi.evaluate import pep0484
from jedi.evaluate.filters import ParamName
from jedi.evaluate.context import NO_CONTEXTS
from jedi.evaluate.base_context import NO_CONTEXTS
def add_argument_issue(parent_context, error_name, lazy_context, message):

View File

@@ -27,8 +27,9 @@ from parso.python import tree
from jedi.evaluate.cache import evaluator_method_cache
from jedi.evaluate import compiled
from jedi.evaluate.context import LazyTreeContext, NO_CONTEXTS, ContextSet
from jedi.evaluate.context.module import ModuleContext
from jedi.evaluate.base_context import NO_CONTEXTS, ContextSet
from jedi.evaluate.context import LazyTreeContext
from jedi.evaluate.context import ModuleContext
from jedi import debug
from jedi import _compatibility
from jedi import parser_utils

View File

@@ -29,7 +29,7 @@ therefore the quality might not always be maximal.
from contextlib import contextmanager
from jedi import debug
from jedi.evaluate.context import NO_CONTEXTS
from jedi.evaluate.base_context import NO_CONTEXTS
recursion_limit = 15

View File

@@ -20,10 +20,11 @@ from jedi.evaluate import iterable
from jedi import debug
from jedi.evaluate import param
from jedi.evaluate import analysis
from jedi.evaluate.context import LazyTreeContext, ContextualizedNode, \
from jedi.evaluate.base_context import ContextualizedNode, \
NO_CONTEXTS, ContextSet
from jedi.evaluate.context import LazyTreeContext
from jedi.evaluate.context.klass import ClassContext
from jedi.evaluate.context.module import ModuleContext
from jedi.evaluate.context import ModuleContext
from jedi.evaluate.syntax_tree import is_string
# Now this is all part of fake tuples in Jedi. However super doesn't work on

View File

@@ -8,7 +8,7 @@ from parso.python import tree
from jedi import debug
from jedi import parser_utils
from jedi.evaluate.context import ContextSet, NO_CONTEXTS, ContextualizedNode, \
from jedi.evaluate.base_context import ContextSet, NO_CONTEXTS, ContextualizedNode, \
ContextualizedName, iterator_to_context_set, iterate_contexts
from jedi.evaluate import compiled
from jedi.evaluate import pep0484

View File

@@ -7,7 +7,7 @@ from jedi.evaluate.site import addsitedir
from jedi._compatibility import exec_function, unicode
from jedi.evaluate.cache import evaluator_function_cache
from jedi.evaluate.compiled import CompiledObject
from jedi.evaluate.context import ContextualizedNode
from jedi.evaluate.base_context import ContextualizedNode
from jedi import settings
from jedi import debug
from jedi.evaluate.utils import ignored
@@ -219,7 +219,7 @@ def _get_paths_from_buildout_script(evaluator, buildout_script_path):
debug.warning('Error trying to read buildout_script: %s', buildout_script_path)
return
from jedi.evaluate.context.module import ModuleContext
from jedi.evaluate.context import ModuleContext
for path in _check_module(ModuleContext(evaluator, module_node, buildout_script_path)):
yield path