Skip to content

Commit 40164fc

Browse files
committed
Print intermediate results of dbg on if and case
Closes #14075. Closes #14005.
1 parent acdd846 commit 40164fc

File tree

2 files changed

+179
-98
lines changed

2 files changed

+179
-98
lines changed

lib/elixir/lib/macro.ex

Lines changed: 105 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -2589,10 +2589,18 @@ defmodule Macro do
25892589

25902590
header = dbg_format_header(env)
25912591

2592-
quote do
2593-
to_debug = unquote(dbg_ast_to_debuggable(code, env))
2594-
unquote(__MODULE__).__dbg__(unquote(header), to_debug, unquote(options))
2595-
end
2592+
prelude =
2593+
quote do
2594+
options = unquote(__MODULE__).__dbg_header__(unquote(header), unquote(options))
2595+
end
2596+
2597+
Enum.reduce(dbg_ast_to_debuggable(code, env), prelude, fn entry, acc ->
2598+
quote do
2599+
unquote(acc)
2600+
to_debug = unquote(entry)
2601+
unquote(__MODULE__).__dbg__(to_debug, options)
2602+
end
2603+
end)
25962604
end
25972605

25982606
# Pipelines.
@@ -2619,11 +2627,13 @@ defmodule Macro do
26192627
end
26202628
end
26212629

2622-
quote do
2623-
unquote(values_ast)
2630+
[
2631+
quote do
2632+
unquote(values_ast)
26242633

2625-
{:pipe, unquote(escape(asts)), Enum.reverse(unquote(values_acc_var))}
2626-
end
2634+
{:pipe, unquote(escape(asts)), Enum.reverse(unquote(values_acc_var))}
2635+
end
2636+
]
26272637
end
26282638

26292639
dbg_decomposed_binary_operators = [:&&, :||, :and, :or]
@@ -2634,22 +2644,26 @@ defmodule Macro do
26342644
acc_var = unique_var(:acc, __MODULE__)
26352645
result_var = unique_var(:result, __MODULE__)
26362646

2637-
quote do
2638-
unquote(acc_var) = []
2639-
unquote(dbg_boolean_tree(ast, acc_var, result_var))
2640-
{:logic_op, Enum.reverse(unquote(acc_var)), unquote(result_var)}
2641-
end
2647+
[
2648+
quote do
2649+
unquote(acc_var) = []
2650+
unquote(dbg_boolean_tree(ast, acc_var, result_var))
2651+
{:logic_op, Enum.reverse(unquote(acc_var)), unquote(result_var)}
2652+
end
2653+
]
26422654
end
26432655

26442656
defp dbg_ast_to_debuggable({:__block__, _meta, exprs} = ast, _env) when exprs != [] do
26452657
acc_var = unique_var(:acc, __MODULE__)
26462658
result_var = unique_var(:result, __MODULE__)
26472659

2648-
quote do
2649-
unquote(acc_var) = []
2650-
unquote(dbg_block(ast, acc_var, result_var))
2651-
{:block, Enum.reverse(unquote(acc_var)), unquote(result_var)}
2652-
end
2660+
[
2661+
quote do
2662+
unquote(acc_var) = []
2663+
unquote(dbg_block(ast, acc_var, result_var))
2664+
{:block, Enum.reverse(unquote(acc_var)), unquote(result_var)}
2665+
end
2666+
]
26532667
end
26542668

26552669
defp dbg_ast_to_debuggable({:case, _meta, [expr, [do: clauses]]} = ast, _env) do
@@ -2658,16 +2672,20 @@ defmodule Macro do
26582672
{:->, meta, [left, {right, index}]}
26592673
end)
26602674

