Sha256: a7e0fce9c04fc0745c482d4d9a377e14174679f2d71fe49c83ea1cf4ce1bd861

Contents?: true

Size: 1.45 KB

Versions: 379

Compression:

Stored size: 1.45 KB

Contents

# frozen_string_literal: true
# typed: false

module T::Private::Final
  module NoInherit
    def inherited(arg)
      super(arg)
      raise "#{self} was declared as final and cannot be inherited"
    end
  end

  module NoIncludeExtend
    def included(arg)
      super(arg)
      raise "#{self} was declared as final and cannot be included"
    end

    def extended(arg)
      super(arg)
      raise "#{self} was declared as final and cannot be extended"
    end
  end

  def self.declare(mod)
    if !mod.is_a?(Module)
      raise "#{mod} is not a class or module and cannot be declared as final with `final!`"
    end
    if final_module?(mod)
      raise "#{mod} was already declared as final and cannot be re-declared as final"
    end
    if T::AbstractUtils.abstract_module?(mod)
      raise "#{mod} was already declared as abstract and cannot be declared as final"
    end
    if T::Private::Sealed.sealed_module?(mod)
      raise "#{mod} was already declared as sealed and cannot be declared as final"
    end
    mod.extend(mod.is_a?(Class) ? NoInherit : NoIncludeExtend)
    mark_as_final_module(mod)
    mark_as_final_module(mod.singleton_class)
    T::Private::Methods.add_module_with_final(mod)
    T::Private::Methods.install_hooks(mod)
  end

  def self.final_module?(mod)
    mod.instance_variable_defined?(:@sorbet_final_module)
  end

  private_class_method def self.mark_as_final_module(mod)
    mod.instance_variable_set(:@sorbet_final_module, true)
  end
end

Version data entries

379 entries across 379 versions & 1 rubygems

Version Path
sorbet-runtime-0.5.6287 lib/types/private/final.rb
sorbet-runtime-0.5.6286 lib/types/private/final.rb
sorbet-runtime-0.5.6284 lib/types/private/final.rb
sorbet-runtime-0.5.6281 lib/types/private/final.rb
sorbet-runtime-0.5.6277 lib/types/private/final.rb
sorbet-runtime-0.5.6274 lib/types/private/final.rb
sorbet-runtime-0.5.6267 lib/types/private/final.rb
sorbet-runtime-0.5.6262 lib/types/private/final.rb
sorbet-runtime-0.5.6259 lib/types/private/final.rb
sorbet-runtime-0.5.6257 lib/types/private/final.rb
sorbet-runtime-0.5.6251 lib/types/private/final.rb
sorbet-runtime-0.5.6249 lib/types/private/final.rb
sorbet-runtime-0.5.6239 lib/types/private/final.rb
sorbet-runtime-0.5.6231 lib/types/private/final.rb
sorbet-runtime-0.5.6229 lib/types/private/final.rb
sorbet-runtime-0.5.6225 lib/types/private/final.rb
sorbet-runtime-0.5.6223 lib/types/private/final.rb
sorbet-runtime-0.5.6216 lib/types/private/final.rb
sorbet-runtime-0.5.6212 lib/types/private/final.rb
sorbet-runtime-0.5.6210 lib/types/private/final.rb