Module: T::Private::Sealed

Defined in:
lib/types/private/sealed.rb

Overview

typed: false

Defined Under Namespace

Modules: NoIncludeExtend, NoInherit

Class Method Summary collapse

Class Method Details

.declare(mod, decl_file) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/types/private/sealed.rb', line 49

def self.declare(mod, decl_file)
  if !mod.is_a?(Module)
    raise "#{mod} is not a class or module and cannot be declared `sealed!`"
  end
  if sealed_module?(mod)
    raise "#{mod} was already declared `sealed!` and cannot be re-declared `sealed!`"
  end
  if T::Private::Final.final_module?(mod)
    raise "#{mod} was already declared `final!` and cannot be declared `sealed!`"
  end
  mod.extend(mod.is_a?(Class) ? NoInherit : NoIncludeExtend)
  if !decl_file
    raise "Couldn't determine declaration file for sealed class."
  end
  mod.instance_variable_set(:@sorbet_sealed_module_decl_file, decl_file)
  mod.instance_variable_set(:@sorbet_sealed_module_all_subclasses, [])
end

.sealed_module?(mod) ⇒ Boolean

Returns:



67
68
69
# File 'lib/types/private/sealed.rb', line 67

def self.sealed_module?(mod)
  mod.instance_variable_defined?(:@sorbet_sealed_module_decl_file)
end

.validate_inheritance(this_line, parent, child, verb) ⇒ Object



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/types/private/sealed.rb', line 71

def self.validate_inheritance(this_line, parent, child, verb)
  this_file = this_line&.split(':')&.first
  decl_file = parent.instance_variable_get(:@sorbet_sealed_module_decl_file) if sealed_module?(parent)

  if !this_file
    raise "Could not use backtrace to determine file for #{verb} child #{child}"
  end
  if !decl_file
    raise "#{parent} does not seem to be a sealed module (#{verb} by #{child})"
  end

  if !this_file.start_with?(decl_file)
    whitelist = T::Configuration.sealed_violation_whitelist
    if !whitelist.nil? && whitelist.any? {|pattern| this_file =~ pattern}
      return
    end

    raise "#{parent} was declared sealed and can only be #{verb} in #{decl_file}, not #{this_file}"
  end
end