Class: Tapioca::Compilers::RailsOnSorbetAliasAssociation

Inherits:
Dsl::Compiler
  • Object
show all
Defined in:
lib/tapioca/dsl/compilers/rails_on_sorbet_alias_association.rb

Overview

Creates .rbi files with types for classes that use ‘alias_association`

: [ConstantType = Class & ::Rails::On::Sorbet::AliasAssociation]

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.gather_constantsObject

: -> Enumerable



13
14
15
16
17
# File 'lib/tapioca/dsl/compilers/rails_on_sorbet_alias_association.rb', line 13

def gather_constants
  all_classes.select do |klass|
    klass.singleton_class < ::Rails::On::Sorbet::AliasAssociation
  end
end

Instance Method Details

#create_aliases(klass, alias_name, target_name) ⇒ Object

: (RBI::Scope, Symbol, Symbol) -> void



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/tapioca/dsl/compilers/rails_on_sorbet_alias_association.rb', line 34

def create_aliases(klass, alias_name, target_name)
  association = constant.reflect_on_all_associations.find { |e| e.name == target_name }
  type_string = association.class_name.to_s
  type = "T.nilable(#{type_string})"

  klass.create_method(
    alias_name.to_s,
    return_type: type,
  )

  klass.create_method(
    "#{alias_name}=",
    parameters:  [create_param('val', type: type)],
    return_type: 'void',
  )
end

#decorateObject

:-> void



22
23
24
25
26
27
28
29
30
31
# File 'lib/tapioca/dsl/compilers/rails_on_sorbet_alias_association.rb', line 22

def decorate
  definitions = constant._alias_association_definitions
  return unless definitions.present?

  root.create_path(constant) do |klass|
    definitions.each do |alias_name, target_name|
      create_aliases(klass, alias_name, target_name)
    end
  end
end