From 11dc6f8fd242ca25d8a43d3f9f4a91fb2b8733fa Mon Sep 17 00:00:00 2001 From: preciz Date: Wed, 12 Aug 2026 22:16:19 +0200 Subject: [PATCH] Optimize EEx fn block detection Scan reversed tokens once to identify whether a stab expression starts an anonymous function block. Assisted-by: Codex:GPT-5 --- lib/eex/lib/eex/compiler.ex | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/eex/lib/eex/compiler.ex b/lib/eex/lib/eex/compiler.ex index ec2586914e0..291976cdffb 100644 --- a/lib/eex/lib/eex/compiler.ex +++ b/lib/eex/lib/eex/compiler.ex @@ -209,11 +209,8 @@ defmodule EEx.Compiler do {[{:end, _} | _], [{:stab_op, _, _} | _]} -> {:middle_expr, expr, %{}} - {_, [{:stab_op, _, _} | reverse_tokens]} -> - fn_index = Enum.find_index(reverse_tokens, &match?({:fn, _}, &1)) || :infinity - end_index = Enum.find_index(reverse_tokens, &match?({:end, _}, &1)) || :infinity - - if end_index > fn_index do + {_, [{:stab_op, _, _} | rev_tokens]} -> + if fn_before_end?(rev_tokens) do {:start_expr, expr, %{}} else {:middle_expr, expr, %{}} @@ -227,6 +224,11 @@ defmodule EEx.Compiler do end end + defp fn_before_end?([{:fn, _} | _]), do: true + defp fn_before_end?([{:end, _} | _]), do: false + defp fn_before_end?([_ | rev_tokens]), do: fn_before_end?(rev_tokens) + defp fn_before_end?([]), do: false + defp drop_eol([{:eol, _} | rest]), do: drop_eol(rest) defp drop_eol(rest), do: rest