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

ruby-changes:59699

From: Ben <ko1@a...>
Date: Tue, 14 Jan 2020 15:45:12 +0900 (JST)
Subject: [ruby-changes:59699] c94025b630 (master): [ruby/irb] Fix crashing when multiple open braces per line

https://git.ruby-lang.org/ruby.git/commit/?id=c94025b630

From c94025b63091be5b5e83a2f5ab5dc8d6c6147b84 Mon Sep 17 00:00:00 2001
From: Ben <kanobt61@g...>
Date: Sun, 5 Jan 2020 14:44:38 -0500
Subject: [ruby/irb] Fix crashing when multiple open braces per line

https://github.com/ruby/irb/issues/55

If we had put multiple open braces on a line the with no closing brace
spaces_of_nest array keeps getting '0' added to it. This means that when
we pop off of this array we are saying that we should be in position zero
for the next line. This is an issue because we don't always want to be
in position 0 after a closing brace.

Example:
```
[[[
]
]
]
```
In the above example the 'spaces_of_nest' array looks like this after
the first line is entered: [0,0,0]. We really want to be indented 4
spaces for the 1st closing brace 2 for the 2nd and 0 for the 3rd. i.e.
we want it to be: [0,2,4].

We also saw this issue with a heredoc inside of an array.

```
[<<FOO]
hello
FOO
```

https://github.com/ruby/irb/commit/80c69c8272

diff --git a/lib/irb/ruby-lex.rb b/lib/irb/ruby-lex.rb
index 0a5e2c4..3d1478d 100644
--- a/lib/irb/ruby-lex.rb
+++ b/lib/irb/ruby-lex.rb
@@ -368,6 +368,7 @@ class RubyLex https://github.com/ruby/ruby/blob/trunk/lib/irb/ruby-lex.rb#L368
     is_first_printable_of_line = true
     spaces_of_nest = []
     spaces_at_line_head = 0
+    open_brace_on_line = 0
     @tokens.each_with_index do |t, index|
       case t[1]
       when :on_ignored_nl, :on_nl, :on_comment
@@ -375,6 +376,7 @@ class RubyLex https://github.com/ruby/ruby/blob/trunk/lib/irb/ruby-lex.rb#L376
         spaces_at_line_head = 0
         is_first_spaces_of_line = true
         is_first_printable_of_line = true
+        open_brace_on_line = 0
         next
       when :on_sp
         spaces_at_line_head = t[2].count(' ') if is_first_spaces_of_line
@@ -383,7 +385,8 @@ class RubyLex https://github.com/ruby/ruby/blob/trunk/lib/irb/ruby-lex.rb#L385
       end
       case t[1]
       when :on_lbracket, :on_lbrace, :on_lparen
-        spaces_of_nest.push(spaces_at_line_head)
+        spaces_of_nest.push(spaces_at_line_head + open_brace_on_line * 2)
+        open_brace_on_line += 1
       when :on_rbracket, :on_rbrace, :on_rparen
         if is_first_printable_of_line
           corresponding_token_depth = spaces_of_nest.pop
diff --git a/test/irb/test_ruby_lex.rb b/test/irb/test_ruby_lex.rb
index ae25b1d..65fc7d4 100644
--- a/test/irb/test_ruby_lex.rb
+++ b/test/irb/test_ruby_lex.rb
@@ -93,5 +93,24 @@ module TestIRB https://github.com/ruby/ruby/blob/trunk/test/irb/test_ruby_lex.rb#L93
         assert_indenting(lines, row.new_line_spaces, true)
       end
     end
+
+    def test_multiple_braces_in_a_line
+      input_with_correct_indents = [
+        Row.new(%q([[[), nil, 6),
+        Row.new(%q(    ]), 4, 4),
+        Row.new(%q(  ]), 2, 2),
+        Row.new(%q(]), 0, 0),
+        Row.new(%q([<<FOO]), nil, 0),
+        Row.new(%q(hello), nil, 0),
+        Row.new(%q(FOO), nil, 0),
+      ]
+
+      lines = []
+      input_with_correct_indents.each do |row|
+        lines << row.content
+        assert_indenting(lines, row.current_line_spaces, false)
+        assert_indenting(lines, row.new_line_spaces, true)
+      end
+    end
   end
 end
-- 
cgit v0.10.2


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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