Class: RBS::Prototype::Runtime::StructGenerator

Inherits:
ValueObjectBase show all
Defined in:
lib/rbs/prototype/runtime/value_object_generator.rb,
sig/prototype/runtime.rbs

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from ValueObjectBase

#build_decl, #build_member_accessors, #build_s_members, #initialize

Methods included from Helpers

#const_name, #const_name!, #only_name, #to_type_name, #untyped

Constructor Details

This class inherits a constructor from RBS::Prototype::Runtime::ValueObjectBase

Class Method Details

.generatable?(target) ⇒ Boolean

Parameters:

  • target (Class)

Returns:

  • (Boolean)


92
93
94
95
96
97
98
# File 'lib/rbs/prototype/runtime/value_object_generator.rb', line 92

def self.generatable?(target)
  return false unless target < Struct
  # Avoid direct inherited class like `class Option < Struct`
  return false unless target.respond_to?(:members)

  true
end

Instance Method Details

#add_decl_members(decl) ⇒ void

This method returns an undefined value.

Parameters:



106
107
108
109
110
111
# File 'lib/rbs/prototype/runtime/value_object_generator.rb', line 106

def add_decl_members(decl)
  decl.members.concat build_s_new
  decl.members.concat build_s_keyword_init_p
  decl.members.concat build_s_members
  decl.members.concat build_member_accessors(AST::Members::AttrAccessor)
end

#build_overload_for_keyword_argumentsAST::Members::MethodDefinition::Overload



158
159
160
161
162
163
164
165
166
167
168
169
170
# File 'lib/rbs/prototype/runtime/value_object_generator.rb', line 158

def build_overload_for_keyword_arguments
  AST::Members::MethodDefinition::Overload.new(
    annotations: [],
    method_type: MethodType.new(
      type: Types::Function.empty(Types::Bases::Instance.new(location: nil)).update(
        optional_keywords: @target_class.members.to_h { |m| [m, Types::Function::Param.new(name: nil, type: untyped)] },
      ),
      type_params: [],
      block: nil,
      location: nil,
    )
  )
end

#build_overload_for_positional_argumentsAST::Members::MethodDefinition::Overload



144
145
146
147
148
149
150
151
152
153
154
155
156
# File 'lib/rbs/prototype/runtime/value_object_generator.rb', line 144

def build_overload_for_positional_arguments
  AST::Members::MethodDefinition::Overload.new(
    annotations: [],
    method_type: MethodType.new(
      type: Types::Function.empty(Types::Bases::Instance.new(location: nil)).update(
        optional_positionals: @target_class.members.map { |m| Types::Function::Param.new(name: m, type: untyped) },
      ),
      type_params: [],
      block: nil,
      location: nil,
    )
  )
end

#build_s_keyword_init_pArray[AST::Members::MethodDefinition]

def self.keyword_init?: () -> bool?

Returns:



173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
# File 'lib/rbs/prototype/runtime/value_object_generator.rb', line 173

def build_s_keyword_init_p
  return_type = @target_class.keyword_init?.nil? \
              ? Types::Bases::Nil.new(location: nil)
              : Types::Literal.new(literal: @target_class.keyword_init?, location: nil)
  type = Types::Function.empty(return_type)

  [
    AST::Members::MethodDefinition.new(
      name: :keyword_init?,
      overloads: [
        AST::Members::MethodDefinition::Overload.new(
          annotations: [],
          method_type: MethodType.new(
            type: type,
            type_params: [],
            block: nil,
            location: nil,
          )
        )
      ],
      kind: :singleton,
      location: nil,
      comment: nil,
      annotations: [],
      overloading: false,
      visibility: nil
    )
  ]
end

#build_s_newArray[AST::Members::MethodDefinition]

def self.new: (?untyped foo, ?untyped bar) -> instance | (?foo: untyped, ?bar: untyped) -> instance

Returns:



115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# File 'lib/rbs/prototype/runtime/value_object_generator.rb', line 115

def build_s_new
  [:new, :[]].map do |name|
    new_overloads = [] #: Array[AST::Members::MethodDefinition::Overload]

    case @target_class.keyword_init?
    when false
      new_overloads << build_overload_for_positional_arguments
    when true
      new_overloads << build_overload_for_keyword_arguments
    when nil
      new_overloads << build_overload_for_positional_arguments
      new_overloads << build_overload_for_keyword_arguments
    else
      raise
    end

    AST::Members::MethodDefinition.new(
      name: name,
      overloads: new_overloads,
      kind: :singleton,
      location: nil,
      comment: nil,
      annotations: [],
      overloading: false,
      visibility: nil
    )
  end
end

#build_super_classAST::Declarations::Class::Super



102
103
104
# File 'lib/rbs/prototype/runtime/value_object_generator.rb', line 102

def build_super_class
  AST::Declarations::Class::Super.new(name: TypeName.parse("::Struct"), args: [untyped], location: nil)
end