File Manager

Current Path : /usr/lib/ruby/gems/3.0.0/gems/rbs-1.0.4/bin/
Upload File :
Current File : //usr/lib/ruby/gems/3.0.0/gems/rbs-1.0.4/bin/sort

#!/usr/bin/env ruby

require "bundler/setup"
require "rbs"

Members = RBS::AST::Members

def group(member)
  case member
  when Members::Include, Members::Extend, Members::Prepend
    0
  when Members::ClassVariable
    -3
  when Members::ClassInstanceVariable
    -2
  when Members::InstanceVariable
    -1
  when Members::AttrAccessor, Members::AttrWriter, Members::AttrReader
    2
  when Members::MethodDefinition
    if member.singleton?
      if member.name == :new
        0.4
      else
        1
      end
    else
      if member.name == :initialize
        0.5
      else
        3
      end
    end
  when Members::Alias
    if member.singleton?
      1
    else
      3
    end
  when Members::Private, Members::Public
    -4
  end
end

def key(member)
  case member
  when Members::Include, Members::Extend, Members::Prepend
    member.name.to_s
  when Members::ClassVariable, Members::ClassInstanceVariable, Members::InstanceVariable
    member.name.to_s
  when Members::AttrAccessor, Members::AttrWriter, Members::AttrReader
    member.name.to_s
  when Members::MethodDefinition
    member.name.to_s
  when Members::Alias
    member.new_name.to_s
  else
    1
  end
end

ARGV.map {|f| Pathname(f) }.each do |path|
  puts "Opening #{path}..."

  buffer = RBS::Buffer.new(name: path, content: path.read)
  sigs = RBS::Parser.parse_signature(buffer)

  sigs.each do |sig|
    case sig
    when RBS::AST::Declarations::Class, RBS::AST::Declarations::Module, RBS::AST::Declarations::Interface
      sig.members.sort! do |m1, m2|
        group1 = group(m1)
        group2 = group(m2)

        if group1 == group2
          key(m1) <=> key(m2)
        else
          group1 <=> group2
        end
      end
    end
  end

  puts "Writing #{path}..."
  path.open('w') do |out|
    writer = RBS::Writer.new(out: out)
    writer.write sigs
  end
end

File Manager Version 1.0, Coded By Lucas
Email: hehe@yahoo.com