Skip to content

Commit

Permalink
Correct indenting of suffix clauses
Browse files Browse the repository at this point in the history
  • Loading branch information
jasonl committed Aug 15, 2010
1 parent 44bfe5f commit 0470f6c
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 2 deletions.
15 changes: 14 additions & 1 deletion lib/eden/formatters/indenter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -29,15 +29,28 @@ def self.calculate_pre_indent( line )

def self.calculate_post_indent( line )
line.tokens.each do |t|
if [:class, :def, :module, :do, :begin, :rescue, :if, :else, :elsif, :case].include?(t.type)
if [:class, :def, :module, :do, :begin, :rescue, :if, :else, :elsif, :case, :unless].include?(t.type)
increase_indent!

# Handle suffix conditionals
if [:if, :unless].include?(t.type)
prev_token = line.previous_non_whitespace_token(t)
decrease_indent! if !prev_token.nil? || (prev_token && prev_token.type == :equals)
end

line.tokens.each do |tok|
decrease_indent! if tok.is?( :end )
end
end

if [:for, :until, :while].include?(t.type)
increase_indent!

if [:until, :while].include?(t.type)
prev_token = line.previous_non_whitespace_token(t)
decrease_indent! if !prev_token.nil? || (prev_token && prev_token.type == :equals)
end

line.tokens.each do |tok|
decrease_indent! if tok.is?( :do )
end
Expand Down
11 changes: 11 additions & 0 deletions lib/eden/line.rb
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,17 @@ def previous_token( token )
return tokens[token_index-1]
end

def previous_non_whitespace_token( token )
token_index = tokens.index( token )
return nil if token_index.nil? || token_index == 0
token_index -= 1
while( token_index != 0 )
return tokens[token_index] if tokens[token_index].type != :whitespace
token_index -= 1
end
return nil
end

def next_token( token )
token_index = tokens.index( token )
return nil if token_index.nil? || token_index == tokens.length
Expand Down
60 changes: 59 additions & 1 deletion test/indenter_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -174,10 +174,38 @@ def test_should_indent_case_statement_when_not_set
assert_equal "end\n", @sf.lines[7].joined_tokens
end

# if suffix condition
def test_should_not_indent_suffix_conditional
@sf.stubs(:source)
@sf.stubs(:source).returns(<<-SOURCE.gsub(/^ /,''))
def function
do_something if some_condition
do_something_else
end
SOURCE
@sf.tokenize!
Indenter.format( @sf )
assert_equal "def function\n", @sf.lines[0].joined_tokens
assert_equal " do_something if some_condition\n", @sf.lines[1].joined_tokens
assert_equal " do_something_else\n", @sf.lines[2].joined_tokens
assert_equal "end\n", @sf.lines[3].joined_tokens
end

# unless suffix condition
def test_should_not_indent_suffix_conditional2
@sf.stubs(:source).returns(<<-SOURCE.gsub(/^ /,''))
def function
do_something unless some_condition
do_something_else
end
SOURCE
@sf.tokenize!
Indenter.format( @sf )
assert_equal "def function\n", @sf.lines[0].joined_tokens
assert_equal " do_something unless some_condition\n", @sf.lines[1].joined_tokens
assert_equal " do_something_else\n", @sf.lines[2].joined_tokens
assert_equal "end\n", @sf.lines[3].joined_tokens
end

# Loop Statements
#-----------------------------------------------------------------------------

Expand All @@ -194,6 +222,21 @@ def test_should_indent_while_statement
assert_equal "end\n", @sf.lines[2].joined_tokens
end

def test_should_not_index_suffix_while_statement
@sf.stubs(:source).returns(<<-SOURCE.gsub(/^ /,''))
def function
do_something while some_condition
do_something_else
end
SOURCE
@sf.tokenize!
Indenter.format( @sf )
assert_equal "def function\n", @sf.lines[0].joined_tokens
assert_equal " do_something while some_condition\n", @sf.lines[1].joined_tokens
assert_equal " do_something_else\n", @sf.lines[2].joined_tokens
assert_equal "end\n", @sf.lines[3].joined_tokens
end

def test_should_indent_while_statement_with_optional_do
@sf.stubs(:source).returns(<<-SOURCE.gsub(/^ /, ''))
while @something do
Expand All @@ -220,6 +263,21 @@ def test_should_indent_until_statement
assert_equal "end\n", @sf.lines[2].joined_tokens
end

def test_should_not_index_suffix_until_statement
@sf.stubs(:source).returns(<<-SOURCE.gsub(/^ /,''))
def function
do_something until some_condition
do_something_else
end
SOURCE
@sf.tokenize!
Indenter.format( @sf )
assert_equal "def function\n", @sf.lines[0].joined_tokens
assert_equal " do_something until some_condition\n", @sf.lines[1].joined_tokens
assert_equal " do_something_else\n", @sf.lines[2].joined_tokens
assert_equal "end\n", @sf.lines[3].joined_tokens
end

def test_should_indent_until_statement_with_optional_do
@sf.stubs(:source).returns(<<-SOURCE.gsub(/^ /, ''))
until @something do
Expand Down

0 comments on commit 0470f6c

Please sign in to comment.