summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen <kanobt61@gmail.com>2019-12-30 11:18:05 -0500
committeraycabta <aycabta@gmail.com>2020-01-14 15:40:38 +0900
commit9994eb8a5e72ff68ee2a13ddeff8d9307ba7cd84 (patch)
tree2764df9b1d270b40691b042de793032843bf949e
parent440013b2fa73d12aeb4027bb8d8d237ea8700099 (diff)
[ruby/irb] Fix newline depth with multiple braces
This commit fixes the check_newline_depth_difference method to multiple open braces on one line into account. Before this change we were subtracting from the depth in check_newline_depth_difference on every open brace. This is the right thing to do if the opening and closing brace are on the same line. For example in a method definition we have an opening and closing parentheses we want to add 1 to our depth, and then remove it. ``` def foo() end ``` However this isn't the correct behavior when the brace spans multiple lines. If a brace spans multiple lines we don't want to subtract from check_newline_depth_difference and we want to treat the braces the same way as we do `end` and allow check_corresponding_token_depth to pop the correct depth. Example of bad behavior: ``` def foo() [ ] puts 'bar' end ``` Example of desired behavior: ``` def foo() [ ] puts 'bar' end ``` https://github.com/ruby/irb/commit/7dc8af01e0
-rw-r--r--lib/irb/ruby-lex.rb5
-rw-r--r--test/irb/test_ruby_lex.rb15
2 files changed, 19 insertions, 1 deletions
diff --git a/lib/irb/ruby-lex.rb b/lib/irb/ruby-lex.rb
index b4c31c16fe..0a5e2c45b6 100644
--- a/lib/irb/ruby-lex.rb
+++ b/lib/irb/ruby-lex.rb
@@ -317,11 +317,13 @@ class RubyLex
def check_newline_depth_difference
depth_difference = 0
+ open_brace_on_line = 0
@tokens.each_with_index do |t, index|
case t[1]
when :on_ignored_nl, :on_nl, :on_comment
if index != (@tokens.size - 1)
depth_difference = 0
+ open_brace_on_line = 0
end
next
when :on_sp
@@ -330,8 +332,9 @@ class RubyLex
case t[1]
when :on_lbracket, :on_lbrace, :on_lparen
depth_difference += 1
+ open_brace_on_line += 1
when :on_rbracket, :on_rbrace, :on_rparen
- depth_difference -= 1
+ depth_difference -= 1 if open_brace_on_line > 0
when :on_kw
next if index > 0 and @tokens[index - 1][3].allbits?(Ripper::EXPR_FNAME)
case t[2]
diff --git a/test/irb/test_ruby_lex.rb b/test/irb/test_ruby_lex.rb
index f3a9b30e95..ae25b1d501 100644
--- a/test/irb/test_ruby_lex.rb
+++ b/test/irb/test_ruby_lex.rb
@@ -73,7 +73,22 @@ module TestIRB
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
+ def test_braces_on_thier_own_line
+ input_with_correct_indents = [
+ Row.new(%q(if true), nil, 2),
+ Row.new(%q( [), nil, 4),
+ Row.new(%q( ]), 2, 2),
+ Row.new(%q(end), 0, 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