Sha256: 69f4069b79dab2302683d628cf5d37ffa30c5c4f1042b733fe1444ee91120fb1

Contents?: true

Size: 1.97 KB

Versions: 9

Compression:

Stored size: 1.97 KB

Contents

#!ruby

require 'bundler/inline'

gemfile do
  source 'https://rubygems.org'
  gem 'rbs', '1.0.0'
end

require 'rbs'

def args(n)
  (:T..).take(n)
end

def env
  @env ||= begin
    loader = RBS::EnvironmentLoader.new()
    loader.add(library: 'tsort')
    RBS::Environment.from_loader(loader).resolve_type_names
  end
end

def apply_to_superclass(decl)
  return unless decl.super_class

  name = decl.super_class.name
  type = env.class_decls[name] || env.class_decls[name.absolute!]
  return unless type
  return if type.type_params.empty?

  args = args(type.type_params.size)
  decl.super_class.instance_variable_set(:@args, args)
  type_params = RBS::AST::Declarations::ModuleTypeParams.new.tap do |tp|
    args.each do |a|
      tp.add RBS::AST::Declarations::ModuleTypeParams::TypeParam.new(name: a)
    end
  end

  decl.instance_variable_set(:@type_params, type_params)
end

def apply_to_itself(decl)
  name = decl.name
  type = env.class_decls[name] || env.class_decls[name.absolute!]
  return unless type
  return if type.type_params.empty?

  decl.instance_variable_set(:@type_params, type.type_params.dup)
end

def apply_to_includes(decl)
  decl.members.each do |member|
    next unless member.is_a?(RBS::AST::Members::Mixin)

    name = member.name
    type = env.class_decls[name] || env.class_decls[name.absolute!]
    next unless type
    next if type.type_params.empty?

    args = type.type_params.size.times.map { :untyped }
    member.instance_variable_set(:@args, args)
  end
end

def analyze(decls)
  decls.each do |decl|
    case decl
    when RBS::AST::Declarations::Class
      apply_to_itself(decl)
      apply_to_superclass(decl)
      apply_to_includes(decl)
      analyze(decl.members)
    when RBS::AST::Declarations::Module, RBS::AST::Declarations::Interface
      apply_to_itself(decl)
      apply_to_includes(decl)
      analyze(decl.members)
    end
  end
end

rbs = ARGF.read
decls = RBS::Parser.parse_signature(rbs)
analyze(decls)

puts RBS::Writer.new(out: $stdout).write(decls)

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
rbs_rails-0.12.1 bin/add-type-params.rb
rbs_rails-0.12.0 bin/add-type-params.rb
rbs_rails-0.11.0 bin/add-type-params.rb
rbs_rails-0.10.1 bin/add-type-params.rb
rbs_rails-0.10.0 bin/add-type-params.rb
rbs_rails-0.9.0 bin/add-type-params.rb
rbs_rails-0.8.2 bin/add-type-params.rb
rbs_rails-0.8.1 bin/add-type-params.rb
rbs_rails-0.8.0 bin/add-type-params.rb