from jedi.evaluate.base_context import ContextSet, NO_CONTEXTS from jedi.common.utils import monkeypatch class AbstractLazyContext(object): def __init__(self, data): self.data = data def __repr__(self): return '<%s: %s>' % (self.__class__.__name__, self.data) def infer(self): raise NotImplementedError class LazyKnownContext(AbstractLazyContext): """data is a context.""" def infer(self): return ContextSet(self.data) class LazyKnownContexts(AbstractLazyContext): """data is a ContextSet.""" def infer(self): return self.data class LazyUnknownContext(AbstractLazyContext): def __init__(self): super(LazyUnknownContext, self).__init__(None) def infer(self): return NO_CONTEXTS class LazyTreeContext(AbstractLazyContext): def __init__(self, context, node): super(LazyTreeContext, self).__init__(node) self._context = context # We need to save the predefined names. It's an unfortunate side effect # that needs to be tracked otherwise results will be wrong. self._predefined_names = dict(context.predefined_names) def infer(self): with monkeypatch(self._context, 'predefined_names', self._predefined_names): return self._context.eval_node(self.data) def get_merged_lazy_context(lazy_contexts): if len(lazy_contexts) > 1: return MergedLazyContexts(lazy_contexts) else: return lazy_contexts[0] class MergedLazyContexts(AbstractLazyContext): """data is a list of lazy contexts.""" def infer(self): return ContextSet.from_sets(l.infer() for l in self.data)