Skip to content

Conversation

@japhib
Copy link
Contributor

@japhib japhib commented May 5, 2023

The Tesla library is a common HTTP client for Elixir. Part of the setup for using Tesla involves declaring a module that looks like this:

defmodule MyHTTPClient do
  use Tesla
  # define middlewares & configs
end

The use Tesla line invokes a macro that generates a sizable amount of code for this module. When that code is typechecked via mix gradient, it results in a runtime error like the following:

Typechecking files...

** (FunctionClauseError) no function clause matching in :gradualizer_lib.pick_value/2

    The following arguments were given to :gradualizer_lib.pick_value/2:

        # 1
        {:type, 0, :any, []}

        # 2
        {:env, ... [edited for brevity]

    (gradualizer) use_tesla/deps/gradualizer/src/gradualizer_lib.erl:160: :gradualizer_lib.pick_value/2
    (gradualizer) use_tesla/deps/gradualizer/src/gradualizer_lib.erl:186: :gradualizer_lib."-pick_value/2-lc$^0/1-0-"/2
    (gradualizer) use_tesla/deps/gradualizer/src/gradualizer_lib.erl:186: :gradualizer_lib."-pick_value/2-lc$^0/1-0-"/2
    (gradualizer) use_tesla/deps/gradualizer/src/gradualizer_lib.erl:186: :gradualizer_lib.pick_value/2
    (gradualizer) use_tesla/deps/gradualizer/src/gradualizer_lib.erl:196: :gradualizer_lib."-pick_value/2-lc$^2/1-2-"/2
    (gradualizer) use_tesla/deps/gradualizer/src/gradualizer_lib.erl:197: :gradualizer_lib."-pick_value/2-lc$^2/1-2-"/2
    (gradualizer) use_tesla/deps/gradualizer/src/gradualizer_lib.erl:197: :gradualizer_lib.pick_value/2
    (gradualizer) use_tesla/deps/gradualizer/src/gradualizer_lib.erl:154: :gradualizer_lib."-pick_values/2-lc$^0/1-0-"/2

The same error occurs when doing mix gradient lib/use_tesla.ex, i.e. invoking only the single file rather than the entire Mix project.

I've improved the Elixir decompilation code in Gradient.Debug in an effort to reproduce the issue on pure Elixir code (i.e. not macros), but so far no luck. This definitely seems like an issue in Gradualizer rather than Gradient, but I'm still working on reproducing it with pure Erlang code.

@japhib japhib changed the title Module with "use Tesla" causes runtime error in Gradualizer Draft: Module with "use Tesla" causes runtime error in Gradualizer May 5, 2023
@japhib japhib changed the title Draft: Module with "use Tesla" causes runtime error in Gradualizer WIP: Module with "use Tesla" causes runtime error in Gradualizer May 5, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant