Issue #9098 has been updated by Ben Miller.

File dedent_heredoc.patch added

I updated the patch to treat tabs as equal to 8 spaces.

This seems to work fine with the indentation produced by popular text editors (only tabs, only spaces, or tabs-then-spaces), with only one corner case I noticed, which is demonstrated in test_dedented_heredoc_with_inconsistent_indentation_preserves_tab (in test/ruby/test_syntax.rb), in which case we try backing up to the previous tab stop and starting over, to avoid breaking the hard tab. Do we need to handle spaces-then-tabs?

I attached the patch here so that more people are able to see it.

----------------------------------------
Feature #9098: Indent heredoc against the left margin by default when "indented closing identifier" is turned on.
https://bugs.ruby-lang.org/issues/9098#change-55122

* Author: Prem Sichanugrist
* Status: Assigned
* Priority: Normal
* Assignee: Yukihiro Matsumoto
----------------------------------------
tl;dr: I would like to port +String#strip_heredoc+ (http://api.rubyonrails.org/classes/String.html#method-i-strip_heredoc) from Rails and enable it on `<<-` heredoc.

Hi,

I've been using here document (heredoc) for a while, and I've found out that it's very annoying that the content is always treated as flushed left. Per syntax doc:

    Note that the while the closing identifier may be indented, the content is
    always treated as if it is flush left.  If you indent the content those spaces
    will appear in the output.

So, this is the current result if you use heredoc in Ruby:

    class FancyHello
      def self.hello
        puts <<-README.inspect
          Hello
            World!
        README
      end
    end
    
    FancyHello.hello # => "      Hello\n        World!\n"

In Rails, the core team has implemented +String#strip_heredoc+, which handles this scenario by remove leading white spaces  from the string. However, not many user know that Rails has that method, and instead doing this to get around it:

    class FancyHello
      def self.hello
        puts <<-README.inspect
    Hello
      World!
        README
      end
    end
    
    FancyHello.hello # => "Hello\n  World!\n"

I really think that we could do better on this by removing the leading white spaces, matching +String#strip_heredoc+ method.

So, after the change, I want to be able to do this, and get this result:

    class FancyHello
      def self.hello
        puts <<-README.inspect
          Hello
            World!
        README
      end
    end
    
    FancyHello.hello # => "Hello\n  World!\n"

Note: the behavior on `<<HEREDOC` will stay the same, as I feel like in that case you really want the input to be flushed left.

I'll write up a patch and submit it if you think this is a good idea. Please let me know any question or concern you may have.

Thank you,

Prem

---Files--------------------------------
dedent_heredoc.patch (12.8 KB)


-- 
https://bugs.ruby-lang.org/