Opaque types and spec warning in dialyxir

These two warnings that I don’t really understand that dialyxir gives me:

           Unknown type 'Elixir.Ecto.Query.DynamicExpr':t/0

The code is this:

  @spec is_nil_dynamic(any(), any(), nil | keyword() | map()) :: Ecto.Query.DynamicExpr.t()

The second one is this

    The call 'Elixir.Jason.Encoder.List':encode([any()],[]) does not have an opaque term of type 'Elixir.Jason.Encode':opts() as 2nd argument.

I read that jason.encode the opts is opaque but i don’t understand how can i fix it here.

Here is the code:

        @encoder_library @options[:encoder_library]

        |> Tuple.to_list()
        |> @encoder_library.Encoder.List.encode([])

Any hints or suggestion please.

Where did you get this type from? I can not even find that module in ectos code base…

After quickly glancing through the documentation, I can not see a way to legally construct a value of that type.

@michalmuskala any special thoughts on this?

Thanks for your reply. This spec function build query using ecto dynamics. I think the module is not in the documentation but if you write Ecto.Query… it automatically gives the suggestion for this module.

I finally found that module, it’s a bare strict and has no type defined, also it’s moduledoc false, so it’s internal to the ecto codebase, you should not use that strict directly.

If though this code is generated somehow, you should give more context.

1 Like

Its returning the queries so what should be its returning type then? rather than the above.
Whats your suggestion?

The module does not specify a type, your options are to create a type on your own that mimics that struct or to use any() or map(), maybe even %Ecto.Query.DynamicExpr{} works, but I’m not 100% sure about that.

Thanks . I will give it a try.
Any idea on that opaque error?

Either ignore it or don’t use a function that uses this type, as you can’t construct a value of that type legally from dialyzers point of view.

1 Like

That is also an undocumented module, you are not meant to use it. If you want to encode a list, just feed it to Jason.encode.


Thanks you both . You are right.