Skip to content

Commit 81dc365

Browse files
authored
Enrich EEx.SyntaxError with error metadata (#15297)
Fixes #15296
1 parent 99e0fe5 commit 81dc365

2 files changed

Lines changed: 28 additions & 2 deletions

File tree

lib/eex/lib/eex/compiler.ex

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,7 @@ defmodule EEx.Compiler do
347347
state.parser_options
348348

349349
expr = Code.string_to_quoted!(chars, options)
350-
buffer = state.engine.handle_expr(buffer, IO.chardata_to_string(mark), expr)
350+
buffer = handle_expr(buffer, mark, expr, meta, state)
351351
generate_buffer(rest, buffer, scope, state)
352352
end
353353

@@ -376,7 +376,7 @@ defmodule EEx.Compiler do
376376
IO.warn(message, file: state.file, line: meta.line, column: meta.column)
377377
end
378378

379-
buffer = state.engine.handle_expr(buffer, IO.chardata_to_string(mark), contents)
379+
buffer = handle_expr(buffer, mark, contents, meta, state)
380380
generate_buffer(rest, buffer, scope, state)
381381
end
382382

@@ -513,6 +513,20 @@ defmodule EEx.Compiler do
513513
column: meta.column
514514
end
515515

516+
defp handle_expr(buffer, mark, expr, meta, state) do
517+
state.engine.handle_expr(buffer, IO.chardata_to_string(mark), expr)
518+
rescue
519+
e in EEx.SyntaxError ->
520+
reraise %{
521+
e
522+
| file: e.file || state.file,
523+
line: e.line || meta.line,
524+
column: e.column || meta.column,
525+
snippet: e.snippet || code_snippet(state.source, state.indentation, meta)
526+
},
527+
__STACKTRACE__
528+
end
529+
516530
defp code_snippet(source, indentation, meta) do
517531
line_start = max(meta.line - 3, 1)
518532
line_end = meta.line

lib/eex/test/eex_test.exs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,18 @@ defmodule EExTest do
575575
EEx.compile_string("foo <%= bar", file: "my_file.eex")
576576
end
577577
end
578+
579+
test "unsupported marker error carries template location metadata" do
580+
error =
581+
assert_raise EEx.SyntaxError, fn ->
582+
EEx.compile_string("<%/ true %>", file: "sample.eex", line: 7)
583+
end
584+
585+
assert error.file == "sample.eex"
586+
assert error.line == 7
587+
assert error.column == 1
588+
assert Exception.message(error) =~ "sample.eex:7:1:"
589+
end
578590
end
579591

580592
describe "warnings" do

0 commit comments

Comments
 (0)