Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions lib/live_debugger/structs/trace.ex
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,50 @@ defmodule LiveDebugger.Structs.Trace do
"#{trace.function}/#{trace.arity}"
end

@spec arg_name(t(), non_neg_integer()) :: String.t()
def arg_name(trace, arg_index)

# Callbacks common for LiveView and LiveComponent
def arg_name(%{function: :handle_async}, 0), do: "name"
def arg_name(%{function: :handle_async}, 1), do: "async_fun_result"
def arg_name(%{function: :handle_async}, 2), do: "socket"

def arg_name(%{function: :handle_call}, 0), do: "message"
def arg_name(%{function: :handle_call}, 1), do: "from"
def arg_name(%{function: :handle_call}, 2), do: "socket"

def arg_name(%{function: :handle_cast}, 0), do: "message"
def arg_name(%{function: :handle_cast}, 1), do: "socket"

def arg_name(%{function: :handle_event}, 0), do: "event"
def arg_name(%{function: :handle_event}, 1), do: "unsigned_params"
def arg_name(%{function: :handle_event}, 2), do: "socket"

def arg_name(%{function: :handle_info}, 0), do: "message"
def arg_name(%{function: :handle_info}, 1), do: "socket"

def arg_name(%{function: :handle_params}, 0), do: "unsigned_params"
def arg_name(%{function: :handle_params}, 1), do: "uri"
def arg_name(%{function: :handle_params}, 2), do: "socket"

def arg_name(%{function: :render}, 0), do: "assigns"

def arg_name(%{function: :terminate}, 0), do: "reason"
def arg_name(%{function: :terminate}, 1), do: "socket"

# LiveView specific
def arg_name(%{function: :mount, arity: 3}, 0), do: "params"
def arg_name(%{function: :mount, arity: 3}, 1), do: "session"
def arg_name(%{function: :mount, arity: 3}, 2), do: "socket"

# LiveComponent specific
def arg_name(%{function: :mount, arity: 1}, 0), do: "socket"

def arg_name(%{function: :update}, 0), do: "assigns"
def arg_name(%{function: :update}, 1), do: "socket"

def arg_name(%{function: :update_many}, 0), do: "list"

defp get_transport_pid_from_args(args) do
args
|> Enum.map(&maybe_get_transport_pid(&1))
Expand Down
6 changes: 6 additions & 0 deletions lib/live_debugger_web/components/traces.ex
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,8 @@ defmodule LiveDebuggerWeb.Components.Traces do
<div class="flex flex-col gap-4 overflow-x-auto max-w-full max-h-[30vh] overflow-y-auto p-4">
<%= if @render_body? do %>
<%= for {args, index} <- Enum.with_index(@trace.args) do %>
<div :if={index > 0} class="border-t border-default-border"></div>
<p class="font-semibold">Arg <%= index %> (<%= Trace.arg_name(@trace, index) %>)</p>
<ElixirDisplay.term
id={@id <> "-#{index}"}
node={TermParser.term_to_display_tree(args)}
Expand Down Expand Up @@ -174,6 +176,10 @@ defmodule LiveDebuggerWeb.Components.Traces do
<.fullscreen id={@id} title={@callback_name}>
<div class="w-full flex flex-col gap-4 items-start justify-center">
<%= for {args, index} <- Enum.with_index(@trace_args) do %>
<div :if={index > 0} class="border-t border-default-border w-full"></div>
<p class="font-semibold shrink-0">
Arg <%= index %> (<%= Trace.arg_name(@trace, index) %>)
</p>
<ElixirDisplay.term
id={@id <> "-#{index}-fullscreen"}
node={TermParser.term_to_display_tree(args)}
Expand Down
80 changes: 80 additions & 0 deletions test/structs/trace_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,80 @@ defmodule LiveDebugger.Structs.TraceTest do
end
end

describe "arg_name/2" do
test "returns correct args for handle_async/3" do
trace = %{function: :handle_async, arity: 3}

assert args_list(trace) == ["name", "async_fun_result", "socket"]
end

test "returns correct args for handle_call/3" do
trace = %{function: :handle_call, arity: 3}

assert args_list(trace) == ["message", "from", "socket"]
end

test "returns correct args for handle_cast/2" do
trace = %{function: :handle_cast, arity: 2}

assert args_list(trace) == ["message", "socket"]
end

test "returns correct args for handle_event/3" do
trace = %{function: :handle_event, arity: 3}

assert args_list(trace) == ["event", "unsigned_params", "socket"]
end

test "returns correct args for handle_info/2" do
trace = %{function: :handle_info, arity: 2}

assert args_list(trace) == ["message", "socket"]
end

test "returns correct args for handle_params/3" do
trace = %{function: :handle_params, arity: 3}

assert args_list(trace) == ["unsigned_params", "uri", "socket"]
end

test "returns correct args for mount/3" do
trace = %{function: :mount, arity: 3}

assert args_list(trace) == ["params", "session", "socket"]
end

test "returns correct args for mount/1" do
trace = %{function: :mount, arity: 1}

assert args_list(trace) == ["socket"]
end

test "returns correct args for render/1" do
trace = %{function: :render, arity: 1}

assert args_list(trace) == ["assigns"]
end

test "returns correct args for terminate/2" do
trace = %{function: :terminate, arity: 2}

assert args_list(trace) == ["reason", "socket"]
end

test "returns correct args for update/2" do
trace = %{function: :update, arity: 2}

assert args_list(trace) == ["assigns", "socket"]
end

test "returns correct args for update_many/1" do
trace = %{function: :update_many, arity: 1}

assert args_list(trace) == ["list"]
end
end

test "callback_name/1 returns callback with arity" do
trace_map = %{
id: 1,
Expand Down Expand Up @@ -208,4 +282,10 @@ defmodule LiveDebugger.Structs.TraceTest do

Trace.new(id, module, function, args, pid, timestamp, opts)
end

defp args_list(trace) do
for index <- 0..(trace.arity - 1) do
Trace.arg_name(trace, index)
end
end
end