2661-
quote do
2662-
expr = unquote(expr)
2663-
2664-
{result, clause_index} =
2665-
case expr do
2666-
unquote(clauses_returning_index)
2667-
end
2675+
[
2676+
quote do
2677+
expr = unquote(expr)
2678+
{:case_argument, unquote(escape(expr)), expr}
2679+
end,
2680+
quote do
2681+
{result, clause_index} =
2682+
case expr do
2683+
unquote(clauses_returning_index)
2684+
end
26682685

2669-
{:case, unquote(escape(ast)), expr, clause_index, result}
2670-
end
2686+
{:case_expression, unquote(escape(ast)), clause_index, result}
2687+
end
2688+
]
26712689
end
26722690

26732691
defp dbg_ast_to_debuggable({:cond, _meta, [[do: clauses]]} = ast, _env) do
@@ -2681,31 +2699,36 @@ defmodule Macro do
26812699
)
26822700
end)
26832701

2684-
quote do
2685-
{clause_ast, clause_value, clause_index, value} =
2686-
cond do
2687-
unquote(modified_clauses)
2688-
end
2702+
[
2703+
quote do
2704+
{clause_ast, clause_value, clause_index, value} =
2705+
cond do
2706+
unquote(modified_clauses)
2707+
end
26892708

2690-
{:cond, unquote(escape(ast)), clause_ast, clause_value, clause_index, value}
2691-
end
2709+
{:cond, unquote(escape(ast)), clause_ast, clause_value, clause_index, value}
2710+
end
2711+
]
26922712
end
26932713

26942714
defp dbg_ast_to_debuggable({:if, meta, [condition_ast, clauses]} = ast, env) do
26952715
case Macro.Env.lookup_import(env, {:if, 2}) do
26962716
[macro: Kernel] ->
26972717
condition_result_var = unique_var(:condition_result, __MODULE__)
26982718

2699-
quote do
2700-
unquote(condition_result_var) = unquote(condition_ast)
2701-
result = unquote({:if, meta, [condition_result_var, clauses]})
2702-
2703-
{:if, unquote(escape(ast)), unquote(escape(condition_ast)),
2704-
unquote(condition_result_var), result}
2705-
end
2719+
[
2720+
quote do
2721+
unquote(condition_result_var) = unquote(condition_ast)
2722+
{:if_condition, unquote(escape(condition_ast)), unquote(condition_result_var)}
2723+
end,
2724+
quote do
2725+
result = unquote({:if, meta, [condition_result_var, clauses]})
2726+
{:if_result, unquote(escape(ast)), result}
2727+
end
2728+
]
27062729

27072730
_ ->
2708-
quote do: {:value, unquote(escape(ast)), unquote(ast)}
2731+
[quote(do: {:value, unquote(escape(ast)), unquote(ast)})]
27092732
end
27102733
end
27112734

@@ -2778,18 +2801,20 @@ defmodule Macro do
27782801

27792802
modified_with_ast = {:with, meta, modified_clauses ++ [modified_opts]}
27802803

2781-
quote do
2782-
unquote(acc_var) = []
2804+
[
2805+
quote do
2806+
unquote(acc_var) = []
27832807

2784-
{value, acc} = unquote(modified_with_ast)
2808+
{value, acc} = unquote(modified_with_ast)
27852809

2786-
{:with, unquote(escape(ast)), Enum.reverse(acc), value}
2787-
end
2810+
{:with, unquote(escape(ast)), Enum.reverse(acc), value}
2811+
end
2812+
]
27882813
end
27892814

27902815
# Any other AST.
27912816
defp dbg_ast_to_debuggable(ast, _env) do
2792-
quote do: {:value, unquote(escape(ast)), unquote(ast)}
2817+
[quote(do: {:value, unquote(escape(ast)), unquote(ast)})]
27932818
end
27942819

