class RBS::Resolver::ConstantResolver::Table
Table stores the set of immediate child constants of a module.
table = RBS::ConstantResolver::Table.new(env) table.children(TypeName.parse("::Object")) # -> { ... } Returns a hash of name and constants. table.children(TypeName.parse("::File::PATH_SEPARATOR")) # -> nil Returns nil because the constant is not a module. table.toplevel # -> { ... } Returns a hash of top level constants.
The toplevel is incompatible with Ruby. All constants in Ruby are defined under Object, and they are accessed with :: (Colon3) operator. RBS is different. :: constants are toplevel constants, and they are not defined under ::Object.
The behavior is simulated in ConstantResolver.
Attributes
children_table
[R]
Hash[TypeName, Hash[Symbol, Constant]?]
constants_table
[R]
Hash[TypeName, Constant]
toplevel
[R]
Hash[Symbol, Constant]
Public Class Methods
(Environment) → void
Source
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/lib/rbs/resolver/constant_resolver.rb, line 10 def initialize(environment) @children_table = {} @toplevel = {} @constants_table = {} environment.class_decls.each_key do |name| children_table[name] = {} end environment.class_decls.each do |name, entry| constant = constant_of_module(name, entry) unless name.namespace.empty? parent = name.namespace.to_type_name table = children_table[parent] or raise "#{parent} not found by #{name}" else table = toplevel end table[name.name] = constant constants_table[name] = constant end environment.class_alias_decls.each do |name, entry| normalized_entry = environment.module_class_entry(name, normalized: true) or next constant = constant_of_module(name, normalized_entry) # Insert class/module aliases into `children_table` and `toplevel` table unless name.namespace.empty? normalized_parent = environment.normalize_module_name?(name.namespace.to_type_name) or raise table = children_table[normalized_parent] or raise table[name.name] = constant else toplevel[name.name] = constant end end environment.constant_decls.each do |name, entry| unless name.namespace.empty? parent = name.namespace.to_type_name table = children_table[parent] or raise constant = constant_of_constant(name, entry) else table = toplevel constant = constant_of_constant(name, entry) end table[name.name] = constant end end
Public Instance Methods
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/lib/rbs/resolver/constant_resolver.rb, line 63 def children(name) children_table[name] end
Returns a set of constants defined under module_name. Returns nil if there is no module with given module_name.
(TypeName constant_name) → Constant?
Source
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/lib/rbs/resolver/constant_resolver.rb, line 67 def constant(name) constants_table[name] end
(TypeName name, Environment::ConstantEntry) → Constant
Source
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/lib/rbs/resolver/constant_resolver.rb, line 80 def constant_of_constant(name, entry) Constant.new(name: name, type: entry.decl.type, entry: entry) end
(TypeName name, Environment::ClassEntry | Environment::ModuleEntry) → Constant
Source
# File vendor/bundle/ruby/4.0.0/gems/rbs-4.0.3/lib/rbs/resolver/constant_resolver.rb, line 71 def constant_of_module(name, entry) type = Types::ClassSingleton.new( name: name, location: nil ) Constant.new(name: name, type: type, entry: entry) end