Skip to content

Commit

Permalink
Error handler
Browse files Browse the repository at this point in the history
  • Loading branch information
rafaelfranca committed Feb 28, 2012
1 parent 6f8606d commit c795f09
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 1 deletion.
12 changes: 11 additions & 1 deletion lib/eex.ex
Expand Up @@ -4,6 +4,8 @@ defmodule EEx do
end
end

defexception EEx::SyntaxError, message: nil

defmodule EEx::Compiler do
def compile(source, engine) do
tokens = EEx::Tokenizer.tokenize(source)
Expand Down Expand Up @@ -40,10 +42,18 @@ defmodule EEx::Compiler do
{ buffer, t }
end

defp generate_buffer([], _engine, buffer, _scope, _dict) do
defp generate_buffer([{ :end_expr, _, chars }|_], _engine, _buffer, [], _dict) do
raise SyntaxError, message: "unexpected token: #{inspect chars}"
end

defp generate_buffer([], _engine, buffer, [], _dict) do
buffer
end

defp generate_buffer([], _engine, _buffer, _scope, _dict) do
raise SyntaxError, message: "undetermined end of string"
end

####

def wrap_expr(current, buffer, chars, dict) do
Expand Down
6 changes: 6 additions & 0 deletions lib/eex/tokenizer.ex
Expand Up @@ -61,6 +61,12 @@ defmodule EEx::Tokenizer do
tokenize_expr t, [h|buffer]
end

# Raise an error if the %> is not found

defp tokenize_expr([], buffer) do
raise EEx::SyntaxError, message: "invalid token: #{inspect List.reverse(buffer)}"
end

# Receive an expression content and check
# if it is a start or an end token.
# Start tokens finish with `do` or `->`
Expand Down
6 changes: 6 additions & 0 deletions test/elixir/eex/tokenizer_test.exs
Expand Up @@ -48,4 +48,10 @@ defmodule EEx::TokenizerTest do
{ :end_expr, '', ' end ' }
], T.tokenize('foo <% if true do %>bar<% elsif: false %>baz<% end %>')
end

test "raise syntax error when there is start mark and no end mark" do
T.tokenize('foo <% :bar', 1)
rescue: error in [EEx::SyntaxError]
assert_equal "invalid token: ' :bar'", error.message
end
end
28 changes: 28 additions & 0 deletions test/elixir/eex_test.exs
Expand Up @@ -52,6 +52,34 @@ defmodule EExTest do
assert_eval "foo 1,2,3", "foo <% require Enum, as: E %><%= E.join [1,2,3], \",\" %>"
end

test "compile with end of token" do
assert_eval "foo bar %>", "foo bar %>"
end

test "raises a syntax error when the token is invalid" do
EEx.compile "foo <%= bar"
rescue: error in [EEx::SyntaxError]
assert_equal "invalid token: ' bar'", error.message
end

test "raises a syntax error when end expression is found without a start expression" do
EEx.compile "foo <% end %>"
rescue: error in [EEx::SyntaxError]
assert_equal "unexpected token: ' end '", error.message
end

test "raises a syntax error when start expression is found without an end expression" do
EEx.compile "foo <% if true do %>"
rescue: error in [EEx::SyntaxError]
assert_equal "undetermined end of string", error.message
end

test "raises a syntax error when nested end expression is found without an start expression" do
EEx.compile "foo <%if true do %><% end %><% end %>"
rescue: error in [EEx::SyntaxError]
assert_equal "unexpected token: ' end '", error.message
end

defp assert_eval(expected, atual) do
compiled = EEx.compile(atual)
{ result, _ } = Code.eval_quoted(compiled, [], __FILE__, __LINE__)
Expand Down

0 comments on commit c795f09

Please sign in to comment.