Project

General

Profile

Actions

Misc #20503

closed

Dedenting heredoc line continuation

Added by kddnewton (Kevin Newton) 5 months ago. Updated 5 months ago.

Status:
Closed
Assignee:
-
[ruby-core:117984]

Description

When there is a line continuation inside a dedenting heredoc, occasionally it will impact the dedent calculation in interesting ways. I'm not sure if it's a bug, or if my understanding is incorrect.

<<~eos
  TEXT
eos

In this case the string is `"TEXT\n", because the common whitespace is 2 and it's removed from the only line. However if there is a line continuation:

<<~eos
  \
TEXT
eos

then the results is " TEXT\n". To me this seems incorrect, because the second line is supposed to be considered as part of the first, which would mean it should have the same result as the first one.

So either my understanding is incorrect or this is a bug. Could someone clarify? Thanks!

Updated by kddnewton (Kevin Newton) 5 months ago

For additional context, if you have:

<<~eos
  TEXT1
  TEXT2
eos

you will get "TEXT1\nTEXT2\n". But with a line continuation:

<<~eos
  \
TEXT1
  TEXT2
eos

you get: " TEXT1\n TEXT2\n". Even this seems incorrect because there is clearly common leading whitespace on both lines.

Updated by nobu (Nobuyoshi Nakada) 5 months ago

Line continuations work before (or in an under layer of) here documents.
For example, this is a syntax error, because eos line is continuing.

<<eos
\
eos

Does this explanation make sense?

Updated by kddnewton (Kevin Newton) 5 months ago

I'm not sure I understand. If they work before heredocs, shouldn't:

<<~eos
  \
TEXT1
  TEXT2
eos

be equivalent to:

<<~eos
  TEXT1
  TEXT2
eos

?

Updated by akr (Akira Tanaka) 5 months ago

A line continuation (backslash at the end of a line) in a string is a kind of escape sequence.

Currently (I believe) "removing white spaces in line head" is done before
"interpret escape sequences".
The current behavior seems reasonable to me.

If we exchange the order of "removing white spaces in line head" and
"interpreting escape sequences",
spaces after the escaped newline are considered as line head.
I think it is not reasonable.
For example, the following heredoc will be evaluated as "\nfoo\n".

<<~"EOS"
\n  foo  
EOS

The documentation can be improved:
line continuation should be documented as an escape sequence.

Updated by kddnewton (Kevin Newton) 5 months ago

I'm sorry I still seem to not be able to understand this. Maybe I am missing something.

This heredoc:

<<-HERE
  \
TEXT1
  TEXT2
HERE

gives " TEXT1\n TEXT2\n". So it is exactly equivalent to:

<<-HERE
  TEXT1
  TEXT2
HERE

In this case there are 2 common spaces at the beginning of the lines. Even if the line continuation were a kind of escape sequence, like \a, it would be:

<<-HERE
  \aTEXT1
  TEXT2
HERE

there would still be 2 common spaces. So in either case, shouldn't the <<~ be removing the common whitespace?

Updated by kddnewton (Kevin Newton) 5 months ago

  • Status changed from Open to Closed

I'm sorry I have misread what you said and I believe I understand now. If I am understanding correctly, line continuations cannot effect common whitespace calculations. So it is as if they were on different lines, and the second line has no leading whitespace so nothing is dedented.

Thank you for your explanation and patience!

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0