Skip to content

Constructor with block gets split onto new line even if it would fit #426

Open
@ibrahima

Description

@ibrahima

Hi! Thanks for building syntax_tree, I've started using it recently and am excited to enter a new world of not caring about code formatting in Ruby. I noticed one behavior that I'm not sure if it's intentional or not. When I have a constructor with a block argument, the constructor gets split onto a new line even if it would fit within the print width. The easiest example comes from the OptionParser documentation (in fact, I experienced this from code that I had based on this example). I don't know if it's specific to constructors or assignment, haven't really delved into other scenarios yet.

For this example I think I have print-width set to 100 (at least, I have a ~/.streerc with that set, though I am not 100% sure if it is read from the home directory).

The OptionParser example
require 'optparse'

Options = Struct.new(:name)

class Parser
  def self.parse(options)
    args = Options.new("world")

    opt_parser = OptionParser.new do |opts|
      opts.banner = "Usage: example.rb [options]"

      opts.on("-nNAME", "--name=NAME", "Name to say hello to") do |n|
        args.name = n
      end

      opts.on("-h", "--help", "Prints this help") do
        puts opts
        exit
      end
    end

    opt_parser.parse!(options)
    return args
  end
end
options = Parser.parse %w[--help]

How syntax_tree formats it:

require "optparse"

Options = Struct.new(:name)

class Parser
  def self.parse(options)
    args = Options.new("world")

    opt_parser =
      OptionParser.new do |opts|
        opts.banner = "Usage: example.rb [options]"

        opts.on("-nNAME", "--name=NAME", "Name to say hello to") do |n|
          args.name = n
        end

        opts.on("-h", "--help", "Prints this help") do
          puts opts
          exit
        end
      end

    opt_parser.parse!(options)
    return args
  end
end
options = Parser.parse %w[--help]

In particular, this is the part that surprises me:

-     opt_parser = OptionParser.new do |opts|
-       opts.banner = "Usage: example.rb [options]"
+     opt_parser =
+       OptionParser.new do |opts|
+         opts.banner = "Usage: example.rb [options]"

It seems kind of odd because by doing this it ends up indenting the block closing end one extra step, which looks slightly weird to me. I am guessing this is probably intentional, but I'm curious what the reason is behind this formatting. Thanks!


Addendum: It does look like it's just with any assignments that take a multi-line block.

It turns this:

a = [1, 2, 3]

b = a.each do |x|
  y = x**2 + 2 * x + 1
  [x, y]
end.to_h

p b

into this:

a = [1, 2, 3]

b =
  a
    .each do |x|
      y = x**2 + 2 * x + 1
      [x, y]
    end
    .to_h

p b

Truthfully, I feel like the output is pretty odd in this case, but it's kind of a pathological example with such short variable names.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions