diff --git a/lib/spitfire.ex b/lib/spitfire.ex index 77e38c9..01d8f3d 100644 --- a/lib/spitfire.ex +++ b/lib/spitfire.ex @@ -788,14 +788,33 @@ defmodule Spitfire do end parser = parser |> next_token() |> eat_eoe() + rhs_parser = parser {rhs, parser} = parse_expression(parser, precedence, false, false, false) + {rhs, parser} = + if unparenthesized_do_end_block?(rhs) do + parse_expression(rhs_parser, @lowest, false, false, false) + else + {rhs, parser} + end + ast = {token, meta, [rhs]} {ast, parser} end end + defp unparenthesized_do_end_block?(ast) do + case ast do + {_, meta, _} when is_list(meta) -> + Keyword.has_key?(meta, :do) && Keyword.has_key?(meta, :end) && + not Keyword.has_key?(meta, :parens) + + _ -> + false + end + end + defp parse_prefix_lone_identifer(parser) do trace "parse_prefix_lone_identifer", trace_meta(parser) do token = current_token(parser) diff --git a/test/spitfire_test.exs b/test/spitfire_test.exs index 857215e..107bacc 100644 --- a/test/spitfire_test.exs +++ b/test/spitfire_test.exs @@ -2163,6 +2163,16 @@ defmodule SpitfireTest do assert Spitfire.parse(code) == s2q(code) end end + + test "operators on unmatched expression" do + code = ~S''' + +case a do + _ -> b + end |> c ** d >>> e + ''' + + assert Spitfire.parse(code) == s2q(code) + end end describe "code with errors" do