Class: Parlour::RbiGenerator::Namespace
- Extended by:
- T::Sig
- Defined in:
- lib/parlour/rbi_generator/namespace.rb
Overview
A generic namespace. This shouldn’t be used, except as the type of #root.
Direct Known Subclasses
Instance Attribute Summary collapse
-
#children ⇒ Array<RbiObject>
readonly
The child RbiObject instances inside this namespace.
Attributes inherited from RbiObject
#comments, #generated_by, #generator, #name
Instance Method Summary collapse
-
#add_comment_to_next_child(comment) ⇒ void
Adds one or more comments to the next child RBI object to be created.
- #constants ⇒ Array<RbiGenerator::Constant>
-
#create_arbitrary(code: nil, &block) ⇒ RbiGenerator::Arbitrary
Creates a new arbitrary code section.
-
#create_attr_accessor(name: nil, type: nil, &block) ⇒ RbiGenerator::Attribute
Creates a new read and write attribute (
attr_accessor). -
#create_attr_reader(name: nil, type: nil, &block) ⇒ RbiGenerator::Attribute
Creates a new read-only attribute (
attr_reader). -
#create_attr_writer(name: nil, type: nil, &block) ⇒ RbiGenerator::Attribute
Creates a new write-only attribute (
attr_writer). -
#create_attribute(name: nil, kind: nil, type: nil, &block) ⇒ RbiGenerator::Attribute
(also: #create_attr)
Creates a new attribute.
-
#create_class(name: nil, superclass: nil, abstract: false, &block) ⇒ ClassNamespace
Creates a new class definition as a child of this namespace.
-
#create_constant(name: nil, value: nil, &block) ⇒ RbiGenerator::Constant
Adds a new constant definition to this namespace.
-
#create_extend(name: nil, &block) ⇒ RbiGenerator::Extend
Adds a new
extendto this namespace. -
#create_include(name: nil, &block) ⇒ RbiGenerator::Include
Adds a new
includeto this namespace. -
#create_method(name: nil, parameters: nil, return_type: nil, returns: nil, abstract: false, implementation: false, override: false, overridable: false, class_method: false, &block) ⇒ Method
Creates a new method definition as a child of this namespace.
-
#create_module(name: nil, interface: false, &block) ⇒ ModuleNamespace
Creates a new module definition as a child of this namespace.
-
#describe ⇒ String
Returns a human-readable brief string description of this namespace.
- #extends ⇒ Array<RbiGenerator::Extend>
-
#generate_rbi(indent_level, options) ⇒ Array<String>
Generates the RBI lines for this namespace.
- #includes ⇒ Array<RbiGenerator::Include>
-
#initialize(generator, name = nil, &block) ⇒ void
constructor
Creates a new namespace.
-
#merge_into_self(others) ⇒ void
Given an array of Namespace instances, merges them into this one.
-
#mergeable?(others) ⇒ true
Given an array of Namespace instances, returns true if they may be merged into this instance using #merge_into_self.
- #path(object, &block) ⇒ Object
Methods inherited from RbiObject
Constructor Details
#initialize(generator, name = nil, &block) ⇒ void
Unless you’re doing something impressively hacky, this shouldn’t be invoked outside of Parlour::RbiGenerator#initialize.
Creates a new namespace.
40 41 42 43 44 45 |
# File 'lib/parlour/rbi_generator/namespace.rb', line 40 def initialize(generator, name = nil, &block) super(generator, name || '<anonymous namespace>') @children = [] @next_comments = [] yield_self(&block) end |
Instance Attribute Details
Instance Method Details
#add_comment_to_next_child(comment) ⇒ void
This method returns an undefined value.
Adds one or more comments to the next child RBI object to be created.
123 124 125 126 127 128 129 |
# File 'lib/parlour/rbi_generator/namespace.rb', line 123 def add_comment_to_next_child(comment) if comment.is_a?(String) @next_comments << comment elsif comment.is_a?(Array) @next_comments.concat(comment) end end |
#constants ⇒ Array<RbiGenerator::Constant>
75 76 77 78 79 80 |
# File 'lib/parlour/rbi_generator/namespace.rb', line 75 def constants T.cast( children.select { |c| c.is_a?(RbiGenerator::Constant) }, T::Array[RbiGenerator::Constant] ) end |
#create_arbitrary(code: nil, &block) ⇒ RbiGenerator::Arbitrary
Creates a new arbitrary code section. You should rarely have to use this!
328 329 330 331 332 333 334 335 336 337 338 |
# File 'lib/parlour/rbi_generator/namespace.rb', line 328 def create_arbitrary(code: nil, &block) code = T.must(code) new_arbitrary = RbiGenerator::Arbitrary.new( generator, code: code, &block ) move_next_comments(new_arbitrary) children << new_arbitrary new_arbitrary end |
#create_attr_accessor(name: nil, type: nil, &block) ⇒ RbiGenerator::Attribute
Creates a new read and write attribute (attr_accessor).
318 319 320 |
# File 'lib/parlour/rbi_generator/namespace.rb', line 318 def create_attr_accessor(name: nil, type: nil, &block) create_attribute(name: name, kind: :accessor, type: type, &block) end |
#create_attr_reader(name: nil, type: nil, &block) ⇒ RbiGenerator::Attribute
Creates a new read-only attribute (attr_reader).
296 297 298 |
# File 'lib/parlour/rbi_generator/namespace.rb', line 296 def create_attr_reader(name: nil, type: nil, &block) create_attribute(name: name, kind: :reader, type: type, &block) end |
#create_attr_writer(name: nil, type: nil, &block) ⇒ RbiGenerator::Attribute
Creates a new write-only attribute (attr_writer).
307 308 309 |
# File 'lib/parlour/rbi_generator/namespace.rb', line 307 def create_attr_writer(name: nil, type: nil, &block) create_attribute(name: name, kind: :writer, type: type, &block) end |
#create_attribute(name: nil, kind: nil, type: nil, &block) ⇒ RbiGenerator::Attribute Also known as: create_attr
Creates a new attribute.
272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 |
# File 'lib/parlour/rbi_generator/namespace.rb', line 272 def create_attribute(name: nil, kind: nil, type: nil, &block) name = T.must(name) kind = T.must(kind) type = T.must(type) new_attribute = RbiGenerator::Attribute.new( generator, name, kind, type, &block ) move_next_comments(new_attribute) children << new_attribute new_attribute end |
#create_class(name: nil, superclass: nil, abstract: false, &block) ⇒ ClassNamespace
Creates a new class definition as a child of this namespace.
155 156 157 158 159 160 161 |
# File 'lib/parlour/rbi_generator/namespace.rb', line 155 def create_class(name: nil, superclass: nil, abstract: false, &block) name = T.must(name) new_class = ClassNamespace.new(generator, name, superclass, abstract, &block) move_next_comments(new_class) children << new_class new_class end |
#create_constant(name: nil, value: nil, &block) ⇒ RbiGenerator::Constant
Adds a new constant definition to this namespace.
394 395 396 397 398 399 400 401 402 403 404 405 406 |
# File 'lib/parlour/rbi_generator/namespace.rb', line 394 def create_constant(name: nil, value: nil, &block) name = T.must(name) value = T.must(value) new_constant = RbiGenerator::Constant.new( generator, name: name, value: value, &block ) move_next_comments(new_constant) children << new_constant new_constant end |
#create_extend(name: nil, &block) ⇒ RbiGenerator::Extend
Adds a new extend to this namespace.
350 351 352 353 354 355 356 357 358 359 360 |
# File 'lib/parlour/rbi_generator/namespace.rb', line 350 def create_extend(name: nil, &block) name = T.must(name) new_extend = RbiGenerator::Extend.new( generator, name: name, &block ) move_next_comments(new_extend) children << new_extend new_extend end |
#create_include(name: nil, &block) ⇒ RbiGenerator::Include
Adds a new include to this namespace.
372 373 374 375 376 377 378 379 380 381 382 |
# File 'lib/parlour/rbi_generator/namespace.rb', line 372 def create_include(name: nil, &block) name = T.must(name) new_include = RbiGenerator::Include.new( generator, name: name, &block ) move_next_comments(new_include) children << new_include new_include end |
#create_method(name: nil, parameters: nil, return_type: nil, returns: nil, abstract: false, implementation: false, override: false, overridable: false, class_method: false, &block) ⇒ Method
Creates a new method definition as a child of this namespace.
226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 |
# File 'lib/parlour/rbi_generator/namespace.rb', line 226 def create_method(name: nil, parameters: nil, return_type: nil, returns: nil, abstract: false, implementation: false, override: false, overridable: false, class_method: false, &block) name = T.must(name) parameters = parameters || [] raise 'cannot specify both return_type: and returns:' if return_type && returns return_type ||= returns new_method = RbiGenerator::Method.new( generator, name, parameters, return_type, abstract: abstract, implementation: implementation, override: override, overridable: overridable, class_method: class_method, &block ) move_next_comments(new_method) children << new_method new_method end |
#create_module(name: nil, interface: false, &block) ⇒ ModuleNamespace
Creates a new module definition as a child of this namespace.
185 186 187 188 189 190 191 |
# File 'lib/parlour/rbi_generator/namespace.rb', line 185 def create_module(name: nil, interface: false, &block) name = T.must(name) new_module = ModuleNamespace.new(generator, name, interface, &block) move_next_comments(new_module) children << new_module new_module end |
#describe ⇒ String
Returns a human-readable brief string description of this namespace.
448 449 450 451 |
# File 'lib/parlour/rbi_generator/namespace.rb', line 448 def describe "Namespace #{name} - #{children.length} children, #{includes.length} " + "includes, #{extends.length} extends, #{constants.length} constants" end |
#extends ⇒ Array<RbiGenerator::Extend>
55 56 57 58 59 60 |
# File 'lib/parlour/rbi_generator/namespace.rb', line 55 def extends T.cast( children.select { |c| c.is_a?(RbiGenerator::Extend) }, T::Array[RbiGenerator::Extend] ) end |
#generate_rbi(indent_level, options) ⇒ Array<String>
Generates the RBI lines for this namespace.
20 21 22 23 |
# File 'lib/parlour/rbi_generator/namespace.rb', line 20 def generate_rbi(indent_level, ) generate_comments(indent_level, ) + generate_body(indent_level, ) end |
#includes ⇒ Array<RbiGenerator::Include>
65 66 67 68 69 70 |
# File 'lib/parlour/rbi_generator/namespace.rb', line 65 def includes T.cast( children.select { |c| c.is_a?(RbiGenerator::Include) }, T::Array[RbiGenerator::Include] ) end |
#merge_into_self(others) ⇒ void
This method returns an undefined value.
Given an array of Parlour::RbiGenerator::Namespace instances, merges them into this one. All children, constants, extends and includes are copied into this instance.
436 437 438 439 440 441 442 |
# File 'lib/parlour/rbi_generator/namespace.rb', line 436 def merge_into_self(others) others.each do |other| other = T.cast(other, Namespace) other.children.each { |c| children << c } end end |
#mergeable?(others) ⇒ true
Given an array of Parlour::RbiGenerator::Namespace instances, returns true if they may be merged into this instance using #merge_into_self. All bare namespaces can be merged into each other, as they lack definitions for themselves, so there is nothing to conflict. (This isn’t the case for subclasses such as ClassNamespace.)
421 422 423 |
# File 'lib/parlour/rbi_generator/namespace.rb', line 421 def mergeable?(others) true end |
#path(object, &block) ⇒ Object
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
# File 'lib/parlour/rbi_generator/namespace.rb', line 88 def path(object, &block) raise 'only call #path on root' if is_a?(ClassNamespace) || is_a?(ModuleNamespace) parts = object.to_s.split('::') parts_with_types = parts.size.times.map do |i| [parts[i], Module.const_get(parts[0..i].join('::')).class] end current_part = self parts_with_types.each do |(name, type)| if type == Class current_part = current_part.create_class(name: name) elsif type == Module current_part = current_part.create_module(name: name) else raise "unexpected type: path part #{name} is a #{type}" end end block.call(current_part) end |