Beispiel #1
0
    def __init__(self, vm):
        super().__init__(vm)
        self.vm.convert = self  # to make constant_to_value calls below work
        self.pytd_convert = output.Converter(vm)

        self._convert_cache = {}
        self._resolved_late_types = {}  # performance cache

        # Initialize primitive_classes to empty to allow constant_to_value to run.
        self.primitive_classes = ()

        # object_type is needed to initialize the primitive class values.
        self.object_type = self.constant_to_value(object)

        if self.vm.PY2:
            version_specific = [compat.UnicodeType]
        else:
            version_specific = [compat.BytesType]

        self.unsolvable = abstract.Unsolvable(self.vm)
        self.empty = abstract.Empty(self.vm)
        self.no_return = typing_overlay.NoReturn(self.vm)

        # Now fill primitive_classes with the real values using constant_to_value.
        primitive_classes = [
            int, float, str, object, frozenset, compat.NoneType, complex, bool,
            slice, types.CodeType, compat.EllipsisType,
            compat.OldStyleClassType, super
        ] + version_specific
        self.primitive_classes = {
            v: self.constant_to_value(v)
            for v in primitive_classes
        }
        self.primitive_class_names = [
            self._type_to_name(x) for x in self.primitive_classes
        ]
        self.none = abstract.AbstractOrConcreteValue(
            None, self.primitive_classes[compat.NoneType], self.vm)
        self.true = abstract.AbstractOrConcreteValue(
            True, self.primitive_classes[bool], self.vm)
        self.false = abstract.AbstractOrConcreteValue(
            False, self.primitive_classes[bool], self.vm)
        self.ellipsis = abstract.AbstractOrConcreteValue(
            Ellipsis, self.primitive_classes[compat.EllipsisType], self.vm)

        self.primitive_class_instances = {}
        for name, cls in self.primitive_classes.items():
            if name == compat.NoneType:
                # This is possible because all None instances are the same.
                # Without it pytype could not reason that "x is None" is always true, if
                # x is indeed None.
                instance = self.none
            elif name == compat.EllipsisType:
                instance = self.ellipsis
            else:
                instance = abstract.Instance(cls, self.vm)
            self.primitive_class_instances[name] = instance
            self._convert_cache[(abstract.Instance, cls.pytd_cls)] = instance

        self.none_type = self.primitive_classes[compat.NoneType]
        self.oldstyleclass_type = self.primitive_classes[
            compat.OldStyleClassType]
        self.super_type = self.primitive_classes[super]
        self.str_type = self.primitive_classes[str]
        self.int_type = self.primitive_classes[int]

        self.list_type = self.constant_to_value(list)
        self.set_type = self.constant_to_value(set)
        self.frozenset_type = self.constant_to_value(frozenset)
        self.dict_type = self.constant_to_value(dict)
        self.type_type = self.constant_to_value(type)
        self.module_type = self.constant_to_value(types.ModuleType)
        self.function_type = self.constant_to_value(types.FunctionType)
        self.tuple_type = self.constant_to_value(tuple)
        self.generator_type = self.constant_to_value(types.GeneratorType)
        self.iterator_type = self.constant_to_value(compat.IteratorType)
        if self.vm.python_version >= (3, 5):
            self.coroutine_type = self.constant_to_value(compat.CoroutineType)
            self.awaitable_type = self.constant_to_value(compat.AwaitableType)
        if self.vm.python_version >= (3, 6):
            self.async_generator_type = self.constant_to_value(
                compat.AsyncGeneratorType)
        self.bool_values = {
            True: self.true,
            False: self.false,
            None: self.primitive_class_instances[bool],
        }
        if self.vm.PY2:
            self.unicode_type = self.primitive_classes[compat.UnicodeType]
            self.bytes_type = self.str_type
            self.next_attr = "next"
        else:
            self.unicode_type = self.str_type
            self.bytes_type = self.primitive_classes[compat.BytesType]
            self.next_attr = "__next__"
Beispiel #2
0
  def __init__(self, ctx):
    super().__init__(ctx)
    ctx.convert = self  # to make constant_to_value calls below work

    self._convert_cache = {}
    self._resolved_late_types = {}  # performance cache

    # Initialize primitive_classes to empty to allow constant_to_value to run.
    self.primitive_classes = ()

    # object_type is needed to initialize the primitive class values.
    self.object_type = self.constant_to_value(object)

    self.unsolvable = abstract.Unsolvable(self.ctx)
    self.type_type = self.constant_to_value(type)
    self.ctx.converter_minimally_initialized = True

    self.empty = abstract.Empty(self.ctx)
    self.no_return = typing_overlay.NoReturn(self.ctx)

    # Now fill primitive_classes with the real values using constant_to_value.
    primitive_classes = [
        int, float, str, bytes, object, NoneType, complex, bool, slice,
        types.CodeType, EllipsisType, super,
    ]
    self.primitive_classes = {
        v: self.constant_to_value(v) for v in primitive_classes
    }
    self.primitive_class_names = [
        self._type_to_name(x) for x in self.primitive_classes]
    self.none = abstract.ConcreteValue(None, self.primitive_classes[NoneType],
                                       self.ctx)
    self.true = abstract.ConcreteValue(True, self.primitive_classes[bool],
                                       self.ctx)
    self.false = abstract.ConcreteValue(False, self.primitive_classes[bool],
                                        self.ctx)
    self.ellipsis = abstract.ConcreteValue(Ellipsis,
                                           self.primitive_classes[EllipsisType],
                                           self.ctx)

    self.primitive_class_instances = {}
    for name, cls in self.primitive_classes.items():
      if name == NoneType:
        # This is possible because all None instances are the same.
        # Without it pytype could not reason that "x is None" is always true, if
        # x is indeed None.
        instance = self.none
      elif name == EllipsisType:
        instance = self.ellipsis
      else:
        instance = abstract.Instance(cls, self.ctx)
      self.primitive_class_instances[name] = instance
      self._convert_cache[(abstract.Instance, cls.pytd_cls)] = instance

    self.none_type = self.primitive_classes[NoneType]
    self.super_type = self.primitive_classes[super]
    self.str_type = self.primitive_classes[str]
    self.int_type = self.primitive_classes[int]
    self.bool_type = self.primitive_classes[bool]
    self.bytes_type = self.primitive_classes[bytes]

    self.list_type = self.constant_to_value(list)
    self.set_type = self.constant_to_value(set)
    self.frozenset_type = self.constant_to_value(frozenset)
    self.dict_type = self.constant_to_value(dict)
    self.module_type = self.constant_to_value(types.ModuleType)
    self.function_type = self.constant_to_value(types.FunctionType)
    self.tuple_type = self.constant_to_value(tuple)
    self.generator_type = self.constant_to_value(types.GeneratorType)
    self.iterator_type = self.constant_to_value(IteratorType)
    self.coroutine_type = self.constant_to_value(CoroutineType)
    self.awaitable_type = self.constant_to_value(AwaitableType)
    self.async_generator_type = self.constant_to_value(AsyncGeneratorType)
    self.bool_values = {
        True: self.true,
        False: self.false,
        None: self.primitive_class_instances[bool],
    }