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