[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]