class Tapioca::Compilers::Dsl::Base

Attributes

processable_constants[R]

Public Class Methods

new() click to toggle source
# File lib/tapioca/compilers/dsl/base.rb, line 21
def initialize
  @processable_constants = T.let(Set.new(gather_constants), T::Set[Module])
end

Public Instance Methods

decorate(tree, constant) click to toggle source
# File lib/tapioca/compilers/dsl/base.rb, line 39
def decorate(tree, constant); end
gather_constants() click to toggle source
# File lib/tapioca/compilers/dsl/base.rb, line 42
def gather_constants; end
handles?(constant) click to toggle source
# File lib/tapioca/compilers/dsl/base.rb, line 26
def handles?(constant)
  processable_constants.include?(constant)
end

Private Instance Methods

all_classes() click to toggle source
# File lib/tapioca/compilers/dsl/base.rb, line 47
def all_classes
  @all_classes = T.let(@all_classes, T.nilable(T::Enumerable[Class]))
  @all_classes ||= T.cast(ObjectSpace.each_object(Class), T::Enumerable[Class]).each
end
all_modules() click to toggle source
# File lib/tapioca/compilers/dsl/base.rb, line 53
def all_modules
  @all_modules = T.let(@all_modules, T.nilable(T::Enumerable[Module]))
  @all_modules ||= T.cast(ObjectSpace.each_object(Module), T::Enumerable[Module]).each
end
compile_method_parameters_to_rbi(method_def) click to toggle source
# File lib/tapioca/compilers/dsl/base.rb, line 138
def compile_method_parameters_to_rbi(method_def)
  signature = T::Private::Methods.signature_for_method(method_def)
  method_def = signature.nil? ? method_def : signature.method
  method_types = parameters_types_from_signature(method_def, signature)

  method_def.parameters.each_with_index.map do |(type, name), index|
    fallback_arg_name = "_arg#{index}"

    name ||= fallback_arg_name
    name = name.to_s.gsub(/&|\*/, fallback_arg_name) # avoid incorrect names from `delegate`
    method_type = T.must(method_types[index])

    case type
    when :req
      create_param(name, type: method_type)
    when :opt
      create_opt_param(name, type: method_type, default: "T.unsafe(nil)")
    when :rest
      create_rest_param(name, type: method_type)
    when :keyreq
      create_kw_param(name, type: method_type)
    when :key
      create_kw_opt_param(name, type: method_type, default: "T.unsafe(nil)")
    when :keyrest
      create_kw_rest_param(name, type: method_type)
    when :block
      create_block_param(name, type: method_type)
    else
      raise "Unknown type `#{type}`."
    end
  end
end
compile_method_return_type_to_rbi(method_def) click to toggle source
# File lib/tapioca/compilers/dsl/base.rb, line 172
def compile_method_return_type_to_rbi(method_def)
  signature = T::Private::Methods.signature_for_method(method_def)
  return_type = signature.nil? ? "T.untyped" : name_of_type(signature.return_type)
  return_type = "void" if return_type == "<VOID>"
  # Map <NOT-TYPED> to `T.untyped`
  return_type = "T.untyped" if return_type == "<NOT-TYPED>"
  return_type
end
create_block_param(name, type:) click to toggle source
# File lib/tapioca/compilers/dsl/base.rb, line 128
def create_block_param(name, type:)
  create_typed_param(RBI::BlockParam.new(name), type)
end
create_kw_opt_param(name, type:, default:) click to toggle source
# File lib/tapioca/compilers/dsl/base.rb, line 118
def create_kw_opt_param(name, type:, default:)
  create_typed_param(RBI::KwOptParam.new(name, default), type)
end
create_kw_param(name, type:) click to toggle source
# File lib/tapioca/compilers/dsl/base.rb, line 113
def create_kw_param(name, type:)
  create_typed_param(RBI::KwParam.new(name), type)
end
create_kw_rest_param(name, type:) click to toggle source
# File lib/tapioca/compilers/dsl/base.rb, line 123
def create_kw_rest_param(name, type:)
  create_typed_param(RBI::KwRestParam.new(name), type)
end
create_method_from_def(scope, method_def, class_method: false) click to toggle source
# File lib/tapioca/compilers/dsl/base.rb, line 88
def create_method_from_def(scope, method_def, class_method: false)
  scope.create_method(
    method_def.name.to_s,
    parameters: compile_method_parameters_to_rbi(method_def),
    return_type: compile_method_return_type_to_rbi(method_def),
    class_method: class_method
  )
end
create_opt_param(name, type:, default:) click to toggle source
# File lib/tapioca/compilers/dsl/base.rb, line 103
def create_opt_param(name, type:, default:)
  create_typed_param(RBI::OptParam.new(name, default), type)
end
create_param(name, type:) click to toggle source
# File lib/tapioca/compilers/dsl/base.rb, line 98
def create_param(name, type:)
  create_typed_param(RBI::Param.new(name), type)
end
create_rest_param(name, type:) click to toggle source
# File lib/tapioca/compilers/dsl/base.rb, line 108
def create_rest_param(name, type:)
  create_typed_param(RBI::RestParam.new(name), type)
end
create_typed_param(param, type) click to toggle source
# File lib/tapioca/compilers/dsl/base.rb, line 133
def create_typed_param(param, type)
  RBI::TypedParam.new(param: param, type: type)
end
parameters_types_from_signature(method_def, signature) click to toggle source
# File lib/tapioca/compilers/dsl/base.rb, line 65
def parameters_types_from_signature(method_def, signature)
  params = T.let([], T::Array[String])

  return method_def.parameters.map { "T.untyped" } unless signature

  # parameters types
  signature.arg_types.each { |arg_type| params << arg_type[1].to_s }

  # keyword parameters types
  signature.kwarg_types.each { |_, kwarg_type| params << kwarg_type.to_s }

  # rest parameter type
  params << signature.rest_type.to_s if signature.has_rest

  # special case `.void` in a proc
  unless signature.block_name.nil?
    params << signature.block_type.to_s.gsub("returns(<VOID>)", "void")
  end

  params
end