Module: T::Private::Sealed
- Defined in:
- lib/types/private/sealed.rb
Overview
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
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(caller_loc, 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(caller_loc, parent, child, verb)
this_file = caller_loc&.path
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
|