Packages
Library for accessibility snapshot testing in Phoenix applications using axe-core and Playwright.
Current section
Files
Jump to
Current section
Files
lib/telemetry_capture/analyzers/code_pointer.ex
defmodule Excessibility.TelemetryCapture.Analyzers.CodePointer do
@moduledoc """
Maps timeline events to likely source code locations.
Helps LLMs and developers locate relevant callbacks.
Uses event type and view_module to suggest where to look.
Not enabled by default - run with `--analyze=code_pointer`.
## Output
%{
findings: [],
stats: %{
pointers: [
%{
event: "handle_event:save_form",
module: MyApp.FormLive,
likely_location: "def handle_event(\"save_form\", params, socket) in MyApp.FormLive"
}
]
}
}
"""
@behaviour Excessibility.TelemetryCapture.Analyzer
def name, do: :code_pointer
def default_enabled?, do: false
def analyze(%{timeline: []}, _opts) do
%{findings: [], stats: %{pointers: []}}
end
def analyze(%{timeline: timeline}, _opts) do
pointers =
timeline
|> Enum.map(&build_pointer/1)
|> Enum.uniq_by(& &1.likely_location)
%{
findings: [],
stats: %{pointers: pointers}
}
end
defp build_pointer(%{event: event} = entry) do
module = Map.get(entry, :view_module)
location = infer_location(event, module)
%{
event: event,
module: module,
likely_location: location
}
end
defp infer_location("mount", module) do
module_str = if module, do: " in #{inspect(module)}", else: ""
"def mount(params, session, socket)#{module_str}"
end
defp infer_location("handle_params", module) do
module_str = if module, do: " in #{inspect(module)}", else: ""
"def handle_params(params, uri, socket)#{module_str}"
end
defp infer_location("handle_event:" <> event_name, module) do
module_str = if module, do: " in #{inspect(module)}", else: ""
"def handle_event(\"#{event_name}\", params, socket)#{module_str}"
end
defp infer_location("handle_info:" <> msg_type, module) do
module_str = if module, do: " in #{inspect(module)}", else: ""
"def handle_info(#{msg_type}, socket)#{module_str}"
end
defp infer_location("render", module) do
module_str = if module, do: " in #{inspect(module)}", else: ""
"def render(assigns)#{module_str} or ~H sigil"
end
defp infer_location(event, module) do
module_str = if module, do: " in #{inspect(module)}", else: ""
"#{event}#{module_str}"
end
end