Sha256: 8c5af77092bd7248f3281bc3d6ea0b394e2a2dbdaaee9429441e12c3399340c7

Contents?: true

Size: 1.38 KB

Versions: 45

Compression:

Stored size: 1.38 KB

Contents

# frozen_string_literal: true
# typed: true

module T::Private::Abstract::Declare
  Abstract = T::Private::Abstract
  AbstractUtils = T::AbstractUtils

  def self.declare_abstract(mod, type:)
    if AbstractUtils.abstract_module?(mod)
      raise "#{mod.name} is already declared as abstract"
    end

    Abstract::Data.set(mod, :can_have_abstract_methods, true)
    Abstract::Data.set(mod.singleton_class, :can_have_abstract_methods, true)
    Abstract::Data.set(mod, :abstract_type, type)

    mod.extend(Abstract::Hooks)
    mod.extend(T::InterfaceWrapper::Helpers)

    if mod.is_a?(Class)
      if mod < T::Struct
        raise "#{mod.name} is a subclass of T::Struct and cannot be declared abstract"
      end

      if type == :interface
        # Since `interface!` is just `abstract!` with some extra validation, we could technically
        # allow this, but it's unclear there are good use cases, and it might be confusing.
        raise "Classes can't be interfaces. Use `abstract!` instead of `interface!`."
      end

      if mod.instance_method(:initialize).owner == mod
        raise "You must call `abstract!` *before* defining an initialize method"
      end

      mod.send(:define_method, :initialize) do |*args, &blk|
        if self.class == mod
          raise "#{mod} is declared as abstract; it cannot be instantiated"
        end
        super(*args, &blk)
      end
    end
  end
end

Version data entries

45 entries across 45 versions & 1 rubygems

Version Path
sorbet-runtime-0.4.4321 lib/types/private/abstract/declare.rb
sorbet-runtime-0.4.4320 lib/types/private/abstract/declare.rb
sorbet-runtime-0.4.4319 lib/types/private/abstract/declare.rb
sorbet-runtime-0.4.4318 lib/types/private/abstract/declare.rb
sorbet-runtime-0.4.4314 lib/types/private/abstract/declare.rb
sorbet-runtime-0.4.4313 lib/types/private/abstract/declare.rb
sorbet-runtime-0.4.4312 lib/types/private/abstract/declare.rb
sorbet-runtime-0.4.4311 lib/types/private/abstract/declare.rb
sorbet-runtime-0.4.4310 lib/types/private/abstract/declare.rb
sorbet-runtime-0.4.4309 lib/types/private/abstract/declare.rb
sorbet-runtime-0.4.4308 lib/types/private/abstract/declare.rb
sorbet-runtime-0.4.4307 lib/types/private/abstract/declare.rb
sorbet-runtime-0.4.4306 lib/types/private/abstract/declare.rb
sorbet-runtime-0.4.4305 lib/types/private/abstract/declare.rb
sorbet-runtime-0.4.4304 lib/types/private/abstract/declare.rb
sorbet-runtime-0.4.4303 lib/types/private/abstract/declare.rb
sorbet-runtime-0.4.4302 lib/types/private/abstract/declare.rb
sorbet-runtime-0.4.4301 lib/types/private/abstract/declare.rb
sorbet-runtime-0.4.4300 lib/types/private/abstract/declare.rb
sorbet-runtime-0.4.4299 lib/types/private/abstract/declare.rb