ruby-changes:42324
From: naruse <ko1@a...>
Date: Tue, 29 Mar 2016 21:21:58 +0900 (JST)
Subject: [ruby-changes:42324] naruse:r54398 (ruby_2_3): merge revision(s) 53398: [Backport #11871]
naruse 2016-03-29 21:21:52 +0900 (Tue, 29 Mar 2016) New Revision: 54398 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=54398 Log: merge revision(s) 53398: [Backport #11871] * parse.y (parser_here_document): update indent for each line in indented here document with single-quotes. [ruby-core:72479] [Bug #11871] Modified directories: branches/ruby_2_3/ Modified files: branches/ruby_2_3/ChangeLog branches/ruby_2_3/parse.y branches/ruby_2_3/test/ruby/test_syntax.rb branches/ruby_2_3/version.h Index: ruby_2_3/ChangeLog =================================================================== --- ruby_2_3/ChangeLog (revision 54397) +++ ruby_2_3/ChangeLog (revision 54398) @@ -1,3 +1,9 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_3/ChangeLog#L1 +Tue Mar 29 21:18:09 2016 Nobuyoshi Nakada <nobu@r...> + + * parse.y (parser_here_document): update indent for each line in + indented here document with single-quotes. + [ruby-core:72479] [Bug #11871] + Tue Mar 29 21:03:40 2016 Nobuyoshi Nakada <nobu@r...> * symbol.h (is_attrset_id): ASET is an attrset ID. fix Index: ruby_2_3/parse.y =================================================================== --- ruby_2_3/parse.y (revision 54397) +++ ruby_2_3/parse.y (revision 54398) @@ -6210,6 +6210,32 @@ simple_re_meta(int c) https://github.com/ruby/ruby/blob/trunk/ruby_2_3/parse.y#L6210 } static int +parser_update_heredoc_indent(struct parser_params *parser, int c) +{ + if (heredoc_line_indent == -1) { + if (c == '\n') heredoc_line_indent = 0; + } + else { + if (c == ' ') { + heredoc_line_indent++; + return TRUE; + } + else if (c == '\t') { + int w = (heredoc_line_indent / TAB_WIDTH) + 1; + heredoc_line_indent = w * TAB_WIDTH; + return TRUE; + } + else if (c != '\n') { + if (heredoc_indent > heredoc_line_indent) { + heredoc_indent = heredoc_line_indent; + } + heredoc_line_indent = -1; + } + } + return FALSE; +} + +static int parser_tokadd_string(struct parser_params *parser, int func, int term, int paren, long *nest, rb_encoding **encp) @@ -6239,24 +6265,7 @@ parser_tokadd_string(struct parser_param https://github.com/ruby/ruby/blob/trunk/ruby_2_3/parse.y#L6265 while ((c = nextc()) != -1) { if (heredoc_indent > 0) { - if (heredoc_line_indent == -1) { - if (c == '\n') heredoc_line_indent = 0; - } - else { - if (c == ' ') { - heredoc_line_indent++; - } - else if (c == '\t') { - int w = (heredoc_line_indent / TAB_WIDTH) + 1; - heredoc_line_indent = w * TAB_WIDTH; - } - else if (c != '\n') { - if (heredoc_indent > heredoc_line_indent) { - heredoc_indent = heredoc_line_indent; - } - heredoc_line_indent = -1; - } - } + parser_update_heredoc_indent(parser, c); } if (paren && c == paren) { @@ -6876,6 +6885,14 @@ parser_here_document(struct parser_param https://github.com/ruby/ruby/blob/trunk/ruby_2_3/parse.y#L6885 --pend; } } + + if (heredoc_indent > 0) { + long i = 0; + while (p + i < pend && parser_update_heredoc_indent(parser, p[i])) + i++; + heredoc_line_indent = 0; + } + if (str) rb_str_cat(str, p, pend - p); else Index: ruby_2_3/version.h =================================================================== --- ruby_2_3/version.h (revision 54397) +++ ruby_2_3/version.h (revision 54398) @@ -1,6 +1,6 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_3/version.h#L1 #define RUBY_VERSION "2.3.0" #define RUBY_RELEASE_DATE "2016-03-29" -#define RUBY_PATCHLEVEL 47 +#define RUBY_PATCHLEVEL 48 #define RUBY_RELEASE_YEAR 2016 #define RUBY_RELEASE_MONTH 3 Index: ruby_2_3/test/ruby/test_syntax.rb =================================================================== --- ruby_2_3/test/ruby/test_syntax.rb (revision 54397) +++ ruby_2_3/test/ruby/test_syntax.rb (revision 54398) @@ -492,92 +492,92 @@ e" https://github.com/ruby/ruby/blob/trunk/ruby_2_3/test/ruby/test_syntax.rb#L492 assert_equal(expected, actual, "#{Bug7559}: ") 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}"}) + end + end + def test_dedented_heredoc_without_indentation - assert_equal(" y\nz\n", <<~eos) - y -z - eos + result = " y\n" \ + "z\n" + expect = result + assert_dedented_heredoc(expect, result) end def test_dedented_heredoc_with_indentation - assert_equal(" a\nb\n", <<~eos) - a - b - eos + result = " a\n" \ + " b\n" + expect = " a\n" \ + "b\n" + assert_dedented_heredoc(expect, result) end def test_dedented_heredoc_with_blank_less_indented_line # the blank line has two leading spaces - result = eval("<<~eos\n" \ - " a\n" \ - " \n" \ - " b\n" \ - " eos\n") - assert_equal("a\n\nb\n", result) + result = " a\n" \ + " \n" \ + " b\n" + expect = "a\n" \ + "\n" \ + "b\n" + assert_dedented_heredoc(expect, result) end def test_dedented_heredoc_with_blank_less_indented_line_escaped - result = eval("<<~eos\n" \ - " a\n" \ - "\\ \\ \n" \ - " b\n" \ - " eos\n") - assert_equal(" a\n \n b\n", result) + result = " a\n" \ + "\\ \\ \n" \ + " b\n" + expect = result + assert_dedented_heredoc(expect, result) end def test_dedented_heredoc_with_blank_more_indented_line # the blank line has six leading spaces - result = eval("<<~eos\n" \ - " a\n" \ - " \n" \ - " b\n" \ - " eos\n") - assert_equal("a\n \nb\n", result) + result = " a\n" \ + " \n" \ + " b\n" + expect = "a\n" \ + " \n" \ + "b\n" + assert_dedented_heredoc(expect, result) end def test_dedented_heredoc_with_blank_more_indented_line_escaped - result = eval("<<~eos\n" \ - " a\n" \ - "\\ \\ \\ \\ \\ \\ \n" \ - " b\n" \ - " eos\n") - assert_equal(" a\n \n b\n", result) + result = " a\n" \ + "\\ \\ \\ \\ \\ \\ \n" \ + " b\n" + expect = result + assert_dedented_heredoc(expect, result) end def test_dedented_heredoc_with_empty_line -result = eval("<<~eos\n" \ - " This would contain specially formatted text.\n" \ - "\n" \ - " That might span many lines\n" \ - " eos\n") - assert_equal(<<-eos, result) -This would contain specially formatted text. - -That might span many lines - eos + result = " This would contain specially formatted text.\n" \ + "\n" \ + " That might span many lines\n" + expect = 'This would contain specially formatted text.'"\n" \ + ''"\n" \ + 'That might span many lines'"\n" + assert_dedented_heredoc(expect, result) end def test_dedented_heredoc_with_interpolated_expression - result = eval(" <<~eos\n" \ - " #{1}a\n" \ - " zy\n" \ - " eos\n") - assert_equal(<<-eos, result) - #{1}a -zy - eos + result = ' #{1}a'"\n" \ + " zy\n" + expect = ' #{1}a'"\n" \ + "zy\n" + assert_dedented_heredoc(expect, result) end def test_dedented_heredoc_with_interpolated_string w = "" - result = eval("<<~eos\n" \ - " \#{w} a\n" \ - " zy\n" \ - " eos\n") - assert_equal(<<-eos, result) -#{w} a - zy - eos + result = " \#{mesg} a\n" \ + " zy\n" + expect = '#{mesg} a'"\n" \ + ' zy'"\n" + assert_dedented_heredoc(expect, result) end def test_lineno_after_heredoc Property changes on: ruby_2_3 ___________________________________________________________________ Modified: svn:mergeinfo Merged /trunk:r53398 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/