diff --git a/ChangeLog b/ChangeLog index f16dfb0ed0..fbde95df19 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +Tue Mar 29 21:22:22 2016 Nobuyoshi Nakada + + * parse.y (xstring): reset heredoc indent after dedenting, + so that following string literal would not be dedented. + [ruby-core:72857] [Bug #11990] + +Tue Mar 29 21:22:22 2016 Nobuyoshi Nakada + + * parse.y (string1): reset heredoc indent fore each string leteral + so that concatenated string would not be dedented. + [ruby-core:72857] [Bug #11990] + Tue Mar 29 21:18:09 2016 Nobuyoshi Nakada * parse.y (parser_here_document): update indent for each line in diff --git a/parse.y b/parse.y index 68b3219a9f..e7f99d51aa 100644 --- a/parse.y +++ b/parse.y @@ -3907,7 +3907,6 @@ strings : string else { node = evstr2dstr(node); } - heredoc_indent = 0; $$ = node; /*% $$ = $1; @@ -3930,6 +3929,7 @@ string : tCHAR string1 : tSTRING_BEG string_contents tSTRING_END { heredoc_dedent($2); + heredoc_indent = 0; /*%%%*/ $$ = $2; /*% @@ -3945,6 +3945,7 @@ xstring : tXSTRING_BEG xstring_contents tSTRING_END /*% %*/ heredoc_dedent($2); + heredoc_indent = 0; /*%%%*/ if (!node) { node = NEW_XSTR(STR_NEW0()); diff --git a/test/ruby/test_syntax.rb b/test/ruby/test_syntax.rb index 1daf7b2d91..70b3934d4f 100644 --- a/test/ruby/test_syntax.rb +++ b/test/ruby/test_syntax.rb @@ -2,6 +2,14 @@ require 'test/unit' class TestSyntax < Test::Unit::TestCase + using Module.new { + refine(Object) do + def `(s) #` + s + end + end + } + def assert_syntax_files(test) srcdir = File.expand_path("../../..", __FILE__) srcdir = File.join(srcdir, test) @@ -493,10 +501,13 @@ e" end def assert_dedented_heredoc(expect, result, mesg = "") - %w[eos "eos" 'eos'].each do |eos| - assert_equal(eval("<<-#{eos}\n#{expect}eos\n"), - eval("<<~#{eos}\n#{result}eos\n"), - message(mesg) {"with #{eos}"}) + all_assertions(mesg) do |a| + %w[eos "eos" 'eos' `eos`].each do |eos| + a.for(eos) do + assert_equal(eval("<<-#{eos}\n#{expect}eos\n"), + eval("<<~#{eos}\n#{result}eos\n")) + end + end end end @@ -580,6 +591,19 @@ e" assert_dedented_heredoc(expect, result) end + def test_dedented_heredoc_with_concatenation + bug11990 = '[ruby-core:72857] [Bug #11990] concatenated string should not be dedented' + %w[eos "eos" 'eos'].each do |eos| + assert_equal("x\n y", + eval("<<~#{eos} ' y'\n x\neos\n"), + "#{bug11990} with #{eos}") + end + %w[eos "eos" 'eos' `eos`].each do |eos| + _, expect = eval("[<<~#{eos}, ' x']\n"" y\n""eos\n") + assert_equal(' x', expect, bug11990) + end + end + def test_lineno_after_heredoc bug7559 = '[ruby-dev:46737]' expected, _, actual = __LINE__, <