From 491f523ab18cae6e14a2929de14d51803c362a7c Mon Sep 17 00:00:00 2001 From: nobu Date: Wed, 21 Mar 2018 10:32:15 +0000 Subject: [PATCH] parse.y: unindent continued line * parse.y (tokadd_string): stop at continued line in dedented here documents, to dedent for each lines before removing escaped newlines. [ruby-core:86236] [Bug #14621] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62872 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- parse.y | 10 +++++++++- test/ruby/test_syntax.rb | 6 ++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/parse.y b/parse.y index fc0e15b890..138a29fab6 100644 --- a/parse.y +++ b/parse.y @@ -5642,7 +5642,14 @@ tokadd_string(struct parser_params *p, switch (c) { case '\n': if (func & STR_FUNC_QWORDS) break; - if (func & STR_FUNC_EXPAND) continue; + if (func & STR_FUNC_EXPAND) { + if (!(func & STR_FUNC_INDENT) || (p->heredoc_indent < 0)) + continue; + if (c == term) { + c = '\\'; + goto terminate; + } + } tokadd(p, '\\'); break; @@ -5723,6 +5730,7 @@ tokadd_string(struct parser_params *p, } tokadd(p, c); } + terminate: if (enc) *encp = enc; return c; } diff --git a/test/ruby/test_syntax.rb b/test/ruby/test_syntax.rb index d426f835ae..283bac3f5f 100644 --- a/test/ruby/test_syntax.rb +++ b/test/ruby/test_syntax.rb @@ -721,6 +721,12 @@ e" assert_dedented_heredoc(expected, result) end + def test_dedented_heredoc_continued_line + result = " 1\\\n" " 2\n" + expected = "1\\\n" "2\n" + assert_dedented_heredoc(expected, result) + end + def test_lineno_after_heredoc bug7559 = '[ruby-dev:46737]' expected, _, actual = __LINE__, <