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
This commit is contained in:
nobu 2018-03-21 10:32:15 +00:00
Родитель bc7e5fcb32
Коммит 491f523ab1
2 изменённых файлов: 15 добавлений и 1 удалений

10
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;
}

Просмотреть файл

@ -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__, <<eom, __LINE__