class RBS::Writer

def write_decl(decl)

def write_decl(decl)
  case decl
  when AST::Declarations::Class
    super_class = if super_class = decl.super_class
                    " < #{name_and_args(super_class.name, super_class.args)}"
                  end
    write_comment decl.comment
    write_annotation decl.annotations
    puts "class #{name_and_params(decl.name, decl.type_params)}#{super_class}"
    indent do
      [nil, *decl.members].each_cons(2) do |prev, member|
        raise unless member
        preserve_empty_line prev, member
        write_member member
      end
    end
    puts "end"
  when AST::Declarations::Module
    self_type = unless decl.self_types.empty?
                  " : #{decl.self_types.join(", ")}"
                end
    write_comment decl.comment
    write_annotation decl.annotations
    puts "module #{name_and_params(decl.name, decl.type_params)}#{self_type}"
    indent do
      decl.members.each.with_index do |member, index|
        if index > 0
          puts
        end
        write_member member
      end
    end
    puts "end"
  when AST::Declarations::Constant
    write_comment decl.comment
    puts "#{decl.name}: #{decl.type}"
  when AST::Declarations::Global
    write_comment decl.comment
    puts "#{decl.name}: #{decl.type}"
  when AST::Declarations::Alias
    write_comment decl.comment
    write_annotation decl.annotations
    write_loc_source(decl) {
      puts "type #{name_and_params(decl.name, decl.type_params)} = #{decl.type}"
    }
  when AST::Declarations::Interface
    write_comment decl.comment
    write_annotation decl.annotations
    puts "interface #{name_and_params(decl.name, decl.type_params)}"
    indent do
      decl.members.each.with_index do |member, index|
        if index > 0
          puts
        end
        write_member member
      end
    end
    puts "end"
  end
end