class RBS::Prototype::Runtime::StructGenerator - rbs: Ruby Standard Library Documentation

# class RBS::Prototype::Runtime::StructGenerator

### Constants

CAN_CALL_KEYWORD_INIT_P

### Public Class Methods

generatable?(target) click to toggle source

    # File rbs-3.8.0/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

### Private Instance Methods

add_decl_members(decl) click to toggle source

    # File rbs-3.8.0/lib/rbs/prototype/runtime/value_object_generator.rb, line 108
    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_arguments() click to toggle source

    # File rbs-3.8.0/lib/rbs/prototype/runtime/value_object_generator.rb, line 165
    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_arguments() click to toggle source

    # File rbs-3.8.0/lib/rbs/prototype/runtime/value_object_generator.rb, line 151
    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_p() click to toggle source

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

    # File rbs-3.8.0/lib/rbs/prototype/runtime/value_object_generator.rb, line 180
    def build_s_keyword_init_p
      return [] unless CAN_CALL_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_new() click to toggle source

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

    | (?foo: untyped, ?bar: untyped) -> instance

    # File rbs-3.8.0/lib/rbs/prototype/runtime/value_object_generator.rb, line 117
    def build_s_new
      [:new, :[]].map do |name|
        new_overloads = [] #: Array[AST::Members::MethodDefinition::Overload]

        if CAN_CALL_KEYWORD_INIT_P
          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
        else
          new_overloads << build_overload_for_positional_arguments
          new_overloads << build_overload_for_keyword_arguments
        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_class() click to toggle source

    # File rbs-3.8.0/lib/rbs/prototype/runtime/value_object_generator.rb, line 104
    def build_super_class
      AST::Declarations::Class::Super.new(name: TypeName.parse("::Struct"), args: [untyped], location: nil)
    end