27952820
# This is a binary operator. We replace the left side with a recursive call to
@@ -2834,23 +2859,25 @@ defmodule Macro do
28342859
# Made public to be called from Macro.dbg/3, so that we generate as little code
28352860
# as possible and call out into a function as soon as we can.
28362861
@doc false
2837-
def __dbg__(header_string, to_debug, options) do
2862+
def __dbg_header__(header_string, options) do
28382863
{print_location?, options} = Keyword.pop(options, :print_location, true)
2839-
syntax_colors = if IO.ANSI.enabled?(), do: IO.ANSI.syntax_colors(), else: []
2840-
options = Keyword.merge([width: 80, pretty: true, syntax_colors: syntax_colors], options)
28412864

2842-
{formatted, result} = dbg_format_ast_to_debug(to_debug, options)
2865+
if print_location? do
2866+
ansi_enabled? = options[:syntax_colors] != []
2867+
formatted = [:cyan, :italic, header_string, :reset, "\n"]
2868+
:ok = IO.write(IO.ANSI.format(formatted, ansi_enabled?))
2869+
end
28432870

2844-
formatted =
2845-
if print_location? do
2846-
[:cyan, :italic, header_string, :reset, "\n", formatted, "\n"]
2847-
else
2848-
[formatted, "\n"]
2849-
end
2871+
options
2872+
end
28502873

2874+
@doc false
2875+
def __dbg__(to_debug, options) do
2876+
syntax_colors = if IO.ANSI.enabled?(), do: IO.ANSI.syntax_colors(), else: []
2877+
options = Keyword.merge([width: 80, pretty: true, syntax_colors: syntax_colors], options)
2878+
{formatted, result} = dbg_format_ast_to_debug(to_debug, options)
28512879
ansi_enabled? = options[:syntax_colors] != []
2852-
:ok = IO.write(IO.ANSI.format(formatted, ansi_enabled?))
2853-
2880+
:ok = IO.write(IO.ANSI.format([formatted, ?\n], ansi_enabled?))
28542881
result
28552882
end
28562883

@@ -2891,14 +2918,18 @@ defmodule Macro do
28912918
{formatted, value}
28922919
end
28932920

2894-
defp dbg_format_ast_to_debug({:case, ast, expr_value, clause_index, value}, options) do
2895-
{:case, _meta, [expr_ast, _]} = ast
2896-
2921+
defp dbg_format_ast_to_debug({:case_argument, expr_ast, expr_value}, options) do
28972922
formatted = [
28982923
dbg_maybe_underline("Case argument", options),
28992924
":\n",
2900-
dbg_format_ast_with_value(expr_ast, expr_value, options),
2901-
?\n,
2925+
dbg_format_ast_with_value(expr_ast, expr_value, options)
2926+
]
2927+
2928+
{formatted, expr_value}
2929+
end
2930+
2931+
defp dbg_format_ast_to_debug({:case_expression, ast, clause_index, value}, options) do
2932+
formatted = [
29022933
dbg_maybe_underline("Case expression", options),
29032934
" (clause ##{clause_index + 1} matched):\n",
29042935
dbg_format_ast_with_value(ast, value, options)
@@ -2924,15 +2955,18 @@ defmodule Macro do
29242955
{formatted, value}
29252956
end
29262957

2927-
defp dbg_format_ast_to_debug(
2928-
{:if, ast, condition_ast, condition_result, result},
2929-
options
2930-
) do
2958+
defp dbg_format_ast_to_debug({:if_condition, condition_ast, condition_result}, options) do
29312959
formatted = [
29322960
dbg_maybe_underline("If condition", options),
29332961
":\n",
2934-
dbg_format_ast_with_value(condition_ast, condition_result, options),
2935-
?\n,
2962+
dbg_format_ast_with_value(condition_ast, condition_result, options)
2963+
]
2964+
2965+
{formatted, condition_result}
2966+
end
2967+
2968+
defp dbg_format_ast_to_debug({:if_result, ast, result}, options) do
2969+
formatted = [
29362970
dbg_maybe_underline("If expression", options),
29372971
":\n",
29382972
dbg_format_ast_with_value(ast, result, options)

0 commit comments

Comments
 (0)