chocolatedonut

chocolatedonut

TL;DR
A single element, in this case an integer, is given to a Phoenix.Component but a list of such elements should be given. Can a compile-time warning/error be produced by any tool?

I’ve made a repro project. The gist of it is that

  1. A.Foo returns an integer to
  2. AWeb.ALive and it in turn (incorrectly) forwards this integer (rather than a list of integers) to
  3. AWeb.AComponent.
#1
defmodule A.Foo do
  @spec number() :: pos_integer()
  def number() do
    1729
  end
end

#2
defmodule AWeb.ALive do
  use AWeb, :live_view

  def mount(_params, _session, socket) do
    {:ok,
     socket
     |> assign(:number, A.Foo.number())}
  end

  def render(assigns) do
    ~H"""
    <AWeb.AComponent.bar numbers={@number} />  # Should've been `[@number]`
    """
  end
end

#3
defmodule AWeb.AComponent do
  use Phoenix.Component

  attr(:numbers, :list, required: true)

  @spec bar(%{numbers: list(pos_integer)}) :: any
  def bar(assigns) do
    ~H"""
    <li :for={number <- @numbers}>
      <%= number %>
    </li>
    """
  end
end

Can this be catched by the compiler, Dialyzer, anything? My understanding is “no”, but I hope I’m wrong:

  • attr macro atm only does compile-time validation of literals
  • even @specing the Phoenix.Component above with @spec bar(%{numbers: list(pos_integer)}) :: any doesn’t help, as mix dialyzer gives no warnings.

Is there any other tool that would help with this?

Showing Posts 1 to 1

jeremyjh

jeremyjh

I haven’t looked at the implementation of the heex compiler, but my intuition suggests there is a runtime apply happening versus compiling a direct invocation of the function in the component syntax. If that is the case then there is no static link between the bar function and its invocation. I do not know if that is a detail that can be changed, but I’d start there and at least rule out the possibility that could be done to support dialyzer.

— All posts loaded —

Where Next? Top

Trending in Questions Top

RSP87
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
nseaSeb
Hello, I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
apz
I’m new to elixir and just tried to install the elixirLS extension for VScode(ium) and it is throwing some errors that I would like help ...
New

Other Trending Topics Top

JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
marciok
Hi there! We created Gust: A task orchestrator inspired by Airflow. For those who have never heard about Aiflow, it’s a Python-based wor...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Dmk
Xamal is a deployment tool for Elixir apps that deploys native releases to bare metal servers over SSH. It’s a port of GitHub - basecamp/...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews