Format: text/x-python
⬇ Download File (1.6 KB)
   1  from jedi.inference.base_value import ValueSet, NO_VALUES
   2  from jedi.common import monkeypatch
   3  
   4  
   5  class AbstractLazyValue:
   6      def __init__(self, data, min=1, max=1):
   7          self.data = data
   8          self.min = min
   9          self.max = max
  10  
  11      def __repr__(self):
  12          return '<%s: %s>' % (self.__class__.__name__, self.data)
  13  
  14      def infer(self):
  15          raise NotImplementedError
  16  
  17  
  18  class LazyKnownValue(AbstractLazyValue):
  19      """data is a Value."""
  20      def infer(self):
  21          return ValueSet([self.data])
  22  
  23  
  24  class LazyKnownValues(AbstractLazyValue):
  25      """data is a ValueSet."""
  26      def infer(self):
  27          return self.data
  28  
  29  
  30  class LazyUnknownValue(AbstractLazyValue):
  31      def __init__(self, min=1, max=1):
  32          super().__init__(None, min, max)
  33  
  34      def infer(self):
  35          return NO_VALUES
  36  
  37  
  38  class LazyTreeValue(AbstractLazyValue):
  39      def __init__(self, context, node, min=1, max=1):
  40          super().__init__(node, min, max)
  41          self.context = context
  42          # We need to save the predefined names. It's an unfortunate side effect
  43          # that needs to be tracked otherwise results will be wrong.
  44          self._predefined_names = dict(context.predefined_names)
  45  
  46      def infer(self):
  47          with monkeypatch(self.context, 'predefined_names', self._predefined_names):
  48              return self.context.infer_node(self.data)
  49  
  50  
  51  def get_merged_lazy_value(lazy_values):
  52      if len(lazy_values) > 1:
  53          return MergedLazyValues(lazy_values)
  54      else:
  55          return lazy_values[0]
  56  
  57  
  58  class MergedLazyValues(AbstractLazyValue):
  59      """data is a list of lazy values."""
  60      def infer(self):
  61          return ValueSet.from_sets(l.infer() for l in self.data)
  62