From 843bd0d9b7ff960adc0136bdb48a05d5d63c7c95 Mon Sep 17 00:00:00 2001 From: Pedro Medeiros Date: Thu, 28 Sep 2017 04:33:56 -0400 Subject: [PATCH] Raise on middle expression without start expression in EEx (#6610) --- lib/eex/lib/eex/compiler.ex | 7 ++++++- lib/eex/test/eex_test.exs | 6 ++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/eex/lib/eex/compiler.ex b/lib/eex/lib/eex/compiler.ex index 3d18554845c..9c4543c22c4 100644 --- a/lib/eex/lib/eex/compiler.ex +++ b/lib/eex/lib/eex/compiler.ex @@ -53,7 +53,7 @@ defmodule EEx.Compiler do generate_buffer(rest, state.engine.handle_begin(buffer), [wrapped | scope], %{state | line: line}) end - defp generate_buffer([{:middle_expr, line, modifier, chars} | t], buffer, scope, state) do + defp generate_buffer([{:middle_expr, line, modifier, chars} | t], buffer, [_ | _] = scope, state) do message = "unexpected beginning of EEx tag \"<%#{modifier}\" on \"<%#{modifier}#{chars}%>\", " <> "please remove \"#{modifier}\" accordingly" :elixir_errors.warn line, state.file, message @@ -62,6 +62,11 @@ defmodule EEx.Compiler do # raise EEx.SyntaxError, message: message, file: state.file, line: line end + defp generate_buffer([{:middle_expr, line, _, chars} | _], _buffer, [], state) do + raise EEx.SyntaxError, message: "unexpected middle of expression <%#{chars}%>", + file: state.file, line: line + end + defp generate_buffer([{:end_expr, line, '', chars} | rest], buffer, [current | _], state) do {wrapped, state} = wrap_expr(current, line, buffer, chars, state) tuples = Code.string_to_quoted!(wrapped, [line: state.start_line, file: state.file]) diff --git a/lib/eex/test/eex_test.exs b/lib/eex/test/eex_test.exs index c01abc477b5..3a0cbc07d83 100644 --- a/lib/eex/test/eex_test.exs +++ b/lib/eex/test/eex_test.exs @@ -150,6 +150,12 @@ defmodule EExTest do end end + test "when middle expression is found without a start expression" do + assert_raise EEx.SyntaxError, "nofile:1: unexpected middle of expression <% else %>", fn -> + EEx.compile_string "<% if true %> foo<% else %>bar<% end %>" + end + end + test "when end expression is found without a start expression" do assert_raise EEx.SyntaxError, "nofile:1: unexpected end of expression <% end %>", fn -> EEx.compile_string "foo <% end %>"