diff --git a/lib/rkelly/parser.rb b/lib/rkelly/parser.rb index 920de83..1b97901 100644 --- a/lib/rkelly/parser.rb +++ b/lib/rkelly/parser.rb @@ -27,6 +27,7 @@ def initialize @tokens = [] @logger = nil @terminator = false + @for_header_parentheses = 0 @prev_token = nil @comments = [] end @@ -88,7 +89,21 @@ def next_token end end while([:COMMENT, :S].include?(n_token.name)) + + if '(' == n_token.value + if 'for' == @prev_token.value + @for_header_parentheses = 1 + elsif @for_header_parentheses > 0 + @for_header_parentheses += 1 + end + end + + if ')' == n_token.value && @for_header_parentheses > 0 + @for_header_parentheses -= 1 + end + if @terminator && + 0 == @for_header_parentheses && ((@prev_token && %w[continue break return throw].include?(@prev_token.value)) || (n_token && %w[++ --].include?(n_token.value))) @position -= 1 diff --git a/test/test_automatic_semicolon_insertion.rb b/test/test_automatic_semicolon_insertion.rb index 8cb89d1..b998f0e 100644 --- a/test/test_automatic_semicolon_insertion.rb +++ b/test/test_automatic_semicolon_insertion.rb @@ -131,6 +131,22 @@ def test_no_for_insertion assert_nil @parser.parse("for (a;b\n){}") end + def test_no_for_insertion_with_prefix_plus_plus + assert_sexp([[:for, [:resolve, 'a'], + [:resolve, 'b'], + [:prefix, [:resolve, 'c'], '++'], + [:block, []]]], + @parser.parse("for (a;\nb;\n++c){}")) + end + + def test_no_for_insertion_with_postfix_plus_plus + assert_sexp([[:for, [:resolve, 'a'], + [:resolve, 'b'], + [:postfix, [:resolve, 'c'], '++'], + [:block, []]]], + @parser.parse("for (a;\nb;\nc++){}")) + end + def assert_sexp(expected, node) assert_equal(expected, node.to_sexp) end