From 9a7092e8f03f370adea7c8027a809d8430867509 Mon Sep 17 00:00:00 2001 From: Lukasz Samson Date: Tue, 21 Apr 2026 14:41:29 +0200 Subject: [PATCH] Enrich EEx.SyntaxError with error metadata Fixes #15296 --- lib/eex/lib/eex/compiler.ex | 18 ++++++++++++++++-- lib/eex/test/eex_test.exs | 12 ++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/lib/eex/lib/eex/compiler.ex b/lib/eex/lib/eex/compiler.ex index 56d0a413971..0511023b45e 100644 --- a/lib/eex/lib/eex/compiler.ex +++ b/lib/eex/lib/eex/compiler.ex @@ -347,7 +347,7 @@ defmodule EEx.Compiler do state.parser_options expr = Code.string_to_quoted!(chars, options) - buffer = state.engine.handle_expr(buffer, IO.chardata_to_string(mark), expr) + buffer = handle_expr(buffer, mark, expr, meta, state) generate_buffer(rest, buffer, scope, state) end @@ -376,7 +376,7 @@ defmodule EEx.Compiler do IO.warn(message, file: state.file, line: meta.line, column: meta.column) end - buffer = state.engine.handle_expr(buffer, IO.chardata_to_string(mark), contents) + buffer = handle_expr(buffer, mark, contents, meta, state) generate_buffer(rest, buffer, scope, state) end @@ -513,6 +513,20 @@ defmodule EEx.Compiler do column: meta.column end + defp handle_expr(buffer, mark, expr, meta, state) do + state.engine.handle_expr(buffer, IO.chardata_to_string(mark), expr) + rescue + e in EEx.SyntaxError -> + reraise %{ + e + | file: e.file || state.file, + line: e.line || meta.line, + column: e.column || meta.column, + snippet: e.snippet || code_snippet(state.source, state.indentation, meta) + }, + __STACKTRACE__ + end + defp code_snippet(source, indentation, meta) do line_start = max(meta.line - 3, 1) line_end = meta.line diff --git a/lib/eex/test/eex_test.exs b/lib/eex/test/eex_test.exs index 5214b3afc64..27c4e9abbcb 100644 --- a/lib/eex/test/eex_test.exs +++ b/lib/eex/test/eex_test.exs @@ -575,6 +575,18 @@ defmodule EExTest do EEx.compile_string("foo <%= bar", file: "my_file.eex") end end + + test "unsupported marker error carries template location metadata" do + error = + assert_raise EEx.SyntaxError, fn -> + EEx.compile_string("<%/ true %>", file: "sample.eex", line: 7) + end + + assert error.file == "sample.eex" + assert error.line == 7 + assert error.column == 1 + assert Exception.message(error) =~ "sample.eex:7:1:" + end end describe "warnings" do